diff --git a/.env.example b/.env.example index 6957df0..bfc5909 100644 --- a/.env.example +++ b/.env.example @@ -1,7 +1,7 @@ PORT=3333 HOST=0.0.0.0 NODE_ENV=development -APP_KEY=pvmU1vuAZDkSwarb7yh9pgZ-RxaX4zS7 +APP_KEY=pvmU1vuAZDkSwarb7yh9pgZ-xxxxxx007 DRIVE_DISK=local SESSION_DRIVER=cookie CACHE_VIEWS=false @@ -17,4 +17,6 @@ REDIS_PORT=6379 REDIS_PASSWORD= SMTP_HOST= SMTP_PORT= -RESEND_API_KEY= \ No newline at end of file +RESEND_API_KEY= +OPENSEARCH_HOST=http://localhost +OPENSEARCH_CORE=tethys-records \ No newline at end of file diff --git a/.gitea/workflows/build.yaml b/.gitea/workflows/build.yaml index 45aa628..732fb75 100644 --- a/.gitea/workflows/build.yaml +++ b/.gitea/workflows/build.yaml @@ -13,7 +13,7 @@ jobs: uses: actions/checkout@v3 - run: echo "The ${{ github.repository }} repository has been cloned to the runner." - run: echo "The workflow is now ready to test your code on the runner." - - name: List files in the repository: + - name: List files in the repository run: | ls ${{ github.workspace }} - run: echo "This job's status is ${{ job.status }}." diff --git a/.gitea/workflows/checkReferenceType.yaml b/.gitea/workflows/checkReferenceType.yaml new file mode 100644 index 0000000..ab88380 --- /dev/null +++ b/.gitea/workflows/checkReferenceType.yaml @@ -0,0 +1,78 @@ +# This is a Gitea Actions workflow configuration file for running CI tests on the `feat/checkReferenceType` branch. +# The workflow is named "CI" and runs on the latest Ubuntu environment using a Node.js 20 Docker container. +# It sets up a PostgreSQL service with specified environment variables and health checks. +# The workflow includes the following steps: +# 1. Checkout the repository using the actions/checkout@v3 action. +# 2. Install Node.js dependencies using `npm ci`. +# 3. Create a `.env.test` file by copying from `.env.example`. +# 4. Set up environment variables in the `.env.test` file, including database connection details and other app-specific settings. +# 5. Run functional tests using the `node ace test functional --groups "ReferenceValidation"` command. +name: CI +run-name: Running tests for checkReferenceType branch +on: + push: + branches: + - feat/checkReferenceType + +jobs: + container-job: + runs-on: ubuntu-latest + # Docker Hub image that `container-job` executes in + container: node:20-bullseye + + services: + # Label used to access the service container + postgres: + image: postgres:latest + env: + POSTGRES_USER: alice + POSTGRES_PASSWORD: ${{ secrets.POSTGRES_PASSWORD }} + POSTGRES_DB: tethys_dev + # ports: + # - 5432:5432 + options: | + --health-cmd pg_isready + --health-interval 10s + --health-timeout 5s + --health-retries 5 + + steps: + - name: Checkout repository + uses: actions/checkout@v3 + + # - name: Set up Node.js + # uses: actions/setup-node@v2 + # with: + # node-version: '20' + + - name: Install dependencies + run: npm ci + + - name: Create .env.test file + run: cp .env.example .env.test + + - name: Set up environment variables + run: | + echo "DB_CONNECTION=pg" >> .env.test + echo "PG_HOST=postgres" >> .env.test + echo "PG_PORT=5432" >> .env.test + echo "PG_USER=alice" >> .env.test + echo "PG_PASSWORD=${{ secrets.POSTGRES_PASSWORD }}" >> .env.test + echo "PG_DB_NAME=tethys_dev" >> .env.test + echo "NODE_ENV=test" >> .env.test + echo "ASSETS_DRIVER=fake" >> .env.test + echo "SESSION_DRIVER=memory" >> .env.test + echo "HASH_DRIVER=bcrypt" >> .env.test + echo "HOST=127.0.0.1" >> .env.test + echo "PORT=3333" >> .env.test + echo "APP_NAME=TethysCloud" >> .env.test + echo "APP_URL=http://${HOST}:${PORT}" >> .env.test + echo "CACHE_VIEWS=false" >> .env.test + echo "APP_KEY=pfi5N2ACN4tMJ5d8d8BPHfh3FEuvleej" >> .env.test + echo "DRIVE_DISK=local" >> .env.test + echo "OAI_LIST_SIZE=200" >> .env.test + echo "OPENSEARCH_HOST=${{ secrets.OPENSEARCH_HOST }}" >> .env.test + echo "OPENSEARCH_CORE=tethys-records" >> .env.test + + - name: Run tests + run: node ace test functional --groups "ReferenceValidation" diff --git a/.gitea/workflows/ci.yaml b/.gitea/workflows/ci.yaml index 35a3f43..916f839 100644 --- a/.gitea/workflows/ci.yaml +++ b/.gitea/workflows/ci.yaml @@ -4,7 +4,13 @@ name: CI Pipeline run-name: ${{ github.actor }} is running CI pipeline # trigger build when pushing, or when creating a pull request -on: [push, pull_request] +on: + push: + branches: + - master + pull_request: + branches: + - master jobs: # Label of the container job @@ -12,7 +18,7 @@ jobs: # run build on latest ubuntu runs-on: ubuntu-latest - container: node:18-bullseye + container: node:20-bullseye services: mydb: @@ -70,6 +76,7 @@ jobs: && echo "CACHE_VIEWS=false" >> .env.test && echo "APP_KEY=pfi5N2ACN4tMJ5d8d8BPHfh3FEuvleej" >> .env.test && echo "DRIVE_DISK=local" >> .env.test + && echo "OAI_LIST_SIZE=200" >> .env.test # finally run the tests # - run: npm test @@ -95,3 +102,4 @@ jobs: # uses: coverallsapp/github-action@master # with: # github-token: ${{ secrets.GITHUB_TOKEN }} + diff --git a/.gitignore b/.gitignore index f0bd219..6d6d265 100644 --- a/.gitignore +++ b/.gitignore @@ -7,3 +7,4 @@ coverage tmp docker-compose.yml .env.test +public/assets diff --git a/Dockerfile b/Dockerfile index 0e42158..9f88544 100644 --- a/Dockerfile +++ b/Dockerfile @@ -1,57 +1,63 @@ ################## First Stage - Creating base ######################### # Created a variable to hold our node base image -ARG NODE_IMAGE=node:20-bookworm-slim +ARG NODE_IMAGE=node:22-trixie-slim FROM $NODE_IMAGE AS base + # Install dumb-init and ClamAV, and perform ClamAV database update -RUN apt update \ - && apt-get install -y dumb-init clamav clamav-daemon nano \ +RUN apt-get update \ + && apt-get install -y --no-install-recommends \ + dumb-init \ + clamav \ + clamav-daemon \ + clamdscan \ + ca-certificates \ && rm -rf /var/lib/apt/lists/* \ # Creating folders and changing ownerships - && mkdir -p /home/node/app && chown node:node /home/node/app \ - && mkdir -p /var/lib/clamav \ + && mkdir -p /home/node/app \ + && mkdir -p /var/lib/clamav \ && mkdir /usr/local/share/clamav \ - && chown -R node:clamav /var/lib/clamav /usr/local/share/clamav /etc/clamav \ - # permissions && mkdir /var/run/clamav \ - && chown node:clamav /var/run/clamav \ - && chmod 750 /var/run/clamav -# ----------------------------------------------- -# --- ClamAV & FeshClam ------------------------- -# ----------------------------------------------- -# RUN \ -# chmod 644 /etc/clamav/freshclam.conf && \ -# freshclam && \ -# mkdir /var/run/clamav && \ - # chown -R clamav:root /var/run/clamav + && mkdir -p /var/log/clamav \ + && mkdir -p /tmp/clamav-logs \ + + # Set ownership and permissions + && chown node:node /home/node/app \ + # && chown -R node:clamav /var/lib/clamav /usr/local/share/clamav /etc/clamav /var/run/clamav \ + && chown -R node:clamav /var/lib/clamav /usr/local/share/clamav /etc/clamav /var/run/clamav /var/log/clamav \ + && chown -R node:clamav /etc/clamav \ + && chmod 755 /tmp/clamav-logs \ + && chmod 750 /var/run/clamav \ + && chmod 755 /var/lib/clamav \ + && chmod 755 /var/log/clamav \ + # Add node user to clamav group and allow sudo for clamav commands + && usermod -a -G clamav node + # && chmod 666 /var/run/clamav/clamd.socket + # Make directories group-writable so node (as member of clamav group) can access them + # && chmod 750 /var/run/clamav /var/lib/clamav /var/log/clamav /tmp/clamav-logs -# # initial update of av databases -# RUN freshclam -# Configure Clam AV... +# Configure ClamAV - copy config files before switching user +# COPY --chown=node:clamav ./*.conf /etc/clamav/ COPY --chown=node:clamav ./*.conf /etc/clamav/ -# # permissions -# RUN mkdir /var/run/clamav && \ -# chown node:clamav /var/run/clamav && \ -# chmod 750 /var/run/clamav + + # Setting the working directory WORKDIR /home/node/app # Changing the current active user to "node" + +# Download initial ClamAV database as root before switching users USER node +RUN freshclam --quiet || echo "Initial database download failed - will retry at runtime" -# initial update of av databases -RUN freshclam - -# VOLUME /var/lib/clamav +# Copy entrypoint script COPY --chown=node:clamav docker-entrypoint.sh /home/node/app/docker-entrypoint.sh RUN chmod +x /home/node/app/docker-entrypoint.sh ENV TZ="Europe/Vienna" - - ################## Second Stage - Installing dependencies ########## # In this stage, we will start installing dependencies FROM base AS dependencies @@ -70,7 +76,6 @@ ENV NODE_ENV=production # We run "node ace build" to build the app (dist folder) for production RUN node ace build --ignore-ts-errors # RUN node ace build --production -# RUN node ace build --ignore-ts-errors ################## Final Stage - Production ######################### @@ -88,6 +93,7 @@ RUN npm ci --omit=dev # Copy files to the working directory from the build folder the user COPY --chown=node:node --from=build /home/node/app/build . # Expose port +# EXPOSE 3310 EXPOSE 3333 ENTRYPOINT ["/home/node/app/docker-entrypoint.sh"] # Run the command to start the server using "dumb-init" diff --git a/LICENSE b/LICENSE new file mode 100644 index 0000000..23bb390 --- /dev/null +++ b/LICENSE @@ -0,0 +1,22 @@ + +MIT License + +Copyright (c) 2025 Tethys Research Repository + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE \ No newline at end of file diff --git a/ace.js b/ace.js index a313518..98fb5cb 100644 --- a/ace.js +++ b/ace.js @@ -15,10 +15,11 @@ /** * Register hook to process TypeScript files using ts-node */ -import { register } from 'node:module' -register('ts-node/esm', import.meta.url) +// import { register } from 'node:module'; +// register('ts-node/esm', import.meta.url); +import 'ts-node-maintained/register/esm'; /** * Import ace console entrypoint */ -await import('./bin/console.js') +await import('./bin/console.js'); diff --git a/adonisrc.ts b/adonisrc.ts index 0c424f9..c30d0a3 100644 --- a/adonisrc.ts +++ b/adonisrc.ts @@ -1,7 +1,7 @@ -import { defineConfig } from '@adonisjs/core/app' +import { defineConfig } from '@adonisjs/core/app'; export default defineConfig({ - /* + /* |-------------------------------------------------------------------------- | Commands |-------------------------------------------------------------------------- @@ -10,12 +10,12 @@ export default defineConfig({ | will be scanned automatically from the "./commands" directory. */ - commands: [ - () => import('@adonisjs/core/commands'), - () => import('@adonisjs/lucid/commands'), - () => import('@adonisjs/mail/commands') - ], - /* + commands: [ + () => import('@adonisjs/core/commands'), + () => import('@adonisjs/lucid/commands'), + () => import('@adonisjs/mail/commands') + ], + /* |-------------------------------------------------------------------------- | Preloads |-------------------------------------------------------------------------- @@ -23,19 +23,23 @@ export default defineConfig({ | List of modules to import before starting the application. | */ - preloads: [ - () => import('./start/routes.js'), - () => import('./start/kernel.js'), - () => import('#start/validator'), - () => import('#start/rules/unique'), - () => import('#start/rules/translated_language'), - () => import('#start/rules/unique_person'), - () => import('#start/rules/file_length'), - () => import('#start/rules/file_scan'), - () => import('#start/rules/allowed_extensions_mimetypes'), - () => import('#start/rules/dependent_array_min_length') - ], - /* + preloads: [ + () => import('./start/routes.js'), + () => import('./start/kernel.js'), + () => import('#start/validator'), + // () => import('#start/rules/unique'), + // () => import('#start/rules/translated_language'), + // () => import('#start/rules/unique_person'), + // // () => import('#start/rules/file_length'), + // // () => import('#start/rules/file_scan'), + // // () => import('#start/rules/allowed_extensions_mimetypes'), + // () => import('#start/rules/dependent_array_min_length'), + // () => import('#start/rules/referenceValidation'), + // () => import('#start/rules/valid_mimetype'), + // () => import('#start/rules/array_contains_types'), + // () => import('#start/rules/orcid'), + ], + /* |-------------------------------------------------------------------------- | Service providers |-------------------------------------------------------------------------- @@ -44,48 +48,50 @@ export default defineConfig({ | application | */ - providers: [ - // () => import('./providers/AppProvider.js'), - () => import('@adonisjs/core/providers/app_provider'), - () => import('@adonisjs/core/providers/hash_provider'), - { - file: () => import('@adonisjs/core/providers/repl_provider'), - environment: ['repl', 'test'], - }, - () => import('@adonisjs/session/session_provider'), - () => import('@adonisjs/core/providers/edge_provider'), - () => import('@adonisjs/shield/shield_provider'), - // () => import('@eidellev/inertia-adonisjs'), - // () => import('@adonisjs/inertia/inertia_provider'), - () => import('#providers/app_provider'), - () => import('#providers/inertia_provider'), - () => import('@adonisjs/lucid/database_provider'), - () => import('@adonisjs/auth/auth_provider'), - // () => import('@eidellev/adonis-stardust'), - () => import('@adonisjs/redis/redis_provider'), - () => import('@adonisjs/encore/encore_provider'), - () => import('@adonisjs/static/static_provider'), - () => import('#providers/stardust_provider'), - () => import('#providers/query_builder_provider'), - () => import('#providers/token_worker_provider'), - // () => import('#providers/validator_provider'), - () => import('#providers/drive/provider/drive_provider'), - // () => import('@adonisjs/core/providers/vinejs_provider'), - () => import('#providers/vinejs_provider'), - () => import('@adonisjs/mail/mail_provider') - // () => import('#providers/mail_provider'), - ], - metaFiles: [ - { - pattern: 'public/**', - reloadServer: false, - }, - { - pattern: 'resources/views/**/*.edge', - reloadServer: false, - }, - ], - /* + providers: [ + // () => import('./providers/AppProvider.js'), + () => import('@adonisjs/core/providers/app_provider'), + () => import('@adonisjs/core/providers/hash_provider'), + { + file: () => import('@adonisjs/core/providers/repl_provider'), + environment: ['repl', 'test'], + }, + () => import('@adonisjs/session/session_provider'), + () => import('@adonisjs/core/providers/edge_provider'), + () => import('@adonisjs/shield/shield_provider'), + // () => import('@eidellev/inertia-adonisjs'), + // () => import('@adonisjs/inertia/inertia_provider'), + () => import('#providers/app_provider'), + // () => import('#providers/inertia_provider'), + () => import('@adonisjs/inertia/inertia_provider'), + () => import('@adonisjs/lucid/database_provider'), + () => import('@adonisjs/auth/auth_provider'), + // () => import('@eidellev/adonis-stardust'), + () => import('@adonisjs/redis/redis_provider'), + // () => import('@adonisjs/encore/encore_provider'), + () => import('@adonisjs/static/static_provider'), + () => import('#providers/stardust_provider'), + () => import('#providers/query_builder_provider'), + () => import('#providers/token_worker_provider'), + () => import('#providers/rule_provider'), + // () => import('#providers/drive/provider/drive_provider'), + () => import('@adonisjs/drive/drive_provider'), + // () => import('@adonisjs/core/providers/vinejs_provider'), + () => import('#providers/vinejs_provider'), + () => import('@adonisjs/mail/mail_provider'), + () => import('@adonisjs/vite/vite_provider'), + ], + metaFiles: [ + { + pattern: 'public/**', + reloadServer: false, + }, + { + pattern: 'resources/views/**/*.edge', + reloadServer: false, + }, + ], + /* |-------------------------------------------------------------------------- | Tests |-------------------------------------------------------------------------- @@ -94,22 +100,24 @@ export default defineConfig({ | and add additional suites. | */ - tests: { - suites: [ - { - files: ['tests/unit/**/*.spec(.ts|.js)'], - name: 'unit', - timeout: 2000, - }, - { - files: ['tests/functional/**/*.spec(.ts|.js)'], - name: 'functional', - timeout: 30000, - }, - ], - forceExit: false, - }, - - - -}) + tests: { + suites: [ + { + files: ['tests/unit/**/*.spec(.ts|.js)'], + name: 'unit', + timeout: 2000, + }, + { + files: ['tests/functional/**/*.spec(.ts|.js)'], + name: 'functional', + timeout: 30000, + }, + ], + forceExit: false, + }, + assetsBundler: false, + hooks: { + onBuildStarting: [() => import('@adonisjs/vite/build_hook')], + }, + // assetsBundler: false +}); diff --git a/app/Controllers/Http/Admin/AdminuserController.ts b/app/Controllers/Http/Admin/AdminuserController.ts index ce99724..05f25a4 100644 --- a/app/Controllers/Http/Admin/AdminuserController.ts +++ b/app/Controllers/Http/Admin/AdminuserController.ts @@ -85,7 +85,9 @@ export default class AdminuserController { // return response.badRequest(error.messages); throw error; } - const input = request.only(['login', 'email', 'password', 'first_name', 'last_name']); + + const input: Record = request.only(['login', 'email', 'first_name', 'last_name']); + input.password = request.input('new_password'); const user = await User.create(input); if (request.input('roles')) { const roles: Array = request.input('roles'); @@ -95,7 +97,6 @@ export default class AdminuserController { session.flash('message', 'User has been created successfully'); return response.redirect().toRoute('settings.user.index'); } - public async show({ request, inertia }: HttpContext) { const id = request.param('id'); const user = await User.query().where('id', id).firstOrFail(); @@ -139,9 +140,11 @@ export default class AdminuserController { }); // password is optional - let input; - if (request.input('password')) { - input = request.only(['login', 'email', 'password', 'first_name', 'last_name']); + let input: Record; + + if (request.input('new_password')) { + input = request.only(['login', 'email', 'first_name', 'last_name']); + input.password = request.input('new_password'); } else { input = request.only(['login', 'email', 'first_name', 'last_name']); } @@ -156,7 +159,6 @@ export default class AdminuserController { session.flash('message', 'User has been updated successfully'); return response.redirect().toRoute('settings.user.index'); } - public async destroy({ request, response, session }: HttpContext) { const id = request.param('id'); const user = await User.findOrFail(id); diff --git a/app/Controllers/Http/Admin/MimetypeController.ts b/app/Controllers/Http/Admin/MimetypeController.ts index 716c4fb..932fb55 100644 --- a/app/Controllers/Http/Admin/MimetypeController.ts +++ b/app/Controllers/Http/Admin/MimetypeController.ts @@ -25,6 +25,7 @@ export default class MimetypeController { const newDatasetSchema = vine.object({ name: vine.string().trim().isUnique({ table: 'mime_types', column: 'name' }), file_extension: vine.array(vine.string()).minLength(1), // define at least one extension for the new mimetype + alternate_mimetype: vine.array(vine.string().isValidMimetype()).distinct().optional(), // define alias mimetypes enabled: vine.boolean(), }); // await request.validate({ schema: newDatasetSchema, messages: this.messages }); @@ -33,17 +34,21 @@ export default class MimetypeController { // await request.validate({ schema: newDatasetSchema, messages: this.messages }); const validator = vine.compile(newDatasetSchema); validator.messagesProvider = new SimpleMessagesProvider(this.messages); - await request.validateUsing(validator); + await request.validateUsing(validator, { messagesProvider: new SimpleMessagesProvider(this.messages) }); } catch (error) { // Step 3 - Handle errors // return response.badRequest(error.messages); throw error; } - const input = request.only(['name', 'enabled', 'file_extension']); + const input = request.only(['name', 'enabled', 'file_extension', 'alternate_mimetype']); // Concatenate the file_extensions array into a string with '|' as the separator if (Array.isArray(input.file_extension)) { input.file_extension = input.file_extension.join('|'); } + // Concatenate the alias_mimetype array into a string with '|' as the separator + if (Array.isArray(input.alternate_mimetype)) { + input.alternate_mimetype = input.alternate_mimetype.join('|'); + } await MimeType.create(input); // if (request.input('roles')) { // const roles: Array = request.input('roles'); @@ -59,7 +64,7 @@ export default class MimetypeController { 'maxLength': '{{ field }} must be less then {{ max }} characters long', 'isUnique': '{{ field }} must be unique, and this value is already taken', 'required': '{{ field }} is required', - 'file_extension.minLength': 'at least {{ min }} mimetypes must be defined', + 'file_extension.array.minLength': 'at least {{ min }} mimetypes must be defined', 'file_extension.*.string': 'Each file extension must be a valid string', // Adjusted to match the type }; @@ -163,7 +168,7 @@ export default class MimetypeController { mimetype, }); } catch (error) { - if (error.code == 'E_ROW_NOT_FOUND') { + if (error.code === 'E_ROW_NOT_FOUND') { session.flash({ warning: 'Mimetype is not found in database' }); } else { session.flash({ warning: 'general error occured, you cannot delete the mimetype' }); diff --git a/app/Controllers/Http/Admin/RoleController.ts b/app/Controllers/Http/Admin/RoleController.ts index 1c4ab7a..0012ef8 100644 --- a/app/Controllers/Http/Admin/RoleController.ts +++ b/app/Controllers/Http/Admin/RoleController.ts @@ -42,7 +42,7 @@ export default class RoleController { can: { create: await auth.user?.can(['user-create']), edit: await auth.user?.can(['user-edit']), - delete: await auth.user?.can(['user-delete']), + delete: false, //await auth.user?.can(['user-delete']), }, }); } @@ -124,7 +124,7 @@ export default class RoleController { // password is optional - const input = request.only(['name', 'description']); + const input = request.only(['name', 'display_name', 'description']); await role.merge(input).save(); // await user.save(); diff --git a/app/Controllers/Http/Admin/mailsettings_controller.ts b/app/Controllers/Http/Admin/mailsettings_controller.ts index 43e9dc7..332fd05 100644 --- a/app/Controllers/Http/Admin/mailsettings_controller.ts +++ b/app/Controllers/Http/Admin/mailsettings_controller.ts @@ -76,9 +76,9 @@ export default class MailSettingsController { public async sendTestMail({ response, auth }: HttpContext) { const user = auth.user!; const userEmail = user.email; - + // let mailManager = await app.container.make('mail.manager'); - // let iwas = mailManager.use(); + // let iwas = mailManager.use(); // let test = mail.config.mailers.smtp(); if (!userEmail) { return response.badRequest({ message: 'User email is not set. Please update your profile.' }); diff --git a/app/Controllers/Http/Api/AuthorsController.ts b/app/Controllers/Http/Api/AuthorsController.ts index 599da80..2b0bae1 100644 --- a/app/Controllers/Http/Api/AuthorsController.ts +++ b/app/Controllers/Http/Api/AuthorsController.ts @@ -4,17 +4,29 @@ import Person from '#models/person'; // node ace make:controller Author export default class AuthorsController { - public async index({}: HttpContext) { - // select * from gba.persons - // where exists (select * from gba.documents inner join gba.link_documents_persons on "documents"."id" = "link_documents_persons"."document_id" - // where ("link_documents_persons"."role" = 'author') and ("persons"."id" = "link_documents_persons"."person_id")); + public async index({}: HttpContext) { + const authors = await Person.query() - .whereHas('datasets', (dQuery) => { - dQuery.wherePivot('role', 'author'); - }) - .withCount('datasets', (query) => { - query.as('datasets_count'); - }); + .select([ + 'id', + 'academic_title', + 'first_name', + 'last_name', + 'identifier_orcid', + 'status', + 'name_type', + 'created_at' + // Note: 'email' is omitted + ]) + .preload('datasets') + .where('name_type', 'Personal') + .whereHas('datasets', (dQuery) => { + dQuery.wherePivot('role', 'author'); + }) + .withCount('datasets', (query) => { + query.as('datasets_count'); + }) + .orderBy('datasets_count', 'desc'); return authors; } @@ -25,7 +37,10 @@ export default class AuthorsController { if (request.input('filter')) { // users = users.whereRaw('name like %?%', [request.input('search')]) const searchTerm = request.input('filter'); - authors.whereILike('first_name', `%${searchTerm}%`).orWhereILike('last_name', `%${searchTerm}%`); + authors.andWhere((query) => { + query.whereILike('first_name', `%${searchTerm}%`) + .orWhereILike('last_name', `%${searchTerm}%`); + }); // .orWhere('email', 'like', `%${searchTerm}%`); } diff --git a/app/Controllers/Http/Api/AvatarController.ts b/app/Controllers/Http/Api/AvatarController.ts index 96b158c..d7c532f 100644 --- a/app/Controllers/Http/Api/AvatarController.ts +++ b/app/Controllers/Http/Api/AvatarController.ts @@ -1,65 +1,212 @@ import type { HttpContext } from '@adonisjs/core/http'; import { StatusCodes } from 'http-status-codes'; -// import * as fs from 'fs'; -// import * as path from 'path'; +import redis from '@adonisjs/redis/services/main'; -const prefixes = ['von', 'van']; +const PREFIXES = ['von', 'van', 'de', 'del', 'della', 'di', 'da', 'dos', 'du', 'le', 'la']; +const DEFAULT_SIZE = 50; +const MIN_SIZE = 16; +const MAX_SIZE = 512; +const FONT_SIZE_RATIO = 0.4; +const COLOR_LIGHTENING_PERCENT = 60; +const COLOR_DARKENING_FACTOR = 0.6; +const CACHE_TTL = 24 * 60 * 60; // 24 hours instead of 1 hour -// node ace make:controller Author export default class AvatarController { public async generateAvatar({ request, response }: HttpContext) { try { - const { name, background, textColor, size } = request.only(['name', 'background', 'textColor', 'size']); + const { name, size = DEFAULT_SIZE } = request.only(['name', 'size']); + + // Enhanced validation + if (!name || typeof name !== 'string' || name.trim().length === 0) { + return response.status(StatusCodes.BAD_REQUEST).json({ + error: 'Name is required and must be a non-empty string', + }); + } + + const parsedSize = this.validateSize(size); + if (!parsedSize.isValid) { + return response.status(StatusCodes.BAD_REQUEST).json({ + error: parsedSize.error, + }); + } + + // Build a unique cache key for the given name and size + const cacheKey = `avatar:${this.sanitizeName(name)}-${parsedSize.value}`; + // const cacheKey = `avatar:${name.trim().toLowerCase()}-${size}`; + try { + const cachedSvg = await redis.get(cacheKey); + if (cachedSvg) { + this.setResponseHeaders(response); + return response.send(cachedSvg); + } + } catch (redisError) { + // Log redis error but continue without cache + console.warn('Redis cache read failed:', redisError); + } - // Generate initials - // const initials = name - // .split(' ') - // .map((part) => part.charAt(0).toUpperCase()) - // .join(''); const initials = this.getInitials(name); + const colors = this.generateColors(name); + const svgContent = this.createSvg(size, colors, initials); - // Define SVG content with dynamic values for initials, background color, text color, and size - const svgContent = ` - - - ${initials} - - `; - - // Set response headers for SVG content - response.header('Content-type', 'image/svg+xml'); - response.header('Cache-Control', 'no-cache'); - response.header('Pragma', 'no-cache'); - response.header('Expires', '0'); + // // Cache the generated avatar for future use, e.g. 1 hour expiry + try { + await redis.setex(cacheKey, CACHE_TTL, svgContent); + } catch (redisError) { + // Log but don't fail the request + console.warn('Redis cache write failed:', redisError); + } + this.setResponseHeaders(response); return response.send(svgContent); } catch (error) { - return response.status(StatusCodes.OK).json({ error: error.message }); + console.error('Avatar generation error:', error); + return response.status(StatusCodes.INTERNAL_SERVER_ERROR).json({ + error: 'Failed to generate avatar', + }); } } - private getInitials(name: string) { - const parts = name.split(' '); - let initials = ''; + private validateSize(size: any): { isValid: boolean; value?: number; error?: string } { + const numSize = Number(size); - if (parts.length >= 2) { + if (isNaN(numSize)) { + return { isValid: false, error: 'Size must be a valid number' }; + } + + if (numSize < MIN_SIZE || numSize > MAX_SIZE) { + return { + isValid: false, + error: `Size must be between ${MIN_SIZE} and ${MAX_SIZE}`, + }; + } + + return { isValid: true, value: Math.floor(numSize) }; + } + + private sanitizeName(name: string): string { + return name + .trim() + .toLowerCase() + .replace(/[^a-z0-9\s-]/gi, ''); + } + + private getInitials(name: string): string { + const sanitized = name.trim().replace(/\s+/g, ' '); // normalize whitespace + const parts = sanitized + .split(' ') + .filter((part) => part.length > 0) + .map((part) => part.trim()); + + if (parts.length === 0) { + return 'NA'; + } + + if (parts.length === 1) { + // For single word, take first 2 characters or first char if only 1 char + return parts[0].substring(0, Math.min(2, parts[0].length)).toUpperCase(); + } + + return this.getMultiWordInitials(parts); + } + + private getMultiWordInitials(parts: string[]): string { + // Filter out prefixes and short words + const significantParts = parts.filter((part) => !PREFIXES.includes(part.toLowerCase()) && part.length > 1); + + if (significantParts.length === 0) { + // Fallback to first and last regardless of prefixes const firstName = parts[0]; const lastName = parts[parts.length - 1]; - - const firstInitial = firstName.charAt(0).toUpperCase(); - const lastInitial = lastName.charAt(0).toUpperCase(); - - if (prefixes.includes(lastName.toLowerCase()) && lastName === lastName.toUpperCase()) { - initials = firstInitial + lastName.charAt(1).toUpperCase(); - } else { - initials = firstInitial + lastInitial; - } - } else if (parts.length === 1) { - initials = parts[0].substring(0, 2).toUpperCase(); + return (firstName.charAt(0) + lastName.charAt(0)).toUpperCase(); } - return initials; + if (significantParts.length === 1) { + return significantParts[0].substring(0, 2).toUpperCase(); + } + + // Take first and last significant parts + const firstName = significantParts[0]; + const lastName = significantParts[significantParts.length - 1]; + return (firstName.charAt(0) + lastName.charAt(0)).toUpperCase(); + } + + private generateColors(name: string): { background: string; text: string } { + const baseColor = this.getColorFromName(name); + return { + background: this.lightenColor(baseColor, COLOR_LIGHTENING_PERCENT), + text: this.darkenColor(baseColor), + }; + } + + private createSvg(size: number, colors: { background: string; text: string }, initials: string): string { + const fontSize = Math.max(12, Math.floor(size * FONT_SIZE_RATIO)); // Ensure readable font size + + // Escape any potential HTML/XML characters in initials + const escapedInitials = this.escapeXml(initials); + + return ` + + ${escapedInitials} + `; + } + + private escapeXml(text: string): string { + return text.replace(/&/g, '&').replace(//g, '>').replace(/"/g, '"').replace(/'/g, '''); + } + + private setResponseHeaders(response: HttpContext['response']): void { + response.header('Content-Type', 'image/svg+xml'); + response.header('Cache-Control', 'public, max-age=86400'); // Cache for 1 day + response.header('ETag', `"${Date.now()}"`); // Simple ETag + } + + private getColorFromName(name: string): string { + let hash = 0; + const normalizedName = name.toLowerCase().trim(); + + for (let i = 0; i < normalizedName.length; i++) { + hash = normalizedName.charCodeAt(i) + ((hash << 5) - hash); + hash = hash & hash; // Convert to 32-bit integer + } + + // Ensure we get vibrant colors by constraining the color space + const colorParts = []; + for (let i = 0; i < 3; i++) { + let value = (hash >> (i * 8)) & 0xff; + // Ensure minimum color intensity for better contrast + value = Math.max(50, value); + colorParts.push(value.toString(16).padStart(2, '0')); + } + return colorParts.join(''); + } + + private lightenColor(hexColor: string, percent: number): string { + const r = parseInt(hexColor.substring(0, 2), 16); + const g = parseInt(hexColor.substring(2, 4), 16); + const b = parseInt(hexColor.substring(4, 6), 16); + + const lightenValue = (value: number) => Math.min(255, Math.floor(value + (255 - value) * (percent / 100))); + + const newR = lightenValue(r); + const newG = lightenValue(g); + const newB = lightenValue(b); + + return ((newR << 16) | (newG << 8) | newB).toString(16).padStart(6, '0'); + } + + private darkenColor(hexColor: string): string { + const r = parseInt(hexColor.slice(0, 2), 16); + const g = parseInt(hexColor.slice(2, 4), 16); + const b = parseInt(hexColor.slice(4, 6), 16); + + const darkenValue = (value: number) => Math.max(0, Math.floor(value * COLOR_DARKENING_FACTOR)); + + const darkerR = darkenValue(r); + const darkerG = darkenValue(g); + const darkerB = darkenValue(b); + + return ((darkerR << 16) + (darkerG << 8) + darkerB).toString(16).padStart(6, '0'); } } diff --git a/app/Controllers/Http/Api/DatasetController.ts b/app/Controllers/Http/Api/DatasetController.ts index 41befe6..8cb17b6 100644 --- a/app/Controllers/Http/Api/DatasetController.ts +++ b/app/Controllers/Http/Api/DatasetController.ts @@ -1,19 +1,36 @@ import type { HttpContext } from '@adonisjs/core/http'; -// import Person from 'App/Models/Person'; import Dataset from '#models/dataset'; import { StatusCodes } from 'http-status-codes'; +import DatasetReference from '#models/dataset_reference'; // node ace make:controller Author export default class DatasetController { - public async index({}: HttpContext) { - // select * from gba.persons - // where exists (select * from gba.documents inner join gba.link_documents_persons on "documents"."id" = "link_documents_persons"."document_id" - // where ("link_documents_persons"."role" = 'author') and ("persons"."id" = "link_documents_persons"."person_id")); - const datasets = await Dataset.query().where('server_state', 'published').orWhere('server_state', 'deleted'); + /** + * GET /api/datasets + * Find all published datasets + */ + public async index({ response }: HttpContext) { + try { + const datasets = await Dataset.query() + .where(function (query) { + query.where('server_state', 'published').orWhere('server_state', 'deleted'); + }) + .preload('titles') + .preload('identifier') + .orderBy('server_date_published', 'desc'); - return datasets; + return response.status(StatusCodes.OK).json(datasets); + } catch (error) { + return response.status(StatusCodes.INTERNAL_SERVER_ERROR).json({ + message: error.message || 'Some error occurred while retrieving datasets.', + }); + } } + /** + * GET /api/dataset + * Find all published datasets + */ public async findAll({ response }: HttpContext) { try { const datasets = await Dataset.query() @@ -29,34 +46,368 @@ export default class DatasetController { } } - public async findOne({ params }: HttpContext) { - const datasets = await Dataset.query() - .where('publish_id', params.publish_id) - .preload('titles') - .preload('descriptions') - .preload('user') - .preload('authors', (builder) => { - builder.orderBy('pivot_sort_order', 'asc'); - }) - .preload('contributors', (builder) => { - builder.orderBy('pivot_sort_order', 'asc'); - }) - .preload('subjects') - .preload('coverage') - .preload('licenses') - .preload('references') - .preload('project') - .preload('referenced_by', (builder) => { - builder.preload('dataset', (builder) => { - builder.preload('identifier'); - }); - }) - .preload('files', (builder) => { - builder.preload('hashvalues'); - }) - .preload('identifier') - .firstOrFail(); + /** + * GET /api/dataset/:publish_id + * Find one dataset by publish_id + */ + public async findOne({ response, params }: HttpContext) { + try { + const dataset = await Dataset.query() + .where('publish_id', params.publish_id) + .preload('titles') + .preload('descriptions') // Using 'descriptions' instead of 'abstracts' + .preload('user', (builder) => { + builder.select(['id', 'firstName', 'lastName', 'avatar', 'login']); + }) + .preload('authors', (builder) => { + builder + .select(['id', 'academic_title', 'first_name', 'last_name', 'identifier_orcid', 'status', 'name_type']) + .withCount('datasets', (query) => { + query.as('datasets_count'); + }) + .pivotColumns(['role', 'sort_order']) + .orderBy('pivot_sort_order', 'asc'); + }) + .preload('contributors', (builder) => { + builder + .select(['id', 'academic_title', 'first_name', 'last_name', 'identifier_orcid', 'status', 'name_type']) + .withCount('datasets', (query) => { + query.as('datasets_count'); + }) + .pivotColumns(['role', 'sort_order', 'contributor_type']) + .orderBy('pivot_sort_order', 'asc'); + }) + .preload('subjects') + .preload('coverage') + .preload('licenses') + .preload('references') + .preload('project') + // .preload('referenced_by', (builder) => { + // builder.preload('dataset', (builder) => { + // builder.preload('identifier'); + // }); + // }) + .preload('files', (builder) => { + builder.preload('hashvalues'); + }) + .preload('identifier') + .first(); // Use first() instead of firstOrFail() to handle not found gracefully - return datasets; + if (!dataset) { + return response.status(StatusCodes.NOT_FOUND).json({ + message: `Cannot find Dataset with publish_id=${params.publish_id}.`, + }); + } + + // Build the version chain + const versionChain = await this.buildVersionChain(dataset); + + // Add version chain to response + const responseData = { + ...dataset.toJSON(), + versionChain: versionChain, + }; + + // return response.status(StatusCodes.OK).json(dataset); + return response.status(StatusCodes.OK).json(responseData); + } catch (error) { + return response.status(StatusCodes.INTERNAL_SERVER_ERROR).json({ + message: error.message || `Error retrieving Dataset with publish_id=${params.publish_id}.`, + }); + } + } + + /** + * GET /:prefix/:value + * Find dataset by identifier (e.g., https://doi.tethys.at/10.24341/tethys.99.2) + */ + public async findByIdentifier({ response, params }: HttpContext) { + const identifierValue = `${params.prefix}/${params.value}`; + + // Optional: Validate DOI format + if (!identifierValue.match(/^10\.\d+\/[a-zA-Z0-9._-]+\.[0-9]+(?:\.[0-9]+)*$/)) { + return response.status(StatusCodes.BAD_REQUEST).json({ + message: `Invalid DOI format: ${identifierValue}`, + }); + } + + try { + // Method 1: Using subquery with whereIn (most similar to your original) + const dataset = await Dataset.query() + // .whereIn('id', (subQuery) => { + // subQuery.select('dataset_id').from('dataset_identifiers').where('value', identifierValue); + // }) + .whereHas('identifier', (builder) => { + builder.where('value', identifierValue); + }) + .preload('titles') + .preload('descriptions') // Using 'descriptions' instead of 'abstracts' + .preload('user', (builder) => { + builder.select(['id', 'firstName', 'lastName', 'avatar', 'login']); + }) + .preload('authors', (builder) => { + builder + .select(['id', 'academic_title', 'first_name', 'last_name', 'identifier_orcid', 'status', 'name_type']) + .withCount('datasets', (query) => { + query.as('datasets_count'); + }) + .pivotColumns(['role', 'sort_order']) + .wherePivot('role', 'author') + .orderBy('pivot_sort_order', 'asc'); + }) + .preload('contributors', (builder) => { + builder + .select(['id', 'academic_title', 'first_name', 'last_name', 'identifier_orcid', 'status', 'name_type']) + .withCount('datasets', (query) => { + query.as('datasets_count'); + }) + .pivotColumns(['role', 'sort_order', 'contributor_type']) + .wherePivot('role', 'contributor') + .orderBy('pivot_sort_order', 'asc'); + }) + .preload('subjects') + .preload('coverage') + .preload('licenses') + .preload('references') + .preload('project') + // .preload('referenced_by', (builder) => { + // builder.preload('dataset', (builder) => { + // builder.preload('identifier'); + // }); + // }) + .preload('files', (builder) => { + builder.preload('hashvalues'); + }) + .preload('identifier') + .first(); + + if (!dataset) { + return response.status(StatusCodes.NOT_FOUND).json({ + message: `Cannot find Dataset with identifier=${identifierValue}.`, + }); + } + // Build the version chain + const versionChain = await this.buildVersionChain(dataset); + + // Add version chain to response + const responseData = { + ...dataset.toJSON(), + versionChain: versionChain, + }; + + // return response.status(StatusCodes.OK).json(dataset); + return response.status(StatusCodes.OK).json(responseData); + } catch (error) { + return response.status(StatusCodes.INTERNAL_SERVER_ERROR).json({ + message: error.message || `Error retrieving Dataset with identifier=${identifierValue}.`, + }); + } + } + + /** + * Build the complete version chain for a dataset + * Traverses both backwards (previous versions) and forwards (newer versions) + */ + private async buildVersionChain(dataset: Dataset) { + const versionChain = { + // current: { + // id: dataset.id, + // publish_id: dataset.publish_id, + // doi: dataset.identifier?.value || null, + // main_title: dataset.mainTitle || null, + // server_date_published: dataset.server_date_published, + // }, + previousVersions: [] as any[], + newerVersions: [] as any[], + }; + + // Get all previous versions (going backwards in time) + versionChain.previousVersions = await this.getPreviousVersions(dataset.id); + + // Get all newer versions (going forwards in time) + versionChain.newerVersions = await this.getNewerVersions(dataset.id); + + return versionChain; + } + + /** + * Recursively get all previous versions + */ + // private async getPreviousVersions(datasetId: number, visited: Set = new Set()): Promise { + // // Prevent infinite loops + // if (visited.has(datasetId)) { + // return []; + // } + // visited.add(datasetId); + + // const previousVersions: any[] = []; + + // // Find references where this dataset "IsNewVersionOf" another dataset + // const previousRefs = await DatasetReference.query() + // .where('document_id', datasetId) + // .where('relation', 'IsNewVersionOf') + // .whereNotNull('related_document_id'); + + // for (const ref of previousRefs) { + // if (!ref.related_document_id) continue; + + // const previousDataset = await Dataset.query() + // .where('id', ref.related_document_id) + // .preload('identifier') + // .preload('titles') + // .first(); + + // if (previousDataset) { + // const versionInfo = { + // id: previousDataset.id, + // publish_id: previousDataset.publish_id, + // doi: previousDataset.identifier?.value || null, + // main_title: previousDataset.mainTitle || null, + // server_date_published: previousDataset.server_date_published, + // relation: 'IsPreviousVersionOf', // From perspective of current dataset + // }; + + // previousVersions.push(versionInfo); + + // // Recursively get even older versions + // const olderVersions = await this.getPreviousVersions(previousDataset.id, visited); + // previousVersions.push(...olderVersions); + // } + // } + + // return previousVersions; + // } + + private async getPreviousVersions(datasetId: number, visited: Set = new Set()): Promise { + if (visited.has(datasetId)) return []; + visited.add(datasetId); + + const result: any[] = []; + + // A dataset points to its OLDER version via relation 'IsNewVersionOf' + const refs = await DatasetReference.query() + .where('document_id', datasetId) + .where('relation', 'IsNewVersionOf'); // ← removed .whereNotNull('related_document_id') + + for (const ref of refs) { + const related = await this.resolveReferencedDataset(ref, datasetId); + if (!related) continue; + + result.push({ + id: related.id, + publish_id: related.publish_id, + doi: related.identifier?.value || null, + main_title: related.mainTitle || null, + server_date_published: related.server_date_published, + relation: 'IsPreviousVersionOf', + }); + + result.push(...(await this.getPreviousVersions(related.id, visited))); + } + + return result; + } + + /** + * Recursively get all newer versions + */ + // private async getNewerVersions(datasetId: number, visited: Set = new Set()): Promise { + // // Prevent infinite loops + // if (visited.has(datasetId)) { + // return []; + // } + // visited.add(datasetId); + + // const newerVersions: any[] = []; + + // // Find references where this dataset "IsPreviousVersionOf" another dataset + // const newerRefs = await DatasetReference.query() + // .where('document_id', datasetId) + // .where('relation', 'IsPreviousVersionOf') + // .whereNotNull('related_document_id'); + + // for (const ref of newerRefs) { + // if (!ref.related_document_id) continue; + + // const newerDataset = await Dataset.query().where('id', ref.related_document_id).preload('identifier').preload('titles').first(); + + // if (newerDataset) { + // const versionInfo = { + // id: newerDataset.id, + // publish_id: newerDataset.publish_id, + // doi: newerDataset.identifier?.value || null, + // main_title: newerDataset.mainTitle || null, + // server_date_published: newerDataset.server_date_published, + // relation: 'IsNewVersionOf', // From perspective of current dataset + // }; + + // newerVersions.push(versionInfo); + + // // Recursively get even newer versions + // const evenNewerVersions = await this.getNewerVersions(newerDataset.id, visited); + // newerVersions.push(...evenNewerVersions); + // } + // } + + // return newerVersions; + // } + private async getNewerVersions(datasetId: number, visited: Set = new Set()): Promise { + if (visited.has(datasetId)) return []; + visited.add(datasetId); + + const result: any[] = []; + + // A dataset points to its NEWER version via relation 'IsPreviousVersionOf' + const refs = await DatasetReference.query() + .where('document_id', datasetId) + .where('relation', 'IsPreviousVersionOf'); // ← removed .whereNotNull(...) + + for (const ref of refs) { + const related = await this.resolveReferencedDataset(ref, datasetId); + if (!related) continue; + + result.push({ + id: related.id, + publish_id: related.publish_id, + doi: related.identifier?.value || null, + main_title: related.mainTitle || null, + server_date_published: related.server_date_published, + relation: 'IsNewVersionOf', + }); + + result.push(...(await this.getNewerVersions(related.id, visited))); + } + + return result; + } + + private async resolveReferencedDataset(ref: DatasetReference, currentDatasetId: number) { + const doi = this.normalizeDoi(ref.value); + + if (doi) { + const byDoi = await Dataset.query() + .whereHas('identifier', (q) => q.where('value', doi)) + .preload('identifier') + .preload('titles') // needed so mainTitle computes + .first(); + if (byDoi) return byDoi; + } + + if (ref.related_document_id && ref.related_document_id !== currentDatasetId) { + return await Dataset.query() + .where('id', ref.related_document_id) + .preload('identifier') + .preload('titles') + .first(); + } + + return null; + } + private normalizeDoi(value: string | null): string | null { + if (!value) return null; + return value + .trim() + .replace(/^https?:\/\/(dx\.)?doi\.org\//i, '') + .replace(/^doi:/i, ''); } } diff --git a/app/Controllers/Http/Api/FileController.ts b/app/Controllers/Http/Api/FileController.ts index 3c1f3d4..8a400ad 100644 --- a/app/Controllers/Http/Api/FileController.ts +++ b/app/Controllers/Http/Api/FileController.ts @@ -2,53 +2,103 @@ import type { HttpContext } from '@adonisjs/core/http'; import File from '#models/file'; import { StatusCodes } from 'http-status-codes'; import * as fs from 'fs'; -import * as path from 'path'; +import { DateTime } from 'luxon'; // node ace make:controller Author export default class FileController { // @Get("download/:id") public async findOne({ response, params }: HttpContext) { const id = params.id; - const file = await File.findOrFail(id); - // const file = await File.findOne({ - // where: { id: id }, - // }); - if (file) { - const filePath = '/storage/app/public/' + file.pathName; - const ext = path.extname(filePath); - const fileName = file.label + ext; - try { - fs.accessSync(filePath, fs.constants.R_OK); //| fs.constants.W_OK); - // console.log("can read/write:", path); - - response - .header('Cache-Control', 'no-cache private') - .header('Content-Description', 'File Transfer') - .header('Content-Type', file.mimeType) - .header('Content-Disposition', 'inline; filename=' + fileName) - .header('Content-Transfer-Encoding', 'binary') - .header('Access-Control-Allow-Origin', '*') - .header('Access-Control-Allow-Methods', 'GET,POST'); - - response.status(StatusCodes.OK).download(filePath); - } catch (err) { - // console.log("no access:", path); - response.status(StatusCodes.NOT_FOUND).send({ - message: `File with id ${id} doesn't exist on file server`, - }); - } + // const file = await File.findOrFail(id); + // Load file with its related dataset to check embargo + const file = await File.query() + .where('id', id) + .preload('dataset') // or 'dataset' - whatever your relationship is named + .firstOrFail(); - // res.status(StatusCodes.OK).sendFile(filePath, (err) => { - // // res.setHeader("Content-Type", "application/json"); - // // res.removeHeader("Content-Disposition"); - // res.status(StatusCodes.NOT_FOUND).send({ - // message: `File with id ${id} doesn't exist on file server`, - // }); - // }); - } else { - response.status(StatusCodes.NOT_FOUND).send({ + if (!file) { + return response.status(StatusCodes.NOT_FOUND).send({ message: `Cannot find File with id=${id}.`, }); } + + const dataset = file.dataset; + // Files from unpublished datasets are now blocked + if (dataset.server_state !== 'published') { + return response.status(StatusCodes.FORBIDDEN).send({ + message: `File access denied: Dataset is not published.`, + }); + } + if (dataset && this.isUnderEmbargo(dataset.embargo_date)) { + return response.status(StatusCodes.FORBIDDEN).send({ + message: `File is under embargo until ${dataset.embargo_date?.toFormat('yyyy-MM-dd')}`, + }); + } + + // Proceed with file download + const filePath = '/storage/app/data/' + file.pathName; + const fileExt = file.filePath.split('.').pop() || ''; + // const fileName = file.label + fileExt; + const fileName = file.label.toLowerCase().endsWith(`.${fileExt.toLowerCase()}`) ? file.label : `${file.label}.${fileExt}`; + + // Determine if file can be previewed inline in browser + const canPreviewInline = (mimeType: string): boolean => { + const type = mimeType.toLowerCase(); + return ( + type === 'application/pdf' || + type.startsWith('image/') || + type.startsWith('text/') || + type === 'application/json' || + type === 'application/xml' || + // Uncomment if you want video/audio inline + type.startsWith('video/') || + type.startsWith('audio/') + ); + }; + const disposition = canPreviewInline(file.mimeType) ? 'inline' : 'attachment'; + + try { + fs.accessSync(filePath, fs.constants.R_OK); //| fs.constants.W_OK); + // console.log("can read/write:", filePath); + + response + .header('Cache-Control', 'no-cache private') + .header('Content-Description', 'File Transfer') + .header('Content-Type', file.mimeType) + .header('Content-Disposition', `${disposition}; filename="${fileName}"`) + .header('Content-Transfer-Encoding', 'binary') + .header('Access-Control-Allow-Origin', '*') + .header('Access-Control-Allow-Methods', 'GET'); + + response.status(StatusCodes.OK).download(filePath); + } catch (err) { + // console.log("no access:", path); + response.status(StatusCodes.NOT_FOUND).send({ + message: `File with id ${id} doesn't exist on file server`, + }); + } + } + + /** + * Check if the dataset is under embargo + * Compares only dates (ignoring time) for embargo check + * @param embargoDate - The embargo date from dataset + * @returns true if under embargo, false if embargo has passed or no embargo set + */ + private isUnderEmbargo(embargoDate: DateTime | null): boolean { + // No embargo date set - allow download + if (!embargoDate) { + return false; + } + + // Get current date at start of day (00:00:00) + const today = DateTime.now().startOf('day'); + + // Get embargo date at start of day (00:00:00) + const embargoDateOnly = embargoDate.startOf('day'); + + // File is under embargo if embargo date is after today + // This means the embargo lifts at the start of the embargo date + return embargoDateOnly >= today; } } diff --git a/app/Controllers/Http/Api/HomeController.ts b/app/Controllers/Http/Api/HomeController.ts index 020f651..fdec7f9 100644 --- a/app/Controllers/Http/Api/HomeController.ts +++ b/app/Controllers/Http/Api/HomeController.ts @@ -17,7 +17,8 @@ export default class HomeController { // .preload('authors') // .orderBy('server_date_published'); - const datasets = await db.from('documents as doc') + const datasets = await db + .from('documents as doc') .select(['publish_id', 'server_date_published', db.raw(`date_part('year', server_date_published) as pub_year`)]) .where('server_state', serverState) .innerJoin('link_documents_persons as ba', 'doc.id', 'ba.document_id') @@ -59,7 +60,6 @@ export default class HomeController { // const year = params.year; // const from = parseInt(year); try { - // const datasets = await Database.from('documents as doc') // .select([Database.raw(`date_part('month', server_date_published) as pub_month`), Database.raw('COUNT(*) as count')]) // .where('server_state', serverState) @@ -68,9 +68,12 @@ export default class HomeController { // .groupBy('pub_month'); // // .orderBy('server_date_published'); - const years = [2021, 2022, 2023]; // Add the second year + // Calculate the last 4 years including the current year + const currentYear = new Date().getFullYear(); + const years = Array.from({ length: 4 }, (_, i) => currentYear - (i + 1)).reverse(); - const result = await db.from('documents as doc') + const result = await db + .from('documents as doc') .select([ db.raw(`date_part('year', server_date_published) as pub_year`), db.raw(`date_part('month', server_date_published) as pub_month`), @@ -83,7 +86,7 @@ export default class HomeController { .groupBy('pub_year', 'pub_month') .orderBy('pub_year', 'asc') .orderBy('pub_month', 'asc'); - + const labels = Array.from({ length: 12 }, (_, i) => i + 1); // Assuming 12 months const inputDatasets: Map = result.reduce((acc, item) => { @@ -100,15 +103,15 @@ export default class HomeController { acc[pub_year].data[pub_month - 1] = parseInt(count); - return acc ; + return acc; }, {}); const outputDatasets = Object.entries(inputDatasets).map(([year, data]) => ({ data: data.data, label: year, borderColor: data.borderColor, - fill: data.fill - })); + fill: data.fill, + })); const data = { labels: labels, @@ -126,11 +129,11 @@ export default class HomeController { private getRandomHexColor() { const letters = '0123456789ABCDEF'; let color = '#'; - + for (let i = 0; i < 6; i++) { color += letters[Math.floor(Math.random() * 16)]; } - + return color; } } @@ -139,5 +142,4 @@ interface ChartDataset { label: string; borderColor: string; fill: boolean; - } diff --git a/app/Controllers/Http/Api/UserController.ts b/app/Controllers/Http/Api/UserController.ts index 975e5e2..1d7a14a 100644 --- a/app/Controllers/Http/Api/UserController.ts +++ b/app/Controllers/Http/Api/UserController.ts @@ -9,6 +9,24 @@ import BackupCode from '#models/backup_code'; // Here we are generating secret and recovery codes for the user that’s enabling 2FA and storing them to our database. export default class UserController { + public async getSubmitters({ response }: HttpContext) { + try { + const submitters = await User.query() + .preload('roles', (query) => { + query.where('name', 'submitter') + }) + .whereHas('roles', (query) => { + query.where('name', 'submitter') + }) + .exec(); + return submitters; + } catch (error) { + return response.status(StatusCodes.INTERNAL_SERVER_ERROR).json({ + message: 'Invalid TOTP state', + }); + } + } + public async enable({ auth, response, request }: HttpContext) { const user = (await User.find(auth.user?.id)) as User; // await user.load('totp_secret'); diff --git a/app/Controllers/Http/Api/collections_controller.ts b/app/Controllers/Http/Api/collections_controller.ts new file mode 100644 index 0000000..04dcdb2 --- /dev/null +++ b/app/Controllers/Http/Api/collections_controller.ts @@ -0,0 +1,36 @@ +import type { HttpContext } from '@adonisjs/core/http'; +import Collection from '#models/collection'; + +export default class CollectionsController { + public async show({ params, response }: HttpContext) { + // Get the collection id from route parameters + const collectionId = params.id; + + // Find the selected collection by id + const collection = await Collection.find(collectionId); + if (!collection) { + return response.status(404).json({ message: 'Collection not found' }); + } + + // Query for narrower concepts: collections whose parent_id equals the selected collection's id + const narrowerCollections = await Collection.query().where('parent_id', collection.id) || []; + + // For broader concept, if the selected collection has a parent_id fetch that record (otherwise null) + const broaderCollection: Collection[] | never[] | null = await (async () => { + if (collection.parent_id) { + // Try to fetch the parent... + const parent = await Collection.find(collection.parent_id) + // If found, return it wrapped in an array; if not found, return null (or empty array if you prefer) + return parent ? [parent] : null + } + return [] + })() + + // Return the selected collection along with its narrower and broader concepts in JSON format + return response.json({ + selectedCollection: collection, + narrowerCollections, + broaderCollection, + }); + } +} diff --git a/app/Controllers/Http/Auth/AuthController.ts b/app/Controllers/Http/Auth/AuthController.ts index 71256f2..90a02be 100644 --- a/app/Controllers/Http/Auth/AuthController.ts +++ b/app/Controllers/Http/Auth/AuthController.ts @@ -1,93 +1,68 @@ import type { HttpContext } from '@adonisjs/core/http'; import User from '#models/user'; import BackupCode from '#models/backup_code'; -// import Hash from '@ioc:Adonis/Core/Hash'; -// import InvalidCredentialException from 'App/Exceptions/InvalidCredentialException'; import { authValidator } from '#validators/auth'; import hash from '@adonisjs/core/services/hash'; - +import db from '@adonisjs/lucid/services/db'; import TwoFactorAuthProvider from '#app/services/TwoFactorAuthProvider'; -// import { Authenticator } from '@adonisjs/auth'; -// import { LoginState } from 'Contracts/enums'; -// import { StatusCodes } from 'http-status-codes'; +import ActivityLogger from '#services/activity_logger'; +import logger from '@adonisjs/core/services/logger'; -// interface MyHttpsContext extends HttpContext { -// auth: Authenticator -// } export default class AuthController { - // login function{ request, auth, response }:HttpContext public async login({ request, response, auth, session }: HttpContext) { - // console.log({ - // registerBody: request.body(), - // }); - // await request.validate(AuthValidator); await request.validateUsing(authValidator); - // const plainPassword = await request.input('password'); - // const email = await request.input('email'); - // grab uid and password values off request body const { email, password } = request.only(['email', 'password']); try { - // // attempt to verify credential and login user - // await auth.use('web').attempt(email, plainPassword); + await db.connection().rawQuery('SELECT 1'); - // const user = await auth.use('web').verifyCredentials(email, password); const user = await User.verifyCredentials(email, password); if (user.isTwoFactorEnabled) { - // session.put("login.id", user.id); - // return view.render("pages/two-factor-challenge"); - + // Noch KEIN abgeschlossenes Login -> nicht loggen. session.flash('user_id', user.id); return response.redirect().back(); - - // let state = LoginState.STATE_VALIDATED; - // return response.status(StatusCodes.OK).json({ - // state: state, - // new_user_id: user.id, - // }); } await auth.use('web').login(user); - } catch (error) { - // if login fails, return vague form message and redirect back + this.recordAuthEvent('auth.login', { user, ip: request.ip() }); + } catch (error: any) { + // DB nicht erreichbar -> kein fehlgeschlagener Login-Versuch, weiterwerfen + if (error.code === 'ECONNREFUSED') { + throw error; + } + + // Echter Credential-Fehler -> als fehlgeschlagenen Versuch protokollieren + this.recordAuthEvent('auth.login_failed', { email, ip: request.ip() }); + session.flash('message', 'Your username, email, or password is incorrect'); return response.redirect().back(); } - // otherwise, redirect todashboard - response.redirect('/apps/dashboard'); + return response.redirect('/apps/dashboard'); } public async twoFactorChallenge({ request, session, auth, response }: HttpContext) { - const { code, backup_code, login_id } = request.only(['code', 'backup_code', 'login_id']); + const { code, backup_code, login_id } = request.only(['code', 'backup_code', 'login_id']); const user = await User.query().where('id', login_id).firstOrFail(); if (code) { const isValid = await TwoFactorAuthProvider.validate(user, code); if (isValid) { - // login user and redirect to dashboard await auth.use('web').login(user); - response.redirect('/apps/dashboard'); - } else { - session.flash('message', 'Your two-factor code is incorrect'); - return response.redirect().back(); + this.recordAuthEvent('auth.login', { user, email: user.email, ip: request.ip(), method: '2fa_totp' }); + return response.redirect('/apps/dashboard'); } - } else if (backup_code) { - const codes: BackupCode[] = await user.getBackupCodes(); - - // const verifiedBackupCodes = await Promise.all( - // codes.map(async (backupCode) => { - // let isVerified = await hash.verify(backupCode.code, backup_code); - // if (isVerified) { - // return backupCode; - // } - // }), - // ); - // const backupCodeToDelete = verifiedBackupCodes.find(Boolean); - let backupCodeToDelete = null; + session.flash('message', 'Your two-factor code is incorrect'); + return response.redirect().back(); + } + + if (backup_code) { + const codes: BackupCode[] = await user.getBackupCodes(); + + let backupCodeToDelete: BackupCode | null = null; for (const backupCode of codes) { const isVerified = await hash.verify(backupCode.code, backup_code); if (isVerified) { @@ -96,29 +71,68 @@ export default class AuthController { } } - if (backupCodeToDelete) { - if (backupCodeToDelete.used === false) { - backupCodeToDelete.used = true; - await backupCodeToDelete.save(); - console.log(`BackupCode with id ${backupCodeToDelete.id} has been marked as used.`); - await auth.use('web').login(user); - response.redirect('/apps/dashboard'); - } else { - session.flash('message', 'BackupCode already used'); - return response.redirect().back(); - } - } else { + if (!backupCodeToDelete) { session.flash('message', 'BackupCode not found'); return response.redirect().back(); - } + } + + if (backupCodeToDelete.used) { + session.flash('message', 'BackupCode already used'); + return response.redirect().back(); + } + + backupCodeToDelete.used = true; + await backupCodeToDelete.save(); + + await auth.use('web').login(user); + this.recordAuthEvent('auth.login', { user, email: user.email, ip: request.ip(), method: '2fa_backup_code' }); + + return response.redirect('/apps/dashboard'); } + + // Weder code noch backup_code übergeben + session.flash('message', 'No verification code provided'); + return response.redirect().back(); } - // logout function - public async logout({ auth, response }: HttpContext) { - // await auth.logout(); + public async logout({ auth, request, response }: HttpContext) { + // Session auflösen -> füllt auth.user, falls eingeloggt + await auth.use('web').check(); + const user = auth.use('web').user; + await auth.use('web').logout(); + + if (user) { + this.recordAuthEvent('auth.logout', { user, email: user.email, ip: request.ip() }); + } + return response.redirect('/app/login'); - // return response.status(200); + } + + /** + * Zentraler Audit-Logger für Auth-Events. + * Fire-and-forget: ein Fehler beim Schreiben darf Login/Logout nie blockieren. + */ + private recordAuthEvent( + type: 'auth.login' | 'auth.logout' | 'auth.login_failed', + opts: { user?: User; email?: string; ip: string; method?: string }, + ) { + const { user, email, ip, method } = opts; + + const description = + type === 'auth.login' + ? `${user!.firstName} ${user!.lastName} signed in` + : type === 'auth.logout' + ? `${user!.firstName} ${user!.lastName} signed out` + : `Failed login attempt for ${email ?? 'unknown'}`; + + void ActivityLogger.log({ + type, + description, + userId: user?.id ?? null, + subjectType: user ? 'User' : null, + subjectId: user?.id ?? null, + properties: { ip, ...(method ? { method } : {}) }, + }).catch((err) => logger.error({ err }, `failed to record ${type} activity`)); } } diff --git a/app/Controllers/Http/Auth/UserController.ts b/app/Controllers/Http/Auth/UserController.ts index 442aaca..46a8d48 100644 --- a/app/Controllers/Http/Auth/UserController.ts +++ b/app/Controllers/Http/Auth/UserController.ts @@ -6,6 +6,11 @@ import hash from '@adonisjs/core/services/hash'; // import { schema, rules } from '@adonisjs/validator'; import vine from '@vinejs/vine'; import BackupCodeStorage, { SecureRandom } from '#services/backup_code_storage'; +import path from 'path'; +import crypto from 'crypto'; +// import drive from '#services/drive'; +import drive from '@adonisjs/drive/services/main'; +import logger from '@adonisjs/core/services/logger'; // Here we are generating secret and recovery codes for the user that’s enabling 2FA and storing them to our database. export default class UserController { @@ -28,7 +33,7 @@ export default class UserController { user: user, twoFactorEnabled: user.isTwoFactorEnabled, // code: await TwoFactorAuthProvider.generateQrCode(user), - backupState: backupState, + backupState: backupState, }); } @@ -40,10 +45,8 @@ export default class UserController { // }); const passwordSchema = vine.object({ // first step - old_password: vine - .string() - .trim() - .regex(/^[a-zA-Z0-9]+$/), + old_password: vine.string().trim(), + // .regex(/^[a-zA-Z0-9]+$/), new_password: vine.string().confirmed({ confirmationField: 'confirm_password' }).trim().minLength(8).maxLength(255), }); try { @@ -54,9 +57,9 @@ export default class UserController { // return response.badRequest(error.messages); throw error; } - + try { - const user = await auth.user as User; + const user = (await auth.user) as User; const { old_password, new_password } = request.only(['old_password', 'new_password']); // if (!(old_password && new_password && confirm_password)) { @@ -82,6 +85,171 @@ export default class UserController { } } + public async profile({ inertia, auth }: HttpContext) { + const user = await User.find(auth.user?.id); + // let test = await drive.use().getUrl(user?.avatar); + // user?.preload('roles'); + const avatarFullPathUrl = user?.avatar ? await drive.use('public').getUrl(user.avatar) : null; + return inertia.render('profile/show', { + user: user, + defaultUrl: avatarFullPathUrl, + }); + } + + /** + * Update the user's profile information. + * + * @param {HttpContext} ctx - The HTTP context object. + * @returns {Promise} + */ + public async profileUpdate({ auth, request, response, session }: HttpContext) { + if (!auth.user) { + session.flash('error', 'You must be logged in to update your profile.'); + return response.redirect().toRoute('login'); + } + + const updateProfileValidator = vine.withMetaData<{ userId: number }>().compile( + vine.object({ + first_name: vine.string().trim().minLength(4).maxLength(255), + last_name: vine.string().trim().minLength(4).maxLength(255), + login: vine.string().trim().minLength(4).maxLength(255), + email: vine + .string() + .trim() + .maxLength(255) + .email() + .normalizeEmail() + .isUnique({ table: 'accounts', column: 'email', whereNot: (field) => field.meta.userId }), + avatar: vine + .myfile({ + size: '2mb', + extnames: ['jpg', 'jpeg', 'png', 'gif', 'webp', 'svg'], + }) + // .allowedMimetypeExtensions({ + // allowedExtensions: ['jpg', 'jpeg', 'png', 'gif', 'webp', 'svg'], + // }) + .optional(), + }), + ); + + const user = await User.find(auth.user.id); + if (!user) { + session.flash('error', 'User not found.'); + return response.redirect().toRoute('login'); + } + + try { + // validate update form + await request.validateUsing(updateProfileValidator, { + meta: { + userId: user.id, + }, + }); + + const { login, email, first_name, last_name } = request.only(['login', 'email', 'first_name', 'last_name']); + const sanitizedData: { [key: string]: any } = { + login: login?.trim(), + email: email?.toLowerCase().trim(), + first_name: first_name?.trim(), + last_name: last_name?.trim(), + // avatar: "", + }; + const toCamelCase = (str: string) => str.replace(/_([a-z])/g, (g) => g[1].toUpperCase()); + const hasInputChanges = Object.keys(sanitizedData).some((key) => { + const camelKey = toCamelCase(key); + return sanitizedData[key] !== (user.$attributes as { [key: string]: any })[camelKey]; + }); + + let hasAvatarChanged = false; + const avatar = request.file('avatar'); + if (avatar) { + const fileHash = crypto + .createHash('sha256') + .update(avatar.clientName + avatar.size) + .digest('hex'); + const fileName = `avatar-${fileHash}.${avatar.extname}`; + const avatarFullPath = path.join('/uploads', `${user.login}`, fileName); + + if (user.avatar != avatarFullPath) { + if (user.avatar) { + await drive.use('public').delete(user.avatar); + } + hasAvatarChanged = user.avatar !== avatarFullPath; + await avatar.moveToDisk(avatarFullPath, 'public', { + name: fileName, + overwrite: true, // overwrite in case of conflict + disk: 'public', + }); + sanitizedData.avatar = avatarFullPath; + } + } + + if (!hasInputChanges && !hasAvatarChanged) { + session.flash('message', 'No changes were made.'); + return response.redirect().back(); + } + + await user.merge(sanitizedData).save(); + session.flash('message', 'User has been updated successfully'); + return response.redirect().toRoute('settings.profile.edit'); + } catch (error) { + logger.error('Profile update failed:', error); + // session.flash('errors', 'Profile update failed. Please try again.'); + // return response.redirect().back(); + throw error; + } + } + + public async passwordUpdate({ auth, request, response, session }: HttpContext) { + // const passwordSchema = schema.create({ + // old_password: schema.string({ trim: true }, [rules.required()]), + // new_password: schema.string({ trim: true }, [rules.minLength(8), rules.maxLength(255), rules.confirmed('confirm_password')]), + // confirm_password: schema.string({ trim: true }, [rules.required()]), + // }); + const passwordSchema = vine.object({ + // first step + old_password: vine.string().trim(), + // .regex(/^[a-zA-Z0-9]+$/), + new_password: vine.string().confirmed({ confirmationField: 'confirm_password' }).trim().minLength(8).maxLength(255), + }); + try { + // await request.validate({ schema: passwordSchema }); + const validator = vine.compile(passwordSchema); + await request.validateUsing(validator); + } catch (error) { + // return response.badRequest(error.messages); + throw error; + } + + try { + const user = (await auth.user) as User; + const { old_password, new_password } = request.only(['old_password', 'new_password']); + + // if (!(old_password && new_password && confirm_password)) { + // return response.status(400).send({ warning: 'Old password and new password are required.' }); + // } + + // Verify if the provided old password matches the user's current password + const isSame = await hash.verify(user.password, old_password); + if (!isSame) { + session.flash('warning', 'Old password is incorrect.'); + return response.redirect().back(); + // return response.flash('warning', 'Old password is incorrect.').redirect().back(); + } + + // Hash the new password before updating the user's password + user.password = new_password; + await user.save(); + + // return response.status(200).send({ message: 'Password updated successfully.' }); + session.flash({ message: 'Password updated successfully.' }); + return response.redirect().toRoute('settings.profile.edit'); + } catch (error) { + // return response.status(500).send({ message: 'Internal server error.' }); + return response.flash('warning', `Invalid server state. Internal server error.`).redirect().back(); + } + } + public async enableTwoFactorAuthentication({ auth, response, session }: HttpContext): Promise { // const user: User | undefined = auth?.user; const user = (await User.find(auth.user?.id)) as User; @@ -115,7 +283,7 @@ export default class UserController { } else { session.flash('error', 'User not found.'); } - + return response.redirect().back(); // return inertia.render('Auth/AccountInfo', { // // status: { diff --git a/app/Controllers/Http/Editor/DatasetController.ts b/app/Controllers/Http/Editor/DatasetController.ts index acaf505..84e1f52 100644 --- a/app/Controllers/Http/Editor/DatasetController.ts +++ b/app/Controllers/Http/Editor/DatasetController.ts @@ -3,7 +3,7 @@ import { Client } from '@opensearch-project/opensearch'; import User from '#models/user'; import Dataset from '#models/dataset'; import DatasetIdentifier from '#models/dataset_identifier'; -import XmlModel from '#app/Library/XmlModel'; +import DatasetXmlSerializer from '#app/Library/DatasetXmlSerializer'; import { XMLBuilder } from 'xmlbuilder2/lib/interfaces.js'; import { create } from 'xmlbuilder2'; import { readFileSync } from 'fs'; @@ -18,9 +18,33 @@ import { HttpException } from 'node-exceptions'; import { ModelQueryBuilderContract } from '@adonisjs/lucid/types/model'; import vine, { SimpleMessagesProvider } from '@vinejs/vine'; import mail from '@adonisjs/mail/services/main'; -// import { resolveMx } from 'dns/promises'; -// import * as net from 'net'; import { validate } from 'deep-email-validator'; +import { + TitleTypes, + DescriptionTypes, + ContributorTypes, + PersonNameTypes, + ReferenceIdentifierTypes, + RelationTypes, + SubjectTypes, + DatasetTypes, +} from '#contracts/enums'; +import { TransactionClientContract } from '@adonisjs/lucid/types/database'; +import db from '@adonisjs/lucid/services/db'; +import Project from '#models/project'; +import License from '#models/license'; +import Language from '#models/language'; +import File from '#models/file'; +import Coverage from '#models/coverage'; +import Title from '#models/title'; +import Description from '#models/description'; +import Subject from '#models/subject'; +import DatasetReference from '#models/dataset_reference'; +import Collection from '#models/collection'; +import CollectionRole from '#models/collection_role'; +import { updateEditorDatasetValidator } from '#validators/dataset'; +import { savePersons } from '#app/utils/utility-functions'; + // Create a new instance of the client const client = new Client({ node: 'http://localhost:9200' }); // replace with your OpenSearch endpoint @@ -63,8 +87,15 @@ export default class DatasetsController { } datasets.orderBy(attribute, sortOrder); } else { - // users.orderBy('created_at', 'desc'); - datasets.orderBy('id', 'asc'); + // datasets.orderBy('id', 'asc'); + // Custom ordering to prioritize rejected_editor state + datasets.orderByRaw(` + CASE + WHEN server_state = 'rejected_reviewer' THEN 0 + ELSE 1 + END ASC, + id ASC + `); } // const users = await User.query().orderBy('login').paginate(page, limit); @@ -157,10 +188,16 @@ export default class DatasetsController { } } - public async approve({ request, inertia, response }: HttpContext) { + public async approve({ request, inertia, response, auth }: HttpContext) { const id = request.param('id'); + + const user = auth.user; + if (!user) { + return response.flash('You must be logged in to edit a dataset.', 'error').redirect().toRoute('app.login.show'); + } + // $dataset = Dataset::with('user:id,login')->findOrFail($id); - const dataset = await Dataset.findOrFail(id); + const dataset = await Dataset.query().where('id', id).where('editor_id', user.id).firstOrFail(); const validStates = ['editor_accepted', 'rejected_reviewer']; if (!validStates.includes(dataset.server_state)) { @@ -186,7 +223,7 @@ export default class DatasetsController { }); } - public async approveUpdate({ request, response }: HttpContext) { + public async approveUpdate({ request, response, auth }: HttpContext) { const approveDatasetSchema = vine.object({ reviewer_id: vine.number(), }); @@ -199,7 +236,11 @@ export default class DatasetsController { throw error; } const id = request.param('id'); - const dataset = await Dataset.findOrFail(id); + const user = auth.user; + if (!user) { + return response.flash('You must be logged in to edit a dataset.', 'error').redirect().toRoute('app.login.show'); + } + const dataset = await Dataset.query().where('id', id).where('editor_id', user.id).firstOrFail(); const validStates = ['editor_accepted', 'rejected_reviewer']; if (!validStates.includes(dataset.server_state)) { @@ -217,6 +258,9 @@ export default class DatasetsController { if (dataset.reject_reviewer_note != null) { dataset.reject_reviewer_note = null; } + if (dataset.reject_editor_note != null) { + dataset.reject_editor_note = null; + } //save main and additional titles const reviewer_id = request.input('reviewer_id', null); @@ -227,10 +271,15 @@ export default class DatasetsController { } } - public async reject({ request, inertia, response }: HttpContext) { + public async reject({ request, inertia, response, auth }: HttpContext) { const id = request.param('id'); + const user = auth.user; + if (!user) { + return response.flash('You must be logged in to edit a dataset.', 'error').redirect().toRoute('app.login.show'); + } const dataset = await Dataset.query() .where('id', id) + .where('editor_id', user.id) // Ensure the user is the editor of the dataset // .preload('titles') // .preload('descriptions') .preload('user', (builder) => { @@ -255,77 +304,17 @@ export default class DatasetsController { }); } - // private async checkEmailDomain(email: string): Promise { - // const domain = email.split('@')[1]; - - // try { - // // Step 1: Check MX records for the domain - // const mxRecords = await resolveMx(domain); - // if (mxRecords.length === 0) { - // return false; // No MX records, can't send email - // } - - // // Sort MX records by priority - // mxRecords.sort((a, b) => a.priority - b.priority); - - // // Step 2: Attempt SMTP connection to the first available mail server - // const smtpServer = mxRecords[0].exchange; - - // return await this.checkMailboxExists(smtpServer, email); - // } catch (error) { - // console.error('Error during MX lookup or SMTP validation:', error); - // return false; - // } - // } - - //// Helper function to check if the mailbox exists using SMTP - // private async checkMailboxExists(smtpServer: string, email: string): Promise { - // return new Promise((resolve, reject) => { - // const socket = net.createConnection(25, smtpServer); - - // socket.on('connect', () => { - // socket.write(`HELO ${smtpServer}\r\n`); - // socket.write(`MAIL FROM: \r\n`); - // socket.write(`RCPT TO: <${email}>\r\n`); - // }); - - // socket.on('data', (data) => { - // const response = data.toString(); - // if (response.includes('250')) { - // // 250 is an SMTP success code - // socket.end(); - // resolve(true); // Email exists - // } else if (response.includes('550')) { - // // 550 means the mailbox doesn't exist - // socket.end(); - // resolve(false); // Email doesn't exist - // } - // }); - - // socket.on('error', (error) => { - // console.error('SMTP connection error:', error); - // socket.end(); - // resolve(false); - // }); - - // socket.on('end', () => { - // // SMTP connection closed - // }); - - // socket.setTimeout(5000, () => { - // // Timeout after 5 seconds - // socket.end(); - // resolve(false); // Assume email doesn't exist if no response - // }); - // }); - // } - public async rejectUpdate({ request, response, auth }: HttpContext) { const authUser = auth.user!; + if (!authUser) { + return response.flash('You must be logged in to edit a dataset.', 'error').redirect().toRoute('app.login.show'); + } + const id = request.param('id'); const dataset = await Dataset.query() .where('id', id) + .where('editor_id', authUser.id) // Ensure the user is the editor of the dataset .preload('user', (builder) => { builder.select('id', 'login', 'email'); }) @@ -353,7 +342,7 @@ export default class DatasetsController { return response .flash( `Invalid server state. Dataset with id ${id} cannot be rejected. Datset has server state ${dataset.server_state}.`, - 'warning' + 'warning', ) .redirect() .toRoute('editor.dataset.list'); @@ -388,7 +377,9 @@ export default class DatasetsController { emailStatusMessage = ` A rejection email was successfully sent to ${dataset.user.email}.`; } catch (error) { logger.error(error); - return response.flash('Dataset has not been rejected due to an email error: ' + error.message, 'error').toRoute('editor.dataset.list'); + return response + .flash('Dataset has not been rejected due to an email error: ' + error.message, 'error') + .toRoute('editor.dataset.list'); } } else { emailStatusMessage = ` However, the email could not be sent because the submitter's email address (${dataset.user.email}) is not valid.`; @@ -404,11 +395,16 @@ export default class DatasetsController { .toRoute('editor.dataset.list'); } - public async publish({ request, inertia, response }: HttpContext) { + public async publish({ request, inertia, response, auth }: HttpContext) { const id = request.param('id'); + const user = auth.user; + if (!user) { + return response.flash('You must be logged in to edit a dataset.', 'error').redirect().toRoute('app.login.show'); + } const dataset = await Dataset.query() .where('id', id) + .where('editor_id', user.id) // Ensure the user is the editor of the dataset .preload('titles') .preload('authors') // .preload('persons', (builder) => { @@ -430,10 +426,14 @@ export default class DatasetsController { return inertia.render('Editor/Dataset/Publish', { dataset, + can: { + reject: await auth.user?.can(['dataset-editor-reject']), + publish: await auth.user?.can(['dataset-publish']), + }, }); } - public async publishUpdate({ request, response }: HttpContext) { + public async publishUpdate({ request, response, auth }: HttpContext) { const publishDatasetSchema = vine.object({ publisher_name: vine.string().trim(), }); @@ -445,7 +445,12 @@ export default class DatasetsController { throw error; } const id = request.param('id'); - const dataset = await Dataset.findOrFail(id); + const user = auth.user; + if (!user) { + return response.flash('You must be logged in to edit a dataset.', 'error').redirect().toRoute('app.login.show'); + } + + const dataset = await Dataset.query().where('id', id).where('editor_id', user.id).firstOrFail(); // let test = await Dataset.getMax('publish_id'); // const maxPublishId = await Database.from('documents').max('publish_id as max_publish_id').first(); @@ -471,10 +476,139 @@ export default class DatasetsController { } } - public async doiCreate({ request, inertia }: HttpContext) { + public async rejectToReviewer({ request, inertia, response, auth }: HttpContext) { + const id = request.param('id'); + const user = auth.user; + if (!user) { + return response.flash('You must be logged in to edit a dataset.', 'error').redirect().toRoute('app.login.show'); + } + + const dataset = await Dataset.query() + .where('id', id) + .where('editor_id', user.id) // Ensure the user is the editor of the dataset + .preload('reviewer', (builder) => { + builder.select('id', 'login', 'email'); + }) + .firstOrFail(); + + const validStates = ['reviewed']; + if (!validStates.includes(dataset.server_state)) { + // session.flash('errors', 'Invalid server state!'); + return response + .flash( + 'warning', + `Invalid server state. Dataset with id ${id} cannot be rejected to the reviewer. Datset has server state ${dataset.server_state}.`, + ) + .redirect() + .toRoute('editor.dataset.list'); + } + + return inertia.render('Editor/Dataset/RejectToReviewer', { + dataset, + }); + } + + public async rejectToReviewerUpdate({ request, response, auth }: HttpContext) { + const authUser = auth.user!; + + if (!authUser) { + return response.flash('You must be logged in to edit a dataset.', 'error').redirect().toRoute('app.login.show'); + } + const id = request.param('id'); const dataset = await Dataset.query() .where('id', id) + .where('editor_id', authUser.id) // Ensure the user is the editor of the dataset + .preload('reviewer', (builder) => { + builder.select('id', 'login', 'email'); + }) + .firstOrFail(); + + const newSchema = vine.object({ + server_state: vine.string().trim(), + reject_editor_note: vine.string().trim().minLength(10).maxLength(500), + send_mail: vine.boolean().optional(), + }); + + try { + // await request.validate({ schema: newSchema }); + const validator = vine.compile(newSchema); + await request.validateUsing(validator); + } catch (error) { + // return response.badRequest(error.messages); + throw error; + } + + const validStates = ['reviewed']; + if (!validStates.includes(dataset.server_state)) { + // throw new Error('Invalid server state!'); + // return response.flash('warning', 'Invalid server state. Dataset cannot be released to editor').redirect().back(); + return response + .flash( + `Invalid server state. Dataset with id ${id} cannot be rejected to reviewer. Datset has server state ${dataset.server_state}.`, + 'warning', + ) + .redirect() + .toRoute('editor.dataset.list'); + } + + dataset.server_state = 'rejected_to_reviewer'; + const rejectEditorNote = request.input('reject_editor_note', ''); + dataset.reject_editor_note = rejectEditorNote; + + // add logic for sending reject message + const sendMail = request.input('send_email', false); + // const validRecipientEmail = await this.checkEmailDomain('arno.kaimbacher@outlook.at'); + const validationResult = await validate({ + email: dataset.reviewer.email, + validateSMTP: false, + }); + const validRecipientEmail: boolean = validationResult.valid; + + await dataset.save(); + + let emailStatusMessage = ''; + if (sendMail == true) { + if (dataset.reviewer.email && validRecipientEmail) { + try { + await mail.send((message) => { + message.to(dataset.reviewer.email).subject('Dataset Rejection Notification').html(` +

Dear ${dataset.reviewer.login},

+

Your dataset with ID ${dataset.id} has been rejected.

+

Reason for rejection: ${rejectEditorNote}

+

Best regards,
Your Tethys editor: ${authUser.login}

+ `); + }); + emailStatusMessage = ` A rejection email was successfully sent to ${dataset.reviewer.email}.`; + } catch (error) { + logger.error(error); + return response + .flash('Dataset has not been rejected due to an email error: ' + error.message, 'error') + .toRoute('editor.dataset.list'); + } + } else { + emailStatusMessage = ` However, the email could not be sent because the submitter's email address (${dataset.reviewer.email}) is not valid.`; + } + } + + return response + .flash( + `You have successfully rejected dataset ${dataset.id} reviewed by ${dataset.reviewer.login}.${emailStatusMessage}`, + 'message', + ) + .toRoute('editor.dataset.list'); + } + + public async doiCreate({ request, inertia, auth, response }: HttpContext) { + const id = request.param('id'); + const user = auth.user; + if (!user) { + return response.flash('You must be logged in to edit a dataset.', 'error').redirect().toRoute('app.login.show'); + } + + const dataset = await Dataset.query() + .where('id', id) + .where('editor_id', user.id) // Ensure the user is the editor of the dataset .preload('titles') .preload('descriptions') // .preload('identifier') @@ -485,61 +619,509 @@ export default class DatasetsController { }); } - public async doiStore({ request, response }: HttpContext) { + public async doiStore({ request, response, session, auth }: HttpContext) { const dataId = request.param('publish_id'); - const dataset = await Dataset.query() - // .preload('xmlCache') - .where('publish_id', dataId) - .firstOrFail(); + const user = auth.user; + if (!user) { + return response.flash('You must be logged in to edit a dataset.', 'error').redirect().toRoute('app.login.show'); + } + + // Load dataset with minimal required relationships + const dataset = await Dataset.query().where('editor_id', user.id).where('publish_id', dataId).firstOrFail(); + + const prefix = process.env.DATACITE_PREFIX || ''; + const base_domain = process.env.BASE_DOMAIN || ''; + + // Generate DOI metadata XML const xmlMeta = (await Index.getDoiRegisterString(dataset)) as string; - let prefix = ''; - let base_domain = ''; - // const datacite_environment = process.env.DATACITE_ENVIRONMENT || 'debug'; - prefix = process.env.DATACITE_PREFIX || ''; - base_domain = process.env.BASE_DOMAIN || ''; + // Prepare DOI registration data + const doiValue = `${prefix}/tethys.${dataset.publish_id}`; + const landingPageUrl = `https://doi.${getDomain(base_domain)}/${prefix}/tethys.${dataset.publish_id}`; - // register DOI: - const doiValue = prefix + '/tethys.' + dataset.publish_id; //'10.21388/tethys.213' - const landingPageUrl = 'https://doi.' + getDomain(base_domain) + '/' + prefix + '/tethys.' + dataset.publish_id; //https://doi.dev.tethys.at/10.21388/tethys.213 - const doiClient = new DoiClient(); - const dataciteResponse = await doiClient.registerDoi(doiValue, xmlMeta, landingPageUrl); + try { + // Register DOI with DataCite + const doiClient = new DoiClient(); + const dataciteResponse = await doiClient.registerDoi(doiValue, xmlMeta, landingPageUrl); - if (dataciteResponse?.status === 201) { - // if response OK 201; save the Identifier value into db - const doiIdentifier = new DatasetIdentifier(); - doiIdentifier.value = doiValue; - doiIdentifier.dataset_id = dataset.id; - doiIdentifier.type = 'doi'; - doiIdentifier.status = 'findable'; - // save modified date of datset for re-caching model in db an update the search index - dataset.server_date_modified = DateTime.now(); - - // save updated dataset to db an index to OpenSearch - try { - await dataset.related('identifier').save(doiIdentifier); - const index_name = 'tethys-records'; - await Index.indexDocument(dataset, index_name); - } catch (error) { - logger.error(`${__filename}: Indexing document ${dataset.id} failed: ${error.message}`); - // Log the error or handle it as needed - throw new HttpException(error.message); + if (dataciteResponse?.status !== 201) { + const message = `Unexpected DataCite MDS response code ${dataciteResponse?.status}`; + throw new DoiClientException(dataciteResponse?.status, message); } - return response.toRoute('editor.dataset.list').flash('message', 'You have successfully created a DOI for the dataset!'); - } else { - const message = `Unexpected DataCite MDS response code ${dataciteResponse?.status}`; - // Log the error or handle it as needed - throw new DoiClientException(dataciteResponse?.status, message); + + // DOI registration successful - persist and index + await this.persistDoiAndIndex(dataset, doiValue); + + return response + .flash('message', 'You have successfully created a DOI for the dataset!') + .redirect() + .toRoute('editor.dataset.list'); + } catch (error) { + // logger.error(`${__filename}: DOI registration failed for dataset ${dataset.id}: ${error.message}`); + + if (error instanceof DoiClientException) { + // Flash error for Inertia to pick up + session.flash('errors', { + doi: `DOI registration failed: ${error.message}`, + }); + // Optionally also flash a warning for your warning display + session.flash('warning', error.message); + } else { + session.flash('errors', { + general: `An unexpected error occurred: ${error.message}`, + }); + } + + return response.redirect().back(); + } + } + + /** + * Persist DOI identifier and update search index + * Handles cache invalidation to ensure fresh indexing + */ + private async persistDoiAndIndex(dataset: Dataset, doiValue: string): Promise { + // Create DOI identifier + const doiIdentifier = new DatasetIdentifier(); + doiIdentifier.value = doiValue; + doiIdentifier.dataset_id = dataset.id; + doiIdentifier.type = 'doi'; + doiIdentifier.status = 'findable'; + + // Save identifier (this will trigger database insert) + await dataset.related('identifier').save(doiIdentifier); + + // Update dataset modification timestamp to reflect the change + dataset.server_date_modified = DateTime.now(); + await dataset.save(); + + // Invalidate stale XML cache + await this.invalidateDatasetCache(dataset); + + // Reload dataset with fresh state for indexing + const freshDataset = await Dataset.query().where('id', dataset.id).preload('identifier').preload('xmlCache').firstOrFail(); + + // Index to OpenSearch with fresh data + const index_name = process.env.OPENSEARCH_INDEX || 'tethys-records'; + await Index.indexDocument(freshDataset, index_name); + + logger.info(`Successfully created DOI ${doiValue} and indexed dataset ${dataset.id}`); + } + + /** + * Invalidate XML cache for dataset + * Ensures fresh cache generation on next access + */ + private async invalidateDatasetCache(dataset: Dataset): Promise { + await dataset.load('xmlCache'); + + if (dataset.xmlCache) { + await dataset.xmlCache.delete(); + logger.debug(`Invalidated XML cache for dataset ${dataset.id}`); } - // return response.toRoute('editor.dataset.list').flash('message', xmlMeta); } public async show({}: HttpContext) {} - public async edit({}: HttpContext) {} + public async edit({ request, inertia, response, auth }: HttpContext) { + const id = request.param('id'); + + // Check if user is authenticated + const user = auth.user; + if (!user) { + return response.flash('You must be logged in to edit a dataset.', 'error').redirect().toRoute('app.login.show'); + } + + // Prefilter by both id AND editor_id to ensure user has permission to edit + const datasetQuery = Dataset.query().where('id', id).where('editor_id', user.id); + datasetQuery + .preload('titles', (query) => query.orderBy('id', 'asc')) + .preload('descriptions', (query) => query.orderBy('id', 'asc')) + .preload('coverage') + .preload('licenses') + .preload('authors', (query) => query.orderBy('pivot_sort_order', 'asc')) + .preload('contributors', (query) => query.orderBy('pivot_sort_order', 'asc')) + // .preload('subjects') + .preload('subjects', (builder) => { + builder.orderBy('id', 'asc').withCount('datasets'); + }) + .preload('references') + .preload('files', (query) => { + query.orderBy('sort_order', 'asc'); // Sort by sort_order column + }); + + // This will throw 404 if editor_id does not match logged in user + const dataset = await datasetQuery.firstOrFail(); + const validStates = ['editor_accepted', 'rejected_reviewer']; + if (!validStates.includes(dataset.server_state)) { + // session.flash('errors', 'Invalid server state!'); + return response + .flash( + `Invalid server state. Dataset with id ${id} cannot be edited. Datset has server state ${dataset.server_state}.`, + 'warning', + ) + .toRoute('editor.dataset.list'); + } + + const titleTypes = Object.entries(TitleTypes) + .filter(([value]) => value !== 'Main') + .map(([key, value]) => ({ value: key, label: value })); + + const descriptionTypes = Object.entries(DescriptionTypes) + .filter(([value]) => value !== 'Abstract') + .map(([key, value]) => ({ value: key, label: value })); + + const languages = await Language.query().where('active', true).pluck('part1', 'part1'); + + // const contributorTypes = Config.get('enums.contributor_types'); + const contributorTypes = Object.entries(ContributorTypes).map(([key, value]) => ({ value: key, label: value })); + + // const nameTypes = Config.get('enums.name_types'); + const nameTypes = Object.entries(PersonNameTypes).map(([key, value]) => ({ value: key, label: value })); + + // const messages = await Database.table('messages') + // .pluck('help_text', 'metadata_element'); + + const projects = await Project.query().pluck('label', 'id'); + + const currentDate = new Date(); + const currentYear = currentDate.getFullYear(); + const years = Array.from({ length: currentYear - 1990 + 1 }, (_, index) => 1990 + index); + + const licenses = await License.query().select('id', 'name_long').where('active', 'true').pluck('name_long', 'id'); + // const userHasRoles = user.roles; + // const datasetHasLicenses = await dataset.related('licenses').query().pluck('id'); + // const checkeds = dataset.licenses.first().id; + + // const doctypes = { + // analysisdata: { label: 'Analysis', value: 'analysisdata' }, + // measurementdata: { label: 'Measurements', value: 'measurementdata' }, + // monitoring: 'Monitoring', + // remotesensing: 'Remote Sensing', + // gis: 'GIS', + // models: 'Models', + // mixedtype: 'Mixed Type', + // }; + + return inertia.render('Editor/Dataset/Edit', { + dataset, + titletypes: titleTypes, + descriptiontypes: descriptionTypes, + contributorTypes, + nameTypes, + languages, + // messages, + projects, + licenses, + // datasetHasLicenses: Object.keys(datasetHasLicenses).map((key) => datasetHasLicenses[key]), //convert object to array with license ids + // checkeds, + years, + // languages, + subjectTypes: SubjectTypes, + referenceIdentifierTypes: Object.entries(ReferenceIdentifierTypes).map(([key, value]) => ({ value: key, label: value })), + relationTypes: Object.entries(RelationTypes).map(([key, value]) => ({ value: key, label: value })), + doctypes: DatasetTypes, + can: { + edit: await auth.user?.can(['dataset-editor-update']), + // delete: await auth.user?.can(['dataset-delete']), + }, + }); + } + + public async update({ request, response, session, auth }: HttpContext) { + // Get the dataset id from the route parameter + const datasetId = request.param('id'); + const user = auth.user; + if (!user) { + return response.flash('You must be logged in to edit a dataset.', 'error').redirect().toRoute('app.login.show'); + } + + // Retrieve the dataset and load its existing files + const dataset = await Dataset.query().where('id', datasetId).where('editor_id', user.id).firstOrFail(); + await dataset.load('files'); + + let trx: TransactionClientContract | null = null; + try { + await request.validateUsing(updateEditorDatasetValidator); + trx = await db.transaction(); + // const user = (await User.find(auth.user?.id)) as User; + // await this.createDatasetAndAssociations(user, request, trx); + // const dataset = await Dataset.findOrFail(datasetId); + + // save the licenses + const licenses: number[] = request.input('licenses', []); + // await dataset.useTransaction(trx).related('licenses').sync(licenses); + await dataset.useTransaction(trx).related('licenses').sync(licenses); + + // save authors and contributors + await dataset.useTransaction(trx).related('authors').sync([]); + await dataset.useTransaction(trx).related('contributors').sync([]); + await savePersons(dataset, request.input('authors', []), 'author', trx); + await savePersons(dataset, request.input('contributors', []), 'contributor', trx); + + //save the titles: + const titles = request.input('titles', []); + // const savedTitles:Array = []; + for (const titleData of titles) { + if (titleData.id) { + const title = await Title.findOrFail(titleData.id); + title.value = titleData.value; + title.language = titleData.language; + title.type = titleData.type; + if (title.$isDirty) { + await title.useTransaction(trx).save(); + // await dataset.useTransaction(trx).related('titles').save(title); + // savedTitles.push(title); + } + } else { + const title = new Title(); + title.fill(titleData); + // savedTitles.push(title); + await dataset.useTransaction(trx).related('titles').save(title); + } + } + + // save the abstracts + const descriptions = request.input('descriptions', []); + // const savedTitles:Array<Title> = []; + for (const descriptionData of descriptions) { + if (descriptionData.id) { + const description = await Description.findOrFail(descriptionData.id); + description.value = descriptionData.value; + description.language = descriptionData.language; + description.type = descriptionData.type; + if (description.$isDirty) { + await description.useTransaction(trx).save(); + // await dataset.useTransaction(trx).related('titles').save(title); + // savedTitles.push(title); + } + } else { + const description = new Description(); + description.fill(descriptionData); + // savedTitles.push(title); + await dataset.useTransaction(trx).related('descriptions').save(description); + } + } + + // Process all subjects/keywords from the request + const subjects = request.input('subjects'); + for (const subjectData of subjects) { + // Case 1: Subject already exists in the database (has an ID) + if (subjectData.id) { + // Retrieve the existing subject + const existingSubject = await Subject.findOrFail(subjectData.id); + + // Update subject properties from the request data + existingSubject.value = subjectData.value; + existingSubject.type = subjectData.type; + existingSubject.external_key = subjectData.external_key; + + // Only save if there are actual changes + if (existingSubject.$isDirty) { + await existingSubject.save(); + } + + // Note: The relationship between dataset and subject is already established, + // so we don't need to attach it again + } + // Case 2: New subject being added (no ID) + else { + // Check if a subject with the same value and type already exists in the database + const subject = await Subject.firstOrNew({ value: subjectData.value, type: subjectData.type }, subjectData); + + if (subject.$isNew === true) { + // If it's a completely new subject, create and associate it with the dataset + await dataset.useTransaction(trx).related('subjects').save(subject); + } else { + // If the subject already exists, just create the relationship + await dataset.useTransaction(trx).related('subjects').attach([subject.id]); + } + } + } + + const subjectsToDelete = request.input('subjectsToDelete', []); + for (const subjectData of subjectsToDelete) { + if (subjectData.id) { + // const subject = await Subject.findOrFail(subjectData.id); + const subject = await Subject.query() + .where('id', subjectData.id) + .preload('datasets', (builder) => { + builder.orderBy('id', 'asc'); + }) + .withCount('datasets') + .firstOrFail(); + + // Check if the subject is used by multiple datasets + if (subject.$extras.datasets_count > 1) { + // If used by multiple datasets, just detach it from the current dataset + await dataset.useTransaction(trx).related('subjects').detach([subject.id]); + } else { + // If only used by this dataset, delete the subject completely + + await dataset.useTransaction(trx).related('subjects').detach([subject.id]); + await subject.useTransaction(trx).delete(); + } + } + } + + // Process references + const references = request.input('references', []); + // First, get existing references to determine which ones to update vs. create + const existingReferences = await dataset.related('references').query(); + const existingReferencesMap: Map<number, DatasetReference> = new Map(existingReferences.map((ref) => [ref.id, ref])); + + for (const referenceData of references) { + if (existingReferencesMap.has(referenceData.id) && referenceData.id) { + // Update existing reference + const reference = existingReferencesMap.get(referenceData.id); + if (reference) { + reference.merge(referenceData); + if (reference.$isDirty) { + await reference.useTransaction(trx).save(); + } + } + } else { + // Create new reference + const dataReference = new DatasetReference(); + dataReference.fill(referenceData); + await dataset.useTransaction(trx).related('references').save(dataReference); + } + } + + // Handle references to delete if provided + const referencesToDelete = request.input('referencesToDelete', []); + for (const referenceData of referencesToDelete) { + if (referenceData.id) { + const reference = await DatasetReference.findOrFail(referenceData.id); + await reference.useTransaction(trx).delete(); + } + } + + // save coverage + const coverageData = request.input('coverage'); + if (coverageData) { + if (coverageData.id) { + const coverage = await Coverage.findOrFail(coverageData.id); + coverage.merge(coverageData); + if (coverage.$isDirty) { + await coverage.useTransaction(trx).save(); + } + } + } + + const input = request.only(['project_id', 'embargo_date', 'language', 'type', 'creating_corporation']); + // dataset.type = request.input('type'); + dataset.merge(input); + dataset.server_date_modified = DateTime.now(); + // let test: boolean = dataset.$isDirty; + await dataset.useTransaction(trx).save(); + + await trx.commit(); + // console.log('Dataset has been updated successfully'); + + session.flash('message', 'Dataset has been updated successfully'); + // return response.redirect().toRoute('user.index'); + return response.redirect().toRoute('editor.dataset.edit', [dataset.id]); + } catch (error) { + if (trx !== null) { + await trx.rollback(); + } + console.error('Failed to update dataset and related models:', error); + // throw new ValidationException(true, { 'upload error': `failed to create dataset and related models. ${error}` }); + throw error; + } + } + + public async categorize({ inertia, request, response, auth }: HttpContext) { + const id = request.param('id'); + // Check if user is authenticated + const user = auth.user; + if (!user) { + return response.flash('You must be logged in to edit a dataset.', 'error').redirect().toRoute('app.login.show'); + } + // Preload dataset and its "collections" relation + const dataset = await Dataset.query().where('id', id).where('editor_id', user.id).preload('collections').firstOrFail(); + const validStates = ['editor_accepted', 'rejected_reviewer']; + if (!validStates.includes(dataset.server_state)) { + // session.flash('errors', 'Invalid server state!'); + return response + .flash( + 'warning', + `Invalid server state. Dataset with id ${id} cannot be edited. Datset has server state ${dataset.server_state}.`, + ) + .redirect() + .toRoute('editor.dataset.list'); + } + + const collectionRoles = await CollectionRole.query() + .whereIn('name', ['ddc', 'ccs']) + .preload('collections', (coll: Collection) => { + // preloa only top level collection with noparent_id + coll.whereNull('parent_id').orderBy('number', 'asc'); + }) + .exec(); + + return inertia.render('Editor/Dataset/Category', { + collectionRoles: collectionRoles, + dataset: dataset, + relatedCollections: dataset.collections, + }); + } + + public async categorizeUpdate({ request, response, session, auth }: HttpContext) { + // Get the dataset id from the route parameter + const id = request.param('id'); + const user = auth.user; + if (!user) { + return response.flash('You must be logged in to edit a dataset.', 'error').redirect().toRoute('app.login.show'); + } + // Retrieve the dataset and load its existing files + const dataset = await Dataset.query().preload('files').where('id', id).where('editor_id', user.id).firstOrFail(); + + const validStates = ['editor_accepted', 'rejected_reviewer']; + if (!validStates.includes(dataset.server_state)) { + return response + .flash( + 'warning', + `Invalid server state. Dataset with id ${id} cannot be categorized. Dataset has server state ${dataset.server_state}.`, + ) + .redirect() + .toRoute('editor.dataset.list'); + } + + let trx: TransactionClientContract | null = null; + try { + trx = await db.transaction(); + // const user = (await User.find(auth.user?.id)) as User; + // await this.createDatasetAndAssociations(user, request, trx); + + // Retrieve the selected collections from the request. + // This should be an array of collection ids. + const collections: number[] = request.input('collections', []); + + // Synchronize the dataset collections using the transaction. + await dataset.useTransaction(trx).related('collections').sync(collections); + + // Commit the transaction.await trx.commit() + await trx.commit(); + + // Redirect with a success flash message. + // return response.flash('success', 'Dataset collections updated successfully!').redirect().toRoute('dataset.list'); + + session.flash('message', 'Dataset collections updated successfully!'); + return response.redirect().toRoute('editor.dataset.list'); + } catch (error) { + if (trx !== null) { + await trx.rollback(); + } + console.error('Failed tocatgorize dataset collections:', error); + // throw new ValidationException(true, { 'upload error': `failed to create dataset and related models. ${error}` }); + throw error; + } + } // public async update({}: HttpContextContract) {} - public async update({ response }: HttpContext) { + public async updateOpensearch({ response }: HttpContext) { const id = 273; //request.param('id'); const dataset = await Dataset.query().preload('xmlCache').where('id', id).firstOrFail(); // add xml elements @@ -655,6 +1237,30 @@ export default class DatasetsController { } } + public async download({ params, response }: HttpContext) { + const id = params.id; + // Find the file by ID + const file = await File.findOrFail(id); + // const filePath = await drive.use('local').getUrl('/'+ file.filePath) + const filePath = file.filePath; + const fileExt = file.filePath.split('.').pop() || ''; + + // Check if label already includes the extension + const fileName = file.label.toLowerCase().endsWith(`.${fileExt.toLowerCase()}`) ? file.label : `${file.label}.${fileExt}`; + + // Set the response headers and download the file + response + .header('Cache-Control', 'no-cache private') + .header('Content-Description', 'File Transfer') + .header('Content-Type', file.mime_type || 'application/octet-stream') + // .header('Content-Disposition', 'inline; filename=' + fileName) + .header('Content-Transfer-Encoding', 'binary') + .header('Access-Control-Allow-Origin', '*') + .header('Access-Control-Allow-Methods', 'GET'); + response.attachment(fileName); + return response.download(filePath); + } + public async destroy({}: HttpContext) {} private async createXmlRecord(dataset: Dataset, datasetNode: XMLBuilder) { @@ -664,19 +1270,18 @@ export default class DatasetsController { } } - private async getDatasetXmlDomNode(dataset: Dataset) { - const xmlModel = new XmlModel(dataset); + private async getDatasetXmlDomNode(dataset: Dataset): Promise<XMLBuilder | null> { + const serializer = new DatasetXmlSerializer(dataset).enableCaching().excludeEmptyFields(); // xmlModel.setModel(dataset); - xmlModel.excludeEmptyFields(); - xmlModel.caching = true; - // const cache = dataset.xmlCache ? dataset.xmlCache : null; - // dataset.load('xmlCache'); + + // Load existing cache if available + await dataset.load('xmlCache'); if (dataset.xmlCache) { - xmlModel.xmlCache = dataset.xmlCache; + serializer.setCache(dataset.xmlCache); } // return cache.getDomDocument(); - const domDocument: XMLBuilder | null = await xmlModel.getDomDocument(); - return domDocument; + const xmlDocument: XMLBuilder | null = await serializer.toXmlDocument(); + return xmlDocument; } } diff --git a/app/Controllers/Http/Oai/OaiController.ts b/app/Controllers/Http/Oai/OaiController.ts index 6048ca4..e00836f 100644 --- a/app/Controllers/Http/Oai/OaiController.ts +++ b/app/Controllers/Http/Oai/OaiController.ts @@ -1,5 +1,4 @@ import type { HttpContext } from '@adonisjs/core/http'; -// import { RequestContract } from '@ioc:Adonis/Core/Request'; import { Request } from '@adonisjs/core/http'; import { XMLBuilder } from 'xmlbuilder2/lib/interfaces.js'; import { create } from 'xmlbuilder2'; @@ -15,18 +14,14 @@ import { OaiModelException, BadOaiModelException } from '#app/exceptions/OaiMode import Dataset from '#models/dataset'; import Collection from '#models/collection'; import { getDomain, preg_match } from '#app/utils/utility-functions'; -import XmlModel from '#app/Library/XmlModel'; +import DatasetXmlSerializer from '#app/Library/DatasetXmlSerializer'; import logger from '@adonisjs/core/services/logger'; import ResumptionToken from '#app/Library/Oai/ResumptionToken'; -// import Config from '@ioc:Adonis/Core/Config'; -import config from '@adonisjs/core/services/config' -// import { inject } from '@adonisjs/fold'; -import { inject } from '@adonisjs/core' -// import { TokenWorkerContract } from "MyApp/Models/TokenWorker"; +import config from '@adonisjs/core/services/config'; +import { inject } from '@adonisjs/core'; import TokenWorkerContract from '#library/Oai/TokenWorkerContract'; import { ModelQueryBuilderContract } from '@adonisjs/lucid/types/model'; - interface XslTParameter { [key: string]: any; } @@ -35,12 +30,14 @@ interface Dictionary { [index: string]: string; } -interface ListParameter { +interface PagingParameter { cursor: number; - totalIds: number; + totalLength: number; start: number; - reldocIds: (number | null)[]; + nextDocIds: number[]; + activeWorkIds: number[]; metadataPrefix: string; + queryParams: Object; } @inject() @@ -49,6 +46,7 @@ export default class OaiController { private sampleRegEx = /^[A-Za-zäüÄÜß0-9\-_.!~]+$/; private xsltParameter: XslTParameter; + private firstPublishedDataset: Dataset | null; /** * Holds xml representation of document information to be processed. * @@ -57,7 +55,6 @@ export default class OaiController { private xml: XMLBuilder; private proc; - constructor(public tokenWorker: TokenWorkerContract) { // Load the XSLT file this.proc = readFileSync('public/assets2/datasetxml2oai.sef.json'); @@ -82,13 +79,13 @@ export default class OaiController { xsltParameter['oai_error_message'] = 'Only POST and GET methods are allowed for OAI-PMH.'; } - let earliestDateFromDb; // const oaiRequest: OaiParameter = request.body; try { - const firstPublishedDataset: Dataset | null = await Dataset.earliestPublicationDate(); - firstPublishedDataset != null && - (earliestDateFromDb = firstPublishedDataset.server_date_published.toFormat("yyyy-MM-dd'T'HH:mm:ss'Z'")); - this.xsltParameter['earliestDatestamp'] = earliestDateFromDb; + this.firstPublishedDataset = await Dataset.earliestPublicationDate(); + // Pflichtfeld laut OAI-PMH: auch bei leerem Repository einen validen + // UTCdatetime liefern, sonst entsteht ein ungültiges leeres Element. + this.xsltParameter['earliestDatestamp'] = + this.firstPublishedDataset?.server_date_published.toFormat("yyyy-MM-dd'T'HH:mm:ss'Z'") ?? '1970-01-01T00:00:00Z'; // start the request await this.handleRequest(oaiRequest, request); } catch (error) { @@ -121,7 +118,7 @@ export default class OaiController { // logLevel: 10, }); xmlOutput = result.principalResult; - } catch (error) { + } catch (error: any) { return response.status(500).json({ message: 'An error occurred while creating the user', error: error.message, @@ -156,28 +153,25 @@ export default class OaiController { const verb = oaiRequest['verb']; this.xsltParameter['oai_verb'] = verb; if (verb === 'Identify') { - this.handleIdentify(); + this.handleIdentify(oaiRequest); } else if (verb === 'ListMetadataFormats') { this.handleListMetadataFormats(); } else if (verb == 'GetRecord') { await this.handleGetRecord(oaiRequest); } else if (verb == 'ListRecords') { - await this.handleListRecords(oaiRequest); + // Get browser fingerprint from the request: + const browserFingerprint = this.getBrowserFingerprint(request); + await this.handleListRecords(oaiRequest, browserFingerprint); } else if (verb == 'ListIdentifiers') { - await this.handleListIdentifiers(oaiRequest); + // Get browser fingerprint from the request: + const browserFingerprint = this.getBrowserFingerprint(request); + await this.handleListIdentifiers(oaiRequest, browserFingerprint); } else if (verb == 'ListSets') { await this.handleListSets(); } else { this.handleIllegalVerb(); } } else { - // // try { - // // console.log("Async code example.") - // const err = new PageNotFoundException("verb not found"); - // throw err; - // // } catch (error) { // manually catching - // // next(error); // passing to default middleware error handler - // // } throw new OaiModelException( StatusCodes.INTERNAL_SERVER_ERROR, 'The verb provided in the request is illegal.', @@ -186,12 +180,15 @@ export default class OaiController { } } - protected handleIdentify() { - const email = process.env.OAI_EMAIL || 'repository@geosphere.at'; - const repositoryName = 'Tethys RDR'; - const repIdentifier = 'tethys.at'; - const sampleIdentifier = 'oai:' + repIdentifier + ':1'; //$this->_configuration->getSampleIdentifier(); + protected handleIdentify(oaiRequest: Dictionary) { + // OAI-PMH: Identify akzeptiert außer `verb` keine Argumente. + this.assertOnlyVerb(oaiRequest); + // Get configuration values from environment or a dedicated configuration service + const email = process.env.OAI_EMAIL ?? 'repository@geosphere.at'; + const repositoryName = process.env.OAI_REPOSITORY_NAME ?? 'Tethys RDR'; + const repIdentifier = process.env.OAI_REP_IDENTIFIER ?? 'tethys.at'; + const sampleIdentifier = `oai:${repIdentifier}:1`; // Dataset::earliestPublicationDate()->server_date_published->format('Y-m-d\TH:i:s\Z') : null; // earliestDateFromDb!= null && (this.xsltParameter['earliestDatestamp'] = earliestDateFromDb?.server_date_published); @@ -205,6 +202,21 @@ export default class OaiController { this.xml.root().ele('Datasets'); } + /** + * Wirft badArgument, wenn der Request andere Parameter als `verb` enthält. + * Für Verben ohne zusätzliche Argumente (Identify, ListSets, ListMetadataFormats). + */ + private assertOnlyVerb(oaiRequest: Dictionary) { + const illegalKeys = Object.keys(oaiRequest).filter((key) => key !== 'verb'); + if (illegalKeys.length > 0) { + throw new OaiModelException( + StatusCodes.BAD_REQUEST, + `The request includes illegal arguments: ${illegalKeys.join(', ')}.`, + OaiErrorCodes.BADARGUMENT, + ); + } + } + protected handleListMetadataFormats() { this.xml.root().ele('Datasets'); } @@ -216,7 +228,7 @@ export default class OaiController { const sets: { [key: string]: string } = { 'open_access': 'Set for open access licenses', - 'openaire_data': "OpenAIRE", + 'openaire_data': 'OpenAIRE', 'doc-type:ResearchData': 'Set for document type ResearchData', ...(await this.getSetsForDatasetTypes()), ...(await this.getSetsForCollections()), @@ -234,7 +246,15 @@ export default class OaiController { const repIdentifier = 'tethys.at'; this.xsltParameter['repIdentifier'] = repIdentifier; + // Validate that required parameter exists early + if (!('identifier' in oaiRequest)) { + throw new BadOaiModelException('The prefix of the identifier argument is unknown.'); + } + + // Validate and extract the dataset identifier from the request const dataId = this.validateAndGetIdentifier(oaiRequest); + + // Retrieve dataset with associated XML cache and collection roles const dataset = await Dataset.query() .where('publish_id', dataId) .preload('xmlCache') @@ -251,59 +271,61 @@ export default class OaiController { ); } + // Validate and set the metadata prefix parameter const metadataPrefix = this.validateAndGetMetadataPrefix(oaiRequest); this.xsltParameter['oai_metadataPrefix'] = metadataPrefix; - // do not deliver datasets which are restricted by document state defined in deliveringStates + + // Ensure that the dataset is in an exportable state this.validateDatasetState(dataset); - // add xml elements + // Build the XML for the dataset record and add it to the root node const datasetNode = this.xml.root().ele('Datasets'); await this.createXmlRecord(dataset, datasetNode); } - protected async handleListIdentifiers(oaiRequest: Dictionary) { - !this.tokenWorker.isConnected && (await this.tokenWorker.connect()); + protected async handleListIdentifiers(oaiRequest: Dictionary, browserFingerprint: string) { + if (!this.tokenWorker.isConnected) { + await this.tokenWorker.connect(); + } const maxIdentifier: number = config.get('oai.max.listidentifiers', 100); - await this.handleLists(oaiRequest, maxIdentifier); + await this.handleLists(oaiRequest, maxIdentifier, browserFingerprint); } - protected async handleListRecords(oaiRequest: Dictionary) { - !this.tokenWorker.isConnected && (await this.tokenWorker.connect()); + protected async handleListRecords(oaiRequest: Dictionary, browserFingerprint: string) { + if (!this.tokenWorker.isConnected) { + await this.tokenWorker.connect(); + } const maxRecords: number = config.get('oai.max.listrecords', 100); - await this.handleLists(oaiRequest, maxRecords); + await this.handleLists(oaiRequest, maxRecords, browserFingerprint); } - private async handleLists(oaiRequest: Dictionary, maxRecords: number) { - maxRecords = maxRecords || 100; + private async handleLists(oaiRequest: Dictionary, maxRecords: number, browserFingerprint: string) { const repIdentifier = 'tethys.at'; this.xsltParameter['repIdentifier'] = repIdentifier; const datasetNode = this.xml.root().ele('Datasets'); - // list initialisation - const numWrapper: ListParameter = { + const paginationParams: PagingParameter = { cursor: 0, - totalIds: 0, + totalLength: 0, start: maxRecords + 1, - reldocIds: [], + nextDocIds: [], + activeWorkIds: [], metadataPrefix: '', + queryParams: {}, }; - // resumptionToken is defined if ('resumptionToken' in oaiRequest) { - await this.handleResumptionToken(oaiRequest, maxRecords, numWrapper); + await this.handleResumptionToken(oaiRequest, maxRecords, paginationParams); } else { - // no resumptionToken is given - await this.handleNoResumptionToken(oaiRequest, numWrapper); + await this.handleNoResumptionToken(oaiRequest, paginationParams, maxRecords); } - // handling of document ids - const restIds = numWrapper.reldocIds as number[]; - const workIds = restIds.splice(0, maxRecords) as number[]; // array_splice(restIds, 0, maxRecords); + const nextIds: number[] = paginationParams.nextDocIds; + const workIds: number[] = paginationParams.activeWorkIds; - // no records returned - if (workIds.length == 0) { + if (workIds.length === 0) { throw new OaiModelException( StatusCodes.INTERNAL_SERVER_ERROR, 'The combination of the given values results in an empty list.', @@ -311,169 +333,222 @@ export default class OaiController { ); } - const datasets: Dataset[] = await Dataset.query() + const datasets = await Dataset.query() .whereIn('publish_id', workIds) .preload('xmlCache') .preload('collections', (builder) => { builder.preload('collectionRole'); }) .orderBy('publish_id'); - for (const dataset of datasets) { await this.createXmlRecord(dataset, datasetNode); } - - // store the further Ids in a resumption-file - const countRestIds = restIds.length; //84 - if (countRestIds > 0) { - const token = new ResumptionToken(); - token.startPosition = numWrapper.start; //101 - token.totalIds = numWrapper.totalIds; //184 - token.documentIds = restIds; //101 -184 - token.metadataPrefix = numWrapper.metadataPrefix; - - // $tokenWorker->storeResumptionToken($token); - const res: string = await this.tokenWorker.set(token); - - // set parameters for the resumptionToken-node - // const res = token.ResumptionId; - this.setParamResumption(res, numWrapper.cursor, numWrapper.totalIds); - } + await this.setResumptionToken(nextIds, paginationParams, browserFingerprint); } - private async handleResumptionToken(oaiRequest: Dictionary, maxRecords: number, numWrapper: ListParameter) { - const resParam = oaiRequest['resumptionToken']; //e.g. "158886496600000" + private async handleNoResumptionToken(oaiRequest: Dictionary, paginationParams: PagingParameter, maxRecords: number) { + this.validateMetadataPrefix(oaiRequest, paginationParams); + const finder: ModelQueryBuilderContract<typeof Dataset, Dataset> = Dataset.query().whereIn( + 'server_state', + this.deliveringDocumentStates, + ); + this.applySetFilter(finder, oaiRequest); + this.applyDateFilters(finder, oaiRequest); + await this.fetchAndSetResults(finder, paginationParams, oaiRequest, maxRecords); + } + + private async fetchAndSetResults( + finder: ModelQueryBuilderContract<typeof Dataset, Dataset>, + paginationParams: PagingParameter, + oaiRequest: Dictionary, + maxRecords: number, + ) { + const totalResult = await finder + .clone() + .count('* as total') + .first() + .then((res) => res?.$extras.total); + paginationParams.totalLength = Number(totalResult); + + const combinedRecords: Dataset[] = await finder + .select('publish_id') + .orderBy('publish_id') + .offset(0) + .limit(maxRecords * 2); + + paginationParams.activeWorkIds = combinedRecords.slice(0, 100).map((dat) => Number(dat.publish_id)); + paginationParams.nextDocIds = combinedRecords.slice(100).map((dat) => Number(dat.publish_id)); + + // No resumption token was used – set queryParams from the current oaiRequest + paginationParams.queryParams = { + ...oaiRequest, + deliveringStates: this.deliveringDocumentStates, + }; + + // paginationParams.totalLength = 230; + } + + private async handleResumptionToken(oaiRequest: Dictionary, maxRecords: number, paginationParams: PagingParameter) { + const resParam = oaiRequest['resumptionToken']; const token = await this.tokenWorker.get(resParam); if (!token) { throw new OaiModelException(StatusCodes.INTERNAL_SERVER_ERROR, 'cache is outdated.', OaiErrorCodes.BADRESUMPTIONTOKEN); } - numWrapper.cursor = token.startPosition - 1; //startet dann bei Index 10 - numWrapper.start = token.startPosition + maxRecords; - numWrapper.totalIds = token.totalIds; - numWrapper.reldocIds = token.documentIds; - numWrapper.metadataPrefix = token.metadataPrefix; + // this.setResumptionParameters(token, maxRecords, paginationParams); + paginationParams.cursor = token.startPosition - 1; + paginationParams.start = token.startPosition + maxRecords; + paginationParams.totalLength = token.totalIds; + paginationParams.activeWorkIds = token.documentIds; + paginationParams.metadataPrefix = token.metadataPrefix; + paginationParams.queryParams = token.queryParams; + this.xsltParameter['oai_metadataPrefix'] = token.metadataPrefix; - this.xsltParameter['oai_metadataPrefix'] = numWrapper.metadataPrefix; + const finder = this.buildDatasetQueryViaToken(token); + const nextRecords: Dataset[] = await this.fetchNextRecords(finder, token, maxRecords); + paginationParams.nextDocIds = nextRecords.map((dat) => Number(dat.publish_id)); } - private async handleNoResumptionToken(oaiRequest: Dictionary, numWrapper: ListParameter) { - // no resumptionToken is given - if ('metadataPrefix' in oaiRequest) { - numWrapper.metadataPrefix = oaiRequest['metadataPrefix']; - } else { + private async setResumptionToken(nextIds: number[], paginationParams: PagingParameter, browserFingerprint: string) { + const countRestIds = nextIds.length; + if (countRestIds > 0) { + // const token = this.createResumptionToken(paginationParams, nextIds); + const token = new ResumptionToken(); + token.startPosition = paginationParams.start; + token.totalIds = paginationParams.totalLength; + token.documentIds = nextIds; + token.metadataPrefix = paginationParams.metadataPrefix; + token.queryParams = paginationParams.queryParams; + const res: string = await this.tokenWorker.set(token, browserFingerprint); + this.setParamResumption(res, paginationParams.cursor, paginationParams.totalLength); + } + } + + private buildDatasetQueryViaToken(token: ResumptionToken) { + const finder = Dataset.query(); + const originalQuery = token.queryParams || {}; + const deliveringStates = originalQuery.deliveringStates || this.deliveringDocumentStates; + + finder.whereIn('server_state', deliveringStates); + this.applySetFilter(finder, originalQuery); + this.applyDateFilters(finder, originalQuery); + + return finder; + } + + private async fetchNextRecords(finder: ModelQueryBuilderContract<typeof Dataset, Dataset>, token: ResumptionToken, maxRecords: number) { + return finder + .select('publish_id') + .orderBy('publish_id') + .offset(token.startPosition - 1 + maxRecords) + .limit(100); + } + + private validateMetadataPrefix(oaiRequest: Dictionary, paginationParams: PagingParameter) { + if (!('metadataPrefix' in oaiRequest)) { throw new OaiModelException( StatusCodes.INTERNAL_SERVER_ERROR, 'The prefix of the metadata argument is unknown.', OaiErrorCodes.BADARGUMENT, ); } - this.xsltParameter['oai_metadataPrefix'] = numWrapper.metadataPrefix; + paginationParams.metadataPrefix = oaiRequest['metadataPrefix']; + this.xsltParameter['oai_metadataPrefix'] = paginationParams.metadataPrefix; + } - let finder: ModelQueryBuilderContract<typeof Dataset, Dataset> = Dataset.query(); - // add server state restrictions - finder.whereIn('server_state', this.deliveringDocumentStates); - if ('set' in oaiRequest) { - const set = oaiRequest['set'] as string; - const setArray = set.split(':'); + private applySetFilter(finder: ModelQueryBuilderContract<typeof Dataset, Dataset>, queryParams: any) { + if ('set' in queryParams) { + const [setType, setValue] = queryParams['set'].split(':'); - if (setArray[0] == 'data-type') { - if (setArray.length == 2 && setArray[1]) { - finder.where('type', setArray[1]); - } - } else if (setArray[0] == 'open_access') { - const openAccessLicences = ['CC-BY-4.0', 'CC-BY-SA-4.0']; - finder.andWhereHas('licenses', (query) => { - query.whereIn('name', openAccessLicences); - }); - } else if (setArray[0] == 'ddc') { - if (setArray.length == 2 && setArray[1] != '') { - finder.andWhereHas('collections', (query) => { - query.where('number', setArray[1]); + switch (setType) { + case 'data-type': + setValue && finder.where('type', setValue); + break; + case 'open_access': + finder.andWhereHas('licenses', (query) => { + query.whereIn('name', ['CC-BY-4.0', 'CC-BY-SA-4.0']); }); - } + break; + case 'ddc': + setValue && + finder.andWhereHas('collections', (query) => { + query.where('number', setValue); + }); + break; } } + } - // const timeZone = "Europe/Vienna"; // Canonical time zone name - // &from=2020-09-03&until2020-09-03 - // &from=2020-09-11&until=2021-05-11 - if ('from' in oaiRequest && 'until' in oaiRequest) { - const from = oaiRequest['from'] as string; - let fromDate = dayjs(from); //.tz(timeZone); - const until = oaiRequest['until'] as string; - let untilDate = dayjs(until); //.tz(timeZone); - if (!fromDate.isValid() || !untilDate.isValid()) { - throw new OaiModelException(StatusCodes.INTERNAL_SERVER_ERROR, 'Date Parameter is not valid.', OaiErrorCodes.BADARGUMENT); - } - fromDate = dayjs.tz(from, 'Europe/Vienna'); - untilDate = dayjs.tz(until, 'Europe/Vienna'); + private applyDateFilters(finder: ModelQueryBuilderContract<typeof Dataset, Dataset>, queryParams: any) { + const { from, until } = queryParams; - if (from.length != until.length) { - throw new OaiModelException( - StatusCodes.INTERNAL_SERVER_ERROR, - 'The request has different granularities for the from and until parameters.', - OaiErrorCodes.BADARGUMENT, - ); - } - fromDate.hour() == 0 && (fromDate = fromDate.startOf('day')); - untilDate.hour() == 0 && (untilDate = untilDate.endOf('day')); + if (from && until) { + this.handleFromUntilFilter(finder, from, until); + } else if (from) { + this.handleFromFilter(finder, from); + } else if (until) { + this.handleUntilFilter(finder, until); + } + } - finder.whereBetween('server_date_published', [fromDate.format('YYYY-MM-DD HH:mm:ss'), untilDate.format('YYYY-MM-DD HH:mm:ss')]); - } else if ('from' in oaiRequest && !('until' in oaiRequest)) { - const from = oaiRequest['from'] as string; - let fromDate = dayjs(from); - if (!fromDate.isValid()) { - throw new OaiModelException( - StatusCodes.INTERNAL_SERVER_ERROR, - 'From date parameter is not valid.', - OaiErrorCodes.BADARGUMENT, - ); - } - fromDate = dayjs.tz(from, 'Europe/Vienna'); - fromDate.hour() == 0 && (fromDate = fromDate.startOf('day')); + private handleFromUntilFilter(finder: ModelQueryBuilderContract<typeof Dataset, Dataset>, from: string, until: string) { + const fromDate = this.parseDateWithValidation(from, 'From'); + const untilDate = this.parseDateWithValidation(until, 'Until'); - const now = dayjs(); - if (fromDate.isAfter(now)) { - throw new OaiModelException( - StatusCodes.INTERNAL_SERVER_ERROR, - 'Given from date is greater than now. The given values results in an empty list.', - OaiErrorCodes.NORECORDSMATCH, - ); - } else { - finder.andWhere('server_date_published', '>=', fromDate.format('YYYY-MM-DD HH:mm:ss')); - } - } else if (!('from' in oaiRequest) && 'until' in oaiRequest) { - const until = oaiRequest['until'] as string; - let untilDate = dayjs(until); - if (!untilDate.isValid()) { - throw new OaiModelException( - StatusCodes.INTERNAL_SERVER_ERROR, - 'Until date parameter is not valid.', - OaiErrorCodes.BADARGUMENT, - ); - } - untilDate = dayjs.tz(until, 'Europe/Vienna'); - untilDate.hour() == 0 && (untilDate = untilDate.endOf('day')); - - const firstPublishedDataset: Dataset = (await Dataset.earliestPublicationDate()) as Dataset; - const earliestPublicationDate = dayjs(firstPublishedDataset.server_date_published.toISO()); //format("YYYY-MM-DDThh:mm:ss[Z]")); - if (earliestPublicationDate.isAfter(untilDate)) { - throw new OaiModelException( - StatusCodes.INTERNAL_SERVER_ERROR, - `earliestDatestamp is greater than given until date. - The given values results in an empty list.`, - OaiErrorCodes.NORECORDSMATCH, - ); - } else { - finder.andWhere('server_date_published', '<=', untilDate.format('YYYY-MM-DD HH:mm:ss')); - } + if (from.length !== until.length) { + throw new OaiModelException( + StatusCodes.INTERNAL_SERVER_ERROR, + 'The request has different granularities for the from and until parameters.', + OaiErrorCodes.BADARGUMENT, + ); } - let reldocIdsDocs = await finder.select('publish_id').orderBy('publish_id'); - numWrapper.reldocIds = reldocIdsDocs.map((dat) => dat.publish_id); - numWrapper.totalIds = numWrapper.reldocIds.length; //212 + finder.whereBetween('server_date_published', [fromDate.format('YYYY-MM-DD HH:mm:ss'), untilDate.format('YYYY-MM-DD HH:mm:ss')]); + } + + private handleFromFilter(finder: ModelQueryBuilderContract<typeof Dataset, Dataset>, from: string) { + const fromDate = this.parseDateWithValidation(from, 'From'); + const now = dayjs(); + + if (fromDate.isAfter(now)) { + throw new OaiModelException( + StatusCodes.INTERNAL_SERVER_ERROR, + 'Given from date is greater than now. The given values results in an empty list.', + OaiErrorCodes.NORECORDSMATCH, + ); + } + + finder.andWhere('server_date_published', '>=', fromDate.format('YYYY-MM-DD HH:mm:ss')); + } + + private handleUntilFilter(finder: ModelQueryBuilderContract<typeof Dataset, Dataset>, until: string) { + const untilDate = this.parseDateWithValidation(until, 'Until'); + + const earliestPublicationDate = dayjs(this.firstPublishedDataset?.server_date_published.toISO()); + + if (earliestPublicationDate.isAfter(untilDate)) { + throw new OaiModelException( + StatusCodes.INTERNAL_SERVER_ERROR, + 'earliestDatestamp is greater than given until date. The given values results in an empty list.', + OaiErrorCodes.NORECORDSMATCH, + ); + } + + finder.andWhere('server_date_published', '<=', untilDate.format('YYYY-MM-DD HH:mm:ss')); + } + + private parseDateWithValidation(dateStr: string, label: string) { + let date = dayjs(dateStr); + if (!date.isValid()) { + throw new OaiModelException( + StatusCodes.INTERNAL_SERVER_ERROR, + `${label} date parameter is not valid.`, + OaiErrorCodes.BADARGUMENT, + ); + } + date = dayjs.tz(dateStr, 'Europe/Vienna'); + return date.hour() === 0 ? (label === 'From' ? date.startOf('day') : date.endOf('day')) : date; } private setParamResumption(res: string, cursor: number, totalIds: number) { @@ -545,19 +620,17 @@ export default class OaiController { } private async getDatasetXmlDomNode(dataset: Dataset) { - const xmlModel = new XmlModel(dataset); - // xmlModel.setModel(dataset); - xmlModel.excludeEmptyFields(); - xmlModel.caching = true; + const serializer = new DatasetXmlSerializer(dataset).enableCaching().excludeEmptyFields(); + // const cache = dataset.xmlCache ? dataset.xmlCache : null; // dataset.load('xmlCache'); if (dataset.xmlCache) { - xmlModel.xmlCache = dataset.xmlCache; + serializer.setCache(dataset.xmlCache); } - // return cache.getDomDocument(); - const domDocument: XMLBuilder | null = await xmlModel.getDomDocument(); - return domDocument; + // return cache.toXmlDocument(); + const xmlDocument: XMLBuilder | null = await serializer.toXmlDocument(); + return xmlDocument; } private addSpecInformation(domNode: XMLBuilder, information: string) { @@ -641,4 +714,30 @@ export default class OaiController { this.xsltParameter['oai_error_code'] = 'badVerb'; this.xsltParameter['oai_error_message'] = 'The verb provided in the request is illegal.'; } + + /** + * Helper method to build a browser fingerprint by combining: + * - User-Agent header, + * - the IP address, + * - Accept-Language header, + * - current timestamp rounded to the hour. + * + * Every new hour, this will return a different fingerprint. + */ + private getBrowserFingerprint(request: Request): string { + const userAgent = request.header('user-agent') || 'unknown'; + // Check for X-Forwarded-For header to use the client IP from the proxy if available. + const xForwardedFor = request.header('x-forwarded-for'); + let ip = request.ip(); + // console.log(ip); + if (xForwardedFor) { + // X-Forwarded-For may contain a comma-separated list of IPs; the first one is the client IP. + ip = xForwardedFor.split(',')[0].trim(); + // console.log('xforwardedfor ip' + ip); + } + const locale = request.header('accept-language') || 'default'; + // Round the current time to the start of the hour. + const timestampHour = dayjs().startOf('hour').format('YYYY-MM-DDTHH'); + return `${userAgent}-${ip}-${locale}-${timestampHour}`; + } } diff --git a/app/Controllers/Http/Reviewer/DatasetController.ts b/app/Controllers/Http/Reviewer/DatasetController.ts index 66600f4..27f9b46 100644 --- a/app/Controllers/Http/Reviewer/DatasetController.ts +++ b/app/Controllers/Http/Reviewer/DatasetController.ts @@ -9,6 +9,7 @@ import vine from '@vinejs/vine'; import mail from '@adonisjs/mail/services/main'; import logger from '@adonisjs/core/services/logger'; import { validate } from 'deep-email-validator'; +import File from '#models/file'; interface Dictionary { [index: string]: string; @@ -38,13 +39,21 @@ export default class DatasetsController { } datasets.orderBy(attribute, sortOrder); } else { - // users.orderBy('created_at', 'desc'); - datasets.orderBy('id', 'asc'); + // datasets.orderBy('id', 'asc'); + // Custom ordering to prioritize rejected_editor state + datasets.orderByRaw(` + CASE + WHEN server_state = 'rejected_to_reviewer' THEN 0 + ELSE 1 + END ASC, + id ASC + `); } // const users = await User.query().orderBy('login').paginate(page, limit); const myDatasets = await datasets - .where('server_state', 'approved') + // .where('server_state', 'approved') + .whereIn('server_state', ['approved', 'rejected_to_reviewer']) .where('reviewer_id', user.id) .preload('titles') @@ -62,7 +71,51 @@ export default class DatasetsController { }); } - public async review({ request, inertia, response }: HttpContext) { + public async review({ request, inertia, response, auth }: HttpContext) { + const id = request.param('id'); + const datasetQuery = Dataset.query().where('id', id); + + datasetQuery + .preload('titles', (query) => query.orderBy('id', 'asc')) + .preload('descriptions', (query) => query.orderBy('id', 'asc')) + .preload('coverage') + .preload('licenses') + .preload('authors', (query) => query.orderBy('pivot_sort_order', 'asc')) + .preload('contributors', (query) => query.orderBy('pivot_sort_order', 'asc')) + // .preload('subjects') + .preload('subjects', (builder) => { + builder.orderBy('id', 'asc').withCount('datasets'); + }) + .preload('references') + .preload('project') + .preload('files', (query) => { + query.orderBy('sort_order', 'asc'); // Sort by sort_order column + }); + + const dataset = await datasetQuery.firstOrFail(); + + const validStates = ['approved', 'rejected_to_reviewer']; + if (!validStates.includes(dataset.server_state)) { + // session.flash('errors', 'Invalid server state!'); + return response + .flash( + 'warning', + `Invalid server state. Dataset with id ${id} cannot be reviewed. Datset has server state ${dataset.server_state}.`, + ) + .redirect() + .toRoute('reviewer.dataset.list'); + } + + return inertia.render('Reviewer/Dataset/Review', { + dataset, + can: { + review: await auth.user?.can(['dataset-review']), + reject: await auth.user?.can(['dataset-review-reject']), + }, + }); + } + + public async review_old({ request, inertia, response, auth }: HttpContext) { const id = request.param('id'); const dataset = await Dataset.query() .where('id', id) @@ -158,6 +211,10 @@ export default class DatasetsController { return inertia.render('Reviewer/Dataset/Review', { dataset, fields: fields, + can: { + review: await auth.user?.can(['dataset-review']), + reject: await auth.user?.can(['dataset-review-reject']), + }, }); } @@ -166,7 +223,7 @@ export default class DatasetsController { // const { id } = params; const dataset = await Dataset.findOrFail(id); - const validStates = ['approved']; + const validStates = ['approved', 'rejected_to_reviewer']; if (!validStates.includes(dataset.server_state)) { // throw new Error('Invalid server state!'); // return response.flash('warning', 'Invalid server state. Dataset cannot be released to editor').redirect().back(); @@ -180,6 +237,10 @@ export default class DatasetsController { } dataset.server_state = 'reviewed'; + // if editor has rejected to reviewer: + if (dataset.reject_editor_note != null) { + dataset.reject_editor_note = null; + } try { // await dataset.related('editor').associate(user); // speichert schon ab @@ -203,7 +264,7 @@ export default class DatasetsController { }) .firstOrFail(); - const validStates = ['approved']; + const validStates = ['approved', 'rejected_to_reviewer']; if (!validStates.includes(dataset.server_state)) { // session.flash('errors', 'Invalid server state!'); return response @@ -250,12 +311,12 @@ export default class DatasetsController { throw error; } - const validStates = ['approved']; + const validStates = ['approved', 'rejected_to_reviewer']; if (!validStates.includes(dataset.server_state)) { // throw new Error('Invalid server state!'); // return response.flash('warning', 'Invalid server state. Dataset cannot be released to editor').redirect().back(); return response - .flash( + .flash( `Invalid server state. Dataset with id ${id} cannot be rejected. Datset has server state ${dataset.server_state}.`, 'warning', ) @@ -276,7 +337,7 @@ export default class DatasetsController { validateSMTP: false, }); const validRecipientEmail: boolean = validationResult.valid; - let emailStatusMessage = ''; + // let emailStatusMessage = ''; if (sendMail == true) { if (dataset.editor.email && validRecipientEmail) { @@ -289,7 +350,7 @@ export default class DatasetsController { <p>Best regards,<br>Your Tethys reviewer: ${authUser.login}</p> `); }); - emailStatusMessage = ` A rejection email was successfully sent to ${dataset.editor.email}.`; + // emailStatusMessage = ` A rejection email was successfully sent to ${dataset.editor.email}.`; } catch (error) { logger.error(error); return response @@ -297,7 +358,7 @@ export default class DatasetsController { .toRoute('reviewer.dataset.list'); } } else { - emailStatusMessage = ` However, the email could not be sent because the editor's email address (${dataset.editor.email}) is not valid.`; + // emailStatusMessage = ` However, the email could not be sent because the editor's email address (${dataset.editor.email}) is not valid.`; } } @@ -307,4 +368,41 @@ export default class DatasetsController { .toRoute('reviewer.dataset.list') .flash(`You have rejected dataset ${dataset.id}! to editor ${dataset.editor.login}`, 'message'); } + + // public async download({ params, response }: HttpContext) { + // const id = params.id; + // // Find the file by ID + // const file = await File.findOrFail(id); + // // const filePath = await drive.use('local').getUrl('/'+ file.filePath) + // const filePath = file.filePath; + // const fileExt = file.filePath.split('.').pop() || ''; + // // Set the response headers and download the file + // response.header('Content-Type', file.mime_type || 'application/octet-stream'); + // response.attachment(`${file.label}.${fileExt}`); + // return response.download(filePath); + // } + + public async download({ params, response }: HttpContext) { + const id = params.id; + // Find the file by ID + const file = await File.findOrFail(id); + // const filePath = await drive.use('local').getUrl('/'+ file.filePath) + const filePath = file.filePath; + const fileExt = file.filePath.split('.').pop() || ''; + + // Check if label already includes the extension + const fileName = file.label.toLowerCase().endsWith(`.${fileExt.toLowerCase()}`) ? file.label : `${file.label}.${fileExt}`; + + // Set the response headers and download the file + response + .header('Cache-Control', 'no-cache private') + .header('Content-Description', 'File Transfer') + .header('Content-Type', file.mime_type || 'application/octet-stream') + // .header('Content-Disposition', 'inline; filename=' + fileName) + .header('Content-Transfer-Encoding', 'binary') + .header('Access-Control-Allow-Origin', '*') + .header('Access-Control-Allow-Methods', 'GET'); + response.attachment(fileName); + return response.download(filePath); + } } diff --git a/app/Controllers/Http/Submitter/DatasetController.ts b/app/Controllers/Http/Submitter/DatasetController.ts index 41a5733..a5b484c 100644 --- a/app/Controllers/Http/Submitter/DatasetController.ts +++ b/app/Controllers/Http/Submitter/DatasetController.ts @@ -8,14 +8,13 @@ import Description from '#models/description'; import Language from '#models/language'; import Coverage from '#models/coverage'; import Collection from '#models/collection'; +import CollectionRole from '#models/collection_role'; import dayjs from 'dayjs'; import Person from '#models/person'; import db from '@adonisjs/lucid/services/db'; import { TransactionClientContract } from '@adonisjs/lucid/types/database'; import Subject from '#models/subject'; -// import CreateDatasetValidator from '#validators/create_dataset_validator'; import { createDatasetValidator, updateDatasetValidator } from '#validators/dataset'; -// import UpdateDatasetValidator from '#validators/update_dataset_validator'; import { TitleTypes, DescriptionTypes, @@ -28,21 +27,33 @@ import { } from '#contracts/enums'; import { ModelQueryBuilderContract } from '@adonisjs/lucid/types/model'; import DatasetReference from '#models/dataset_reference'; -import { cuid } from '@adonisjs/core/helpers'; import File from '#models/file'; import ClamScan from 'clamscan'; -// import { ValidationException } from '@adonisjs/validator'; -// import Drive from '@ioc:Adonis/Core/Drive'; -import drive from '#services/drive'; +import drive from '@adonisjs/drive/services/main'; +import path from 'path'; import { Exception } from '@adonisjs/core/exceptions'; import { MultipartFile } from '@adonisjs/core/types/bodyparser'; import * as crypto from 'crypto'; +import { pipeline } from 'node:stream/promises'; +import { createWriteStream } from 'node:fs'; +import type { Multipart } from '@adonisjs/bodyparser'; +import * as fs from 'fs'; +import { parseBytesSize, getConfigFor, getTmpPath, formatBytes, errorMessage } from '#app/utils/utility-functions'; +import validation from '#services/validation_service'; +import ActivityLogger from '#services/activity_logger'; +import logger from '@adonisjs/core/services/logger'; + interface Dictionary { [index: string]: string; } import vine, { SimpleMessagesProvider, errors } from '@vinejs/vine'; export default class DatasetController { + /** + * Bodyparser config + */ + // config: BodyParserConfig = config.get('bodyparser'); + public async index({ auth, request, inertia }: HttpContext) { const user = (await User.find(auth.user?.id)) as User; const page = request.input('page', 1); @@ -66,8 +77,16 @@ export default class DatasetController { } datasets.orderBy(attribute, sortOrder); } else { - // users.orderBy('created_at', 'desc'); - datasets.orderBy('id', 'asc'); + // datasets.orderBy('id', 'asc'); + // Custom ordering to prioritize rejected_editor state + datasets.orderByRaw(` + CASE + WHEN server_state = 'rejected_editor' THEN 0 + WHEN server_state = 'rejected_reviewer' THEN 1 + ELSE 2 + END ASC, + id ASC + `); } // const results = await Database @@ -87,6 +106,7 @@ export default class DatasetController { 'reviewed', 'rejected_editor', 'rejected_reviewer', + 'rejected_to_reviewer', ]) .where('account_id', user.id) .preload('titles') @@ -188,7 +208,9 @@ export default class DatasetController { .translatedLanguage({ mainLanguageField: 'language', typeField: 'type' }), }), ) - .minLength(1), + .minLength(1) // Ensure at least the main title exists + // .minLength(2) + .arrayContainsTypes({ typeA: 'main', typeB: 'translated' }), descriptions: vine .array( vine.object({ @@ -202,7 +224,8 @@ export default class DatasetController { .translatedLanguage({ mainLanguageField: 'language', typeField: 'type' }), }), ) - .minLength(1), + // .minLength(1), + .arrayContainsTypes({ typeA: 'abstract', typeB: 'translated' }), authors: vine .array( vine.object({ @@ -213,8 +236,9 @@ export default class DatasetController { .email() .normalizeEmail() .isUniquePerson({ table: 'persons', column: 'email', idField: 'id' }), - first_name: vine.string().trim().minLength(3).maxLength(255), + first_name: vine.string().trim().minLength(3).maxLength(255).optional().requiredWhen('name_type', '=', 'Personal'), last_name: vine.string().trim().minLength(3).maxLength(255), + identifier_orcid: vine.string().trim().maxLength(255).orcid().optional(), }), ) .minLength(1) @@ -229,8 +253,9 @@ export default class DatasetController { .email() .normalizeEmail() .isUniquePerson({ table: 'persons', column: 'email', idField: 'id' }), - first_name: vine.string().trim().minLength(3).maxLength(255), + first_name: vine.string().trim().minLength(3).maxLength(255).optional().requiredWhen('name_type', '=', 'Personal'), last_name: vine.string().trim().minLength(3).maxLength(255), + identifier_orcid: vine.string().trim().maxLength(255).orcid().optional(), pivot_contributor_type: vine.enum(Object.keys(ContributorTypes)), }), ) @@ -277,7 +302,8 @@ export default class DatasetController { .translatedLanguage({ mainLanguageField: 'language', typeField: 'type' }), }), ) - .minLength(1), + // .minLength(2) + .arrayContainsTypes({ typeA: 'main', typeB: 'translated' }), descriptions: vine .array( vine.object({ @@ -291,7 +317,8 @@ export default class DatasetController { .translatedLanguage({ mainLanguageField: 'language', typeField: 'type' }), }), ) - .minLength(1), + // .minLength(1), + .arrayContainsTypes({ typeA: 'abstract', typeB: 'translated' }), authors: vine .array( vine.object({ @@ -302,8 +329,9 @@ export default class DatasetController { .email() .normalizeEmail() .isUniquePerson({ table: 'persons', column: 'email', idField: 'id' }), - first_name: vine.string().trim().minLength(3).maxLength(255), + first_name: vine.string().trim().minLength(3).maxLength(255).optional().requiredWhen('name_type', '=', 'Personal'), last_name: vine.string().trim().minLength(3).maxLength(255), + identifier_orcid: vine.string().trim().maxLength(255).orcid().optional(), }), ) .minLength(1) @@ -318,8 +346,9 @@ export default class DatasetController { .email() .normalizeEmail() .isUniquePerson({ table: 'persons', column: 'email', idField: 'id' }), - first_name: vine.string().trim().minLength(3).maxLength(255), + first_name: vine.string().trim().minLength(3).maxLength(255).optional().requiredWhen('name_type', '=', 'Personal'), last_name: vine.string().trim().minLength(3).maxLength(255), + identifier_orcid: vine.string().trim().maxLength(255).orcid().optional(), pivot_contributor_type: vine.enum(Object.keys(ContributorTypes)), }), ) @@ -363,7 +392,8 @@ export default class DatasetController { references: vine .array( vine.object({ - value: vine.string().trim().minLength(3).maxLength(255), + // value: vine.string().trim().minLength(3).maxLength(255), + value: vine.string().trim().minLength(3).maxLength(255).validateReference({ typeField: 'type' }), type: vine.enum(Object.values(ReferenceIdentifierTypes)), relation: vine.enum(Object.values(RelationTypes)), label: vine.string().trim().minLength(2).maxLength(255), @@ -398,49 +428,138 @@ export default class DatasetController { } public async store({ auth, request, response, session }: HttpContext) { - // node ace make:validator CreateDataset - try { - // Step 2 - Validate request body against the schema - // await request.validate({ schema: newDatasetSchema, messages: this.messages }); - // await request.validate(CreateDatasetValidator); - await request.validateUsing(createDatasetValidator); - // console.log({ payload }); - } catch (error) { - // Step 3 - Handle errors - // return response.badRequest(error.messages); - throw error; + const uploadedTmpFiles: string[] = []; + const multipart: Multipart = request.multipart; + + // NULL GUARD: kein multipart-Body → sauberer Validierungsfehler statt Crash + if (!multipart) { + validation.throw('files', 'Please select at least one file.', 'required'); } + // Configuration for limits + const multipartConfig = getConfigFor('multipart'); + const aggregatedLimit = multipartConfig.limit ? parseBytesSize(multipartConfig.limit) : 100 * 1024 * 1024; + + let totalUploadedSize = 0; + let filesCount = 0; // Tracker: ensure at least one file is processed + + multipart.onFile('files', { deferValidations: true }, async (part) => { + filesCount++; + let fileUploadedSize = 0; + + // Accumulate the size per chunk (cheap), defer the limit check to 'end' + part.on('data', (chunk) => { + fileUploadedSize += chunk.length; + }); + + // After the file is fully read, update the global counter and check the aggregated limit + part.on('end', () => { + totalUploadedSize += fileUploadedSize; + part.file.size = fileUploadedSize; + // Record the temporary file path + if (part.file.tmpPath) { + uploadedTmpFiles.push(part.file.tmpPath); + } + + // AGGREGATED LIMIT CHECK: abort immediately if too big + if (totalUploadedSize > aggregatedLimit) { + // Clean up all temporary files if aggregate limit is exceeded + uploadedTmpFiles.forEach((tmpPath) => { + try { + fs.unlinkSync(tmpPath); + } catch (cleanupError) { + console.error('Error cleaning up temporary file:', cleanupError); + } + }); + request.multipart.abort(validation.make('files', `Upload limit of ${formatBytes(aggregatedLimit)} exceeded.`, 'limit')); + } + }); + + // Process file with error handling + try { + // Extract extension from the client file name, e.g. "Tethys 5 - Ampflwang_dataset.zip" + const ext = path.extname(part.file.clientName).replace('.', ''); + part.file.extname = ext; + + const tmpPath = getTmpPath(multipartConfig); + (part.file as any).tmpPath = tmpPath; + + const writeStream = createWriteStream(tmpPath); + await pipeline(part, writeStream); + } catch (error) { + request.multipart.abort(validation.make('files', error.message, 'upload')); + } + }); + + try { + await multipart.process(); + + // EMPTY FIELD CHECK: triggered if process finishes but onFile never ran + if (filesCount === 0) { + validation.throw('files', 'Please select at least one file.', 'required'); + } + } catch (error) { + // If it's already a validation error, let it bubble up unchanged + if (error instanceof errors.E_VALIDATION_ERROR) throw error; + + // Wrap any other stream/size errors + validation.throw('files', errorMessage(error) || 'Upload failed.'); + } + + // Proceed to transaction and createDatasetAndAssociations let trx: TransactionClientContract | null = null; try { + await request.validateUsing(createDatasetValidator); trx = await db.transaction(); const user = (await User.find(auth.user?.id)) as User; - await this.createDatasetAndAssociations(user, request, trx); + // await this.createDatasetAndAssociations(user, request, trx); + const { dataset, mainTitle } = await this.createDatasetAndAssociations(user, request, trx); await trx.commit(); console.log('Dataset and related models created successfully'); + + // NACH dem Commit: Dataset ist garantiert persistiert, keine Waisen-Gefahr. + // Fire-and-forget, damit ein Log-Fehler den bereits erfolgreichen Upload nicht kippt. + void ActivityLogger.log({ + type: 'dataset.uploaded', + description: `New publication uploaded: ${mainTitle ?? 'Untitled'}`, + userId: user.id, + subjectType: 'Dataset', + subjectId: dataset.id, + }).catch((err) => logger.error({ err }, 'failed to record dataset.uploaded activity')); } catch (error) { + // Clean up temporary files if validation or later steps fail + uploadedTmpFiles.forEach((tmpPath) => { + try { + fs.unlinkSync(tmpPath); + } catch (cleanupError) { + console.error('Error cleaning up temporary file:', cleanupError); + } + }); if (trx !== null) { await trx.rollback(); } console.error('Failed to create dataset and related models:', error); - // throw new ValidationException(true, { 'upload error': `failed to create dataset and related models. ${error}` }); throw error; } session.flash('message', 'Dataset has been created successfully'); return response.redirect().toRoute('dataset.list'); - // return response.redirect().back(); } - - private async createDatasetAndAssociations(user: User, request: HttpContext['request'], trx: TransactionClientContract) { + private async createDatasetAndAssociations( + user: User, + request: HttpContext['request'], + trx: TransactionClientContract, + // uploadedFiles: Array<MultipartFile>, + ) { // Create a new instance of the Dataset model: const dataset = new Dataset(); dataset.type = request.input('type'); dataset.creating_corporation = request.input('creating_corporation'); dataset.language = request.input('language'); dataset.embargo_date = request.input('embargo_date'); + dataset.project_id = request.input('project_id'); //await dataset.related('user').associate(user); // speichert schon ab // Dataset.$getRelation('user').boot(); // Dataset.$getRelation('user').setRelated(dataset, user); @@ -456,6 +575,15 @@ export default class DatasetController { await this.savePersons(dataset, request.input('contributors', []), 'contributor', trx); //save main and additional titles + // const titles = request.input('titles', []); + // for (const titleData of titles) { + // const title = new Title(); + // title.value = titleData.value; + // title.language = titleData.language; + // title.type = titleData.type; + // await dataset.useTransaction(trx).related('titles').save(title); + // } + let mainTitle: string | null = null; const titles = request.input('titles', []); for (const titleData of titles) { const title = new Title(); @@ -463,6 +591,11 @@ export default class DatasetController { title.language = titleData.language; title.type = titleData.type; await dataset.useTransaction(trx).related('titles').save(title); + + if (titleData.type === 'Main') { + // <-- an eure Typ-Konvention anpassen + mainTitle = titleData.value; + } } // save descriptions @@ -498,7 +631,7 @@ export default class DatasetController { } // save collection - const collection: Collection | null = await Collection.query().where('id', 21).first(); + const collection: Collection | null = await Collection.query().where('id', 594).first(); collection && (await dataset.useTransaction(trx).related('collections').attach([collection.id])); // save coverage @@ -531,24 +664,33 @@ export default class DatasetController { const fileName = this.generateFilename(file.extname as string); const mimeType = file.headers['content-type'] || 'application/octet-stream'; // Fallback to a default MIME type const datasetFolder = `files/${dataset.id}`; + const datasetFullPath = path.join(`${datasetFolder}`, fileName); // const size = file.size; - await file.move(drive.makePath(datasetFolder), { + // await file.move(drive.makePath(datasetFolder), { + // name: fileName, + // overwrite: true, // overwrite in case of conflict + // }); + await file.moveToDisk(datasetFullPath, 'local', { name: fileName, overwrite: true, // overwrite in case of conflict + disk: 'local', }); + // save file metadata into db const newFile = new File(); newFile.pathName = `${datasetFolder}/${fileName}`; newFile.fileSize = file.size; newFile.mimeType = mimeType; newFile.label = file.clientName; - newFile.sortOrder = index; + newFile.sortOrder = index + 1; newFile.visibleInFrontdoor = true; newFile.visibleInOai = true; // let path = coverImage.filePath; await dataset.useTransaction(trx).related('files').save(newFile); await newFile.createHashValues(trx); } + + return { dataset, mainTitle }; // <-- statt void } private generateRandomString(length: number): string { @@ -693,16 +835,25 @@ export default class DatasetController { 'files.array.minLength': 'At least {{ min }} file upload is required.', 'files.*.size': 'file size is to big', 'files.*.extnames': 'file extension is not supported', + + 'embargo_date.date.afterOrEqual': `Embargo date must be on or after ${dayjs().add(10, 'day').format('DD.MM.YYYY')}`, }; // public async release({ params, view }) { - public async release({ request, inertia, response }: HttpContext) { + public async release({ request, inertia, response, auth }: HttpContext) { const id = request.param('id'); + const user = auth.user; + + // Check if user is authenticated + if (!user) { + return response.flash('You must be logged in to edit a dataset.', 'error').redirect().toRoute('app.login.show'); + } const dataset = await Dataset.query() .preload('user', (builder) => { builder.select('id', 'login'); }) + .where('account_id', user.id) // Only fetch if user owns it .where('id', id) .firstOrFail(); @@ -723,9 +874,20 @@ export default class DatasetController { }); } - public async releaseUpdate({ request, response }: HttpContext) { + public async releaseUpdate({ request, response, auth }: HttpContext) { const id = request.param('id'); - const dataset = await Dataset.query().preload('files').where('id', id).firstOrFail(); + const user = auth.user; + + // Check if user is authenticated + if (!user) { + return response.flash('You must be logged in to edit a dataset.', 'error').redirect().toRoute('app.login.show'); + } + + const dataset = await Dataset.query() + .preload('files') + .where('id', id) + .where('account_id', user.id) // Only fetch if user owns it + .firstOrFail(); const validStates = ['inprogress', 'rejected_editor']; if (!validStates.includes(dataset.server_state)) { @@ -803,16 +965,24 @@ export default class DatasetController { // throw new GeneralException(trans('exceptions.publish.release.update_error')); } - public async edit({ request, inertia, response }: HttpContext) { + public async edit({ request, inertia, response, auth }: HttpContext) { const id = request.param('id'); - const datasetQuery = Dataset.query().where('id', id); + const user = auth.user; + + // Check if user is authenticated + if (!user) { + return response.flash('You must be logged in to edit a dataset.', 'error').redirect().toRoute('app.login.show'); + } + + // Prefilter by both id AND account_id + const datasetQuery = Dataset.query().where('id', id).where('account_id', user.id); // Only fetch if user owns it datasetQuery .preload('titles', (query) => query.orderBy('id', 'asc')) .preload('descriptions', (query) => query.orderBy('id', 'asc')) .preload('coverage') .preload('licenses') - .preload('authors') - .preload('contributors') + .preload('authors', (query) => query.orderBy('pivot_sort_order', 'asc')) + .preload('contributors', (query) => query.orderBy('pivot_sort_order', 'asc')) // .preload('subjects') .preload('subjects', (builder) => { builder.orderBy('id', 'asc').withCount('datasets'); @@ -821,17 +991,17 @@ export default class DatasetController { .preload('files', (query) => { query.orderBy('sort_order', 'asc'); // Sort by sort_order column }); - + // This will throw 404 if dataset doesn't exist OR user doesn't own it const dataset = await datasetQuery.firstOrFail(); + const validStates = ['inprogress', 'rejected_editor']; if (!validStates.includes(dataset.server_state)) { // session.flash('errors', 'Invalid server state!'); return response .flash( - 'warning', `Invalid server state. Dataset with id ${id} cannot be edited. Datset has server state ${dataset.server_state}.`, + 'warning', ) - .redirect() .toRoute('dataset.list'); } @@ -861,19 +1031,6 @@ export default class DatasetController { const years = Array.from({ length: currentYear - 1990 + 1 }, (_, index) => 1990 + index); const licenses = await License.query().select('id', 'name_long').where('active', 'true').pluck('name_long', 'id'); - // const userHasRoles = user.roles; - // const datasetHasLicenses = await dataset.related('licenses').query().pluck('id'); - // const checkeds = dataset.licenses.first().id; - - const doctypes = { - analysisdata: { label: 'Analysis', value: 'analysisdata' }, - measurementdata: { label: 'Measurements', value: 'measurementdata' }, - monitoring: 'Monitoring', - remotesensing: 'Remote Sensing', - gis: 'GIS', - models: 'Models', - mixedtype: 'Mixed Type', - }; return inertia.render('Submitter/Dataset/Edit', { dataset, @@ -892,25 +1049,114 @@ export default class DatasetController { subjectTypes: SubjectTypes, referenceIdentifierTypes: Object.entries(ReferenceIdentifierTypes).map(([key, value]) => ({ value: key, label: value })), relationTypes: Object.entries(RelationTypes).map(([key, value]) => ({ value: key, label: value })), - doctypes, + doctypes: DatasetTypes, + can: { + edit: await auth.user?.can(['dataset-edit']), + delete: await auth.user?.can(['dataset-delete']), + }, }); } - public async update({ request, response, session }: HttpContext) { - try { - // await request.validate(UpdateDatasetValidator); - await request.validateUsing(updateDatasetValidator); - } catch (error) { - // - Handle errors - // return response.badRequest(error.messages); - throw error; - // return response.badRequest(error.messages); - } - // await request.validate(UpdateDatasetValidator); - const id = request.param('id'); + public async update({ request, response, session, auth }: HttpContext) { + // Get the dataset id from the route parameter + const datasetId = request.param('id'); + const user = auth.user; + // Check if user is authenticated + if (!user) { + return response.flash('You must be logged in to update a dataset.', 'error').redirect().toRoute('app.login.show'); + } + + // Prefilter by both id AND account_id + const dataset = await Dataset.query() + .where('id', datasetId) + .where('account_id', user.id) // Only fetch if user owns it + .firstOrFail(); + + // // Check if the authenticated user is the owner of the dataset + // if (dataset.account_id !== user.id) { + // return response + // .flash(`Unauthorized access. You are not the owner of dataset with id ${id}.`, 'error') + // .redirect() + // .toRoute('dataset.list'); + // } + + await dataset.load('files'); + // Accumulate the size of the already related files + // const preExistingFileSize = dataset.files.reduce((acc, file) => acc + file.fileSize, 0); + let preExistingFileSize = 0; + for (const file of dataset.files) { + preExistingFileSize += Number(file.fileSize); + } + + const uploadedTmpFiles: string[] = []; + // Only process multipart if the request has a multipart content type + const contentType = request.request.headers['content-type'] || ''; + if (contentType.includes('multipart/form-data')) { + const multipart: Multipart = request.multipart; + // Aggregated limit example (adjust as needed) + const multipartConfig = getConfigFor('multipart'); + const aggregatedLimit = multipartConfig.limit ? parseBytesSize(multipartConfig.limit) : 100 * 1024 * 1024; + // Initialize totalUploadedSize with the size of existing files + let totalUploadedSize = preExistingFileSize; + + multipart.onFile('files', { deferValidations: true }, async (part) => { + let fileUploadedSize = 0; + + part.on('data', (chunk) => { + fileUploadedSize += chunk.length; + }); + + part.on('end', () => { + totalUploadedSize += fileUploadedSize; + part.file.size = fileUploadedSize; + if (part.file.tmpPath) { + uploadedTmpFiles.push(part.file.tmpPath); + } + if (totalUploadedSize > aggregatedLimit) { + uploadedTmpFiles.forEach((tmpPath) => { + try { + fs.unlinkSync(tmpPath); + } catch (cleanupError) { + console.error('Error cleaning up temporary file:', cleanupError); + } + }); + const error = new errors.E_VALIDATION_ERROR({ + files: `Aggregated upload limit of ${formatBytes(aggregatedLimit)} exceeded. The total size of files being uploaded would exceed the limit.`, + }); + request.multipart.abort(error); + } + }); + + part.on('error', (error) => { + request.multipart.abort(error); + }); + + try { + const fileNameWithoutParams = part.file.clientName.split('?')[0]; + const ext = path.extname(fileNameWithoutParams).replace('.', ''); + part.file.extname = ext; + const tmpPath = getTmpPath(multipartConfig); + (part.file as any).tmpPath = tmpPath; + const writeStream = createWriteStream(tmpPath); + await pipeline(part, writeStream); + } catch (error) { + request.multipart.abort(new errors.E_VALIDATION_ERROR({ 'upload error': error.message })); + } + }); + + try { + await multipart.process(); + } catch (error) { + // session.flash('errors', error.messages); + return response.redirect().back(); + } + } + + const id = request.param('id'); let trx: TransactionClientContract | null = null; try { + await request.validateUsing(updateDatasetValidator); trx = await db.transaction(); // const user = (await User.find(auth.user?.id)) as User; // await this.createDatasetAndAssociations(user, request, trx); @@ -971,22 +1217,148 @@ export default class DatasetController { } } - // await dataset.useTransaction(trx).related('subjects').sync([]); - const keywords = request.input('subjects'); - for (const keywordData of keywords) { - if (keywordData.id) { - const subject = await Subject.findOrFail(keywordData.id); - // await dataset.useTransaction(trx).related('subjects').attach([keywordData.id]); - subject.value = keywordData.value; - subject.type = keywordData.type; - subject.external_key = keywordData.external_key; - if (subject.$isDirty) { - await subject.save(); + // ============================================ + // IMPROVED SUBJECTS PROCESSING + // ============================================ + const subjects = request.input('subjects', []); + const currentDatasetSubjectIds = new Set<number>(); + + for (const subjectData of subjects) { + let subjectToRelate: Subject; + + // Case 1: Subject has an ID (existing subject being updated) + if (subjectData.id) { + const existingSubject = await Subject.findOrFail(subjectData.id); + + // Check if the updated value conflicts with another existing subject + const duplicateSubject = await Subject.query() + .where('value', subjectData.value) + .where('type', subjectData.type) + .where('language', subjectData.language || 'en') // Default language if not provided + .where('id', '!=', subjectData.id) // Exclude the current subject + .first(); + + if (duplicateSubject) { + // A duplicate exists - use the existing duplicate instead + subjectToRelate = duplicateSubject; + + // Check if the original subject should be deleted (if it's only used by this dataset) + const originalSubjectUsage = await Subject.query() + .where('id', existingSubject.id) + .withCount('datasets') + .firstOrFail(); + + if (originalSubjectUsage.$extras.datasets_count <= 1) { + // Only used by this dataset, safe to delete after detaching + await dataset.useTransaction(trx).related('subjects').detach([existingSubject.id]); + await existingSubject.useTransaction(trx).delete(); + } else { + // Used by other datasets, just detach from this one + await dataset.useTransaction(trx).related('subjects').detach([existingSubject.id]); + } + } else { + // No duplicate found, update the existing subject + existingSubject.value = subjectData.value; + existingSubject.type = subjectData.type; + existingSubject.language = subjectData.language; + existingSubject.external_key = subjectData.external_key; + + if (existingSubject.$isDirty) { + await existingSubject.useTransaction(trx).save(); + } + + subjectToRelate = existingSubject; + } + } + // Case 2: New subject being added (no ID) + else { + // Use firstOrNew to either find existing or create new subject + subjectToRelate = await Subject.firstOrNew( + { + value: subjectData.value, + type: subjectData.type, + language: subjectData.language || 'en', + }, + { + value: subjectData.value, + type: subjectData.type, + language: subjectData.language || 'en', + external_key: subjectData.external_key, + }, + ); + + if (subjectToRelate.$isNew) { + await subjectToRelate.useTransaction(trx).save(); + } + } + + // Ensure the relationship exists between dataset and subject + const relationshipExists = await dataset.related('subjects').query().where('subject_id', subjectToRelate.id).first(); + + if (!relationshipExists) { + await dataset.useTransaction(trx).related('subjects').attach([subjectToRelate.id]); + } + + // Track which subjects should remain associated with this dataset + currentDatasetSubjectIds.add(subjectToRelate.id); + } + + // Handle explicit deletions + const subjectsToDelete = request.input('subjectsToDelete', []); + for (const subjectData of subjectsToDelete) { + if (subjectData.id) { + // const subject = await Subject.findOrFail(subjectData.id); + const subject = await Subject.query() + .where('id', subjectData.id) + .preload('datasets', (builder) => { + builder.orderBy('id', 'asc'); + }) + .withCount('datasets') + .firstOrFail(); + + // Detach the subject from this dataset + await dataset.useTransaction(trx).related('subjects').detach([subject.id]); + + // If this was the only dataset using this subject, delete it entirely + if (subject.$extras.datasets_count <= 1) { + await subject.useTransaction(trx).delete(); + } + + // Remove from current set if it was added earlier + currentDatasetSubjectIds.delete(subjectData.id); + } + } + + // Process references + const references = request.input('references', []); + // First, get existing references to determine which ones to update vs. create + const existingReferences = await dataset.related('references').query(); + const existingReferencesMap: Map<number, DatasetReference> = new Map(existingReferences.map((ref) => [ref.id, ref])); + + for (const referenceData of references) { + if (existingReferencesMap.has(referenceData.id) && referenceData.id) { + // Update existing reference + const reference = existingReferencesMap.get(referenceData.id); + if (reference) { + reference.merge(referenceData); + if (reference.$isDirty) { + await reference.useTransaction(trx).save(); + } } } else { - const keyword = new Subject(); - keyword.fill(keywordData); - await dataset.useTransaction(trx).related('subjects').save(keyword, false); + // Create new reference + const dataReference = new DatasetReference(); + dataReference.fill(referenceData); + await dataset.useTransaction(trx).related('references').save(dataReference); + } + } + + // Handle references to delete if provided + const referencesToDelete = request.input('referencesToDelete', []); + for (const referenceData of referencesToDelete) { + if (referenceData.id) { + const reference = await DatasetReference.findOrFail(referenceData.id); + await reference.useTransaction(trx).delete(); } } @@ -1018,9 +1390,9 @@ export default class DatasetController { // handle new uploaded files: const uploadedFiles: MultipartFile[] = request.files('files'); if (Array.isArray(uploadedFiles) && uploadedFiles.length > 0) { - for (const [index, fileData] of uploadedFiles.entries()) { + for (const [index, file] of uploadedFiles.entries()) { try { - await this.scanFileForViruses(fileData.tmpPath); //, 'gitea.lan', 3310); + await this.scanFileForViruses(file.tmpPath); //, 'gitea.lan', 3310); // await this.scanFileForViruses("/tmp/testfile.txt"); } catch (error) { // If the file is infected or there's an error scanning the file, throw a validation exception @@ -1028,23 +1400,29 @@ export default class DatasetController { } // move to disk: - const fileName = `file-${cuid()}.${fileData.extname}`; //'file-ls0jyb8xbzqtrclufu2z2e0c.pdf' + const fileName = this.generateFilename(file.extname as string); const datasetFolder = `files/${dataset.id}`; // 'files/307' - // await fileData.moveToDisk(datasetFolder, { name: fileName, overwrite: true }, 'local'); - await fileData.move(drive.makePath(datasetFolder), { + const datasetFullPath = path.join(`${datasetFolder}`, fileName); + // await file.moveToDisk(datasetFolder, { name: fileName, overwrite: true }, 'local'); + // await file.move(drive.makePath(datasetFolder), { + // name: fileName, + // overwrite: true, // overwrite in case of conflict + // }); + await file.moveToDisk(datasetFullPath, 'local', { name: fileName, overwrite: true, // overwrite in case of conflict + disk: 'local', }); //save to db: - const { clientFileName, sortOrder } = this.extractVariableNameAndSortOrder(fileData.clientName); - const mimeType = fileData.headers['content-type'] || 'application/octet-stream'; // Fallback to a default MIME type + const { clientFileName, sortOrder } = this.extractVariableNameAndSortOrder(file.clientName); + const mimeType = file.headers['content-type'] || 'application/octet-stream'; // Fallback to a default MIME type const newFile = await dataset .useTransaction(trx) .related('files') .create({ pathName: `${datasetFolder}/${fileName}`, - fileSize: fileData.size, + fileSize: file.size, mimeType, label: clientFileName, sortOrder: sortOrder || index, @@ -1084,16 +1462,24 @@ export default class DatasetController { await dataset.useTransaction(trx).save(); await trx.commit(); - console.log('Dataset and related models created successfully'); + console.log('Dataset has been updated successfully'); session.flash('message', 'Dataset has been updated successfully'); // return response.redirect().toRoute('user.index'); return response.redirect().toRoute('dataset.edit', [dataset.id]); } catch (error) { + // Clean up temporary files if validation or later steps fail + uploadedTmpFiles.forEach((tmpPath) => { + try { + fs.unlinkSync(tmpPath); + } catch (cleanupError) { + console.error('Error cleaning up temporary file:', cleanupError); + } + }); if (trx !== null) { await trx.rollback(); } - console.error('Failed to create dataset and related models:', error); + console.error('Failed to update dataset and related models:', error); // throw new ValidationException(true, { 'upload error': `failed to create dataset and related models. ${error}` }); throw error; } @@ -1118,16 +1504,26 @@ export default class DatasetController { } } - public async delete({ request, inertia, response, session }: HttpContext) { + public async delete({ request, inertia, response, session, auth }: HttpContext) { const id = request.param('id'); + const user = auth.user; + + // Check if user is authenticated + if (!user) { + return response.flash('You must be logged in to edit a dataset.', 'error').redirect().toRoute('app.login.show'); + } + try { + // This will throw 404 if dataset doesn't exist OR user doesn't own it const dataset = await Dataset.query() .preload('user', (builder) => { builder.select('id', 'login'); }) .where('id', id) + .where('account_id', user.id) // Only fetch if user owns it .preload('files') .firstOrFail(); + const validStates = ['inprogress', 'rejected_editor']; if (!validStates.includes(dataset.server_state)) { // session.flash('errors', 'Invalid server state!'); @@ -1152,39 +1548,58 @@ export default class DatasetController { } } - public async deleteUpdate({ params, session, response }: HttpContext) { + public async deleteUpdate({ params, session, response, auth }: HttpContext) { try { - const dataset = await Dataset.query().where('id', params.id).preload('files').firstOrFail(); + const user = auth.user; + if (!user) { + return response.flash('You must be logged in to edit a dataset.', 'error').redirect().toRoute('app.login.show'); + } + + // This will throw 404 if dataset doesn't exist OR user doesn't own it + const dataset = await Dataset.query() + .where('id', params.id) + .where('account_id', user.id) // Only fetch if user owns it + .preload('files') + .firstOrFail(); + + // // Check if the authenticated user is the owner of the dataset + // if (dataset.account_id !== user.id) { + // return response + // .flash(`Unauthorized access. You are not the owner of dataset with id ${params.id}.`, 'error') + // .redirect() + // .toRoute('dataset.list'); + // } const validStates = ['inprogress', 'rejected_editor']; if (validStates.includes(dataset.server_state)) { if (dataset.files && dataset.files.length > 0) { for (const file of dataset.files) { - // overwritten delete method also delets file on filespace + // overwritten delete method also delets file on filespace and db object await file.delete(); } } const datasetFolder = `files/${params.id}`; - const folderExists = await drive.exists(datasetFolder); - if (folderExists) { - const dirListing = drive.list(datasetFolder); - const folderContents = await dirListing.toArray(); - if (folderContents.length === 0) { - await drive.delete(datasetFolder); - } - // delete dataset wirh relation in db - await dataset.delete(); - session.flash({ message: 'You have deleted 1 dataset!' }); - return response.redirect().toRoute('dataset.list'); - } else { - // session.flash({ - // warning: `You cannot delete this dataset! Invalid server_state: "${dataset.server_state}"!`, - // }); - return response - .flash({ warning: `You cannot delete this dataset! Dataset folder "${datasetFolder}" doesn't exist!` }) - .redirect() - .back(); - } + // const folderExists = await drive.use('local').exists(datasetFolder); + // if (folderExists) { + // const dirListing = drive.list(datasetFolder); + // const folderContents = await dirListing.toArray(); + // if (folderContents.length === 0) { + // await drive.delete(datasetFolder); + // } + await drive.use('local').deleteAll(datasetFolder); + // delete dataset wirh relation in db + await dataset.delete(); + session.flash({ message: 'You have deleted 1 dataset!' }); + return response.redirect().toRoute('dataset.list'); + // } else { + // // session.flash({ + // // warning: `You cannot delete this dataset! Invalid server_state: "${dataset.server_state}"!`, + // // }); + // return response + // .flash({ warning: `You cannot delete this dataset! Dataset folder "${datasetFolder}" doesn't exist!` }) + // .redirect() + // .back(); + // } } } catch (error) { if (error instanceof errors.E_VALIDATION_ERROR) { @@ -1192,11 +1607,90 @@ export default class DatasetController { throw error; } else if (error instanceof Exception) { // General exception handling - return response.flash('errors', { error: error.message }).redirect().back(); + session.flash({ error: error.message }); + return response.redirect().back(); } else { session.flash({ error: 'An error occurred while deleting the dataset.' }); return response.redirect().back(); } } } + + public async categorize({ inertia, request, response }: HttpContext) { + const id = request.param('id'); + // Preload dataset and its "collections" relation + const dataset = await Dataset.query().where('id', id).preload('collections').firstOrFail(); + const validStates = ['inprogress', 'rejected_editor']; + if (!validStates.includes(dataset.server_state)) { + // session.flash('errors', 'Invalid server state!'); + return response + .flash( + 'warning', + `Invalid server state. Dataset with id ${id} cannot be edited. Datset has server state ${dataset.server_state}.`, + ) + .redirect() + .toRoute('dataset.list'); + } + + const collectionRoles = await CollectionRole.query() + .whereIn('name', ['ddc', 'ccs']) + .preload('collections', (coll: Collection) => { + // preloa only top level collection with noparent_id + coll.whereNull('parent_id').orderBy('number', 'asc'); + }) + .exec(); + + return inertia.render('Submitter/Dataset/Category', { + collectionRoles: collectionRoles, + dataset: dataset, + relatedCollections: dataset.collections, + }); + } + + public async categorizeUpdate({ request, response, session }: HttpContext) { + // Get the dataset id from the route parameter + const id = request.param('id'); + const dataset = await Dataset.query().preload('files').where('id', id).firstOrFail(); + + const validStates = ['inprogress', 'rejected_editor']; + if (!validStates.includes(dataset.server_state)) { + return response + .flash( + 'warning', + `Invalid server state. Dataset with id ${id} cannot be categorized. Dataset has server state ${dataset.server_state}.`, + ) + .redirect() + .toRoute('dataset.list'); + } + + let trx: TransactionClientContract | null = null; + try { + trx = await db.transaction(); + // const user = (await User.find(auth.user?.id)) as User; + // await this.createDatasetAndAssociations(user, request, trx); + + // Retrieve the selected collections from the request. + // This should be an array of collection ids. + const collections: number[] = request.input('collections', []); + + // Synchronize the dataset collections using the transaction. + await dataset.useTransaction(trx).related('collections').sync(collections); + + // Commit the transaction.await trx.commit() + await trx.commit(); + + // Redirect with a success flash message. + // return response.flash('success', 'Dataset collections updated successfully!').redirect().toRoute('dataset.list'); + + session.flash('message', 'Dataset collections updated successfully!'); + return response.redirect().toRoute('dataset.list'); + } catch (error) { + if (trx !== null) { + await trx.rollback(); + } + console.error('Failed tocatgorize dataset collections:', error); + // throw new ValidationException(true, { 'upload error': `failed to create dataset and related models. ${error}` }); + throw error; + } + } } diff --git a/app/Library/DatasetXmlSerializer.ts b/app/Library/DatasetXmlSerializer.ts new file mode 100644 index 0000000..f84d3b7 --- /dev/null +++ b/app/Library/DatasetXmlSerializer.ts @@ -0,0 +1,231 @@ +import DocumentXmlCache from '#models/DocumentXmlCache'; +import { XMLBuilder } from 'xmlbuilder2/lib/interfaces.js'; +import Dataset from '#models/dataset'; +import Strategy from './Strategy.js'; +import { builder } from 'xmlbuilder2'; +import logger from '@adonisjs/core/services/logger'; + +/** + * Configuration for XML serialization + * + * @interface XmlSerializationConfig + */ +export interface XmlSerializationConfig { + /** The dataset model to serialize */ + model: Dataset; + /** DOM representation (if available) */ + dom?: XMLBuilder; + /** Fields to exclude from serialization */ + excludeFields: Array<string>; + /** Whether to exclude empty fields */ + excludeEmpty: boolean; + /** Base URI for xlink:ref elements */ + baseUri: string; +} + +/** + * Options for controlling serialization behavior + */ +export interface SerializationOptions { + /** Enable XML caching */ + enableCaching?: boolean; + /** Exclude empty fields from output */ + excludeEmptyFields?: boolean; + /** Custom base URI */ + baseUri?: string; + /** Fields to exclude */ + excludeFields?: string[]; +} + +/** + * DatasetXmlSerializer + * + * Handles XML serialization of Dataset models with intelligent caching. + * Generates XML representations and manages cache lifecycle to optimize performance. + * + * @example + * ```typescript + * const serializer = new DatasetXmlSerializer(dataset); + * serializer.enableCaching(); + * serializer.excludeEmptyFields(); + * + * const xmlDocument = await serializer.toXmlDocument(); + * ``` + */ +export default class DatasetXmlSerializer { + private readonly config: XmlSerializationConfig; + private readonly strategy: Strategy; + private cache: DocumentXmlCache | null = null; + private cachingEnabled = false; + + constructor(dataset: Dataset, options: SerializationOptions = {}) { + this.config = { + model: dataset, + excludeEmpty: options.excludeEmptyFields ?? false, + baseUri: options.baseUri ?? '', + excludeFields: options.excludeFields ?? [], + }; + + this.strategy = new Strategy({ + excludeEmpty: options.excludeEmptyFields ?? false, + baseUri: options.baseUri ?? '', + excludeFields: options.excludeFields ?? [], + model: dataset, + }); + + if (options.enableCaching) { + this.cachingEnabled = true; + } + } + + /** + * Enable caching for XML generation + * When enabled, generated XML is stored in database for faster retrieval + */ + public enableCaching(): this { + this.cachingEnabled = true; + return this; + } + + /** + * Disable caching for XML generation + */ + public disableCaching(): this { + this.cachingEnabled = false; + return this; + } + + set model(model: Dataset) { + this.config.model = model; + } + + /** + * Configure to exclude empty fields from XML output + */ + public excludeEmptyFields(): this { + this.config.excludeEmpty = true; + return this; + } + + /** + * Set the cache instance directly (useful when preloading) + * @param cache - The DocumentXmlCache instance + */ + public setCache(cache: DocumentXmlCache): this { + this.cache = cache; + return this; + } + + /** + * Get the current cache instance + */ + public getCache(): DocumentXmlCache | null { + return this.cache; + } + + /** + * Get DOM document with intelligent caching + * Returns cached version if valid, otherwise generates new document + */ + public async toXmlDocument(): Promise<XMLBuilder | null> { + const dataset = this.config.model; + + // Try to get from cache first + let cachedDocument: XMLBuilder | null = await this.retrieveFromCache(); + + if (cachedDocument) { + logger.debug(`Using cached XML for dataset ${dataset.id}`); + return cachedDocument; + } + + // Generate fresh document + logger.debug(`[DatasetXmlSerializer] Cache miss - generating fresh XML for dataset ${dataset.id}`); + const freshDocument = await this.strategy.createDomDocument(); + + if (!freshDocument) { + logger.error(`[DatasetXmlSerializer] Failed to generate XML for dataset ${dataset.id}`); + return null; + } + + // Cache if caching is enabled + if (this.cachingEnabled) { + await this.persistToCache(freshDocument, dataset); + } + + // Extract the dataset-specific node + return this.extractDatasetNode(freshDocument); + } + + /** + * Generate XML string representation + * Convenience method that converts XMLBuilder to string + */ + public async toXmlString(): Promise<string | null> { + const document = await this.toXmlDocument(); + return document ? document.end({ prettyPrint: false }) : null; + } + + /** + * Persist generated XML document to cache + * Non-blocking - failures are logged but don't interrupt the flow + */ + private async persistToCache(domDocument: XMLBuilder, dataset: Dataset): Promise<void> { + try { + this.cache = this.cache || new DocumentXmlCache(); + this.cache.document_id = dataset.id; + this.cache.xml_version = 1; + this.cache.server_date_modified = dataset.server_date_modified.toFormat('yyyy-MM-dd HH:mm:ss'); + this.cache.xml_data = domDocument.end(); + + await this.cache.save(); + logger.debug(`Cached XML for dataset ${dataset.id}`); + } catch (error) { + logger.error(`Failed to cache XML for dataset ${dataset.id}: ${error.message}`); + // Don't throw - caching failure shouldn't break the flow + } + } + + /** + * Extract the Rdr_Dataset node from full document + */ + private extractDatasetNode(domDocument: XMLBuilder): XMLBuilder | null { + const node = domDocument.find((n) => n.node.nodeName === 'Rdr_Dataset', false, true)?.node; + + if (node) { + return builder({ version: '1.0', encoding: 'UTF-8', standalone: true }, node); + } + + return domDocument; + } + + /** + * Attempt to retrieve valid cached XML document + * Returns null if cache doesn't exist or is stale + */ + private async retrieveFromCache(): Promise<XMLBuilder | null> { + const dataset: Dataset = this.config.model; + if (!this.cache) { + return null; + } + + // Check if cache is still valid + const actuallyCached = await DocumentXmlCache.hasValidEntry(dataset.id, dataset.server_date_modified); + + if (!actuallyCached) { + logger.debug(`Cache invalid for dataset ${dataset.id}`); + return null; + } + + //cache is actual return cached document + try { + if (this.cache) { + return this.cache.getDomDocument(); + } else { + return null; + } + } catch (error) { + logger.error(`Failed to retrieve cached document for dataset ${dataset.id}: ${error.message}`); + return null; + } + } +} diff --git a/app/Library/Doi/DoiClient.ts b/app/Library/Doi/DoiClient.ts index 5b56280..4232ac4 100644 --- a/app/Library/Doi/DoiClient.ts +++ b/app/Library/Doi/DoiClient.ts @@ -1,25 +1,22 @@ -// import { Client } from 'guzzle'; -// import { Log } from '@adonisjs/core/build/standalone'; -// import { DoiInterface } from './interfaces/DoiInterface'; import DoiClientContract from '#app/Library/Doi/DoiClientContract'; import DoiClientException from '#app/exceptions/DoiClientException'; import { StatusCodes } from 'http-status-codes'; import logger from '@adonisjs/core/services/logger'; import { AxiosResponse } from 'axios'; -import axios from 'axios'; +import { default as axios } from 'axios'; export class DoiClient implements DoiClientContract { public username: string; public password: string; public serviceUrl: string; + public apiUrl: string; constructor() { // const datacite_environment = process.env.DATACITE_ENVIRONMENT || 'debug'; this.username = process.env.DATACITE_USERNAME || ''; this.password = process.env.DATACITE_PASSWORD || ''; this.serviceUrl = process.env.DATACITE_SERVICE_URL || ''; - // this.prefix = process.env.DATACITE_PREFIX || ''; - // this.base_domain = process.env.BASE_DOMAIN || ''; + this.apiUrl = process.env.DATACITE_API_URL || 'https://api.datacite.org'; if (this.username === '' || this.password === '' || this.serviceUrl === '') { const message = 'issing configuration settings to properly initialize DOI client'; @@ -50,7 +47,7 @@ export class DoiClient implements DoiClientContract { 'Content-Type': 'application/xml;charset=UTF-8', }; try { - const metadataResponse = await axios.default.put(`${this.serviceUrl}/metadata/${doiValue}`, xmlMeta, { auth, headers }); + const metadataResponse = await axios.put(`${this.serviceUrl}/metadata/${doiValue}`, xmlMeta, { auth, headers }); // Response Codes // 201 Created: operation successful @@ -65,7 +62,7 @@ export class DoiClient implements DoiClientContract { throw new DoiClientException(metadataResponse.status, message); } - const doiResponse = await axios.default.put(`${this.serviceUrl}/doi/${doiValue}`, `doi=${doiValue}\nurl=${landingPageUrl}`, { + const doiResponse = await axios.put(`${this.serviceUrl}/doi/${doiValue}`, `doi=${doiValue}\nurl=${landingPageUrl}`, { auth, headers, }); @@ -90,4 +87,240 @@ export class DoiClient implements DoiClientContract { throw new DoiClientException(error.response.status, error.response.data); } } + + /** + * Retrieves DOI information from DataCite REST API + * + * @param doiValue The DOI identifier e.g. '10.5072/tethys.999' + * @returns Promise with DOI information or null if not found + */ + public async getDoiInfo(doiValue: string): Promise<any | null> { + try { + // Use configurable DataCite REST API URL + const dataciteApiUrl = `${this.apiUrl}/dois/${doiValue}`; + const response = await axios.get(dataciteApiUrl, { + headers: { + Accept: 'application/vnd.api+json', + }, + }); + + if (response.status === 200 && response.data.data) { + return { + created: response.data.data.attributes.created, + registered: response.data.data.attributes.registered, + updated: response.data.data.attributes.updated, + published: response.data.data.attributes.published, + state: response.data.data.attributes.state, + url: response.data.data.attributes.url, + metadata: response.data.data.attributes, + }; + } + } catch (error) { + if (error.response?.status === 404) { + logger.debug(`DOI ${doiValue} not found in DataCite`); + return null; + } + + logger.debug(`DataCite REST API failed for ${doiValue}: ${error.message}`); + + // Fallback to MDS API + return await this.getDoiInfoFromMds(doiValue); + } + + return null; + } + + /** + * Fallback method to get DOI info from MDS API + * + * @param doiValue The DOI identifier + * @returns Promise with basic DOI information or null + */ + private async getDoiInfoFromMds(doiValue: string): Promise<any | null> { + try { + const auth = { + username: this.username, + password: this.password, + }; + + // Get DOI URL + const doiResponse = await axios.get(`${this.serviceUrl}/doi/${doiValue}`, { auth }); + + if (doiResponse.status === 200) { + // Get metadata if available + try { + const metadataResponse = await axios.get(`${this.serviceUrl}/metadata/${doiValue}`, { + auth, + headers: { + Accept: 'application/xml', + }, + }); + + return { + url: doiResponse.data.trim(), + metadata: metadataResponse.data, + created: new Date().toISOString(), // MDS doesn't provide creation dates + registered: new Date().toISOString(), // Use current time as fallback + source: 'mds', + }; + } catch (metadataError) { + // Return basic info even if metadata fetch fails + return { + url: doiResponse.data.trim(), + created: new Date().toISOString(), + registered: new Date().toISOString(), + source: 'mds', + }; + } + } + } catch (error) { + if (error.response?.status === 404) { + logger.debug(`DOI ${doiValue} not found in DataCite MDS`); + return null; + } + + logger.debug(`DataCite MDS API failed for ${doiValue}: ${error.message}`); + } + + return null; + } + + /** + * Checks if a DOI exists in DataCite + * + * @param doiValue The DOI identifier + * @returns Promise<boolean> True if DOI exists + */ + public async doiExists(doiValue: string): Promise<boolean> { + const doiInfo = await this.getDoiInfo(doiValue); + return doiInfo !== null; + } + + /** + * Gets the last modification date of a DOI + * + * @param doiValue The DOI identifier + * @returns Promise<Date | null> Last modification date or creation date if never updated, null if not found + */ + public async getDoiLastModified(doiValue: string): Promise<Date | null> { + const doiInfo = await this.getDoiInfo(doiValue); + + if (doiInfo) { + // Use updated date if available, otherwise fall back to created/registered date + const dateToUse = doiInfo.updated || doiInfo.registered || doiInfo.created; + + if (dateToUse) { + logger.debug( + `DOI ${doiValue}: Using ${doiInfo.updated ? 'updated' : doiInfo.registered ? 'registered' : 'created'} date: ${dateToUse}`, + ); + return new Date(dateToUse); + } + } + + return null; + } + + /** + * Makes a DOI unfindable (registered but not discoverable) + * Note: DOIs cannot be deleted, only made unfindable + * await doiClient.makeDoiUnfindable('10.21388/tethys.231'); + * + * @param doiValue The DOI identifier e.g. '10.5072/tethys.999' + * @returns Promise<AxiosResponse<any>> The http response + */ + public async makeDoiUnfindable(doiValue: string): Promise<AxiosResponse<any>> { + const auth = { + username: this.username, + password: this.password, + }; + + try { + // First, check if DOI exists + const exists = await this.doiExists(doiValue); + if (!exists) { + throw new DoiClientException(404, `DOI ${doiValue} not found`); + } + + // Delete the DOI URL mapping to make it unfindable + // This removes the URL but keeps the metadata registered + const response = await axios.delete(`${this.serviceUrl}/doi/${doiValue}`, { auth }); + + // Response Codes for DELETE /doi/{doi} + // 200 OK: operation successful + // 401 Unauthorized: no login + // 403 Forbidden: login problem, quota exceeded + // 404 Not Found: DOI does not exist + if (response.status !== 200) { + const message = `Unexpected DataCite MDS response code ${response.status}`; + logger.error(message); + throw new DoiClientException(response.status, message); + } + + logger.info(`DOI ${doiValue} successfully made unfindable`); + return response; + } catch (error) { + logger.error(`Failed to make DOI ${doiValue} unfindable: ${error.message}`); + if (error instanceof DoiClientException) { + throw error; + } + throw new DoiClientException(error.response?.status || 500, error.response?.data || error.message); + } + } + + /** + * Makes a DOI findable again by re-registering the URL + * await doiClient.makeDoiFindable( + * '10.21388/tethys.231', + * 'https://doi.dev.tethys.at/10.21388/tethys.231' + * ); + * + * @param doiValue The DOI identifier e.g. '10.5072/tethys.999' + * @param landingPageUrl The landing page URL + * @returns Promise<AxiosResponse<any>> The http response + */ + public async makeDoiFindable(doiValue: string, landingPageUrl: string): Promise<AxiosResponse<any>> { + const auth = { + username: this.username, + password: this.password, + }; + + try { + // Re-register the DOI with its URL to make it findable again + const response = await axios.put(`${this.serviceUrl}/doi/${doiValue}`, `doi=${doiValue}\nurl=${landingPageUrl}`, { auth }); + + // Response Codes for PUT /doi/{doi} + // 201 Created: operation successful + // 400 Bad Request: request body must be exactly two lines: DOI and URL + // 401 Unauthorized: no login + // 403 Forbidden: login problem, quota exceeded + // 412 Precondition failed: metadata must be uploaded first + if (response.status !== 201) { + const message = `Unexpected DataCite MDS response code ${response.status}`; + logger.error(message); + throw new DoiClientException(response.status, message); + } + + logger.info(`DOI ${doiValue} successfully made findable again`); + return response; + } catch (error) { + logger.error(`Failed to make DOI ${doiValue} findable: ${error.message}`); + if (error instanceof DoiClientException) { + throw error; + } + throw new DoiClientException(error.response?.status || 500, error.response?.data || error.message); + } + } + + /** + * Gets the current state of a DOI (draft, registered, findable) + * const state = await doiClient.getDoiState('10.21388/tethys.231'); + * console.log(`Current state: ${state}`); // 'findable' + * + * @param doiValue The DOI identifier + * @returns Promise<string | null> The DOI state or null if not found + */ + public async getDoiState(doiValue: string): Promise<string | null> { + const doiInfo = await this.getDoiInfo(doiValue); + return doiInfo?.state || null; + } } diff --git a/app/Library/Oai/ResumptionToken.ts b/app/Library/Oai/ResumptionToken.ts index 5eca661..56bbea4 100644 --- a/app/Library/Oai/ResumptionToken.ts +++ b/app/Library/Oai/ResumptionToken.ts @@ -4,6 +4,7 @@ export default class ResumptionToken { private _resumptionId = ''; private _startPosition = 0; private _totalIds = 0; + private _queryParams: Record<string, any> = {}; get key(): string { return this.metadataPrefix + this.startPosition + this.totalIds; @@ -48,4 +49,12 @@ export default class ResumptionToken { set totalIds(totalIds: number) { this._totalIds = totalIds; } + + get queryParams(): Record<string, any> { + return this._queryParams; + } + + set queryParams(params: Record<string, any>) { + this._queryParams = params; + } } diff --git a/app/Library/Oai/TokenWorkerContract.ts b/app/Library/Oai/TokenWorkerContract.ts index 94dae70..2491817 100644 --- a/app/Library/Oai/TokenWorkerContract.ts +++ b/app/Library/Oai/TokenWorkerContract.ts @@ -6,6 +6,6 @@ export default abstract class TokenWorkerContract { abstract connect(): void; abstract close(): void; abstract get(key: string): Promise<ResumptionToken | null>; - abstract set(token: ResumptionToken): Promise<string>; + abstract set(token: ResumptionToken, browserFingerprint: string): Promise<string>; } diff --git a/app/Library/Oai/TokenWorkerSerice.ts b/app/Library/Oai/TokenWorkerSerice.ts index ee63f97..4bd6d7d 100644 --- a/app/Library/Oai/TokenWorkerSerice.ts +++ b/app/Library/Oai/TokenWorkerSerice.ts @@ -1,8 +1,8 @@ import ResumptionToken from './ResumptionToken.js'; import { createClient, RedisClientType } from 'redis'; import InternalServerErrorException from '#app/exceptions/InternalServerException'; -import { sprintf } from 'sprintf-js'; -import dayjs from 'dayjs'; +// import { sprintf } from 'sprintf-js'; +// import dayjs from 'dayjs'; import TokenWorkerContract from './TokenWorkerContract.js'; export default class TokenWorkerService implements TokenWorkerContract { @@ -40,30 +40,80 @@ export default class TokenWorkerService implements TokenWorkerContract { return result !== undefined && result !== null; } - public async set(token: ResumptionToken): Promise<string> { - const uniqueName = await this.generateUniqueName(); + /** + * Simplified set method that stores the token using a browser fingerprint key. + * If the token for that fingerprint already exists and its documentIds match the new token, + * then the fingerprint key is simply returned. + */ + public async set(token: ResumptionToken, browserFingerprint: string): Promise<string> { + // Generate a 15-digit unique number string based on the fingerprint + const uniqueNumberKey = this.createUniqueNumberFromFingerprint(browserFingerprint, token.documentIds, token.totalIds); + // Optionally, you could prefix it if desired, e.g. 'rs_' + uniqueNumberKey + const fingerprintKey = uniqueNumberKey; + + // const fingerprintKey = `rs_fp_${browserFingerprint}`; + const existingTokenString = await this.cache.get(fingerprintKey); + + if (existingTokenString) { + const existingToken = this.parseToken(existingTokenString); + if (this.arraysAreEqual(existingToken.documentIds, token.documentIds)) { + return fingerprintKey; + } + } const serialToken = JSON.stringify(token); - await this.cache.setEx(uniqueName, this.ttl, serialToken); - return uniqueName; + await this.cache.setEx(fingerprintKey, this.ttl, serialToken); + return fingerprintKey; } - private async generateUniqueName(): Promise<string> { - let fc = 0; - const uniqueId = dayjs().unix().toString(); - let uniqueName: string; - let cacheKeyExists: boolean; - do { - // format values - // %s - String - // %d - Signed decimal number (negative, zero or positive) - // [0-9] (Specifies the minimum width held of to the variable value) - uniqueName = sprintf('%s%05d', uniqueId, fc++); - cacheKeyExists = await this.has(uniqueName); - } while (cacheKeyExists); - return uniqueName; + // Updated helper method to generate a unique key based on fingerprint and documentIds + private createUniqueNumberFromFingerprint(browserFingerprint: string, documentIds: number[], totalIds: number): string { + // Combine the fingerprint, document IDs and totalIds to produce the input string + const combined = browserFingerprint + ':' + documentIds.join('-') + ':' + totalIds; + // Simple hash algorithm + let hash = 0; + for (let i = 0; i < combined.length; i++) { + hash = (hash << 5) - hash + combined.charCodeAt(i); + hash |= 0; // Convert to 32-bit integer + } + // Ensure positive number and limit it to at most 15 digits + const positiveHash = Math.abs(hash) % 1000000000000000; + // Pad with trailing zeros to ensure a 15-digit string + return positiveHash.toString().padEnd(15, '0'); } + // Add a helper function to compare two arrays of numbers with identical order + private arraysAreEqual(arr1: number[], arr2: number[]): boolean { + if (arr1.length !== arr2.length) { + return false; + } + return arr1.every((num, index) => num === arr2[index]); + } + + // public async set(token: ResumptionToken): Promise<string> { + // const uniqueName = await this.generateUniqueName(); + + // const serialToken = JSON.stringify(token); + // await this.cache.setEx(uniqueName, this.ttl, serialToken); + // return uniqueName; + // } + + // private async generateUniqueName(): Promise<string> { + // let fc = 0; + // const uniqueId = dayjs().unix().toString(); + // let uniqueName: string; + // let cacheKeyExists: boolean; + // do { + // // format values + // // %s - String + // // %d - Signed decimal number (negative, zero or positive) + // // [0-9] (Specifies the minimum width held of to the variable value) + // uniqueName = sprintf('%s%05d', uniqueId, fc++); + // cacheKeyExists = await this.has(uniqueName); + // } while (cacheKeyExists); + // return uniqueName; + // } + public async get(key: string): Promise<ResumptionToken | null> { if (!this.cache) { throw new InternalServerErrorException('Dataset is not available for OAI export!'); diff --git a/app/Library/Utils/Index.ts b/app/Library/Utils/Index.ts index 9bc21f7..4834d85 100644 --- a/app/Library/Utils/Index.ts +++ b/app/Library/Utils/Index.ts @@ -2,7 +2,7 @@ import Dataset from '#models/dataset'; import { Client } from '@opensearch-project/opensearch'; import { create } from 'xmlbuilder2'; import SaxonJS from 'saxon-js'; -import XmlModel from '#app/Library/XmlModel'; +import DatasetXmlSerializer from '#app/Library/DatasetXmlSerializer'; import { XMLBuilder } from 'xmlbuilder2/lib/interfaces.js'; import logger from '@adonisjs/core/services/logger'; import { readFileSync } from 'fs'; @@ -17,7 +17,7 @@ interface XslTParameter { } export default { // opensearchNode: process.env.OPENSEARCH_HOST || 'localhost', - client: new Client({ node: `http://${process.env.OPENSEARCH_HOST || 'localhost'}` }), // replace with your OpenSearch endpoint + client: new Client({ node: `${process.env.OPENSEARCH_HOST || 'localhost'}` }), // replace with your OpenSearch endpoint async getDoiRegisterString(dataset: Dataset): Promise<string | undefined> { try { @@ -72,31 +72,42 @@ export default { } }, + /** + * Index a dataset document to OpenSearch/Elasticsearch + */ async indexDocument(dataset: Dataset, index_name: string): Promise<void> { try { - const proc = readFileSync('public/assets2/solr.sef.json'); - const doc: string = await this.getTransformedString(dataset, proc); + // Load XSLT transformation file + const xsltProc = readFileSync('public/assets2/solr.sef.json'); - let document = JSON.parse(doc); + // Transform dataset to JSON document + const jsonDoc: string = await this.getTransformedString(dataset, xsltProc); + + const document = JSON.parse(jsonDoc); + + // Index document to OpenSearch with doument json body await this.client.index({ id: dataset.publish_id?.toString(), index: index_name, body: document, - refresh: true, + refresh: true, // make immediately searchable }); - logger.info(`dataset with publish_id ${dataset.publish_id} successfully indexed`); + logger.info(`Dataset ${dataset.publish_id} successfully indexed to ${index_name}`); } catch (error) { - logger.error(`An error occurred while indexing datsaet with publish_id ${dataset.publish_id}.`); + logger.error(`Failed to index dataset ${dataset.publish_id}: ${error.message}`); + throw error; // Re-throw to allow caller to handle } }, + /** + * Transform dataset XML to JSON using XSLT + */ async getTransformedString(dataset: Dataset, proc: Buffer): Promise<string> { - let xml = create({ version: '1.0', encoding: 'UTF-8', standalone: true }, '<root></root>'); - const datasetNode = xml.root().ele('Dataset'); - await createXmlRecord(dataset, datasetNode); - const xmlString = xml.end({ prettyPrint: false }); + // Generate XML string from dataset + const xmlString = await this.generateDatasetXml(dataset); try { + // Apply XSLT transformation const result = await SaxonJS.transform({ stylesheetText: proc, destination: 'serialized', @@ -108,6 +119,18 @@ export default { return ''; } }, + + /** + * Generate XML string from dataset model + */ + async generateDatasetXml(dataset: Dataset): Promise<string> { + const xml = create({ version: '1.0', encoding: 'UTF-8', standalone: true }, '<root></root>'); + const datasetNode = xml.root().ele('Dataset'); + + await createXmlRecord(dataset, datasetNode); + + return xml.end({ prettyPrint: false }); + }, }; /** * Return the default global focus trap stack @@ -115,74 +138,49 @@ export default { * @return {import('focus-trap').FocusTrap[]} */ -// export const indexDocument = async (dataset: Dataset, index_name: string, proc: Buffer): Promise<void> => { -// try { -// const doc = await getJsonString(dataset, proc); - -// let document = JSON.parse(doc); -// await client.index({ -// id: dataset.publish_id?.toString(), -// index: index_name, -// body: document, -// refresh: true, -// }); -// Logger.info(`dataset with publish_id ${dataset.publish_id} successfully indexed`); -// } catch (error) { -// Logger.error(`An error occurred while indexing datsaet with publish_id ${dataset.publish_id}.`); -// } -// }; - -// const getJsonString = async (dataset, proc): Promise<string> => { -// let xml = create({ version: '1.0', encoding: 'UTF-8', standalone: true }, '<root></root>'); -// const datasetNode = xml.root().ele('Dataset'); -// await createXmlRecord(dataset, datasetNode); -// const xmlString = xml.end({ prettyPrint: false }); - -// try { -// const result = await transform({ -// stylesheetText: proc, -// destination: 'serialized', -// sourceText: xmlString, -// }); -// return result.principalResult; -// } catch (error) { -// Logger.error(`An error occurred while creating the user, error: ${error.message},`); -// return ''; -// } -// }; - +/** + * Create complete XML record for dataset + * Handles caching and metadata enrichment + */ const createXmlRecord = async (dataset: Dataset, datasetNode: XMLBuilder): Promise<void> => { const domNode = await getDatasetXmlDomNode(dataset); - if (domNode) { - // add frontdoor url and data-type - dataset.publish_id && addLandingPageAttribute(domNode, dataset.publish_id.toString()); - addSpecInformation(domNode, 'data-type:' + dataset.type); - if (dataset.collections) { - for (const coll of dataset.collections) { - const collRole = coll.collectionRole; - addSpecInformation(domNode, collRole.oai_name + ':' + coll.number); - } - } - datasetNode.import(domNode); + if (!domNode) { + throw new Error(`Failed to generate XML DOM node for dataset ${dataset.id}`); } + + // Enrich with landing page URL + if (dataset.publish_id) { + addLandingPageAttribute(domNode, dataset.publish_id.toString()); + } + + // Add data type specification + addSpecInformation(domNode, `data-type:${dataset.type}`); + + // Add collection information + if (dataset.collections) { + for (const coll of dataset.collections) { + const collRole = coll.collectionRole; + addSpecInformation(domNode, `${collRole.oai_name}:${coll.number}`); + } + } + + datasetNode.import(domNode); }; const getDatasetXmlDomNode = async (dataset: Dataset): Promise<XMLBuilder | null> => { - const xmlModel = new XmlModel(dataset); + const serializer = new DatasetXmlSerializer(dataset).enableCaching().excludeEmptyFields(); // xmlModel.setModel(dataset); - xmlModel.excludeEmptyFields(); - xmlModel.caching = true; - // const cache = dataset.xmlCache ? dataset.xmlCache : null; - // dataset.load('xmlCache'); + + // Load cache relationship if not already loaded await dataset.load('xmlCache'); if (dataset.xmlCache) { - xmlModel.xmlCache = dataset.xmlCache; + serializer.setCache(dataset.xmlCache); } - // return cache.getDomDocument(); - const domDocument: XMLBuilder | null = await xmlModel.getDomDocument(); - return domDocument; + // Generate or retrieve cached DOM document + const xmlDocument: XMLBuilder | null = await serializer.toXmlDocument(); + return xmlDocument; }; const addLandingPageAttribute = (domNode: XMLBuilder, dataid: string) => { @@ -192,6 +190,6 @@ const addLandingPageAttribute = (domNode: XMLBuilder, dataid: string) => { domNode.att('landingpage', url); }; -const addSpecInformation= (domNode: XMLBuilder, information: string) => { +const addSpecInformation = (domNode: XMLBuilder, information: string) => { domNode.ele('SetSpec').att('Value', information); -}; \ No newline at end of file +}; diff --git a/app/Library/XmlModel.ts b/app/Library/XmlModel.ts deleted file mode 100644 index 6f76474..0000000 --- a/app/Library/XmlModel.ts +++ /dev/null @@ -1,129 +0,0 @@ -import DocumentXmlCache from '#models/DocumentXmlCache'; -import { XMLBuilder } from 'xmlbuilder2/lib/interfaces.js'; -import Dataset from '#models/dataset'; -import Strategy from './Strategy.js'; -import { DateTime } from 'luxon'; -import { builder } from 'xmlbuilder2'; - -/** - * This is the description of the interface - * - * @interface Conf - * @member {Model} model holds the current dataset model - * @member {XMLBuilder} dom holds the current DOM representation - * @member {Array<string>} excludeFields List of fields to skip on serialization. - * @member {boolean} excludeEmpty True, if empty fields get excluded from serialization. - * @member {string} baseUri Base URI for xlink:ref elements - */ -export interface Conf { - model: Dataset; - dom?: XMLBuilder; - excludeFields: Array<string>; - excludeEmpty: boolean; - baseUri: string; -} - -export default class XmlModel { - private config: Conf; - // private strategy = null; - private cache: DocumentXmlCache | null = null; - private _caching = false; - private strategy: Strategy; - - constructor(dataset: Dataset) { - // $this->strategy = new Strategy();// Opus_Model_Xml_Version1; - // $this->config = new Conf(); - // $this->strategy->setup($this->config); - - this.config = { - excludeEmpty: false, - baseUri: '', - excludeFields: [], - model: dataset, - }; - - this.strategy = new Strategy({ - excludeEmpty: true, - baseUri: '', - excludeFields: [], - model: dataset, - }); - } - - set model(model: Dataset) { - this.config.model = model; - } - - public excludeEmptyFields(): void { - this.config.excludeEmpty = true; - } - - get xmlCache(): DocumentXmlCache | null { - return this.cache; - } - - set xmlCache(cache: DocumentXmlCache) { - this.cache = cache; - } - - get caching(): boolean { - return this._caching; - } - set caching(caching: boolean) { - this._caching = caching; - } - - public async getDomDocument(): Promise<XMLBuilder | null> { - const dataset = this.config.model; - - let domDocument: XMLBuilder | null = await this.getDomDocumentFromXmlCache(); - if (domDocument == null) { - domDocument = await this.strategy.createDomDocument(); - // domDocument = create({ version: '1.0', encoding: 'UTF-8', standalone: true }, '<root></root>'); - if (this._caching) { - // caching is desired: - this.cache = this.cache || new DocumentXmlCache(); - this.cache.document_id = dataset.id; - this.cache.xml_version = 1; // (int)$this->strategy->getVersion(); - this.cache.server_date_modified = dataset.server_date_modified.toFormat('yyyy-MM-dd HH:mm:ss'); - this.cache.xml_data = domDocument.end(); - await this.cache.save(); - } - const node = domDocument.find( - (n) => { - const test = n.node.nodeName == 'Rdr_Dataset'; - return test; - }, - false, - true, - )?.node; - if (node != undefined) { - domDocument = builder({ version: '1.0', encoding: 'UTF-8', standalone: true }, node); - } - } - return domDocument; - } - - private async getDomDocumentFromXmlCache(): Promise<XMLBuilder | null> { - const dataset: Dataset = this.config.model; - if (!this.cache) { - return null; - } - //.toFormat('YYYY-MM-DD HH:mm:ss'); - let date: DateTime = dataset.server_date_modified; - const actuallyCached: boolean = await DocumentXmlCache.hasValidEntry(dataset.id, date); - if (!actuallyCached) { - return null; - } - //cache is actual return it for oai: - try { - if (this.cache) { - return this.cache.getDomDocument(); - } else { - return null; - } - } catch (error) { - return null; - } - } -} diff --git a/app/controllers/activities_controller.ts b/app/controllers/activities_controller.ts new file mode 100644 index 0000000..6526108 --- /dev/null +++ b/app/controllers/activities_controller.ts @@ -0,0 +1,43 @@ +// app/controllers/activities_controller.ts +import type { HttpContext } from '@adonisjs/core/http'; +import Activity from '#models/activity'; + +export default class ActivitiesController { + async index({ response }: HttpContext) { + // const activities = await Activity.query() + // .preload('user', (q) => q.select('id', 'login')) + // .orderBy('created_at', 'desc') + // .limit(10); + + // return response.json( + // activities.map((a) => ({ + // id: a.id, + // type: a.type, + // description: a.description, + // user: a.user?.login ?? null, + // created_at: a.createdAt.toISO(), // relativeTime() expects ISO + // })), + // ); + try { + const activities = await Activity.query() + .preload('user', (q) => q.select('id', 'login')) + .orderBy('created_at', 'desc') + .limit(10); + + return response.json( + activities.map((a) => ({ + id: a.id, + type: a.type, + description: a.description, + user: a.user?.login ?? null, + created_at: a.createdAt.toISO(), // relativeTime() expects ISO + })), + ); + } catch (error) { + console.error('Error fetching activities:', error); + return response.status(500).json({ error: 'Internal Server Error' }); + } + } + + +} diff --git a/app/controllers/projects_controller.ts b/app/controllers/projects_controller.ts new file mode 100644 index 0000000..21e20df --- /dev/null +++ b/app/controllers/projects_controller.ts @@ -0,0 +1,54 @@ +// app/controllers/projects_controller.ts +import Project from '#models/project'; +import type { HttpContext } from '@adonisjs/core/http'; +import { createProjectValidator, updateProjectValidator } from '#validators/project'; + +export default class ProjectsController { + // GET /settings/projects + public async index({ inertia, auth }: HttpContext) { + const projects = await Project.all(); + // return inertia.render('Admin/Project/Index', { projects }); + return inertia.render('Admin/Project/Index', { + projects: projects, + can: { + edit: await auth.user?.can(['settings']), + create: await auth.user?.can(['settings']), + }, + }); + } + + // GET /settings/projects/create + public async create({ inertia }: HttpContext) { + return inertia.render('Admin/Project/Create'); + } + + // POST /settings/projects + public async store({ request, response, session }: HttpContext) { + // Validate the request data + const data = await request.validateUsing(createProjectValidator); + + await Project.create(data); + + session.flash('success', 'Project created successfully'); + return response.redirect().toRoute('settings.project.index'); + } + + // GET /settings/projects/:id/edit + public async edit({ params, inertia }: HttpContext) { + const project = await Project.findOrFail(params.id); + return inertia.render('Admin/Project/Edit', { project }); + } + + // PUT /settings/projects/:id + public async update({ params, request, response, session }: HttpContext) { + const project = await Project.findOrFail(params.id); + + // Validate the request data + const data = await request.validateUsing(updateProjectValidator); + + await project.merge(data).save(); + + session.flash('success', 'Project updated successfully'); + return response.redirect().toRoute('settings.project.index'); + } +} diff --git a/app/exceptions/db_handler.ts b/app/exceptions/db_handler.ts new file mode 100644 index 0000000..868fec9 --- /dev/null +++ b/app/exceptions/db_handler.ts @@ -0,0 +1,43 @@ +// import { Exception } from '@adonisjs/core/exceptions' +import { HttpContext, ExceptionHandler } from '@adonisjs/core/http'; + +export default class DbHandlerException extends ExceptionHandler { + // constructor() { + // super(Logger) + // } + + async handle(error: any, ctx: HttpContext) { + // Check for AggregateError type + if (error.type === 'AggregateError' && error.aggregateErrors) { + const dbErrors = error.aggregateErrors.some((err: any) => err.code === 'ECONNREFUSED' && err.port === 5432); + + if (dbErrors) { + return ctx.response.status(503).json({ + status: 'error', + message: 'PostgreSQL database connection failed. Please ensure the database service is running.', + details: { + code: error.code, + type: error.type, + ports: error.aggregateErrors.map((err: any) => ({ + port: err.port, + address: err.address, + })), + }, + }); + } + } + + // Handle simple ECONNREFUSED errors + if (error.code === 'ECONNREFUSED') { + return ctx.response.status(503).json({ + status: 'error', + message: 'Database connection failed. Please ensure PostgreSQL is running.', + code: error.code, + }); + } + + return super.handle(error, ctx); + } + + static status = 500; +} diff --git a/app/exceptions/handler.ts b/app/exceptions/handler.ts index d8f1c63..b852a3a 100644 --- a/app/exceptions/handler.ts +++ b/app/exceptions/handler.ts @@ -1,125 +1,53 @@ -/* -|-------------------------------------------------------------------------- -| Http Exception Handler -|-------------------------------------------------------------------------- -| -| AdonisJs will forward all exceptions occurred during an HTTP request to -| the following class. You can learn more about exception handling by -| reading docs. -| -| The exception handler extends a base `HttpExceptionHandler` which is not -| mandatory, however it can do lot of heavy lifting to handle the errors -| properly. -| -*/ -import app from '@adonisjs/core/services/app'; -import { HttpContext, ExceptionHandler } from '@adonisjs/core/http'; -// import logger from '@adonisjs/core/services/logger'; -import type { StatusPageRange, StatusPageRenderer } from '@adonisjs/core/types/http'; +import app from '@adonisjs/core/services/app' +import { HttpContext, ExceptionHandler } from '@adonisjs/core/http' +import type { StatusPageRange, StatusPageRenderer } from '@adonisjs/core/types/http' export default class HttpExceptionHandler extends ExceptionHandler { - /** - * In debug mode, the exception handler will display verbose errors - * with pretty printed stack traces. - */ - protected debug = !app.inProduction; + protected debug = !app.inProduction + protected renderStatusPages = true - /** - * Status pages are used to display a custom HTML pages for certain error - * codes. You might want to enable them in production only, but feel - * free to enable them in development as well. - */ - protected renderStatusPages = true; //app.inProduction; + protected statusPages: Record<StatusPageRange, StatusPageRenderer> = { + '404': (error, ctx) => + ctx.inertia + ? ctx.inertia.render('Errors/ServerError', { error: error.message, code: error.status }) + : ctx.response.status(error.status).send(error.message), + '401..403': (error, ctx) => { + if (ctx.inertia) { + return ctx.inertia.render('Errors/ServerError', { error: error.message, code: error.status }); + } + return ctx.response.status(error.status).send(error.message); + }, + '500..599': (error, ctx) => { + const isDbError = + error.code === 'ECONNREFUSED' && + (error.errors?.some((e: any) => e.port === 5432) ?? error.message?.includes('5432')); - /** - * Status pages is a collection of error code range and a callback - * to return the HTML contents to send as a response. - */ - // protected statusPages: Record<StatusPageRange, StatusPageRenderer> = { - // '401..403': (error, { view }) => { - // return view.render('./errors/unauthorized', { error }); - // }, - // '404': (error, { view }) => { - // return view.render('./errors/not-found', { error }); - // }, - // '500..599': (error, { view }) => { - // return view.render('./errors/server-error', { error }); - // }, - // }; - protected statusPages: Record<StatusPageRange, StatusPageRenderer> = { - '404': (error, { inertia }) => { - return inertia.render('Errors/ServerError', { - error: error.message, - code: error.status, - }); - }, - '401..403': async (error, { inertia }) => { - // session.flash('errors', error.message); - return inertia.render('Errors/ServerError', { - error: error.message, - code: error.status, - }); - }, - '500..599': (error, { inertia }) => inertia.render('Errors/ServerError', { error: error.message, code: error.status }), - }; + if (isDbError && ctx.inertia) { + return ctx.inertia.render('Errors/postgres_error', { + status: 'error', + message: 'PostgreSQL database connection failed.', + details: { + code: error.code, + type: error.status + // Entferne das .map() auf error.errors, da es oft undefined ist + } + }); + } - // constructor() { - // super(logger); - // } - - public async handle(error: any, ctx: HttpContext) { - const { response, request, session } = ctx; - - /** - * Handle failed authentication attempt - */ - // if (['E_INVALID_AUTH_PASSWORD', 'E_INVALID_AUTH_UID'].includes(error.code)) { - // session.flash('errors', { login: error.message }); - // return response.redirect('/login'); - // } - // if ([401].includes(error.status)) { - // session.flash('errors', { login: error.message }); - // return response.redirect('/dashboard'); - // } - - // https://github.com/inertiajs/inertia-laravel/issues/56 - // let test = response.getStatus(); //200 - // let header = request.header('X-Inertia'); // true - // if (request.header('X-Inertia') && [500, 503, 404, 403, 401, 200].includes(response.getStatus())) { - if (request.header('X-Inertia') && [422].includes(error.status)) { - // session.flash('errors', error.messages.errors); - session.flash('errors', error.messages); - return response.redirect().back(); - // return inertia.render('errors/server_error', { - // return inertia.render('errors/server_error', { - // // status: response.getStatus(), - // error: error, - // }); - // ->toResponse($request) - // ->setStatusCode($response->status()); - } - // Dynamically change the error templates based on the absence of X-Inertia header - // if (!ctx.request.header('X-Inertia')) { - // this.statusPages = { - // '401..403': (error, { view }) => view.render('./errors/unauthorized', { error }), - // '404': (error, { view }) => view.render('./errors/not-found', { error }), - // '500..599': (error, { view }) => view.render('./errors/server-error', { error }), - // }; - // } - - /** - * Forward rest of the exceptions to the parent class - */ - return super.handle(error, ctx); + if (ctx.inertia) { + return ctx.inertia.render('Errors/ServerError', { error: error.message, code: 500 }); + } + return ctx.response.status(500).send(error.message); } + }; + public async handle(error: any, ctx: HttpContext) { /** - * The method is used to report error to the logging service or - * the a third party error monitoring service. - * - * @note You should not attempt to send a response from this method. + * WICHTIG: Validierungsfehler (422) NICHT manuell abfangen! + * AdonisJS 6 + VineJS + Inertia machen das automatisch. + * Wenn du es hier manuell machst, überschreibst du den Standard-Flow. */ - async report(error: unknown, ctx: HttpContext) { - return super.report(error, ctx); - } -} + + return super.handle(error, ctx) + } +} \ No newline at end of file diff --git a/app/models/DocumentXmlCache.ts b/app/models/DocumentXmlCache.ts index ed7315e..de8defc 100644 --- a/app/models/DocumentXmlCache.ts +++ b/app/models/DocumentXmlCache.ts @@ -4,7 +4,8 @@ import { builder, create } from 'xmlbuilder2'; import { XMLBuilder } from 'xmlbuilder2/lib/interfaces.js'; import db from '@adonisjs/lucid/services/db'; import { DateTime } from 'luxon'; -import type { BelongsTo } from "@adonisjs/lucid/types/relations"; +import type { BelongsTo } from '@adonisjs/lucid/types/relations'; +import logger from '@adonisjs/core/services/logger'; export default class DocumentXmlCache extends BaseModel { public static namingStrategy = new SnakeCaseNamingStrategy(); @@ -66,33 +67,38 @@ export default class DocumentXmlCache extends BaseModel { } /** - * Check if a dataset in a specific xml version is already cached or not. + * Check if a valid (non-stale) cache entry exists + * Cache is valid only if it was created AFTER the dataset's last modification * - * @param mixed datasetId - * @param mixed serverDateModified - * @returns {Promise<boolean>} Returns true on cached hit else false. + * @param datasetId - The dataset ID to check + * @param datasetServerDateModified - The dataset's last modification timestamp + * @returns true if valid cache exists, false otherwise */ - // public static async hasValidEntry(datasetId: number, datasetServerDateModified: DateTime): Promise<boolean> { - // // const formattedDate = dayjs(datasetServerDateModified).format('YYYY-MM-DD HH:mm:ss'); - - // const query = Database.from(this.table) - // .where('document_id', datasetId) - // .where('server_date_modified', '2023-08-17 16:51:03') - // .first(); - - // const row = await query; - // return !!row; - // } - - // Assuming 'DocumentXmlCache' has a table with a 'server_date_modified' column in your database public static async hasValidEntry(datasetId: number, datasetServerDateModified: DateTime): Promise<boolean> { const serverDateModifiedString: string = datasetServerDateModified.toFormat('yyyy-MM-dd HH:mm:ss'); // Convert DateTime to ISO string - const query = db.from(this.table) + + const row = await db + .from(this.table) .where('document_id', datasetId) - .where('server_date_modified', '>=', serverDateModifiedString) // Check if server_date_modified is newer or equal + .where('server_date_modified', '>', serverDateModifiedString) // Check if server_date_modified is newer or equal .first(); - const row = await query; - return !!row; + const isValid = !!row; + + if (isValid) { + logger.debug(`Valid cache found for dataset ${datasetId}`); + } else { + logger.debug(`No valid cache for dataset ${datasetId} (dataset modified: ${serverDateModifiedString})`); + } + + return isValid; + } + + /** + * Invalidate (delete) cache entry + */ + public async invalidate(): Promise<void> { + await this.delete(); + logger.debug(`Invalidated cache for document ${this.document_id}`); } } diff --git a/app/models/activity.ts b/app/models/activity.ts new file mode 100644 index 0000000..a2b81c3 --- /dev/null +++ b/app/models/activity.ts @@ -0,0 +1,57 @@ +// app/models/activity.ts +import { DateTime } from 'luxon'; +import { belongsTo, column } from '@adonisjs/lucid/orm'; +import BaseModel from './base_model.js'; +import type { BelongsTo } from '@adonisjs/lucid/types/relations'; +import User from '#models/user'; +import { SnakeCaseNamingStrategy } from '@adonisjs/lucid/orm'; + +export default class Activity extends BaseModel { + public static namingStrategy = new SnakeCaseNamingStrategy(); + public static primaryKey = 'id'; + public static table = 'activities'; + + @column({ isPrimary: true }) + declare id: number; + + @column() + declare type: string; + + @column() + declare userId: number | null; + + @column() + declare subjectType: string | null; + + @column() + declare subjectId: number | null; + + @column() + declare description: string; + + // Manual JSON (de)serialization keeps this working on SQLite/MySQL. + // On Postgres json/jsonb the driver already parses — drop the `consume` + // JSON.parse there to avoid double-handling. + // @column({ + // prepare: (value: Record<string, any> | null) => (value ? JSON.stringify(value) : null), + // consume: (value: string | null) => (value ? JSON.parse(value) : null), + // }) + // declare properties: Record<string, any> | null; + + @column() + declare properties: Record<string, any> | null; + + @column.dateTime({ autoCreate: true }) + declare createdAt: DateTime; + + @column.dateTime({ autoCreate: true, autoUpdate: true }) + declare updatedAt: DateTime; + + // @belongsTo(() => User) + // declare user: BelongsTo<typeof User>; + + @belongsTo(() => User, { + foreignKey: 'userId', + }) + declare user: BelongsTo<typeof User>; +} diff --git a/app/models/dataset.ts b/app/models/dataset.ts index 73ca3a0..1bf772b 100644 --- a/app/models/dataset.ts +++ b/app/models/dataset.ts @@ -5,7 +5,10 @@ import { belongsTo, hasMany, computed, - hasOne + hasOne, + afterCreate, + beforeUpdate, + afterUpdate, } from '@adonisjs/lucid/orm'; import { DateTime } from 'luxon'; import dayjs from 'dayjs'; @@ -23,10 +26,11 @@ import DatasetIdentifier from './dataset_identifier.js'; import Project from './project.js'; import DocumentXmlCache from './DocumentXmlCache.js'; import DatasetExtension from '#models/traits/dataset_extension'; -import type { ManyToMany } from "@adonisjs/lucid/types/relations"; -import type { BelongsTo } from "@adonisjs/lucid/types/relations"; -import type { HasMany } from "@adonisjs/lucid/types/relations"; -import type { HasOne } from "@adonisjs/lucid/types/relations"; +import type { ManyToMany } from '@adonisjs/lucid/types/relations'; +import type { BelongsTo } from '@adonisjs/lucid/types/relations'; +import type { HasMany } from '@adonisjs/lucid/types/relations'; +import type { HasOne } from '@adonisjs/lucid/types/relations'; +import ActivityLogger from '#services/activity_logger'; export default class Dataset extends DatasetExtension { public static namingStrategy = new SnakeCaseNamingStrategy(); @@ -46,7 +50,7 @@ export default class Dataset extends DatasetExtension { @column({ columnName: 'creating_corporation' }) public creating_corporation: string; - @column.dateTime({ + @column.dateTime({ columnName: 'embargo_date', serialize: (value: Date | null) => { return value ? dayjs(value).format('YYYY-MM-DD') : value; @@ -60,7 +64,7 @@ export default class Dataset extends DatasetExtension { @column({}) public language: string; - @column({columnName: 'publish_id'}) + @column({ columnName: 'publish_id' }) public publish_id: number | null = null; @column({}) @@ -209,6 +213,15 @@ export default class Dataset extends DatasetExtension { return mainTitle ? mainTitle.value : null; } + @computed({ + serializeAs: 'doi_identifier', + }) + public get doiIdentifier() { + // return `${this.firstName} ${this.lastName}`; + const identifier: DatasetIdentifier = this.identifier; + return identifier ? identifier.value : null; + } + @manyToMany(() => Person, { pivotForeignKey: 'document_id', pivotRelatedForeignKey: 'person_id', @@ -257,10 +270,12 @@ export default class Dataset extends DatasetExtension { return model || null; } - static async getMax (column: string) { - let dataset = await this.query().max(column + ' as max_publish_id').firstOrFail(); + static async getMax(column: string) { + let dataset = await this.query() + .max(column + ' as max_publish_id') + .firstOrFail(); return dataset.$extras.max_publish_id; - } + } @computed({ serializeAs: 'remaining_time', @@ -275,4 +290,34 @@ export default class Dataset extends DatasetExtension { return 0; } } + + // @afterCreate() + // static async logUploaded(dataset: Dataset) { + // await dataset.preload('titles'); + + // await ActivityLogger.log({ + // type: 'dataset.uploaded', + // description: `New publication uploaded: ${dataset.mainTitle ?? 'Untitled'}`, + // subjectType: 'Dataset', + // subjectId: dataset.id, + // }); + // } + + @beforeUpdate() + static capturePublish(dataset: Dataset) { + // $dirty is populated here, before persistence + (dataset as any).$becamePublished = dataset.$dirty.status !== undefined && dataset.status === 'published'; + } + + @afterUpdate() + static async logPublished(dataset: Dataset) { + if ((dataset as any).$becamePublished) { + await ActivityLogger.log({ + type: 'dataset.published', + description: `Publication published: ${dataset.mainTitle}`, + subjectType: 'Dataset', + subjectId: dataset.id, + }); + } + } } diff --git a/app/models/file.ts b/app/models/file.ts index fc129de..3d9145f 100644 --- a/app/models/file.ts +++ b/app/models/file.ts @@ -3,12 +3,12 @@ import { column, hasMany, belongsTo, SnakeCaseNamingStrategy, computed } from '@ import HashValue from './hash_value.js'; import Dataset from './dataset.js'; import BaseModel from './base_model.js'; -// import { Buffer } from 'buffer'; import * as fs from 'fs'; import crypto from 'crypto'; // import Drive from '@ioc:Adonis/Core/Drive'; // import Drive from '@adonisjs/drive'; -import drive from '#services/drive'; +// import drive from '#services/drive'; +import drive from '@adonisjs/drive/services/main'; import type { HasMany } from "@adonisjs/lucid/types/relations"; import type { BelongsTo } from "@adonisjs/lucid/types/relations"; @@ -88,7 +88,8 @@ export default class File extends BaseModel { serializeAs: 'filePath', }) public get filePath() { - return `/storage/app/public/${this.pathName}`; + // return `/storage/app/public/${this.pathName}`; + return `/storage/app/data/${this.pathName}`; // const mainTitle = this.titles?.find((title) => title.type === 'Main'); // return mainTitle ? mainTitle.value : null; } @@ -165,7 +166,7 @@ export default class File extends BaseModel { public async delete() { if (this.pathName) { // Delete file from additional storage - await drive.delete(this.pathName); + await drive.use('local').delete(this.pathName); } // Call the original delete method of the BaseModel to remove the record from the database diff --git a/app/models/mime_type.ts b/app/models/mime_type.ts index 52d614f..cf62678 100644 --- a/app/models/mime_type.ts +++ b/app/models/mime_type.ts @@ -16,9 +16,14 @@ export default class MimeType extends BaseModel { @column({}) public name: string; + // 1 : n file_extensions are separated by '|' in the database @column({}) public file_extension: string; + // 1 : n alternate_mimetype are separated by '|' in the database + @column({}) + public alternate_mimetype: string; + @column({}) public enabled: boolean; diff --git a/app/models/person.ts b/app/models/person.ts index 3feff8a..f4cf3a2 100644 --- a/app/models/person.ts +++ b/app/models/person.ts @@ -3,7 +3,7 @@ import { DateTime } from 'luxon'; import dayjs from 'dayjs'; import Dataset from './dataset.js'; import BaseModel from './base_model.js'; -import type { ManyToMany } from "@adonisjs/lucid/types/relations"; +import type { ManyToMany } from '@adonisjs/lucid/types/relations'; export default class Person extends BaseModel { public static namingStrategy = new SnakeCaseNamingStrategy(); @@ -30,7 +30,7 @@ export default class Person extends BaseModel { @column({}) public lastName: string; - @column({}) + @column({ columnName: 'identifier_orcid' }) public identifierOrcid: string; @column({}) @@ -51,7 +51,7 @@ export default class Person extends BaseModel { serializeAs: 'name', }) public get fullName() { - return `${this.firstName} ${this.lastName}`; + return [this.firstName, this.lastName].filter(Boolean).join(' '); } // @computed() @@ -64,10 +64,12 @@ export default class Person extends BaseModel { // return '2023-03-21 08:45:00'; // } - @computed() + @computed({ + serializeAs: 'dataset_count', + }) public get datasetCount() { const stock = this.$extras.datasets_count; //my pivot column name was "stock" - return stock; + return Number(stock); } @computed() @@ -76,6 +78,16 @@ export default class Person extends BaseModel { return contributor_type; } + @computed({ serializeAs: 'allow_email_contact' }) + public get allowEmailContact() { + // If the datasets relation is missing or empty, return false instead of null. + if (!this.datasets || this.datasets.length === 0) { + return false; + } + // Otherwise return the pivot attribute from the first related dataset. + return this.datasets[0].$extras?.pivot_allow_email_contact; + } + @manyToMany(() => Dataset, { pivotForeignKey: 'person_id', pivotRelatedForeignKey: 'document_id', @@ -83,4 +95,34 @@ export default class Person extends BaseModel { pivotColumns: ['role', 'sort_order', 'allow_email_contact'], }) public datasets: ManyToMany<typeof Dataset>; + + // public toJSON() { + // const json = super.toJSON(); + + // // Check if this person is loaded through a pivot relationship with sensitive roles + // const pivotRole = this.$extras?.pivot_role; + // if (pivotRole === 'author' || pivotRole === 'contributor') { + // // Remove sensitive information for public-facing roles + // delete json.email; + // // delete json.identifierOrcid; + // } + + // return json; + // } + + // @afterFind() + // public static async afterFindHook(person: Person) { + // if (person.$extras?.pivot_role === 'author' || person.$extras?.pivot_role === 'contributor') { + // person.email = undefined as any; + // } + // } + + // @afterFetch() + // public static async afterFetchHook(persons: Person[]) { + // persons.forEach(person => { + // if (person.$extras?.pivot_role === 'author' || person.$extras?.pivot_role === 'contributor') { + // person.email = undefined as any; + // } + // }); + // } } diff --git a/app/models/types.ts b/app/models/types.ts new file mode 100644 index 0000000..1fda1e1 --- /dev/null +++ b/app/models/types.ts @@ -0,0 +1,57 @@ +/** + * Qs module config + */ +type QueryStringConfig = { + depth?: number + allowPrototypes?: boolean + plainObjects?: boolean + parameterLimit?: number + arrayLimit?: number + ignoreQueryPrefix?: boolean + delimiter?: RegExp | string + allowDots?: boolean + charset?: 'utf-8' | 'iso-8859-1' | undefined + charsetSentinel?: boolean + interpretNumericEntities?: boolean + parseArrays?: boolean + comma?: boolean + } +/** + * Base config used by all types + */ +type BodyParserBaseConfig = { + encoding: string + limit: string | number + types: string[] + } + + /** + * Body parser config for parsing JSON requests + */ + export type BodyParserJSONConfig = BodyParserBaseConfig & { + strict: boolean + convertEmptyStringsToNull: boolean + } + + /** + * Parser config for parsing form data + */ + export type BodyParserFormConfig = BodyParserBaseConfig & { + queryString: QueryStringConfig + convertEmptyStringsToNull: boolean + } + + /** + * Parser config for parsing raw body (untouched) + */ + export type BodyParserRawConfig = BodyParserBaseConfig +/** + * Body parser config for all supported form types + */ +export type BodyParserConfig = { + allowedMethods: string[] + json: BodyParserJSONConfig + form: BodyParserFormConfig + raw: BodyParserRawConfig + multipart: BodyParserMultipartConfig + } \ No newline at end of file diff --git a/app/models/user.ts b/app/models/user.ts index 58f1676..038b569 100644 --- a/app/models/user.ts +++ b/app/models/user.ts @@ -1,6 +1,6 @@ import { DateTime } from 'luxon'; import { withAuthFinder } from '@adonisjs/auth/mixins/lucid'; -import { column, manyToMany, hasMany, SnakeCaseNamingStrategy } from '@adonisjs/lucid/orm'; +import { column, manyToMany, hasMany, SnakeCaseNamingStrategy, computed, beforeFetch, beforeFind } from '@adonisjs/lucid/orm'; import hash from '@adonisjs/core/services/hash'; import Role from './role.js'; import db from '@adonisjs/lucid/services/db'; @@ -14,6 +14,7 @@ import type { ManyToMany } from '@adonisjs/lucid/types/relations'; import type { HasMany } from '@adonisjs/lucid/types/relations'; import { compose } from '@adonisjs/core/helpers'; import BackupCode from './backup_code.js'; +import Activity from './activity.js'; const AuthFinder = withAuthFinder(() => hash.use('laravel'), { uids: ['email'], @@ -49,7 +50,6 @@ export default class User extends compose(BaseModel, AuthFinder) { @column() public login: string; - @column() public firstName: string; @@ -87,17 +87,8 @@ export default class User extends compose(BaseModel, AuthFinder) { @column({}) public state: number; - // @hasOne(() => TotpSecret, { - // foreignKey: 'user_id', - // }) - // public totp_secret: HasOne<typeof TotpSecret>; - - // @beforeSave() - // public static async hashPassword(user: User) { - // if (user.$dirty.password) { - // user.password = await hash.use('laravel').make(user.password); - // } - // } + @column({}) + public avatar: string; public get isTwoFactorEnabled(): boolean { return Boolean(this?.twoFactorSecret && this.state == TotpState.STATE_ENABLED); @@ -121,6 +112,34 @@ export default class User extends compose(BaseModel, AuthFinder) { }) public backupcodes: HasMany<typeof BackupCode>; + @hasMany(() => Activity, { + foreignKey: 'user_id', + }) + public activities: HasMany<typeof Activity>; + + @computed({ + serializeAs: 'is_admin', + }) + public get isAdmin(): boolean { + const roles = this.roles; + const isAdmin = roles?.map((role: Role) => role.name).includes('administrator'); + return isAdmin; + } + + // public toJSON() { + // return { + // ...super.toJSON(), + // roles: [] + // }; + // } + @beforeFind() + @beforeFetch() + public static preloadRoles(user: User) { + user.preload('roles', (builder) => { + builder.select(['id', 'name', 'display_name', 'description']); + }); + } + public async getBackupCodes(this: User): Promise<BackupCode[]> { const test = await this.related('backupcodes').query(); // return test.map((role) => role.code); diff --git a/app/services/activity_logger.ts b/app/services/activity_logger.ts new file mode 100644 index 0000000..c81b4e5 --- /dev/null +++ b/app/services/activity_logger.ts @@ -0,0 +1,27 @@ +// app/services/activity_logger.ts +import Activity from '#models/activity' + +interface LogOptions { + type: string + description: string + userId?: number | null + subjectType?: string | null + subjectId?: number | string | null + properties?: Record<string, any> +} + +export default class ActivityLogger { + static async log(options: LogOptions): Promise<void> { + await Activity.create({ + type: options.type, + description: options.description, + userId: options.userId ?? null, + subjectType: options.subjectType ?? null, + subjectId: options.subjectId != null ? Number(options.subjectId) : null, + properties: options.properties ?? null, + }) + + // Invalidate the cache if you add one (see Redis section). + // await redis.del('activities:recent') + } +} \ No newline at end of file diff --git a/app/services/validation_service.ts b/app/services/validation_service.ts new file mode 100644 index 0000000..0e35cc7 --- /dev/null +++ b/app/services/validation_service.ts @@ -0,0 +1,54 @@ +import app from '@adonisjs/core/services/app' +import { errors } from '@vinejs/vine' + +/** + * The ValidationService handles manual construction of validation errors + * that are compatible with the VanillaErrorReporter and AdonisJS Session. + */ +export class ValidationService { + /** + * Builds a validation error in the array-of-objects format without throwing it. + * Use this when you need the error object itself, e.g. multipart.abort(error). + */ + make(field: string, message: string, rule: string = 'manual') { + return new errors.E_VALIDATION_ERROR([ + { + field, + message, + rule, + }, + ]) + } + + /** + * Throws a manual validation error in the array-of-objects format + * which prevents the ".reduce is not a function" error in the session. + */ + throw(field: string, message: string, rule: string = 'manual') { + throw this.make(field, message, rule) + } + + /** + * Throws multiple manual validation errors at once. + */ + throwMany(errorObjects: Array<{ field: string; message: string; rule?: string }>) { + throw new errors.E_VALIDATION_ERROR( + errorObjects.map((err) => ({ + field: err.field, + message: err.message, + rule: err.rule || 'manual', + })) + ) + } +} + +/** + * Initialize and export the singleton instance + */ +let validation: ValidationService + +await app.booted(async () => { + validation = await app.container.make(ValidationService) +}) + +export { validation as default } \ No newline at end of file diff --git a/app/utils/utility-functions.ts b/app/utils/utility-functions.ts index 6afb2a0..8fa3782 100644 --- a/app/utils/utility-functions.ts +++ b/app/utils/utility-functions.ts @@ -1,3 +1,16 @@ +import { join, isAbsolute } from 'node:path'; +import type { BodyParserConfig } from '#models/types'; +import { createId } from '@paralleldrive/cuid2'; +import { tmpdir } from 'node:os'; +import config from '@adonisjs/core/services/config'; +import Dataset from '#models/dataset'; +import { TransactionClientContract } from '@adonisjs/lucid/types/database'; +import Person from '#models/person'; + +interface Dictionary { + [index: string]: string; +} + export function sum(a: number, b: number): number { return a + b; } @@ -24,3 +37,93 @@ export function preg_match(regex: RegExp, str: string) { const result: boolean = regex.test(str); return result; } + +/** + * Returns the tmp path for storing the files temporarly + */ +export function getTmpPath(config: BodyParserConfig['multipart']): string { + if (typeof config.tmpFileName === 'function') { + const tmpPath = config.tmpFileName(); + return isAbsolute(tmpPath) ? tmpPath : join(tmpdir(), tmpPath); + } + + return join(tmpdir(), createId()); +} +/** + * Returns config for a given type + */ +export function getConfigFor<K extends keyof BodyParserConfig>(type: K): BodyParserConfig[K] { + const bodyParserConfig: BodyParserConfig = config.get('bodyparser'); + const configType = bodyParserConfig[type]; + return configType; +} + +export function parseBytesSize(size: string): number { + const units: Record<string, number> = { + kb: 1024, + mb: 1024 * 1024, + gb: 1024 * 1024 * 1024, + tb: 1024 * 1024 * 1024 * 1024, + }; + + const match = size.match(/^(\d+)(kb|mb|gb|tb)$/i); // Regex to match size format + + if (!match) { + throw new Error('Invalid size format'); + } + + const [, value, unit] = match; + return parseInt(value) * units[unit.toLowerCase()]; +} + +// Helper function to format bytes as human-readable text + +export function formatBytes(bytes: number): string { + if (bytes === 0) return '0 Bytes'; + const k = 1024; + const sizes = ['Bytes', 'KB', 'MB', 'GB', 'TB']; + const i = Math.floor(Math.log(bytes) / Math.log(k)); + return parseFloat((bytes / Math.pow(k, i)).toFixed(2)) + ' ' + sizes[i]; +} + +export async function savePersons(dataset: Dataset, persons: any[], role: string, trx: TransactionClientContract) { + for (const [key, person] of persons.entries()) { + const pivotData = { + role: role, + sort_order: key + 1, + allow_email_contact: false, + ...extractPivotAttributes(person), // Merge pivot attributes here + }; + + if (person.id !== undefined) { + await dataset + .useTransaction(trx) + .related('persons') + .attach({ + [person.id]: pivotData, + }); + } else { + const dataPerson = new Person(); + dataPerson.fill(person); + await dataset.useTransaction(trx).related('persons').save(dataPerson, false, pivotData); + } + } +} + +// Helper function to extract pivot attributes from a person object +function extractPivotAttributes(person: any) { + const pivotAttributes: Dictionary = {}; + for (const key in person) { + if (key.startsWith('pivot_')) { + // pivotAttributes[key] = person[key]; + const cleanKey = key.replace('pivot_', ''); // Remove 'pivot_' prefix + pivotAttributes[cleanKey] = person[key]; + } + } + return pivotAttributes; +} + +// in #app/utils/utility-functions +export function errorMessage(error: unknown): string { + return error instanceof Error ? error.message : String(error); +} diff --git a/app/validators/dataset.ts b/app/validators/dataset.ts index 2b92348..f670b81 100644 --- a/app/validators/dataset.ts +++ b/app/validators/dataset.ts @@ -1,6 +1,7 @@ import vine, { SimpleMessagesProvider } from '@vinejs/vine'; import { TitleTypes, DescriptionTypes, ContributorTypes, ReferenceIdentifierTypes, RelationTypes } from '#contracts/enums'; import dayjs from 'dayjs'; + // import MimeType from '#models/mime_type'; // const enabledExtensions = await MimeType.query().select('file_extension').where('enabled', true).exec(); @@ -39,7 +40,8 @@ export const createDatasetValidator = vine.compile( .translatedLanguage({ mainLanguageField: 'language', typeField: 'type' }), }), ) - .minLength(1), + // .minLength(2) + .arrayContainsTypes({ typeA: 'main', typeB: 'translated' }), descriptions: vine .array( vine.object({ @@ -53,7 +55,8 @@ export const createDatasetValidator = vine.compile( .translatedLanguage({ mainLanguageField: 'language', typeField: 'type' }), }), ) - .minLength(1), + // .minLength(1), + .arrayContainsTypes({ typeA: 'abstract', typeB: 'translated' }), authors: vine .array( vine.object({ @@ -64,8 +67,9 @@ export const createDatasetValidator = vine.compile( .email() .normalizeEmail() .isUniquePerson({ table: 'persons', column: 'email', idField: 'id' }), - first_name: vine.string().trim().minLength(3).maxLength(255), + first_name: vine.string().trim().minLength(3).maxLength(255).optional().requiredWhen('name_type', '=', 'Personal'), last_name: vine.string().trim().minLength(3).maxLength(255), + identifier_orcid: vine.string().trim().maxLength(255).orcid().optional(), }), ) .minLength(1) @@ -80,9 +84,10 @@ export const createDatasetValidator = vine.compile( .email() .normalizeEmail() .isUniquePerson({ table: 'persons', column: 'email', idField: 'id' }), - first_name: vine.string().trim().minLength(3).maxLength(255), + first_name: vine.string().trim().minLength(3).maxLength(255).optional().requiredWhen('name_type', '=', 'Personal'), last_name: vine.string().trim().minLength(3).maxLength(255), pivot_contributor_type: vine.enum(Object.keys(ContributorTypes)), + identifier_orcid: vine.string().trim().maxLength(255).orcid().optional(), }), ) .distinct('email') @@ -125,7 +130,7 @@ export const createDatasetValidator = vine.compile( references: vine .array( vine.object({ - value: vine.string().trim().minLength(3).maxLength(255), + value: vine.string().trim().minLength(3).maxLength(255).validateReference({ typeField: 'type' }), type: vine.enum(Object.values(ReferenceIdentifierTypes)), relation: vine.enum(Object.values(RelationTypes)), label: vine.string().trim().minLength(2).maxLength(255), @@ -186,7 +191,8 @@ export const updateDatasetValidator = vine.compile( .translatedLanguage({ mainLanguageField: 'language', typeField: 'type' }), }), ) - .minLength(1), + // .minLength(2) + .arrayContainsTypes({ typeA: 'main', typeB: 'translated' }), descriptions: vine .array( vine.object({ @@ -200,7 +206,7 @@ export const updateDatasetValidator = vine.compile( .translatedLanguage({ mainLanguageField: 'language', typeField: 'type' }), }), ) - .minLength(1), + .arrayContainsTypes({ typeA: 'abstract', typeB: 'translated' }), authors: vine .array( vine.object({ @@ -211,8 +217,9 @@ export const updateDatasetValidator = vine.compile( .email() .normalizeEmail() .isUniquePerson({ table: 'persons', column: 'email', idField: 'id' }), - first_name: vine.string().trim().minLength(3).maxLength(255), + first_name: vine.string().trim().minLength(3).maxLength(255).optional().requiredWhen('name_type', '=', 'Personal'), last_name: vine.string().trim().minLength(3).maxLength(255), + identifier_orcid: vine.string().trim().maxLength(255).orcid().optional(), }), ) .minLength(1) @@ -227,8 +234,9 @@ export const updateDatasetValidator = vine.compile( .email() .normalizeEmail() .isUniquePerson({ table: 'persons', column: 'email', idField: 'id' }), - first_name: vine.string().trim().minLength(3).maxLength(255), + first_name: vine.string().trim().minLength(3).maxLength(255).optional().requiredWhen('name_type', '=', 'Personal'), last_name: vine.string().trim().minLength(3).maxLength(255), + identifier_orcid: vine.string().trim().maxLength(255).orcid().optional(), pivot_contributor_type: vine.enum(Object.keys(ContributorTypes)), }), ) @@ -272,7 +280,7 @@ export const updateDatasetValidator = vine.compile( references: vine .array( vine.object({ - value: vine.string().trim().minLength(3).maxLength(255), + value: vine.string().trim().minLength(3).maxLength(255).validateReference({ typeField: 'type' }), type: vine.enum(Object.values(ReferenceIdentifierTypes)), relation: vine.enum(Object.values(RelationTypes)), label: vine.string().trim().minLength(2).maxLength(255), @@ -302,21 +310,149 @@ export const updateDatasetValidator = vine.compile( .fileScan({ removeInfected: true }), ) .dependentArrayMinLength({ dependentArray: 'fileInputs', min: 1 }), - fileInputs: vine.array( - vine.object({ - label: vine.string().trim().maxLength(100), - //extnames: extensions, - }), - ), + fileInputs: vine + .array( + vine.object({ + label: vine.string().trim().maxLength(100), + }), + ) + .optional(), }), ); -// files: schema.array([rules.minLength(1)]).members( -// schema.file({ -// size: '512mb', -// extnames: ['jpg', 'gif', 'png', 'tif', 'pdf', 'zip', 'fgb', 'nc', 'qml', 'ovr', 'gpkg', 'gml', 'gpx', 'kml', 'kmz', 'json'], -// }), -// ), +export const updateEditorDatasetValidator = vine.compile( + vine.object({ + // first step + language: vine + .string() + .trim() + .regex(/^[a-zA-Z0-9]+$/), + licenses: vine.array(vine.number()).minLength(1), // define at least one license for the new dataset + rights: vine.string().in(['true']), + // second step + type: vine.string().trim().minLength(3).maxLength(255), + creating_corporation: vine.string().trim().minLength(3).maxLength(255), + titles: vine + .array( + vine.object({ + value: vine.string().trim().minLength(3).maxLength(255), + type: vine.enum(Object.values(TitleTypes)), + language: vine + .string() + .trim() + .minLength(2) + .maxLength(255) + .translatedLanguage({ mainLanguageField: 'language', typeField: 'type' }), + }), + ) + // .minLength(2) + .arrayContainsTypes({ typeA: 'main', typeB: 'translated' }), + descriptions: vine + .array( + vine.object({ + value: vine.string().trim().minLength(3).maxLength(2500), + type: vine.enum(Object.values(DescriptionTypes)), + language: vine + .string() + .trim() + .minLength(2) + .maxLength(255) + .translatedLanguage({ mainLanguageField: 'language', typeField: 'type' }), + }), + ) + .arrayContainsTypes({ typeA: 'abstract', typeB: 'translated' }), + authors: vine + .array( + vine.object({ + email: vine + .string() + .trim() + .maxLength(255) + .email() + .normalizeEmail() + .isUniquePerson({ table: 'persons', column: 'email', idField: 'id' }), + first_name: vine.string().trim().minLength(3).maxLength(255).optional().requiredWhen('name_type', '=', 'Personal'), + last_name: vine.string().trim().minLength(3).maxLength(255), + identifier_orcid: vine.string().trim().maxLength(255).orcid().optional(), + }), + ) + .minLength(1) + .distinct('email'), + contributors: vine + .array( + vine.object({ + email: vine + .string() + .trim() + .maxLength(255) + .email() + .normalizeEmail() + .isUniquePerson({ table: 'persons', column: 'email', idField: 'id' }), + first_name: vine.string().trim().minLength(3).maxLength(255).optional().requiredWhen('name_type', '=', 'Personal'), + last_name: vine.string().trim().minLength(3).maxLength(255), + identifier_orcid: vine.string().trim().maxLength(255).orcid().optional(), + pivot_contributor_type: vine.enum(Object.keys(ContributorTypes)), + }), + ) + .distinct('email') + .optional(), + // third step + project_id: vine.number().optional(), + // embargo_date: schema.date.optional({ format: 'yyyy-MM-dd' }, [rules.after(10, 'days')]), + embargo_date: vine + .date({ + formats: ['YYYY-MM-DD'], + }) + .afterOrEqual((_field) => { + return dayjs().add(10, 'day').format('YYYY-MM-DD'); + }) + .optional(), + coverage: vine.object({ + x_min: vine.number(), + x_max: vine.number(), + y_min: vine.number(), + y_max: vine.number(), + elevation_absolut: vine.number().positive().optional(), + elevation_min: vine.number().positive().optional().requiredIfExists('elevation_max'), + elevation_max: vine.number().positive().optional().requiredIfExists('elevation_min'), + // type: vine.enum(Object.values(DescriptionTypes)), + depth_absolut: vine.number().negative().optional(), + depth_min: vine.number().negative().optional().requiredIfExists('depth_max'), + depth_max: vine.number().negative().optional().requiredIfExists('depth_min'), + time_abolute: vine.date({ formats: { utc: true } }).optional(), + time_min: vine + .date({ formats: { utc: true } }) + .beforeField('time_max') + .optional() + .requiredIfExists('time_max'), + time_max: vine + .date({ formats: { utc: true } }) + .afterField('time_min') + .optional() + .requiredIfExists('time_min'), + }), + references: vine + .array( + vine.object({ + value: vine.string().trim().minLength(3).maxLength(255).validateReference({ typeField: 'type' }), + type: vine.enum(Object.values(ReferenceIdentifierTypes)), + relation: vine.enum(Object.values(RelationTypes)), + label: vine.string().trim().minLength(2).maxLength(255), + }), + ) + .optional(), + subjects: vine + .array( + vine.object({ + value: vine.string().trim().minLength(3).maxLength(255), + // pivot_contributor_type: vine.enum(Object.keys(ContributorTypes)), + language: vine.string().trim().minLength(2).maxLength(255), + }), + ) + .minLength(3) + .distinct('value'), + }), +); let messagesProvider = new SimpleMessagesProvider({ 'minLength': '{{ field }} must be at least {{ min }} characters long', @@ -368,8 +504,10 @@ let messagesProvider = new SimpleMessagesProvider({ 'files.array.minLength': 'At least {{ min }} file upload is required.', 'files.*.size': 'file size is to big', 'files.*.extnames': 'file extension is not supported', + 'embargo_date.date.afterOrEqual': `Embargo date must be on or after ${dayjs().add(10, 'day').format('DD.MM.YYYY')}`, }); createDatasetValidator.messagesProvider = messagesProvider; updateDatasetValidator.messagesProvider = messagesProvider; +updateEditorDatasetValidator.messagesProvider = messagesProvider; // export default createDatasetValidator; diff --git a/app/validators/project.ts b/app/validators/project.ts new file mode 100644 index 0000000..7f3d1f8 --- /dev/null +++ b/app/validators/project.ts @@ -0,0 +1,28 @@ +// app/validators/project.ts +import vine from '@vinejs/vine'; + +export const createProjectValidator = vine.compile( + vine.object({ + label: vine.string().trim().minLength(1).maxLength(50) .regex(/^[a-z0-9-]+$/), + name: vine + .string() + .trim() + .minLength(3) + .maxLength(255) + .regex(/^[a-zA-Z0-9äöüßÄÖÜ\s-]+$/), + description: vine.string().trim().maxLength(255).minLength(5).optional(), + }), +); + +export const updateProjectValidator = vine.compile( + vine.object({ + // label is NOT included since it's readonly + name: vine + .string() + .trim() + .minLength(3) + .maxLength(255) + .regex(/^[a-zA-Z0-9äöüßÄÖÜ\s-]+$/), + description: vine.string().trim().maxLength(255).minLength(5).optional(), + }), +); diff --git a/app/validators/role.ts b/app/validators/role.ts index 61e8ecd..81262d9 100644 --- a/app/validators/role.ts +++ b/app/validators/role.ts @@ -8,20 +8,20 @@ export const createRoleValidator = vine.compile( vine.object({ name: vine .string() - .isUnique({ table: 'roles', column: 'name' }) .trim() .minLength(3) .maxLength(255) - .regex(/^[a-zA-Z0-9]+$/), //Must be alphanumeric with hyphens or underscores + .isUnique({ table: 'roles', column: 'name' }) + .regex(/^[a-zA-Z0-9]+$/), // Must be alphanumeric display_name: vine .string() - .isUnique({ table: 'roles', column: 'display_name' }) .trim() .minLength(3) .maxLength(255) + .isUnique({ table: 'roles', column: 'display_name' }) .regex(/^[a-zA-Z0-9]+$/), description: vine.string().trim().escape().minLength(3).maxLength(255).optional(), - permissions: vine.array(vine.number()).minLength(1), // define at least one permission for the new role + permissions: vine.array(vine.number()).minLength(1), // At least one permission required }), ); @@ -29,21 +29,28 @@ export const updateRoleValidator = vine.withMetaData<{ roleId: number }>().compi vine.object({ name: vine .string() - // .unique(async (db, value, field) => { - // const result = await db.from('roles').select('id').whereNot('id', field.meta.roleId).where('name', value).first(); - // return result.length ? false : true; - // }) + .trim() + .minLength(3) + .maxLength(255) .isUnique({ table: 'roles', column: 'name', whereNot: (field) => field.meta.roleId, }) + .regex(/^[a-zA-Z0-9]+$/), + display_name: vine + .string() .trim() .minLength(3) - .maxLength(255), - + .maxLength(255) + .isUnique({ + table: 'roles', + column: 'display_name', + whereNot: (field) => field.meta.roleId, + }) + .regex(/^[a-zA-Z0-9]+$/), description: vine.string().trim().escape().minLength(3).maxLength(255).optional(), - permissions: vine.array(vine.number()).minLength(1), // define at least one permission for the new role + permissions: vine.array(vine.number()).minLength(1), // At least one permission required }), ); diff --git a/app/validators/user.ts b/app/validators/user.ts index c87d467..b7bbd70 100644 --- a/app/validators/user.ts +++ b/app/validators/user.ts @@ -16,7 +16,7 @@ export const createUserValidator = vine.compile( first_name: vine.string().trim().minLength(3).maxLength(255), last_name: vine.string().trim().minLength(3).maxLength(255), email: vine.string().maxLength(255).email().normalizeEmail().isUnique({ table: 'accounts', column: 'email' }), - password: vine.string().confirmed().trim().minLength(3).maxLength(60), + new_password: vine.string().confirmed({ confirmationField: 'password_confirmation' }).trim().minLength(3).maxLength(60), roles: vine.array(vine.number()).minLength(1), // define at least one role for the new user }), ); @@ -42,7 +42,7 @@ export const updateUserValidator = vine.withMetaData<{ objId: number }>().compil .email() .normalizeEmail() .isUnique({ table: 'accounts', column: 'email', whereNot: (field) => field.meta.objId }), - password: vine.string().confirmed().trim().minLength(3).maxLength(60).optional(), + new_password: vine.string().confirmed({ confirmationField: 'password_confirmation' }).trim().minLength(3).maxLength(60).optional(), roles: vine.array(vine.number()).minLength(1), // define at least one role for the new user }), ); diff --git a/app/validators/vanilla_error_reporter.ts b/app/validators/vanilla_error_reporter.ts index fe145eb..0ed99c8 100644 --- a/app/validators/vanilla_error_reporter.ts +++ b/app/validators/vanilla_error_reporter.ts @@ -1,203 +1,50 @@ -// import { ValidationError } from '../errors/validation_error.js'; -import { errors } from '@vinejs/vine'; -import type { ErrorReporterContract, FieldContext } from '@vinejs/vine/types'; -import string from '@poppinss/utils/string'; +import { errors } from '@vinejs/vine' +import type { ErrorReporterContract, FieldContext } from '@vinejs/vine/types' /** - * Shape of the Vanilla error node - */ -export type VanillaErrorNode = { - [field: string]: string[]; -}; -export interface MessagesBagContract { - get(pointer: string, rule: string, message: string, arrayExpressionPointer?: string, args?: any): string; -} -/** - * Message bag exposes the API to pull the most appropriate message for a - * given validation failure. - */ -export class MessagesBag implements MessagesBagContract { - messages: Message; - wildCardCallback; - constructor(messages: string[]) { - this.messages = messages; - this.wildCardCallback = typeof this.messages['*'] === 'function' ? this.messages['*'] : undefined; - } - /** - * Transform message by replace placeholders with runtime values - */ - transform(message: any, rule: string, pointer: string, args: any) { - /** - * No interpolation required - */ - if (!message.includes('{{')) { - return message; - } - return string.interpolate(message, { rule, field: pointer, options: args || {} }); - } - /** - * Returns the most appropriate message for the validation failure. - */ - get(pointer: string, rule: string, message: string, arrayExpressionPointer: string, args: any) { - let validationMessage = this.messages[`${pointer}.${rule}`]; - /** - * Fetch message for the array expression pointer if it exists - */ - if (!validationMessage && arrayExpressionPointer) { - validationMessage = this.messages[`${arrayExpressionPointer}.${rule}`]; - } - /** - * Fallback to the message for the rule - */ - if (!validationMessage) { - validationMessage = this.messages[rule]; - } - /** - * Transform and return message. The wildcard callback is invoked when custom message - * is not defined - */ - return validationMessage - ? this.transform(validationMessage, rule, pointer, args) - : this.wildCardCallback - ? this.wildCardCallback(pointer, rule, arrayExpressionPointer, args) - : message; - } -} -/** - * Shape of the error message collected by the SimpleErrorReporter - */ -type SimpleError = { - message: string; - field: string; - rule: string; - index?: number; - meta?: Record<string, any>; -}; -export interface Message { - [key: string]: any; -} -/** - * Simple error reporter collects error messages as an array of object. - * Each object has following properties. - * - * - message: string - * - field: string - * - rule: string - * - index?: number (in case of an array member) - * - args?: Record<string, any> + * Der VanillaErrorReporter sammelt Validierungsfehler im Standardformat, + * damit die AdonisJS Session-Middleware sie korrekt verarbeiten (reducen) kann. */ export class VanillaErrorReporter implements ErrorReporterContract { - // private messages; - // private bail; + /** + * Boolean, um zu prüfen, ob Fehler vorliegen + */ + hasErrors: boolean = false + + /** + * Sammlung der Fehler als Array (erforderlich für AdonisJS 6 Session) + */ + errors: any[] = [] + + /** + * Diese Methode wird von VineJS für jeden Validierungsfehler aufgerufen + */ + report( + message: string, + rule: string, + field: FieldContext, + meta?: Record<string, any> + ): void { + this.hasErrors = true + /** - * Boolean to know one or more errors have been reported - */ - hasErrors: boolean = false; - /** - * Collection of errors - */ - // errors: SimpleError[] = []; - errors: Message = {}; - /** - * Report an error. + * Wir pushen das Objekt in das Array. + * Das Feld 'field' erhält den vollständigen Pfad (z.B. "user.email"). */ + this.errors.push({ + message, + rule, + field: field.getFieldPath(), + ...meta, + }); + } - // constructor(messages: MessagesBagContract) { - // this.messages = messages; - // } - - report(message: string, rule: string, field: FieldContext, meta?: Record<string, any> | undefined): void { - // const error: SimpleError = { - // message, - // rule, - // field: field.getFieldPath() - // }; - // if (meta) { - // error.meta = meta; - // } - // if (field.isArrayMember) { - // error.index = field.name as number; - // } - // this.errors.push(error); - this.hasErrors = true; - // if (this.errors[field.getFieldPath()]) { - // this.errors[field.getFieldPath()]?.push(message); - // } else { - // this.errors[field.getFieldPath()] = [message]; - // } - const error: SimpleError = { - message, - rule, - field: field.getFieldPath(), // ?field.wildCardPath.split('.')[0] : field.getFieldPath(), - }; - // field: 'titles.0.value' - // message: 'Main Title is required' - // rule: 'required' "required" - - if (meta) { - error.meta = meta; - } - // if (field.isArrayMember) { - // error.index = field.name; - // } - this.hasErrors = true; - - var test = field.getFieldPath(); - - // this.errors.push(error); - // if (this.errors[error.field]) { - // this.errors[error.field]?.push(message); - // } - if (field.isArrayMember) { - // Check if the field has wildCardPath and if the error field already exists - if (this.errors[error.field]) { - // Do nothing, as we don't want to push further messages - } else { - // If the error field already exists, push the message - if (this.errors[error.field]) { - this.errors[error.field].push(message); - } else { - this.errors[error.field] = [message]; - } - } - } else { - if (this.errors[error.field]) { - this.errors[error.field]?.push(message); - } else { - this.errors[error.field] = [message]; - } - } - - // } else { - // // normal field - // this.errors[field.field] = [message]; - // } - - /** - * Collecting errors as per the JSONAPI spec - */ - // this.errors.push({ - // code: rule, - // detail: message, - // source: { - // pointer: field.wildCardPath, - // }, - // ...(meta ? { meta } : {}), - // }); - - // let pointer: string = field.wildCardPath as string; //'display_name' - // // if (field.isArrayMember) { - // // this.errors[pointer] = field.name; - // // } - // this.errors[pointer] = this.errors[pointer] || []; - // // this.errors[pointer].push(message); - // this.errors[pointer].push(this.messages.get(pointer, rule, message, arrayExpressionPointer, args)); - } - /** - * Returns an instance of the validation error - */ - createError() { - return new errors.E_VALIDATION_ERROR(this.errors); - } -} -export {}; + /** + * Erstellt die eigentliche Exception. + * Da 'this.errors' nun ein Array ist, funktioniert .reduce() + * in der Session-Middleware reibungslos. + */ + createError() { + return new errors.E_VALIDATION_ERROR(this.errors); + } +} \ No newline at end of file diff --git a/clamd.conf b/clamd.conf index 171396d..f066387 100644 --- a/clamd.conf +++ b/clamd.conf @@ -5,7 +5,23 @@ LogSyslog no LogVerbose yes DatabaseDirectory /var/lib/clamav LocalSocket /var/run/clamav/clamd.socket +# LocalSocketMode 666 +# Optional: allow multiple threads +MaxThreads 20 +# Disable TCP socket +# TCPSocket 0 + +# TCP port address. +# Default: no +# TCPSocket 3310 +# TCP address. +# By default we bind to INADDR_ANY, probably not wise. +# Enable the following to provide some degree of protection +# from the outside world. +# Default: no +# TCPAddr 127.0.0.1 + Foreground no PidFile /var/run/clamav/clamd.pid -LocalSocketGroup node -User node \ No newline at end of file +# LocalSocketGroup node # Changed from 'clamav' +# User node # Changed from 'clamav' - clamd runs as clamav user \ No newline at end of file diff --git a/commands/fix_dataset_cross_references.ts b/commands/fix_dataset_cross_references.ts new file mode 100644 index 0000000..baa2e0e --- /dev/null +++ b/commands/fix_dataset_cross_references.ts @@ -0,0 +1,482 @@ +/* +|-------------------------------------------------------------------------- +| node ace make:command fix-dataset-cross-references +| DONE: create commands/fix_dataset_cross_references.ts +|-------------------------------------------------------------------------- +*/ +import { BaseCommand, flags } from '@adonisjs/core/ace'; +import type { CommandOptions } from '@adonisjs/core/types/ace'; +import { DateTime } from 'luxon'; +import Dataset from '#models/dataset'; +import DatasetReference from '#models/dataset_reference'; +import AppConfig from '#models/appconfig'; +// import env from '#start/env'; + +interface MissingCrossReference { + sourceDatasetId: number; + targetDatasetId: number; + sourcePublishId: number | null; + targetPublishId: number | null; + sourceDoi: string | null; + targetDoi: string | null; + referenceType: string; + relation: string; + doi: string | null; + reverseRelation: string; + sourceReferenceLabel: string | null; +} + +export default class DetectMissingCrossReferences extends BaseCommand { + static commandName = 'detect:missing-cross-references'; + static description = 'Detect missing bidirectional cross-references between versioned datasets'; + + public static needsApplication = true; + + @flags.boolean({ alias: 'f', description: 'Fix missing cross-references automatically' }) + public fix: boolean = false; + + @flags.boolean({ alias: 'v', description: 'Verbose output' }) + public verbose: boolean = false; + + @flags.number({ alias: 'p', description: 'Filter by specific publish_id (source or target dataset)' }) + public publish_id?: number; + + // example: node ace detect:missing-cross-references --verbose -p 227 //if you want to filter by specific publish_id with details + // example: node ace detect:missing-cross-references --verbose + // example: node ace detect:missing-cross-references --fix -p 227 //if you want to filter by specific publish_id and fix it + // example: node ace detect:missing-cross-references + + public static options: CommandOptions = { + startApp: true, + staysAlive: false, + }; + + // Define the allowed relations that we want to process + private readonly ALLOWED_RELATIONS = [ + 'IsNewVersionOf', + 'IsPreviousVersionOf', + 'IsVariantFormOf', + 'IsOriginalFormOf', + 'Continues', + 'IsContinuedBy', + 'HasPart', + 'IsPartOf', + ]; + // private readonly ALLOWED_RELATIONS = ['IsPreviousVersionOf', 'IsOriginalFormOf']; + + async run() { + this.logger.info('🔍 Detecting missing cross-references...'); + this.logger.info(`📋 Processing only these relations: ${this.ALLOWED_RELATIONS.join(', ')}`); + + if (this.publish_id) { + this.logger.info(`Filtering by publish_id: ${this.publish_id}`); + } + + try { + const missingReferences = await this.findMissingCrossReferences(); + + // Store count in AppConfig if not fixing and count >= 1 + if (!this.fix && missingReferences.length >= 1) { + await this.storeMissingCrossReferencesCount(missingReferences.length); + } + + if (missingReferences.length === 0) { + const filterMsg = this.publish_id ? ` for publish_id ${this.publish_id}` : ''; + this.logger.success(`All cross-references are properly linked for the specified relations${filterMsg}!`); + // Clear the count if no missing references + if (!this.fix) { + await this.storeMissingCrossReferencesCount(0); + } + return; + } + + const filterMsg = this.publish_id ? ` (filtered by publish_id ${this.publish_id})` : ''; + this.logger.warning(`Found ${missingReferences.length} missing cross-reference(s)${filterMsg}:`); + + // Show brief list if not verbose mode + if (!this.verbose) { + for (const missing of missingReferences) { + const sourceDoi = missing.sourceDoi ? ` DOI: ${missing.sourceDoi}` : ''; + const targetDoi = missing.targetDoi ? ` DOI: ${missing.targetDoi}` : ''; + + this.logger.info( + `Dataset ${missing.sourceDatasetId} (Publish ID: ${missing.sourcePublishId}${sourceDoi}) ${missing.relation} Dataset ${missing.targetDatasetId} (Publish ID: ${missing.targetPublishId}${targetDoi}) → missing reverse: ${missing.reverseRelation}`, + ); + } + } else { + // Verbose mode - show detailed info + for (const missing of missingReferences) { + this.logger.info( + `Dataset ${missing.sourceDatasetId} references ${missing.targetDatasetId}, but reverse reference is missing`, + ); + this.logger.info(` - Reference type: ${missing.referenceType}`); + this.logger.info(` - Relation: ${missing.relation}`); + this.logger.info(` - DOI: ${missing.doi}`); + } + } + + if (this.fix) { + await this.fixMissingReferences(missingReferences); + // Clear the count after fixing + await this.storeMissingCrossReferencesCount(0); + this.logger.success('All missing cross-references have been fixed!'); + } else { + if (this.verbose) { + this.printMissingReferencesList(missingReferences); + } + this.logger.info('💡 Run with --fix flag to automatically create missing cross-references'); + if (this.publish_id) { + this.logger.info(`🎯 Currently filtering by publish_id: ${this.publish_id}`); + } + } + } catch (error) { + this.logger.error('Error detecting missing cross-references:', error); + process.exit(1); + } + } + + private async storeMissingCrossReferencesCount(count: number): Promise<void> { + try { + await AppConfig.updateOrCreate( + { + appid: 'commands', + configkey: 'missing_cross_references_count', + }, + { + configvalue: count.toString(), + }, + ); + + this.logger.info(`📊 Stored missing cross-references count in database: ${count}`); + } catch (error) { + this.logger.error('Failed to store missing cross-references count:', error); + } + } + + private async findMissingCrossReferences(): Promise<MissingCrossReference[]> { + const missingReferences: { + sourceDatasetId: number; + targetDatasetId: number; + sourcePublishId: number | null; + targetPublishId: number | null; + sourceDoi: string | null; + targetDoi: string | null; + referenceType: string; + relation: string; + doi: string | null; + reverseRelation: string; + sourceReferenceLabel: string | null; + }[] = []; + + this.logger.info('📊 Querying dataset references...'); + + // Find all references that point to Tethys datasets (DOI or URL containing tethys DOI) + // Only from datasets that are published AND only for allowed relations + const tethysReferencesQuery = DatasetReference.query() + .whereIn('type', ['DOI', 'URL']) + .whereIn('relation', this.ALLOWED_RELATIONS) // Only process allowed relations + .where((query) => { + query.where('value', 'like', '%doi.org/10.24341/tethys.%').orWhere('value', 'like', '%tethys.at/dataset/%'); + }) + .preload('dataset', (datasetQuery) => { + datasetQuery.preload('identifier'); + }) + .whereHas('dataset', (datasetQuery) => { + datasetQuery.where('server_state', 'published'); + }); + if (typeof this.publish_id === 'number') { + tethysReferencesQuery.whereHas('dataset', (datasetQuery) => { + datasetQuery.where('publish_id', this.publish_id as number); + }); + } + + const tethysReferences = await tethysReferencesQuery.exec(); + + this.logger.info(`🔗 Found ${tethysReferences.length} Tethys references from published datasets (allowed relations only)`); + + let processedCount = 0; + let skippedCount = 0; + + for (const reference of tethysReferences) { + processedCount++; + + // if (this.verbose && processedCount % 10 === 0) { + // this.logger.info(`📈 Processed ${processedCount}/${tethysReferences.length} references...`); + // } + + // Double-check that this relation is in our allowed list (safety check) + if (!this.ALLOWED_RELATIONS.includes(reference.relation)) { + skippedCount++; + if (this.verbose) { + this.logger.info(`⏭️ Skipping relation "${reference.relation}" - not in allowed list`); + } + continue; + } + + // Extract dataset publish_id from DOI or URL + // const targetDatasetPublish = this.extractDatasetPublishIdFromReference(reference.value); + // Extract DOI from reference URL + const doi = this.extractDoiFromReference(reference.value); + + // if (!targetDatasetPublish) { + // if (this.verbose) { + // this.logger.warning(`Could not extract publish ID from: ${reference.value}`); + // } + // continue; + // } + if (!doi) { + if (this.verbose) { + this.logger.warning(`Could not extract DOI from: ${reference.value}`); + } + continue; + } + + // // Check if target dataset exists and is published + // const targetDataset = await Dataset.query() + // .where('publish_id', targetDatasetPublish) + // .where('server_state', 'published') + // .preload('identifier') + // .first(); + // Check if target dataset exists and is published by querying via identifier + const targetDataset = await Dataset.query() + .where('server_state', 'published') + .whereHas('identifier', (query) => { + query.where('value', doi); + }) + .preload('identifier') + .first(); + + if (!targetDataset) { + if (this.verbose) { + this.logger.warning(`⚠️ Target dataset with publish_id ${doi} not found or not published`); + } + continue; + } + + // Ensure we have a valid source dataset with proper preloading + if (!reference.dataset) { + this.logger.warning(`⚠️ Source dataset ${reference.document_id} not properly loaded, skipping...`); + continue; + } + + // Check if reverse reference exists + const reverseReferenceExists = await this.checkReverseReferenceExists( + targetDataset.id, + reference.document_id, + reference.relation, + reference.dataset.identifier.value + ); + + if (!reverseReferenceExists) { + const reverseRelation = this.getReverseRelation(reference.relation); + if (reverseRelation) { + // Only add if we have a valid reverse relation + missingReferences.push({ + sourceDatasetId: reference.document_id, + targetDatasetId: targetDataset.id, + sourcePublishId: reference.dataset.publish_id || null, + targetPublishId: targetDataset.publish_id || null, + referenceType: reference.type, + relation: reference.relation, + doi: reference.value, + reverseRelation: reverseRelation, + sourceDoi: reference.dataset.identifier ? reference.dataset.identifier.value : null, + targetDoi: targetDataset.identifier ? targetDataset.identifier.value : null, + sourceReferenceLabel: reference.label || null, + }); + } + } + } + + this.logger.info(`✅ Processed ${processedCount} references (${skippedCount} skipped due to relation filtering)`); + return missingReferences; + } + + private extractDoiFromReference(reference: string): string | null { + // Match DOI pattern, with or without URL prefix + const doiPattern = /(?:https?:\/\/)?(?:doi\.org\/)?(.+)/i; + const match = reference.match(doiPattern); + + if (match && match[1]) { + return match[1]; // Returns just "10.24341/tethys.99.2" + } + + return null; + } + + private extractDatasetPublishIdFromReference(value: string): number | null { + // Extract from DOI: https://doi.org/10.24341/tethys.107 -> 107 + const doiMatch = value.match(/10\.24341\/tethys\.(\d+)/); + if (doiMatch) { + return parseInt(doiMatch[1]); + } + + // Extract from URL: https://tethys.at/dataset/107 -> 107 + const urlMatch = value.match(/tethys\.at\/dataset\/(\d+)/); + if (urlMatch) { + return parseInt(urlMatch[1]); + } + + return null; + } + + private async checkReverseReferenceExists( + targetDatasetId: number, + sourceDatasetId: number, + originalRelation: string, + sourceDatasetIdentifier: string | null, + ): Promise<boolean> { + const reverseRelation = this.getReverseRelation(originalRelation); + + if (!reverseRelation) { + return true; // If no reverse relation is defined, consider it as "exists" to skip processing + } + + // Only check for reverse references where the source dataset is also published + const reverseReference = await DatasetReference.query() + // We don't filter by source document_id here to find any incoming reference from any published dataset + .where('document_id', targetDatasetId) + // .where('related_document_id', sourceDatasetId) // Ensure it's an incoming reference + .where('relation', reverseRelation) + .where('value', 'like', `%${sourceDatasetIdentifier}`) // Basic check to ensure it points back to source dataset + .first(); + + return !!reverseReference; + } + + private getReverseRelation(relation: string): string | null { + const relationMap: Record<string, string> = { + IsNewVersionOf: 'IsPreviousVersionOf', + IsPreviousVersionOf: 'IsNewVersionOf', + IsVariantFormOf: 'IsOriginalFormOf', + IsOriginalFormOf: 'IsVariantFormOf', + Continues: 'IsContinuedBy', + IsContinuedBy: 'Continues', + HasPart: 'IsPartOf', + IsPartOf: 'HasPart', + }; + + // Only return reverse relation if it exists in our map, otherwise return null + return relationMap[relation] || null; + } + + private printMissingReferencesList(missingReferences: MissingCrossReference[]) { + console.log('┌─────────────────────────────────────────────────────────────────────────────────┐'); + console.log('│ MISSING CROSS-REFERENCES REPORT │'); + console.log('│ (Published Datasets Only - Filtered Relations) │'); + console.log('└─────────────────────────────────────────────────────────────────────────────────┘'); + console.log(); + + missingReferences.forEach((missing, index) => { + console.log( + `${index + 1}. Dataset ${missing.sourceDatasetId} (Publish ID: ${missing.sourcePublishId} Identifier: ${missing.sourceDoi}) + ${missing.relation} Dataset ${missing.targetDatasetId} (Publish ID: ${missing.targetPublishId} Identifier: ${missing.targetDoi})`, + ); + console.log(` ├─ Current relation: "${missing.relation}"`); + console.log(` ├─ Missing reverse relation: "${missing.reverseRelation}"`); + console.log(` ├─ Reference type: ${missing.referenceType}`); + console.log(` └─ DOI/URL: ${missing.doi}`); + console.log(); + }); + + console.log('┌─────────────────────────────────────────────────────────────────────────────────┐'); + console.log(`│ SUMMARY: ${missingReferences.length} missing reverse reference(s) detected │`); + console.log(`│ Processed relations: ${this.ALLOWED_RELATIONS.join(', ')} │`); + console.log('└─────────────────────────────────────────────────────────────────────────────────┘'); + } + + private async fixMissingReferences(missingReferences: MissingCrossReference[]) { + this.logger.info('🔧 Creating missing cross-references in database...'); + + let fixedCount = 0; + let errorCount = 0; + + for (const [index, missing] of missingReferences.entries()) { + try { + // Get both source and target datasets + const sourceDataset = await Dataset.query() + .where('id', missing.sourceDatasetId) + .where('server_state', 'published') + .preload('identifier') + .preload('titles') // Preload titles to get mainTitle + .first(); + + const targetDataset = await Dataset.query().where('id', missing.targetDatasetId).where('server_state', 'published').first(); + + if (!sourceDataset) { + this.logger.warning(`⚠️ Source dataset ${missing.sourceDatasetId} not found or not published, skipping...`); + errorCount++; + continue; + } + + if (!targetDataset) { + this.logger.warning(`⚠️ Target dataset ${missing.targetDatasetId} not found or not published, skipping...`); + errorCount++; + continue; + } + + // **NEW: Update the original reference if related_document_id is missing** + const originalReference = await DatasetReference.query() + .where('document_id', missing.sourceDatasetId) + .where('relation', missing.relation) + .where('value', 'like', `%${missing.targetDoi}%`) + .first(); + if (originalReference && !originalReference.related_document_id) { + originalReference.related_document_id = missing.targetDatasetId; + await originalReference.save(); + if (this.verbose) { + this.logger.info(`🔗 Updated original reference with related_document_id: ${missing.targetDatasetId}`); + } + } + + // Create the reverse reference using the referenced_by relationship + // Example: If Dataset 297 IsNewVersionOf Dataset 144 + // We create an incoming reference for Dataset 144 that shows Dataset 297 IsPreviousVersionOf it + const reverseReference = new DatasetReference(); + // Don't set document_id - this creates an incoming reference via related_document_id + reverseReference.document_id = missing.targetDatasetId; // + reverseReference.related_document_id = missing.sourceDatasetId; + reverseReference.type = 'DOI'; + reverseReference.relation = missing.reverseRelation; + + // Use the source dataset's DOI for the value (what's being referenced) + if (sourceDataset.identifier?.value) { + reverseReference.value = `https://doi.org/${sourceDataset.identifier.value}`; + } else { + // Fallback to dataset URL if no DOI + reverseReference.value = `https://tethys.at/dataset/${sourceDataset.publish_id || missing.sourceDatasetId}`; + } + + // Use the source dataset's main title for the label + //reverseReference.label = sourceDataset.mainTitle || `Dataset ${missing.sourceDatasetId}`; + // get label of forward reference + reverseReference.label = missing.sourceReferenceLabel || sourceDataset.mainTitle || `Dataset ${missing.sourceDatasetId}`; + // reverseReference.notes = `Auto-created by detect:missing-cross-references command on ${DateTime.now().toISO()} to fix missing bidirectional reference.`; + + // Save the new reverse reference + // Also save 'server_date_modified' on target dataset to trigger any downstream updates (e.g. search index) + targetDataset.server_date_modified = DateTime.now(); + await targetDataset.save(); + + await reverseReference.save(); + fixedCount++; + + if (this.verbose) { + this.logger.info( + `✅ [${index + 1}/${missingReferences.length}] Created reverse reference: Dataset ${missing.sourceDatasetId} -> ${missing.targetDatasetId} (${missing.reverseRelation})`, + ); + } else if ((index + 1) % 10 === 0) { + this.logger.info(`📈 Fixed ${fixedCount}/${missingReferences.length} references...`); + } + } catch (error) { + this.logger.error( + `❌ Error creating reverse reference for datasets ${missing.targetDatasetId} -> ${missing.sourceDatasetId}:`, + error, + ); + errorCount++; + } + } + + this.logger.info(`📊 Fix completed: ${fixedCount} created, ${errorCount} errors`); + } +} diff --git a/commands/fix_version_related_ids.ts b/commands/fix_version_related_ids.ts new file mode 100644 index 0000000..40afc13 --- /dev/null +++ b/commands/fix_version_related_ids.ts @@ -0,0 +1,189 @@ +/* +|-------------------------------------------------------------------------- +| node ace make:command fix-version-related-ids +| DONE: create commands/fix_version_related_ids.ts +|-------------------------------------------------------------------------- +| Repairs the `related_document_id` foreign key on version references +| (IsNewVersionOf / IsPreviousVersionOf, both directions). +| +| The DOI stored in `value` is the reliable link; `related_document_id` +| is frequently NULL or self-referential. This command resolves the target +| dataset via its DOI and sets `related_document_id` accordingly, correcting +| both NULL and wrong-but-non-null values. +| +| Examples: +| node ace fix:version-related-ids // dry run, all datasets +| node ace fix:version-related-ids --verbose // dry run with per-row detail +| node ace fix:version-related-ids --fix // apply changes +| node ace fix:version-related-ids --fix -p 226 // apply, only refs owned by publish_id 226 +*/ +import { BaseCommand, flags } from '@adonisjs/core/ace'; +import type { CommandOptions } from '@adonisjs/core/types/ace'; +import Dataset from '#models/dataset'; +import DatasetReference from '#models/dataset_reference'; + +export default class FixVersionRelatedIds extends BaseCommand { + static commandName = 'fix:version-related-ids'; + static description = + 'Backfill/repair related_document_id on IsNewVersionOf / IsPreviousVersionOf references by resolving the target dataset via its DOI'; + + public static needsApplication = true; + + @flags.boolean({ alias: 'f', description: 'Apply changes. Without this flag the command runs as a dry run.' }) + public fix: boolean = false; + + @flags.boolean({ alias: 'v', description: 'Verbose output (per-reference detail)' }) + public verbose: boolean = false; + + @flags.number({ alias: 'p', description: 'Only process references owned by this publish_id' }) + public publish_id?: number; + + public static options: CommandOptions = { + startApp: true, + staysAlive: false, + }; + + // Only the version relations, both directions. + private readonly VERSION_RELATIONS = ['IsNewVersionOf', 'IsPreviousVersionOf']; + + async run() { + this.logger.info(`🔍 Scanning ${this.VERSION_RELATIONS.join(' / ')} references...`); + this.logger.info(this.fix ? '✏️ Mode: APPLY (changes will be written)' : '👀 Mode: DRY RUN (no changes written)'); + if (typeof this.publish_id === 'number') { + this.logger.info(`🎯 Filtering by owning publish_id: ${this.publish_id}`); + } + + try { + const query = DatasetReference.query() + .whereIn('relation', this.VERSION_RELATIONS) + .whereIn('type', ['DOI', 'URL']) + .where((q) => { + q.where('value', 'like', '%doi.org/10.24341/tethys.%').orWhere('value', 'like', '%tethys.at/dataset/%'); + }); + + // Restrict to references owned by a specific dataset (by publish_id), if requested. + if (typeof this.publish_id === 'number') { + query.whereHas('dataset', (d) => d.where('publish_id', this.publish_id as number)); + } + + const refs = await query.exec(); + this.logger.info(`🔗 Found ${refs.length} version reference(s) to inspect`); + + let alreadyCorrect = 0; + let filledFromNull = 0; + let correctedWrong = 0; + let unresolved = 0; + + for (const ref of refs) { + const target = await this.resolveTarget(ref); + + if (!target) { + unresolved++; + if (this.verbose) { + this.logger.warning(`⚠️ Reference ${ref.id}: could not resolve target (value: ${ref.value})`); + } + continue; + } + + // Never let a reference point at its own owning document. + if (target.id === ref.document_id) { + unresolved++; + if (this.verbose) { + this.logger.warning( + `⚠️ Reference ${ref.id}: target resolves to its own document (${ref.document_id}); skipping self-link`, + ); + } + continue; + } + + if (ref.related_document_id === target.id) { + alreadyCorrect++; + continue; + } + + const previous = ref.related_document_id; + const wasNull = previous === null || previous === undefined; + + if (this.fix) { + ref.related_document_id = target.id; + await ref.save(); + } + + if (wasNull) { + filledFromNull++; + } else { + correctedWrong++; + } + + if (this.verbose) { + const action = this.fix ? 'Updated' : '📝 Would update'; + this.logger.info( + `${action} reference ${ref.id} (doc ${ref.document_id}, ${ref.relation}): ` + + `related_document_id ${previous ?? 'NULL'} → ${target.id} (publish_id ${target.publish_id})`, + ); + } + } + + this.logger.info('────────────────────────────────────────'); + this.logger.info(`✔️ Already correct: ${alreadyCorrect}`); + this.logger.info(`➕ Filled from NULL: ${filledFromNull}`); + this.logger.info(`🔧 Corrected wrong value: ${correctedWrong}`); + this.logger.info(`⚠️ Unresolved/skipped: ${unresolved}`); + this.logger.info('────────────────────────────────────────'); + + const changes = filledFromNull + correctedWrong; + if (!this.fix && changes > 0) { + this.logger.info(`💡 Dry run only. Re-run with --fix to write ${changes} change(s).`); + } else if (this.fix) { + this.logger.success(`Done. ${changes} reference(s) updated.`); + } else { + this.logger.success('Nothing to change — all version references already linked correctly.'); + } + } catch (error) { + this.logger.error('Error fixing version related_document_id values:', error); + process.exit(1); + } + } + + /** + * Resolve the dataset a version reference points to. + * Prefers the DOI in `value` (reliable); falls back to a tethys publish_id URL. + */ + private async resolveTarget(ref: DatasetReference): Promise<Dataset | null> { + const doi = this.normalizeDoi(ref.value); + if (doi) { + const byDoi = await Dataset.query() + .whereHas('identifier', (q) => q.where('value', doi)) + .first(); + if (byDoi) return byDoi; + } + + const publishId = this.extractPublishId(ref.value); + if (publishId) { + const byPublishId = await Dataset.query().where('publish_id', publishId).first(); + if (byPublishId) return byPublishId; + } + + return null; + } + + /** + * Strip the resolver prefix so a reference value like + * "https://doi.org/10.24341/tethys.108.2" matches the identifier + * table value "10.24341/tethys.108.2". Returns null if it isn't a DOI. + */ + private normalizeDoi(value: string | null): string | null { + if (!value) return null; + const cleaned = value + .trim() + .replace(/^https?:\/\/(dx\.)?doi\.org\//i, '') + .replace(/^doi:/i, ''); + return /^10\.\d{4,}\//.test(cleaned) ? cleaned : null; + } + + private extractPublishId(value: string | null): number | null { + if (!value) return null; + const urlMatch = value.match(/tethys\.at\/dataset\/(\d+)/); + return urlMatch ? parseInt(urlMatch[1], 10) : null; + } +} \ No newline at end of file diff --git a/commands/index_datasets.ts b/commands/index_datasets.ts index ee76268..322d4b8 100644 --- a/commands/index_datasets.ts +++ b/commands/index_datasets.ts @@ -4,7 +4,7 @@ import { XMLBuilder } from 'xmlbuilder2/lib/interfaces.js'; import { create } from 'xmlbuilder2'; import Dataset from '#models/dataset'; -import XmlModel from '#app/Library/XmlModel'; +import XmlModel from '#app/Library/DatasetXmlSerializer'; import { readFileSync } from 'fs'; import SaxonJS from 'saxon-js'; import { Client } from '@opensearch-project/opensearch'; @@ -12,10 +12,8 @@ import { getDomain } from '#app/utils/utility-functions'; import { BaseCommand, flags } from '@adonisjs/core/ace'; import { CommandOptions } from '@adonisjs/core/types/ace'; import env from '#start/env'; -// import db from '@adonisjs/lucid/services/db'; -// import { default as Dataset } from '#models/dataset'; import logger from '@adonisjs/core/services/logger'; - +import { DateTime } from 'luxon'; const opensearchNode = env.get('OPENSEARCH_HOST', 'localhost'); const client = new Client({ node: `${opensearchNode}` }); // replace with your OpenSearch endpoint @@ -30,11 +28,10 @@ export default class IndexDatasets extends BaseCommand { public publish_id: number; public static options: CommandOptions = { - startApp: true, - staysAlive: false, + startApp: true, // Ensures the IoC container is ready to use + staysAlive: false, // Command exits after running }; - async run() { logger.debug('Hello world!'); // const { default: Dataset } = await import('#models/dataset'); @@ -44,10 +41,12 @@ export default class IndexDatasets extends BaseCommand { const index_name = 'tethys-records'; for (var dataset of datasets) { - // Logger.info(`File publish_id ${dataset.publish_id}`); - // const jsonString = await this.getJsonString(dataset, proc); - // console.log(jsonString); - await this.indexDocument(dataset, index_name, proc); + const shouldUpdate = await this.shouldUpdateDataset(dataset, index_name); + if (shouldUpdate) { + await this.indexDocument(dataset, index_name, proc); + } else { + logger.info(`Dataset with publish_id ${dataset.publish_id} is up to date, skipping indexing`); + } } } @@ -65,6 +64,46 @@ export default class IndexDatasets extends BaseCommand { return await query.exec(); } + private async shouldUpdateDataset(dataset: Dataset, index_name: string): Promise<boolean> { + try { + // Check if publish_id exists before proceeding + if (!dataset.publish_id) { + // Return true to update since document doesn't exist in OpenSearch yet + return true; + } + // Get the existing document from OpenSearch + const response = await client.get({ + index: index_name, + id: dataset.publish_id?.toString(), + }); + + const existingDoc = response.body._source; + + // Compare server_date_modified + if (existingDoc && existingDoc.server_date_modified) { + // Convert Unix timestamp (seconds) to milliseconds for DateTime.fromMillis() + const existingModified = DateTime.fromMillis(Number(existingDoc.server_date_modified) * 1000); + const currentModified = dataset.server_date_modified; + + // Only update if the dataset has been modified more recently + if (currentModified <= existingModified) { + return false; + } + } + + return true; + } catch (error) { + // If document doesn't exist or other error, we should index it + if (error.statusCode === 404) { + logger.info(`Dataset with publish_id ${dataset.publish_id} not found in index, will create new document`); + return true; + } + + logger.warn(`Error checking existing document for publish_id ${dataset.publish_id}: ${error.message}`); + return true; // Index anyway if we can't determine the status + } + } + private async indexDocument(dataset: Dataset, index_name: string, proc: Buffer): Promise<void> { try { const doc = await this.getJsonString(dataset, proc); @@ -78,7 +117,8 @@ export default class IndexDatasets extends BaseCommand { }); logger.info(`dataset with publish_id ${dataset.publish_id} successfully indexed`); } catch (error) { - logger.error(`An error occurred while indexing dataset with publish_id ${dataset.publish_id}.`); + logger.error(`An error occurred while indexing dataset with publish_id ${dataset.publish_id}. + Error: ${error.message}`); } } @@ -111,19 +151,16 @@ export default class IndexDatasets extends BaseCommand { } private async getDatasetXmlDomNode(dataset: Dataset): Promise<XMLBuilder | null> { - const xmlModel = new XmlModel(dataset); + const serializer = new XmlModel(dataset).enableCaching().excludeEmptyFields(); // xmlModel.setModel(dataset); - xmlModel.excludeEmptyFields(); - xmlModel.caching = true; - // const cache = dataset.xmlCache ? dataset.xmlCache : null; - // dataset.load('xmlCache'); + if (dataset.xmlCache) { - xmlModel.xmlCache = dataset.xmlCache; + serializer.setCache(dataset.xmlCache); } - // return cache.getDomDocument(); - const domDocument: XMLBuilder | null = await xmlModel.getDomDocument(); - return domDocument; + // return cache.toXmlDocument(); + const xmlDocument: XMLBuilder | null = await serializer.toXmlDocument(); + return xmlDocument; } private addSpecInformation(domNode: XMLBuilder, information: string) { diff --git a/commands/list_updatable_datacite.ts b/commands/list_updatable_datacite.ts new file mode 100644 index 0000000..aed411a --- /dev/null +++ b/commands/list_updatable_datacite.ts @@ -0,0 +1,346 @@ +/* +|-------------------------------------------------------------------------- +| node ace make:command list-updateable-datacite +| DONE: create commands/list_updeatable_datacite.ts +|-------------------------------------------------------------------------- +*/ +import { BaseCommand, flags } from '@adonisjs/core/ace'; +import { CommandOptions } from '@adonisjs/core/types/ace'; +import Dataset from '#models/dataset'; +import { DoiClient } from '#app/Library/Doi/DoiClient'; +import env from '#start/env'; +import logger from '@adonisjs/core/services/logger'; +import { DateTime } from 'luxon'; +import pLimit from 'p-limit'; + +export default class ListUpdateableDatacite extends BaseCommand { + static commandName = 'list:updateable-datacite'; + static description = 'List all datasets that need DataCite DOI updates'; + + public static needsApplication = true; + + // private chunkSize = 100; // Set chunk size for pagination + + @flags.boolean({ alias: 'v', description: 'Verbose output showing detailed information' }) + public verbose: boolean = false; + + @flags.boolean({ alias: 'c', description: 'Show only count of updatable datasets' }) + public countOnly: boolean = false; + + @flags.boolean({ alias: 'i', description: 'Show only publish IDs (useful for scripting)' }) + public idsOnly: boolean = false; + + @flags.number({ description: 'Chunk size for processing datasets (default: 50)' }) + public chunkSize: number = 50; + + //example: node ace list:updateable-datacite + //example: node ace list:updateable-datacite --verbose + //example: node ace list:updateable-datacite --count-only + //example: node ace list:updateable-datacite --ids-only + //example: node ace list:updateable-datacite --chunk-size 50 + + public static options: CommandOptions = { + startApp: true, + stayAlive: false, + }; + + async run() { + const prefix = env.get('DATACITE_PREFIX', ''); + const base_domain = env.get('BASE_DOMAIN', ''); + + if (!prefix || !base_domain) { + logger.error('Missing DATACITE_PREFIX or BASE_DOMAIN environment variables'); + return; + } + + // Prevent conflicting flags + if ((this.verbose && this.countOnly) || (this.verbose && this.idsOnly)) { + logger.error('Flags --verbose cannot be combined with --count-only or --ids-only'); + return; + } + + const chunkSize = this.chunkSize || 50; + let page = 1; + let hasMoreDatasets = true; + let totalProcessed = 0; + const updatableDatasets: Dataset[] = []; + + if (!this.countOnly && !this.idsOnly) { + logger.info(`Processing datasets in chunks of ${chunkSize}...`); + } + + while (hasMoreDatasets) { + const datasets = await this.getDatasets(page, chunkSize); + + if (datasets.length === 0) { + hasMoreDatasets = false; + break; + } + + if (!this.countOnly && !this.idsOnly) { + logger.info(`Processing chunk ${page} (${datasets.length} datasets)...`); + } + + const chunkUpdatableDatasets = await this.processChunk(datasets); + updatableDatasets.push(...chunkUpdatableDatasets); + totalProcessed += datasets.length; + + page += 1; + if (datasets.length < chunkSize) { + hasMoreDatasets = false; + } + } + + if (!this.countOnly && !this.idsOnly) { + logger.info(`Processed ${totalProcessed} datasets total, found ${updatableDatasets.length} that need updates`); + } + + if (this.countOnly) { + console.log(updatableDatasets.length); + } else if (this.idsOnly) { + updatableDatasets.forEach((dataset) => console.log(dataset.publish_id)); + } else if (this.verbose) { + await this.showVerboseOutput(updatableDatasets); + } else { + this.showSimpleOutput(updatableDatasets); + } + } + + /** + * Processes a chunk of datasets to determine which ones need DataCite updates + * + * This method handles parallel processing of datasets within a chunk, providing + * efficient error handling and filtering of results. + * + * @param datasets - Array of Dataset objects to process + * @returns Promise<Dataset[]> - Array of datasets that need updates + */ + // private async processChunk(datasets: Dataset[]): Promise<Dataset[]> { + // // Process datasets in parallel using Promise.allSettled for better error handling + // // + // // Why Promise.allSettled vs Promise.all? + // // - Promise.all fails fast: if ANY promise rejects, the entire operation fails + // // - Promise.allSettled waits for ALL promises: some can fail, others succeed + // // - This is crucial for batch processing where we don't want one bad dataset + // // to stop processing of the entire chunk + // const results = await Promise.allSettled( + // datasets.map(async (dataset) => { + // try { + // // Check if this specific dataset needs a DataCite update + // const needsUpdate = await this.shouldUpdateDataset(dataset); + + // // Return the dataset if it needs update, null if it doesn't + // // This creates a sparse array that we'll filter later + // return needsUpdate ? dataset : null; + // } catch (error) { + // // Error handling for individual dataset checks + // // + // // Log warnings only if we're not in silent modes (count-only or ids-only) + // // This prevents log spam when running automated scripts + // if (!this.countOnly && !this.idsOnly) { + // logger.warn(`Error checking dataset ${dataset.publish_id}: ${error.message}`); + // } + + // // IMPORTANT DECISION: Return the dataset anyway if we can't determine status + // // + // // Why? It's safer to include a dataset that might not need updating + // // than to miss one that actually does need updating. This follows the + // // "fail-safe" principle - if we're unsure, err on the side of caution + // return dataset; + // } + // }), + // ); + + // // Filter and extract results from Promise.allSettled response + // // + // // Promise.allSettled returns an array of objects with this structure: + // // - { status: 'fulfilled', value: T } for successful promises + // // - { status: 'rejected', reason: Error } for failed promises + // // + // // We need to: + // // 1. Only get fulfilled results (rejected ones are already handled above) + // // 2. Filter out null values (datasets that don't need updates) + // // 3. Extract the actual Dataset objects from the wrapper + // return results + // .filter( + // (result): result is PromiseFulfilledResult<Dataset | null> => + // // Type guard: only include fulfilled results that have actual values + // // This filters out: + // // - Rejected promises (shouldn't happen due to try/catch, but safety first) + // // - Fulfilled promises that returned null (datasets that don't need updates) + // result.status === 'fulfilled' && result.value !== null, + // ) + // .map((result) => result.value!); // Extract the Dataset from the wrapper + // // The ! is safe here because we filtered out null values above + // } + + private async processChunk(datasets: Dataset[]): Promise<Dataset[]> { + // Limit concurrency to avoid API flooding (e.g., max 5 at once) + const limit = pLimit(5); + + const tasks = datasets.map((dataset) => + limit(async () => { + try { + const needsUpdate = await this.shouldUpdateDataset(dataset); + return needsUpdate ? dataset : null; + } catch (error) { + if (!this.countOnly && !this.idsOnly) { + logger.warn( + `Error checking dataset ${dataset.publish_id}: ${ + error instanceof Error ? error.message : JSON.stringify(error) + }`, + ); + } + // Fail-safe: include dataset if uncertain + return dataset; + } + }), + ); + + const results = await Promise.allSettled(tasks); + + return results + .filter((result): result is PromiseFulfilledResult<Dataset | null> => result.status === 'fulfilled' && result.value !== null) + .map((result) => result.value!); + } + + private async getDatasets(page: number, chunkSize: number): Promise<Dataset[]> { + return await Dataset.query() + .orderBy('publish_id', 'asc') + .preload('identifier') + .preload('xmlCache') + .preload('titles') + .where('server_state', 'published') + .whereHas('identifier', (identifierQuery) => { + identifierQuery.where('type', 'doi'); + }) + .forPage(page, chunkSize); // Get files for the current page + } + + private async shouldUpdateDataset(dataset: Dataset): Promise<boolean> { + try { + let doiIdentifier = dataset.identifier; + if (!doiIdentifier) { + await dataset.load('identifier'); + doiIdentifier = dataset.identifier; + } + + if (!doiIdentifier || doiIdentifier.type !== 'doi') { + return false; + } + + const datasetModified = + dataset.server_date_modified instanceof DateTime + ? dataset.server_date_modified + : DateTime.fromJSDate(dataset.server_date_modified); + + if (!datasetModified) { + return true; + } + + if (datasetModified > DateTime.now()) { + return false; + } + + const doiClient = new DoiClient(); + const DOI_CHECK_TIMEOUT = 300; // ms + + const doiLastModified = await Promise.race([ + doiClient.getDoiLastModified(doiIdentifier.value), + this.createTimeoutPromise(DOI_CHECK_TIMEOUT), + ]).catch(() => null); + + if (!doiLastModified) { + // If uncertain, better include dataset for update + return true; + } + + const doiModified = DateTime.fromJSDate(doiLastModified); + if (datasetModified > doiModified) { + const diffInSeconds = Math.abs(datasetModified.diff(doiModified, 'seconds').seconds); + const toleranceSeconds = 600; + return diffInSeconds > toleranceSeconds; + } + return false; + } catch (error) { + return true; // safer: include dataset if unsure + } + } + + /** + * Create a timeout promise for API calls + */ + private createTimeoutPromise(timeoutMs: number): Promise<never> { + return new Promise((_, reject) => { + setTimeout(() => reject(new Error(`API call timeout after ${timeoutMs}ms`)), timeoutMs); + }); + } + + private showSimpleOutput(updatableDatasets: Dataset[]): void { + if (updatableDatasets.length === 0) { + console.log('No datasets need DataCite updates.'); + return; + } + + console.log(`\nFound ${updatableDatasets.length} dataset(s) that need DataCite updates:\n`); + + updatableDatasets.forEach((dataset) => { + console.log(`publish_id ${dataset.publish_id} needs update - ${dataset.mainTitle || 'Untitled'}`); + }); + + console.log(`\nTo update these datasets, run:`); + console.log(` node ace update:datacite`); + console.log(`\nOr update specific datasets:`); + console.log(` node ace update:datacite -p <publish_id>`); + } + + private async showVerboseOutput(updatableDatasets: Dataset[]): Promise<void> { + if (updatableDatasets.length === 0) { + console.log('No datasets need DataCite updates.'); + return; + } + + console.log(`\nFound ${updatableDatasets.length} dataset(s) that need DataCite updates:\n`); + + for (const dataset of updatableDatasets) { + await this.showDatasetDetails(dataset); + } + + console.log(`\nSummary: ${updatableDatasets.length} datasets need updates`); + } + + private async showDatasetDetails(dataset: Dataset): Promise<void> { + try { + let doiIdentifier = dataset.identifier; + + if (!doiIdentifier) { + await dataset.load('identifier'); + doiIdentifier = dataset.identifier; + } + + const doiValue = doiIdentifier?.value || 'N/A'; + const datasetModified = dataset.server_date_modified; + + // Get DOI info from DataCite + const doiClient = new DoiClient(); + const doiLastModified = await doiClient.getDoiLastModified(doiValue); + const doiState = await doiClient.getDoiState(doiValue); + + console.log(`┌─ Dataset ${dataset.publish_id} ───────────────────────────────────────────────────────────────`); + console.log(`│ Title: ${dataset.mainTitle || 'Untitled'}`); + console.log(`│ DOI: ${doiValue}`); + console.log(`│ DOI State: ${doiState || 'Unknown'}`); + console.log(`│ Dataset Modified: ${datasetModified ? datasetModified.toISO() : 'N/A'}`); + console.log(`│ DOI Modified: ${doiLastModified ? DateTime.fromJSDate(doiLastModified).toISO() : 'N/A'}`); + console.log(`│ Status: NEEDS UPDATE`); + console.log(`└─────────────────────────────────────────────────────────────────────────────────────────────\n`); + } catch (error) { + console.log(`┌─ Dataset ${dataset.publish_id} ───────────────────────────────────────────────────────────────`); + console.log(`│ Title: ${dataset.mainTitle || 'Untitled'}`); + console.log(`│ DOI: ${dataset.identifier?.value || 'N/A'}`); + console.log(`│ Error: ${error.message}`); + console.log(`│ Status: NEEDS UPDATE (Error checking)`); + console.log(`└─────────────────────────────────────────────────────────────────────────────────────────────\n`); + } + } +} diff --git a/commands/update_datacite.ts b/commands/update_datacite.ts new file mode 100644 index 0000000..7ccb0f0 --- /dev/null +++ b/commands/update_datacite.ts @@ -0,0 +1,266 @@ +/* +|-------------------------------------------------------------------------- +| node ace make:command update-datacite +| DONE: create commands/update_datacite.ts +|-------------------------------------------------------------------------- +*/ +import { BaseCommand, flags } from '@adonisjs/core/ace'; +import { CommandOptions } from '@adonisjs/core/types/ace'; +import Dataset from '#models/dataset'; +import { DoiClient } from '#app/Library/Doi/DoiClient'; +import DoiClientException from '#app/exceptions/DoiClientException'; +import Index from '#app/Library/Utils/Index'; +import env from '#start/env'; +import logger from '@adonisjs/core/services/logger'; +import { DateTime } from 'luxon'; +import { getDomain } from '#app/utils/utility-functions'; + +export default class UpdateDatacite extends BaseCommand { + static commandName = 'update:datacite'; + static description = 'Update DataCite DOI records for published datasets'; + + public static needsApplication = true; + + @flags.number({ alias: 'p', description: 'Specific publish_id to update' }) + public publish_id: number; + + @flags.boolean({ alias: 'f', description: 'Force update all records regardless of modification date' }) + public force: boolean = false; + + @flags.boolean({ alias: 'd', description: 'Dry run - show what would be updated without making changes' }) + public dryRun: boolean = false; + + @flags.boolean({ alias: 's', description: 'Show detailed stats for each dataset that needs updating' }) + public stats: boolean = false; + + //example: node ace update:datacite -p 123 --force --dry-run + + public static options: CommandOptions = { + startApp: true, // Whether to boot the application before running the command + stayAlive: false, // Whether to keep the process alive after the command has executed + }; + + async run() { + logger.info('Starting DataCite update process...'); + + const prefix = env.get('DATACITE_PREFIX', ''); + const base_domain = env.get('BASE_DOMAIN', ''); + const apiUrl = env.get('DATACITE_API_URL', 'https://api.datacite.org'); + + if (!prefix || !base_domain) { + logger.error('Missing DATACITE_PREFIX or BASE_DOMAIN environment variables'); + return; + } + + logger.info(`Using DataCite API: ${apiUrl}`); + + const datasets = await this.getDatasets(); + logger.info(`Found ${datasets.length} datasets to process`); + + let updated = 0; + let skipped = 0; + let errors = 0; + + for (const dataset of datasets) { + try { + const shouldUpdate = this.force || (await this.shouldUpdateDataset(dataset)); + + if (this.stats) { + // Stats mode: show detailed information for datasets that need updating + if (shouldUpdate) { + await this.showDatasetStats(dataset); + updated++; + } else { + skipped++; + } + continue; + } + + if (!shouldUpdate) { + logger.info(`Dataset ${dataset.publish_id}: Up to date, skipping`); + skipped++; + continue; + } + + if (this.dryRun) { + logger.info(`Dataset ${dataset.publish_id}: Would update DataCite record (dry run)`); + updated++; + continue; + } + + await this.updateDataciteRecord(dataset, prefix, base_domain); + logger.info(`Dataset ${dataset.publish_id}: Successfully updated DataCite record`); + updated++; + } catch (error) { + logger.error(`Dataset ${dataset.publish_id}: Failed to update - ${error.message}`); + errors++; + } + } + + if (this.stats) { + logger.info(`\nDataCite Stats Summary: ${updated} datasets need updating, ${skipped} are up to date`); + } else { + logger.info(`DataCite update completed. Updated: ${updated}, Skipped: ${skipped}, Errors: ${errors}`); + } + } + + private async getDatasets(): Promise<Dataset[]> { + const query = Dataset.query() + .preload('identifier') + .preload('xmlCache') + .where('server_state', 'published') + .whereHas('identifier', (identifierQuery) => { + identifierQuery.where('type', 'doi'); + }); + + if (this.publish_id) { + query.where('publish_id', this.publish_id); + } + + return await query.exec(); + } + + private async shouldUpdateDataset(dataset: Dataset): Promise<boolean> { + try { + let doiIdentifier = dataset.identifier; + + if (!doiIdentifier) { + await dataset.load('identifier'); + doiIdentifier = dataset.identifier; + } + + if (!doiIdentifier || doiIdentifier.type !== 'doi') { + return false; + } + + const datasetModified = dataset.server_date_modified; + const now = DateTime.now(); + + if (!datasetModified) { + return true; // Update if modification date is missing + } + + if (datasetModified > now) { + return false; // Skip invalid future dates + } + + // Check DataCite DOI modification date + const doiClient = new DoiClient(); + const doiLastModified = await doiClient.getDoiLastModified(doiIdentifier.value); + + if (!doiLastModified) { + return false; // not Update if we can't get DOI info + } + + const doiModified = DateTime.fromJSDate(doiLastModified); + if (datasetModified > doiModified) { + // if dataset was modified after DOI creation + // Calculate the difference in seconds + const diffInSeconds = Math.abs(datasetModified.diff(doiModified, 'seconds').seconds); + + // Define tolerance threshold (60 seconds = 1 minute) + const toleranceSeconds = 60; + + // Only update if the difference is greater than the tolerance + // This prevents unnecessary updates for minor timestamp differences + return diffInSeconds > toleranceSeconds; + } else { + return false; // No update needed + } + } catch (error) { + return false; // not update if we can't determine status or other error + } + } + + private async updateDataciteRecord(dataset: Dataset, prefix: string, base_domain: string): Promise<void> { + try { + // Get the DOI identifier (HasOne relationship) + let doiIdentifier = dataset.identifier; + + if (!doiIdentifier) { + await dataset.load('identifier'); + doiIdentifier = dataset.identifier; + } + + if (!doiIdentifier || doiIdentifier.type !== 'doi') { + throw new Error('No DOI identifier found for dataset'); + } + + // Generate XML metadata + const xmlMeta = (await Index.getDoiRegisterString(dataset)) as string; + if (!xmlMeta) { + throw new Error('Failed to generate XML metadata'); + } + + // Construct DOI value and landing page URL + const doiValue = doiIdentifier.value; // Use existing DOI value + const landingPageUrl = `https://doi.${getDomain(base_domain)}/${doiValue}`; + + // Update DataCite record + const doiClient = new DoiClient(); + const dataciteResponse = await doiClient.registerDoi(doiValue, xmlMeta, landingPageUrl); + + if (dataciteResponse?.status === 201) { + // // Update dataset modification date + // dataset.server_date_modified = DateTime.now(); + // await dataset.save(); + + // // Update search index + // const index_name = 'tethys-records'; + // await Index.indexDocument(dataset, index_name); + + logger.debug(`Dataset ${dataset.publish_id}: DataCite record and search index updated successfully`); + } else { + throw new DoiClientException( + dataciteResponse?.status || 500, + `Unexpected DataCite response code: ${dataciteResponse?.status}`, + ); + } + } catch (error) { + if (error instanceof DoiClientException) { + throw error; + } + throw new Error(`Failed to update DataCite record: ${error.message}`); + } + } + + /** + * Shows detailed statistics for a dataset that needs updating + */ + private async showDatasetStats(dataset: Dataset): Promise<void> { + try { + let doiIdentifier = dataset.identifier; + + if (!doiIdentifier) { + await dataset.load('identifier'); + doiIdentifier = dataset.identifier; + } + + const doiValue = doiIdentifier?.value || 'N/A'; + const doiStatus = doiIdentifier?.status || 'N/A'; + const datasetModified = dataset.server_date_modified; + + // Get DOI info from DataCite + const doiClient = new DoiClient(); + const doiLastModified = await doiClient.getDoiLastModified(doiValue); + const doiState = await doiClient.getDoiState(doiValue); + + console.log(` + ┌─ Dataset ${dataset.publish_id} ─────────────────────────────────────────────────────────────── + │ DOI Value: ${doiValue} + │ DOI Status (DB): ${doiStatus} + │ DOI State (DataCite): ${doiState || 'Unknown'} + │ Dataset Modified: ${datasetModified ? datasetModified.toISO() : 'N/A'} + │ DOI Modified: ${doiLastModified ? DateTime.fromJSDate(doiLastModified).toISO() : 'N/A'} + │ Needs Update: YES - Dataset newer than DOI + └─────────────────────────────────────────────────────────────────────────────────────────────`); + } catch (error) { + console.log(` + ┌─ Dataset ${dataset.publish_id} ─────────────────────────────────────────────────────────────── + │ DOI Value: ${dataset.identifier?.value || 'N/A'} + │ Error: ${error.message} + │ Needs Update: YES - Error checking status + └─────────────────────────────────────────────────────────────────────────────────────────────`); + } + } +} diff --git a/commands/validate_checksum.ts b/commands/validate_checksum.ts index a2d8096..a11b38b 100644 --- a/commands/validate_checksum.ts +++ b/commands/validate_checksum.ts @@ -88,7 +88,7 @@ export default class ValidateChecksum extends BaseCommand { ); // Construct the file path - const filePath = '/storage/app/public/' + file.pathName; + const filePath = '/storage/app/data/' + file.pathName; try { // Calculate the MD5 checksum of the file diff --git a/components.d.ts b/components.d.ts index 3834bf1..001762d 100644 --- a/components.d.ts +++ b/components.d.ts @@ -11,3 +11,21 @@ declare module '@vue/runtime-core' { NInput: (typeof import('naive-ui'))['NInput']; } } + +// types/leaflet-src-dom-DomEvent.d.ts +declare module 'leaflet/src/dom/DomEvent' { + export type DomEventHandler = (e?: any) => void; + + // Attach event listeners. `obj` can be any DOM node or object with event handling. + export function on(obj: any, types: string, fn: DomEventHandler, context?: any): void; + + // Detach event listeners. + export function off(obj: any, types: string, fn?: DomEventHandler, context?: any): void; + + // Prevent default on native events + export function preventDefault(ev?: Event | undefined): void; + + // Optional: other helpers you might need later + export function stopPropagation(ev?: Event | undefined): void; + export function stop(ev?: Event | undefined): void; +} \ No newline at end of file diff --git a/config/app.ts b/config/app.ts index 23ad925..c0e7b2b 100644 --- a/config/app.ts +++ b/config/app.ts @@ -80,7 +80,8 @@ export const http = defineConfig({ | headers. | */ - trustProxy: proxyAddr.compile('loopback'), + // trustProxy: proxyAddr.compile('loopback'), + trustProxy: proxyAddr.compile(['127.0.0.1', '::1/128']), /* |-------------------------------------------------------------------------- diff --git a/config/bodyparser.ts b/config/bodyparser.ts index efc7dbb..b7c7d35 100644 --- a/config/bodyparser.ts +++ b/config/bodyparser.ts @@ -128,7 +128,7 @@ allowedMethods: ['POST', 'PUT', 'PATCH', 'DELETE'], | projects/:id/file | ``` */ - processManually: [], + processManually: ['/submitter/dataset/submit', '/submitter/dataset/:id/update'], /* |-------------------------------------------------------------------------- @@ -185,8 +185,8 @@ allowedMethods: ['POST', 'PUT', 'PATCH', 'DELETE'], | and fields data. | */ - // limit: '20mb', - limit: env.get('UPLOAD_LIMIT', '513mb'), + limit: '513mb', + //limit: env.get('UPLOAD_LIMIT', '513mb'), /* |-------------------------------------------------------------------------- diff --git a/config/database.ts b/config/database.ts index 87f302e..1c0fbdc 100644 --- a/config/database.ts +++ b/config/database.ts @@ -47,7 +47,7 @@ const databaseConfig = defineConfig({ migrations: { naturalSort: true, }, - healthCheck: false, + // healthCheck: false, debug: false, pool: { min: 1, max: 100 }, }, diff --git a/config/drive.ts b/config/drive.ts index 5679c62..cfb91f9 100644 --- a/config/drive.ts +++ b/config/drive.ts @@ -1,151 +1,45 @@ -/** - * Config source: https://git.io/JBt3o - * - * Feel free to let us know via PR, if you find something broken in this config - * file. - */ -import { defineConfig } from '#providers/drive/src/types/define_config'; -import env from '#start/env'; -// import { driveConfig } from '@adonisjs/core/build/config'; -// import { driveConfig } from "@adonisjs/drive/build/config.js"; -// import Application from '@ioc:Adonis/Core/Application'; +// import env from '#start/env' +// import app from '@adonisjs/core/services/app' +import { defineConfig, services } from '@adonisjs/drive' -/* -|-------------------------------------------------------------------------- -| Drive Config -|-------------------------------------------------------------------------- -| -| The `DriveConfig` relies on the `DisksList` interface which is -| defined inside the `contracts` directory. -| -*/ -export default defineConfig({ - /* - |-------------------------------------------------------------------------- - | Default disk - |-------------------------------------------------------------------------- - | - | The default disk to use for managing file uploads. The value is driven by - | the `DRIVE_DISK` environment variable. - | - */ - disk: env.get('DRIVE_DISK', 'local'), +const driveConfig = defineConfig({ + + default: 'public', + - disks: { - /* - |-------------------------------------------------------------------------- - | Local - |-------------------------------------------------------------------------- - | - | Uses the local file system to manage files. Make sure to turn off serving - | files when not using this disk. - | - */ - local: { - driver: 'local', - visibility: 'public', - - /* - |-------------------------------------------------------------------------- - | Storage root - Local driver only - |-------------------------------------------------------------------------- - | - | Define an absolute path to the storage directory from where to read the - | files. - | - */ - // root: Application.tmpPath('uploads'), - root: '/storage/app/public', - - /* - |-------------------------------------------------------------------------- - | Serve files - Local driver only - |-------------------------------------------------------------------------- - | - | When this is set to true, AdonisJS will configure a files server to serve - | files from the disk root. This is done to mimic the behavior of cloud - | storage services that has inbuilt capabilities to serve files. - | - */ - serveFiles: true, - - /* - |-------------------------------------------------------------------------- - | Base path - Local driver only - |-------------------------------------------------------------------------- - | - | Base path is always required when "serveFiles = true". Also make sure - | the `basePath` is unique across all the disks using "local" driver and - | you are not registering routes with this prefix. - | - */ - basePath: '/uploads', - }, - - /* - |-------------------------------------------------------------------------- - | S3 Driver - |-------------------------------------------------------------------------- - | - | Uses the S3 cloud storage to manage files. Make sure to install the s3 - | drive separately when using it. - | - |************************************************************************** - | npm i @adonisjs/drive-s3 - |************************************************************************** - | - */ - // s3: { - // driver: 's3', - // visibility: 'public', - // key: Env.get('S3_KEY'), - // secret: Env.get('S3_SECRET'), - // region: Env.get('S3_REGION'), - // bucket: Env.get('S3_BUCKET'), - // endpoint: Env.get('S3_ENDPOINT'), - // - // // For minio to work - // // forcePathStyle: true, - // }, - - /* - |-------------------------------------------------------------------------- - | GCS Driver - |-------------------------------------------------------------------------- - | - | Uses the Google cloud storage to manage files. Make sure to install the GCS - | drive separately when using it. - | - |************************************************************************** - | npm i @adonisjs/drive-gcs - |************************************************************************** - | - */ - // gcs: { - // driver: 'gcs', - // visibility: 'public', - // keyFilename: Env.get('GCS_KEY_FILENAME'), - // bucket: Env.get('GCS_BUCKET'), - - /* - |-------------------------------------------------------------------------- - | Uniform ACL - Google cloud storage only - |-------------------------------------------------------------------------- - | - | When using the Uniform ACL on the bucket, the "visibility" option is - | ignored. Since, the files ACL is managed by the google bucket policies - | directly. - | - |************************************************************************** - | Learn more: https://cloud.google.com/storage/docs/uniform-bucket-level-access - |************************************************************************** - | - | The following option just informs drive whether your bucket is using uniform - | ACL or not. The actual setting needs to be toggled within the Google cloud - | console. - | - */ - // usingUniformAcl: false, - // }, + services: { + + /** + * Persist files on the local filesystem + */ + public: services.fs({ + location: '/storage/app/public/', + serveFiles: true, + routeBasePath: '/public', + visibility: 'public', + }), + local: services.fs({ + location: '/storage/app/data/', + serveFiles: true, + routeBasePath: '/data', + visibility: 'public', + }), + + + /** + * Persist files on Digital Ocean spaces + */ + // spaces: services.s3({ + // credentials: { + // accessKeyId: env.get('SPACES_KEY'), + // secretAccessKey: env.get('SPACES_SECRET'), + // }, + // region: env.get('SPACES_REGION'), + // bucket: env.get('SPACES_BUCKET'), + // endpoint: env.get('SPACES_ENDPOINT'), + // visibility: 'public', + // }), }, -}); + }) + + export default driveConfig \ No newline at end of file diff --git a/config/drive_self.ts b/config/drive_self.ts new file mode 100644 index 0000000..f1c8152 --- /dev/null +++ b/config/drive_self.ts @@ -0,0 +1,233 @@ +/** + * Config source: https://git.io/JBt3o + * + * Feel free to let us know via PR, if you find something broken in this config + * file. + */ +import { defineConfig } from '#providers/drive/src/types/define_config'; +import env from '#start/env'; +// import { driveConfig } from '@adonisjs/core/build/config'; +// import { driveConfig } from "@adonisjs/drive/build/config.js"; +// import Application from '@ioc:Adonis/Core/Application'; + +/* +|-------------------------------------------------------------------------- +| Drive Config +|-------------------------------------------------------------------------- +| +| The `DriveConfig` relies on the `DisksList` interface which is +| defined inside the `contracts` directory. +| +*/ +export default defineConfig({ + /* + |-------------------------------------------------------------------------- + | Default disk + |-------------------------------------------------------------------------- + | + | The default disk to use for managing file uploads. The value is driven by + | the `DRIVE_DISK` environment variable. + | + */ + disk: env.get('DRIVE_DISK', 'local'), + + disks: { + /* + |-------------------------------------------------------------------------- + | Local + |-------------------------------------------------------------------------- + | + | Uses the local file system to manage files. Make sure to turn off serving + | files when not using this disk. + | + */ + local: { + driver: 'local', + visibility: 'public', + + /* + |-------------------------------------------------------------------------- + | Storage root - Local driver only + |-------------------------------------------------------------------------- + | + | Define an absolute path to the storage directory from where to read the + | files. + | + */ + // root: Application.tmpPath('uploads'), + root: '/storage/app/data', + + /* + |-------------------------------------------------------------------------- + | Serve files - Local driver only + |-------------------------------------------------------------------------- + | + | When this is set to true, AdonisJS will configure a files server to serve + | files from the disk root. This is done to mimic the behavior of cloud + | storage services that has inbuilt capabilities to serve files. + | + */ + serveFiles: true, + + /* + |-------------------------------------------------------------------------- + | Base path - Local driver only + |-------------------------------------------------------------------------- + | + | Base path is always required when "serveFiles = true". Also make sure + | the `basePath` is unique across all the disks using "local" driver and + | you are not registering routes with this prefix. + | + */ + basePath: '/files', + }, + + local: { + driver: 'local', + visibility: 'public', + + /* + |-------------------------------------------------------------------------- + | Storage root - Local driver only + |-------------------------------------------------------------------------- + | + | Define an absolute path to the storage directory from where to read the + | files. + | + */ + // root: Application.tmpPath('uploads'), + root: '/storage/app/data', + + /* + |-------------------------------------------------------------------------- + | Serve files - Local driver only + |-------------------------------------------------------------------------- + | + | When this is set to true, AdonisJS will configure a files server to serve + | files from the disk root. This is done to mimic the behavior of cloud + | storage services that has inbuilt capabilities to serve files. + | + */ + serveFiles: true, + + /* + |-------------------------------------------------------------------------- + | Base path - Local driver only + |-------------------------------------------------------------------------- + | + | Base path is always required when "serveFiles = true". Also make sure + | the `basePath` is unique across all the disks using "local" driver and + | you are not registering routes with this prefix. + | + */ + basePath: '/files', + }, + + fs: { + driver: 'local', + visibility: 'public', + + /* + |-------------------------------------------------------------------------- + | Storage root - Local driver only + |-------------------------------------------------------------------------- + | + | Define an absolute path to the storage directory from where to read the + | files. + | + */ + // root: Application.tmpPath('uploads'), + root: '/storage/app/public', + + /* + |-------------------------------------------------------------------------- + | Serve files - Local driver only + |-------------------------------------------------------------------------- + | + | When this is set to true, AdonisJS will configure a files server to serve + | files from the disk root. This is done to mimic the behavior of cloud + | storage services that has inbuilt capabilities to serve files. + | + */ + serveFiles: true, + + /* + |-------------------------------------------------------------------------- + | Base path - Local driver only + |-------------------------------------------------------------------------- + | + | Base path is always required when "serveFiles = true". Also make sure + | the `basePath` is unique across all the disks using "local" driver and + | you are not registering routes with this prefix. + | + */ + basePath: '/public', + }, + + /* + |-------------------------------------------------------------------------- + | S3 Driver + |-------------------------------------------------------------------------- + | + | Uses the S3 cloud storage to manage files. Make sure to install the s3 + | drive separately when using it. + | + |************************************************************************** + | npm i @adonisjs/drive-s3 + |************************************************************************** + | + */ + // s3: { + // driver: 's3', + // visibility: 'public', + // key: Env.get('S3_KEY'), + // secret: Env.get('S3_SECRET'), + // region: Env.get('S3_REGION'), + // bucket: Env.get('S3_BUCKET'), + // endpoint: Env.get('S3_ENDPOINT'), + // + // // For minio to work + // // forcePathStyle: true, + // }, + + /* + |-------------------------------------------------------------------------- + | GCS Driver + |-------------------------------------------------------------------------- + | + | Uses the Google cloud storage to manage files. Make sure to install the GCS + | drive separately when using it. + | + |************************************************************************** + | npm i @adonisjs/drive-gcs + |************************************************************************** + | + */ + // gcs: { + // driver: 'gcs', + // visibility: 'public', + // keyFilename: Env.get('GCS_KEY_FILENAME'), + // bucket: Env.get('GCS_BUCKET'), + + /* + |-------------------------------------------------------------------------- + | Uniform ACL - Google cloud storage only + |-------------------------------------------------------------------------- + | + | When using the Uniform ACL on the bucket, the "visibility" option is + | ignored. Since, the files ACL is managed by the google bucket policies + | directly. + | + |************************************************************************** + | Learn more: https://cloud.google.com/storage/docs/uniform-bucket-level-access + |************************************************************************** + | + | The following option just informs drive whether your bucket is using uniform + | ACL or not. The actual setting needs to be toggled within the Google cloud + | console. + | + */ + // usingUniformAcl: false, + // }, + }, +}); diff --git a/config/inertia.ts b/config/inertia.ts index bcbd170..1bbab4b 100644 --- a/config/inertia.ts +++ b/config/inertia.ts @@ -1,7 +1,9 @@ import { defineConfig } from '@adonisjs/inertia'; import type { HttpContext } from '@adonisjs/core/http'; +import type { InferSharedProps } from '@adonisjs/inertia/types'; +import env from '#start/env'; -export default defineConfig({ +const inertiaConfig = defineConfig({ /** * Path to the Edge view that will be used as the root view for Inertia responses */ @@ -20,6 +22,8 @@ export default defineConfig({ return ctx.session?.flashMessages.get('user_id'); }, + opensearch_host: env.get('OPENSEARCH_HOST'), + flash: (ctx) => { return { message: ctx.session?.flashMessages.get('message'), @@ -30,15 +34,15 @@ export default defineConfig({ // params: ({ params }) => params, authUser: async ({ auth }: HttpContext) => { - if (auth?.user) { - await auth.user.load('roles'); - return auth.user; - // { - // 'id': auth.user.id, - // 'login': auth.user.login, - // }; - } else { - return null; + if (!auth?.user) return null + await auth.user.load('roles') // sicherstellen, dass geladen ist + return { + id: auth.user.id, + login: auth.user.login, + email: auth.user.email, + first_name: auth.user.first_name, + last_name: auth.user.last_name, + roles: auth.user.roles.map((role) => role.name), } }, }, @@ -52,6 +56,12 @@ export default defineConfig({ }, }); +export default inertiaConfig + +declare module '@adonisjs/inertia/types' { + export interface SharedProps extends InferSharedProps<typeof inertiaConfig> { } +} + // import { InertiaConfig } from '@ioc:EidelLev/Inertia'; // /* diff --git a/config/mail.ts b/config/mail.ts index 909dec2..a97489f 100644 --- a/config/mail.ts +++ b/config/mail.ts @@ -12,11 +12,11 @@ const mailConfig = defineConfig({ mailers: { smtp: transports.smtp({ - socketTimeout: 5000,// Overall timeout (5 seconds) + // socketTimeout: 5000,// Overall timeout (5 seconds) host: env.get('SMTP_HOST', ''), port: env.get('SMTP_PORT'), secure: false, - // ignoreTLS: true, + ignoreTLS: true, requireTLS: false, /** @@ -30,10 +30,10 @@ const mailConfig = defineConfig({ }, */ }), - resend: transports.resend({ - key: env.get('RESEND_API_KEY'), - baseUrl: 'https://api.resend.com', - }), + // resend: transports.resend({ + // key: env.get('RESEND_API_KEY'), + // baseUrl: 'https://api.resend.com', + // }), }, }); diff --git a/config/session.ts b/config/session.ts index dafbad2..162921a 100644 --- a/config/session.ts +++ b/config/session.ts @@ -6,7 +6,7 @@ */ import env from '#start/env'; -import app from '@adonisjs/core/services/app'; +// import app from '@adonisjs/core/services/app'; import { defineConfig, stores } from '@adonisjs/session'; const sessionConfig = defineConfig({ @@ -96,7 +96,7 @@ const sessionConfig = defineConfig({ * variable in order to infer the store name without any * errors. */ - store: env.get('SESSION_DRIVER'), + store: 'file', //env.get('SESSION_DRIVER'), /* |-------------------------------------------------------------------------- | Configuration for the file driver @@ -122,6 +122,9 @@ const sessionConfig = defineConfig({ // redisConnection: 'local', stores: { cookie: stores.cookie(), + file: stores.file({ + location: './tmp/sessions', // Where the data will live + }), }, }); export default sessionConfig; diff --git a/config/vite.ts b/config/vite.ts new file mode 100644 index 0000000..4969e53 --- /dev/null +++ b/config/vite.ts @@ -0,0 +1,32 @@ +import { defineConfig } from '@adonisjs/vite'; + +const viteBackendConfig = defineConfig({ + /** + * The output of vite will be written inside this + * directory. The path should be relative from + * the application root. + */ + buildDirectory: 'public/assets', + + /** + * The path to the manifest file generated by the + * "vite build" command. + */ + manifestFile: 'public/assets/.vite/manifest.json', + + /** + * Feel free to change the value of the "assetsUrl" to + * point to a CDN in production. + */ + assetsUrl: '/assets', + + /** + * Add defer attribute to scripts for better performance. + */ + scriptAttributes: { + defer: true, + }, + +}); + +export default viteBackendConfig; diff --git a/contracts/enums.ts b/contracts/enums.ts index 68ec4d9..5772570 100644 --- a/contracts/enums.ts +++ b/contracts/enums.ts @@ -21,6 +21,7 @@ export enum ServerStates { rejected_reviewer = 'rejected_reviewer', rejected_editor = 'rejected_editor', reviewed = 'reviewed', + rejected_to_reviewer = 'rejected_to_reviewer', } // for table dataset_titles diff --git a/database/factories/create_collections_data_ccs.sql b/database/factories/create_collections_data_ccs.sql new file mode 100644 index 0000000..e6b14df --- /dev/null +++ b/database/factories/create_collections_data_ccs.sql @@ -0,0 +1,1472 @@ +-- ACM Computing Classification System (CCS) — a widely used system for classifying academic literature in computer science and related disciplines. +/* The main classes are: see number at db +A. General Literature +B. Hardware +C. Computer Systems Organization +D. Software +E. Data +F. Theory of Computation +G. Mathematics of Computing +H. Information Systems +I. Computing Methodologies +J. Computer Applications +K. Computing Milieux + +These classes help in organizing research papers, indexing databases, and guiding publication categorization +*/ +INSERT INTO collections (id, role_id, number, name, oai_subset, left_id, right_id, parent_id, visible, visible_publish) VALUES +(1030,3,'A.','General Literature','A.',2,17,NULL,1,1), +(1031,3,'B.','Hardware','B.',18,379,NULL,1,1), +(1032,3,'C.','Computer Systems Organization','C.',380,567,NULL,1,1), +(1033,3,'D.','Software','D.',568,1035,NULL,1,1), +(1034,3,'E.','Data','E.',1036,1101,NULL,1,1), +(1035,3,'F.','Theory of Computation','F.',1102,1291,NULL,1,1), +(1036,3,'G.','Mathematics of Computing','G.',1292,1587,NULL,1,1), +(1037,3,'H.','Information Systems','H.',1588,1919,NULL,1,1), +(1038,3,'I.','Computing Methodologies','I.',1920,2537,NULL,1,1), +(1039,3,'J.','Computer Applications','J.',2538,2637,NULL,1,1), +(1040,3,'K.','Computing Milieux','K.',2638,2911,NULL,1,1), +(1041,3,'A.0','GENERAL','A.0',3,10,1030,1,1), +(1042,3,'A.1','INTRODUCTORY AND SURVEY','A.1',11,12,1030,1,1), +(1043,3,'A.2','REFERENCE (e.g., dictionaries, encyclopedias, glossaries)','A.2',13,14,1030,1,1), +(1044,3,'A.m','MISCELLANEOUS','A.m',15,16,1030,1,1), +(1045,3,'B.0','GENERAL','B.0',19,20,1031,1,1), +(1046,3,'B.1','CONTROL STRUCTURES AND MICROPROGRAMMING (D.3.2)','B.1',21,76,1031,1,1), +(1047,3,'B.2','ARITHMETIC AND LOGIC STRUCTURES','B.2',77,114,1031,1,1), +(1048,3,'B.3','MEMORY STRUCTURES','B.3',115,164,1031,1,1), +(1049,3,'B.4','INPUT/OUTPUT AND DATA COMMUNICATIONS','B.4',165,226,1031,1,1), +(1050,3,'B.5','REGISTER-TRANSFER-LEVEL IMPLEMENTATION','B.5',227,268,1031,1,1), +(1051,3,'B.6','LOGIC DESIGN','B.6',269,316,1031,1,1), +(1052,3,'B.7','INTEGRATED CIRCUITS','B.7',317,364,1031,1,1), +(1053,3,'B.8','PERFORMANCE AND RELIABILITY (C.4) (NEW)','B.8',365,374,1031,1,1), +(1054,3,'B.m','MISCELLANEOUS','B.m',375,378,1031,1,1), +(1055,3,'C.0','GENERAL','C.0',381,382,1032,1,1), +(1056,3,'C.1','PROCESSOR ARCHITECTURES','C.1',383,450,1032,1,1), +(1057,3,'C.2','COMPUTER-COMMUNICATION NETWORKS','C.2',451,534,1032,1,1), +(1058,3,'C.3','SPECIAL-PURPOSE AND APPLICATION-BASED SYSTEMS (J.7)','C.3',535,536,1032,1,1), +(1059,3,'C.4','PERFORMANCE OF SYSTEMS','C.4',537,538,1032,1,1), +(1060,3,'C.5','COMPUTER SYSTEM IMPLEMENTATION','C.5',539,564,1032,1,1), +(1061,3,'C.m','MISCELLANEOUS','C.m',565,566,1032,1,1), +(1062,3,'D.0','GENERAL','D.0',569,570,1033,1,1), +(1063,3,'D.1','PROGRAMMING TECHNIQUES (E)','D.1',571,594,1033,1,1), +(1064,3,'D.2','SOFTWARE ENGINEERING (K.6.3)','D.2',595,796,1033,1,1), +(1065,3,'D.3','PROGRAMMING LANGUAGES','D.3',797,900,1033,1,1), +(1066,3,'D.4','OPERATING SYSTEMS (C)','D.4',901,1030,1033,1,1), +(1067,3,'D.m','MISCELLANEOUS','D.m',1031,1034,1033,1,1), +(1068,3,'E.0','GENERAL','E.0',1037,1038,1034,1,1), +(1069,3,'E.1','DATA STRUCTURES','E.1',1039,1054,1034,1,1), +(1070,3,'E.2','DATA STORAGE REPRESENTATIONS','E.2',1055,1068,1034,1,1), +(1071,3,'E.3','DATA ENCRYPTION','E.3',1069,1078,1034,1,1), +(1072,3,'E.4','CODING AND INFORMATION THEORY (H.1.1)','E.4',1079,1088,1034,1,1), +(1073,3,'E.5','FILES (D.4.3, F.2.2, H.2)','E.5',1089,1098,1034,1,1), +(1074,3,'E.m','MISCELLANEOUS','E.m',1099,1100,1034,1,1), +(1075,3,'F.0','GENERAL','F.0',1103,1104,1035,1,1), +(1076,3,'F.1','COMPUTATION BY ABSTRACT DEVICES','F.1',1105,1152,1035,1,1), +(1077,3,'F.2','ANALYSIS OF ALGORITHMS AND PROBLEM COMPLEXITY (B.6-7, F.1.3)','F.2',1153,1188,1035,1,1), +(1078,3,'F.3','LOGICS AND MEANINGS OF PROGRAMS','F.3',1189,1234,1035,1,1), +(1079,3,'F.4','MATHEMATICAL LOGIC AND FORMAL LANGUAGES','F.4',1235,1288,1035,1,1), +(1080,3,'F.m','MISCELLANEOUS','F.m',1289,1290,1035,1,1), +(1081,3,'G.0','GENERAL','G.0',1293,1294,1036,1,1), +(1082,3,'G.1','NUMERICAL ANALYSIS','G.1',1295,1490,1036,1,1), +(1083,3,'G.2','DISCRETE MATHEMATICS','G.2',1491,1524,1036,1,1), +(1084,3,'G.3','PROBABILITY AND STATISTICS','G.3',1525,1562,1036,1,1), +(1085,3,'G.4','MATHEMATICAL SOFTWARE','G.4',1563,1582,1036,1,1), +(1086,3,'G.m','MISCELLANEOUS','G.m',1583,1586,1036,1,1), +(1087,3,'H.0','GENERAL','H.0',1589,1590,1037,1,1), +(1088,3,'H.1','MODELS AND PRINCIPLES','H.1',1591,1612,1037,1,1), +(1089,3,'H.2','DATABASE MANAGEMENT (E.5)','H.2',1613,1700,1037,1,1), +(1090,3,'H.3','INFORMATION STORAGE AND RETRIEVAL','H.3',1701,1778,1037,1,1), +(1091,3,'H.4','INFORMATION SYSTEMS APPLICATIONS','H.4',1779,1818,1037,1,1), +(1092,3,'H.5','INFORMATION INTERFACES AND PRESENTATION (e.g., HCI) (I.7)','H.5',1819,1916,1037,1,1), +(1093,3,'H.m','MISCELLANEOUS','H.m',1917,1918,1037,1,1), +(1094,3,'I.0','GENERAL','I.0',1921,1922,1038,1,1), +(1095,3,'I.1','SYMBOLIC AND ALGEBRAIC MANIPULATION (REVISED)','I.1',1923,1956,1038,1,1), +(1096,3,'I.2','ARTIFICIAL INTELLIGENCE','I.2',1957,2132,1038,1,1), +(1097,3,'I.3','COMPUTER GRAPHICS','I.3',2133,2252,1038,1,1), +(1098,3,'I.4','IMAGE PROCESSING AND COMPUTER VISION (REVISED)','I.4',2253,2382,1038,1,1), +(1099,3,'I.5','PATTERN RECOGNITION','I.5',2383,2432,1038,1,1), +(1100,3,'I.6','SIMULATION AND MODELING (G.3)','I.6',2433,2482,1038,1,1), +(1101,3,'I.7','DOCUMENT AND TEXT PROCESSING (H.4-5) (REVISED)','I.7',2483,2534,1038,1,1), +(1102,3,'I.m','MISCELLANEOUS','I.m',2535,2536,1038,1,1), +(1103,3,'J.0','GENERAL','J.0',2539,2540,1039,1,1), +(1104,3,'J.1','ADMINISTRATIVE DATA PROCESSING','J.1',2541,2558,1039,1,1), +(1105,3,'J.2','PHYSICAL SCIENCES AND ENGINEERING','J.2',2559,2578,1039,1,1), +(1106,3,'J.3','LIFE AND MEDICAL SCIENCES','J.3',2579,2586,1039,1,1), +(1107,3,'J.4','SOCIAL AND BEHAVIORAL SCIENCES','J.4',2587,2594,1039,1,1), +(1108,3,'J.5','ARTS AND HUMANITIES','J.5',2595,2612,1039,1,1), +(1109,3,'J.6','COMPUTER-AIDED ENGINEERING','J.6',2613,2618,1039,1,1), +(1110,3,'J.7','COMPUTERS IN OTHER SYSTEMS (C.3)','J.7',2619,2634,1039,1,1), +(1111,3,'J.m','MISCELLANEOUS','J.m',2635,2636,1039,1,1), +(1112,3,'K.0','GENERAL','K.0',2639,2640,1040,1,1), +(1113,3,'K.1','THE COMPUTER INDUSTRY','K.1',2641,2650,1040,1,1), +(1114,3,'K.2','HISTORY OF COMPUTING','K.2',2651,2662,1040,1,1), +(1115,3,'K.3','COMPUTERS AND EDUCATION','K.3',2663,2696,1040,1,1), +(1116,3,'K.4','COMPUTERS AND SOCIETY','K.4',2697,2756,1040,1,1), +(1117,3,'K.5','LEGAL ASPECTS OF COMPUTING','K.5',2757,2786,1040,1,1), +(1118,3,'K.6','MANAGEMENT OF COMPUTING AND INFORMATION SYSTEMS','K.6',2787,2856,1040,1,1), +(1119,3,'K.7','THE COMPUTING PROFESSION','K.7',2857,2880,1040,1,1), +(1120,3,'K.8','PERSONAL COMPUTING','K.8',2881,2908,1040,1,1), +(1121,3,'K.m','MISCELLANEOUS','K.m',2909,2910,1040,1,1), +(1122,3,NULL,'Biographies/autobiographies',NULL,4,5,1041,1,1), +(1123,3,NULL,'Conference proceedings',NULL,6,7,1041,1,1), +(1124,3,NULL,'General literary works (e.g., fiction, plays)',NULL,8,9,1041,1,1), +(1125,3,'B.1.0','General','B.1.0',22,23,1046,1,1), +(1126,3,'B.1.1','Control Design Styles','B.1.1',24,31,1046,1,1), +(1127,3,NULL,'Hardwired control**',NULL,25,26,1126,1,1), +(1128,3,NULL,'Microprogrammed logic arrays**',NULL,27,28,1126,1,1), +(1129,3,NULL,'Writable control store**',NULL,29,30,1126,1,1), +(1130,3,'B.1.2','Control Structure Performance Analysis and Design Aids','B.1.2',32,39,1046,1,1), +(1131,3,NULL,'Automatic synthesis**',NULL,33,34,1130,1,1), +(1132,3,NULL,'Formal models**',NULL,35,36,1130,1,1), +(1133,3,NULL,'Simulation**',NULL,37,38,1130,1,1), +(1134,3,'B.1.3','Control Structure Reliability, Testing, and Fault-Tolerance** (B.8)','B.1.3',40,49,1046,1,1), +(1135,3,NULL,'Diagnostics**',NULL,41,42,1134,1,1), +(1136,3,NULL,'Error-checking**',NULL,43,44,1134,1,1), +(1137,3,NULL,'Redundant design**',NULL,45,46,1134,1,1), +(1138,3,NULL,'Test generation**',NULL,47,48,1134,1,1), +(1139,3,'B.1.4','Microprogram Design Aids (D.2.2, D.2.4, D.3.2, D.3.4)','B.1.4',50,61,1046,1,1), +(1140,3,NULL,'Firmware engineering**',NULL,51,52,1139,1,1), +(1141,3,NULL,'Languages and compilers',NULL,53,54,1139,1,1), +(1142,3,NULL,'Machine-independent microcode generation**',NULL,55,56,1139,1,1), +(1143,3,NULL,'Optimization',NULL,57,58,1139,1,1), +(1144,3,NULL,'Verification**',NULL,59,60,1139,1,1), +(1145,3,'B.1.5','Microcode Applications','B.1.5',62,73,1046,1,1), +(1146,3,NULL,'Direct data manipulation**',NULL,63,64,1145,1,1), +(1147,3,NULL,'Firmware support of operating systems/instruction sets**',NULL,65,66,1145,1,1), +(1148,3,NULL,'Instruction set interpretation',NULL,67,68,1145,1,1), +(1149,3,NULL,'Peripheral control**',NULL,69,70,1145,1,1), +(1150,3,NULL,'Special-purpose**',NULL,71,72,1145,1,1), +(1151,3,'B.1.m','Miscellaneous','B.1.m',74,75,1046,1,1), +(1152,3,'B.2.0','General','B.2.0',78,79,1047,1,1), +(1153,3,'B.2.1','Design Styles (C.1.1-2)','B.2.1',80,87,1047,1,1), +(1154,3,NULL,'Calculator**',NULL,81,82,1153,1,1), +(1155,3,NULL,'Parallel',NULL,83,84,1153,1,1), +(1156,3,NULL,'Pipeline',NULL,85,86,1153,1,1), +(1157,3,'B.2.2','Performance Analysis and Design Aids** (B.8)','B.2.2',88,95,1047,1,1), +(1158,3,NULL,'Simulation**',NULL,89,90,1157,1,1), +(1159,3,NULL,'Verification**',NULL,91,92,1157,1,1), +(1160,3,NULL,'Worst-case analysis**',NULL,93,94,1157,1,1), +(1161,3,'B.2.3','Reliability, Testing, and Fault-Tolerance** (B.8)','B.2.3',96,105,1047,1,1), +(1162,3,NULL,'Diagnostics**',NULL,97,98,1161,1,1), +(1163,3,NULL,'Error-checking**',NULL,99,100,1161,1,1), +(1164,3,NULL,'Redundant design**',NULL,101,102,1161,1,1), +(1165,3,NULL,'Test generation**',NULL,103,104,1161,1,1), +(1166,3,'B.2.4','High-Speed Arithmetic (NEW)','B.2.4',106,111,1047,1,1), +(1167,3,NULL,'Algorithms (NEW)',NULL,107,108,1166,1,1), +(1168,3,NULL,'Cost/performance (NEW)',NULL,109,110,1166,1,1), +(1169,3,'B.2.m','Miscellaneous','B.2.m',112,113,1047,1,1), +(1170,3,'B.3.0','General','B.3.0',116,117,1048,1,1), +(1171,3,'B.3.1','Semiconductor Memories (NEW) (B.7.1)','B.3.1',118,125,1048,1,1), +(1172,3,NULL,'Dynamic memory (DRAM) (NEW)',NULL,119,120,1171,1,1), +(1173,3,NULL,'Read-only memory (ROM) (NEW)',NULL,121,122,1171,1,1), +(1174,3,NULL,'Static memory (SRAM) (NEW)',NULL,123,124,1171,1,1), +(1175,3,'B.3.2','Design Styles (D.4.2)','B.3.2',126,143,1048,1,1), +(1176,3,NULL,'Associative memories',NULL,127,128,1175,1,1), +(1177,3,NULL,'Cache memories',NULL,129,130,1175,1,1), +(1178,3,NULL,'Interleaved memories**',NULL,131,132,1175,1,1), +(1179,3,NULL,'Mass storage (e.g., magnetic, optical, RAID) (REVISED)',NULL,133,134,1175,1,1), +(1180,3,NULL,'Primary memory',NULL,135,136,1175,1,1), +(1181,3,NULL,'Sequential-access memory**',NULL,137,138,1175,1,1), +(1182,3,NULL,'Shared memory',NULL,139,140,1175,1,1), +(1183,3,NULL,'Virtual memory',NULL,141,142,1175,1,1), +(1184,3,'B.3.3','Performance Analysis and Design Aids** (B.8, C.4)','B.3.3',144,151,1048,1,1), +(1185,3,NULL,'Formal models**',NULL,145,146,1184,1,1), +(1186,3,NULL,'Simulation**',NULL,147,148,1184,1,1), +(1187,3,NULL,'Worst-case analysis**',NULL,149,150,1184,1,1), +(1188,3,'B.3.4','Reliability, Testing, and Fault-Tolerance** (B.8)','B.3.4',152,161,1048,1,1), +(1189,3,NULL,'Diagnostics**',NULL,153,154,1188,1,1), +(1190,3,NULL,'Error-checking**',NULL,155,156,1188,1,1), +(1191,3,NULL,'Redundant design**',NULL,157,158,1188,1,1), +(1192,3,NULL,'Test generation**',NULL,159,160,1188,1,1), +(1193,3,'B.3.m','Miscellaneous','B.3.m',162,163,1048,1,1), +(1194,3,'B.4.0','General','B.4.0',166,167,1049,1,1), +(1195,3,'B.4.1','Data Communications Devices','B.4.1',168,175,1049,1,1), +(1196,3,NULL,'Processors**',NULL,169,170,1195,1,1), +(1197,3,NULL,'Receivers (e.g., voice, data, image)**',NULL,171,172,1195,1,1), +(1198,3,NULL,'Transmitters**',NULL,173,174,1195,1,1), +(1199,3,'B.4.2','Input/Output Devices','B.4.2',176,185,1049,1,1), +(1200,3,NULL,'Channels and controllers',NULL,177,178,1199,1,1), +(1201,3,NULL,'Data terminals and printers',NULL,179,180,1199,1,1), +(1202,3,NULL,'Image display',NULL,181,182,1199,1,1), +(1203,3,NULL,'Voice',NULL,183,184,1199,1,1), +(1204,3,'B.4.3','Interconnections (Subsystems)','B.4.3',186,199,1049,1,1), +(1205,3,NULL,'Asynchronous/synchronous operation',NULL,187,188,1204,1,1), +(1206,3,NULL,'Fiber optics',NULL,189,190,1204,1,1), +(1207,3,NULL,'Interfaces',NULL,191,192,1204,1,1), +(1208,3,NULL,'Parallel I/O (NEW)',NULL,193,194,1204,1,1), +(1209,3,NULL,'Physical structures (e.g., backplanes, cables, chip carriers)**',NULL,195,196,1204,1,1), +(1210,3,NULL,'Topology (e.g., bus, point-to-point)',NULL,197,198,1204,1,1), +(1211,3,'B.4.4','Performance Analysis and Design Aids** (B.8)','B.4.4',200,209,1049,1,1), +(1212,3,NULL,'Formal models**',NULL,201,202,1211,1,1), +(1213,3,NULL,'Simulation**',NULL,203,204,1211,1,1), +(1214,3,NULL,'Verification**',NULL,205,206,1211,1,1), +(1215,3,NULL,'Worst-case analysis**',NULL,207,208,1211,1,1), +(1216,3,'B.4.5','Reliability, Testing, and Fault-Tolerance** (B.8)','B.4.5',210,223,1049,1,1), +(1217,3,NULL,'Built-in tests**',NULL,211,212,1216,1,1), +(1218,3,NULL,'Diagnostics**',NULL,213,214,1216,1,1), +(1219,3,NULL,'Error-checking**',NULL,215,216,1216,1,1), +(1220,3,NULL,'Hardware reliability**',NULL,217,218,1216,1,1), +(1221,3,NULL,'Redundant design**',NULL,219,220,1216,1,1), +(1222,3,NULL,'Test generation**',NULL,221,222,1216,1,1), +(1223,3,'B.4.m','Miscellaneous','B.4.m',224,225,1049,1,1), +(1224,3,'B.5.0','General','B.5.0',228,229,1050,1,1), +(1225,3,'B.5.1','Design','B.5.1',230,241,1050,1,1), +(1226,3,NULL,'Arithmetic and logic units',NULL,231,232,1225,1,1), +(1227,3,NULL,'Control design',NULL,233,234,1225,1,1), +(1228,3,NULL,'Data-path design',NULL,235,236,1225,1,1), +(1229,3,NULL,'Memory design',NULL,237,238,1225,1,1), +(1230,3,NULL,'Styles (e.g., parallel, pipeline, special-purpose)',NULL,239,240,1225,1,1), +(1231,3,'B.5.2','Design Aids','B.5.2',242,253,1050,1,1), +(1232,3,NULL,'Automatic synthesis',NULL,243,244,1231,1,1), +(1233,3,NULL,'Hardware description languages',NULL,245,246,1231,1,1), +(1234,3,NULL,'Optimization',NULL,247,248,1231,1,1), +(1235,3,NULL,'Simulation',NULL,249,250,1231,1,1), +(1236,3,NULL,'Verification',NULL,251,252,1231,1,1), +(1237,3,'B.5.3','Reliability and Testing** (B.8)','B.5.3',254,265,1050,1,1), +(1238,3,NULL,'Built-in tests**',NULL,255,256,1237,1,1), +(1239,3,NULL,'Error-checking**',NULL,257,258,1237,1,1), +(1240,3,NULL,'Redundant design**',NULL,259,260,1237,1,1), +(1241,3,NULL,'Test generation**',NULL,261,262,1237,1,1), +(1242,3,NULL,'Testability**',NULL,263,264,1237,1,1), +(1243,3,'B.5.m','Miscellaneous','B.5.m',266,267,1050,1,1), +(1244,3,'B.6.0','General','B.6.0',270,271,1051,1,1), +(1245,3,'B.6.1','Design Styles','B.6.1',272,287,1051,1,1), +(1246,3,NULL,'Cellular arrays and automata',NULL,273,274,1245,1,1), +(1247,3,NULL,'Combinational logic',NULL,275,276,1245,1,1), +(1248,3,NULL,'Logic arrays',NULL,277,278,1245,1,1), +(1249,3,NULL,'Memory control and access**',NULL,279,280,1245,1,1), +(1250,3,NULL,'Memory used as logic**',NULL,281,282,1245,1,1), +(1251,3,NULL,'Parallel circuits',NULL,283,284,1245,1,1), +(1252,3,NULL,'Sequential circuits',NULL,285,286,1245,1,1), +(1253,3,'B.6.2','Reliability and Testing** (B.8)','B.6.2',288,299,1051,1,1), +(1254,3,NULL,'Built-in tests**',NULL,289,290,1253,1,1), +(1255,3,NULL,'Error-checking**',NULL,291,292,1253,1,1), +(1256,3,NULL,'Redundant design**',NULL,293,294,1253,1,1), +(1257,3,NULL,'Test generation**',NULL,295,296,1253,1,1), +(1258,3,NULL,'Testability**',NULL,297,298,1253,1,1), +(1259,3,'B.6.3','Design Aids','B.6.3',300,313,1051,1,1), +(1260,3,NULL,'Automatic synthesis',NULL,301,302,1259,1,1), +(1261,3,NULL,'Hardware description languages',NULL,303,304,1259,1,1), +(1262,3,NULL,'Optimization',NULL,305,306,1259,1,1), +(1263,3,NULL,'Simulation',NULL,307,308,1259,1,1), +(1264,3,NULL,'Switching theory',NULL,309,310,1259,1,1), +(1265,3,NULL,'Verification',NULL,311,312,1259,1,1), +(1266,3,'B.6.m','Miscellaneous','B.6.m',314,315,1051,1,1), +(1267,3,'B.7.0','General','B.7.0',318,319,1052,1,1), +(1268,3,'B.7.1','Types and Design Styles','B.7.1',320,337,1052,1,1), +(1269,3,NULL,'Advanced technologies',NULL,321,322,1268,1,1), +(1270,3,NULL,'Algorithms implemented in hardware',NULL,323,324,1268,1,1), +(1271,3,NULL,'Gate arrays',NULL,325,326,1268,1,1), +(1272,3,NULL,'Input/output circuits',NULL,327,328,1268,1,1), +(1273,3,NULL,'Memory technologies',NULL,329,330,1268,1,1), +(1274,3,NULL,'Microprocessors and microcomputers',NULL,331,332,1268,1,1), +(1275,3,NULL,'Standard cells**',NULL,333,334,1268,1,1), +(1276,3,NULL,'VLSI (very large scale integration)',NULL,335,336,1268,1,1), +(1277,3,'B.7.2','Design Aids','B.7.2',338,349,1052,1,1), +(1278,3,NULL,'Graphics',NULL,339,340,1277,1,1), +(1279,3,NULL,'Layout',NULL,341,342,1277,1,1), +(1280,3,NULL,'Placement and routing',NULL,343,344,1277,1,1), +(1281,3,NULL,'Simulation',NULL,345,346,1277,1,1), +(1282,3,NULL,'Verification',NULL,347,348,1277,1,1), +(1283,3,'B.7.3','Reliability and Testing** (B.8)','B.7.3',350,361,1052,1,1), +(1284,3,NULL,'Built-in tests**',NULL,351,352,1283,1,1), +(1285,3,NULL,'Error-checking**',NULL,353,354,1283,1,1), +(1286,3,NULL,'Redundant design**',NULL,355,356,1283,1,1), +(1287,3,NULL,'Test generation**',NULL,357,358,1283,1,1), +(1288,3,NULL,'Testability**',NULL,359,360,1283,1,1), +(1289,3,'B.7.m','Miscellaneous','B.7.m',362,363,1052,1,1), +(1290,3,'B.8.0','General (NEW)','B.8.0',366,367,1053,1,1), +(1291,3,'B.8.1','Reliability, Testing, and Fault-Tolerance (NEW)','B.8.1',368,369,1053,1,1), +(1292,3,'B.8.2','Performance Analysis and Design Aids (NEW)','B.8.2',370,371,1053,1,1), +(1293,3,'B.8.m','Miscellaneous (NEW)','B.8.m',372,373,1053,1,1), +(1294,3,NULL,'Design management',NULL,376,377,1054,1,1), +(1295,3,'C.1.0','General','C.1.0',384,385,1056,1,1), +(1296,3,'C.1.1','Single Data Stream Architectures','C.1.1',386,397,1056,1,1), +(1297,3,NULL,'Multiple-instruction-stream, single-data-stream processors (MISD)**',NULL,387,388,1296,1,1), +(1298,3,NULL,'Pipeline processors**',NULL,389,390,1296,1,1), +(1299,3,NULL,'RISC/CISC, VLIW architectures (NEW)',NULL,391,392,1296,1,1), +(1300,3,NULL,'Single-instruction-stream, single-data-stream processors (SISD)**',NULL,393,394,1296,1,1), +(1301,3,NULL,'Von Neumann architectures**',NULL,395,396,1296,1,1), +(1302,3,'C.1.2','Multiple Data Stream Architectures (Multiprocessors)','C.1.2',398,415,1056,1,1), +(1303,3,NULL,'Array and vector processors',NULL,399,400,1302,1,1), +(1304,3,NULL,'Associative processors',NULL,401,402,1302,1,1), +(1305,3,NULL,'Connection machines',NULL,403,404,1302,1,1), +(1306,3,NULL,'Interconnection architectures (e.g., common bus, multiport memory, crossbar switch)',NULL,405,406,1302,1,1), +(1307,3,NULL,'Multiple-instruction-stream, multiple-data-stream processors (MIMD)',NULL,407,408,1302,1,1), +(1308,3,NULL,'Parallel processors**',NULL,409,410,1302,1,1), +(1309,3,NULL,'Pipeline processors**',NULL,411,412,1302,1,1), +(1310,3,NULL,'Single-instruction-stream, multiple-data-stream processors (SIMD)',NULL,413,414,1302,1,1), +(1311,3,'C.1.3','Other Architecture Styles','C.1.3',416,437,1056,1,1), +(1312,3,NULL,'Adaptable architectures',NULL,417,418,1311,1,1), +(1313,3,NULL,'Analog computers (NEW)',NULL,419,420,1311,1,1), +(1314,3,NULL,'Capability architectures**',NULL,421,422,1311,1,1), +(1315,3,NULL,'Cellular architecture (e.g., mobile) (REVISED)',NULL,423,424,1311,1,1), +(1316,3,NULL,'Data-flow architectures',NULL,425,426,1311,1,1), +(1317,3,NULL,'Heterogeneous (hybrid) systems (NEW)',NULL,427,428,1311,1,1), +(1318,3,NULL,'High-level language architectures**',NULL,429,430,1311,1,1), +(1319,3,NULL,'Neural nets',NULL,431,432,1311,1,1), +(1320,3,NULL,'Pipeline processors (NEW)',NULL,433,434,1311,1,1), +(1321,3,NULL,'Stack-oriented processors**',NULL,435,436,1311,1,1), +(1322,3,'C.1.4','Parallel Architectures (NEW)','C.1.4',438,443,1056,1,1), +(1323,3,NULL,'Distributed architectures (NEW)',NULL,439,440,1322,1,1), +(1324,3,NULL,'Mobile processors (NEW)',NULL,441,442,1322,1,1), +(1325,3,'C.1.m','Miscellaneous','C.1.m',444,449,1056,1,1), +(1326,3,NULL,'Analog computers**',NULL,445,446,1325,1,1), +(1327,3,NULL,'Hybrid systems**',NULL,447,448,1325,1,1), +(1328,3,'C.2.0','General','C.2.0',452,459,1057,1,1), +(1329,3,NULL,'Data communications',NULL,453,454,1328,1,1), +(1330,3,NULL,'Open Systems Interconnection reference model (OSI)',NULL,455,456,1328,1,1), +(1331,3,NULL,'Security and protection (e.g., firewalls) (REVISED)',NULL,457,458,1328,1,1), +(1332,3,'C.2.1','Network Architecture and Design','C.2.1',460,483,1057,1,1), +(1333,3,NULL,'Asynchronous Transfer Mode (ATM) (NEW)',NULL,461,462,1332,1,1), +(1334,3,NULL,'Centralized networks**',NULL,463,464,1332,1,1), +(1335,3,NULL,'Circuit-switching networks',NULL,465,466,1332,1,1), +(1336,3,NULL,'Distributed networks',NULL,467,468,1332,1,1), +(1337,3,NULL,'Frame relay networks (NEW)',NULL,469,470,1332,1,1), +(1338,3,NULL,'ISDN (Integrated Services Digital Network)',NULL,471,472,1332,1,1), +(1339,3,NULL,'Network communications',NULL,473,474,1332,1,1), +(1340,3,NULL,'Network topology',NULL,475,476,1332,1,1), +(1341,3,NULL,'Packet-switching networks (REVISED)',NULL,477,478,1332,1,1), +(1342,3,NULL,'Store and forward networks',NULL,479,480,1332,1,1), +(1343,3,NULL,'Wireless communication (NEW)',NULL,481,482,1332,1,1), +(1344,3,'C.2.2','Network Protocols','C.2.2',484,493,1057,1,1), +(1345,3,NULL,'Applications (SMTP, FTP, etc.) (NEW)',NULL,485,486,1344,1,1), +(1346,3,NULL,'Protocol architecture (OSI model) (REVISED)',NULL,487,488,1344,1,1), +(1347,3,NULL,'Protocol verification',NULL,489,490,1344,1,1), +(1348,3,NULL,'Routing protocols (NEW)',NULL,491,492,1344,1,1), +(1349,3,'C.2.3','Network Operations','C.2.3',494,501,1057,1,1), +(1350,3,NULL,'Network management',NULL,495,496,1349,1,1), +(1351,3,NULL,'Network monitoring',NULL,497,498,1349,1,1), +(1352,3,NULL,'Public networks',NULL,499,500,1349,1,1), +(1353,3,'C.2.4','Distributed Systems','C.2.4',502,511,1057,1,1), +(1354,3,NULL,'Client/server (NEW)',NULL,503,504,1353,1,1), +(1355,3,NULL,'Distributed applications',NULL,505,506,1353,1,1), +(1356,3,NULL,'Distributed databases',NULL,507,508,1353,1,1), +(1357,3,NULL,'Network operating systems',NULL,509,510,1353,1,1), +(1358,3,'C.2.5','Local and Wide-Area Networks (REVISED)','C.2.5',512,525,1057,1,1), +(1359,3,NULL,'Access schemes',NULL,513,514,1358,1,1), +(1360,3,NULL,'Buses',NULL,515,516,1358,1,1), +(1361,3,NULL,'Ethernet (e.g., CSMA/CD) (NEW)',NULL,517,518,1358,1,1), +(1362,3,NULL,'High-speed (e.g., FDDI, fiber channel, ATM) (NEW)',NULL,519,520,1358,1,1), +(1363,3,NULL,'Internet (e.g., TCP/IP) (NEW)',NULL,521,522,1358,1,1), +(1364,3,NULL,'Token rings (REVISED)',NULL,523,524,1358,1,1), +(1365,3,'C.2.6','Internetworking (C.2.2) (NEW)','C.2.6',526,531,1057,1,1), +(1366,3,NULL,'Routers (NEW)',NULL,527,528,1365,1,1), +(1367,3,NULL,'Standards (e.g., TCP/IP) (NEW)',NULL,529,530,1365,1,1), +(1368,3,'C.2.m','Miscellaneous','C.2.m',532,533,1057,1,1), +(1369,3,'C.5.0','General','C.5.0',540,541,1060,1,1), +(1370,3,'C.5.1','Large and Medium Mainframe Computers','C.5.1',542,545,1060,1,1), +(1371,3,NULL,'Super (very large) computers',NULL,543,544,1370,1,1), +(1372,3,'C.5.2','Minicomputers**','C.5.2',546,547,1060,1,1), +(1373,3,'C.5.3','Microcomputers','C.5.3',548,557,1060,1,1), +(1374,3,NULL,'Microprocessors',NULL,549,550,1373,1,1), +(1375,3,NULL,'Personal computers',NULL,551,552,1373,1,1), +(1376,3,NULL,'Portable devices (e.g., laptops, personal digital assistants) (NEW)',NULL,553,554,1373,1,1), +(1377,3,NULL,'Workstations',NULL,555,556,1373,1,1), +(1378,3,'C.5.4','VLSI Systems','C.5.4',558,559,1060,1,1), +(1379,3,'C.5.5','Servers (NEW)','C.5.5',560,561,1060,1,1), +(1380,3,'C.5.m','Miscellaneous','C.5.m',562,563,1060,1,1), +(1381,3,'D.1.0','General','D.1.0',572,573,1063,1,1), +(1382,3,'D.1.1','Applicative (Functional) Programming','D.1.1',574,575,1063,1,1), +(1383,3,'D.1.2','Automatic Programming (I.2.2)','D.1.2',576,577,1063,1,1), +(1384,3,'D.1.3','Concurrent Programming','D.1.3',578,583,1063,1,1), +(1385,3,NULL,'Distributed programming',NULL,579,580,1384,1,1), +(1386,3,NULL,'Parallel programming',NULL,581,582,1384,1,1), +(1387,3,'D.1.4','Sequential Programming','D.1.4',584,585,1063,1,1), +(1388,3,'D.1.5','Object-oriented Programming','D.1.5',586,587,1063,1,1), +(1389,3,'D.1.6','Logic Programming','D.1.6',588,589,1063,1,1), +(1390,3,'D.1.7','Visual Programming','D.1.7',590,591,1063,1,1), +(1391,3,'D.1.m','Miscellaneous','D.1.m',592,593,1063,1,1), +(1392,3,'D.2.0','General (K.5.1)','D.2.0',596,601,1064,1,1), +(1393,3,NULL,'Protection mechanisms',NULL,597,598,1392,1,1), +(1394,3,NULL,'Standards',NULL,599,600,1392,1,1), +(1395,3,'D.2.1','Requirements/Specifications (D.3.1)','D.2.1',602,611,1064,1,1), +(1396,3,NULL,'Elicitation methods (e.g., rapid prototyping, interviews, JAD) (NEW)',NULL,603,604,1395,1,1), +(1397,3,NULL,'Languages',NULL,605,606,1395,1,1), +(1398,3,NULL,'Methodologies (e.g., object-oriented, structured) (REVISED)',NULL,607,608,1395,1,1), +(1399,3,NULL,'Tools',NULL,609,610,1395,1,1), +(1400,3,'D.2.2','Design Tools and Techniques (REVISED)','D.2.2',612,639,1064,1,1), +(1401,3,NULL,'Computer-aided software engineering (CASE)',NULL,613,614,1400,1,1), +(1402,3,NULL,'Decision tables',NULL,615,616,1400,1,1), +(1403,3,NULL,'Evolutionary prototyping (NEW)',NULL,617,618,1400,1,1), +(1404,3,NULL,'Flow charts',NULL,619,620,1400,1,1), +(1405,3,NULL,'Modules and interfaces',NULL,621,622,1400,1,1), +(1406,3,NULL,'Object-oriented design methods (NEW)',NULL,623,624,1400,1,1), +(1407,3,NULL,'Petri nets',NULL,625,626,1400,1,1), +(1408,3,NULL,'Programmer workbench**',NULL,627,628,1400,1,1), +(1409,3,NULL,'Software libraries',NULL,629,630,1400,1,1), +(1410,3,NULL,'State diagrams (NEW)',NULL,631,632,1400,1,1), +(1411,3,NULL,'Structured programming**',NULL,633,634,1400,1,1), +(1412,3,NULL,'Top-down programming**',NULL,635,636,1400,1,1), +(1413,3,NULL,'User interfaces',NULL,637,638,1400,1,1), +(1414,3,'D.2.3','Coding Tools and Techniques (REVISED)','D.2.3',640,655,1064,1,1), +(1415,3,NULL,'Object-oriented programming (NEW)',NULL,641,642,1414,1,1), +(1416,3,NULL,'Pretty printers',NULL,643,644,1414,1,1), +(1417,3,NULL,'Program editors',NULL,645,646,1414,1,1), +(1418,3,NULL,'Reentrant code**',NULL,647,648,1414,1,1), +(1419,3,NULL,'Standards',NULL,649,650,1414,1,1), +(1420,3,NULL,'Structured programming (NEW)',NULL,651,652,1414,1,1), +(1421,3,NULL,'Top-down programming (NEW)',NULL,653,654,1414,1,1), +(1422,3,'D.2.4','Software/Program Verification (F.3.1) (REVISED)','D.2.4',656,675,1064,1,1), +(1423,3,NULL,'Assertion checkers',NULL,657,658,1422,1,1), +(1424,3,NULL,'Class invariants (NEW)',NULL,659,660,1422,1,1), +(1425,3,NULL,'Correctness proofs',NULL,661,662,1422,1,1), +(1426,3,NULL,'Formal methods (NEW)',NULL,663,664,1422,1,1), +(1427,3,NULL,'Model checking (NEW)',NULL,665,666,1422,1,1), +(1428,3,NULL,'Programming by contract (NEW)',NULL,667,668,1422,1,1), +(1429,3,NULL,'Reliability',NULL,669,670,1422,1,1), +(1430,3,NULL,'Statistical methods (NEW)',NULL,671,672,1422,1,1), +(1431,3,NULL,'Validation',NULL,673,674,1422,1,1), +(1432,3,'D.2.5','Testing and Debugging','D.2.5',676,697,1064,1,1), +(1433,3,NULL,'Code inspections and walk-throughs',NULL,677,678,1432,1,1), +(1434,3,NULL,'Debugging aids',NULL,679,680,1432,1,1), +(1435,3,NULL,'Diagnostics',NULL,681,682,1432,1,1), +(1436,3,NULL,'Distributed debugging (NEW)',NULL,683,684,1432,1,1), +(1437,3,NULL,'Dumps**',NULL,685,686,1432,1,1), +(1438,3,NULL,'Error handling and recovery',NULL,687,688,1432,1,1), +(1439,3,NULL,'Monitors',NULL,689,690,1432,1,1), +(1440,3,NULL,'Symbolic execution',NULL,691,692,1432,1,1), +(1441,3,NULL,'Testing tools (e.g., data generators, coverage testing) (REVISED)',NULL,693,694,1432,1,1), +(1442,3,NULL,'Tracing',NULL,695,696,1432,1,1), +(1443,3,'D.2.6','Programming Environments','D.2.6',698,707,1064,1,1), +(1444,3,NULL,'Graphical environments (NEW)',NULL,699,700,1443,1,1), +(1445,3,NULL,'Integrated environments (NEW)',NULL,701,702,1443,1,1), +(1446,3,NULL,'Interactive environments (REVISED)',NULL,703,704,1443,1,1), +(1447,3,NULL,'Programmer workbench (NEW)',NULL,705,706,1443,1,1), +(1448,3,'D.2.7','Distribution, Maintenance, and Enhancement (REVISED)','D.2.7',708,723,1064,1,1), +(1449,3,NULL,'Corrections**',NULL,709,710,1448,1,1), +(1450,3,NULL,'Documentation',NULL,711,712,1448,1,1), +(1451,3,NULL,'Enhancement**',NULL,713,714,1448,1,1), +(1452,3,NULL,'Extensibility**',NULL,715,716,1448,1,1), +(1453,3,NULL,'Portability',NULL,717,718,1448,1,1), +(1454,3,NULL,'Restructuring, reverse engineering, and reengineering (REVISED)',NULL,719,720,1448,1,1), +(1455,3,NULL,'Version control',NULL,721,722,1448,1,1), +(1456,3,'D.2.8','Metrics (D.4.8)','D.2.8',724,735,1064,1,1), +(1457,3,NULL,'Complexity measures',NULL,725,726,1456,1,1), +(1458,3,NULL,'Performance measures',NULL,727,728,1456,1,1), +(1459,3,NULL,'Process metrics (NEW)',NULL,729,730,1456,1,1), +(1460,3,NULL,'Product metrics (NEW)',NULL,731,732,1456,1,1), +(1461,3,NULL,'Software science**',NULL,733,734,1456,1,1), +(1462,3,'D.2.9','Management (K.6.3, K.6.4)','D.2.9',736,755,1064,1,1), +(1463,3,NULL,'Copyrights**',NULL,737,738,1462,1,1), +(1464,3,NULL,'Cost estimation',NULL,739,740,1462,1,1), +(1465,3,NULL,'Life cycle',NULL,741,742,1462,1,1), +(1466,3,NULL,'Productivity',NULL,743,744,1462,1,1), +(1467,3,NULL,'Programming teams',NULL,745,746,1462,1,1), +(1468,3,NULL,'Software configuration management',NULL,747,748,1462,1,1), +(1469,3,NULL,'Software process models (e.g., CMM, ISO, PSP) (NEW)',NULL,749,750,1462,1,1), +(1470,3,NULL,'Software quality assurance (SQA)',NULL,751,752,1462,1,1), +(1471,3,NULL,'Time estimation',NULL,753,754,1462,1,1), +(1472,3,'D.2.10','Design** (D.2.2)','D.2.10',756,761,1064,1,1), +(1473,3,NULL,'Methodologies**',NULL,757,758,1472,1,1), +(1474,3,NULL,'Representation**',NULL,759,760,1472,1,1), +(1475,3,'D.2.11','Software Architectures (NEW)','D.2.11',762,773,1064,1,1), +(1476,3,NULL,'Data abstraction (NEW)',NULL,763,764,1475,1,1), +(1477,3,NULL,'Domain-specific architectures (NEW)',NULL,765,766,1475,1,1), +(1478,3,NULL,'Information hiding (NEW)',NULL,767,768,1475,1,1), +(1479,3,NULL,'Languages (e.g., description, interconnection, definition) (NEW)',NULL,769,770,1475,1,1), +(1480,3,NULL,'Patterns (e.g., client/server, pipeline, blackboard) (NEW)',NULL,771,772,1475,1,1), +(1481,3,'D.2.12','Interoperability (NEW)','D.2.12',774,781,1064,1,1), +(1482,3,NULL,'Data mapping (NEW)',NULL,775,776,1481,1,1), +(1483,3,NULL,'Distributed objects (NEW)',NULL,777,778,1481,1,1), +(1484,3,NULL,'Interface definition languages (NEW)',NULL,779,780,1481,1,1), +(1485,3,'D.2.13','Reusable Software (NEW)','D.2.13',782,789,1064,1,1), +(1486,3,NULL,'Domain engineering (NEW)',NULL,783,784,1485,1,1), +(1487,3,NULL,'Reusable libraries (NEW)',NULL,785,786,1485,1,1), +(1488,3,NULL,'Reuse models (NEW)',NULL,787,788,1485,1,1), +(1489,3,'D.2.m','Miscellaneous','D.2.m',790,795,1064,1,1), +(1490,3,NULL,'Rapid prototyping**',NULL,791,792,1489,1,1), +(1491,3,NULL,'Reusable software**',NULL,793,794,1489,1,1), +(1492,3,'D.3.0','General','D.3.0',798,801,1065,1,1), +(1493,3,NULL,'Standards',NULL,799,800,1492,1,1), +(1494,3,'D.3.1','Formal Definitions and Theory (D.2.1, F.3.1-2, F.4.2-3)','D.3.1',802,807,1065,1,1), +(1495,3,NULL,'Semantics',NULL,803,804,1494,1,1), +(1496,3,NULL,'Syntax',NULL,805,806,1494,1,1), +(1497,3,'D.3.2','Language Classifications','D.3.2',808,837,1065,1,1), +(1498,3,NULL,'Applicative (functional) languages (REVISED)',NULL,809,810,1497,1,1), +(1499,3,NULL,'Concurrent, distributed, and parallel languages',NULL,811,812,1497,1,1), +(1500,3,NULL,'Constraint and logic languages (NEW)',NULL,813,814,1497,1,1), +(1501,3,NULL,'Data-flow languages',NULL,815,816,1497,1,1), +(1502,3,NULL,'Design languages',NULL,817,818,1497,1,1), +(1503,3,NULL,'Extensible languages',NULL,819,820,1497,1,1), +(1504,3,NULL,'Macro and assembly languages',NULL,821,822,1497,1,1), +(1505,3,NULL,'Microprogramming languages**',NULL,823,824,1497,1,1), +(1506,3,NULL,'Multiparadigm languages (NEW)',NULL,825,826,1497,1,1), +(1507,3,NULL,'Nondeterministic languages**',NULL,827,828,1497,1,1), +(1508,3,NULL,'Nonprocedural languages**',NULL,829,830,1497,1,1), +(1509,3,NULL,'Object-oriented languages',NULL,831,832,1497,1,1), +(1510,3,NULL,'Specialized application languages',NULL,833,834,1497,1,1), +(1511,3,NULL,'Very high-level languages',NULL,835,836,1497,1,1), +(1512,3,'D.3.3','Language Constructs and Features (E.2)','D.3.3',838,871,1065,1,1), +(1513,3,NULL,'Abstract data types',NULL,839,840,1512,1,1), +(1514,3,NULL,'Classes and objects (NEW)',NULL,841,842,1512,1,1), +(1515,3,NULL,'Concurrent programming structures',NULL,843,844,1512,1,1), +(1516,3,NULL,'Constraints (NEW)',NULL,845,846,1512,1,1), +(1517,3,NULL,'Control structures',NULL,847,848,1512,1,1), +(1518,3,NULL,'Coroutines',NULL,849,850,1512,1,1), +(1519,3,NULL,'Data types and structures',NULL,851,852,1512,1,1), +(1520,3,NULL,'Dynamic storage management',NULL,853,854,1512,1,1), +(1521,3,NULL,'Frameworks (NEW)',NULL,855,856,1512,1,1), +(1522,3,NULL,'Inheritance (NEW)',NULL,857,858,1512,1,1), +(1523,3,NULL,'Input/output',NULL,859,860,1512,1,1), +(1524,3,NULL,'Modules, packages',NULL,861,862,1512,1,1), +(1525,3,NULL,'Patterns (NEW)',NULL,863,864,1512,1,1), +(1526,3,NULL,'Polymorphism (NEW)',NULL,865,866,1512,1,1), +(1527,3,NULL,'Procedures, functions, and subroutines',NULL,867,868,1512,1,1), +(1528,3,NULL,'Recursion',NULL,869,870,1512,1,1), +(1529,3,'D.3.4','Processors','D.3.4',872,897,1065,1,1), +(1530,3,NULL,'Code generation',NULL,873,874,1529,1,1), +(1531,3,NULL,'Compilers',NULL,875,876,1529,1,1), +(1532,3,NULL,'Debuggers (NEW)',NULL,877,878,1529,1,1), +(1533,3,NULL,'Incremental compilers (NEW)',NULL,879,880,1529,1,1), +(1534,3,NULL,'Interpreters',NULL,881,882,1529,1,1), +(1535,3,NULL,'Memory management (garbage collection) (NEW)',NULL,883,884,1529,1,1), +(1536,3,NULL,'Optimization',NULL,885,886,1529,1,1), +(1537,3,NULL,'Parsing',NULL,887,888,1529,1,1), +(1538,3,NULL,'Preprocessors',NULL,889,890,1529,1,1), +(1539,3,NULL,'Retargetable compilers (NEW)',NULL,891,892,1529,1,1), +(1540,3,NULL,'Run-time environments',NULL,893,894,1529,1,1), +(1541,3,NULL,'Translator writing systems and compiler generators',NULL,895,896,1529,1,1), +(1542,3,'D.3.m','Miscellaneous','D.3.m',898,899,1065,1,1), +(1543,3,'D.4.0','General','D.4.0',902,903,1066,1,1), +(1544,3,'D.4.1','Process Management','D.4.1',904,919,1066,1,1), +(1545,3,NULL,'Concurrency',NULL,905,906,1544,1,1), +(1546,3,NULL,'Deadlocks',NULL,907,908,1544,1,1), +(1547,3,NULL,'Multiprocessing/multiprogramming/multitasking (REVISED)',NULL,909,910,1544,1,1), +(1548,3,NULL,'Mutual exclusion',NULL,911,912,1544,1,1), +(1549,3,NULL,'Scheduling',NULL,913,914,1544,1,1), +(1550,3,NULL,'Synchronization',NULL,915,916,1544,1,1), +(1551,3,NULL,'Threads (NEW)',NULL,917,918,1544,1,1), +(1552,3,'D.4.2','Storage Management','D.4.2',920,939,1066,1,1), +(1553,3,NULL,'Allocation/deallocation strategies',NULL,921,922,1552,1,1), +(1554,3,NULL,'Distributed memories',NULL,923,924,1552,1,1), +(1555,3,NULL,'Garbage collection (NEW)',NULL,925,926,1552,1,1), +(1556,3,NULL,'Main memory',NULL,927,928,1552,1,1), +(1557,3,NULL,'Secondary storage',NULL,929,930,1552,1,1), +(1558,3,NULL,'Segmentation**',NULL,931,932,1552,1,1), +(1559,3,NULL,'Storage hierarchies',NULL,933,934,1552,1,1), +(1560,3,NULL,'Swapping**',NULL,935,936,1552,1,1), +(1561,3,NULL,'Virtual memory',NULL,937,938,1552,1,1), +(1562,3,'D.4.3','File Systems Management (E.5)','D.4.3',940,951,1066,1,1), +(1563,3,NULL,'Access methods',NULL,941,942,1562,1,1), +(1564,3,NULL,'Directory structures',NULL,943,944,1562,1,1), +(1565,3,NULL,'Distributed file systems',NULL,945,946,1562,1,1), +(1566,3,NULL,'File organization',NULL,947,948,1562,1,1), +(1567,3,NULL,'Maintenance**',NULL,949,950,1562,1,1), +(1568,3,'D.4.4','Communications Management (C.2)','D.4.4',952,963,1066,1,1), +(1569,3,NULL,'Buffering',NULL,953,954,1568,1,1), +(1570,3,NULL,'Input/output',NULL,955,956,1568,1,1), +(1571,3,NULL,'Message sending',NULL,957,958,1568,1,1), +(1572,3,NULL,'Network communication',NULL,959,960,1568,1,1), +(1573,3,NULL,'Terminal management**',NULL,961,962,1568,1,1), +(1574,3,'D.4.5','Reliability','D.4.5',964,973,1066,1,1), +(1575,3,NULL,'Backup procedures',NULL,965,966,1574,1,1), +(1576,3,NULL,'Checkpoint/restart',NULL,967,968,1574,1,1), +(1577,3,NULL,'Fault-tolerance',NULL,969,970,1574,1,1), +(1578,3,NULL,'Verification',NULL,971,972,1574,1,1), +(1579,3,'D.4.6','Security and Protection (K.6.5)','D.4.6',974,989,1066,1,1), +(1580,3,NULL,'Access controls',NULL,975,976,1579,1,1), +(1581,3,NULL,'Authentication',NULL,977,978,1579,1,1), +(1582,3,NULL,'Cryptographic controls',NULL,979,980,1579,1,1), +(1583,3,NULL,'Information flow controls',NULL,981,982,1579,1,1), +(1584,3,NULL,'Invasive software (e.g., viruses, worms, Trojan horses)',NULL,983,984,1579,1,1), +(1585,3,NULL,'Security kernels**',NULL,985,986,1579,1,1), +(1586,3,NULL,'Verification**',NULL,987,988,1579,1,1), +(1587,3,'D.4.7','Organization and Design','D.4.7',990,1001,1066,1,1), +(1588,3,NULL,'Batch processing systems**',NULL,991,992,1587,1,1), +(1589,3,NULL,'Distributed systems',NULL,993,994,1587,1,1), +(1590,3,NULL,'Hierarchical design**',NULL,995,996,1587,1,1), +(1591,3,NULL,'Interactive systems',NULL,997,998,1587,1,1), +(1592,3,NULL,'Real-time systems and embedded systems',NULL,999,1000,1587,1,1), +(1593,3,'D.4.8','Performance (C.4, D.2.8, I.6)','D.4.8',1002,1017,1066,1,1), +(1594,3,NULL,'Measurements',NULL,1003,1004,1593,1,1), +(1595,3,NULL,'Modeling and prediction',NULL,1005,1006,1593,1,1), +(1596,3,NULL,'Monitors',NULL,1007,1008,1593,1,1), +(1597,3,NULL,'Operational analysis',NULL,1009,1010,1593,1,1), +(1598,3,NULL,'Queueing theory',NULL,1011,1012,1593,1,1), +(1599,3,NULL,'Simulation',NULL,1013,1014,1593,1,1), +(1600,3,NULL,'Stochastic analysis',NULL,1015,1016,1593,1,1), +(1601,3,'D.4.9','Systems Programs and Utilities','D.4.9',1018,1027,1066,1,1), +(1602,3,NULL,'Command and control languages',NULL,1019,1020,1601,1,1), +(1603,3,NULL,'Linkers**',NULL,1021,1022,1601,1,1), +(1604,3,NULL,'Loaders**',NULL,1023,1024,1601,1,1), +(1605,3,NULL,'Window managers',NULL,1025,1026,1601,1,1), +(1606,3,'D.4.m','Miscellaneous','D.4.m',1028,1029,1066,1,1), +(1607,3,NULL,'Software psychology**',NULL,1032,1033,1067,1,1), +(1608,3,NULL,'Arrays',NULL,1040,1041,1069,1,1), +(1609,3,NULL,'Distributed data structures (NEW)',NULL,1042,1043,1069,1,1), +(1610,3,NULL,'Graphs and networks (REVISED)',NULL,1044,1045,1069,1,1), +(1611,3,NULL,'Lists, stacks, and queues (REVISED)',NULL,1046,1047,1069,1,1), +(1612,3,NULL,'Records (NEW)',NULL,1048,1049,1069,1,1), +(1613,3,NULL,'Tables**',NULL,1050,1051,1069,1,1), +(1614,3,NULL,'Trees',NULL,1052,1053,1069,1,1), +(1615,3,NULL,'Composite structures**',NULL,1056,1057,1070,1,1), +(1616,3,NULL,'Contiguous representations**',NULL,1058,1059,1070,1,1), +(1617,3,NULL,'Hash-table representations',NULL,1060,1061,1070,1,1), +(1618,3,NULL,'Linked representations',NULL,1062,1063,1070,1,1), +(1619,3,NULL,'Object representation (NEW)',NULL,1064,1065,1070,1,1), +(1620,3,NULL,'Primitive data items**',NULL,1066,1067,1070,1,1), +(1621,3,NULL,'Code breaking (NEW)',NULL,1070,1071,1071,1,1), +(1622,3,NULL,'Data encryption standard (DES)**',NULL,1072,1073,1071,1,1), +(1623,3,NULL,'Public key cryptosystems',NULL,1074,1075,1071,1,1), +(1624,3,NULL,'Standards (e.g., DES, PGP, RSA) (NEW)',NULL,1076,1077,1071,1,1), +(1625,3,NULL,'Data compaction and compression',NULL,1080,1081,1072,1,1), +(1626,3,NULL,'Error control codes',NULL,1082,1083,1072,1,1), +(1627,3,NULL,'Formal models of communication',NULL,1084,1085,1072,1,1), +(1628,3,NULL,'Nonsecret encoding schemes**',NULL,1086,1087,1072,1,1), +(1629,3,NULL,'Backup/recovery',NULL,1090,1091,1073,1,1), +(1630,3,NULL,'Optimization**',NULL,1092,1093,1073,1,1), +(1631,3,NULL,'Organization/structure',NULL,1094,1095,1073,1,1), +(1632,3,NULL,'Sorting/searching',NULL,1096,1097,1073,1,1), +(1633,3,'F.1.0','General','F.1.0',1106,1107,1076,1,1), +(1634,3,'F.1.1','Models of Computation (F.4.1)','F.1.1',1108,1121,1076,1,1), +(1635,3,NULL,'Automata (e.g., finite, push-down, resource-bounded)',NULL,1109,1110,1634,1,1), +(1636,3,NULL,'Bounded-action devices (e.g., Turing machines, random access machines)',NULL,1111,1112,1634,1,1), +(1637,3,NULL,'Computability theory',NULL,1113,1114,1634,1,1), +(1638,3,NULL,'Relations between models',NULL,1115,1116,1634,1,1), +(1639,3,NULL,'Self-modifying machines (e.g., neural networks)',NULL,1117,1118,1634,1,1), +(1640,3,NULL,'Unbounded-action devices (e.g., cellular automata, circuits, networks of machines)',NULL,1119,1120,1634,1,1), +(1641,3,'F.1.2','Modes of Computation','F.1.2',1122,1137,1076,1,1), +(1642,3,NULL,'Alternation and nondeterminism',NULL,1123,1124,1641,1,1), +(1643,3,NULL,'Interactive and reactive computation (REVISED)',NULL,1125,1126,1641,1,1), +(1644,3,NULL,'Online computation',NULL,1127,1128,1641,1,1), +(1645,3,NULL,'Parallelism and concurrency',NULL,1129,1130,1641,1,1), +(1646,3,NULL,'Probabilistic computation',NULL,1131,1132,1641,1,1), +(1647,3,NULL,'Relations among modes**',NULL,1133,1134,1641,1,1), +(1648,3,NULL,'Relativized computation',NULL,1135,1136,1641,1,1), +(1649,3,'F.1.3','Complexity Measures and Classes (F.2) (REVISED)','F.1.3',1138,1149,1076,1,1), +(1650,3,NULL,'Complexity hierarchies',NULL,1139,1140,1649,1,1), +(1651,3,NULL,'Machine-independent complexity**',NULL,1141,1142,1649,1,1), +(1652,3,NULL,'Reducibility and completeness',NULL,1143,1144,1649,1,1), +(1653,3,NULL,'Relations among complexity classes',NULL,1145,1146,1649,1,1), +(1654,3,NULL,'Relations among complexity measures',NULL,1147,1148,1649,1,1), +(1655,3,'F.1.m','Miscellaneous','F.1.m',1150,1151,1076,1,1), +(1656,3,'F.2.0','General','F.2.0',1154,1155,1077,1,1), +(1657,3,'F.2.1','Numerical Algorithms and Problems (G.1, G.4, I.1)','F.2.1',1156,1167,1077,1,1), +(1658,3,NULL,'Computation of transforms (e.g., fast Fourier transform)',NULL,1157,1158,1657,1,1), +(1659,3,NULL,'Computations in finite fields',NULL,1159,1160,1657,1,1), +(1660,3,NULL,'Computations on matrices',NULL,1161,1162,1657,1,1), +(1661,3,NULL,'Computations on polynomials',NULL,1163,1164,1657,1,1), +(1662,3,NULL,'Number-theoretic computations (e.g., factoring, primality testing)',NULL,1165,1166,1657,1,1), +(1663,3,'F.2.2','Nonnumerical Algorithms and Problems (E.2-5, G.2, H.2-3)','F.2.2',1168,1183,1077,1,1), +(1664,3,NULL,'Complexity of proof procedures',NULL,1169,1170,1663,1,1), +(1665,3,NULL,'Computations on discrete structures',NULL,1171,1172,1663,1,1), +(1666,3,NULL,'Geometrical problems and computations',NULL,1173,1174,1663,1,1), +(1667,3,NULL,'Pattern matching',NULL,1175,1176,1663,1,1), +(1668,3,NULL,'Routing and layout',NULL,1177,1178,1663,1,1), +(1669,3,NULL,'Sequencing and scheduling',NULL,1179,1180,1663,1,1), +(1670,3,NULL,'Sorting and searching',NULL,1181,1182,1663,1,1), +(1671,3,'F.2.3','Tradeoffs between Complexity Measures (F.1.3)','F.2.3',1184,1185,1077,1,1), +(1672,3,'F.2.m','Miscellaneous','F.2.m',1186,1187,1077,1,1), +(1673,3,'F.3.0','General','F.3.0',1190,1191,1078,1,1), +(1674,3,'F.3.1','Specifying and Verifying and Reasoning about Programs (D.2.1, D.2.4, D.3.1, E.1)','F.3.1',1192,1205,1078,1,1), +(1675,3,NULL,'Assertions',NULL,1193,1194,1674,1,1), +(1676,3,NULL,'Invariants',NULL,1195,1196,1674,1,1), +(1677,3,NULL,'Logics of programs',NULL,1197,1198,1674,1,1), +(1678,3,NULL,'Mechanical verification',NULL,1199,1200,1674,1,1), +(1679,3,NULL,'Pre- and post-conditions',NULL,1201,1202,1674,1,1), +(1680,3,NULL,'Specification techniques',NULL,1203,1204,1674,1,1), +(1681,3,'F.3.2','Semantics of Programming Languages (D.3.1)','F.3.2',1206,1219,1078,1,1), +(1682,3,NULL,'Algebraic approaches to semantics',NULL,1207,1208,1681,1,1), +(1683,3,NULL,'Denotational semantics',NULL,1209,1210,1681,1,1), +(1684,3,NULL,'Operational semantics',NULL,1211,1212,1681,1,1), +(1685,3,NULL,'Partial evaluation (NEW)',NULL,1213,1214,1681,1,1), +(1686,3,NULL,'Process models (NEW)',NULL,1215,1216,1681,1,1), +(1687,3,NULL,'Program analysis (NEW)',NULL,1217,1218,1681,1,1), +(1688,3,'F.3.3','Studies of Program Constructs (D.3.2-3)','F.3.3',1220,1231,1078,1,1), +(1689,3,NULL,'Control primitives',NULL,1221,1222,1688,1,1), +(1690,3,NULL,'Functional constructs',NULL,1223,1224,1688,1,1), +(1691,3,NULL,'Object-oriented constructs (NEW)',NULL,1225,1226,1688,1,1), +(1692,3,NULL,'Program and recursion schemes',NULL,1227,1228,1688,1,1), +(1693,3,NULL,'Type structure',NULL,1229,1230,1688,1,1), +(1694,3,'F.3.m','Miscellaneous','F.3.m',1232,1233,1078,1,1), +(1695,3,'F.4.0','General','F.4.0',1236,1237,1079,1,1), +(1696,3,'F.4.1','Mathematical Logic (F.1.1, I.2.2-4)','F.4.1',1238,1261,1079,1,1), +(1697,3,NULL,'Computability theory',NULL,1239,1240,1696,1,1), +(1698,3,NULL,'Computational logic',NULL,1241,1242,1696,1,1), +(1699,3,NULL,'Lambda calculus and related systems',NULL,1243,1244,1696,1,1), +(1700,3,NULL,'Logic and constraint programming (REVISED)',NULL,1245,1246,1696,1,1), +(1701,3,NULL,'Mechanical theorem proving',NULL,1247,1248,1696,1,1), +(1702,3,NULL,'Modal logic (NEW)',NULL,1249,1250,1696,1,1), +(1703,3,NULL,'Model theory',NULL,1251,1252,1696,1,1), +(1704,3,NULL,'Proof theory',NULL,1253,1254,1696,1,1), +(1705,3,NULL,'Recursive function theory',NULL,1255,1256,1696,1,1), +(1706,3,NULL,'Set theory (NEW)',NULL,1257,1258,1696,1,1), +(1707,3,NULL,'Temporal logic (NEW)',NULL,1259,1260,1696,1,1), +(1708,3,'F.4.2','Grammars and Other Rewriting Systems (D.3.1)','F.4.2',1262,1273,1079,1,1), +(1709,3,NULL,'Decision problems',NULL,1263,1264,1708,1,1), +(1710,3,NULL,'Grammar types (e.g., context-free, context-sensitive)',NULL,1265,1266,1708,1,1), +(1711,3,NULL,'Parallel rewriting systems (e.g., developmental systems, L-systems)',NULL,1267,1268,1708,1,1), +(1712,3,NULL,'Parsing',NULL,1269,1270,1708,1,1), +(1713,3,NULL,'Thue systems',NULL,1271,1272,1708,1,1), +(1714,3,'F.4.3','Formal Languages (D.3.1)','F.4.3',1274,1285,1079,1,1), +(1715,3,NULL,'Algebraic language theory',NULL,1275,1276,1714,1,1), +(1716,3,NULL,'Classes defined by grammars or automata (e.g., context-free languages, regular sets, recursive sets)',NULL,1277,1278,1714,1,1), +(1717,3,NULL,'Classes defined by resource-bounded automata**',NULL,1279,1280,1714,1,1), +(1718,3,NULL,'Decision problems',NULL,1281,1282,1714,1,1), +(1719,3,NULL,'Operations on languages',NULL,1283,1284,1714,1,1), +(1720,3,'F.4.m','Miscellaneous','F.4.m',1286,1287,1079,1,1), +(1721,3,'G.1.0','General','G.1.0',1296,1313,1082,1,1), +(1722,3,NULL,'Computer arithmetic',NULL,1297,1298,1721,1,1), +(1723,3,NULL,'Conditioning (and ill-conditioning) (REVISED)',NULL,1299,1300,1721,1,1), +(1724,3,NULL,'Error analysis',NULL,1301,1302,1721,1,1), +(1725,3,NULL,'Interval arithmetic (NEW)',NULL,1303,1304,1721,1,1), +(1726,3,NULL,'Multiple precision arithmetic (NEW)',NULL,1305,1306,1721,1,1), +(1727,3,NULL,'Numerical algorithms',NULL,1307,1308,1721,1,1), +(1728,3,NULL,'Parallel algorithms',NULL,1309,1310,1721,1,1), +(1729,3,NULL,'Stability (and instability)',NULL,1311,1312,1721,1,1), +(1730,3,'G.1.1','Interpolation (I.3.5, I.3.7)','G.1.1',1314,1325,1082,1,1), +(1731,3,NULL,'Difference formulas**',NULL,1315,1316,1730,1,1), +(1732,3,NULL,'Extrapolation',NULL,1317,1318,1730,1,1), +(1733,3,NULL,'Interpolation formulas',NULL,1319,1320,1730,1,1), +(1734,3,NULL,'Smoothing',NULL,1321,1322,1730,1,1), +(1735,3,NULL,'Spline and piecewise polynomial interpolation',NULL,1323,1324,1730,1,1), +(1736,3,'G.1.2','Approximation','G.1.2',1326,1351,1082,1,1), +(1737,3,NULL,'Approximation of surfaces and contours (NEW)',NULL,1327,1328,1736,1,1), +(1738,3,NULL,'Chebyshev approximation and theory',NULL,1329,1330,1736,1,1), +(1739,3,NULL,'Elementary function approximation',NULL,1331,1332,1736,1,1), +(1740,3,NULL,'Fast Fourier transforms (FFT) (NEW)',NULL,1333,1334,1736,1,1), +(1741,3,NULL,'Least squares approximation',NULL,1335,1336,1736,1,1), +(1742,3,NULL,'Linear approximation',NULL,1337,1338,1736,1,1), +(1743,3,NULL,'Minimax approximation and algorithms',NULL,1339,1340,1736,1,1), +(1744,3,NULL,'Nonlinear approximation',NULL,1341,1342,1736,1,1), +(1745,3,NULL,'Rational approximation',NULL,1343,1344,1736,1,1), +(1746,3,NULL,'Special function approximations (NEW)',NULL,1345,1346,1736,1,1), +(1747,3,NULL,'Spline and piecewise polynomial approximation',NULL,1347,1348,1736,1,1), +(1748,3,NULL,'Wavelets and fractals (NEW)',NULL,1349,1350,1736,1,1), +(1749,3,'G.1.3','Numerical Linear Algebra','G.1.3',1352,1371,1082,1,1), +(1750,3,NULL,'Conditioning',NULL,1353,1354,1749,1,1), +(1751,3,NULL,'Determinants**',NULL,1355,1356,1749,1,1), +(1752,3,NULL,'Eigenvalues and eigenvectors (direct and iterative methods) (REVISED)',NULL,1357,1358,1749,1,1), +(1753,3,NULL,'Error analysis',NULL,1359,1360,1749,1,1), +(1754,3,NULL,'Linear systems (direct and iterative methods)',NULL,1361,1362,1749,1,1), +(1755,3,NULL,'Matrix inversion',NULL,1363,1364,1749,1,1), +(1756,3,NULL,'Pseudoinverses**',NULL,1365,1366,1749,1,1), +(1757,3,NULL,'Singular value decomposition (NEW)',NULL,1367,1368,1749,1,1), +(1758,3,NULL,'Sparse, structured, and very large systems (direct and iterative methods) (REVISED)',NULL,1369,1370,1749,1,1), +(1759,3,'G.1.4','Quadrature and Numerical Differentiation (F.2.1)','G.1.4',1372,1389,1082,1,1), +(1760,3,NULL,'Adaptive and iterative quadrature (REVISED)',NULL,1373,1374,1759,1,1), +(1761,3,NULL,'Automatic differentiation (NEW)',NULL,1375,1376,1759,1,1), +(1762,3,NULL,'Equal interval integration**',NULL,1377,1378,1759,1,1), +(1763,3,NULL,'Error analysis',NULL,1379,1380,1759,1,1), +(1764,3,NULL,'Finite difference methods',NULL,1381,1382,1759,1,1), +(1765,3,NULL,'Gaussian quadrature',NULL,1383,1384,1759,1,1), +(1766,3,NULL,'Iterative methods',NULL,1385,1386,1759,1,1), +(1767,3,NULL,'Multidimensional (multiple) quadrature (REVISED)',NULL,1387,1388,1759,1,1), +(1768,3,'G.1.5','Roots of Nonlinear Equations','G.1.5',1390,1403,1082,1,1), +(1769,3,NULL,'Continuation (homotopy) methods (NEW)',NULL,1391,1392,1768,1,1), +(1770,3,NULL,'Convergence',NULL,1393,1394,1768,1,1), +(1771,3,NULL,'Error analysis',NULL,1395,1396,1768,1,1), +(1772,3,NULL,'Iterative methods',NULL,1397,1398,1768,1,1), +(1773,3,NULL,'Polynomials, methods for',NULL,1399,1400,1768,1,1), +(1774,3,NULL,'Systems of equations',NULL,1401,1402,1768,1,1), +(1775,3,'G.1.6','Optimization','G.1.6',1404,1429,1082,1,1), +(1776,3,NULL,'Constrained optimization',NULL,1405,1406,1775,1,1), +(1777,3,NULL,'Convex programming (NEW)',NULL,1407,1408,1775,1,1), +(1778,3,NULL,'Global optimization (NEW)',NULL,1409,1410,1775,1,1), +(1779,3,NULL,'Gradient methods',NULL,1411,1412,1775,1,1), +(1780,3,NULL,'Integer programming',NULL,1413,1414,1775,1,1), +(1781,3,NULL,'Least squares methods',NULL,1415,1416,1775,1,1), +(1782,3,NULL,'Linear programming',NULL,1417,1418,1775,1,1), +(1783,3,NULL,'Nonlinear programming',NULL,1419,1420,1775,1,1), +(1784,3,NULL,'Quadratic programming methods (NEW)',NULL,1421,1422,1775,1,1), +(1785,3,NULL,'Simulated annealing (NEW)',NULL,1423,1424,1775,1,1), +(1786,3,NULL,'Stochastic programming (NEW)',NULL,1425,1426,1775,1,1), +(1787,3,NULL,'Unconstrained optimization (NEW)',NULL,1427,1428,1775,1,1), +(1788,3,'G.1.7','Ordinary Differential Equations','G.1.7',1430,1451,1082,1,1), +(1789,3,NULL,'Boundary value problems',NULL,1431,1432,1788,1,1), +(1790,3,NULL,'Chaotic systems (NEW)',NULL,1433,1434,1788,1,1), +(1791,3,NULL,'Convergence and stability',NULL,1435,1436,1788,1,1), +(1792,3,NULL,'Differential-algebraic equations (NEW)',NULL,1437,1438,1788,1,1), +(1793,3,NULL,'Error analysis',NULL,1439,1440,1788,1,1), +(1794,3,NULL,'Finite difference methods (NEW)',NULL,1441,1442,1788,1,1), +(1795,3,NULL,'Initial value problems',NULL,1443,1444,1788,1,1), +(1796,3,NULL,'Multistep and multivalue methods (REVISED)',NULL,1445,1446,1788,1,1), +(1797,3,NULL,'One-step (single step) methods (REVISED)',NULL,1447,1448,1788,1,1), +(1798,3,NULL,'Stiff equations',NULL,1449,1450,1788,1,1), +(1799,3,'G.1.8','Partial Differential Equations','G.1.8',1452,1477,1082,1,1), +(1800,3,NULL,'Domain decomposition methods (NEW)',NULL,1453,1454,1799,1,1), +(1801,3,NULL,'Elliptic equations',NULL,1455,1456,1799,1,1), +(1802,3,NULL,'Finite difference methods (REVISED)',NULL,1457,1458,1799,1,1), +(1803,3,NULL,'Finite element methods',NULL,1459,1460,1799,1,1), +(1804,3,NULL,'Finite volume methods (NEW)',NULL,1461,1462,1799,1,1), +(1805,3,NULL,'Hyperbolic equations',NULL,1463,1464,1799,1,1), +(1806,3,NULL,'Inverse problems (NEW)',NULL,1465,1466,1799,1,1), +(1807,3,NULL,'Iterative solution techniques (NEW)',NULL,1467,1468,1799,1,1), +(1808,3,NULL,'Method of lines',NULL,1469,1470,1799,1,1), +(1809,3,NULL,'Multigrid and multilevel methods (NEW)',NULL,1471,1472,1799,1,1), +(1810,3,NULL,'Parabolic equations',NULL,1473,1474,1799,1,1), +(1811,3,NULL,'Spectral methods (NEW)',NULL,1475,1476,1799,1,1), +(1812,3,'G.1.9','Integral Equations','G.1.9',1478,1487,1082,1,1), +(1813,3,NULL,'Delay equations (NEW)',NULL,1479,1480,1812,1,1), +(1814,3,NULL,'Fredholm equations',NULL,1481,1482,1812,1,1), +(1815,3,NULL,'Integro-differential equations',NULL,1483,1484,1812,1,1), +(1816,3,NULL,'Volterra equations',NULL,1485,1486,1812,1,1), +(1817,3,'G.1.m','Miscellaneous','G.1.m',1488,1489,1082,1,1), +(1818,3,'G.2.0','General','G.2.0',1492,1493,1083,1,1), +(1819,3,'G.2.1','Combinatorics (F.2.2)','G.2.1',1494,1505,1083,1,1), +(1820,3,NULL,'Combinatorial algorithms',NULL,1495,1496,1819,1,1), +(1821,3,NULL,'Counting problems',NULL,1497,1498,1819,1,1), +(1822,3,NULL,'Generating functions',NULL,1499,1500,1819,1,1), +(1823,3,NULL,'Permutations and combinations',NULL,1501,1502,1819,1,1), +(1824,3,NULL,'Recurrences and difference equations',NULL,1503,1504,1819,1,1), +(1825,3,'G.2.2','Graph Theory (F.2.2)','G.2.2',1506,1519,1083,1,1), +(1826,3,NULL,'Graph algorithms',NULL,1507,1508,1825,1,1), +(1827,3,NULL,'Graph labeling (NEW)',NULL,1509,1510,1825,1,1), +(1828,3,NULL,'Hypergraphs (NEW)',NULL,1511,1512,1825,1,1), +(1829,3,NULL,'Network problems',NULL,1513,1514,1825,1,1), +(1830,3,NULL,'Path and circuit problems',NULL,1515,1516,1825,1,1), +(1831,3,NULL,'Trees',NULL,1517,1518,1825,1,1), +(1832,3,'G.2.3','Applications (NEW)','G.2.3',1520,1521,1083,1,1), +(1833,3,'G.2.m','Miscellaneous','G.2.m',1522,1523,1083,1,1), +(1834,3,NULL,'Contingency table analysis (NEW)',NULL,1526,1527,1084,1,1), +(1835,3,NULL,'Correlation and regression analysis (NEW)',NULL,1528,1529,1084,1,1), +(1836,3,NULL,'Distribution functions (NEW)',NULL,1530,1531,1084,1,1), +(1837,3,NULL,'Experimental design (NEW)',NULL,1532,1533,1084,1,1), +(1838,3,NULL,'Markov processes (NEW)',NULL,1534,1535,1084,1,1), +(1839,3,NULL,'Multivariate statistics (NEW)',NULL,1536,1537,1084,1,1), +(1840,3,NULL,'Nonparametric statistics (NEW)',NULL,1538,1539,1084,1,1), +(1841,3,NULL,'Probabilistic algorithms (including Monte Carlo)',NULL,1540,1541,1084,1,1), +(1842,3,NULL,'Queueing theory (NEW)',NULL,1542,1543,1084,1,1), +(1843,3,NULL,'Random number generation',NULL,1544,1545,1084,1,1), +(1844,3,NULL,'Reliability and life testing (NEW)',NULL,1546,1547,1084,1,1), +(1845,3,NULL,'Renewal theory (NEW)',NULL,1548,1549,1084,1,1), +(1846,3,NULL,'Robust regression (NEW)',NULL,1550,1551,1084,1,1), +(1847,3,NULL,'Statistical computing',NULL,1552,1553,1084,1,1), +(1848,3,NULL,'Statistical software',NULL,1554,1555,1084,1,1), +(1849,3,NULL,'Stochastic processes (NEW)',NULL,1556,1557,1084,1,1), +(1850,3,NULL,'Survival analysis (NEW)',NULL,1558,1559,1084,1,1), +(1851,3,NULL,'Time series analysis (NEW)',NULL,1560,1561,1084,1,1), +(1852,3,NULL,'Algorithm design and analysis (REVISED)',NULL,1564,1565,1085,1,1), +(1853,3,NULL,'Certification and testing',NULL,1566,1567,1085,1,1), +(1854,3,NULL,'Documentation (NEW)',NULL,1568,1569,1085,1,1), +(1855,3,NULL,'Efficiency',NULL,1570,1571,1085,1,1), +(1856,3,NULL,'Parallel and vector implementations (NEW)',NULL,1572,1573,1085,1,1), +(1857,3,NULL,'Portability**',NULL,1574,1575,1085,1,1), +(1858,3,NULL,'Reliability and robustness',NULL,1576,1577,1085,1,1), +(1859,3,NULL,'User interfaces (NEW)',NULL,1578,1579,1085,1,1), +(1860,3,NULL,'Verification**',NULL,1580,1581,1085,1,1), +(1861,3,NULL,'Queueing theory**',NULL,1584,1585,1086,1,1), +(1862,3,'H.1.0','General','H.1.0',1592,1593,1088,1,1), +(1863,3,'H.1.1','Systems and Information Theory (E.4)','H.1.1',1594,1601,1088,1,1), +(1864,3,NULL,'General systems theory',NULL,1595,1596,1863,1,1), +(1865,3,NULL,'Information theory',NULL,1597,1598,1863,1,1), +(1866,3,NULL,'Value of information',NULL,1599,1600,1863,1,1), +(1867,3,'H.1.2','User/Machine Systems','H.1.2',1602,1609,1088,1,1), +(1868,3,NULL,'Human factors',NULL,1603,1604,1867,1,1), +(1869,3,NULL,'Human information processing',NULL,1605,1606,1867,1,1), +(1870,3,NULL,'Software psychology (NEW)',NULL,1607,1608,1867,1,1), +(1871,3,'H.1.m','Miscellaneous','H.1.m',1610,1611,1088,1,1), +(1872,3,'H.2.0','General','H.2.0',1614,1617,1089,1,1), +(1873,3,NULL,'Security, integrity, and protection**',NULL,1615,1616,1872,1,1), +(1874,3,'H.2.1','Logical Design','H.2.1',1618,1625,1089,1,1), +(1875,3,NULL,'Data models',NULL,1619,1620,1874,1,1), +(1876,3,NULL,'Normal forms',NULL,1621,1622,1874,1,1), +(1877,3,NULL,'Schema and subschema',NULL,1623,1624,1874,1,1), +(1878,3,'H.2.2','Physical Design','H.2.2',1626,1633,1089,1,1), +(1879,3,NULL,'Access methods',NULL,1627,1628,1878,1,1), +(1880,3,NULL,'Deadlock avoidance',NULL,1629,1630,1878,1,1), +(1881,3,NULL,'Recovery and restart',NULL,1631,1632,1878,1,1), +(1882,3,'H.2.3','Languages (D.3.2)','H.2.3',1634,1645,1089,1,1), +(1883,3,NULL,'Data description languages (DDL)',NULL,1635,1636,1882,1,1), +(1884,3,NULL,'Data manipulation languages (DML)',NULL,1637,1638,1882,1,1), +(1885,3,NULL,'Database (persistent) programming languages',NULL,1639,1640,1882,1,1), +(1886,3,NULL,'Query languages',NULL,1641,1642,1882,1,1), +(1887,3,NULL,'Report writers',NULL,1643,1644,1882,1,1), +(1888,3,'H.2.4','Systems','H.2.4',1646,1667,1089,1,1), +(1889,3,NULL,'Concurrency',NULL,1647,1648,1888,1,1), +(1890,3,NULL,'Distributed databases (REVISED)',NULL,1649,1650,1888,1,1), +(1891,3,NULL,'Multimedia databases (NEW)',NULL,1651,1652,1888,1,1), +(1892,3,NULL,'Object-oriented databases (NEW)',NULL,1653,1654,1888,1,1), +(1893,3,NULL,'Parallel databases (NEW)',NULL,1655,1656,1888,1,1), +(1894,3,NULL,'Query processing',NULL,1657,1658,1888,1,1), +(1895,3,NULL,'Relational databases (NEW)',NULL,1659,1660,1888,1,1), +(1896,3,NULL,'Rule-based databases (NEW)',NULL,1661,1662,1888,1,1), +(1897,3,NULL,'Textual databases (NEW)',NULL,1663,1664,1888,1,1), +(1898,3,NULL,'Transaction processing',NULL,1665,1666,1888,1,1), +(1899,3,'H.2.5','Heterogeneous Databases','H.2.5',1668,1673,1089,1,1), +(1900,3,NULL,'Data translation**',NULL,1669,1670,1899,1,1), +(1901,3,NULL,'Program translation**',NULL,1671,1672,1899,1,1), +(1902,3,'H.2.6','Database Machines','H.2.6',1674,1675,1089,1,1), +(1903,3,'H.2.7','Database Administration','H.2.7',1676,1685,1089,1,1), +(1904,3,NULL,'Data dictionary/directory',NULL,1677,1678,1903,1,1), +(1905,3,NULL,'Data warehouse and repository (NEW)',NULL,1679,1680,1903,1,1), +(1906,3,NULL,'Logging and recovery',NULL,1681,1682,1903,1,1), +(1907,3,NULL,'Security, integrity, and protection (NEW)',NULL,1683,1684,1903,1,1), +(1908,3,'H.2.8','Database Applications','H.2.8',1686,1697,1089,1,1), +(1909,3,NULL,'Data mining (NEW)',NULL,1687,1688,1908,1,1), +(1910,3,NULL,'Image databases (NEW)',NULL,1689,1690,1908,1,1), +(1911,3,NULL,'Scientific databases (NEW)',NULL,1691,1692,1908,1,1), +(1912,3,NULL,'Spatial databases and GIS (NEW)',NULL,1693,1694,1908,1,1), +(1913,3,NULL,'Statistical databases (NEW)',NULL,1695,1696,1908,1,1), +(1914,3,'H.2.m','Miscellaneous','H.2.m',1698,1699,1089,1,1), +(1915,3,'H.3.0','General','H.3.0',1702,1703,1090,1,1), +(1916,3,'H.3.1','Content Analysis and Indexing','H.3.1',1704,1715,1090,1,1), +(1917,3,NULL,'Abstracting methods',NULL,1705,1706,1916,1,1), +(1918,3,NULL,'Dictionaries',NULL,1707,1708,1916,1,1), +(1919,3,NULL,'Indexing methods',NULL,1709,1710,1916,1,1), +(1920,3,NULL,'Linguistic processing',NULL,1711,1712,1916,1,1), +(1921,3,NULL,'Thesauruses',NULL,1713,1714,1916,1,1), +(1922,3,'H.3.2','Information Storage','H.3.2',1716,1721,1090,1,1), +(1923,3,NULL,'File organization',NULL,1717,1718,1922,1,1), +(1924,3,NULL,'Record classification**',NULL,1719,1720,1922,1,1), +(1925,3,'H.3.3','Information Search and Retrieval','H.3.3',1722,1737,1090,1,1), +(1926,3,NULL,'Clustering',NULL,1723,1724,1925,1,1), +(1927,3,NULL,'Information filtering (NEW)',NULL,1725,1726,1925,1,1), +(1928,3,NULL,'Query formulation',NULL,1727,1728,1925,1,1), +(1929,3,NULL,'Relevance feedback (NEW)',NULL,1729,1730,1925,1,1), +(1930,3,NULL,'Retrieval models',NULL,1731,1732,1925,1,1), +(1931,3,NULL,'Search process',NULL,1733,1734,1925,1,1), +(1932,3,NULL,'Selection process',NULL,1735,1736,1925,1,1), +(1933,3,'H.3.4','Systems and Software','H.3.4',1738,1751,1090,1,1), +(1934,3,NULL,'Current awareness systems (selective dissemination of information--SDI)**',NULL,1739,1740,1933,1,1), +(1935,3,NULL,'Distributed systems (NEW)',NULL,1741,1742,1933,1,1), +(1936,3,NULL,'Information networks',NULL,1743,1744,1933,1,1), +(1937,3,NULL,'Performance evaluation (efficiency and effectiveness) (NEW)',NULL,1745,1746,1933,1,1), +(1938,3,NULL,'Question-answering (fact retrieval) systems**',NULL,1747,1748,1933,1,1), +(1939,3,NULL,'User profiles and alert services (NEW)',NULL,1749,1750,1933,1,1), +(1940,3,'H.3.5','Online Information Services','H.3.5',1752,1759,1090,1,1), +(1941,3,NULL,'Commercial services (NEW)',NULL,1753,1754,1940,1,1), +(1942,3,NULL,'Data sharing (REVISED)',NULL,1755,1756,1940,1,1), +(1943,3,NULL,'Web-based services (NEW)',NULL,1757,1758,1940,1,1), +(1944,3,'H.3.6','Library Automation','H.3.6',1760,1763,1090,1,1), +(1945,3,NULL,'Large text archives',NULL,1761,1762,1944,1,1), +(1946,3,'H.3.7','Digital Libraries (NEW)','H.3.7',1764,1775,1090,1,1), +(1947,3,NULL,'Collection (NEW)',NULL,1765,1766,1946,1,1), +(1948,3,NULL,'Dissemination (NEW)',NULL,1767,1768,1946,1,1), +(1949,3,NULL,'Standards (NEW)',NULL,1769,1770,1946,1,1), +(1950,3,NULL,'Systems issues (NEW)',NULL,1771,1772,1946,1,1), +(1951,3,NULL,'User issues (NEW)',NULL,1773,1774,1946,1,1), +(1952,3,'H.3.m','Miscellaneous','H.3.m',1776,1777,1090,1,1), +(1953,3,'H.4.0','General','H.4.0',1780,1781,1091,1,1), +(1954,3,'H.4.1','Office Automation (I.7)','H.4.1',1782,1797,1091,1,1), +(1955,3,NULL,'Desktop publishing (NEW)',NULL,1783,1784,1954,1,1), +(1956,3,NULL,'Equipment**',NULL,1785,1786,1954,1,1), +(1957,3,NULL,'Groupware (NEW)',NULL,1787,1788,1954,1,1), +(1958,3,NULL,'Spreadsheets',NULL,1789,1790,1954,1,1), +(1959,3,NULL,'Time management (e.g., calendars, schedules)',NULL,1791,1792,1954,1,1), +(1960,3,NULL,'Word processing',NULL,1793,1794,1954,1,1), +(1961,3,NULL,'Workflow management (NEW)',NULL,1795,1796,1954,1,1), +(1962,3,'H.4.2','Types of Systems','H.4.2',1798,1803,1091,1,1), +(1963,3,NULL,'Decision support (e.g., MIS)',NULL,1799,1800,1962,1,1), +(1964,3,NULL,'Logistics',NULL,1801,1802,1962,1,1), +(1965,3,'H.4.3','Communications Applications','H.4.3',1804,1815,1091,1,1), +(1966,3,NULL,'Bulletin boards',NULL,1805,1806,1965,1,1), +(1967,3,NULL,'Computer conferencing, teleconferencing, and videoconferencing (REVISED)',NULL,1807,1808,1965,1,1), +(1968,3,NULL,'Electronic mail',NULL,1809,1810,1965,1,1), +(1969,3,NULL,'Information browsers (NEW)',NULL,1811,1812,1965,1,1), +(1970,3,NULL,'Videotex',NULL,1813,1814,1965,1,1), +(1971,3,'H.4.m','Miscellaneous','H.4.m',1816,1817,1091,1,1), +(1972,3,'H.5.0','General','H.5.0',1820,1821,1092,1,1), +(1973,3,'H.5.1','Multimedia Information Systems','H.5.1',1822,1835,1092,1,1), +(1974,3,NULL,'Animations',NULL,1823,1824,1973,1,1), +(1975,3,NULL,'Artificial, augmented, and virtual realities (REVISED)',NULL,1825,1826,1973,1,1), +(1976,3,NULL,'Audio input/output',NULL,1827,1828,1973,1,1), +(1977,3,NULL,'Evaluation/methodology',NULL,1829,1830,1973,1,1), +(1978,3,NULL,'Hypertext navigation and maps**',NULL,1831,1832,1973,1,1), +(1979,3,NULL,'Video (e.g., tape, disk, DVI)',NULL,1833,1834,1973,1,1), +(1980,3,'H.5.2','User Interfaces (D.2.2, H.1.2, I.3.6)','H.5.2',1836,1875,1092,1,1), +(1981,3,NULL,'Auditory (non-speech) feedback (NEW)',NULL,1837,1838,1980,1,1), +(1982,3,NULL,'Benchmarking (NEW)',NULL,1839,1840,1980,1,1), +(1983,3,NULL,'Ergonomics',NULL,1841,1842,1980,1,1), +(1984,3,NULL,'Evaluation/methodology',NULL,1843,1844,1980,1,1), +(1985,3,NULL,'Graphical user interfaces (GUI) (NEW)',NULL,1845,1846,1980,1,1), +(1986,3,NULL,'Haptic I/O (NEW)',NULL,1847,1848,1980,1,1), +(1987,3,NULL,'Input devices and strategies (e.g., mouse, touchscreen)',NULL,1849,1850,1980,1,1), +(1988,3,NULL,'Interaction styles (e.g., commands, menus, forms, direct manipulation)',NULL,1851,1852,1980,1,1), +(1989,3,NULL,'Natural language (NEW)',NULL,1853,1854,1980,1,1), +(1990,3,NULL,'Prototyping (NEW)',NULL,1855,1856,1980,1,1), +(1991,3,NULL,'Screen design (e.g., text, graphics, color)',NULL,1857,1858,1980,1,1), +(1992,3,NULL,'Standardization (NEW)',NULL,1859,1860,1980,1,1), +(1993,3,NULL,'Style guides (NEW)',NULL,1861,1862,1980,1,1), +(1994,3,NULL,'Theory and methods',NULL,1863,1864,1980,1,1), +(1995,3,NULL,'Training, help, and documentation',NULL,1865,1866,1980,1,1), +(1996,3,NULL,'User-centered design (NEW)',NULL,1867,1868,1980,1,1), +(1997,3,NULL,'User interface management systems (UIMS)',NULL,1869,1870,1980,1,1), +(1998,3,NULL,'Voice I/O (NEW)',NULL,1871,1872,1980,1,1), +(1999,3,NULL,'Windowing systems',NULL,1873,1874,1980,1,1), +(2000,3,'H.5.3','Group and Organization Interfaces','H.5.3',1876,1893,1092,1,1), +(2001,3,NULL,'Asynchronous interaction',NULL,1877,1878,2000,1,1), +(2002,3,NULL,'Collaborative computing (NEW)',NULL,1879,1880,2000,1,1), +(2003,3,NULL,'Computer-supported cooperative work (NEW)',NULL,1881,1882,2000,1,1), +(2004,3,NULL,'Evaluation/methodology',NULL,1883,1884,2000,1,1), +(2005,3,NULL,'Organizational design',NULL,1885,1886,2000,1,1), +(2006,3,NULL,'Synchronous interaction',NULL,1887,1888,2000,1,1), +(2007,3,NULL,'Theory and models',NULL,1889,1890,2000,1,1), +(2008,3,NULL,'Web-based interaction (NEW)',NULL,1891,1892,2000,1,1), +(2009,3,'H.5.4','Hypertext/Hypermedia (I.7, J.7) (NEW)','H.5.4',1894,1903,1092,1,1), +(2010,3,NULL,'Architectures (NEW)',NULL,1895,1896,2009,1,1), +(2011,3,NULL,'Navigation (NEW)',NULL,1897,1898,2009,1,1), +(2012,3,NULL,'Theory (NEW)',NULL,1899,1900,2009,1,1), +(2013,3,NULL,'User issues (NEW)',NULL,1901,1902,2009,1,1), +(2014,3,'H.5.5','Sound and Music Computing (J.5) (NEW)','H.5.5',1904,1913,1092,1,1), +(2015,3,NULL,'Methodologies and techniques (NEW)',NULL,1905,1906,2014,1,1), +(2016,3,NULL,'Modeling (NEW)',NULL,1907,1908,2014,1,1), +(2017,3,NULL,'Signal analysis, synthesis, and processing (NEW)',NULL,1909,1910,2014,1,1), +(2018,3,NULL,'Systems (NEW)',NULL,1911,1912,2014,1,1), +(2019,3,'H.5.m','Miscellaneous (NEW)','H.5.m',1914,1915,1092,1,1), +(2020,3,'I.1.0','General','I.1.0',1924,1925,1095,1,1), +(2021,3,'I.1.1','Expressions and Their Representation (E.1-2)','I.1.1',1926,1931,1095,1,1), +(2022,3,NULL,'Representations (general and polynomial)',NULL,1927,1928,2021,1,1), +(2023,3,NULL,'Simplification of expressions',NULL,1929,1930,2021,1,1), +(2024,3,'I.1.2','Algorithms (F.2.1-2)','I.1.2',1932,1939,1095,1,1), +(2025,3,NULL,'Algebraic algorithms',NULL,1933,1934,2024,1,1), +(2026,3,NULL,'Analysis of algorithms',NULL,1935,1936,2024,1,1), +(2027,3,NULL,'Nonalgebraic algorithms',NULL,1937,1938,2024,1,1), +(2028,3,'I.1.3','Languages and Systems (D.3.2-3, F.2.2)','I.1.3',1940,1951,1095,1,1), +(2029,3,NULL,'Evaluation strategies',NULL,1941,1942,2028,1,1), +(2030,3,NULL,'Nonprocedural languages**',NULL,1943,1944,2028,1,1), +(2031,3,NULL,'Special-purpose algebraic systems',NULL,1945,1946,2028,1,1), +(2032,3,NULL,'Special-purpose hardware**',NULL,1947,1948,2028,1,1), +(2033,3,NULL,'Substitution mechanisms**',NULL,1949,1950,2028,1,1), +(2034,3,'I.1.4','Applications','I.1.4',1952,1953,1095,1,1), +(2035,3,'I.1.m','Miscellaneous','I.1.m',1954,1955,1095,1,1), +(2036,3,'I.2.0','General','I.2.0',1958,1963,1096,1,1), +(2037,3,NULL,'Cognitive simulation',NULL,1959,1960,2036,1,1), +(2038,3,NULL,'Philosophical foundations',NULL,1961,1962,2036,1,1), +(2039,3,'I.2.1','Applications and Expert Systems (H.4, J)','I.2.1',1964,1979,1096,1,1), +(2040,3,NULL,'Cartography',NULL,1965,1966,2039,1,1), +(2041,3,NULL,'Games',NULL,1967,1968,2039,1,1), +(2042,3,NULL,'Industrial automation',NULL,1969,1970,2039,1,1), +(2043,3,NULL,'Law',NULL,1971,1972,2039,1,1), +(2044,3,NULL,'Medicine and science',NULL,1973,1974,2039,1,1), +(2045,3,NULL,'Natural language interfaces',NULL,1975,1976,2039,1,1), +(2046,3,NULL,'Office automation',NULL,1977,1978,2039,1,1), +(2047,3,'I.2.2','Automatic Programming (D.1.2, F.3.1, F.4.1)','I.2.2',1980,1991,1096,1,1), +(2048,3,NULL,'Automatic analysis of algorithms',NULL,1981,1982,2047,1,1), +(2049,3,NULL,'Program modification',NULL,1983,1984,2047,1,1), +(2050,3,NULL,'Program synthesis',NULL,1985,1986,2047,1,1), +(2051,3,NULL,'Program transformation',NULL,1987,1988,2047,1,1), +(2052,3,NULL,'Program verification',NULL,1989,1990,2047,1,1), +(2053,3,'I.2.3','Deduction and Theorem Proving (F.4.1)','I.2.3',1992,2009,1096,1,1), +(2054,3,NULL,'Answer/reason extraction',NULL,1993,1994,2053,1,1), +(2055,3,NULL,'Deduction (e.g., natural, rule-based)',NULL,1995,1996,2053,1,1), +(2056,3,NULL,'Inference engines (NEW)',NULL,1997,1998,2053,1,1), +(2057,3,NULL,'Logic programming',NULL,1999,2000,2053,1,1), +(2058,3,NULL,'Mathematical induction',NULL,2001,2002,2053,1,1), +(2059,3,NULL,'Metatheory**',NULL,2003,2004,2053,1,1), +(2060,3,NULL,'Nonmonotonic reasoning and belief revision',NULL,2005,2006,2053,1,1), +(2061,3,NULL,'Resolution',NULL,2007,2008,2053,1,1), +(2062,3,'I.2.4','Knowledge Representation Formalisms and Methods (F.4.1)','I.2.4',2010,2027,1096,1,1), +(2063,3,NULL,'Frames and scripts',NULL,2011,2012,2062,1,1), +(2064,3,NULL,'Modal logic (NEW)',NULL,2013,2014,2062,1,1), +(2065,3,NULL,'Predicate logic',NULL,2015,2016,2062,1,1), +(2066,3,NULL,'Relation systems',NULL,2017,2018,2062,1,1), +(2067,3,NULL,'Representation languages',NULL,2019,2020,2062,1,1), +(2068,3,NULL,'Representations (procedural and rule-based)',NULL,2021,2022,2062,1,1), +(2069,3,NULL,'Semantic networks',NULL,2023,2024,2062,1,1), +(2070,3,NULL,'Temporal logic (NEW)',NULL,2025,2026,2062,1,1), +(2071,3,'I.2.5','Programming Languages and Software (D.3.2)','I.2.5',2028,2031,1096,1,1), +(2072,3,NULL,'Expert system tools and techniques',NULL,2029,2030,2071,1,1), +(2073,3,'I.2.6','Learning (K.3.2)','I.2.6',2032,2047,1096,1,1), +(2074,3,NULL,'Analogies',NULL,2033,2034,2073,1,1), +(2075,3,NULL,'Concept learning',NULL,2035,2036,2073,1,1), +(2076,3,NULL,'Connectionism and neural nets',NULL,2037,2038,2073,1,1), +(2077,3,NULL,'Induction',NULL,2039,2040,2073,1,1), +(2078,3,NULL,'Knowledge acquisition',NULL,2041,2042,2073,1,1), +(2079,3,NULL,'Language acquisition',NULL,2043,2044,2073,1,1), +(2080,3,NULL,'Parameter learning',NULL,2045,2046,2073,1,1), +(2081,3,'I.2.7','Natural Language Processing','I.2.7',2048,2063,1096,1,1), +(2082,3,NULL,'Discourse',NULL,2049,2050,2081,1,1), +(2083,3,NULL,'Language generation',NULL,2051,2052,2081,1,1), +(2084,3,NULL,'Language models',NULL,2053,2054,2081,1,1), +(2085,3,NULL,'Language parsing and understanding',NULL,2055,2056,2081,1,1), +(2086,3,NULL,'Machine translation',NULL,2057,2058,2081,1,1), +(2087,3,NULL,'Speech recognition and synthesis',NULL,2059,2060,2081,1,1), +(2088,3,NULL,'Text analysis',NULL,2061,2062,2081,1,1), +(2089,3,'I.2.8','Problem Solving, Control Methods, and Search (F.2.2)','I.2.8',2064,2079,1096,1,1), +(2090,3,NULL,'Backtracking',NULL,2065,2066,2089,1,1), +(2091,3,NULL,'Control theory (NEW)',NULL,2067,2068,2089,1,1), +(2092,3,NULL,'Dynamic programming',NULL,2069,2070,2089,1,1), +(2093,3,NULL,'Graph and tree search strategies',NULL,2071,2072,2089,1,1), +(2094,3,NULL,'Heuristic methods',NULL,2073,2074,2089,1,1), +(2095,3,NULL,'Plan execution, formation, and generation',NULL,2075,2076,2089,1,1), +(2096,3,NULL,'Scheduling (NEW)',NULL,2077,2078,2089,1,1), +(2097,3,'I.2.9','Robotics','I.2.9',2080,2097,1096,1,1), +(2098,3,NULL,'Autonomous vehicles (NEW)',NULL,2081,2082,2097,1,1), +(2099,3,NULL,'Commercial robots and applications (NEW)',NULL,2083,2084,2097,1,1), +(2100,3,NULL,'Kinematics and dynamics (NEW)',NULL,2085,2086,2097,1,1), +(2101,3,NULL,'Manipulators',NULL,2087,2088,2097,1,1), +(2102,3,NULL,'Operator interfaces (NEW)',NULL,2089,2090,2097,1,1), +(2103,3,NULL,'Propelling mechanisms',NULL,2091,2092,2097,1,1), +(2104,3,NULL,'Sensors',NULL,2093,2094,2097,1,1), +(2105,3,NULL,'Workcell organization and planning (NEW)',NULL,2095,2096,2097,1,1), +(2106,3,'I.2.10','Vision and Scene Understanding (I.4.8, I.5)','I.2.10',2098,2119,1096,1,1), +(2107,3,NULL,'3D/stereo scene analysis (NEW)',NULL,2099,2100,2106,1,1), +(2108,3,NULL,'Architecture and control structures**',NULL,2101,2102,2106,1,1), +(2109,3,NULL,'Intensity, color, photometry, and thresholding',NULL,2103,2104,2106,1,1), +(2110,3,NULL,'Modeling and recovery of physical attributes',NULL,2105,2106,2106,1,1), +(2111,3,NULL,'Motion',NULL,2107,2108,2106,1,1), +(2112,3,NULL,'Perceptual reasoning',NULL,2109,2110,2106,1,1), +(2113,3,NULL,'Representations, data structures, and transforms',NULL,2111,2112,2106,1,1), +(2114,3,NULL,'Shape',NULL,2113,2114,2106,1,1), +(2115,3,NULL,'Texture',NULL,2115,2116,2106,1,1), +(2116,3,NULL,'Video analysis (NEW)',NULL,2117,2118,2106,1,1), +(2117,3,'I.2.11','Distributed Artificial Intelligence','I.2.11',2120,2129,1096,1,1), +(2118,3,NULL,'Coherence and coordination',NULL,2121,2122,2117,1,1), +(2119,3,NULL,'Intelligent agents (NEW)',NULL,2123,2124,2117,1,1), +(2120,3,NULL,'Languages and structures',NULL,2125,2126,2117,1,1), +(2121,3,NULL,'Multiagent systems (NEW)',NULL,2127,2128,2117,1,1), +(2122,3,'I.2.m','Miscellaneous','I.2.m',2130,2131,1096,1,1), +(2123,3,'I.3.0','General','I.3.0',2134,2135,1097,1,1), +(2124,3,'I.3.1','Hardware Architecture (B.4.2)','I.3.1',2136,2153,1097,1,1), +(2125,3,NULL,'Graphics processors',NULL,2137,2138,2124,1,1), +(2126,3,NULL,'Hardcopy devices**',NULL,2139,2140,2124,1,1), +(2127,3,NULL,'Input devices',NULL,2141,2142,2124,1,1), +(2128,3,NULL,'Parallel processing',NULL,2143,2144,2124,1,1), +(2129,3,NULL,'Raster display devices',NULL,2145,2146,2124,1,1), +(2130,3,NULL,'Storage devices**',NULL,2147,2148,2124,1,1), +(2131,3,NULL,'Three-dimensional displays**',NULL,2149,2150,2124,1,1), +(2132,3,NULL,'Vector display devices**',NULL,2151,2152,2124,1,1), +(2133,3,'I.3.2','Graphics Systems (C.2.1, C.2.4, C.3)','I.3.2',2154,2161,1097,1,1), +(2134,3,NULL,'Distributed/network graphics',NULL,2155,2156,2133,1,1), +(2135,3,NULL,'Remote systems**',NULL,2157,2158,2133,1,1), +(2136,3,NULL,'Stand-alone systems**',NULL,2159,2160,2133,1,1), +(2137,3,'I.3.3','Picture/Image Generation','I.3.3',2162,2175,1097,1,1), +(2138,3,NULL,'Antialiasing**',NULL,2163,2164,2137,1,1), +(2139,3,NULL,'Bitmap and framebuffer operations',NULL,2165,2166,2137,1,1), +(2140,3,NULL,'Digitizing and scanning',NULL,2167,2168,2137,1,1), +(2141,3,NULL,'Display algorithms',NULL,2169,2170,2137,1,1), +(2142,3,NULL,'Line and curve generation',NULL,2171,2172,2137,1,1), +(2143,3,NULL,'Viewing algorithms',NULL,2173,2174,2137,1,1), +(2144,3,'I.3.4','Graphics Utilities','I.3.4',2176,2195,1097,1,1), +(2145,3,NULL,'Application packages',NULL,2177,2178,2144,1,1), +(2146,3,NULL,'Device drivers**',NULL,2179,2180,2144,1,1), +(2147,3,NULL,'Graphics editors',NULL,2181,2182,2144,1,1), +(2148,3,NULL,'Graphics packages',NULL,2183,2184,2144,1,1), +(2149,3,NULL,'Meta files**',NULL,2185,2186,2144,1,1), +(2150,3,NULL,'Paint systems',NULL,2187,2188,2144,1,1), +(2151,3,NULL,'Picture description languages**',NULL,2189,2190,2144,1,1), +(2152,3,NULL,'Software support',NULL,2191,2192,2144,1,1), +(2153,3,NULL,'Virtual device interfaces',NULL,2193,2194,2144,1,1), +(2154,3,'I.3.5','Computational Geometry and Object Modeling','I.3.5',2196,2215,1097,1,1), +(2155,3,NULL,'Boundary representations',NULL,2197,2198,2154,1,1), +(2156,3,NULL,'Constructive solid geometry (CSG)**',NULL,2199,2200,2154,1,1), +(2157,3,NULL,'Curve, surface, solid, and object representations',NULL,2201,2202,2154,1,1), +(2158,3,NULL,'Geometric algorithms, languages, and systems',NULL,2203,2204,2154,1,1), +(2159,3,NULL,'Hierarchy and geometric transformations',NULL,2205,2206,2154,1,1), +(2160,3,NULL,'Modeling packages',NULL,2207,2208,2154,1,1), +(2161,3,NULL,'Object hierarchies',NULL,2209,2210,2154,1,1), +(2162,3,NULL,'Physically based modeling',NULL,2211,2212,2154,1,1), +(2163,3,NULL,'Splines',NULL,2213,2214,2154,1,1), +(2164,3,'I.3.6','Methodology and Techniques','I.3.6',2216,2229,1097,1,1), +(2165,3,NULL,'Device independence**',NULL,2217,2218,2164,1,1), +(2166,3,NULL,'Ergonomics',NULL,2219,2220,2164,1,1), +(2167,3,NULL,'Graphics data structures and data types',NULL,2221,2222,2164,1,1), +(2168,3,NULL,'Interaction techniques',NULL,2223,2224,2164,1,1), +(2169,3,NULL,'Languages',NULL,2225,2226,2164,1,1), +(2170,3,NULL,'Standards',NULL,2227,2228,2164,1,1), +(2171,3,'I.3.7','Three-Dimensional Graphics and Realism','I.3.7',2230,2247,1097,1,1), +(2172,3,NULL,'Animation',NULL,2231,2232,2171,1,1), +(2173,3,NULL,'Color, shading, shadowing, and texture',NULL,2233,2234,2171,1,1), +(2174,3,NULL,'Fractals',NULL,2235,2236,2171,1,1), +(2175,3,NULL,'Hidden line/surface removal',NULL,2237,2238,2171,1,1), +(2176,3,NULL,'Radiosity',NULL,2239,2240,2171,1,1), +(2177,3,NULL,'Raytracing',NULL,2241,2242,2171,1,1), +(2178,3,NULL,'Virtual reality',NULL,2243,2244,2171,1,1), +(2179,3,NULL,'Visible line/surface algorithms',NULL,2245,2246,2171,1,1), +(2180,3,'I.3.8','Applications','I.3.8',2248,2249,1097,1,1), +(2181,3,'I.3.m','Miscellaneous','I.3.m',2250,2251,1097,1,1), +(2182,3,'I.4.0','General','I.4.0',2254,2259,1098,1,1), +(2183,3,NULL,'Image displays',NULL,2255,2256,2182,1,1), +(2184,3,NULL,'Image processing software',NULL,2257,2258,2182,1,1), +(2185,3,'I.4.1','Digitization and Image Capture (REVISED)','I.4.1',2260,2275,1098,1,1), +(2186,3,NULL,'Camera calibration (NEW)',NULL,2261,2262,2185,1,1), +(2187,3,NULL,'Imaging geometry (NEW)',NULL,2263,2264,2185,1,1), +(2188,3,NULL,'Quantization',NULL,2265,2266,2185,1,1), +(2189,3,NULL,'Radiometry (NEW)',NULL,2267,2268,2185,1,1), +(2190,3,NULL,'Reflectance (NEW)',NULL,2269,2270,2185,1,1), +(2191,3,NULL,'Sampling',NULL,2271,2272,2185,1,1), +(2192,3,NULL,'Scanning',NULL,2273,2274,2185,1,1), +(2193,3,'I.4.2','Compression (Coding) (E.4)','I.4.2',2276,2281,1098,1,1), +(2194,3,NULL,'Approximate methods',NULL,2277,2278,2193,1,1), +(2195,3,NULL,'Exact coding**',NULL,2279,2280,2193,1,1), +(2196,3,'I.4.3','Enhancement','I.4.3',2282,2295,1098,1,1), +(2197,3,NULL,'Filtering',NULL,2283,2284,2196,1,1), +(2198,3,NULL,'Geometric correction',NULL,2285,2286,2196,1,1), +(2199,3,NULL,'Grayscale manipulation',NULL,2287,2288,2196,1,1), +(2200,3,NULL,'Registration',NULL,2289,2290,2196,1,1), +(2201,3,NULL,'Sharpening and deblurring**',NULL,2291,2292,2196,1,1), +(2202,3,NULL,'Smoothing',NULL,2293,2294,2196,1,1), +(2203,3,'I.4.4','Restoration','I.4.4',2296,2305,1098,1,1), +(2204,3,NULL,'Inverse filtering**',NULL,2297,2298,2203,1,1), +(2205,3,NULL,'Kalman filtering',NULL,2299,2300,2203,1,1), +(2206,3,NULL,'Pseudoinverse restoration**',NULL,2301,2302,2203,1,1), +(2207,3,NULL,'Wiener filtering**',NULL,2303,2304,2203,1,1), +(2208,3,'I.4.5','Reconstruction','I.4.5',2306,2313,1098,1,1), +(2209,3,NULL,'Series expansion methods',NULL,2307,2308,2208,1,1), +(2210,3,NULL,'Summation methods**',NULL,2309,2310,2208,1,1), +(2211,3,NULL,'Transform methods',NULL,2311,2312,2208,1,1), +(2212,3,'I.4.6','Segmentation','I.4.6',2314,2323,1098,1,1), +(2213,3,NULL,'Edge and feature detection',NULL,2315,2316,2212,1,1), +(2214,3,NULL,'Pixel classification',NULL,2317,2318,2212,1,1), +(2215,3,NULL,'Region growing, partitioning',NULL,2319,2320,2212,1,1), +(2216,3,NULL,'Relaxation (NEW)',NULL,2321,2322,2212,1,1), +(2217,3,'I.4.7','Feature Measurement','I.4.7',2324,2337,1098,1,1), +(2218,3,NULL,'Feature representation (NEW)',NULL,2325,2326,2217,1,1), +(2219,3,NULL,'Invariants',NULL,2327,2328,2217,1,1), +(2220,3,NULL,'Moments',NULL,2329,2330,2217,1,1), +(2221,3,NULL,'Projections',NULL,2331,2332,2217,1,1), +(2222,3,NULL,'Size and shape',NULL,2333,2334,2217,1,1), +(2223,3,NULL,'Texture',NULL,2335,2336,2217,1,1), +(2224,3,'I.4.8','Scene Analysis','I.4.8',2338,2365,1098,1,1), +(2225,3,NULL,'Color (NEW)',NULL,2339,2340,2224,1,1), +(2226,3,NULL,'Depth cues',NULL,2341,2342,2224,1,1), +(2227,3,NULL,'Motion (NEW)',NULL,2343,2344,2224,1,1), +(2228,3,NULL,'Object recognition (NEW)',NULL,2345,2346,2224,1,1), +(2229,3,NULL,'Photometry',NULL,2347,2348,2224,1,1), +(2230,3,NULL,'Range data',NULL,2349,2350,2224,1,1), +(2231,3,NULL,'Sensor fusion',NULL,2351,2352,2224,1,1), +(2232,3,NULL,'Shading (NEW)',NULL,2353,2354,2224,1,1), +(2233,3,NULL,'Shape (NEW)',NULL,2355,2356,2224,1,1), +(2234,3,NULL,'Stereo',NULL,2357,2358,2224,1,1), +(2235,3,NULL,'Surface fitting (NEW)',NULL,2359,2360,2224,1,1), +(2236,3,NULL,'Time-varying imagery',NULL,2361,2362,2224,1,1), +(2237,3,NULL,'Tracking (NEW)',NULL,2363,2364,2224,1,1), +(2238,3,'I.4.9','Applications','I.4.9',2366,2367,1098,1,1), +(2239,3,'I.4.10','Image Representation','I.4.10',2368,2379,1098,1,1), +(2240,3,NULL,'Hierarchical',NULL,2369,2370,2239,1,1), +(2241,3,NULL,'Morphological',NULL,2371,2372,2239,1,1), +(2242,3,NULL,'Multidimensional',NULL,2373,2374,2239,1,1), +(2243,3,NULL,'Statistical',NULL,2375,2376,2239,1,1), +(2244,3,NULL,'Volumetric',NULL,2377,2378,2239,1,1), +(2245,3,'I.4.m','Miscellaneous','I.4.m',2380,2381,1098,1,1), +(2246,3,'I.5.0','General','I.5.0',2384,2385,1099,1,1), +(2247,3,'I.5.1','Models','I.5.1',2386,2399,1099,1,1), +(2248,3,NULL,'Deterministic**',NULL,2387,2388,2247,1,1), +(2249,3,NULL,'Fuzzy set',NULL,2389,2390,2247,1,1), +(2250,3,NULL,'Geometric',NULL,2391,2392,2247,1,1), +(2251,3,NULL,'Neural nets',NULL,2393,2394,2247,1,1), +(2252,3,NULL,'Statistical',NULL,2395,2396,2247,1,1), +(2253,3,NULL,'Structural',NULL,2397,2398,2247,1,1), +(2254,3,'I.5.2','Design Methodology','I.5.2',2400,2407,1099,1,1), +(2255,3,NULL,'Classifier design and evaluation',NULL,2401,2402,2254,1,1), +(2256,3,NULL,'Feature evaluation and selection',NULL,2403,2404,2254,1,1), +(2257,3,NULL,'Pattern analysis',NULL,2405,2406,2254,1,1), +(2258,3,'I.5.3','Clustering','I.5.3',2408,2413,1099,1,1), +(2259,3,NULL,'Algorithms',NULL,2409,2410,2258,1,1), +(2260,3,NULL,'Similarity measures',NULL,2411,2412,2258,1,1), +(2261,3,'I.5.4','Applications','I.5.4',2414,2423,1099,1,1), +(2262,3,NULL,'Computer vision',NULL,2415,2416,2261,1,1), +(2263,3,NULL,'Signal processing',NULL,2417,2418,2261,1,1), +(2264,3,NULL,'Text processing',NULL,2419,2420,2261,1,1), +(2265,3,NULL,'Waveform analysis',NULL,2421,2422,2261,1,1), +(2266,3,'I.5.5','Implementation (C.3)','I.5.5',2424,2429,1099,1,1), +(2267,3,NULL,'Interactive systems',NULL,2425,2426,2266,1,1), +(2268,3,NULL,'Special architectures',NULL,2427,2428,2266,1,1), +(2269,3,'I.5.m','Miscellaneous','I.5.m',2430,2431,1099,1,1), +(2270,3,'I.6.0','General','I.6.0',2434,2435,1100,1,1), +(2271,3,'I.6.1','Simulation Theory','I.6.1',2436,2443,1100,1,1), +(2272,3,NULL,'Model classification',NULL,2437,2438,2271,1,1), +(2273,3,NULL,'Systems theory',NULL,2439,2440,2271,1,1), +(2274,3,NULL,'Types of simulation (continuous and discrete)*',NULL,2441,2442,2271,1,1), +(2275,3,'I.6.2','Simulation Languages','I.6.2',2444,2445,1100,1,1), +(2276,3,'I.6.3','Applications','I.6.3',2446,2447,1100,1,1), +(2277,3,'I.6.4','Model Validation and Analysis','I.6.4',2448,2449,1100,1,1), +(2278,3,'I.6.5','Model Development','I.6.5',2450,2453,1100,1,1), +(2279,3,NULL,'Modeling methodologies',NULL,2451,2452,2278,1,1), +(2280,3,'I.6.6','Simulation Output Analysis','I.6.6',2454,2455,1100,1,1), +(2281,3,'I.6.7','Simulation Support Systems','I.6.7',2456,2459,1100,1,1), +(2282,3,NULL,'Environments',NULL,2457,2458,2281,1,1), +(2283,3,'I.6.8','Types of Simulation','I.6.8',2460,2479,1100,1,1), +(2284,3,NULL,'Animation',NULL,2461,2462,2283,1,1), +(2285,3,NULL,'Combined',NULL,2463,2464,2283,1,1), +(2286,3,NULL,'Continuous',NULL,2465,2466,2283,1,1), +(2287,3,NULL,'Discrete event',NULL,2467,2468,2283,1,1), +(2288,3,NULL,'Distributed',NULL,2469,2470,2283,1,1), +(2289,3,NULL,'Gaming',NULL,2471,2472,2283,1,1), +(2290,3,NULL,'Monte Carlo',NULL,2473,2474,2283,1,1), +(2291,3,NULL,'Parallel',NULL,2475,2476,2283,1,1), +(2292,3,NULL,'Visual',NULL,2477,2478,2283,1,1), +(2293,3,'I.6.m','Miscellaneous','I.6.m',2480,2481,1100,1,1), +(2294,3,'I.7.0','General','I.7.0',2484,2485,1101,1,1), +(2295,3,'I.7.1','Document and Text Editing (REVISED)','I.7.1',2486,2495,1101,1,1), +(2296,3,NULL,'Document management (NEW)',NULL,2487,2488,2295,1,1), +(2297,3,NULL,'Languages**',NULL,2489,2490,2295,1,1), +(2298,3,NULL,'Spelling**',NULL,2491,2492,2295,1,1), +(2299,3,NULL,'Version control (NEW)',NULL,2493,2494,2295,1,1), +(2300,3,'I.7.2','Document Preparation','I.7.2',2496,2517,1101,1,1), +(2301,3,NULL,'Desktop publishing',NULL,2497,2498,2300,1,1), +(2302,3,NULL,'Format and notation',NULL,2499,2500,2300,1,1), +(2303,3,NULL,'Hypertext/hypermedia',NULL,2501,2502,2300,1,1), +(2304,3,NULL,'Index generation (NEW)',NULL,2503,2504,2300,1,1), +(2305,3,NULL,'Languages and systems',NULL,2505,2506,2300,1,1), +(2306,3,NULL,'Markup languages (NEW)',NULL,2507,2508,2300,1,1), +(2307,3,NULL,'Multi/mixed media',NULL,2509,2510,2300,1,1), +(2308,3,NULL,'Photocomposition/typesetting',NULL,2511,2512,2300,1,1), +(2309,3,NULL,'Scripting languages (NEW)',NULL,2513,2514,2300,1,1), +(2310,3,NULL,'Standards',NULL,2515,2516,2300,1,1), +(2311,3,'I.7.3','Index Generation**','I.7.3',2518,2519,1101,1,1), +(2312,3,'I.7.4','Electronic Publishing (H.5.4, J.7) (NEW)','I.7.4',2520,2521,1101,1,1), +(2313,3,'I.7.5','Document Capture (I.4.1) (NEW)','I.7.5',2522,2531,1101,1,1), +(2314,3,NULL,'Document analysis (NEW)',NULL,2523,2524,2313,1,1), +(2315,3,NULL,'Graphics recognition and interpretation (NEW)',NULL,2525,2526,2313,1,1), +(2316,3,NULL,'Optical character recognition (OCR) (NEW)',NULL,2527,2528,2313,1,1), +(2317,3,NULL,'Scanning (NEW)',NULL,2529,2530,2313,1,1), +(2318,3,'I.7.m','Miscellaneous','I.7.m',2532,2533,1101,1,1), +(2319,3,NULL,'Business',NULL,2542,2543,1104,1,1), +(2320,3,NULL,'Education',NULL,2544,2545,1104,1,1), +(2321,3,NULL,'Financial (e.g., EFTS)',NULL,2546,2547,1104,1,1), +(2322,3,NULL,'Government',NULL,2548,2549,1104,1,1), +(2323,3,NULL,'Law',NULL,2550,2551,1104,1,1), +(2324,3,NULL,'Manufacturing',NULL,2552,2553,1104,1,1), +(2325,3,NULL,'Marketing',NULL,2554,2555,1104,1,1), +(2326,3,NULL,'Military',NULL,2556,2557,1104,1,1), +(2327,3,NULL,'Aerospace',NULL,2560,2561,1105,1,1), +(2328,3,NULL,'Archaeology (NEW)',NULL,2562,2563,1105,1,1), +(2329,3,NULL,'Astronomy',NULL,2564,2565,1105,1,1), +(2330,3,NULL,'Chemistry',NULL,2566,2567,1105,1,1), +(2331,3,NULL,'Earth and atmospheric sciences',NULL,2568,2569,1105,1,1), +(2332,3,NULL,'Electronics',NULL,2570,2571,1105,1,1), +(2333,3,NULL,'Engineering',NULL,2572,2573,1105,1,1), +(2334,3,NULL,'Mathematics and statistics',NULL,2574,2575,1105,1,1), +(2335,3,NULL,'Physics',NULL,2576,2577,1105,1,1), +(2336,3,NULL,'Biology and genetics (REVISED)',NULL,2580,2581,1106,1,1), +(2337,3,NULL,'Health',NULL,2582,2583,1106,1,1), +(2338,3,NULL,'Medical information systems',NULL,2584,2585,1106,1,1), +(2339,3,NULL,'Economics',NULL,2588,2589,1107,1,1), +(2340,3,NULL,'Psychology',NULL,2590,2591,1107,1,1), +(2341,3,NULL,'Sociology',NULL,2592,2593,1107,1,1), +(2342,3,NULL,'Architecture (NEW)',NULL,2596,2597,1108,1,1), +(2343,3,NULL,'Arts, fine and performing**',NULL,2598,2599,1108,1,1), +(2344,3,NULL,'Fine arts (NEW)',NULL,2600,2601,1108,1,1), +(2345,3,NULL,'Language translation',NULL,2602,2603,1108,1,1), +(2346,3,NULL,'Linguistics',NULL,2604,2605,1108,1,1), +(2347,3,NULL,'Literature',NULL,2606,2607,1108,1,1), +(2348,3,NULL,'Music**',NULL,2608,2609,1108,1,1), +(2349,3,NULL,'Performing arts (e.g., dance, music) (NEW)',NULL,2610,2611,1108,1,1), +(2350,3,NULL,'Computer-aided design (CAD)',NULL,2614,2615,1109,1,1), +(2351,3,NULL,'Computer-aided manufacturing (CAM)',NULL,2616,2617,1109,1,1), +(2352,3,NULL,'Command and control',NULL,2620,2621,1110,1,1), +(2353,3,NULL,'Consumer products',NULL,2622,2623,1110,1,1), +(2354,3,NULL,'Industrial control',NULL,2624,2625,1110,1,1), +(2355,3,NULL,'Military',NULL,2626,2627,1110,1,1), +(2356,3,NULL,'Process control',NULL,2628,2629,1110,1,1), +(2357,3,NULL,'Publishing',NULL,2630,2631,1110,1,1), +(2358,3,NULL,'Real time',NULL,2632,2633,1110,1,1), +(2359,3,NULL,'Markets',NULL,2642,2643,1113,1,1), +(2360,3,NULL,'Standards',NULL,2644,2645,1113,1,1), +(2361,3,NULL,'Statistics',NULL,2646,2647,1113,1,1), +(2362,3,NULL,'Suppliers',NULL,2648,2649,1113,1,1), +(2363,3,NULL,'Hardware',NULL,2652,2653,1114,1,1), +(2364,3,NULL,'People',NULL,2654,2655,1114,1,1), +(2365,3,NULL,'Software',NULL,2656,2657,1114,1,1), +(2366,3,NULL,'Systems',NULL,2658,2659,1114,1,1), +(2367,3,NULL,'Theory',NULL,2660,2661,1114,1,1), +(2368,3,'K.3.0','General','K.3.0',2664,2665,1115,1,1), +(2369,3,'K.3.1','Computer Uses in Education','K.3.1',2666,2675,1115,1,1), +(2370,3,NULL,'Collaborative learning (NEW)',NULL,2667,2668,2369,1,1), +(2371,3,NULL,'Computer-assisted instruction (CAI)',NULL,2669,2670,2369,1,1), +(2372,3,NULL,'Computer-managed instruction (CMI)',NULL,2671,2672,2369,1,1), +(2373,3,NULL,'Distance learning (NEW)',NULL,2673,2674,2369,1,1), +(2374,3,'K.3.2','Computer and Information Science Education','K.3.2',2676,2689,1115,1,1), +(2375,3,NULL,'Accreditation (NEW)',NULL,2677,2678,2374,1,1), +(2376,3,NULL,'Computer science education',NULL,2679,2680,2374,1,1), +(2377,3,NULL,'Curriculum',NULL,2681,2682,2374,1,1), +(2378,3,NULL,'Information systems education',NULL,2683,2684,2374,1,1), +(2379,3,NULL,'Literacy (NEW)',NULL,2685,2686,2374,1,1), +(2380,3,NULL,'Self-assessment',NULL,2687,2688,2374,1,1), +(2381,3,'K.3.m','Miscellaneous','K.3.m',2690,2695,1115,1,1), +(2382,3,NULL,'Accreditation**',NULL,2691,2692,2381,1,1), +(2383,3,NULL,'Computer literacy**',NULL,2693,2694,2381,1,1), +(2384,3,'K.4.0','General','K.4.0',2698,2699,1116,1,1), +(2385,3,'K.4.1','Public Policy Issues','K.4.1',2700,2719,1116,1,1), +(2386,3,NULL,'Abuse and crime involving computers (NEW)',NULL,2701,2702,2385,1,1), +(2387,3,NULL,'Computer-related health issues (NEW)',NULL,2703,2704,2385,1,1), +(2388,3,NULL,'Ethics (NEW)',NULL,2705,2706,2385,1,1), +(2389,3,NULL,'Human safety',NULL,2707,2708,2385,1,1), +(2390,3,NULL,'Intellectual property rights (NEW)',NULL,2709,2710,2385,1,1), +(2391,3,NULL,'Privacy',NULL,2711,2712,2385,1,1), +(2392,3,NULL,'Regulation',NULL,2713,2714,2385,1,1), +(2393,3,NULL,'Transborder data flow',NULL,2715,2716,2385,1,1), +(2394,3,NULL,'Use/abuse of power (NEW)',NULL,2717,2718,2385,1,1), +(2395,3,'K.4.2','Social Issues','K.4.2',2720,2729,1116,1,1), +(2396,3,NULL,'Abuse and crime involving computers**',NULL,2721,2722,2395,1,1), +(2397,3,NULL,'Assistive technologies for persons with disabilities (NEW)',NULL,2723,2724,2395,1,1), +(2398,3,NULL,'Employment',NULL,2725,2726,2395,1,1), +(2399,3,NULL,'Handicapped persons/special needs**',NULL,2727,2728,2395,1,1), +(2400,3,'K.4.3','Organizational Impacts','K.4.3',2730,2739,1116,1,1), +(2401,3,NULL,'Automation (NEW)',NULL,2731,2732,2400,1,1), +(2402,3,NULL,'Computer-supported collaborative work (NEW)',NULL,2733,2734,2400,1,1), +(2403,3,NULL,'Employment (NEW)',NULL,2735,2736,2400,1,1), +(2404,3,NULL,'Reengineering (NEW)',NULL,2737,2738,2400,1,1), +(2405,3,'K.4.4','Electronic Commerce (J.1) (NEW)','K.4.4',2740,2753,1116,1,1), +(2406,3,NULL,'Cybercash, digital cash (NEW)',NULL,2741,2742,2405,1,1), +(2407,3,NULL,'Distributed commercial transactions (NEW)',NULL,2743,2744,2405,1,1), +(2408,3,NULL,'Electronic data interchange (EDI) (NEW)',NULL,2745,2746,2405,1,1), +(2409,3,NULL,'Intellectual property (NEW)',NULL,2747,2748,2405,1,1), +(2410,3,NULL,'Payment schemes (NEW)',NULL,2749,2750,2405,1,1), +(2411,3,NULL,'Security (NEW)',NULL,2751,2752,2405,1,1), +(2412,3,'K.4.m','Miscellaneous','K.4.m',2754,2755,1116,1,1), +(2413,3,'K.5.0','General','K.5.0',2758,2759,1117,1,1), +(2414,3,'K.5.1','Hardware/Software Protection (REVISED)','K.5.1',2760,2771,1117,1,1), +(2415,3,NULL,'Copyrights',NULL,2761,2762,2414,1,1), +(2416,3,NULL,'Licensing (NEW)',NULL,2763,2764,2414,1,1), +(2417,3,NULL,'Patents',NULL,2765,2766,2414,1,1), +(2418,3,NULL,'Proprietary rights',NULL,2767,2768,2414,1,1), +(2419,3,NULL,'Trade secrets**',NULL,2769,2770,2414,1,1), +(2420,3,'K.5.2','Governmental Issues','K.5.2',2772,2779,1117,1,1), +(2421,3,NULL,'Censorship (NEW)',NULL,2773,2774,2420,1,1), +(2422,3,NULL,'Regulation',NULL,2775,2776,2420,1,1), +(2423,3,NULL,'Taxation',NULL,2777,2778,2420,1,1), +(2424,3,'K.5.m','Miscellaneous','K.5.m',2780,2785,1117,1,1), +(2425,3,NULL,'Contracts**',NULL,2781,2782,2424,1,1), +(2426,3,NULL,'Hardware patents**',NULL,2783,2784,2424,1,1), +(2427,3,'K.6.0','General','K.6.0',2788,2791,1118,1,1), +(2428,3,NULL,'Economics',NULL,2789,2790,2427,1,1), +(2429,3,'K.6.1','Project and People Management','K.6.1',2792,2807,1118,1,1), +(2430,3,NULL,'Life cycle',NULL,2793,2794,2429,1,1), +(2431,3,NULL,'Management techniques (e.g., PERT/CPM)',NULL,2795,2796,2429,1,1), +(2432,3,NULL,'Staffing',NULL,2797,2798,2429,1,1), +(2433,3,NULL,'Strategic information systems planning (NEW)',NULL,2799,2800,2429,1,1), +(2434,3,NULL,'Systems analysis and design',NULL,2801,2802,2429,1,1), +(2435,3,NULL,'Systems development',NULL,2803,2804,2429,1,1), +(2436,3,NULL,'Training',NULL,2805,2806,2429,1,1), +(2437,3,'K.6.2','Installation Management','K.6.2',2808,2819,1118,1,1), +(2438,3,NULL,'Benchmarks',NULL,2809,2810,2437,1,1), +(2439,3,NULL,'Computer selection',NULL,2811,2812,2437,1,1), +(2440,3,NULL,'Computing equipment management',NULL,2813,2814,2437,1,1), +(2441,3,NULL,'Performance and usage measurement',NULL,2815,2816,2437,1,1), +(2442,3,NULL,'Pricing and resource allocation',NULL,2817,2818,2437,1,1), +(2443,3,'K.6.3','Software Management (D.2.9)','K.6.3',2820,2829,1118,1,1), +(2444,3,NULL,'Software development',NULL,2821,2822,2443,1,1), +(2445,3,NULL,'Software maintenance',NULL,2823,2824,2443,1,1), +(2446,3,NULL,'Software process (NEW)',NULL,2825,2826,2443,1,1), +(2447,3,NULL,'Software selection',NULL,2827,2828,2443,1,1), +(2448,3,'K.6.4','System Management','K.6.4',2830,2837,1118,1,1), +(2449,3,NULL,'Centralization/decentralization',NULL,2831,2832,2448,1,1), +(2450,3,NULL,'Management audit',NULL,2833,2834,2448,1,1), +(2451,3,NULL,'Quality assurance',NULL,2835,2836,2448,1,1), +(2452,3,'K.6.5','Security and Protection (D.4.6, K.4.2)','K.6.5',2838,2849,1118,1,1), +(2453,3,NULL,'Authentication',NULL,2839,2840,2452,1,1), +(2454,3,NULL,'Insurance**',NULL,2841,2842,2452,1,1), +(2455,3,NULL,'Invasive software (e.g., viruses, worms, Trojan horses)',NULL,2843,2844,2452,1,1), +(2456,3,NULL,'Physical security**',NULL,2845,2846,2452,1,1), +(2457,3,NULL,'Unauthorized access (e.g., hacking, phreaking) (NEW)',NULL,2847,2848,2452,1,1), +(2458,3,'K.6.m','Miscellaneous','K.6.m',2850,2855,1118,1,1), +(2459,3,NULL,'Insurance*',NULL,2851,2852,2458,1,1), +(2460,3,NULL,'Security*',NULL,2853,2854,2458,1,1), +(2461,3,'K.7.0','General','K.7.0',2858,2859,1119,1,1), +(2462,3,'K.7.1','Occupations','K.7.1',2860,2861,1119,1,1), +(2463,3,'K.7.2','Organizations','K.7.2',2862,2863,1119,1,1), +(2464,3,'K.7.3','Testing, Certification, and Licensing','K.7.3',2864,2865,1119,1,1), +(2465,3,'K.7.4','Professional Ethics (K.4) (NEW)','K.7.4',2866,2873,1119,1,1), +(2466,3,NULL,'Codes of ethics (NEW)',NULL,2867,2868,2465,1,1), +(2467,3,NULL,'Codes of good practice (NEW)',NULL,2869,2870,2465,1,1), +(2468,3,NULL,'Ethical dilemmas (NEW)',NULL,2871,2872,2465,1,1), +(2469,3,'K.7.m','Miscellaneous','K.7.m',2874,2879,1119,1,1), +(2470,3,NULL,'Codes of good practice**',NULL,2875,2876,2469,1,1), +(2471,3,NULL,'Ethics**',NULL,2877,2878,2469,1,1), +(2472,3,NULL,'Games*',NULL,2882,2883,1120,1,1), +(2473,3,'K.8.0','General','K.8.0',2884,2887,1120,1,1), +(2474,3,NULL,'Games',NULL,2885,2886,2473,1,1), +(2475,3,'K.8.1','Application Packages','K.8.1',2888,2901,1120,1,1), +(2476,3,NULL,'Data communications',NULL,2889,2890,2475,1,1), +(2477,3,NULL,'Database processing',NULL,2891,2892,2475,1,1), +(2478,3,NULL,'Freeware/shareware (NEW)',NULL,2893,2894,2475,1,1), +(2479,3,NULL,'Graphics',NULL,2895,2896,2475,1,1), +(2480,3,NULL,'Spreadsheets',NULL,2897,2898,2475,1,1), +(2481,3,NULL,'Word processing',NULL,2899,2900,2475,1,1), +(2482,3,'K.8.2','Hardware','K.8.2',2902,2903,1120,1,1), +(2483,3,'K.8.3','Management/Maintenance','K.8.3',2904,2905,1120,1,1), +(2484,3,'K.8.m','Miscellaneous (NEW)','K.8.m',2906,2907,1120,1,1); \ No newline at end of file diff --git a/database/factories/create_collections_data_ddc.sql b/database/factories/create_collections_data_ddc.sql new file mode 100644 index 0000000..38e789c --- /dev/null +++ b/database/factories/create_collections_data_ddc.sql @@ -0,0 +1,1044 @@ +-- Dewey classification +/* The ten main classes are: see number at db below +0 Computer science, information & general works +1 Philosophy & psychology +2 Religion +3 Social sciences +4 Language +5 Science +6 Technology +7 Arts & recreation +8 Literature +9 History & geography +*/ + +INSERT INTO collections (id, role_id, number, name, oai_subset, left_id, right_id, parent_id, visible, visible_publish) VALUES +(3,2,'0','Informatik, Informationswissenschaft, allgemeine Werke','0',2,189,NULL,1,1), +(4,2,'1','Philosophie und Psychologie','1',190,389,NULL,1,1), +(5,2,'2','Religion','2',390,589,NULL,1,1), +(6,2,'3','Sozialwissenschaften','3',590,791,NULL,1,1), +(7,2,'4','Sprache','4',792,983,NULL,1,1), +(8,2,'5','Naturwissenschaften und Mathematik','5',984,1191,NULL,1,1), +(9,2,'6','Technik, Medizin, angewandte Wissenschaften','6',1192,1399,NULL,1,1), +(10,2,'7','Künste und Unterhaltung','7',1400,1613,NULL,1,1), +(11,2,'8','Literatur','8',1614,1833,NULL,1,1), +(12,2,'9','Geschichte und Geografie','9',1834,2053,NULL,1,1), +(13,2,'00','Informatik, Wissen, Systeme','00',3,18,3,1,1), +(14,2,'01','Bibliografien','01',19,38,3,1,1), +(15,2,'02','Bibliotheks- und Informationswissenschaften','02',39,56,3,1,1), +(16,2,'03','Enzyklopädien, Faktenbücher','03',57,78,3,1,1), +(17,2,'05','Zeitschriften, fortlaufende Sammelwerke','05',79,100,3,1,1), +(18,2,'06','Verbände, Organisationen, Museen','06',101,122,3,1,1), +(19,2,'07','Publizistische Medien, Journalismus, Verlagswesen','07',123,144,3,1,1), +(20,2,'08','Allgemeine Sammelwerke, Zitatensammlungen','08',145,166,3,1,1), +(21,2,'09','Handschriften, seltene Bücher','09',167,188,3,1,1), +(22,2,'10','Philosophie','10',191,210,4,1,1), +(23,2,'11','Metaphysik','11',211,230,4,0,1), +(24,2,'12','Epistemologie','12',231,250,4,0,1), +(25,2,'13','Parapsychologie, Okkultismus','13',251,266,4,1,1), +(26,2,'14','Philosophische Schulen','14',267,288,4,0,1), +(27,2,'15','Psychologie','15',289,304,4,1,1), +(28,2,'16','Logik','16',305,322,4,0,1), +(29,2,'17','Ethik','17',323,344,4,0,1), +(30,2,'18','Antike, mittelalterliche und östliche Philosophie','18',345,366,4,0,1), +(31,2,'19','Neuzeitliche westliche Philosophie','19',367,388,4,0,1), +(32,2,'20','Religion','20',391,412,5,1,1), +(33,2,'21','Religionsphilosophie, Religionstheorie','21',413,428,5,0,1), +(34,2,'22','Bibel','22',429,450,5,1,1), +(35,2,'23','Christentum, Christliche Theologie','23',451,470,5,1,1), +(36,2,'24','Christliche Erfahrung, christliches Leben','24',471,488,5,0,1), +(37,2,'25','Christliche Pastoraltheologie, Ordensgemeinschaften','25',489,504,5,0,1), +(38,2,'26','Kirchenorganisation, Sozialarbeit, Religionsausübung','26',505,526,5,0,1), +(39,2,'27','Geschichte des Christentums','27',527,548,5,0,1), +(40,2,'28','Christliche Konfessionen','28',549,568,5,0,1), +(41,2,'29','Andere Religionen','29',569,588,5,1,1), +(42,2,'30','Sozialwissenschaften, Soziologie','30',591,608,6,1,1), +(43,2,'31','Statistiken','31',609,624,6,1,1), +(44,2,'32','Politikwissenschaft','32',625,644,6,1,1), +(45,2,'33','Wirtschaft','33',645,666,6,1,1), +(46,2,'34','Recht','34',667,688,6,1,1), +(47,2,'35','Öffentliche Verwaltung, Militärwissenschaft','35',689,710,6,1,1), +(48,2,'36','Soziale Probleme, Sozialdienste','36',711,732,6,1,1), +(49,2,'37','Bildung und Erziehung','37',733,750,6,1,1), +(50,2,'38','Handel, Kommunikation, Verkehr','38',751,772,6,1,1), +(51,2,'39','Bräuche, Etikette, Folklore','39',773,790,6,1,1), +(52,2,'40','Sprache','40',793,814,7,1,1), +(53,2,'41','Linguistik','41',815,834,7,0,1), +(54,2,'42','Englisch, Altenglisch','42',835,852,7,1,1), +(55,2,'43','Deutsch, germanische Sprachen allgemein','43',853,870,7,1,1), +(56,2,'44','Französisch, romanische Sprachen allgemein','44',871,888,7,1,1), +(57,2,'45','Italienisch, Rumänisch, Rätoromanisch','45',889,906,7,1,1), +(58,2,'46','Spanisch, Portugiesisch','46',907,924,7,1,1), +(59,2,'47','Latein, italische Sprachen','47',925,942,7,1,1), +(60,2,'48','Griechisch','48',943,960,7,1,1), +(61,2,'49','Andere Sprachen','49',961,982,7,1,1), +(62,2,'50','Naturwissenschaften','50',985,1004,8,1,1), +(63,2,'51','Mathematik','51',1005,1024,8,1,1), +(64,2,'52','Astronomie','52',1025,1044,8,1,1), +(65,2,'53','Physik','53',1045,1066,8,1,1), +(66,2,'54','Chemie','54',1067,1084,8,1,1), +(67,2,'55','Geowissenschaften, Geologie','55',1085,1106,8,1,1), +(68,2,'56','Fossilien, Paläontologie','56',1107,1128,8,1,1), +(69,2,'57','Biowissenschaften, Biologie','57',1129,1148,8,1,1), +(70,2,'58','Pflanzen (Botanik)','58',1149,1168,8,1,1), +(71,2,'59','Tiere (Zoologie)','59',1169,1190,8,1,1), +(72,2,'60','Technik','60',1193,1214,9,1,1), +(73,2,'61','Medizin und Gesundheit','61',1215,1234,9,1,1), +(74,2,'62','Ingenieurwissenschaften','62',1235,1254,9,1,1), +(75,2,'63','Landwirtschaft','63',1255,1276,9,1,1), +(76,2,'64','Hauswirtschaft und Familie','64',1277,1298,9,1,1), +(77,2,'65','Management, Öffentlichkeitsarbeit','65',1299,1314,9,1,1), +(78,2,'66','Chemische Verfahrenstechnik','66',1315,1336,9,1,1), +(79,2,'67','Industrielle Fertigung','67',1337,1358,9,1,1), +(80,2,'68','Industrielle Fertigung für einzelne Verwendungszwecke','68',1359,1378,9,0,1), +(81,2,'69','Hausbau, Bauhandwerk','69',1379,1398,9,1,1), +(82,2,'70','Künste','70',1401,1422,10,1,1), +(83,2,'71','Landschaftsgestaltung, Raumplanung','71',1423,1444,10,1,1), +(84,2,'72','Architektur','72',1445,1466,10,1,1), +(85,2,'73','Bildhauerkunst, Keramik, Metallkunst','73',1467,1488,10,1,1), +(86,2,'74','Zeichnung, angewandte Kunst','74',1489,1510,10,1,1), +(87,2,'75','Malerei','75',1511,1530,10,1,1), +(88,2,'76','Grafik','76',1531,1548,10,1,1), +(89,2,'77','Fotografie, Computerkunst','77',1549,1568,10,1,1), +(90,2,'78','Musik','78',1569,1590,10,1,1), +(91,2,'79','Sport, Spiele, Unterhaltung','79',1591,1612,10,1,1), +(92,2,'80','Literatur, Rhetorik, Literaturwissenschaft','80',1615,1634,11,1,1), +(93,2,'81','Amerikanische Literatur in Englisch','81',1635,1656,11,1,1), +(94,2,'82','Englische, altenglische Literaturen','82',1657,1678,11,1,1), +(95,2,'83','Deutsche und verwandte Literaturen','83',1679,1700,11,1,1), +(96,2,'84','Französische und verwandte Literaturen','84',1701,1722,11,1,1), +(97,2,'85','Italienische, rumänische, rätoromanische Literaturen','85',1723,1744,11,1,1), +(98,2,'86','Spanische, portugiesische Literaturen','86',1745,1766,11,1,1), +(99,2,'87','Lateinische, italische Literaturen','87',1767,1788,11,1,1), +(100,2,'88','Griechische Literaturen','88',1789,1810,11,1,1), +(101,2,'89','Andere Literaturen','89',1811,1832,11,1,1), +(102,2,'90','Geschichte','90',1835,1856,12,1,1), +(103,2,'91','Geografie, Reisen','91',1857,1880,12,1,1), +(104,2,'92','Biografie, Genealogie','92',1881,1902,12,1,1), +(105,2,'93','Geschichte des Altertums (bis ca. 499), Archäologie','93',1903,1924,12,1,1), +(106,2,'94','Geschichte Europas','94',1925,1946,12,1,1), +(107,2,'95','Geschichte Asiens','95',1947,1968,12,1,1), +(108,2,'96','Geschichte Afrikas','96',1969,1990,12,1,1), +(109,2,'97','Geschichte Nordamerikas','97',1991,2012,12,1,1), +(110,2,'98','Geschichte Südamerikas','98',2013,2034,12,1,1), +(111,2,'99','Geschichte anderer Gebiete','99',2035,2052,12,1,1), +(112,2,'000','Informatik, Informationswissenschaft, allgemeine Werke','000',4,5,13,1,1), +(113,2,'001','Wissen','001',6,7,13,0,1), +(114,2,'002','Das Buch','002',8,9,13,0,1), +(115,2,'003','Systeme','003',10,11,13,0,1), +(116,2,'004','Datenverarbeitung, Informatik','004',12,13,13,1,1), +(117,2,'005','Computerprogrammierung, Programme, Daten','005',14,15,13,0,1), +(118,2,'006','Spezielle Computerverfahren','006',16,17,13,0,1), +(119,2,'010','Bibliografie','010',20,21,14,0,1), +(120,2,'011','Bibliografien','011',22,23,14,0,1), +(121,2,'012','Bibliografien von Einzelpersonen','012',24,25,14,0,1), +(122,2,'014','Bibliografien anonymer und pseudonymer Werke','014',26,27,14,0,1), +(123,2,'015','Bibliografien von Werken aus einzelnen Orten','015',28,29,14,0,1), +(124,2,'016','Bibliografien von Werken über einzelne Themen','016',30,31,14,0,1), +(125,2,'017','Allgemeine Sachkataloge','017',32,33,14,0,1), +(126,2,'018','Kataloge nach Autor, Erscheinungsjahr usw.','018',34,35,14,0,1), +(127,2,'019','Kreuzkataloge','019',36,37,14,0,1), +(128,2,'020','Bibliotheks- und Informationswissenschaften','020',40,41,15,0,1), +(129,2,'021','Beziehungen zwischen Bibliotheken','021',42,43,15,0,1), +(130,2,'022','Verwaltung von Bibliotheksgebäuden','022',44,45,15,0,1), +(131,2,'023','Personalmanagement','023',46,47,15,0,1), +(132,2,'025','Bibliothekarische Tätigkeiten','025',48,49,15,0,1), +(133,2,'026','Spezialbibliotheken','026',50,51,15,0,1), +(134,2,'027','Allgemeinbibliotheken','027',52,53,15,0,1), +(135,2,'028','Lesen und Nutzung anderer Informationsmedien','028',54,55,15,0,1), +(136,2,'030','Allgemeinenzyklopädien','030',58,59,16,0,1), +(137,2,'031','Enzyklopädien in amerikanischem Englisch','031',60,61,16,0,1), +(138,2,'032','Enzyklopädien in Englisch','032',62,63,16,0,1), +(139,2,'033','Enzyklopädien in Deutsch und Niederländisch','033',64,65,16,0,1), +(140,2,'034','Enzyklopädien in Französisch, Okzitanisch und Katalanisch','034',66,67,16,0,1), +(141,2,'035','Enzyklopädien in Italienisch, Rumänisch und Rätoromanisch','035',68,69,16,0,1), +(142,2,'036','Enzyklopädien in Spanisch und Portugiesisch','036',70,71,16,0,1), +(143,2,'037','Enzyklopädien in slawischen Sprachen','037',72,73,16,0,1), +(144,2,'038','Enzyklopädien in skandinavischen Sprachen','038',74,75,16,0,1), +(145,2,'039','Enzyklopädien in anderen Sprachen','039',76,77,16,0,1), +(146,2,'050','Zeitschriften, allgemeine fortlaufende Sammelwerke','050',80,81,17,0,1), +(147,2,'051','Fortlaufende Sammelwerke in amerikanischem Englisch','051',82,83,17,0,1), +(148,2,'052','Fortlaufende Sammelwerke in Englisch','052',84,85,17,0,1), +(149,2,'053','Fortlaufende Sammelwerke in Deutsch und Niederländisch','053',86,87,17,0,1), +(150,2,'054','Fortlaufende Sammelwerke in Französisch, Okzitanisch und Katalanisch','054',88,89,17,0,1), +(151,2,'055','Fortlaufende Sammelwerke in Italienisch, Rumänisch und Rätoromanisch','055',90,91,17,0,1), +(152,2,'056','Fortlaufende Sammelwerke in Spanisch und Portugiesisch','056',92,93,17,0,1), +(153,2,'057','Fortlaufende Sammelwerke in slawischen Sprachen','057',94,95,17,0,1), +(154,2,'058','Fortlaufende Sammelwerke in skandinavischen Sprachen','058',96,97,17,0,1), +(155,2,'059','Fortlaufende Sammelwerke in anderen Sprachen','059',98,99,17,0,1), +(156,2,'060','Allgemeine Organisationen, Museumswissenschaft','060',102,103,18,0,1), +(157,2,'061','Allgemeine Organisationen in Nordamerika','061',104,105,18,0,1), +(158,2,'062','Allgemeine Organisationen auf den Britischen Inseln, in England','062',106,107,18,0,1), +(159,2,'063','Allgemeine Organisationen in Mitteleuropa, in Deutschland','063',108,109,18,0,1), +(160,2,'064','Allgemeine Organisationen in Frankreich und Monaco','064',110,111,18,0,1), +(161,2,'065','Allgemeine Organisationen in Italien und auf benachbarten Inseln','065',112,113,18,0,1), +(162,2,'066','Allgemeine Organisationen auf der Iberischen Halbinsel und benachbarten Inseln','066',114,115,18,0,1), +(163,2,'067','Allgemeine Organisationen in Osteuropa, in Russland','067',116,117,18,0,1), +(164,2,'068','Allgemeine Organisationen in anderen geografischen Gebieten','068',118,119,18,0,1), +(165,2,'069','Museumswissenschaft','069',120,121,18,0,1), +(166,2,'070','Publizistische Medien, Journalismus, Verlagswesen','070',124,125,19,0,1), +(167,2,'071','Journalismus und Zeitungen in Nordamerika','071',126,127,19,0,1), +(168,2,'072','Journalismus und Zeitungen auf den Britischen Inseln, in England','072',128,129,19,0,1), +(169,2,'073','Journalismus und Zeitungen in Mitteleuropa, in Deutschland','073',130,131,19,0,1), +(170,2,'074','Journalismus und Zeitungen in Frankreich und Monaco','074',132,133,19,0,1), +(171,2,'075','Journalismus und Zeitungen in Italien und auf benachbarten Inseln','075',134,135,19,0,1), +(172,2,'076','Journalismus und Zeitungen auf der Iberischen Halbinsel und benachbarten Inseln','076',136,137,19,0,1), +(173,2,'077','Journalismus und Zeitungen in Osteuropa, in Russland','077',138,139,19,0,1), +(174,2,'078','Journalismus und Zeitungen in Skandinavien','078',140,141,19,0,1), +(175,2,'079','Journalismus und Zeitungen in anderen geografischen Gebieten','079',142,143,19,0,1), +(176,2,'080','Allgemeine Sammelwerke, Zitatensammlungen','080',146,147,20,0,1), +(177,2,'081','Sammelwerke in amerikanischem Englisch','081',148,149,20,0,1), +(178,2,'082','Sammelwerke in Englisch','082',150,151,20,0,1), +(179,2,'083','Sammelwerke in Deutsch und Niederländisch','083',152,153,20,0,1), +(180,2,'084','Sammelwerke in Französisch, Okzitanisch und Katalanisch','084',154,155,20,0,1), +(181,2,'085','Sammelwerke in Italienisch, Rumänisch und Rätoromanisch','085',156,157,20,0,1), +(182,2,'086','Sammelwerke in Spanisch und Portugiesisch','086',158,159,20,0,1), +(183,2,'087','Sammelwerke in slawischen Sprachen','087',160,161,20,0,1), +(184,2,'088','Sammelwerke in skandinavischen Sprachen','088',162,163,20,0,1), +(185,2,'089','Sammelwerke in anderen Sprachen','089',164,165,20,0,1), +(186,2,'090','Handschriften, seltene Bücher','090',168,169,21,0,1), +(187,2,'091','Handschriften','091',170,171,21,0,1), +(188,2,'092','Blockbücher','092',172,173,21,0,1), +(189,2,'093','Inkunabeln','093',174,175,21,0,1), +(190,2,'094','Gedruckte Bücher','094',176,177,21,0,1), +(191,2,'095','Bücher mit besonderem Einband','095',178,179,21,0,1), +(192,2,'096','Bücher mit besonderen Illustrationen','096',180,181,21,0,1), +(193,2,'097','Bücher aus besonderem Besitz oder besonderer Herkunft','097',182,183,21,0,1), +(194,2,'098','Verbotene Werke, Fälschungen, Scherzdrucke','098',184,185,21,0,1), +(195,2,'099','Bücher mit besonderem Format','099',186,187,21,0,1), +(196,2,'100','Philosophie und Psychologie','100',192,193,22,0,1), +(197,2,'101','Theorie der Philosophie','101',194,195,22,0,1), +(198,2,'102','Verschiedenes','102',196,197,22,0,1), +(199,2,'103','Wörterbücher, Enzyklopädien','103',198,199,22,0,1), +(200,2,'105','Fortlaufende Sammelwerke','105',200,201,22,0,1), +(201,2,'106','Organisationen, Management','106',202,203,22,0,1), +(202,2,'107','Ausbildung, Forschung, verwandte Themen','107',204,205,22,0,1), +(203,2,'108','Behandlung nach Personengruppen','108',206,207,22,0,1), +(204,2,'109','Histor. Behandlung, Behandlung mehrerer Einzelpersonen','109',208,209,22,0,1), +(205,2,'110','Metaphysik','110',212,213,23,1,1), +(206,2,'111','Ontologie','111',214,215,23,1,1), +(207,2,'113','Kosmologie','113',216,217,23,1,1), +(208,2,'114','Raum','114',218,219,23,1,1), +(209,2,'115','Zeit','115',220,221,23,1,1), +(210,2,'116','Veränderung','116',222,223,23,1,1), +(211,2,'117','Struktur','117',224,225,23,1,1), +(212,2,'118','Kraft und Energie','118',226,227,23,1,1), +(213,2,'119','Zahl und Quantität','119',228,229,23,1,1), +(214,2,'120','Epistemologie, Kausalität, Menschheit','120',232,233,24,1,1), +(215,2,'121','Epistemologie','121',234,235,24,1,1), +(216,2,'122','Kausalität','122',236,237,24,1,1), +(217,2,'123','Determinismus, Indeterminismus','123',238,239,24,1,1), +(218,2,'124','Teleologie','124',240,241,24,1,1), +(219,2,'126','Das Selbst','126',242,243,24,1,1), +(220,2,'127','Das Unbewusste, das Unterbewusste','127',244,245,24,1,1), +(221,2,'128','Menschheit','128',246,247,24,1,1), +(222,2,'129','Ursprung und Schicksal individueller Seelen','129',248,249,24,1,1), +(223,2,'130','Parapsychologie und Okkultismus','130',252,253,25,0,1), +(224,2,'131','Parapsychologische und okkulte Techniken','131',254,255,25,0,1), +(225,2,'133','Einzelne Themen der Parapsychologie und des Okkultismus','133',256,257,25,0,1), +(226,2,'135','Träume, Mysterien','135',258,259,25,0,1), +(227,2,'137','Divinatorische Graphologie','137',260,261,25,0,1), +(228,2,'138','Physiognomie','138',262,263,25,0,1), +(229,2,'139','Phrenologie','139',264,265,25,0,1), +(230,2,'140','Einzelne philosophische Schulen','140',268,269,26,1,1), +(231,2,'141','Idealismus und verwandte Systeme','141',270,271,26,1,1), +(232,2,'142','Kritizismus','142',272,273,26,1,1), +(233,2,'143','Bergsonismus, Intuitionismus','143',274,275,26,1,1), +(234,2,'144','Humanismus und verwandte Systeme','144',276,277,26,1,1), +(235,2,'145','Sensualismus','145',278,279,26,1,1), +(236,2,'146','Naturalismus und verwandte Systeme','146',280,281,26,1,1), +(237,2,'147','Pantheismus und verwandte Systeme','147',282,283,26,1,1), +(238,2,'148','Eklektizismus, Liberalismus, Traditionalismus','148',284,285,26,1,1), +(239,2,'149','Andere philosophische Systeme','149',286,287,26,1,1), +(240,2,'150','Psychologie','150',290,291,27,0,1), +(241,2,'152','Sinneswahrnehmung, Bewegung, Emotionen, Triebe','152',292,293,27,0,1), +(242,2,'153','Kognitive Prozesse, Intelligenz','153',294,295,27,0,1), +(243,2,'154','Unterbewusste und bewusstseinsveränderte Zustände','154',296,297,27,0,1), +(244,2,'155','Differentielle Psychologie, Entwicklungspsychologie','155',298,299,27,0,1), +(245,2,'156','Vergleichende Psychologie','156',300,301,27,0,1), +(246,2,'158','Angewandte Psychologie','158',302,303,27,0,1), +(247,2,'160','Logik','160',306,307,28,1,1), +(248,2,'161','Induktion','161',308,309,28,1,1), +(249,2,'162','Deduktion','162',310,311,28,1,1), +(250,2,'165','Fehlschlüsse, Fehlerquellen','165',312,313,28,1,1), +(251,2,'166','Syllogismen','166',314,315,28,1,1), +(252,2,'167','Hypothesen','167',316,317,28,1,1), +(253,2,'168','Argument, Überzeugungung','168',318,319,28,1,1), +(254,2,'169','Analogie','169',320,321,28,1,1), +(255,2,'170','Ethik','170',324,325,29,1,1), +(256,2,'171','Ethische Systeme','171',326,327,29,1,1), +(257,2,'172','Politische Ethik','172',328,329,29,1,1), +(258,2,'173','Familienethik','173',330,331,29,1,1), +(259,2,'174','Berufsethik','174',332,333,29,1,1), +(260,2,'175','Ethik von Freizeit und Erholung','175',334,335,29,1,1), +(261,2,'176','Sexual- und Reproduktionsethik','176',336,337,29,1,1), +(262,2,'177','Ethik sozialer Beziehungen','177',338,339,29,1,1), +(263,2,'178','Konsumethik','178',340,341,29,1,1), +(264,2,'179','Andere ethische Normen','179',342,343,29,1,1), +(265,2,'180','Antike, mittelalterliche und östliche Philosophie','180',346,347,30,1,1), +(266,2,'181','Östliche Philosophie','181',348,349,30,1,1), +(267,2,'182','Vorsokratische griechische Philosophien','182',350,351,30,1,1), +(268,2,'183','Sokratische und verwandte Philosophien','183',352,353,30,1,1), +(269,2,'184','Platonische Philosophie','184',354,355,30,1,1), +(270,2,'185','Aristotelische Philosophie','185',356,357,30,1,1), +(271,2,'186','Skeptische und neuplatonische Philosophien','186',358,359,30,1,1), +(272,2,'187','Epikureische Philosophie','187',360,361,30,1,1), +(273,2,'188','Stoische Philosophie','188',362,363,30,1,1), +(274,2,'189','Mittelalterliche westliche Philosophie','189',364,365,30,1,1), +(275,2,'190','Neuzeitliche westliche Philosophie','190',368,369,31,1,1), +(276,2,'191','Philosophie in den USA und Kanada','191',370,371,31,1,1), +(277,2,'192','Philosophie auf den Britischen Inseln','192',372,373,31,1,1), +(278,2,'193','Philosophie in Deutschland und Österreich','193',374,375,31,1,1), +(279,2,'194','Philosophie in Frankreich','194',376,377,31,1,1), +(280,2,'195','Philosophie in Italien','195',378,379,31,1,1), +(281,2,'196','Philosophie in Spanien und Portugal','196',380,381,31,1,1), +(282,2,'197','Philosophie in Russland und der früheren Sowjetunion','197',382,383,31,1,1), +(283,2,'198','Philosophie in Skandinavien','198',384,385,31,1,1), +(284,2,'199','Philosophie in anderen geografischen Gebieten','199',386,387,31,1,1), +(285,2,'200','Religion','200',392,393,32,0,1), +(286,2,'201','Religiöse Mythologie, Soziallehre','201',394,395,32,0,1), +(287,2,'202','Lehren','202',396,397,32,0,1), +(288,2,'203','Gottesdienst und andere Formen der öffentlichen Religionsausübung','203',398,399,32,0,1), +(289,2,'204','Religiöse Erfahrung, religiöses Leben, religiöse Praxis','204',400,401,32,0,1), +(290,2,'205','Religiöse Ethik','205',402,403,32,0,1), +(291,2,'206','Religiöse Führer und Organisation','206',404,405,32,0,1), +(292,2,'207','Mission, religiöse Erziehung','207',406,407,32,0,1), +(293,2,'208','Quellen','208',408,409,32,0,1), +(294,2,'209','Sekten, Reformbewegungen','209',410,411,32,0,1), +(295,2,'210','Religionsphilosophie, Religionstheorie','210',414,415,33,1,1), +(296,2,'211','Gottesvorstellungen','211',416,417,33,1,1), +(297,2,'212','Gottesfrage, Gotteserkenntnis, Eigenschaften Gottes','212',418,419,33,1,1), +(298,2,'213','Schöpfung','213',420,421,33,1,1), +(299,2,'214','Theodizee','214',422,423,33,1,1), +(300,2,'215','Naturwissenschaft und Religion','215',424,425,33,1,1), +(301,2,'218','Der Mensch','218',426,427,33,1,1), +(302,2,'220','Bibel','220',430,431,34,0,1), +(303,2,'221','Altes Testament (Tenach)','221',432,433,34,0,1), +(304,2,'222','Geschichtsbücher des Alten Testaments','222',434,435,34,0,1), +(305,2,'223','Poetische Bücher des Alten Testaments','223',436,437,34,0,1), +(306,2,'224','Prophetische Bücher des Alten Testaments','224',438,439,34,0,1), +(307,2,'225','Neues Testament','225',440,441,34,0,1), +(308,2,'226','Evangelien, Apostelgeschichte','226',442,443,34,0,1), +(309,2,'227','Briefe','227',444,445,34,0,1), +(310,2,'228','Johannes-Apokalypse (Offenbarung des Johannes)','228',446,447,34,0,1), +(311,2,'229','Apokryphen, Pseudepigraphen','229',448,449,34,0,1), +(312,2,'230','Christentum, Christliche Theologie','230',452,453,35,0,1), +(313,2,'231','Gott','231',454,455,35,0,1), +(314,2,'232','Jesus Christus und seine Familie','232',456,457,35,0,1), +(315,2,'233','Der Mensch','233',458,459,35,0,1), +(316,2,'234','Erlösung, Gnade','234',460,461,35,0,1), +(317,2,'235','Geistliche Wesen','235',462,463,35,0,1), +(318,2,'236','Eschatologie','236',464,465,35,0,1), +(319,2,'238','Glaubensbekenntnisse, Katechismen','238',466,467,35,0,1), +(320,2,'239','Apologetik, Polemik','239',468,469,35,0,1), +(321,2,'240','Christliche Ethik, spirituelle Theologie','240',472,473,36,1,1), +(322,2,'241','Christliche Ethik','241',474,475,36,1,1), +(323,2,'242','Erbauungsliteratur','242',476,477,36,1,1), +(324,2,'243','Evangelistisches Schrifttum für Einzelpersonen','243',478,479,36,1,1), +(325,2,'246','Kunst im Christentum','246',480,481,36,1,1), +(326,2,'247','Kirchenausstattung, liturgisches Gerät','247',482,483,36,1,1), +(327,2,'248','Christliche Erfahrung, christliche Praxis, christliches Leben','248',484,485,36,1,1), +(328,2,'249','Christliches Leben in der Familie','249',486,487,36,1,1), +(329,2,'250','Christliche Orden und Ortskirchen','250',490,491,37,1,1), +(330,2,'251','Homiletik','251',492,493,37,1,1), +(331,2,'252','Predigttexte','252',494,495,37,1,1), +(332,2,'253','Pastoraltheologie','253',496,497,37,1,1), +(333,2,'254','Gemeindeverwaltung','254',498,499,37,1,1), +(334,2,'255','Religiöse Kongregationen und Orden','255',500,501,37,1,1), +(335,2,'259','Familienseelsorge, Kategorialseelsorge','259',502,503,37,1,1), +(336,2,'260','Soziallehre, Ekklesiologie','260',506,507,38,1,1), +(337,2,'261','Soziallehre','261',508,509,38,1,1), +(338,2,'262','Ekklesiologie','262',510,511,38,1,1), +(339,2,'263','Heilige Tage, Zeiten und Orte','263',512,513,38,1,1), +(340,2,'264','Öffentliche Religionsausübung','264',514,515,38,1,1), +(341,2,'265','Sakramente, andere Riten und Handlungen','265',516,517,38,1,1), +(342,2,'266','Mission','266',518,519,38,1,1), +(343,2,'267','Religiöse Verbände','267',520,521,38,1,1), +(344,2,'268','Religiöse Erziehung','268',522,523,38,1,1), +(345,2,'269','Geistliche Erneuerung','269',524,525,38,1,1), +(346,2,'270','Geschichte des Christentums, Kirchengeschichte','270',528,529,39,1,1), +(347,2,'271','Religiöse Orden in der Kirchengeschichte','271',530,531,39,1,1), +(348,2,'272','Verfolgung in der Kirchengeschichte','272',532,533,39,1,1), +(349,2,'273','Dogmatische Kontroversen, Häresie','273',534,535,39,1,1), +(350,2,'274','Geschichte des Christentums in Europa','274',536,537,39,1,1), +(351,2,'275','Geschichte des Christentums in Asien','275',538,539,39,1,1), +(352,2,'276','Geschichte des Christentums in Afrika','276',540,541,39,1,1), +(353,2,'277','Geschichte des Christentums in Nordamerika','277',542,543,39,1,1), +(354,2,'278','Geschichte des Christentums in Südamerika','278',544,545,39,1,1), +(355,2,'279','Geschichte des Christentums in anderen Gebieten','279',546,547,39,1,1), +(356,2,'280','Christliche Konfessionen und Sekten','280',550,551,40,1,1), +(357,2,'281','Alte Kirche, Ostkirchen','281',552,553,40,1,1), +(358,2,'282','Römisch-Katholische Kirche','282',554,555,40,1,1), +(359,2,'283','Anglikanische Kirchen','283',556,557,40,1,1), +(360,2,'284','Protestanten kontinentaleuropäischen Ursprungs','284',558,559,40,1,1), +(361,2,'285','Presbyterianer, Reformierte, Kongregationalisten','285',560,561,40,1,1), +(362,2,'286','Baptisten, Disciples of Christ, Adventisten','286',562,563,40,1,1), +(363,2,'287','Methodisten und verwandte Kirchen','287',564,565,40,1,1), +(364,2,'289','Andere Konfessionen und Sekten','289',566,567,40,1,1), +(365,2,'290','Andere Religionen','290',570,571,41,0,1), +(366,2,'292','Griechische und römische Religion','292',572,573,41,0,1), +(367,2,'293','Germanische Religion','293',574,575,41,0,1), +(368,2,'294','Religionen indischen Ursprungs','294',576,577,41,0,1), +(369,2,'295','Parsismus','295',578,579,41,0,1), +(370,2,'296','Judentum','296',580,581,41,0,1), +(371,2,'297','Islam, Babismus, Bahaismus','297',582,583,41,0,1), +(372,2,'298','(Optionale Notation)','298',584,585,41,0,1), +(373,2,'299','An anderer Stelle nicht vorgesehene Religionen','299',586,587,41,0,1), +(374,2,'300','Sozialwissenschaften','300',592,593,42,0,1), +(375,2,'301','Soziologie, Anthropologie','301',594,595,42,0,1), +(376,2,'302','Soziale Interaktion','302',596,597,42,0,1), +(377,2,'303','Gesellschaftliche Prozesse','303',598,599,42,0,1), +(378,2,'304','Das Sozialverhalten beeinflussende Faktoren','304',600,601,42,0,1), +(379,2,'305','Soziale Gruppen','305',602,603,42,0,1), +(380,2,'306','Kultur und Institutionen','306',604,605,42,0,1), +(381,2,'307','Gemeinschaften','307',606,607,42,0,1), +(382,2,'310','Sammlungen allgemeiner Statistiken','310',610,611,43,0,1), +(383,2,'314','Allgemeine Statistiken zu Europa','314',612,613,43,0,1), +(384,2,'315','Allgemeine Statistiken zu Asien','315',614,615,43,0,1), +(385,2,'316','Allgemeine Statistiken zu Afrika','316',616,617,43,0,1), +(386,2,'317','Allgemeine Statistiken zu Nordamerika','317',618,619,43,0,1), +(387,2,'318','Allgemeine Statistiken zu Südamerika','318',620,621,43,0,1), +(388,2,'319','Allgemeine Statistiken zu anderen Gebieten','319',622,623,43,0,1), +(389,2,'320','Politikwissenschaft','320',626,627,44,0,1), +(390,2,'321','Staatsformen und Regierungssysteme','321',628,629,44,0,1), +(391,2,'322','Beziehungen des Staats zu organisierten Gruppen','322',630,631,44,0,1), +(392,2,'323','Grundrechte und politische Rechte','323',632,633,44,0,1), +(393,2,'324','Der politische Prozess','324',634,635,44,0,1), +(394,2,'325','Internationale Migration, Kolonisation','325',636,637,44,0,1), +(395,2,'326','Sklaverei und Sklavenbefreiung','326',638,639,44,0,1), +(396,2,'327','Internationale Beziehungen','327',640,641,44,0,1), +(397,2,'328','Der Gesetzgebungsprozess','328',642,643,44,0,1), +(398,2,'330','Wirtschaft','330',646,647,45,0,1), +(399,2,'331','Arbeitsökonomie','331',648,649,45,0,1), +(400,2,'332','Finanzwirtschaft','332',650,651,45,0,1), +(401,2,'333','Boden- und Energiewirtschaft','333',652,653,45,0,1), +(402,2,'334','Genossenschaften','334',654,655,45,0,1), +(403,2,'335','Sozialismus und verwandte Systeme','335',656,657,45,0,1), +(404,2,'336','Öffentliche Finanzen','336',658,659,45,0,1), +(405,2,'337','Weltwirtschaft','337',660,661,45,0,1), +(406,2,'338','Produktion','338',662,663,45,0,1), +(407,2,'339','Makroökonomie und verwandte Themen','339',664,665,45,0,1), +(408,2,'340','Recht','340',668,669,46,0,1), +(409,2,'341','Völkerrecht','341',670,671,46,0,1), +(410,2,'342','Verfassungs- und Verwaltungsrecht','342',672,673,46,0,1), +(411,2,'343','Wehrrecht, Steuerrecht, Wirtschaftsrecht','343',674,675,46,0,1), +(412,2,'344','Arbeitsrecht, Sozialrecht, Bildungsrecht, Kulturrecht','344',676,677,46,0,1), +(413,2,'345','Strafrecht','345',678,679,46,0,1), +(414,2,'346','Privatrecht','346',680,681,46,0,1), +(415,2,'347','Zivilprozessrecht, Zivilgerichte','347',682,683,46,0,1), +(416,2,'348','Gesetze, Verordnungen, Rechtsfälle','348',684,685,46,0,1), +(417,2,'349','Recht einzelner Gebietskörperschaften und Gebiete','349',686,687,46,0,1), +(418,2,'350','Öffentliche Verwaltung, Militärwissenschaft','350',690,691,47,1,1), +(419,2,'351','Öffentliche Verwaltung','351',692,693,47,0,1), +(420,2,'352','Allgemeines zur öffentlichen Verwaltung','352',694,695,47,0,1), +(421,2,'353','Einzelne Bereiche der öffentlichen Verwaltung','353',696,697,47,0,1), +(422,2,'354','Verwaltung von Wirtschaft und Umwelt','354',698,699,47,0,1), +(423,2,'355','Militärwissenschaft','355',700,701,47,1,1), +(424,2,'356','Infanterie und Kampfführung','356',702,703,47,0,1), +(425,2,'357','Kavalleriestreitkräfte und Kampfführung','357',704,705,47,0,1), +(426,2,'358','Luftstreitkräfte und andere spezialisierte Streitkräfte','358',706,707,47,0,1), +(427,2,'359','Seestreitkräfte und Kampfführung','359',708,709,47,0,1), +(428,2,'360','Soziale Probleme und Sozialdienste, Verbände','360',712,713,48,0,1), +(429,2,'361','Soziale Probleme und Sozialhilfe im Allgemeinen','361',714,715,48,0,1), +(430,2,'362','Probleme und Dienste der Sozialhilfe','362',716,717,48,0,1), +(431,2,'363','Andere soziale Probleme und Sozialdienste','363',718,719,48,0,1), +(432,2,'364','Kriminologie','364',720,721,48,0,1), +(433,2,'365','Justizvollzugsanstalten und verwandte Einrichtungen','365',722,723,48,0,1), +(434,2,'366','Verbände','366',724,725,48,0,1), +(435,2,'367','Allgemeine Klubs','367',726,727,48,0,1), +(436,2,'368','Versicherungen','368',728,729,48,0,1), +(437,2,'369','Verschiedene Arten von Verbänden','369',730,731,48,0,1), +(438,2,'370','Bildung und Erziehung','370',734,735,49,0,1), +(439,2,'371','Schulen, schulische Tätigkeiten, Sonderpädagogik','371',736,737,49,0,1), +(440,2,'372','Primar- und Elementarbildung','372',738,739,49,0,1), +(441,2,'373','Sekundarbildung','373',740,741,49,0,1), +(442,2,'374','Erwachsenenbildung','374',742,743,49,0,1), +(443,2,'375','Curricula','375',744,745,49,0,1), +(444,2,'378','Hochschulbildung','378',746,747,49,0,1), +(445,2,'379','Bildungspolitik','379',748,749,49,0,1), +(446,2,'380','Handel, Kommunikation, Verkehr','380',752,753,50,0,1), +(447,2,'381','Handel','381',754,755,50,0,1), +(448,2,'382','Internationaler Handel','382',756,757,50,0,1), +(449,2,'383','Postverkehr','383',758,759,50,0,1), +(450,2,'384','Kommunikation, Telekommunikation','384',760,761,50,0,1), +(451,2,'385','Schienenverkehr','385',762,763,50,0,1), +(452,2,'386','Binnenschifffahrt, Fährverkehr','386',764,765,50,0,1), +(453,2,'387','Schifffahrt, Luft-, Weltraumverkehr','387',766,767,50,0,1), +(454,2,'388','Verkehr, Landverkehr','388',768,769,50,0,1), +(455,2,'389','Metrologie, Normung','389',770,771,50,0,1), +(456,2,'390','Bräuche, Etikette, Folklore','390',774,775,51,0,1), +(457,2,'391','Kleidung, äußeres Erscheinungsbild','391',776,777,51,0,1), +(458,2,'392','Bräuche im Lebenslauf und im häuslichen Leben','392',778,779,51,0,1), +(459,2,'393','Sterbe- und Bestattungsriten','393',780,781,51,0,1), +(460,2,'394','Allgemeine Bräuche','394',782,783,51,0,1), +(461,2,'395','Etikette (Manieren)','395',784,785,51,0,1), +(462,2,'398','Folklore','398',786,787,51,0,1), +(463,2,'399','Bräuche des Krieges und der Diplomatie','399',788,789,51,0,1), +(464,2,'400','Sprache','400',794,795,52,0,1), +(465,2,'401','Sprachphilosophie, Sprachtheorie','401',796,797,52,0,1), +(466,2,'402','Verschiedenes','402',798,799,52,0,1), +(467,2,'403','Wörterbücher, Enzyklopädien','403',800,801,52,0,1), +(468,2,'404','Spezielle Themen','404',802,803,52,0,1), +(469,2,'405','Fortlaufende Sammelwerke','405',804,805,52,0,1), +(470,2,'406','Organisationen, Management','406',806,807,52,0,1), +(471,2,'407','Ausbildung, Forschung, verwandte Themen','407',808,809,52,0,1), +(472,2,'408','Behandlung nach Personengruppen','408',810,811,52,0,1), +(473,2,'409','Geografische, personenbezogene Behandlung','409',812,813,52,0,1), +(474,2,'410','Linguistik','410',816,817,53,1,1), +(475,2,'411','Schriftsysteme','411',818,819,53,1,1), +(476,2,'412','Etymologie','412',820,821,53,1,1), +(477,2,'413','Wörterbücher','413',822,823,53,1,1), +(478,2,'414','Phonologie, Phonetik','414',824,825,53,1,1), +(479,2,'415','Grammatik','415',826,827,53,1,1), +(480,2,'417','Dialektologie, historische Linguistik','417',828,829,53,1,1), +(481,2,'418','Standardsprache, Angewandte Linguistik','418',830,831,53,1,1), +(482,2,'419','Gebärdensprachen','419',832,833,53,1,1), +(483,2,'420','Englisch, Altenglisch','420',836,837,54,0,1), +(484,2,'421','Schriftsystem und Phonologie des Englischen','421',838,839,54,0,1), +(485,2,'422','Etymologie des Englischen','422',840,841,54,0,1), +(486,2,'423','Englische Wörterbücher','423',842,843,54,0,1), +(487,2,'425','Englische Grammatik','425',844,845,54,0,1), +(488,2,'427','Varianten des Englischen, Mittelenglisch','427',846,847,54,0,1), +(489,2,'428','Gebrauch des Standard-Englisch','428',848,849,54,0,1), +(490,2,'429','Altenglisch (Angelsächsisch)','429',850,851,54,0,1), +(491,2,'430','Germanische Sprachen, Deutsch','430',854,855,55,1,1), +(492,2,'431','Schriftsysteme und Phonologie des Deutschen','431',856,857,55,0,1), +(493,2,'432','Etymologie des Deutschen','432',858,859,55,0,1), +(494,2,'433','Deutsche Wörterbücher','433',860,861,55,0,1), +(495,2,'435','Deutsche Grammatik','435',862,863,55,0,1), +(496,2,'437','Varianten des Deutschen','437',864,865,55,0,1), +(497,2,'438','Gebrauch des Standard-Deutsch','438',866,867,55,0,1), +(498,2,'439','Andere germanische Sprachen','439',868,869,55,1,1), +(499,2,'440','Romanische Sprachen, Französisch','440',872,873,56,0,1), +(500,2,'441','Schriftsysteme und Phonologie des Französischen','441',874,875,56,0,1), +(501,2,'442','Etymologie des Französischen','442',876,877,56,0,1), +(502,2,'443','Französische Wörterbücher','443',878,879,56,0,1), +(503,2,'445','Französische Grammatik','445',880,881,56,0,1), +(504,2,'447','Varianten des Französischen','447',882,883,56,0,1), +(505,2,'448','Gebrauch des Standard-Französisch','448',884,885,56,0,1), +(506,2,'449','Okzitanisch, Katalanisch','449',886,887,56,0,1), +(507,2,'450','Italienisch, Rumänisch, Rätoromanisch','450',890,891,57,0,1), +(508,2,'451','Schriftsysteme und Phonologie des Italienischen','451',892,893,57,0,1), +(509,2,'452','Etymologie des Italienischen','452',894,895,57,0,1), +(510,2,'453','Italienische Wörterbücher','453',896,897,57,0,1), +(511,2,'455','Italienische Grammatik','455',898,899,57,0,1), +(512,2,'457','Varianten des Italienischen','457',900,901,57,0,1), +(513,2,'458','Gebrauch des Standard-Italienisch','458',902,903,57,0,1), +(514,2,'459','Rumänisch, Rätoromanisch','459',904,905,57,0,1), +(515,2,'460','Spanisch, Portugiesisch','460',908,909,58,0,1), +(516,2,'461','Schriftsysteme und Phonologie des Spanischen','461',910,911,58,0,1), +(517,2,'462','Etymologie des Spanischen','462',912,913,58,0,1), +(518,2,'463','Spanische Wörterbücher','463',914,915,58,0,1), +(519,2,'465','Spanische Grammatik','465',916,917,58,0,1), +(520,2,'467','Varianten des Spanischen','467',918,919,58,0,1), +(521,2,'468','Gebrauch des Standard-Spanisch','468',920,921,58,0,1), +(522,2,'469','Portugiesisch','469',922,923,58,0,1), +(523,2,'470','Italische Sprachen, Latein','470',926,927,59,0,1), +(524,2,'471','Schriftsysteme und Phonologie des klassischen Latein','471',928,929,59,0,1), +(525,2,'472','Etymologie des klassischen Latein','472',930,931,59,0,1), +(526,2,'473','Wörterbücher des klassischen Latein','473',932,933,59,0,1), +(527,2,'475','Grammatik des klassischen Latein','475',934,935,59,0,1), +(528,2,'477','Altlatein, Mittellatein, Neulatein, Kirchenlatein, Vulgärlatein','477',936,937,59,0,1), +(529,2,'478','Gebrauch des klassischen Latein','478',938,939,59,0,1), +(530,2,'479','Andere italische Sprachen','479',940,941,59,0,1), +(531,2,'480','Hellenische Sprachen, klassisches Griechisch','480',944,945,60,0,1), +(532,2,'481','Schriftsysteme und Phonologie des klassischen Griechisch','481',946,947,60,0,1), +(533,2,'482','Etymologie des klassischen Griechisch','482',948,949,60,0,1), +(534,2,'483','Wörterbücher des klassischen Griechisch','483',950,951,60,0,1), +(535,2,'485','Grammatik des klassischen Griechisch','485',952,953,60,0,1), +(536,2,'487','Vorklassisches Griechisch, Mittelgriechisch','487',954,955,60,0,1), +(537,2,'488','Gebrauch des klassischen Griechisch','488',956,957,60,0,1), +(538,2,'489','Andere hellenische Sprachen, Neugriechisch','489',958,959,60,0,1), +(539,2,'490','Andere Sprachen','490',962,963,61,0,1), +(540,2,'491','Ostindoeuropäische und keltische Sprachen','491',964,965,61,0,1), +(541,2,'492','Afroasiatische Sprachen, semitische Sprachen','492',966,967,61,0,1), +(542,2,'493','Nichtsemitische afroasiatische Sprachen','493',968,969,61,0,1), +(543,2,'494','Altaische, uralische, paläosibirische, drawidische Sprachen','494',970,971,61,0,1), +(544,2,'495','Ost- und südostasiatische Sprachen','495',972,973,61,0,1), +(545,2,'496','Afrikanische Sprachen','496',974,975,61,0,1), +(546,2,'497','Nordamerikanische Indianersprachen','497',976,977,61,0,1), +(547,2,'498','Südamerikanische Indianersprachen','498',978,979,61,0,1), +(548,2,'499','Austronesische und andere Sprachen','499',980,981,61,0,1), +(549,2,'500','Naturwissenschaften und Mathematik','500',986,987,62,0,1), +(550,2,'501','Philosophie, Theorie','501',988,989,62,0,1), +(551,2,'502','Verschiedenes','502',990,991,62,0,1), +(552,2,'503','Wörterbücher, Enzyklopädien','503',992,993,62,0,1), +(553,2,'505','Fortlaufende Sammelwerke','505',994,995,62,0,1), +(554,2,'506','Organisationen, Management','506',996,997,62,0,1), +(555,2,'507','Ausbildung, Forschung, verwandte Themen','507',998,999,62,0,1), +(556,2,'508','Naturgeschichte','508',1000,1001,62,0,1), +(557,2,'509','Histor., geogr., personenbezogene Behandlung','509',1002,1003,62,0,1), +(558,2,'510','Mathematik','510',1006,1007,63,0,1), +(559,2,'511','Allgemeine mathematische Prinzipien','511',1008,1009,63,0,1), +(560,2,'512','Algebra','512',1010,1011,63,0,1), +(561,2,'513','Arithmetik','513',1012,1013,63,0,1), +(562,2,'514','Topologie','514',1014,1015,63,0,1), +(563,2,'515','Analysis','515',1016,1017,63,0,1), +(564,2,'516','Geometrie','516',1018,1019,63,0,1), +(565,2,'518','Numerische Analysis','518',1020,1021,63,0,1), +(566,2,'519','Wahrscheinlichkeiten, angewandte Mathematik','519',1022,1023,63,0,1), +(567,2,'520','Astronomie und zugeordnete Wissenschaften','520',1026,1027,64,0,1), +(568,2,'521','Himmelsmechanik','521',1028,1029,64,0,1), +(569,2,'522','Techniken, Ausstattung, Materialien','522',1030,1031,64,0,1), +(570,2,'523','Einzelne Himmelskörper und Himmelsphänomene','523',1032,1033,64,0,1), +(571,2,'525','Erde (Astronomische Geografie)','525',1034,1035,64,0,1), +(572,2,'526','Mathematische Geografie','526',1036,1037,64,0,1), +(573,2,'527','Astronavigation','527',1038,1039,64,0,1), +(574,2,'528','Ephemeriden','528',1040,1041,64,0,1), +(575,2,'529','Chronologie','529',1042,1043,64,0,1), +(576,2,'530','Physik','530',1046,1047,65,0,1), +(577,2,'531','Klassische Mechanik, Festkörpermechanik','531',1048,1049,65,0,1), +(578,2,'532','Mechanik der Fluide, Mechanik der Flüssigkeiten','532',1050,1051,65,0,1), +(579,2,'533','Gasmechanik','533',1052,1053,65,0,1), +(580,2,'534','Schall und verwandte Schwingungen','534',1054,1055,65,0,1), +(581,2,'535','Licht, Infrarot- und Ultraviolettphänomene','535',1056,1057,65,0,1), +(582,2,'536','Wärme','536',1058,1059,65,0,1), +(583,2,'537','Elektrizität, Elektronik','537',1060,1061,65,0,1), +(584,2,'538','Magnetismus','538',1062,1063,65,0,1), +(585,2,'539','Moderne Physik','539',1064,1065,65,0,1), +(586,2,'540','Chemie und zugeordnete Wissenschaften','540',1068,1069,66,0,1), +(587,2,'541','Physikalische Chemie','541',1070,1071,66,0,1), +(588,2,'542','Techniken, Ausstattung, Materialien','542',1072,1073,66,0,1), +(589,2,'543','Analytische Chemie','543',1074,1075,66,0,1), +(590,2,'546','Anorganische Chemie','546',1076,1077,66,0,1), +(591,2,'547','Organische Chemie','547',1078,1079,66,0,1), +(592,2,'548','Kristallografie','548',1080,1081,66,0,1), +(593,2,'549','Mineralogie','549',1082,1083,66,0,1), +(594,2,'550','Geowissenschaften','550',1086,1087,67,0,1), +(595,2,'551','Geologie, Hydrologie, Meteorologie','551',1088,1089,67,0,1), +(596,2,'552','Petrologie','552',1090,1091,67,0,1), +(597,2,'553','Lagerstättenkunde','553',1092,1093,67,0,1), +(598,2,'554','Geowissenschaften Europas','554',1094,1095,67,0,1), +(599,2,'555','Geowissenschaften Asiens','555',1096,1097,67,0,1), +(600,2,'556','Geowissenschaften Afrikas','556',1098,1099,67,0,1), +(601,2,'557','Geowissenschaften Nordamerikas','557',1100,1101,67,0,1), +(602,2,'558','Geowissenschaften Südamerikas','558',1102,1103,67,0,1), +(603,2,'559','Geowissenschaften anderer Gebiete','559',1104,1105,67,0,1), +(604,2,'560','Paläontologie, Paläozoologie','560',1108,1109,68,0,1), +(605,2,'561','Paläobotanik, fossile Mikroorganismen','561',1110,1111,68,0,1), +(606,2,'562','Fossile Evertebrata (Wirbellose)','562',1112,1113,68,0,1), +(607,2,'563','Fossile Wirbellose des Meeres und der Meeresküste','563',1114,1115,68,0,1), +(608,2,'564','Fossile Mollusca (Weichtiere), Tentaculata (Kranzfühler)','564',1116,1117,68,0,1), +(609,2,'565','Fossile Arthropoden (Gliederfüßer)','565',1118,1119,68,0,1), +(610,2,'566','Fossile Chordata (Chordatiere)','566',1120,1121,68,0,1), +(611,2,'567','Fossile wechselwarme Wirbeltiere, fossile Pisces (Fische)','567',1122,1123,68,0,1), +(612,2,'568','Fossile Aves (Vögel)','568',1124,1125,68,0,1), +(613,2,'569','Fossile Mammalia (Säugetiere)','569',1126,1127,68,0,1), +(614,2,'570','Biowissenschaften, Biologie','570',1130,1131,69,0,1), +(615,2,'571','Physiologie und verwandte Themen','571',1132,1133,69,0,1), +(616,2,'572','Biochemie','572',1134,1135,69,0,1), +(617,2,'573','Einzelne physiologische Systeme bei Tieren','573',1136,1137,69,0,1), +(618,2,'575','Einzelne Teile von und physiologische Systeme bei Pflanzen','575',1138,1139,69,0,1), +(619,2,'576','Genetik und Evolution','576',1140,1141,69,0,1), +(620,2,'577','Ökologie','577',1142,1143,69,0,1), +(621,2,'578','Naturgeschichte von Organismen','578',1144,1145,69,0,1), +(622,2,'579','Mikroorganismen, Pilze, Algen','579',1146,1147,69,0,1), +(623,2,'580','Pflanzen (Botanik)','580',1150,1151,70,0,1), +(624,2,'581','Einzelne Themen in der Naturgeschichte','581',1152,1153,70,0,1), +(625,2,'582','Pflanzen mit spezifischen Merkmalen und Blüten','582',1154,1155,70,0,1), +(626,2,'583','Magnoliopsida (Zweikeimblättrige)','583',1156,1157,70,0,1), +(627,2,'584','Liliopsida (Einkeimblättrige)','584',1158,1159,70,0,1), +(628,2,'585','Gymnospermae (Nacktsamer), Coniferae (Nadelgehölze)','585',1160,1161,70,0,1), +(629,2,'586','Cryptogamia (Blütenlose Pflanzen)','586',1162,1163,70,0,1), +(630,2,'587','Pteridophyta (Farnpflanzen)','587',1164,1165,70,0,1), +(631,2,'588','Bryophyta (Moose)','588',1166,1167,70,0,1), +(632,2,'590','Tiere (Zoologie)','590',1170,1171,71,0,1), +(633,2,'591','Einzelne Themen in der Naturgeschichte','591',1172,1173,71,0,1), +(634,2,'592','Evertebrata (Wirbellose)','592',1174,1175,71,0,1), +(635,2,'593','Wirbellose des Meeres und der Meeresküste','593',1176,1177,71,0,1), +(636,2,'594','Mollusca (Weichtiere), Tentaculata (Kranzfühler)','594',1178,1179,71,0,1), +(637,2,'595','Arthropoden (Gliederfüßer)','595',1180,1181,71,0,1), +(638,2,'596','Chordata (Chordatiere)','596',1182,1183,71,0,1), +(639,2,'597','Wechselwarme Wirbeltiere, Pisces (Fische)','597',1184,1185,71,0,1), +(640,2,'598','Aves (Vögel)','598',1186,1187,71,0,1), +(641,2,'599','Mammalia (Säugetiere)','599',1188,1189,71,0,1), +(642,2,'600','Technik, Technologie','600',1194,1195,72,0,1), +(643,2,'601','Philosophie, Theorie','601',1196,1197,72,0,1), +(644,2,'602','Verschiedenes','602',1198,1199,72,0,1), +(645,2,'603','Wörterbücher, Enzyklopädien','603',1200,1201,72,0,1), +(646,2,'604','Spezielle Themen','604',1202,1203,72,0,1), +(647,2,'605','Fortlaufende Sammelwerke','605',1204,1205,72,0,1), +(648,2,'606','Organisationen','606',1206,1207,72,0,1), +(649,2,'607','Ausbildung, Forschung, verwandte Themen','607',1208,1209,72,0,1), +(650,2,'608','Erfindungen, Patente','608',1210,1211,72,0,1), +(651,2,'609','Histor., geogr., personenbezogene Behandlung','609',1212,1213,72,0,1), +(652,2,'610','Medizin und Gesundheit','610',1216,1217,73,0,1), +(653,2,'611','Menschliche Anatomie, Zytologie, Histologie','611',1218,1219,73,0,1), +(654,2,'612','Humanphysiologie','612',1220,1221,73,0,1), +(655,2,'613','Persönliche Gesundheit und Sicherheit','613',1222,1223,73,0,1), +(656,2,'614','Inzidenz und Prävention von Krankheiten','614',1224,1225,73,0,1), +(657,2,'615','Pharmakologie, Therapeutik','615',1226,1227,73,0,1), +(658,2,'616','Krankheiten','616',1228,1229,73,0,1), +(659,2,'617','Chirurgie und verwandte medizinische Fachrichtungen','617',1230,1231,73,0,1), +(660,2,'618','Gynäkologie, Geburtsmedizin, Pädiatrie, Geriatrie','618',1232,1233,73,0,1), +(661,2,'620','Ingenieurwissenschaften und zugeordnete Tätigkeiten','620',1236,1237,74,0,1), +(662,2,'621','Angewandte Physik','621',1238,1239,74,0,1), +(663,2,'622','Bergbau und verwandte Tätigkeiten','622',1240,1241,74,0,1), +(664,2,'623','Militär- und Schiffstechnik','623',1242,1243,74,0,1), +(665,2,'624','Ingenieurbau','624',1244,1245,74,0,1), +(666,2,'625','Eisenbahn- und Straßenbau','625',1246,1247,74,0,1), +(667,2,'627','Wasserbau','627',1248,1249,74,0,1), +(668,2,'628','Sanitär- und Kommunaltechnik, Umwelttechnik','628',1250,1251,74,0,1), +(669,2,'629','Andere Fachrichtungen der Ingenieurwissenschaften','629',1252,1253,74,0,1), +(670,2,'630','Landwirtschaft und verwandte Bereiche','630',1256,1257,75,0,1), +(671,2,'631','Techniken, Ausstattung, Materialien','631',1258,1259,75,0,1), +(672,2,'632','Schäden, Krankheiten, Schädlinge an Pflanzen','632',1260,1261,75,0,1), +(673,2,'633','Feld- und Plantagenfrüchte','633',1262,1263,75,0,1), +(674,2,'634','Obstanlagen, Früchte, Forstwirtschaft','634',1264,1265,75,0,1), +(675,2,'635','Gartenpflanzen (Gartenbau)','635',1266,1267,75,0,1), +(676,2,'636','Viehwirtschaft','636',1268,1269,75,0,1), +(677,2,'637','Milchverarbeitung und verwandte Produkte','637',1270,1271,75,0,1), +(678,2,'638','Insektenzucht','638',1272,1273,75,0,1), +(679,2,'639','Jagd, Fischfang, Naturschutz','639',1274,1275,75,0,1), +(680,2,'640','Hauswirtschaft und Familie','640',1278,1279,76,0,1), +(681,2,'641','Essen und Trinken','641',1280,1281,76,0,1), +(682,2,'642','Mahlzeiten, Tischkultur','642',1282,1283,76,0,1), +(683,2,'643','Wohnen, Haushaltsausstattung','643',1284,1285,76,0,1), +(684,2,'644','Gebäudeversorgung für Haushalte','644',1286,1287,76,0,1), +(685,2,'645','Einrichtungsgegenstände','645',1288,1289,76,0,1), +(686,2,'646','Nähen, Kleidung, persönliches Leben, Familienleben','646',1290,1291,76,0,1), +(687,2,'647','Großhaushaltsführung','647',1292,1293,76,0,1), +(688,2,'648','Haushaltsführung','648',1294,1295,76,0,1), +(689,2,'649','Kindererziehung, häusliche Betreuung','649',1296,1297,76,0,1), +(690,2,'650','Management und unterstützende Tätigkeiten','650',1300,1301,77,0,1), +(691,2,'651','Büroarbeit','651',1302,1303,77,0,1), +(692,2,'652','Techniken der schriftlichen Kommunikation','652',1304,1305,77,0,1), +(693,2,'653','Stenografie','653',1306,1307,77,0,1), +(694,2,'657','Rechnungslegung','657',1308,1309,77,0,1), +(695,2,'658','Allgemeines Management','658',1310,1311,77,0,1), +(696,2,'659','Werbung, Öffentlichkeitsarbeit','659',1312,1313,77,0,1), +(697,2,'660','Chemische Verfahrenstechnik','660',1316,1317,78,0,1), +(698,2,'661','Industriechemikalien','661',1318,1319,78,0,1), +(699,2,'662','Explosivstoffe, Brennstoffe und verwandte Produkte','662',1320,1321,78,0,1), +(700,2,'663','Getränketechnologie','663',1322,1323,78,0,1), +(701,2,'664','Lebensmitteltechnologie','664',1324,1325,78,0,1), +(702,2,'665','Industrielle Öle, Fette, Wachse, technische Gase','665',1326,1327,78,0,1), +(703,2,'666','Keramiktechnologie und zugeordnete Technologien','666',1328,1329,78,0,1), +(704,2,'667','Reinigungs-, Färbe-, Beschichtungstechniken','667',1330,1331,78,0,1), +(705,2,'668','Technik anderer organischer Produkte','668',1332,1333,78,0,1), +(706,2,'669','Metallurgie','669',1334,1335,78,0,1), +(707,2,'670','Industrielle Fertigung','670',1338,1339,79,0,1), +(708,2,'671','Metallverarbeitung und Rohprodukte aus Metall','671',1340,1341,79,0,1), +(709,2,'672','Eisen, Stahl, andere Eisenlegierungen','672',1342,1343,79,0,1), +(710,2,'673','Nichteisenmetalle','673',1344,1345,79,0,1), +(711,2,'674','Holzverarbeitung, Holzprodukte, Kork','674',1346,1347,79,0,1), +(712,2,'675','Leder- und Pelzverarbeitung','675',1348,1349,79,0,1), +(713,2,'676','Zellstoff und Papierherstellung','676',1350,1351,79,0,1), +(714,2,'677','Textilien','677',1352,1353,79,0,1), +(715,2,'678','Elastomere, Elastomerprodukte','678',1354,1355,79,0,1), +(716,2,'679','Andere Produkte aus einzelnen Werkstoffen','679',1356,1357,79,0,1), +(717,2,'680','Industrielle Fertigung für einzelne Verwendungszwecke','680',1360,1361,80,0,1), +(718,2,'681','Präzisionsinstrumente und andere Geräte','681',1362,1363,80,0,1), +(719,2,'682','Schmiedehandwerk','682',1364,1365,80,0,1), +(720,2,'683','Eisenwaren, Haushaltsgeräte','683',1366,1367,80,0,1), +(721,2,'684','Wohnungseinrichtung, Heimwerkstätten','684',1368,1369,80,0,1), +(722,2,'685','Leder- und Pelzwaren und verwandte Produkte','685',1370,1371,80,0,1), +(723,2,'686','Drucken und verwandte Tätigkeiten','686',1372,1373,80,0,1), +(724,2,'687','Kleidung, Accessoires','687',1374,1375,80,0,1), +(725,2,'688','Andere Endprodukte, Verpackungstechnik','688',1376,1377,80,0,1), +(726,2,'690','Hausbau, Bauhandwerk','690',1380,1381,81,0,1), +(727,2,'691','Baustoffe','691',1382,1383,81,0,1), +(728,2,'692','Bauhilfstechniken','692',1384,1385,81,0,1), +(729,2,'693','Einzelne Baustoffarten und Zwecke','693',1386,1387,81,0,1), +(730,2,'694','Holzbau, Zimmerhandwerk','694',1388,1389,81,0,1), +(731,2,'695','Dachdeckung','695',1390,1391,81,0,1), +(732,2,'696','Versorgungseinrichtungen','696',1392,1393,81,0,1), +(733,2,'697','Heizungs-, Lüftungs-, Klimatechnik','697',1394,1395,81,0,1), +(734,2,'698','Ausbau','698',1396,1397,81,0,1), +(735,2,'700','Künste, Bildende und angewandte Kunst','700',1402,1403,82,0,1), +(736,2,'701','Kunstphilosophie, Kunsttheorie der bildenden und angewandten Kunst','701',1404,1405,82,0,1), +(737,2,'702','Verschiedenes zur bildenden und angewandten Kunst','702',1406,1407,82,0,1), +(738,2,'703','Wörterbücher, Enzyklopädien zur bildenden und angewandten Kunst','703',1408,1409,82,0,1), +(739,2,'704','Spezielle Themen zur bildenden und angewandten Kunst','704',1410,1411,82,0,1), +(740,2,'705','Fortlaufende Sammelwerke zur bildenden und angewandten Kunst','705',1412,1413,82,0,1), +(741,2,'706','Organisationen, Management der bildenden und angewandten Kunst','706',1414,1415,82,0,1), +(742,2,'707','Ausbildung, Forschung, verwandte Themen zur bildenden und angewandten Kunst','707',1416,1417,82,0,1), +(743,2,'708','Galerien, Museen, Privatsammlungen zur bildenden und angewandten Kunst','708',1418,1419,82,0,1), +(744,2,'709','Histor., geogr., personenbezogene Behandlung der bildenden und angewandten Kunst','709',1420,1421,82,0,1), +(745,2,'710','Städtebau, Raumplanung, Landschaftsgestaltung','710',1424,1425,83,0,1), +(746,2,'711','Raumplanung','711',1426,1427,83,0,1), +(747,2,'712','Landschaftsgestaltung','712',1428,1429,83,0,1), +(748,2,'713','Landschaftsgestaltung von Verkehrswegen','713',1430,1431,83,0,1), +(749,2,'714','Wasser als Gestaltungselement','714',1432,1433,83,0,1), +(750,2,'715','Gehölze als Gestaltungselemente','715',1434,1435,83,0,1), +(751,2,'716','Krautige Pflanzen als Gestaltungselemente','716',1436,1437,83,0,1), +(752,2,'717','Andere Gestaltungselemente','717',1438,1439,83,0,1), +(753,2,'718','Landschaftsgestaltung von Friedhöfen','718',1440,1441,83,0,1), +(754,2,'719','Naturlandschaften','719',1442,1443,83,0,1), +(755,2,'720','Architektur','720',1446,1447,84,0,1), +(756,2,'721','Architektonische Struktur','721',1448,1449,84,0,1), +(757,2,'722','Architektur bis ca. 300','722',1450,1451,84,0,1), +(758,2,'723','Architektur von ca. 300 bis 1399','723',1452,1453,84,0,1), +(759,2,'724','Architektur ab 1400','724',1454,1455,84,0,1), +(760,2,'725','Öffentliche Bauwerke','725',1456,1457,84,0,1), +(761,2,'726','Gebäude für religiöse und verwandte Zwecke','726',1458,1459,84,0,1), +(762,2,'727','Gebäude für Lehr- und Forschungszwecke','727',1460,1461,84,0,1), +(763,2,'728','Wohnbauten und verwandte Gebäude','728',1462,1463,84,0,1), +(764,2,'729','Entwurf und Gestaltung, Innenarchitektur','729',1464,1465,84,0,1), +(765,2,'730','Plastische Künste, Bildhauerkunst','730',1468,1469,85,0,1), +(766,2,'731','Verfahren, Formen und Motive in der Bildhauerkunst','731',1470,1471,85,0,1), +(767,2,'732','Bildhauerei bis ca. 500','732',1472,1473,85,0,1), +(768,2,'733','Griechische, etruskische, römische Bildhauerkunst','733',1474,1475,85,0,1), +(769,2,'734','Bildhauerkunst von ca. 500 bis 1399','734',1476,1477,85,0,1), +(770,2,'735','Bildhauerkunst ab 1400','735',1478,1479,85,0,1), +(771,2,'736','Schnitzen, Schnitzereien','736',1480,1481,85,0,1), +(772,2,'737','Numismatik, Siegelkunde','737',1482,1483,85,0,1), +(773,2,'738','Keramikkunst','738',1484,1485,85,0,1), +(774,2,'739','Metallkunst','739',1486,1487,85,0,1), +(775,2,'740','Zeichnung, angewandte Kunst','740',1490,1491,86,1,1), +(776,2,'741','Zeichnung, Zeichnungen','741',1492,1493,86,0,1), +(777,2,'742','Perspektive','742',1496,1497,86,0,1), +(778,2,'743','Zeichnung und Zeichnungen nach Motiv','743',1498,1499,86,0,1), +(779,2,'745','Angewandte Kunst','745',1500,1501,86,0,1), +(780,2,'746','Textilkunst','746',1502,1503,86,0,1), +(781,2,'747','Innendekoration','747',1504,1505,86,0,1), +(782,2,'748','Glas','748',1506,1507,86,0,1), +(783,2,'749','Möbel, Möbelzubehör','749',1508,1509,86,0,1), +(784,2,'750','Malerei, Gemälde','750',1512,1513,87,0,1), +(785,2,'751','Techniken, Ausstattung, Materialien, Formen','751',1514,1515,87,0,1), +(786,2,'752','Farbe','752',1516,1517,87,0,1), +(787,2,'753','Symbolik, Allegorie, Mythologie, Legende','753',1518,1519,87,0,1), +(788,2,'754','Genremalerei','754',1520,1521,87,0,1), +(789,2,'755','Religion','755',1522,1523,87,0,1), +(790,2,'757','Menschliche Figuren','757',1524,1525,87,0,1), +(791,2,'758','Andere Motive','758',1526,1527,87,0,1), +(792,2,'759','Histor., geogr., personenbezogene Behandlung','759',1528,1529,87,0,1), +(793,2,'760','Grafik, Druckgrafik, Drucke','760',1532,1533,88,0,1), +(794,2,'761','Hochdruckverfahren (Blockdruck)','761',1534,1535,88,0,1), +(795,2,'763','Lithografische Druckverfahren','763',1536,1537,88,0,1), +(796,2,'764','Farblithografie, Serigrafie','764',1538,1539,88,0,1), +(797,2,'765','Metallgravur','765',1540,1541,88,0,1), +(798,2,'766','Mezzotinto, Aquatinta und verwandte Techniken','766',1542,1543,88,0,1), +(799,2,'767','Radierung, Kaltnadelarbeit','767',1544,1545,88,0,1), +(800,2,'769','Drucke','769',1546,1547,88,0,1), +(801,2,'770','Fotografie, Fotografien, Computerkunst','770',1550,1551,89,0,1), +(802,2,'771','Techniken, Ausstattung, Materialien','771',1552,1553,89,0,1), +(803,2,'772','Entwicklungsverfahren mit Metallsalzen','772',1554,1555,89,0,1), +(804,2,'773','Pigmentdruckverfahren','773',1556,1557,89,0,1), +(805,2,'774','Holografie','774',1558,1559,89,0,1), +(806,2,'775','Digitale Fotografie','775',1560,1561,89,0,1), +(807,2,'776','Computerkunst (Digitale Kunst)','776',1562,1563,89,0,1), +(808,2,'778','Bereiche und Arten der Fotografie','778',1564,1565,89,0,1), +(809,2,'779','Fotografien','779',1566,1567,89,0,1), +(810,2,'780','Musik','780',1570,1571,90,0,1), +(811,2,'781','Allgemeine Prinzipien, musikalische Formen','781',1572,1573,90,0,1), +(812,2,'782','Vokalmusik','782',1574,1575,90,0,1), +(813,2,'783','Musik für Einzelstimmen, die Stimme','783',1576,1577,90,0,1), +(814,2,'784','Instrumente, Instrumentalensembles','784',1578,1579,90,0,1), +(815,2,'785','Ensembles mit einem Instrument pro Stimme','785',1580,1581,90,0,1), +(816,2,'786','Tasteninstrumente, andere Instrumente','786',1582,1583,90,0,1), +(817,2,'787','Saiteninstrumente','787',1584,1585,90,0,1), +(818,2,'788','Blasinstrumente','788',1586,1587,90,0,1), +(819,2,'789','(Optionale Notation)','789',1588,1589,90,0,1), +(820,2,'790','Freizeitgestaltung, darstellende Künste, Sport','790',1592,1593,91,1,1), +(821,2,'791','Öffentliche Darbietungen, Film, Rundfunk','791',1594,1595,91,1,1), +(822,2,'792','Bühnenkunst','792',1596,1597,91,1,1), +(823,2,'793','Spiele und Freizeitaktivitäten für drinnen','793',1598,1599,91,1,1), +(824,2,'794','Unterhaltungsspiele für drinnen','794',1600,1601,91,0,1), +(825,2,'795','Glücksspiele','795',1602,1603,91,0,1), +(826,2,'796','Sportarten, Sportspiele','796',1604,1605,91,1,1), +(827,2,'797','Wasser- und Luftsport','797',1606,1607,91,0,1), +(828,2,'798','Pferdesport, Tierrennen','798',1608,1609,91,0,1), +(829,2,'799','Fischfang, Jagd, Schießen','799',1610,1611,91,0,1), +(830,2,'800','Literatur und Rhetorik','800',1616,1617,92,0,1), +(831,2,'801','Literaturtheorie','801',1618,1619,92,0,1), +(832,2,'802','Verschiedenes','802',1620,1621,92,0,1), +(833,2,'803','Wörterbücher, Enzyklopädien','803',1622,1623,92,0,1), +(834,2,'805','Fortlaufende Sammelwerke','805',1624,1625,92,0,1), +(835,2,'806','Organisationen, Management','806',1626,1627,92,0,1), +(836,2,'807','Ausbildung, Forschung, verwandte Themen','807',1628,1629,92,0,1), +(837,2,'808','Rhetorik, Sammlungen von Literatur','808',1630,1631,92,0,1), +(838,2,'809','Geschichte, Darstellung, Literaturwissenschaft und –k ritik','809',1632,1633,92,0,1), +(839,2,'810','Amerikanische Literatur in in Englisch','810',1636,1637,93,0,1), +(840,2,'811','Amerikanische Versdichtung','811',1638,1639,93,0,1), +(841,2,'812','Amerikanische Dramen','812',1640,1641,93,0,1), +(842,2,'813','Amerikanische Erzählprosa','813',1642,1643,93,0,1), +(843,2,'814','Amerikanische Essays','814',1644,1645,93,0,1), +(844,2,'815','Amerikanische Reden','815',1646,1647,93,0,1), +(845,2,'816','Amerikanische Briefe','816',1648,1649,93,0,1), +(846,2,'817','Amerikanischer Humor, amerikanische Satire','817',1650,1651,93,0,1), +(847,2,'818','Amerikanische vermischte Schriften','818',1652,1653,93,0,1), +(848,2,'819','(Optionale Notation)','819',1654,1655,93,0,1), +(849,2,'820','Englische, altenglische Literaturen','820',1658,1659,94,0,1), +(850,2,'821','Englische Versdichtung','821',1660,1661,94,0,1), +(851,2,'822','Englische Dramen','822',1662,1663,94,0,1), +(852,2,'823','Englische Erzählprosa','823',1664,1665,94,0,1), +(853,2,'824','Englische Essays','824',1666,1667,94,0,1), +(854,2,'825','Englische Reden','825',1668,1669,94,0,1), +(855,2,'826','Englische Briefe','826',1670,1671,94,0,1), +(856,2,'827','Englischer Humor, englische Satire','827',1672,1673,94,0,1), +(857,2,'828','Englische vermischte Schriften','828',1674,1675,94,0,1), +(858,2,'829','Altenglische (Angelsächsische) Literatur','829',1676,1677,94,0,1), +(859,2,'830','Literaturen germanischer Sprachen, Deutsche Literatur','830',1680,1681,95,1,1), +(860,2,'831','Deutsche Versdichtung','831',1682,1683,95,0,1), +(861,2,'832','Deutsche Dramen','832',1684,1685,95,0,1), +(862,2,'833','Deutsche Erzählprosa','833',1686,1687,95,0,1), +(863,2,'834','Deutsche Essays','834',1688,1689,95,0,1), +(864,2,'835','Deutsche Reden','835',1690,1691,95,0,1), +(865,2,'836','Deutsche Briefe','836',1692,1693,95,0,1), +(866,2,'837','Deutscher Humor, deutsche Satire','837',1694,1695,95,0,1), +(867,2,'838','Deutsche vermischte Schriften','838',1696,1697,95,0,1), +(868,2,'839','Andere germanische Literaturen','839',1698,1699,95,1,1), +(869,2,'840','Literaturen romanischer Sprachen, Französische Literatur','840',1702,1703,96,0,1), +(870,2,'841','Französische Versdichtung','841',1704,1705,96,0,1), +(871,2,'842','Französische Dramen','842',1706,1707,96,0,1), +(872,2,'843','Französische Erzählprosa','843',1708,1709,96,0,1), +(873,2,'844','Französische Essays','844',1710,1711,96,0,1), +(874,2,'845','Französische Reden','845',1712,1713,96,0,1), +(875,2,'846','Französische Briefe','846',1714,1715,96,0,1), +(876,2,'847','Französischer Humor, französische Satire','847',1716,1717,96,0,1), +(877,2,'848','Französische vermischte Schriften','848',1718,1719,96,0,1), +(878,2,'849','Okzitanische, katalanische Literaturen','849',1720,1721,96,0,1), +(879,2,'850','Italienische, rumänische, rätoromanische Literaturen','850',1724,1725,97,0,1), +(880,2,'851','Italienische Versdichtung','851',1726,1727,97,0,1), +(881,2,'852','Italienische Dramen','852',1728,1729,97,0,1), +(882,2,'853','Italienische Erzählprosa','853',1730,1731,97,0,1), +(883,2,'854','Italienische Essays','854',1732,1733,97,0,1), +(884,2,'855','Italienische Reden','855',1734,1735,97,0,1), +(885,2,'856','Italienische Briefe','856',1736,1737,97,0,1), +(886,2,'857','Italienischer Humor, italienische Satire','857',1738,1739,97,0,1), +(887,2,'858','Italienische vermischte Schriften','858',1740,1741,97,0,1), +(888,2,'859','Rumänische, rätoromanische Literaturen','859',1742,1743,97,0,1), +(889,2,'860','Spanische, portugiesische Literaturen','860',1746,1747,98,0,1), +(890,2,'861','Spanische Versdichtung','861',1748,1749,98,0,1), +(891,2,'862','Spanische Dramen','862',1750,1751,98,0,1), +(892,2,'863','Spanische Erzählprosa','863',1752,1753,98,0,1), +(893,2,'864','Spanische Essays','864',1754,1755,98,0,1), +(894,2,'865','Spanische Reden','865',1756,1757,98,0,1), +(895,2,'866','Spanische Briefe','866',1758,1759,98,0,1), +(896,2,'867','Spanischer Humor, spanische Satire','867',1760,1761,98,0,1), +(897,2,'868','Spanische vermischte Schriften','868',1762,1763,98,0,1), +(898,2,'869','Portugiesische Literatur','869',1764,1765,98,0,1), +(899,2,'870','Italische Literaturen, Lateinische Literatur','870',1768,1769,99,0,1), +(900,2,'871','Lateinische Versdichtung','871',1770,1771,99,0,1), +(901,2,'872','Lateinische dramatische Versdichtung, Dramen','872',1772,1773,99,0,1), +(902,2,'873','Lateinische erzählende Versdichtung, Erzählprosa','873',1774,1775,99,0,1), +(903,2,'874','Lateinische lyrische Versdichtung','874',1776,1777,99,0,1), +(904,2,'875','Lateinische Reden','875',1778,1779,99,0,1), +(905,2,'876','Lateinische Briefe','876',1780,1781,99,0,1), +(906,2,'877','Lateinischer Humor, lateinische Satire','877',1782,1783,99,0,1), +(907,2,'878','Lateinische vermischte Schriften','878',1784,1785,99,0,1), +(908,2,'879','Literaturen anderer italischer Sprachen','879',1786,1787,99,0,1), +(909,2,'880','Hellenische Literaturen, Klassische griechische Literatur','880',1790,1791,100,0,1), +(910,2,'881','Klassische griechische Versdichtung','881',1792,1793,100,0,1), +(911,2,'882','Klassische griechische dramatische Versdichtung, Dramen','882',1794,1795,100,0,1), +(912,2,'883','Klassische griechische erzählende Versdichtung, Erzählprosa','883',1796,1797,100,0,1), +(913,2,'884','Klassische griechische lyrische Versdichtung','884',1798,1799,100,0,1), +(914,2,'885','Klassische griechische Reden','885',1800,1801,100,0,1), +(915,2,'886','Klassische griechische Briefe','886',1802,1803,100,0,1), +(916,2,'887','Humor und Satire in klassischem Griechisch','887',1804,1805,100,0,1), +(917,2,'888','Klassische griechische vermischte Schriften','888',1806,1807,100,0,1), +(918,2,'889','Neugriechische Literatur','889',1808,1809,100,0,1), +(919,2,'890','Literaturen anderer Sprachen','890',1812,1813,101,0,1), +(920,2,'891','Ostindoeuropäische, keltische Literaturen','891',1814,1815,101,0,1), +(921,2,'892','Afroasiatische Literaturen, Semitische Literaturen','892',1816,1817,101,0,1), +(922,2,'893','Nichtsemitische afroasiatische Literaturen','893',1818,1819,101,0,1), +(923,2,'894','Altaische, uralische, paläosibirische, drawidische Literaturen','894',1820,1821,101,0,1), +(924,2,'895','Ost- und südostasiatische Literaturen','895',1822,1823,101,0,1), +(925,2,'896','Afrikanische Literaturen','896',1824,1825,101,0,1), +(926,2,'897','Literaturen nordamerikanischer Indianersprachen','897',1826,1827,101,0,1), +(927,2,'898','Literaturen südamerikanischer Indianersprachen','898',1828,1829,101,0,1), +(928,2,'899','Austronesische und andere Literaturen','899',1830,1831,101,0,1), +(929,2,'900','Geschichte und Geografie','900',1836,1837,102,0,1), +(930,2,'901','Geschichtsphilosophie, Geschichtstheorie','901',1838,1839,102,0,1), +(931,2,'902','Verschiedenes','902',1840,1841,102,0,1), +(932,2,'903','Wörterbücher, Enzyklopädien','903',1842,1843,102,0,1), +(933,2,'904','Allgemeine Darstellungen von Ereignissen','904',1844,1845,102,0,1), +(934,2,'905','Fortlaufende Sammelwerke','905',1846,1847,102,0,1), +(935,2,'906','Organisationen, Management','906',1848,1849,102,0,1), +(936,2,'907','Ausbildung, Forschung, verwandte Themen','907',1850,1851,102,0,1), +(937,2,'908','Behandlung nach Personengruppen','908',1852,1853,102,0,1), +(938,2,'909','Weltgeschichte','909',1854,1855,102,0,1), +(939,2,'910','Geografie, Reisen','910',1858,1859,103,1,1), +(940,2,'911','Historische Geografie','911',1860,1861,103,0,1), +(941,2,'912','Atlanten, Karten, Grafiken, Pläne','912',1862,1863,103,0,1), +(942,2,'913','Geografie der und Reisen in der Alten Welt','913',1864,1865,103,0,1), +(943,2,'914','Geografie Europas und Reisen in Europa','914',1866,1867,103,0,1), +(944,2,'915','Geografie Asiens und Reisen in Asien','915',1870,1871,103,0,1), +(945,2,'916','Geografie Afrikas und Reisen in Afrika','916',1872,1873,103,0,1), +(946,2,'917','Geografie Nordamerikas und Reisen in Nordamerika','917',1874,1875,103,0,1), +(947,2,'918','Geografie Südamerikas und Reisen in Südamerika','918',1876,1877,103,0,1), +(948,2,'919','Geografie anderer Gebiete und Reisen in anderen Gebieten','919',1878,1879,103,0,1), +(949,2,'920','Biografien, Genealogie, Insignien','920',1882,1883,104,0,1), +(950,2,'921','(Optionale Notation)','921',1884,1885,104,0,1), +(951,2,'922','(Optionale Notation)','922',1886,1887,104,0,1), +(952,2,'923','(Optionale Notation)','923',1888,1889,104,0,1), +(953,2,'924','(Optionale Notation)','924',1890,1891,104,0,1), +(954,2,'925','(Optionale Notation)','925',1892,1893,104,0,1), +(955,2,'926','(Optionale Notation)','926',1894,1895,104,0,1), +(956,2,'927','(Optionale Notation)','927',1896,1897,104,0,1), +(957,2,'928','(Optionale Notation)','928',1898,1899,104,0,1), +(958,2,'929','Genealogie, Namenkunde, Insignien','929',1900,1901,104,0,1), +(959,2,'930','Geschichte des Altertums bis ca. 499, Archäologie','930',1904,1905,105,0,1), +(960,2,'931','Geschichte Chinas bis 420','931',1906,1907,105,0,1), +(961,2,'932','Geschichte Ägyptens bis 640','932',1908,1909,105,0,1), +(962,2,'933','Geschichte Palästinas bis 70','933',1910,1911,105,0,1), +(963,2,'934','Geschichte Indiens bis 647','934',1912,1913,105,0,1), +(964,2,'935','Geschichte Mesopotamiens und der iranischen Hochebene bis 637','935',1914,1915,105,0,1), +(965,2,'936','Geschichte Europas nördlich und westlich von Italien bis ca. 499','936',1916,1917,105,0,1), +(966,2,'937','Geschichte Italiens und benachbarter Gebiete bis 476','937',1918,1919,105,0,1), +(967,2,'938','Geschichte Griechenlands bis 323','938',1920,1921,105,0,1), +(968,2,'939','Geschichte anderer Teile der Welt bis ca. 640','939',1922,1923,105,0,1), +(969,2,'940','Geschichte Europas','940',1926,1927,106,1,1), +(970,2,'941','Geschichte der Britischen Inseln','941',1928,1929,106,0,1), +(971,2,'942','Geschichte Englands und Wales','942',1930,1931,106,0,1), +(972,2,'943','Geschichte Mitteleuropas, Deutschlands','943',1932,1933,106,1,1), +(973,2,'944','Geschichte Frankreichs und Monacos','944',1934,1935,106,0,1), +(974,2,'945','Geschichte der italienische Halbinsel und benachbarter Inseln','945',1936,1937,106,0,1), +(975,2,'946','Geschichte der iberischen Halbinsel und benachbarter Inseln','946',1938,1939,106,0,1), +(976,2,'947','Geschichte Osteuropas, Russlands','947',1940,1941,106,0,1), +(977,2,'948','Geschichte Skandinaviens','948',1942,1943,106,0,1), +(978,2,'949','Geschichte anderer Teile Europas','949',1944,1945,106,0,1), +(979,2,'950','Geschichte Asiens, des Fernen Ostens','950',1948,1949,107,0,1), +(980,2,'951','Geschichte Chinas und benachbarter Gebiete','951',1950,1951,107,0,1), +(981,2,'952','Geschichte Japans','952',1952,1953,107,0,1), +(982,2,'953','Geschichte der arabischen Halbinsel und benachbarter Gebiete','953',1954,1955,107,0,1), +(983,2,'954','Geschichte Südasiens, Indiens','954',1956,1957,107,0,1), +(984,2,'955','Geschichte Irans','955',1958,1959,107,0,1), +(985,2,'956','Geschichte des Nahen Ostens (Mittleren Ostens)','956',1960,1961,107,0,1), +(986,2,'957','Geschichte Sibiriens (der Asiatischen Russlands)','957',1962,1963,107,0,1), +(987,2,'958','Geschichte Zentralasiens','958',1964,1965,107,0,1), +(988,2,'959','Geschichte Südostasiens','959',1966,1967,107,0,1), +(989,2,'960','Geschichte Afrikas','960',1970,1971,108,0,1), +(990,2,'961','Geschichte Tunesiens und Libyens','961',1972,1973,108,0,1), +(991,2,'962','Geschichte Ägyptens und Sudans','962',1974,1975,108,0,1), +(992,2,'963','Geschichte Äthiopiens und Eritreas','963',1976,1977,108,0,1), +(993,2,'964','Geschichte der nordwestafrikanischen Küste und vorgelagerter Inseln','964',1978,1979,108,0,1), +(994,2,'965','Geschichte Algeriens','965',1980,1981,108,0,1), +(995,2,'966','Geschichte Westafrikas und vorgelagerter Inseln','966',1982,1983,108,0,1), +(996,2,'967','Geschichte Zentralafrikas und vorgelagerter Inseln','967',1984,1985,108,0,1), +(997,2,'968','Geschichte Südafrikas, der Republik Südafrika','968',1986,1987,108,0,1), +(998,2,'969','Geschichte der Inseln im südlichen Indischen Ozean','969',1988,1989,108,0,1), +(999,2,'970','Geschichte Nordamerikas','970',1992,1993,109,0,1), +(1000,2,'971','Geschichte Kanadas','971',1994,1995,109,0,1), +(1001,2,'972','Geschichte Mittelamerikas, Mexikos','972',1996,1997,109,0,1), +(1002,2,'973','Geschichte der USA','973',1998,1999,109,0,1), +(1003,2,'974','Geschichte der nordöstlichen Staaten der USA','974',2000,2001,109,0,1), +(1004,2,'975','Geschichte der südöstlichen Staaten der USA','975',2002,2003,109,0,1), +(1005,2,'976','Geschichte der südlichen zentralen Staaten der USA','976',2004,2005,109,0,1), +(1006,2,'977','Geschichte der nördlichen zentralen Staaten der USA','977',2006,2007,109,0,1), +(1007,2,'978','Geschichte der westlichen Staaten der USA','978',2008,2009,109,0,1), +(1008,2,'979','Geschichte der Staaten des Großen Beckens und der pazifischen Gebirgsketten','979',2010,2011,109,0,1), +(1009,2,'980','Geschichte Südamerikas','980',2014,2015,110,0,1), +(1010,2,'981','Geschichte Brasiliens','981',2016,2017,110,0,1), +(1011,2,'982','Geschichte Argentiniens','982',2018,2019,110,0,1), +(1012,2,'983','Geschichte Chiles','983',2020,2021,110,0,1), +(1013,2,'984','Geschichte Boliviens','984',2022,2023,110,0,1), +(1014,2,'985','Geschichte Perus','985',2024,2025,110,0,1), +(1015,2,'986','Geschichte Kolumbiens und Ecuadors','986',2026,2027,110,0,1), +(1016,2,'987','Geschichte Venezuelas','987',2028,2029,110,0,1), +(1017,2,'988','Geschichte Guayanas','988',2030,2031,110,0,1), +(1018,2,'989','Geschichte Paraguays und Uruguays','989',2032,2033,110,0,1), +(1019,2,'990','Geschichte anderer Gebiete','990',2036,2037,111,0,1), +(1020,2,'993','Geschichte Neuseelands','993',2038,2039,111,0,1), +(1021,2,'994','Geschichte Australiens','994',2040,2041,111,0,1), +(1022,2,'995','Geschichte Melanesiens, Neuguineas','995',2042,2043,111,0,1), +(1023,2,'996','Geschichte anderer Teile des Pazifischen Ozeans, Polynesiens','996',2044,2045,111,0,1), +(1024,2,'997','Geschichte der atlantischen Inseln','997',2046,2047,111,0,1), +(1025,2,'998','Geschichte der arktischen Inseln und der Antarktis','998',2048,2049,111,0,1), +(1026,2,'999','Geschichte der außerirdischen Welten','999',2050,2051,111,0,1), +(1027,2,'741.5','Comics, Cartoons, Karikaturen','741.5',1494,1495,86,1,1), +(1028,2,'914.3','Landeskunde Deutschlands','914.3',1868,1869,103,1,1); + + + diff --git a/database/migrations/1782294801884_create_activities_table.ts b/database/migrations/1782294801884_create_activities_table.ts new file mode 100644 index 0000000..7b497be --- /dev/null +++ b/database/migrations/1782294801884_create_activities_table.ts @@ -0,0 +1,25 @@ +import { BaseSchema } from '@adonisjs/lucid/schema'; + +export default class extends BaseSchema { + protected tableName = 'activities'; + + async up() { + this.schema.createTable(this.tableName, (table) => { + table.increments('id'); + table.string('type').notNullable().index(); // 'dataset.uploaded', 'auth.login' + table.integer('user_id').unsigned().nullable().references('id').inTable('accounts').onDelete('SET NULL'); + table.string('subject_type').nullable(); // manual morph: model name + table.bigInteger('subject_id').unsigned().nullable(); + table.string('description').notNullable(); + table.json('properties').nullable(); + table.timestamp('created_at'); + table.timestamp('updated_at'); + table.index(['subject_type', 'subject_id']) + table.index('created_at') + }); + } + + async down() { + this.schema.dropTable(this.tableName); + } +} diff --git a/database/migrations/acl_4_accounts.ts b/database/migrations/acl_4_accounts.ts index ba2373f..1237635 100644 --- a/database/migrations/acl_4_accounts.ts +++ b/database/migrations/acl_4_accounts.ts @@ -18,6 +18,7 @@ export default class Accounts extends BaseSchema { table.text("two_factor_recovery_codes").nullable(); table.smallint('state').nullable(); table.bigint('last_counter').nullable(); + table.string('avatar').nullable(); }); } @@ -43,6 +44,7 @@ export default class Accounts extends BaseSchema { // two_factor_recovery_codes text COLLATE pg_catalog."default", // state smallint, // last_counter bigint, +// avatar character varying(255), // ) // ALTER TABLE gba.accounts @@ -85,3 +87,6 @@ export default class Accounts extends BaseSchema { // GRANT ALL ON SEQUENCE gba.totp_secrets_id_seq TO tethys_admin; // ALTER TABLE gba.totp_secrets ALTER COLUMN id SET DEFAULT nextval('gba.totp_secrets_id_seq'); + + +// ALTER TABLE "accounts" ADD COLUMN "avatar" VARCHAR(255) NULL diff --git a/database/migrations/1723813974183_create_appconfigs_table.ts b/database/migrations/config_1_appconfigs_table.ts similarity index 100% rename from database/migrations/1723813974183_create_appconfigs_table.ts rename to database/migrations/config_1_appconfigs_table.ts diff --git a/database/migrations/1721999420193_create_backupcodes_table.ts b/database/migrations/config_2_backupcodes_table.ts similarity index 100% rename from database/migrations/1721999420193_create_backupcodes_table.ts rename to database/migrations/config_2_backupcodes_table.ts diff --git a/database/migrations/dataset_2_documents.ts b/database/migrations/dataset_2_documents.ts index 565e1f9..6629689 100644 --- a/database/migrations/dataset_2_documents.ts +++ b/database/migrations/dataset_2_documents.ts @@ -86,3 +86,22 @@ export default class Documents extends BaseSchema { // CONSTRAINT documents_server_state_check CHECK (server_state::text = ANY (ARRAY['deleted'::character varying::text, 'inprogress'::character varying::text, 'published'::character varying::text, 'released'::character varying::text, 'editor_accepted'::character varying::text, 'approved'::character varying::text, 'rejected_reviewer'::character varying::text, 'rejected_editor'::character varying::text, 'reviewed'::character varying::text])), // CONSTRAINT documents_type_check CHECK (type::text = ANY (ARRAY['analysisdata'::character varying::text, 'measurementdata'::character varying::text, 'monitoring'::character varying::text, 'remotesensing'::character varying::text, 'gis'::character varying::text, 'models'::character varying::text, 'mixedtype'::character varying::text])) // ) + + +// ALTER TABLE documents DROP CONSTRAINT documents_server_state_check; + +// ALTER TABLE documents +// ADD CONSTRAINT documents_server_state_check CHECK ( +// server_state::text = ANY (ARRAY[ +// 'deleted', +// 'inprogress', +// 'published', +// 'released', +// 'editor_accepted', +// 'approved', +// 'rejected_reviewer', +// 'rejected_editor', +// 'reviewed', +// 'rejected_to_reviewer' -- new value added +// ]::text[]) +// ); \ No newline at end of file diff --git a/database/migrations/dataset_6_collection_roles.ts b/database/migrations/dataset_6_collection_roles.ts index 73f83e8..1491d9a 100644 --- a/database/migrations/dataset_6_collection_roles.ts +++ b/database/migrations/dataset_6_collection_roles.ts @@ -32,3 +32,21 @@ export default class CollectionsRoles extends BaseSchema { // visible_oai boolean NOT NULL DEFAULT true, // CONSTRAINT collections_roles_pkey PRIMARY KEY (id) // ) + +// change to normal intzeger: +// ALTER TABLE collections_roles ALTER COLUMN id DROP DEFAULT; +// DROP SEQUENCE IF EXISTS collections_roles_id_seq; + +// -- Step 1: Temporarily change one ID to a value not currently used +// UPDATE collections_roles SET id = 99 WHERE name = 'ccs'; + +// -- Step 2: Change 'ddc' ID to 2 (the old 'ccs' ID) +// UPDATE collections_roles SET id = 2 WHERE name = 'ddc'; + +// -- Step 3: Change the temporary ID (99) to 3 (the old 'ddc' ID) +// UPDATE collections_roles SET id = 3 WHERE name = 'ccs'; + +// UPDATE collections_roles SET id = 99 WHERE name = 'bk'; +// UPDATE collections_roles SET id = 1 WHERE name = 'institutes'; +// UPDATE collections_roles SET id = 4 WHERE name = 'pacs'; +// UPDATE collections_roles SET id = 7 WHERE name = 'bk'; \ No newline at end of file diff --git a/database/migrations/dataset_7_collections.ts b/database/migrations/dataset_7_collections.ts index 7e2b3a9..b942111 100644 --- a/database/migrations/dataset_7_collections.ts +++ b/database/migrations/dataset_7_collections.ts @@ -5,7 +5,7 @@ export default class Collections extends BaseSchema { public async up() { this.schema.createTable(this.tableName, (table) => { - table.increments('id').defaultTo("nextval('collections_id_seq')"); + table.increments('id');//.defaultTo("nextval('collections_id_seq')"); table.integer('role_id').unsigned(); table .foreign('role_id', 'collections_role_id_foreign') @@ -25,6 +25,8 @@ export default class Collections extends BaseSchema { .onUpdate('CASCADE'); table.boolean('visible').notNullable().defaultTo(true); table.boolean('visible_publish').notNullable().defaultTo(true); + table.integer('left_id').unsigned(); + table.integer('right_id').unsigned(); }); } @@ -54,3 +56,31 @@ export default class Collections extends BaseSchema { // ON UPDATE CASCADE // ON DELETE CASCADE // ) + + +// change to normal intzeger: +// ALTER TABLE collections ALTER COLUMN id DROP DEFAULT; +// DROP SEQUENCE IF EXISTS collections_id_seq; + + +// ALTER TABLE collections +// ADD COLUMN left_id INTEGER; +// COMMENT ON COLUMN collections.left_id IS 'comment'; +// ALTER TABLE collections +// ADD COLUMN right_id INTEGER; +// COMMENT ON COLUMN collections.right_id IS 'comment'; + +// -- Step 1: Drop the existing default +// ALTER TABLE collections +// ALTER COLUMN visible DROP DEFAULT, +// ALTER COLUMN visible_publish DROP DEFAULT; + +// -- Step 2: Change column types with proper casting +// ALTER TABLE collections +// ALTER COLUMN visible TYPE smallint USING CASE WHEN visible THEN 1 ELSE 0 END, +// ALTER COLUMN visible_publish TYPE smallint USING CASE WHEN visible_publish THEN 1 ELSE 0 END; + +// -- Step 3: Set new defaults as smallint +// ALTER TABLE collections +// ALTER COLUMN visible SET DEFAULT 1, +// ALTER COLUMN visible_publish SET DEFAULT 1; \ No newline at end of file diff --git a/database/migrations/update_1_to_mime_types.ts b/database/migrations/update_1_to_mime_types.ts new file mode 100644 index 0000000..f09210c --- /dev/null +++ b/database/migrations/update_1_to_mime_types.ts @@ -0,0 +1,18 @@ +import { BaseSchema } from "@adonisjs/lucid/schema"; + +export default class AddAlternateMimetypeToMimeTypes extends BaseSchema { + protected tableName = 'mime_types'; + + public async up () { + this.schema.alterTable(this.tableName, (table) => { + table.string('alternate_mimetype').nullable(); + }); + } + + public async down () { + this.schema.alterTable(this.tableName, (table) => { + table.dropColumn('alternate_mimetype'); + }); + } +} +// ALTER TABLE "mime_types" ADD COLUMN "alternate_mimetype" VARCHAR(255) NULL \ No newline at end of file diff --git a/docker-entrypoint.sh b/docker-entrypoint.sh index 8ef61c7..10d0f37 100644 --- a/docker-entrypoint.sh +++ b/docker-entrypoint.sh @@ -1,47 +1,74 @@ #!/bin/bash - -# # Run freshclam to update virus definitions -# freshclam - -# # Sleep for a few seconds to give ClamAV time to start -# sleep 5 - -# # Start the ClamAV daemon -# /etc/init.d/clamav-daemon start - -# bootstrap clam av service and clam av database updater set -m -function process_file() { - if [[ ! -z "$1" ]]; then - local SETTING_LIST=$(echo "$1" | tr ',' '\n' | grep "^[A-Za-z][A-Za-z]*=.*$") - local SETTING - - for SETTING in ${SETTING_LIST}; do - # Remove any existing copies of this setting. We do this here so that - # settings with multiple values (e.g. ExtraDatabase) can still be added - # multiple times below - local KEY=${SETTING%%=*} - sed -i $2 -e "/^${KEY} /d" - done +echo "Starting ClamAV services..." - for SETTING in ${SETTING_LIST}; do - # Split on first '=' - local KEY=${SETTING%%=*} - local VALUE=${SETTING#*=} - echo "${KEY} ${VALUE}" >> "$2" - done - fi -} -# process_file "${CLAMD_SETTINGS_CSV}" /etc/clamav/clamd.conf -# process_file "${FRESHCLAM_SETTINGS_CSV}" /etc/clamav/freshclam.conf +# Try to download database if missing +# if [ ! "$(ls -A /var/lib/clamav 2>/dev/null)" ]; then +# echo "Downloading ClamAV database (this may take a while)..." + +# # Simple freshclam run without complex config +# if freshclam --datadir=/var/lib/clamav --quiet; then +# echo "✓ Database downloaded successfully" +# else +# echo "⚠ Database download failed - creating minimal setup" +# # Create a dummy file so clamd doesn't immediately fail +# touch /var/lib/clamav/.dummy +# fi +# fi + +# Start freshclam daemon for automatic updates +echo "Starting freshclam daemon for automatic updates..." +# sg clamav -c "freshclam -d" & +# Added --daemon-notify to freshclam - This notifies clamd when the database updates +freshclam -d --daemon-notify=/etc/clamav/clamd.conf & +#freshclam -d & -# start in background -freshclam -d & # /etc/init.d/clamav-freshclam start & -clamd +# Start clamd in background +# Start clamd in foreground (so dumb-init can supervise it) # /etc/init.d/clamav-daemon start & -# change back to CMD of dockerfile +# Give freshclam a moment to start +sleep 2 + +# Start clamd daemon in background using sg +echo "Starting ClamAV daemon..." +# sg clamav -c "clamd" & +# Use sg to run clamd with proper group permissions +# sg clamav -c "clamd" & +# clamd --config-file=/etc/clamav/clamd.conf & +clamd & + + +# Give services time to start +echo "Waiting for services to initialize..." +sleep 8 + +# simple check +if pgrep clamd > /dev/null; then + echo "✓ ClamAV daemon is running" +else + echo "⚠ ClamAV daemon status uncertain, but continuing..." +fi + +# Check if freshclam daemon is running +if pgrep freshclam > /dev/null; then + echo "✓ Freshclam daemon is running" +else + echo "⚠ Freshclam daemon status uncertain, but continuing..." +fi + +# # Optional: Test socket connectivity +# if [ -S /var/run/clamav/clamd.socket ]; then +# echo "✓ ClamAV socket exists" +# else +# echo "⚠ WARNING: ClamAV socket not found - services may still be starting" +# fi + +# # change back to CMD of dockerfile +echo "✓ ClamAV setup complete" +echo "Starting main application..." +# exec dumb-init -- "$@" exec "$@" \ No newline at end of file diff --git a/docs/commands/index-datasets.md b/docs/commands/index-datasets.md new file mode 100644 index 0000000..baecfe6 --- /dev/null +++ b/docs/commands/index-datasets.md @@ -0,0 +1,278 @@ +# Dataset Indexing Command + +AdonisJS Ace command for indexing and synchronizing published datasets with OpenSearch for search functionality. + +## Overview + +The `index:datasets` command processes published datasets and creates/updates corresponding search index documents in OpenSearch. It intelligently compares modification timestamps to only re-index datasets when necessary, optimizing performance while maintaining search index accuracy. + +## Command Syntax + +```bash +node ace index:datasets [options] +``` + +## Options + +| Flag | Alias | Description | +|------|-------|-------------| +| `--publish_id <number>` | `-p` | Index a specific dataset by publish_id | + +## Usage Examples + +### Basic Operations + +```bash +# Index all published datasets that have been modified since last indexing +node ace index:datasets + +# Index a specific dataset by publish_id +node ace index:datasets --publish_id 231 +node ace index:datasets -p 231 +``` + +## How It Works + +### 1. **Dataset Selection** +The command processes datasets that meet these criteria: +- `server_state = 'published'` - Only published datasets +- Has preloaded `xmlCache` relationship for metadata transformation +- Optionally filtered by specific `publish_id` + +### 2. **Smart Update Detection** +For each dataset, the command: +- Checks if the dataset exists in the OpenSearch index +- Compares `server_date_modified` timestamps +- Only re-indexes if the dataset is newer than the indexed version + +### 3. **Document Processing** +The indexing process involves: +1. **XML Generation**: Creates structured XML from dataset metadata +2. **XSLT Transformation**: Converts XML to JSON using Saxon-JS processor +3. **Index Update**: Updates or creates the document in OpenSearch +4. **Logging**: Records success/failure for each operation + +## Index Structure + +### Index Configuration +- **Index Name**: `tethys-records` +- **Document ID**: Dataset `publish_id` +- **Refresh**: `true` (immediate availability) + +### Document Fields +The indexed documents contain: +- **Metadata Fields**: Title, description, authors, keywords +- **Identifiers**: DOI, publish_id, and other identifiers +- **Temporal Data**: Publication dates, coverage periods +- **Geographic Data**: Spatial coverage information +- **Technical Details**: Data formats, access information +- **Timestamps**: Creation and modification dates + +## Example Output + +### Successful Run +```bash +node ace index:datasets +``` +``` +Found 150 published datasets to process +Dataset with publish_id 231 successfully indexed +Dataset with publish_id 245 is up to date, skipping indexing +Dataset with publish_id 267 successfully indexed +An error occurred while indexing dataset with publish_id 289. Error: Invalid XML metadata +Processing completed: 148 indexed, 1 skipped, 1 error +``` + +### Specific Dataset +```bash +node ace index:datasets --publish_id 231 +``` +``` +Found 1 published dataset to process +Dataset with publish_id 231 successfully indexed +Processing completed: 1 indexed, 0 skipped, 0 errors +``` + +## Update Logic + +The command uses intelligent indexing to avoid unnecessary processing: + +| Condition | Action | Reason | +|-----------|--------|--------| +| Dataset not in index | ✅ Index | New dataset needs indexing | +| Dataset newer than indexed version | ✅ Re-index | Dataset has been updated | +| Dataset same/older than indexed version | ❌ Skip | Already up to date | +| OpenSearch document check fails | ✅ Index | Better safe than sorry | +| Invalid XML metadata | ❌ Skip + Log Error | Cannot process invalid data | + +### Timestamp Comparison +```typescript +// Example comparison logic +const existingModified = DateTime.fromMillis(Number(existingDoc.server_date_modified) * 1000); +const currentModified = dataset.server_date_modified; + +if (currentModified <= existingModified) { + // Skip - already up to date + return false; +} +// Proceed with indexing +``` + +## XML Transformation Process + +### 1. **XML Generation** +```xml +<?xml version="1.0" encoding="UTF-8" standalone="true"?> +<root> + <Dataset> + <!-- Dataset metadata fields --> + <title>Research Dataset Title + Dataset description... + + + +``` + +### 2. **XSLT Processing** +The command uses Saxon-JS with a compiled stylesheet (`solr.sef.json`) to transform XML to JSON: +```javascript +const result = await SaxonJS.transform({ + stylesheetText: proc, + destination: 'serialized', + sourceText: xmlString, +}); +``` + +### 3. **Final JSON Document** +```json +{ + "id": "231", + "title": "Research Dataset Title", + "description": "Dataset description...", + "authors": ["Author Name"], + "server_date_modified": 1634567890, + "publish_id": 231 +} +``` + +## Configuration Requirements + +### Environment Variables +```bash +# OpenSearch Configuration +OPENSEARCH_HOST=localhost:9200 + +# For production: +# OPENSEARCH_HOST=your-opensearch-cluster:9200 +``` + +### Required Files +- **XSLT Stylesheet**: `public/assets2/solr.sef.json` - Compiled Saxon-JS stylesheet for XML transformation + +### Database Relationships +The command expects these model relationships: +```typescript +// Dataset model must have: +@hasOne(() => XmlCache, { foreignKey: 'dataset_id' }) +public xmlCache: HasOne +``` + +## Error Handling + +The command handles various error scenarios gracefully: + +### Common Errors and Solutions + +| Error | Cause | Solution | +|-------|-------|----------| +| `XSLT transformation failed` | Invalid XML or missing stylesheet | Check XML structure and stylesheet path | +| `OpenSearch connection error` | Service unavailable | Verify OpenSearch is running and accessible | +| `JSON parse error` | Malformed transformation result | Check XSLT stylesheet output format | +| `Missing xmlCache relationship` | Data integrity issue | Ensure xmlCache exists for dataset | + +### Error Logging +```bash +# Typical error log entry +An error occurred while indexing dataset with publish_id 231. +Error: XSLT transformation failed: Invalid XML structure at line 15 +``` + +## Performance Considerations + +### Batch Processing +- Processes datasets sequentially to avoid overwhelming OpenSearch +- Each dataset is committed individually for reliability +- Failed indexing of one dataset doesn't stop processing others + +### Resource Usage +- **Memory**: XML/JSON transformations require temporary memory +- **Network**: OpenSearch API calls for each dataset +- **CPU**: XSLT transformations are CPU-intensive + +### Optimization Tips +```bash +# Index only recently modified datasets (run regularly) +node ace index:datasets + +# Index specific datasets when needed +node ace index:datasets --publish_id 231 + +# Consider running during off-peak hours for large batches +``` + +## Integration with Other Systems + +### Search Functionality +The indexed documents power: +- **Dataset Search**: Full-text search across metadata +- **Faceted Browsing**: Filter by authors, keywords, dates +- **Geographic Search**: Spatial query capabilities +- **Auto-complete**: Suggest dataset titles and keywords + +### Related Commands +- [`update:datacite`](update-datacite.md) - Often run after indexing to sync DOI metadata +- **Database migrations** - May require re-indexing after schema changes + +### API Integration +The indexed data is consumed by: +- **Search API**: `/api/search` endpoints +- **Browse API**: `/api/datasets` with filtering +- **Recommendations**: Related dataset suggestions + +## Monitoring and Maintenance + +### Regular Tasks +```bash +# Daily indexing (recommended cron job) +0 2 * * * cd /path/to/project && node ace index:datasets + +# Weekly full re-index (if needed) +0 3 * * 0 cd /path/to/project && node ace index:datasets --force +``` + +### Health Checks +- Monitor OpenSearch cluster health +- Check for failed indexing operations in logs +- Verify search functionality is working +- Compare dataset counts between database and index + +### Troubleshooting +```bash +# Check specific dataset indexing +node ace index:datasets --publish_id 231 + +# Verify OpenSearch connectivity +curl -X GET "localhost:9200/_cluster/health" + +# Check index statistics +curl -X GET "localhost:9200/tethys-records/_stats" +``` + +## Best Practices + +1. **Regular Scheduling**: Run the command regularly (daily) to keep the search index current +2. **Monitor Logs**: Watch for transformation errors or OpenSearch issues +3. **Backup Strategy**: Include OpenSearch indices in backup procedures +4. **Resource Management**: Monitor OpenSearch cluster resources during bulk operations +5. **Testing**: Verify search functionality after major indexing operations +6. **Coordination**: Run indexing before DataCite updates when both are needed \ No newline at end of file diff --git a/docs/commands/update-datacite.md b/docs/commands/update-datacite.md new file mode 100644 index 0000000..06041f0 --- /dev/null +++ b/docs/commands/update-datacite.md @@ -0,0 +1,216 @@ +# DataCite Update Command + +AdonisJS Ace command for updating DataCite DOI records for published datasets. + +## Overview + +The `update:datacite` command synchronizes your local dataset metadata with DataCite DOI records. It intelligently compares modification dates to only update records when necessary, reducing unnecessary API calls and maintaining data consistency. + +## Command Syntax + +```bash +node ace update:datacite [options] +``` + +## Options + +| Flag | Alias | Description | +|------|-------|-------------| +| `--publish_id ` | `-p` | Update a specific dataset by publish_id | +| `--force` | `-f` | Force update all records regardless of modification date | +| `--dry-run` | `-d` | Preview what would be updated without making changes | +| `--stats` | `-s` | Show detailed statistics for datasets that need updating | + +## Usage Examples + +### Basic Operations + +```bash +# Update all datasets that have been modified since their DOI was last updated +node ace update:datacite + +# Update a specific dataset +node ace update:datacite --publish_id 231 +node ace update:datacite -p 231 + +# Force update all datasets with DOIs (ignores modification dates) +node ace update:datacite --force +``` + +### Preview and Analysis + +```bash +# Preview what would be updated (dry run) +node ace update:datacite --dry-run + +# Show detailed statistics for datasets that need updating +node ace update:datacite --stats + +# Show stats for a specific dataset +node ace update:datacite --stats --publish_id 231 +``` + +### Combined Options + +```bash +# Dry run for a specific dataset +node ace update:datacite --dry-run --publish_id 231 + +# Show stats for all datasets (including up-to-date ones) +node ace update:datacite --stats --force +``` + +## Command Modes + +### 1. **Normal Mode** (Default) +Updates DataCite records for datasets that have been modified since their DOI was last updated. + +**Example Output:** +``` +Using DataCite API: https://api.test.datacite.org +Found 50 datasets to process +Dataset 231: Successfully updated DataCite record +Dataset 245: Up to date, skipping +Dataset 267: Successfully updated DataCite record +DataCite update completed. Updated: 15, Skipped: 35, Errors: 0 +``` + +### 2. **Dry Run Mode** (`--dry-run`) +Shows what would be updated without making any changes to DataCite. + +**Use Case:** Preview updates before running the actual command. + +**Example Output:** +``` +Dataset 231: Would update DataCite record (dry run) +Dataset 267: Would update DataCite record (dry run) +Dataset 245: Up to date, skipping +DataCite update completed. Updated: 2, Skipped: 1, Errors: 0 +``` + +### 3. **Stats Mode** (`--stats`) +Shows detailed information for each dataset that needs updating, including why it needs updating. + +**Use Case:** Debug synchronization issues, monitor dataset/DOI status, generate reports. + +**Example Output:** +``` +┌─ Dataset 231 ───────────────────────────────────────────────────────── +│ DOI Value: 10.21388/tethys.231 +│ DOI Status (DB): findable +│ DOI State (DataCite): findable +│ Dataset Modified: 2024-09-15T10:30:00.000Z +│ DOI Modified: 2024-09-10T08:15:00.000Z +│ Needs Update: YES - Dataset newer than DOI +└─────────────────────────────────────────────────────────────────────── + +┌─ Dataset 267 ───────────────────────────────────────────────────────── +│ DOI Value: 10.21388/tethys.267 +│ DOI Status (DB): findable +│ DOI State (DataCite): findable +│ Dataset Modified: 2024-09-18T14:20:00.000Z +│ DOI Modified: 2024-09-16T12:45:00.000Z +│ Needs Update: YES - Dataset newer than DOI +└─────────────────────────────────────────────────────────────────────── + +DataCite Stats Summary: 2 datasets need updating, 48 are up to date +``` + +## Update Logic + +The command uses intelligent update detection: + +1. **Compares modification dates**: Dataset `server_date_modified` vs DOI last modification date from DataCite +2. **Validates data integrity**: Checks for missing or future dates +3. **Handles API failures gracefully**: Updates anyway if DataCite info can't be retrieved +4. **Uses dual API approach**: DataCite REST API (primary) with MDS API fallback + +### When Updates Happen + +| Condition | Action | Reason | +|-----------|--------|--------| +| Dataset modified > DOI modified | ✅ Update | Dataset has newer changes | +| Dataset modified ≤ DOI modified | ❌ Skip | DOI is up to date | +| Dataset date in future | ❌ Skip | Invalid data, needs investigation | +| Dataset date missing | ✅ Update | Can't determine staleness | +| DataCite API error | ✅ Update | Better safe than sorry | +| `--force` flag used | ✅ Update | Override all logic | + +## Environment Configuration + +Required environment variables: + +```bash +# DataCite Credentials +DATACITE_USERNAME=your_username +DATACITE_PASSWORD=your_password + +# API Endpoints (environment-specific) +DATACITE_API_URL=https://api.test.datacite.org # Test environment +DATACITE_SERVICE_URL=https://mds.test.datacite.org # Test MDS + +DATACITE_API_URL=https://api.datacite.org # Production +DATACITE_SERVICE_URL=https://mds.datacite.org # Production MDS + +# Project Configuration +DATACITE_PREFIX=10.21388 # Your DOI prefix +BASE_DOMAIN=tethys.at # Your domain +``` + +## Error Handling + +The command handles various error scenarios: + +- **Invalid modification dates**: Logs errors but continues processing other datasets +- **DataCite API failures**: Falls back to MDS API, then to safe update +- **Missing DOI identifiers**: Skips datasets without DOI identifiers +- **Network issues**: Continues with next dataset after logging error + +## Integration + +The command integrates with: + +- **Dataset Model**: Uses `server_date_modified` for change detection +- **DatasetIdentifier Model**: Reads DOI values and status +- **OpenSearch Index**: Updates search index after DataCite update +- **DoiClient**: Handles all DataCite API interactions + +## Common Workflows + +### Daily Maintenance +```bash +# Update any datasets modified today +node ace update:datacite +``` + +### Pre-Deployment Check +```bash +# Check what would be updated before deployment +node ace update:datacite --dry-run +``` + +### Debugging Sync Issues +```bash +# Investigate why specific dataset isn't syncing +node ace update:datacite --stats --publish_id 231 +``` + +### Full Resync +```bash +# Force update all DOI records (use with caution) +node ace update:datacite --force +``` + +### Monitoring Report +```bash +# Generate sync status report +node ace update:datacite --stats > datacite-sync-report.txt +``` + +## Best Practices + +1. **Regular Updates**: Run daily or after bulk dataset modifications +2. **Test First**: Use `--dry-run` or `--stats` before bulk operations +3. **Monitor Logs**: Check for data integrity warnings +4. **Environment Separation**: Use correct API URLs for test vs production +5. **Rate Limiting**: The command handles DataCite rate limits automatically \ No newline at end of file diff --git a/freshclam.conf b/freshclam.conf index ee82a23..31992be 100644 --- a/freshclam.conf +++ b/freshclam.conf @@ -1,229 +1,47 @@ ## -## Example config file for freshclam -## Please read the freshclam.conf(5) manual before editing this file. +## Container-optimized freshclam configuration ## - -# Comment or remove the line below. - -# Path to the database directory. -# WARNING: It must match clamd.conf's directive! -# Default: hardcoded (depends on installation options) +# Database directory DatabaseDirectory /var/lib/clamav -# Path to the log file (make sure it has proper permissions) -# Default: disabled +# Log to stdout for container logging # UpdateLogFile /dev/stdout -# Maximum size of the log file. -# Value of 0 disables the limit. -# You may use 'M' or 'm' for megabytes (1M = 1m = 1048576 bytes) -# and 'K' or 'k' for kilobytes (1K = 1k = 1024 bytes). -# in bytes just don't use modifiers. If LogFileMaxSize is enabled, -# log rotation (the LogRotate option) will always be enabled. -# Default: 1M -#LogFileMaxSize 2M - -# Log time with each message. -# Default: no +# Basic logging settings LogTime yes - -# Enable verbose logging. -# Default: no LogVerbose yes - -# Use system logger (can work together with UpdateLogFile). -# Default: no LogSyslog no -# Specify the type of syslog messages - please refer to 'man syslog' -# for facility names. -# Default: LOG_LOCAL6 -#LogFacility LOG_MAIL - -# Enable log rotation. Always enabled when LogFileMaxSize is enabled. -# Default: no -#LogRotate yes - -# This option allows you to save the process identifier of the daemon -# Default: disabled -#PidFile /var/run/freshclam.pid +# PID file location PidFile /var/run/clamav/freshclam.pid -# By default when started freshclam drops privileges and switches to the -# "clamav" user. This directive allows you to change the database owner. -# Default: clamav (may depend on installation options) +# Database owner DatabaseOwner node -# Use DNS to verify virus database version. Freshclam uses DNS TXT records -# to verify database and software versions. With this directive you can change -# the database verification domain. -# WARNING: Do not touch it unless you're configuring freshclam to use your -# own database verification domain. -# Default: current.cvd.clamav.net -#DNSDatabaseInfo current.cvd.clamav.net - -# Uncomment the following line and replace XY with your country -# code. See http://www.iana.org/cctld/cctld-whois.htm for the full list. -# You can use db.XY.ipv6.clamav.net for IPv6 connections. +# Mirror settings for Austria DatabaseMirror db.at.clamav.net - -# database.clamav.net is a round-robin record which points to our most -# reliable mirrors. It's used as a fall back in case db.XY.clamav.net is -# not working. DO NOT TOUCH the following line unless you know what you -# are doing. DatabaseMirror database.clamav.net -# How many attempts to make before giving up. -# Default: 3 (per mirror) -#MaxAttempts 5 - # With this option you can control scripted updates. It's highly recommended # to keep it enabled. # Default: yes -#ScriptedUpdates yes - -# By default freshclam will keep the local databases (.cld) uncompressed to -# make their handling faster. With this option you can enable the compression; -# the change will take effect with the next database update. -# Default: no -#CompressLocalDatabase no - -# With this option you can provide custom sources (http:// or file://) for -# database files. This option can be used multiple times. -# Default: no custom URLs -#DatabaseCustomURL http://myserver.com/mysigs.ndb -#DatabaseCustomURL file:///mnt/nfs/local.hdb - -# This option allows you to easily point freshclam to private mirrors. -# If PrivateMirror is set, freshclam does not attempt to use DNS -# to determine whether its databases are out-of-date, instead it will -# use the If-Modified-Since request or directly check the headers of the -# remote database files. For each database, freshclam first attempts -# to download the CLD file. If that fails, it tries to download the -# CVD file. This option overrides DatabaseMirror, DNSDatabaseInfo -# and ScriptedUpdates. It can be used multiple times to provide -# fall-back mirrors. -# Default: disabled -#PrivateMirror mirror1.mynetwork.com -#PrivateMirror mirror2.mynetwork.com +# Update settings +ScriptedUpdates yes # Number of database checks per day. # Default: 12 (every two hours) -#Checks 24 +Checks 12 -# Proxy settings -# Default: disabled -#HTTPProxyServer myproxy.com -#HTTPProxyPort 1234 -#HTTPProxyUsername myusername -#HTTPProxyPassword mypass - -# If your servers are behind a firewall/proxy which applies User-Agent -# filtering you can use this option to force the use of a different -# User-Agent header. -# Default: clamav/version_number -#HTTPUserAgent SomeUserAgentIdString - -# Use aaa.bbb.ccc.ddd as client address for downloading databases. Useful for -# multi-homed systems. -# Default: Use OS'es default outgoing IP address. -#LocalIPAddress aaa.bbb.ccc.ddd - -# Send the RELOAD command to clamd. -# Default: no -#NotifyClamd /path/to/clamd.conf - -# Run command after successful database update. -# Default: disabled -#OnUpdateExecute command - -# Run command when database update process fails. -# Default: disabled -#OnErrorExecute command - -# Run command when freshclam reports outdated version. -# In the command string %v will be replaced by the new version number. -# Default: disabled -#OnOutdatedExecute command - -# Don't fork into background. -# Default: no +# Don't fork (good for containers) Foreground no -# Enable debug messages in libclamav. -# Default: no -#Debug yes +# Connection timeouts +ConnectTimeout 60 +ReceiveTimeout 60 -# Timeout in seconds when connecting to database server. -# Default: 30 -#ConnectTimeout 60 +# Test databases before using them +TestDatabases yes -# Timeout in seconds when reading from database server. -# Default: 30 -#ReceiveTimeout 60 - -# With this option enabled, freshclam will attempt to load new -# databases into memory to make sure they are properly handled -# by libclamav before replacing the old ones. -# Default: yes -#TestDatabases yes - -# When enabled freshclam will submit statistics to the ClamAV Project about -# the latest virus detections in your environment. The ClamAV maintainers -# will then use this data to determine what types of malware are the most -# detected in the field and in what geographic area they are. -# Freshclam will connect to clamd in order to get recent statistics. -# Default: no -#SubmitDetectionStats /path/to/clamd.conf - -# Country of origin of malware/detection statistics (for statistical -# purposes only). The statistics collector at ClamAV.net will look up -# your IP address to determine the geographical origin of the malware -# reported by your installation. If this installation is mainly used to -# scan data which comes from a different location, please enable this -# option and enter a two-letter code (see http://www.iana.org/domains/root/db/) -# of the country of origin. -# Default: disabled -#DetectionStatsCountry country-code - -# This option enables support for our "Personal Statistics" service. -# When this option is enabled, the information on malware detected by -# your clamd installation is made available to you through our website. -# To get your HostID, log on http://www.stats.clamav.net and add a new -# host to your host list. Once you have the HostID, uncomment this option -# and paste the HostID here. As soon as your freshclam starts submitting -# information to our stats collecting service, you will be able to view -# the statistics of this clamd installation by logging into -# http://www.stats.clamav.net with the same credentials you used to -# generate the HostID. For more information refer to: -# http://www.clamav.net/documentation.html#cctts -# This feature requires SubmitDetectionStats to be enabled. -# Default: disabled -#DetectionStatsHostID unique-id - -# This option enables support for Google Safe Browsing. When activated for -# the first time, freshclam will download a new database file (safebrowsing.cvd) -# which will be automatically loaded by clamd and clamscan during the next -# reload, provided that the heuristic phishing detection is turned on. This -# database includes information about websites that may be phishing sites or -# possible sources of malware. When using this option, it's mandatory to run -# freshclam at least every 30 minutes. -# Freshclam uses the ClamAV's mirror infrastructure to distribute the -# database and its updates but all the contents are provided under Google's -# terms of use. See http://www.google.com/transparencyreport/safebrowsing -# and http://www.clamav.net/documentation.html#safebrowsing -# for more information. -# Default: disabled -#SafeBrowsing yes - -# This option enables downloading of bytecode.cvd, which includes additional -# detection mechanisms and improvements to the ClamAV engine. -# Default: enabled -#Bytecode yes - -# Download an additional 3rd party signature database distributed through -# the ClamAV mirrors. -# This option can be used multiple times. -#ExtraDatabase dbname1 -#ExtraDatabase dbname2 +# Enable bytecode signatures +Bytecode yes \ No newline at end of file diff --git a/index.d.ts b/index.d.ts index 8165192..f6767a1 100644 --- a/index.d.ts +++ b/index.d.ts @@ -183,3 +183,9 @@ declare module 'saxon-js' { export function transform(options: ITransformOptions): Promise | ITransformOutput; } + +declare global { + interface File { + sort_order?: number; + } + } \ No newline at end of file diff --git a/package-lock.json b/package-lock.json index 609fd32..9aeee5f 100644 --- a/package-lock.json +++ b/package-lock.json @@ -8,30 +8,32 @@ "name": "myapp", "version": "1.0.0", "dependencies": { - "@adonisjs/auth": "^9.1.1", - "@adonisjs/core": "^6.3.1", + "@adonisjs/auth": "^9.2.4", + "@adonisjs/bodyparser": "^10.0.1", + "@adonisjs/core": "^6.21.0", "@adonisjs/cors": "^2.2.1", - "@adonisjs/drive": "^2.3.0", - "@adonisjs/encore": "^1.0.0", - "@adonisjs/inertia": "^1.0.0-7", - "@adonisjs/lucid": "^21.1.0", + "@adonisjs/drive": "^3.2.0", + "@adonisjs/inertia": "^3.1.1", + "@adonisjs/lucid": "^21.5.1", "@adonisjs/mail": "^9.2.2", "@adonisjs/redis": "^9.1.0", - "@adonisjs/session": "^7.1.1", + "@adonisjs/session": "^7.5.0", "@adonisjs/shield": "^8.1.1", "@adonisjs/static": "^1.1.1", + "@adonisjs/vite": "^4.0.0", "@eidellev/adonis-stardust": "^3.0.0", "@fontsource/archivo-black": "^5.0.1", "@fontsource/inter": "^5.0.1", "@inertiajs/inertia": "^0.11.1", - "@inertiajs/vue3": "^1.0.0", - "@opensearch-project/opensearch": "^2.4.0", + "@inertiajs/vue3": "^2.3.25", + "@opensearch-project/opensearch": "^3.2.0", "@phc/format": "^1.0.0", - "@vinejs/vine": "^2.0.0", + "@poppinss/manager": "^5.0.2", + "@vinejs/vine": "^3.0.0", + "axios": "^1.7.9", "bcrypt": "^5.1.1", "bcryptjs": "^2.4.3", "clamscan": "^2.1.2", - "crypto": "^1.0.1", "dayjs": "^1.11.7", "deep-email-validator": "^0.1.21", "edge.js": "^6.0.1", @@ -46,72 +48,69 @@ "node-exceptions": "^4.0.1", "notiwind": "^2.0.0", "pg": "^8.9.0", + "phc-argon2": "^1.1.4", "qrcode": "^1.5.3", - "redis": "^4.6.10", + "redis": "^6.0.0", "reflect-metadata": "^0.2.1", "saxon-js": "^2.5.0", "toastify-js": "^1.12.0", "vuedraggable": "^4.1.0", - "xmlbuilder2": "^3.1.1" + "xmlbuilder2": "^4.0.3" }, "devDependencies": { "@adonisjs/assembler": "^7.1.1", - "@adonisjs/tsconfig": "^1.2.1", - "@babel/core": "^7.20.12", - "@babel/plugin-proposal-class-properties": "^7.18.6", - "@babel/plugin-proposal-decorators": "^7.20.13", - "@babel/plugin-transform-runtime": "^7.19.6", - "@babel/preset-env": "^7.20.2", - "@babel/preset-typescript": "^7.18.6", - "@japa/api-client": "^2.0.3", - "@japa/assert": "^3.0.0", - "@japa/plugin-adonisjs": "^3.0.0", - "@japa/runner": "^3.1.1", + "@adonisjs/tsconfig": "^1.4.0", + "@headlessui/vue": "^1.7.23", + "@japa/assert": "^4.0.1", + "@japa/plugin-adonisjs": "^4.0.0", + "@japa/runner": "^4.2.0", "@mdi/js": "^7.1.96", "@poppinss/utils": "^6.7.2", - "@swc/core": "^1.4.2", - "@symfony/webpack-encore": "^5.0.1", + "@swc/wasm": "^1.10.14", "@tailwindcss/forms": "^0.5.2", "@types/bcryptjs": "^2.4.6", "@types/clamscan": "^2.0.4", "@types/escape-html": "^1.0.4", - "@types/leaflet": "^1.9.3", + "@types/fs-extra": "^11.0.4", + "@types/leaflet": "^1.9.21", "@types/luxon": "^3.4.2", - "@types/node": "^22.5.5", + "@types/node": "^22.10.2", "@types/proxy-addr": "^2.0.0", "@types/qrcode": "^1.5.5", "@types/source-map-support": "^0.5.6", "@types/sprintf-js": "^1.1.4", "@types/supertest": "^6.0.2", + "@vitejs/plugin-vue": "^5.2.1", "autoprefixer": "^10.4.13", "babel-preset-typescript-vue3": "^2.0.17", "chart.js": "^4.2.0", "dotenv-webpack": "^8.0.1", "eslint": "^8.57.1", - "eslint-config-prettier": "^9.0.0", + "eslint-config-prettier": "^10.0.1", "eslint-plugin-adonis": "^2.1.1", "eslint-plugin-prettier": "^5.0.0-alpha.2", "numeral": "^2.0.6", - "pinia": "^2.0.30", - "pino-pretty": "^11.2.2", + "pinia": "^3.0.2", + "pino-pretty": "^13.0.0", "postcss-loader": "^8.1.1", - "prettier": "^3.0.0", + "prettier": "^3.4.2", "supertest": "^6.3.3", - "tailwindcss": "^3.2.4", + "tailwindcss": "^3.4.17", "ts-loader": "^9.4.2", - "ts-node": "^10.9.2", - "typescript": "^5.1.3", + "ts-node-maintained": "^10.9.5", + "typescript": "^5.9.3", + "vite": "^6.0.11", "vue": "^3.4.26", - "vue-facing-decorator": "^3.0.0", + "vue-facing-decorator": "^4.0.1", "vue-loader": "^17.0.1", "webpack-dev-server": "^5.1.0", "xslt3": "^2.5.0" } }, "node_modules/@adonisjs/ace": { - "version": "13.3.0", - "resolved": "https://registry.npmjs.org/@adonisjs/ace/-/ace-13.3.0.tgz", - "integrity": "sha512-68dveDFd766p69cBvK/MtOrOP0+YKYLeHspa9KLEWcWk9suPf3pbGkHQ2pwDnvLJxBPHk4932KbbSSzzpGNZGw==", + "version": "13.4.0", + "resolved": "https://registry.npmjs.org/@adonisjs/ace/-/ace-13.4.0.tgz", + "integrity": "sha512-7Wq6CpXmQm3m/6fKfzubAadCdiH2kKSni+K8s5KcTIFryKSqW+f06UAPOUwRJWqy80hnVlujAjveIsNJSPeJjA==", "license": "MIT", "dependencies": { "@poppinss/cliui": "^6.4.1", @@ -131,55 +130,23 @@ } }, "node_modules/@adonisjs/application": { - "version": "5.3.0", - "resolved": "https://registry.npmjs.org/@adonisjs/application/-/application-5.3.0.tgz", - "integrity": "sha512-AruZZXMgOdmmRxJEHUbXoqhgRavPfhkeIR2nQtGyxbn0PCNjqlGraq8ypuLINY1J+wNuH2tt0xCS98EDeMdTOQ==", + "version": "8.4.2", + "resolved": "https://registry.npmjs.org/@adonisjs/application/-/application-8.4.2.tgz", + "integrity": "sha512-gxyQgl1n7M/hv7ZKQOlTo2adBMehjEO0ssWSG3AGW2RXdCvkHQKlatFXMuXJMmGg2P1AWJX0LEiXey9+qxC9Uw==", "license": "MIT", - "peer": true, "dependencies": { - "@adonisjs/config": "^3.0.9", - "@adonisjs/env": "^3.0.9", - "@adonisjs/fold": "^8.2.0", - "@adonisjs/logger": "^4.1.5", - "@adonisjs/profiler": "^6.0.9", - "@poppinss/utils": "^5.0.0", - "semver": "^7.3.8" - } - }, - "node_modules/@adonisjs/application/node_modules/@poppinss/utils": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/@poppinss/utils/-/utils-5.0.0.tgz", - "integrity": "sha512-SpJL5p4Nx3bRCpCf62KagZLUHLvJD+VDylGpXAeP2G5qb3s6SSOBlpaFmer4GxdyTqLIUt0PRCzF1TbpNU+qZw==", - "license": "MIT", - "peer": true, - "dependencies": { - "@poppinss/file-generator": "^1.0.2", - "@types/bytes": "^3.1.1", - "@types/he": "^1.1.2", - "bytes": "^3.1.2", - "change-case": "^4.1.2", - "cuid": "^2.1.8", - "flattie": "^1.1.0", - "fs-readdir-recursive": "^1.1.0", - "he": "^1.2.0", - "kind-of": "^6.0.3", - "lodash": "^4.17.21", - "ms": "^2.1.3", - "pluralize": "^8.0.0", - "require-all": "^3.0.0", - "resolve-from": "^5.0.0", - "slugify": "^1.6.5", - "truncatise": "0.0.8" - } - }, - "node_modules/@adonisjs/application/node_modules/resolve-from": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz", - "integrity": "sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==", - "license": "MIT", - "peer": true, + "@poppinss/hooks": "^7.2.5", + "@poppinss/macroable": "^1.0.4", + "@poppinss/utils": "^6.9.3", + "glob-parent": "^6.0.2", + "tempura": "^0.4.1" + }, "engines": { - "node": ">=8" + "node": ">=18.16.0" + }, + "peerDependencies": { + "@adonisjs/config": "^5.0.0", + "@adonisjs/fold": "^10.0.0" } }, "node_modules/@adonisjs/assembler": { @@ -213,30 +180,14 @@ "typescript": "^4.0.0 || ^5.0.0" } }, - "node_modules/@adonisjs/assembler/node_modules/@adonisjs/env": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/@adonisjs/env/-/env-6.1.0.tgz", - "integrity": "sha512-CzK+njXTH3EK+d/UJPqckyqWocOItmLgHIUbvhpd6WvveBnfv1Dz5j9H3k+ogHqThDSJCXu1RkaRAC+HNym9gA==", - "devOptional": true, - "license": "MIT", - "dependencies": { - "@poppinss/utils": "^6.7.3", - "@poppinss/validator-lite": "^1.0.3", - "dotenv": "^16.4.5", - "split-lines": "^3.0.0" - }, - "engines": { - "node": ">=18.16.0" - } - }, "node_modules/@adonisjs/auth": { - "version": "9.3.0", - "resolved": "https://registry.npmjs.org/@adonisjs/auth/-/auth-9.3.0.tgz", - "integrity": "sha512-fJ6QNiCwWuIWONgwruPrzkkMK4EOj8YoCbrdnvHh6HdMXLTyp9xPR3xbbg2BTb1ssKxAnsaaNR+HPYfGLNYacw==", + "version": "9.6.0", + "resolved": "https://registry.npmjs.org/@adonisjs/auth/-/auth-9.6.0.tgz", + "integrity": "sha512-v7wHlY606TwqnWWU5SIMJV0ZcNhjH2LeBLb764eCFVgeNEEdv8konhRcABqTTNADrHr1ANVuV7PymN9gzgG63w==", "license": "MIT", "dependencies": { - "@adonisjs/presets": "^2.6.3", - "@poppinss/utils": "^6.8.3", + "@adonisjs/presets": "^2.6.4", + "@poppinss/utils": "^6.10.1", "basic-auth": "^2.0.1" }, "engines": { @@ -246,9 +197,9 @@ "@adonisjs/core": "^6.11.0", "@adonisjs/lucid": "^20.0.0 || ^21.0.1", "@adonisjs/session": "^7.4.1", - "@japa/api-client": "^2.0.3", + "@japa/api-client": "^2.0.3 || ^3.0.0", "@japa/browser-client": "^2.0.3", - "@japa/plugin-adonisjs": "^3.0.1" + "@japa/plugin-adonisjs": "^3.0.1 || ^4.0.0" }, "peerDependenciesMeta": { "@adonisjs/lucid": { @@ -268,80 +219,71 @@ } } }, - "node_modules/@adonisjs/config": { - "version": "3.0.9", - "resolved": "https://registry.npmjs.org/@adonisjs/config/-/config-3.0.9.tgz", - "integrity": "sha512-f+wzrc+0HLvhJyYGEMV2QTHtyJ8sI3PKvH9h/baW/iF8UO3KF+llHH0Cf3/M5dYnpdz9rnmj0VtdTaIDfxrgGg==", + "node_modules/@adonisjs/bodyparser": { + "version": "10.1.5", + "resolved": "https://registry.npmjs.org/@adonisjs/bodyparser/-/bodyparser-10.1.5.tgz", + "integrity": "sha512-eioO/rdmjzujIe6ZlSOdnEWh/GFyqQC6l+TzowYA5ukOhMw2LGd+ruZt+Frm/zHtwdzRraciVFSx7zGYRh4XkA==", "license": "MIT", - "peer": true, "dependencies": { - "@poppinss/utils": "^5.0.0" - } - }, - "node_modules/@adonisjs/config/node_modules/@poppinss/utils": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/@poppinss/utils/-/utils-5.0.0.tgz", - "integrity": "sha512-SpJL5p4Nx3bRCpCf62KagZLUHLvJD+VDylGpXAeP2G5qb3s6SSOBlpaFmer4GxdyTqLIUt0PRCzF1TbpNU+qZw==", - "license": "MIT", - "peer": true, - "dependencies": { - "@poppinss/file-generator": "^1.0.2", - "@types/bytes": "^3.1.1", - "@types/he": "^1.1.2", + "@paralleldrive/cuid2": "^2.2.2", + "@poppinss/macroable": "^1.1.0", + "@poppinss/multiparty": "^2.0.1", + "@poppinss/utils": "^6.10.1", + "@types/qs": "^6.14.0", "bytes": "^3.1.2", - "change-case": "^4.1.2", - "cuid": "^2.1.8", - "flattie": "^1.1.0", - "fs-readdir-recursive": "^1.1.0", - "he": "^1.2.0", - "kind-of": "^6.0.3", - "lodash": "^4.17.21", - "ms": "^2.1.3", - "pluralize": "^8.0.0", - "require-all": "^3.0.0", - "resolve-from": "^5.0.0", - "slugify": "^1.6.5", - "truncatise": "0.0.8" + "file-type": "^21.1.1", + "inflation": "^2.1.0", + "media-typer": "^1.1.0", + "qs": "^6.14.0", + "raw-body": "^3.0.1" + }, + "engines": { + "node": ">=18.16.0" + }, + "peerDependencies": { + "@adonisjs/http-server": "^7.4.0" } }, - "node_modules/@adonisjs/config/node_modules/resolve-from": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz", - "integrity": "sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==", + "node_modules/@adonisjs/config": { + "version": "5.0.3", + "resolved": "https://registry.npmjs.org/@adonisjs/config/-/config-5.0.3.tgz", + "integrity": "sha512-dO7gkYxZsrsnR8n7d5KUpyi+Q5c6BnV2rmFDqEmEjz5AkOZLLzJJJbeHgMb+M27le7ifEUoa8MRu6RED8NMsJg==", "license": "MIT", - "peer": true, + "dependencies": { + "@poppinss/utils": "^6.9.4" + }, "engines": { - "node": ">=8" + "node": ">=18.16.0" } }, "node_modules/@adonisjs/core": { - "version": "6.17.0", - "resolved": "https://registry.npmjs.org/@adonisjs/core/-/core-6.17.0.tgz", - "integrity": "sha512-x78xF4VpTBi7bbBUvMXREbUddz2Ts3Ypz+WUp/D1R0YnA4lE8x+lwGox10SZAe+izQ41KkZlGKY24RYImFkLEg==", + "version": "6.21.0", + "resolved": "https://registry.npmjs.org/@adonisjs/core/-/core-6.21.0.tgz", + "integrity": "sha512-0NmVdl8h5A5jdeKlV+XLGjLw9aSEWXBsga1WEMugAJMJiOHf4ufDWc+Rq+KN062/0IK7or9/4yCt3TxkGJsDWw==", "license": "MIT", "dependencies": { - "@adonisjs/ace": "^13.3.0", - "@adonisjs/application": "^8.3.1", - "@adonisjs/bodyparser": "^10.0.2", - "@adonisjs/config": "^5.0.2", + "@adonisjs/ace": "^13.4.0", + "@adonisjs/application": "^8.4.2", + "@adonisjs/bodyparser": "^10.1.3", + "@adonisjs/config": "^5.0.3", "@adonisjs/encryption": "^6.0.2", - "@adonisjs/env": "^6.1.0", + "@adonisjs/env": "^6.2.0", "@adonisjs/events": "^9.0.2", - "@adonisjs/fold": "^10.1.3", - "@adonisjs/hash": "^9.0.5", + "@adonisjs/fold": "^10.2.1", + "@adonisjs/hash": "^9.1.1", "@adonisjs/health": "^2.0.0", - "@adonisjs/http-server": "^7.4.0", - "@adonisjs/logger": "^6.0.5", - "@adonisjs/repl": "^4.0.1", - "@antfu/install-pkg": "^0.5.0", - "@paralleldrive/cuid2": "^2.2.2", - "@poppinss/colors": "^4.1.3", - "@poppinss/dumper": "^0.6.1", - "@poppinss/macroable": "^1.0.3", - "@poppinss/utils": "^6.8.3", - "@sindresorhus/is": "^7.0.1", + "@adonisjs/http-server": "^7.8.0", + "@adonisjs/logger": "^6.0.7", + "@adonisjs/repl": "^4.1.2", + "@antfu/install-pkg": "^1.1.0", + "@paralleldrive/cuid2": "^2.3.1", + "@poppinss/colors": "^4.1.6", + "@poppinss/dumper": "^0.6.5", + "@poppinss/macroable": "^1.1.0", + "@poppinss/utils": "^6.10.1", + "@sindresorhus/is": "^7.2.0", "@types/he": "^1.2.3", - "error-stack-parser-es": "^0.1.5", + "error-stack-parser-es": "^1.0.5", "he": "^1.2.0", "parse-imports": "^2.2.1", "pretty-hrtime": "^1.0.3", @@ -357,9 +299,9 @@ }, "peerDependencies": { "@adonisjs/assembler": "^7.8.0", - "@vinejs/vine": "^2.1.0 || ^3.0.0", - "argon2": "^0.31.2 || ^0.41.0", - "bcrypt": "^5.1.1", + "@vinejs/vine": "^2.1.0 || ^3.0.0 || ^4.0.0", + "argon2": "^0.31.2 || ^0.41.0 || ^0.43.0 || ^0.44.0", + "bcrypt": "^5.1.1 || ^6.0.0", "edge.js": "^6.2.0" }, "peerDependenciesMeta": { @@ -380,64 +322,101 @@ } } }, - "node_modules/@adonisjs/core/node_modules/@adonisjs/application": { - "version": "8.3.1", - "resolved": "https://registry.npmjs.org/@adonisjs/application/-/application-8.3.1.tgz", - "integrity": "sha512-hfZBgZ23BQAXvoSHDkc/I0hTSXyFVxypNqHPQ/WCk4VoWlBVWVgGaGnHLvIGhrZ3RMvyoC5NBgC0PR5G+/fGSw==", + "node_modules/@adonisjs/core/node_modules/@adonisjs/hash": { + "version": "9.1.1", + "resolved": "https://registry.npmjs.org/@adonisjs/hash/-/hash-9.1.1.tgz", + "integrity": "sha512-ZkRguwjAp4skKvKDdRAfdJ2oqQ0N7p9l3sioyXO1E8o0WcsyDgEpsTQtuVNoIdMiw4sn4gJlmL3nyF4BcK1ZDQ==", "license": "MIT", "dependencies": { - "@poppinss/hooks": "^7.2.3", - "@poppinss/macroable": "^1.0.2", - "@poppinss/utils": "^6.7.3", - "glob-parent": "^6.0.2", - "tempura": "^0.4.0" + "@phc/format": "^1.0.0", + "@poppinss/utils": "^6.9.3" }, + "engines": { + "node": ">=20.6.0" + }, + "peerDependencies": { + "argon2": "^0.31.2 || ^0.41.0 || ^0.43.0", + "bcrypt": "^5.1.1 || ^6.0.0" + }, + "peerDependenciesMeta": { + "argon2": { + "optional": true + }, + "bcrypt": { + "optional": true + } + } + }, + "node_modules/@adonisjs/core/node_modules/@antfu/install-pkg": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@antfu/install-pkg/-/install-pkg-1.1.0.tgz", + "integrity": "sha512-MGQsmw10ZyI+EJo45CdSER4zEb+p31LpDAFp2Z3gkSd1yqVZGi0Ebx++YTEMonJy4oChEMLsxZ64j8FH6sSqtQ==", + "license": "MIT", + "dependencies": { + "package-manager-detector": "^1.3.0", + "tinyexec": "^1.0.1" + }, + "funding": { + "url": "https://github.com/sponsors/antfu" + } + }, + "node_modules/@adonisjs/core/node_modules/package-manager-detector": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/package-manager-detector/-/package-manager-detector-1.6.0.tgz", + "integrity": "sha512-61A5ThoTiDG/C8s8UMZwSorAGwMJ0ERVGj2OjoW5pAalsNOg15+iQiPzrLJ4jhZ1HJzmC2PIHT2oEiH3R5fzNA==", + "license": "MIT" + }, + "node_modules/@adonisjs/core/node_modules/tinyexec": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/tinyexec/-/tinyexec-1.2.4.tgz", + "integrity": "sha512-SHf/r48b7vOrjve9PxJo3MN5v5yuyjHvdUcrQffT3WXMUfnGmHDVbC4k3sHJaJTgZCwpUplIaAo5ANtMyp3YHg==", + "license": "MIT", + "engines": { + "node": ">=18" + } + }, + "node_modules/@adonisjs/cors": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/@adonisjs/cors/-/cors-2.2.1.tgz", + "integrity": "sha512-qnrSG8ylpgTeZBOYEN3yXxY0PBUEg1KGDhgn9VKVFGxLKT+o9GGVOSZxUK3wG341B1zB9w5vuZN1z4M0Jitb6g==", + "license": "MIT", "engines": { "node": ">=18.16.0" }, "peerDependencies": { - "@adonisjs/config": "^5.0.0", - "@adonisjs/fold": "^10.0.0" + "@adonisjs/core": "^6.2.0" } }, - "node_modules/@adonisjs/core/node_modules/@adonisjs/bodyparser": { - "version": "10.0.2", - "resolved": "https://registry.npmjs.org/@adonisjs/bodyparser/-/bodyparser-10.0.2.tgz", - "integrity": "sha512-dkbn+DK5B1dODTwk5367gHPhaD4ZIoGon/jvq47iX2cnHjk3a0SyQrBEjoFhnrNkVOJZ76I3OJ3oixqgMcE+yA==", + "node_modules/@adonisjs/drive": { + "version": "3.4.1", + "resolved": "https://registry.npmjs.org/@adonisjs/drive/-/drive-3.4.1.tgz", + "integrity": "sha512-oDYY4wJ7wDMlO4E+dZPYBu+T3Av7Mj+JL8+J33qgyxtiJylnZgoZDuRfFjZZix/bFNNuWX2sLwTMnyiDcK+YsA==", "license": "MIT", "dependencies": { - "@paralleldrive/cuid2": "^2.2.2", - "@poppinss/macroable": "^1.0.2", - "@poppinss/multiparty": "^2.0.1", - "@poppinss/utils": "^6.7.3", - "@types/qs": "^6.9.15", - "bytes": "^3.1.2", - "file-type": "^19.0.0", - "inflation": "^2.1.0", - "media-typer": "^1.1.0", - "qs": "^6.12.1", - "raw-body": "^2.5.2" + "flydrive": "^1.1.0" }, "engines": { - "node": ">=18.16.0" + "node": ">=20.6.0" }, "peerDependencies": { - "@adonisjs/http-server": "^7.0.2" - } - }, - "node_modules/@adonisjs/core/node_modules/@adonisjs/config": { - "version": "5.0.2", - "resolved": "https://registry.npmjs.org/@adonisjs/config/-/config-5.0.2.tgz", - "integrity": "sha512-NXjFqDHNGRTZ1EnA4zr20GFEt7qw/JvZ4ZV8/PzFyVc7dPoFprpoyE3bw7kmlKHhcQdBbF7YXCGB4q+HQUnqiQ==", - "license": "MIT", - "dependencies": { - "@poppinss/utils": "^6.7.3" + "@adonisjs/core": "^6.2.0", + "@aws-sdk/client-s3": "^3.577.0", + "@aws-sdk/s3-request-presigner": "^3.577.0", + "@google-cloud/storage": "^7.10.2" }, - "engines": { - "node": ">=18.16.0" + "peerDependenciesMeta": { + "@aws-sdk/client-s3": { + "optional": true + }, + "@aws-sdk/s3-request-presigner": { + "optional": true + }, + "@google-cloud/storage": { + "optional": true + } } }, - "node_modules/@adonisjs/core/node_modules/@adonisjs/encryption": { + "node_modules/@adonisjs/encryption": { "version": "6.0.2", "resolved": "https://registry.npmjs.org/@adonisjs/encryption/-/encryption-6.0.2.tgz", "integrity": "sha512-37XqVPsZi6zXMbC0Me1/qlcTP0uE+KAtYOFx7D7Tvtz377NL/6gqxqgpW/BopgOSD+CVDXjzO/Wx3M2UrbkJRQ==", @@ -449,22 +428,22 @@ "node": ">=18.16.0" } }, - "node_modules/@adonisjs/core/node_modules/@adonisjs/env": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/@adonisjs/env/-/env-6.1.0.tgz", - "integrity": "sha512-CzK+njXTH3EK+d/UJPqckyqWocOItmLgHIUbvhpd6WvveBnfv1Dz5j9H3k+ogHqThDSJCXu1RkaRAC+HNym9gA==", + "node_modules/@adonisjs/env": { + "version": "6.2.0", + "resolved": "https://registry.npmjs.org/@adonisjs/env/-/env-6.2.0.tgz", + "integrity": "sha512-DZ7zQ4sBhzWftjU/SxJ7BstimrEiByCvmtAcMNDpDjOtJnR50172PRz1X7KjM3EqjCVrB19izzRVx/rmpCRPOA==", "license": "MIT", "dependencies": { - "@poppinss/utils": "^6.7.3", - "@poppinss/validator-lite": "^1.0.3", - "dotenv": "^16.4.5", + "@poppinss/utils": "^6.9.2", + "@poppinss/validator-lite": "^2.1.0", + "dotenv": "^16.4.7", "split-lines": "^3.0.0" }, "engines": { "node": ">=18.16.0" } }, - "node_modules/@adonisjs/core/node_modules/@adonisjs/events": { + "node_modules/@adonisjs/events": { "version": "9.0.2", "resolved": "https://registry.npmjs.org/@adonisjs/events/-/events-9.0.2.tgz", "integrity": "sha512-qZn2e9V9C8tF4MNqEWv5JGxMG7gcHSJM8RncGpjuJ4cwFwd2jF4xrN6wkCprTVwoyZSxNS0Cp9NkAonySjG5vg==", @@ -482,7 +461,7 @@ "@adonisjs/fold": "^10.0.1" } }, - "node_modules/@adonisjs/core/node_modules/@adonisjs/events/node_modules/@sindresorhus/is": { + "node_modules/@adonisjs/events/node_modules/@sindresorhus/is": { "version": "6.3.1", "resolved": "https://registry.npmjs.org/@sindresorhus/is/-/is-6.3.1.tgz", "integrity": "sha512-FX4MfcifwJyFOI2lPoX7PQxCqx8BG1HCho7WdiXwpEQx1Ycij0JxkfYtGK7yqNScrZGSlt6RE6sw8QYoH7eKnQ==", @@ -494,423 +473,30 @@ "url": "https://github.com/sindresorhus/is?sponsor=1" } }, - "node_modules/@adonisjs/core/node_modules/@adonisjs/fold": { - "version": "10.1.3", - "resolved": "https://registry.npmjs.org/@adonisjs/fold/-/fold-10.1.3.tgz", - "integrity": "sha512-wzeuWMXx9SoJkNO4ycoyfxzoSyyMy3umVxb9cbzeWR/sYNVgi50l+vgJc634+lxpCE0RFTpxCv1M235EWDF9SQ==", - "license": "MIT", - "dependencies": { - "@poppinss/utils": "^6.8.3" - }, - "engines": { - "node": ">=18.16.0" - } - }, - "node_modules/@adonisjs/core/node_modules/@adonisjs/http-server": { - "version": "7.4.0", - "resolved": "https://registry.npmjs.org/@adonisjs/http-server/-/http-server-7.4.0.tgz", - "integrity": "sha512-2Me8ytUu0Sm0jYJs2SAiYQX3ECF6clOJwPE04cswsAwEnqSFLZkflD3c6rApjLjZO6P1wFlo090HNaZCFrlcMQ==", - "license": "MIT", - "dependencies": { - "@paralleldrive/cuid2": "^2.2.2", - "@poppinss/macroable": "^1.0.3", - "@poppinss/matchit": "^3.1.2", - "@poppinss/middleware": "^3.2.4", - "@poppinss/utils": "^6.8.3", - "@sindresorhus/is": "^7.0.1", - "accepts": "^1.3.8", - "content-disposition": "^0.5.4", - "cookie": "^1.0.2", - "destroy": "^1.2.0", - "encodeurl": "^2.0.0", - "etag": "^1.8.1", - "fresh": "^0.5.2", - "mime-types": "^2.1.35", - "on-finished": "^2.4.1", - "proxy-addr": "^2.0.7", - "qs": "^6.13.1", - "tmp-cache": "^1.1.0", - "type-is": "^1.6.18", - "vary": "^1.1.2", - "youch": "^3.3.4" - }, - "engines": { - "node": ">=18.16.0" - }, - "peerDependencies": { - "@adonisjs/application": "^8.0.2", - "@adonisjs/encryption": "^6.0.0", - "@adonisjs/events": "^9.0.0", - "@adonisjs/fold": "^10.0.1", - "@adonisjs/logger": "^6.0.1" - } - }, - "node_modules/@adonisjs/core/node_modules/@adonisjs/logger": { - "version": "6.0.5", - "resolved": "https://registry.npmjs.org/@adonisjs/logger/-/logger-6.0.5.tgz", - "integrity": "sha512-1QmbLPNC636MeJzqflMA64lUnAn5dbb7W0YQ/ea33papnNqGOfvDQuxqqKlzM6ww9jPZlXTIf/3t7KAWlfHCfQ==", - "license": "MIT", - "dependencies": { - "@poppinss/utils": "^6.8.3", - "abstract-logging": "^2.0.1", - "pino": "^9.5.0" - }, - "engines": { - "node": ">=18.16.0" - } - }, - "node_modules/@adonisjs/core/node_modules/@antfu/install-pkg": { - "version": "0.5.0", - "resolved": "https://registry.npmjs.org/@antfu/install-pkg/-/install-pkg-0.5.0.tgz", - "integrity": "sha512-dKnk2xlAyC7rvTkpkHmu+Qy/2Zc3Vm/l8PtNyIOGDBtXPY3kThfU4ORNEp3V7SXw5XSOb+tOJaUYpfquPzL/Tg==", - "license": "MIT", - "dependencies": { - "package-manager-detector": "^0.2.5", - "tinyexec": "^0.3.1" - }, - "funding": { - "url": "https://github.com/sponsors/antfu" - } - }, - "node_modules/@adonisjs/core/node_modules/cookie": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/cookie/-/cookie-1.0.2.tgz", - "integrity": "sha512-9Kr/j4O16ISv8zBBhJoi4bXOYNTkFLOqSL3UDB0njXxCXNezjeyVrJyGOWtgfs/q2km1gwBcfH8q1yEGoMYunA==", - "license": "MIT", - "engines": { - "node": ">=18" - } - }, - "node_modules/@adonisjs/core/node_modules/encodeurl": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-2.0.0.tgz", - "integrity": "sha512-Q0n9HRi4m6JuGIV1eFlmvJB7ZEVxu93IrMyiMsGC0lrMJMWzRgx6WGquyfQgZVb31vhGgXnfmPNNXmxnOkRBrg==", - "license": "MIT", - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/@adonisjs/core/node_modules/media-typer": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-1.1.0.tgz", - "integrity": "sha512-aisnrDP4GNe06UcKFnV5bfMNPBUw4jsLGaWwWfnH3v02GnBuXX2MCVn5RbrWo0j3pczUilYblq7fQ7Nw2t5XKw==", - "license": "MIT", - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/@adonisjs/core/node_modules/pino": { - "version": "9.6.0", - "resolved": "https://registry.npmjs.org/pino/-/pino-9.6.0.tgz", - "integrity": "sha512-i85pKRCt4qMjZ1+L7sy2Ag4t1atFcdbEt76+7iRJn1g2BvsnRMGu9p8pivl9fs63M2kF/A0OacFZhTub+m/qMg==", - "license": "MIT", - "dependencies": { - "atomic-sleep": "^1.0.0", - "fast-redact": "^3.1.1", - "on-exit-leak-free": "^2.1.0", - "pino-abstract-transport": "^2.0.0", - "pino-std-serializers": "^7.0.0", - "process-warning": "^4.0.0", - "quick-format-unescaped": "^4.0.3", - "real-require": "^0.2.0", - "safe-stable-stringify": "^2.3.1", - "sonic-boom": "^4.0.1", - "thread-stream": "^3.0.0" - }, - "bin": { - "pino": "bin.js" - } - }, - "node_modules/@adonisjs/core/node_modules/pino-std-serializers": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/pino-std-serializers/-/pino-std-serializers-7.0.0.tgz", - "integrity": "sha512-e906FRY0+tV27iq4juKzSYPbUj2do2X2JX4EzSca1631EB2QJQUqGbDuERal7LCtOpxl6x3+nvo9NPZcmjkiFA==", - "license": "MIT" - }, - "node_modules/@adonisjs/core/node_modules/process-warning": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/process-warning/-/process-warning-4.0.1.tgz", - "integrity": "sha512-3c2LzQ3rY9d0hc1emcsHhfT9Jwz0cChib/QN89oME2R451w5fy3f0afAhERFZAwrbDU43wk12d0ORBpDVME50Q==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/fastify" - }, - { - "type": "opencollective", - "url": "https://opencollective.com/fastify" - } - ], - "license": "MIT" - }, - "node_modules/@adonisjs/core/node_modules/sonic-boom": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/sonic-boom/-/sonic-boom-4.2.0.tgz", - "integrity": "sha512-INb7TM37/mAcsGmc9hyyI6+QR3rR1zVRu36B0NeGXKnOOLiZOfER5SA+N7X7k3yUYRzLWafduTDvJAfDswwEww==", - "license": "MIT", - "dependencies": { - "atomic-sleep": "^1.0.0" - } - }, - "node_modules/@adonisjs/cors": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/@adonisjs/cors/-/cors-2.2.1.tgz", - "integrity": "sha512-qnrSG8ylpgTeZBOYEN3yXxY0PBUEg1KGDhgn9VKVFGxLKT+o9GGVOSZxUK3wG341B1zB9w5vuZN1z4M0Jitb6g==", - "license": "MIT", - "engines": { - "node": ">=18.16.0" - }, - "peerDependencies": { - "@adonisjs/core": "^6.2.0" - } - }, - "node_modules/@adonisjs/drive": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/@adonisjs/drive/-/drive-2.3.0.tgz", - "integrity": "sha512-3V1kBe2qB/860KcS+dDonv8Xya2YDBdR7291pQgObJeTbV50Vy8RhwdOwtU7ybRfN2kh/svdC4238JGpbQOR9w==", - "license": "MIT", - "dependencies": { - "@poppinss/manager": "^5.0.2", - "@poppinss/utils": "^5.0.0", - "@types/fs-extra": "^9.0.13", - "etag": "^1.8.1", - "fs-extra": "^10.1.0", - "memfs": "^3.4.7" - }, - "peerDependencies": { - "@adonisjs/application": "^5.0.0", - "@adonisjs/http-server": "^5.0.0" - } - }, - "node_modules/@adonisjs/drive/node_modules/@poppinss/utils": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/@poppinss/utils/-/utils-5.0.0.tgz", - "integrity": "sha512-SpJL5p4Nx3bRCpCf62KagZLUHLvJD+VDylGpXAeP2G5qb3s6SSOBlpaFmer4GxdyTqLIUt0PRCzF1TbpNU+qZw==", - "license": "MIT", - "dependencies": { - "@poppinss/file-generator": "^1.0.2", - "@types/bytes": "^3.1.1", - "@types/he": "^1.1.2", - "bytes": "^3.1.2", - "change-case": "^4.1.2", - "cuid": "^2.1.8", - "flattie": "^1.1.0", - "fs-readdir-recursive": "^1.1.0", - "he": "^1.2.0", - "kind-of": "^6.0.3", - "lodash": "^4.17.21", - "ms": "^2.1.3", - "pluralize": "^8.0.0", - "require-all": "^3.0.0", - "resolve-from": "^5.0.0", - "slugify": "^1.6.5", - "truncatise": "0.0.8" - } - }, - "node_modules/@adonisjs/drive/node_modules/fs-extra": { - "version": "10.1.0", - "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-10.1.0.tgz", - "integrity": "sha512-oRXApq54ETRj4eMiFzGnHWGy+zo5raudjuxN0b8H7s/RU2oW0Wvsx9O0ACRN/kRq9E8Vu/ReskGB5o3ji+FzHQ==", - "license": "MIT", - "dependencies": { - "graceful-fs": "^4.2.0", - "jsonfile": "^6.0.1", - "universalify": "^2.0.0" - }, - "engines": { - "node": ">=12" - } - }, - "node_modules/@adonisjs/drive/node_modules/resolve-from": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz", - "integrity": "sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==", - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/@adonisjs/encore": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/@adonisjs/encore/-/encore-1.0.0.tgz", - "integrity": "sha512-pDl1sE3QguS3q94UklSoA5oCU5PTS1fuI9OEVnjo8B4ruI/wXBwuXDEAofYictiE3sXBM4+6MmxbI25MaL9DEA==", - "license": "MIT", - "dependencies": { - "@poppinss/utils": "^6.7.1", - "edge-error": "^4.0.1", - "stringify-attributes": "^4.0.0" - }, - "peerDependencies": { - "@adonisjs/core": "^6.2.1", - "edge.js": "^6.0.1" - } - }, - "node_modules/@adonisjs/encryption": { - "version": "4.0.8", - "resolved": "https://registry.npmjs.org/@adonisjs/encryption/-/encryption-4.0.8.tgz", - "integrity": "sha512-zMWbIESPHXafsbiLJyON/hlRYwrTIA3PuTil7xC8W4ngC36PgWe86Ra0x0t961u1We/LaSGkT8Vn93DymqB3aA==", - "license": "MIT", - "peer": true, - "dependencies": { - "@poppinss/utils": "^4.0.3" - }, - "peerDependencies": { - "@adonisjs/application": "^5.0.0" - } - }, - "node_modules/@adonisjs/encryption/node_modules/@poppinss/utils": { - "version": "4.0.4", - "resolved": "https://registry.npmjs.org/@poppinss/utils/-/utils-4.0.4.tgz", - "integrity": "sha512-6LS3mofSVB9IQZqofA4rX6KVVcCpdwUQuNe4efHqOTzgD/Q5HTVvDP0vKg1m994QlzJs4aLW1JwXVcNCThEh4g==", - "license": "MIT", - "peer": true, - "dependencies": { - "@poppinss/file-generator": "^1.0.2", - "@types/bytes": "^3.1.1", - "@types/he": "^1.1.2", - "bytes": "^3.1.2", - "change-case": "^4.1.2", - "cuid": "^2.1.8", - "flattie": "^1.1.0", - "fs-readdir-recursive": "^1.1.0", - "he": "^1.2.0", - "kind-of": "^6.0.3", - "lodash": "^4.17.21", - "ms": "^2.1.3", - "pluralize": "^8.0.0", - "require-all": "^3.0.0", - "resolve-from": "^5.0.0", - "slugify": "^1.6.5", - "truncatise": "0.0.8" - } - }, - "node_modules/@adonisjs/encryption/node_modules/resolve-from": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz", - "integrity": "sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==", - "license": "MIT", - "peer": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/@adonisjs/env": { - "version": "3.0.9", - "resolved": "https://registry.npmjs.org/@adonisjs/env/-/env-3.0.9.tgz", - "integrity": "sha512-9lxGmOQuF4FpUQ6NIwL/YQumaXG+2Wt8jQlQptplSUTasy6DHSEp7/SYvtC2RD9vxwn4gsptNCo+f8YRiqUvwQ==", - "license": "MIT", - "peer": true, - "dependencies": { - "@poppinss/utils": "^4.0.2", - "dotenv": "^16.0.0", - "validator": "^13.7.0" - } - }, - "node_modules/@adonisjs/env/node_modules/@poppinss/utils": { - "version": "4.0.4", - "resolved": "https://registry.npmjs.org/@poppinss/utils/-/utils-4.0.4.tgz", - "integrity": "sha512-6LS3mofSVB9IQZqofA4rX6KVVcCpdwUQuNe4efHqOTzgD/Q5HTVvDP0vKg1m994QlzJs4aLW1JwXVcNCThEh4g==", - "license": "MIT", - "peer": true, - "dependencies": { - "@poppinss/file-generator": "^1.0.2", - "@types/bytes": "^3.1.1", - "@types/he": "^1.1.2", - "bytes": "^3.1.2", - "change-case": "^4.1.2", - "cuid": "^2.1.8", - "flattie": "^1.1.0", - "fs-readdir-recursive": "^1.1.0", - "he": "^1.2.0", - "kind-of": "^6.0.3", - "lodash": "^4.17.21", - "ms": "^2.1.3", - "pluralize": "^8.0.0", - "require-all": "^3.0.0", - "resolve-from": "^5.0.0", - "slugify": "^1.6.5", - "truncatise": "0.0.8" - } - }, - "node_modules/@adonisjs/env/node_modules/resolve-from": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz", - "integrity": "sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==", - "license": "MIT", - "peer": true, - "engines": { - "node": ">=8" - } - }, "node_modules/@adonisjs/fold": { - "version": "8.2.0", - "resolved": "https://registry.npmjs.org/@adonisjs/fold/-/fold-8.2.0.tgz", - "integrity": "sha512-Uoo2HPp4SShIkGOF3+p3gT09W3j0zpkK+fOpPyYPTqYm7CWAunklTlowqX45b6CAVb5DCcORDUB8ia4D1ijeKg==", + "version": "10.2.1", + "resolved": "https://registry.npmjs.org/@adonisjs/fold/-/fold-10.2.1.tgz", + "integrity": "sha512-WuW62T3jZB0w/7C7YbDkfzIMJaEQZ2cGdf6qoeevB0zYNH4kTp2oREfTx45ndNjiN6D5GhjoR8JRpjiAfppFIA==", "license": "MIT", - "peer": true, "dependencies": { - "@poppinss/utils": "^4.0.4" + "@poppinss/utils": "^7.0.0-next.3", + "parse-imports": "^2.2.1" + }, + "engines": { + "node": ">=18.16.0" } }, "node_modules/@adonisjs/fold/node_modules/@poppinss/utils": { - "version": "4.0.4", - "resolved": "https://registry.npmjs.org/@poppinss/utils/-/utils-4.0.4.tgz", - "integrity": "sha512-6LS3mofSVB9IQZqofA4rX6KVVcCpdwUQuNe4efHqOTzgD/Q5HTVvDP0vKg1m994QlzJs4aLW1JwXVcNCThEh4g==", - "license": "MIT", - "peer": true, - "dependencies": { - "@poppinss/file-generator": "^1.0.2", - "@types/bytes": "^3.1.1", - "@types/he": "^1.1.2", - "bytes": "^3.1.2", - "change-case": "^4.1.2", - "cuid": "^2.1.8", - "flattie": "^1.1.0", - "fs-readdir-recursive": "^1.1.0", - "he": "^1.2.0", - "kind-of": "^6.0.3", - "lodash": "^4.17.21", - "ms": "^2.1.3", - "pluralize": "^8.0.0", - "require-all": "^3.0.0", - "resolve-from": "^5.0.0", - "slugify": "^1.6.5", - "truncatise": "0.0.8" - } - }, - "node_modules/@adonisjs/fold/node_modules/resolve-from": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz", - "integrity": "sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==", - "license": "MIT", - "peer": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/@adonisjs/hash": { - "version": "9.0.5", - "resolved": "https://registry.npmjs.org/@adonisjs/hash/-/hash-9.0.5.tgz", - "integrity": "sha512-oY8PafBrdGsr5UY8cAzzxPCtehZDW7KsPcI47dZpjydOdL/PQrT4liX+cGujL6mSbi3JEgQLBgBs/+SlPFvCrg==", + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/@poppinss/utils/-/utils-7.0.1.tgz", + "integrity": "sha512-mveSvLI2YPC114mK5HCuSYfUtjpClf1wHG1VCqZJCp4U2ypPhIt62Iku5urh0kPAFvnvCVHx2bXBSH14qMTOlQ==", "license": "MIT", "dependencies": { - "@phc/format": "^1.0.0", - "@poppinss/utils": "^6.8.3" - }, - "engines": { - "node": ">=20.6.0" - }, - "peerDependencies": { - "argon2": "^0.31.2 || ^0.41.0", - "bcrypt": "^5.1.1" - }, - "peerDependenciesMeta": { - "argon2": { - "optional": true - }, - "bcrypt": { - "optional": true - } + "@poppinss/exception": "^1.2.3", + "@poppinss/object-builder": "^1.1.0", + "@poppinss/string": "^1.7.1", + "@poppinss/types": "^1.2.1", + "flattie": "^1.1.1" } }, "node_modules/@adonisjs/health": { @@ -927,88 +513,56 @@ } }, "node_modules/@adonisjs/http-server": { - "version": "5.12.0", - "resolved": "https://registry.npmjs.org/@adonisjs/http-server/-/http-server-5.12.0.tgz", - "integrity": "sha512-+9cw/DRlLO2NSoHsccmMe3pFf6c0/8INds2yf73ZAZOmzUROb9DQaXHocJ/iwHX9EVxtDuKWDc5z0jI1SYdqEA==", + "version": "7.8.1", + "resolved": "https://registry.npmjs.org/@adonisjs/http-server/-/http-server-7.8.1.tgz", + "integrity": "sha512-ScwKHJstXQbkQXSNqD6MOESowZ+WhRyDXxjSQV/T7IpyMEg/F8NxpR5jAvrpw1BaGzd3t50LrgTrb7ouD8DOpA==", "license": "MIT", - "peer": true, "dependencies": { + "@paralleldrive/cuid2": "^2.2.2", + "@poppinss/macroable": "^1.0.4", "@poppinss/matchit": "^3.1.2", - "@poppinss/utils": "^5.0.0", + "@poppinss/middleware": "^3.2.5", + "@poppinss/utils": "^6.10.0", + "@sindresorhus/is": "^7.0.2", "accepts": "^1.3.8", - "co-compose": "^7.0.2", "content-disposition": "^0.5.4", - "cookie": "^0.5.0", + "cookie": "^1.0.2", "destroy": "^1.2.0", - "encodeurl": "^1.0.2", + "encodeurl": "^2.0.0", "etag": "^1.8.1", "fresh": "^0.5.2", - "haye": "^3.0.0", - "macroable": "^7.0.2", - "mime-types": "^2.1.35", - "ms": "^2.1.3", + "mime-types": "^3.0.1", "on-finished": "^2.4.1", - "pluralize": "^8.0.0", "proxy-addr": "^2.0.7", - "qs": "^6.11.0", + "qs": "^6.14.0", "tmp-cache": "^1.1.0", - "type-is": "^1.6.18", - "vary": "^1.1.2" + "type-is": "^2.0.1", + "vary": "^1.1.2", + "youch": "^3.3.4" + }, + "engines": { + "node": ">=18.16.0" }, "peerDependencies": { - "@adonisjs/application": "^5.0.0", - "@adonisjs/encryption": "^4.0.0" - } - }, - "node_modules/@adonisjs/http-server/node_modules/@poppinss/utils": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/@poppinss/utils/-/utils-5.0.0.tgz", - "integrity": "sha512-SpJL5p4Nx3bRCpCf62KagZLUHLvJD+VDylGpXAeP2G5qb3s6SSOBlpaFmer4GxdyTqLIUt0PRCzF1TbpNU+qZw==", - "license": "MIT", - "peer": true, - "dependencies": { - "@poppinss/file-generator": "^1.0.2", - "@types/bytes": "^3.1.1", - "@types/he": "^1.1.2", - "bytes": "^3.1.2", - "change-case": "^4.1.2", - "cuid": "^2.1.8", - "flattie": "^1.1.0", - "fs-readdir-recursive": "^1.1.0", - "he": "^1.2.0", - "kind-of": "^6.0.3", - "lodash": "^4.17.21", - "ms": "^2.1.3", - "pluralize": "^8.0.0", - "require-all": "^3.0.0", - "resolve-from": "^5.0.0", - "slugify": "^1.6.5", - "truncatise": "0.0.8" - } - }, - "node_modules/@adonisjs/http-server/node_modules/resolve-from": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz", - "integrity": "sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==", - "license": "MIT", - "peer": true, - "engines": { - "node": ">=8" + "@adonisjs/application": "^8.0.2", + "@adonisjs/encryption": "^6.0.0", + "@adonisjs/events": "^9.0.0", + "@adonisjs/fold": "^10.0.1", + "@adonisjs/logger": "^6.0.1" } }, "node_modules/@adonisjs/inertia": { - "version": "1.2.4", - "resolved": "https://registry.npmjs.org/@adonisjs/inertia/-/inertia-1.2.4.tgz", - "integrity": "sha512-brYEkXn7ZNv394Bvqewlh9anoxLnW8yQ8beyJz14I4ylZmEyyOcxis3JpobpUzlpWHGLAU/zssEqpJL5AXFcmg==", + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/@adonisjs/inertia/-/inertia-3.1.1.tgz", + "integrity": "sha512-FWzAfGjjnh3jEB7sIx20xcNlKW+zHCBDE37fNasQK5QMrcuz0BzTRfb0jTuvyjgadbCksdge+rDtIOek1tId7A==", "license": "MIT", "dependencies": { - "@poppinss/utils": "^6.8.3", - "@tuyau/utils": "^0.0.4", - "crc-32": "^1.2.2", - "edge-error": "^4.0.1", + "@poppinss/utils": "^6.9.2", + "@tuyau/utils": "^0.0.7", + "edge-error": "^4.0.2", "html-entities": "^2.5.2", "locate-path": "^7.2.0", - "qs": "^6.13.0" + "qs": "^6.14.0" }, "engines": { "node": ">=20.6.0" @@ -1016,8 +570,8 @@ "peerDependencies": { "@adonisjs/core": "^6.9.1", "@adonisjs/session": "^7.4.0", - "@adonisjs/vite": "^3.0.0", - "@japa/api-client": "^2.0.0", + "@adonisjs/vite": "^4.0.0", + "@japa/api-client": "^2.0.0 || ^3.0.0", "edge.js": "^6.0.0" }, "peerDependenciesMeta": { @@ -1027,72 +581,37 @@ } }, "node_modules/@adonisjs/logger": { - "version": "4.1.6", - "resolved": "https://registry.npmjs.org/@adonisjs/logger/-/logger-4.1.6.tgz", - "integrity": "sha512-lmnx/wGvxnlHLuUEWQ+VpUQuKBEKumdutNWZPythGP/VpBRzunypntDb7O9XfauPva6B6Z9WVjr2+v3ElTcKPQ==", + "version": "6.0.7", + "resolved": "https://registry.npmjs.org/@adonisjs/logger/-/logger-6.0.7.tgz", + "integrity": "sha512-zeWk14EuFGD+YrwLfwrzUcEKS06equr1Xn624+b28H3s0JhjmgXNfsDRlBe9X+GgJiuD8Zf3/52MX//7cGaNWQ==", "license": "MIT", - "peer": true, "dependencies": { - "@poppinss/utils": "^5.0.0", - "@types/pino": "^6.3.12", + "@poppinss/utils": "^6.10.1", "abstract-logging": "^2.0.1", - "pino": "^6.14.0" - } - }, - "node_modules/@adonisjs/logger/node_modules/@poppinss/utils": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/@poppinss/utils/-/utils-5.0.0.tgz", - "integrity": "sha512-SpJL5p4Nx3bRCpCf62KagZLUHLvJD+VDylGpXAeP2G5qb3s6SSOBlpaFmer4GxdyTqLIUt0PRCzF1TbpNU+qZw==", - "license": "MIT", - "peer": true, - "dependencies": { - "@poppinss/file-generator": "^1.0.2", - "@types/bytes": "^3.1.1", - "@types/he": "^1.1.2", - "bytes": "^3.1.2", - "change-case": "^4.1.2", - "cuid": "^2.1.8", - "flattie": "^1.1.0", - "fs-readdir-recursive": "^1.1.0", - "he": "^1.2.0", - "kind-of": "^6.0.3", - "lodash": "^4.17.21", - "ms": "^2.1.3", - "pluralize": "^8.0.0", - "require-all": "^3.0.0", - "resolve-from": "^5.0.0", - "slugify": "^1.6.5", - "truncatise": "0.0.8" - } - }, - "node_modules/@adonisjs/logger/node_modules/resolve-from": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz", - "integrity": "sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==", - "license": "MIT", - "peer": true, + "pino": "^10.1.0" + }, "engines": { - "node": ">=8" + "node": ">=18.16.0" } }, "node_modules/@adonisjs/lucid": { - "version": "21.6.0", - "resolved": "https://registry.npmjs.org/@adonisjs/lucid/-/lucid-21.6.0.tgz", - "integrity": "sha512-wEocH/PsAT4VVTS5qz65VvxDJqEJCZPzTMmVldddNhM9Yiwc5mr5Nu+UQp9Pfnx2Jp3o+nicnF0IM6thJyb6lg==", + "version": "21.8.2", + "resolved": "https://registry.npmjs.org/@adonisjs/lucid/-/lucid-21.8.2.tgz", + "integrity": "sha512-+ocmllAr77cc7EgQoDQokNpB3lz1Rmw0olcNtx7TbR8TeCAiegDAkNe1HylKzNOGX+i0kvb0FeOvSlZ9N0GmXQ==", "license": "MIT", "dependencies": { - "@adonisjs/presets": "^2.6.3", - "@faker-js/faker": "^9.3.0", - "@poppinss/hooks": "^7.2.4", - "@poppinss/macroable": "^1.0.3", - "@poppinss/utils": "^6.8.3", + "@adonisjs/presets": "^2.6.4", + "@faker-js/faker": "^9.9.0", + "@poppinss/hooks": "^7.3.0", + "@poppinss/macroable": "^1.1.0", + "@poppinss/utils": "^6.10.1", "fast-deep-equal": "^3.1.3", "igniculus": "^1.5.0", "kleur": "^4.1.5", "knex": "^3.1.0", "knex-dynamic-connection": "^3.2.0", "pretty-hrtime": "^1.0.3", - "qs": "^6.13.1", + "qs": "^6.14.1", "slash": "^5.1.0", "tarn": "^3.0.2" }, @@ -1102,7 +621,7 @@ "peerDependencies": { "@adonisjs/assembler": "^7.7.0", "@adonisjs/core": "^6.10.1", - "@vinejs/vine": "^2.0.0 || ^3.0.0", + "@vinejs/vine": "^2.0.0 || ^3.0.0 || ^4.0.0", "luxon": "^3.4.4" }, "peerDependenciesMeta": { @@ -1165,108 +684,62 @@ } } }, - "node_modules/@adonisjs/profiler": { - "version": "6.0.9", - "resolved": "https://registry.npmjs.org/@adonisjs/profiler/-/profiler-6.0.9.tgz", - "integrity": "sha512-V1bJPPDTn05NzAKUEICnYtWi9fC8NownUToaqxVkWOUovYBO6ubt06qtH1Uv9zvUjB2PKHUn+ieDAOgyHle09A==", - "license": "MIT", - "peer": true, - "dependencies": { - "@poppinss/utils": "^4.0.3", - "jest-worker": "^27.5.1" - }, - "peerDependencies": { - "@adonisjs/logger": "^4.0.0" - } - }, - "node_modules/@adonisjs/profiler/node_modules/@poppinss/utils": { - "version": "4.0.4", - "resolved": "https://registry.npmjs.org/@poppinss/utils/-/utils-4.0.4.tgz", - "integrity": "sha512-6LS3mofSVB9IQZqofA4rX6KVVcCpdwUQuNe4efHqOTzgD/Q5HTVvDP0vKg1m994QlzJs4aLW1JwXVcNCThEh4g==", - "license": "MIT", - "peer": true, - "dependencies": { - "@poppinss/file-generator": "^1.0.2", - "@types/bytes": "^3.1.1", - "@types/he": "^1.1.2", - "bytes": "^3.1.2", - "change-case": "^4.1.2", - "cuid": "^2.1.8", - "flattie": "^1.1.0", - "fs-readdir-recursive": "^1.1.0", - "he": "^1.2.0", - "kind-of": "^6.0.3", - "lodash": "^4.17.21", - "ms": "^2.1.3", - "pluralize": "^8.0.0", - "require-all": "^3.0.0", - "resolve-from": "^5.0.0", - "slugify": "^1.6.5", - "truncatise": "0.0.8" - } - }, - "node_modules/@adonisjs/profiler/node_modules/resolve-from": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz", - "integrity": "sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==", - "license": "MIT", - "peer": true, - "engines": { - "node": ">=8" - } - }, "node_modules/@adonisjs/redis": { - "version": "9.1.0", - "resolved": "https://registry.npmjs.org/@adonisjs/redis/-/redis-9.1.0.tgz", - "integrity": "sha512-cesml/1Libmwm2yjmbbp2xtyGp+LBNkqCe9ehSmPFM+5puRRbJkqNf6ZaHFQfKdjQU1Y7qR9xtyf5uHLU/K0uw==", + "version": "9.2.0", + "resolved": "https://registry.npmjs.org/@adonisjs/redis/-/redis-9.2.0.tgz", + "integrity": "sha512-DUI9NrHDLZ2ISNjMlqWbKJT99ZYj1ZmvhNFTfhVs9lc7K2KJmNKZfK8Y85a8eN7q+ZYMBYSu1uRemxGs6xRaYw==", "license": "MIT", "dependencies": { - "@poppinss/utils": "^6.7.3", - "emittery": "^1.0.3", - "ioredis": "^5.4.1" + "@poppinss/utils": "^6.9.2", + "emittery": "^1.1.0", + "ioredis": "^5.4.2" }, "engines": { - "node": ">=18.16.0" + "node": ">=20.6.0" }, "peerDependencies": { "@adonisjs/core": "^6.2.0" } }, "node_modules/@adonisjs/repl": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/@adonisjs/repl/-/repl-4.0.1.tgz", - "integrity": "sha512-fgDRC5I8RBKHzsJPM4rRQF/OWI0K9cNihCIf4yHdqQt3mhFqWSOUjSi4sXWykdICLiddmyBO86au7i0d0dj5vQ==", + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/@adonisjs/repl/-/repl-4.1.2.tgz", + "integrity": "sha512-NnczRJusl0082GOjEFYwObW/yBGJtpfJFnkFCQdQ6eykgBHVNYaY6qstfob+l1bedetRj0hrDY6YfsWMkA0MCg==", "license": "MIT", "dependencies": { - "@poppinss/colors": "^4.1.2", - "string-width": "^7.1.0" + "@poppinss/colors": "^4.1.5", + "string-width": "^7.2.0" }, "engines": { "node": ">=18.16.0" } }, "node_modules/@adonisjs/session": { - "version": "7.5.0", - "resolved": "https://registry.npmjs.org/@adonisjs/session/-/session-7.5.0.tgz", - "integrity": "sha512-H5fFrkE/yFSWP/XD8eyWLyUVbtIqTcw9QBP1me4d9vnl4mao4jHrmnNA8rwtzsEFdXu/UgWdH4kljh1G9PDzWw==", + "version": "7.7.1", + "resolved": "https://registry.npmjs.org/@adonisjs/session/-/session-7.7.1.tgz", + "integrity": "sha512-govnDxtc+ZVTOrmgFHi5IG6zs9ylsCH6cbgRvDDlH+15xYuy93mGhO+R96JoqgwVDSSuS0tFP/0HJQDglOoOPA==", "license": "MIT", "dependencies": { - "@poppinss/macroable": "^1.0.3", - "@poppinss/utils": "^6.8.3" + "@poppinss/macroable": "^1.1.0", + "@poppinss/utils": "^6.10.1" }, "engines": { "node": ">=18.16.0" }, "peerDependencies": { "@adonisjs/core": "^6.6.0", + "@adonisjs/lucid": "^21.0.0", "@adonisjs/redis": "^8.0.1 || ^9.0.0", "@aws-sdk/client-dynamodb": "^3.658.0", "@aws-sdk/util-dynamodb": "^3.658.0", - "@japa/api-client": "^2.0.3", + "@japa/api-client": "^2.0.3 || ^3.0.0", "@japa/browser-client": "^2.0.3", "edge.js": "^6.0.2" }, "peerDependenciesMeta": { + "@adonisjs/lucid": { + "optional": true + }, "@adonisjs/redis": { "optional": true }, @@ -1288,12 +761,12 @@ } }, "node_modules/@adonisjs/shield": { - "version": "8.1.1", - "resolved": "https://registry.npmjs.org/@adonisjs/shield/-/shield-8.1.1.tgz", - "integrity": "sha512-b/rIypxfG8HKPRvWYJo7qhvAlvYCFXn7/A7eb/QI/PQV4fMmW4iF9tAykxl5peu4WJCHCwXwR3Y6/j0VerQcmQ==", + "version": "8.2.0", + "resolved": "https://registry.npmjs.org/@adonisjs/shield/-/shield-8.2.0.tgz", + "integrity": "sha512-RddRbs92y87GGFUgDSWD/Pg7qYHh8+MctUphFZwtbTblvDckrjZxuYyp+vmVATPuvDvK7sOlatuZHT4HQSz9zQ==", "license": "MIT", "dependencies": { - "@poppinss/utils": "^6.7.1", + "@poppinss/utils": "^6.9.2", "csrf": "^3.1.0", "helmet-csp": "^3.4.0" }, @@ -1304,7 +777,7 @@ "@adonisjs/core": "^6.2.0", "@adonisjs/i18n": "^2.0.0", "@adonisjs/session": "^7.0.0", - "@japa/api-client": "^2.0.2", + "@japa/api-client": "^2.0.2 || ^3.0.0", "edge.js": "^6.0.1" }, "peerDependenciesMeta": { @@ -1335,23 +808,22 @@ } }, "node_modules/@adonisjs/tsconfig": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/@adonisjs/tsconfig/-/tsconfig-1.4.0.tgz", - "integrity": "sha512-go5KlxE8jJaeoIRzm51PcF2YJSK5i022douVk9OjAqvDiU1t2UepcDoEsSiEOgogUDojp9kbRQmFyf0y0YqvOg==", + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/@adonisjs/tsconfig/-/tsconfig-1.4.1.tgz", + "integrity": "sha512-b7bHdnTaDRGfec4XVtpwsSEukZ549MgqOShScCd1b4xkMK8z1q/jb0Xs4iUL86oIDhty2y7k5vvA6aoQKPAvXQ==", "dev": true, "license": "MIT" }, "node_modules/@adonisjs/vite": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/@adonisjs/vite/-/vite-3.0.0.tgz", - "integrity": "sha512-E09M0zjGwu5GgMYFTGcA00f0y3DblvqekXgtxccjpOE/zLf5ggOxTwI5iZXgD4lVETYirQ0QdS3azznCW2TYkQ==", + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/@adonisjs/vite/-/vite-4.0.0.tgz", + "integrity": "sha512-5kdE0qLIm2dj+XO0HiCohmh3tfZ+X468wkNXErQ15VS0fkDjZWns2VuiYpoToTKd4tdX/oGlpnpd8aIwAGB4ow==", "license": "MIT", - "peer": true, "dependencies": { - "@poppinss/utils": "^6.7.3", - "@vavite/multibuild": "^4.1.1", + "@poppinss/utils": "^6.8.3", + "@vavite/multibuild": "^5.1.0", "edge-error": "^4.0.1", - "vite-plugin-restart": "^0.4.0" + "vite-plugin-restart": "^0.4.2" }, "engines": { "node": ">=20.6.0" @@ -1360,7 +832,7 @@ "@adonisjs/core": "^6.3.0", "@adonisjs/shield": "^8.0.0", "edge.js": "^6.0.1", - "vite": "^5.1.4" + "vite": "^6.0.0" }, "peerDependenciesMeta": { "@adonisjs/shield": { @@ -1384,20 +856,6 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/@ampproject/remapping": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/@ampproject/remapping/-/remapping-2.3.0.tgz", - "integrity": "sha512-30iZtAPgz+LTIYoeivqYo853f02jBYSd5uGnGpkFV0M3xOt9aN73erkgYAmZU43x4VfqcnLxW9Kpg3R5LC4YYw==", - "dev": true, - "license": "Apache-2.0", - "dependencies": { - "@jridgewell/gen-mapping": "^0.3.5", - "@jridgewell/trace-mapping": "^0.3.24" - }, - "engines": { - "node": ">=6.0.0" - } - }, "node_modules/@antfu/install-pkg": { "version": "0.4.1", "resolved": "https://registry.npmjs.org/@antfu/install-pkg/-/install-pkg-0.4.1.tgz", @@ -1412,56 +870,6 @@ "url": "https://github.com/sponsors/antfu" } }, - "node_modules/@apidevtools/json-schema-ref-parser": { - "version": "9.1.2", - "resolved": "https://registry.npmjs.org/@apidevtools/json-schema-ref-parser/-/json-schema-ref-parser-9.1.2.tgz", - "integrity": "sha512-r1w81DpR+KyRWd3f+rk6TNqMgedmAxZP5v5KWlXQWlgMUUtyEJch0DKEci1SorPMiSeM8XPl7MZ3miJ60JIpQg==", - "dev": true, - "license": "MIT", - "dependencies": { - "@jsdevtools/ono": "^7.1.3", - "@types/json-schema": "^7.0.6", - "call-me-maybe": "^1.0.1", - "js-yaml": "^4.1.0" - } - }, - "node_modules/@apidevtools/json-schema-ref-parser/node_modules/argparse": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", - "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==", - "dev": true, - "license": "Python-2.0" - }, - "node_modules/@apidevtools/json-schema-ref-parser/node_modules/js-yaml": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz", - "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==", - "dev": true, - "license": "MIT", - "dependencies": { - "argparse": "^2.0.1" - }, - "bin": { - "js-yaml": "bin/js-yaml.js" - } - }, - "node_modules/@apidevtools/openapi-schemas": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/@apidevtools/openapi-schemas/-/openapi-schemas-2.1.0.tgz", - "integrity": "sha512-Zc1AlqrJlX3SlpupFGpiLi2EbteyP7fXmUOGup6/DnkRgjP9bgMM/ag+n91rsv0U1Gpz0H3VILA/o3bW7Ua6BQ==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=10" - } - }, - "node_modules/@apidevtools/swagger-methods": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/@apidevtools/swagger-methods/-/swagger-methods-3.0.2.tgz", - "integrity": "sha512-QAkD5kK2b1WfjDS/UQn/qQkbwF31uqRjPTrsCs5ZG9BQGAkjwvqGFjjPqAuzac/IYzpPtRzjCP1WrTuAIjMrXg==", - "dev": true, - "license": "MIT" - }, "node_modules/@arr/every": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/@arr/every/-/every-1.0.1.tgz", @@ -1472,47 +880,49 @@ } }, "node_modules/@babel/code-frame": { - "version": "7.26.2", - "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.26.2.tgz", - "integrity": "sha512-RJlIHRueQgwWitWgF8OdFYGZX328Ax5BCemNGlqHfplnRT9ESi8JkFlvaVYbS+UubVY6dpv87Fs2u5M29iNFVQ==", + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.29.7.tgz", + "integrity": "sha512-Aup7aUOfpbAUg2ROOJN6Iw5f9DMBlzu0mIkm/malLQFN/YQgO48wCj0Kxa3sEHJvPVFg7siR+qRInwXd2qhQKw==", "dev": true, "license": "MIT", "dependencies": { - "@babel/helper-validator-identifier": "^7.25.9", + "@babel/helper-validator-identifier": "^7.29.7", "js-tokens": "^4.0.0", - "picocolors": "^1.0.0" + "picocolors": "^1.1.1" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/compat-data": { - "version": "7.26.3", - "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.26.3.tgz", - "integrity": "sha512-nHIxvKPniQXpmQLb0vhY3VaFb3S0YrTAwpOWJZh1wn3oJPjJk9Asva204PsBdmAE8vpzfHudT8DB0scYvy9q0g==", + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.29.7.tgz", + "integrity": "sha512-locTkQyKvwIEgBzVrn8693ebc97F2U8ZHjbXwDXJ5Fn2TCpNwTlKcaKLkdHop5c/icOFE7qt7Q9JC5hnKNa6Gg==", "dev": true, "license": "MIT", + "peer": true, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/core": { - "version": "7.26.0", - "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.26.0.tgz", - "integrity": "sha512-i1SLeK+DzNnQ3LL/CswPCa/E5u4lh1k6IAEphON8F+cXt0t9euTshDru0q7/IqMa1PMPz5RnHuHscF8/ZJsStg==", + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.29.7.tgz", + "integrity": "sha512-RgHBCvtjbOK2gXSNBNIkNoEc9qoVEtau3hj8gEqKQuL3HZAibKarWFEI3Lfm6EYKkLalOh8eSrj9b+ch9H/VBA==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { - "@ampproject/remapping": "^2.2.0", - "@babel/code-frame": "^7.26.0", - "@babel/generator": "^7.26.0", - "@babel/helper-compilation-targets": "^7.25.9", - "@babel/helper-module-transforms": "^7.26.0", - "@babel/helpers": "^7.26.0", - "@babel/parser": "^7.26.0", - "@babel/template": "^7.25.9", - "@babel/traverse": "^7.25.9", - "@babel/types": "^7.26.0", + "@babel/code-frame": "^7.29.7", + "@babel/generator": "^7.29.7", + "@babel/helper-compilation-targets": "^7.29.7", + "@babel/helper-module-transforms": "^7.29.7", + "@babel/helpers": "^7.29.7", + "@babel/parser": "^7.29.7", + "@babel/template": "^7.29.7", + "@babel/traverse": "^7.29.7", + "@babel/types": "^7.29.7", + "@jridgewell/remapping": "^2.3.5", "convert-source-map": "^2.0.0", "debug": "^4.1.0", "gensync": "^1.0.0-beta.2", @@ -1527,27 +937,17 @@ "url": "https://opencollective.com/babel" } }, - "node_modules/@babel/core/node_modules/semver": { - "version": "6.3.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", - "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", - "dev": true, - "license": "ISC", - "bin": { - "semver": "bin/semver.js" - } - }, "node_modules/@babel/generator": { - "version": "7.26.3", - "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.26.3.tgz", - "integrity": "sha512-6FF/urZvD0sTeO7k6/B15pMLC4CHUv1426lzr3N01aHJTl046uCAh9LXW/fzeXXjPNCJ6iABW5XaWOsIZB93aQ==", + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.29.7.tgz", + "integrity": "sha512-DkXD5OJQaAQIdZ1bt3UZdEnHAn9Imd3IVBdX03UFe+ony9Ojw5pzr9YVKGDY1jt+Gcn/FnGkNf8r+Vj5NOJWtQ==", "dev": true, "license": "MIT", "dependencies": { - "@babel/parser": "^7.26.3", - "@babel/types": "^7.26.3", - "@jridgewell/gen-mapping": "^0.3.5", - "@jridgewell/trace-mapping": "^0.3.25", + "@babel/parser": "^7.29.7", + "@babel/types": "^7.29.7", + "@jridgewell/gen-mapping": "^0.3.12", + "@jridgewell/trace-mapping": "^0.3.28", "jsesc": "^3.0.2" }, "engines": { @@ -1555,27 +955,28 @@ } }, "node_modules/@babel/helper-annotate-as-pure": { - "version": "7.25.9", - "resolved": "https://registry.npmjs.org/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.25.9.tgz", - "integrity": "sha512-gv7320KBUFJz1RnylIg5WWYPRXKZ884AGkYpgpWW02TH66Dl+HaC1t1CKd0z3R4b6hdYEcmrNZHUmfCP+1u3/g==", + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.29.7.tgz", + "integrity": "sha512-OoK6239jHPuSQOoS0kfTVKn0b/rVTk0seKq4Gd2UMLtmOVLjDC0ki3e+c90Trqv2gMfvJFqkiljrr568+qddiw==", "dev": true, "license": "MIT", "dependencies": { - "@babel/types": "^7.25.9" + "@babel/types": "^7.29.7" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-compilation-targets": { - "version": "7.25.9", - "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.25.9.tgz", - "integrity": "sha512-j9Db8Suy6yV/VHa4qzrj9yZfZxhLWQdVnRlXxmKLYlhWUVB1sB2G5sxuWYXk/whHD9iW76PmNzxZ4UCnTQTVEQ==", + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.29.7.tgz", + "integrity": "sha512-wem6WaBj4NaVYVdNhLPPVacES6ZJ+KBBfSkTMD3YZxbP3rm3Di85tJU5ljaUNhaOynt+Aj0xruhYuzQBt8n71g==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { - "@babel/compat-data": "^7.25.9", - "@babel/helper-validator-option": "^7.25.9", + "@babel/compat-data": "^7.29.7", + "@babel/helper-validator-option": "^7.29.7", "browserslist": "^4.24.0", "lru-cache": "^5.1.1", "semver": "^6.3.1" @@ -1584,29 +985,19 @@ "node": ">=6.9.0" } }, - "node_modules/@babel/helper-compilation-targets/node_modules/semver": { - "version": "6.3.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", - "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", - "dev": true, - "license": "ISC", - "bin": { - "semver": "bin/semver.js" - } - }, "node_modules/@babel/helper-create-class-features-plugin": { - "version": "7.25.9", - "resolved": "https://registry.npmjs.org/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.25.9.tgz", - "integrity": "sha512-UTZQMvt0d/rSz6KI+qdu7GQze5TIajwTS++GUozlw8VBJDEOAqSXwm1WvmYEZwqdqSGQshRocPDqrt4HBZB3fQ==", + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.29.7.tgz", + "integrity": "sha512-IY3ZD9Tmooqr3TUhc3DUWxiuo8xx1DWLhd5M7hQ+ZWJamqM2BbalrBJb2MisSLoYorOj75U03qULCxQTY9r3hg==", "dev": true, "license": "MIT", "dependencies": { - "@babel/helper-annotate-as-pure": "^7.25.9", - "@babel/helper-member-expression-to-functions": "^7.25.9", - "@babel/helper-optimise-call-expression": "^7.25.9", - "@babel/helper-replace-supers": "^7.25.9", - "@babel/helper-skip-transparent-expression-wrappers": "^7.25.9", - "@babel/traverse": "^7.25.9", + "@babel/helper-annotate-as-pure": "^7.29.7", + "@babel/helper-member-expression-to-functions": "^7.29.7", + "@babel/helper-optimise-call-expression": "^7.29.7", + "@babel/helper-replace-supers": "^7.29.7", + "@babel/helper-skip-transparent-expression-wrappers": "^7.29.7", + "@babel/traverse": "^7.29.7", "semver": "^6.3.1" }, "engines": { @@ -1616,99 +1007,54 @@ "@babel/core": "^7.0.0" } }, - "node_modules/@babel/helper-create-class-features-plugin/node_modules/semver": { - "version": "6.3.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", - "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", - "dev": true, - "license": "ISC", - "bin": { - "semver": "bin/semver.js" - } - }, - "node_modules/@babel/helper-create-regexp-features-plugin": { - "version": "7.26.3", - "resolved": "https://registry.npmjs.org/@babel/helper-create-regexp-features-plugin/-/helper-create-regexp-features-plugin-7.26.3.tgz", - "integrity": "sha512-G7ZRb40uUgdKOQqPLjfD12ZmGA54PzqDFUv2BKImnC9QIfGhIHKvVML0oN8IUiDq4iRqpq74ABpvOaerfWdong==", + "node_modules/@babel/helper-globals": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/helper-globals/-/helper-globals-7.29.7.tgz", + "integrity": "sha512-3nQVUAtvkKH9zahfWgw96Jc/uFOmjACE1kQz82E2lqWmHBgjzbNlsC22nuQTfahmWeQtTq5nQ/4Nnd2A1wj4zA==", "dev": true, "license": "MIT", - "dependencies": { - "@babel/helper-annotate-as-pure": "^7.25.9", - "regexpu-core": "^6.2.0", - "semver": "^6.3.1" - }, "engines": { "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0" - } - }, - "node_modules/@babel/helper-create-regexp-features-plugin/node_modules/semver": { - "version": "6.3.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", - "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", - "dev": true, - "license": "ISC", - "bin": { - "semver": "bin/semver.js" - } - }, - "node_modules/@babel/helper-define-polyfill-provider": { - "version": "0.6.3", - "resolved": "https://registry.npmjs.org/@babel/helper-define-polyfill-provider/-/helper-define-polyfill-provider-0.6.3.tgz", - "integrity": "sha512-HK7Bi+Hj6H+VTHA3ZvBis7V/6hu9QuTrnMXNybfUf2iiuU/N97I8VjB+KbhFF8Rld/Lx5MzoCwPCpPjfK+n8Cg==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/helper-compilation-targets": "^7.22.6", - "@babel/helper-plugin-utils": "^7.22.5", - "debug": "^4.1.1", - "lodash.debounce": "^4.0.8", - "resolve": "^1.14.2" - }, - "peerDependencies": { - "@babel/core": "^7.4.0 || ^8.0.0-0 <8.0.0" } }, "node_modules/@babel/helper-member-expression-to-functions": { - "version": "7.25.9", - "resolved": "https://registry.npmjs.org/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.25.9.tgz", - "integrity": "sha512-wbfdZ9w5vk0C0oyHqAJbc62+vet5prjj01jjJ8sKn3j9h3MQQlflEdXYvuqRWjHnM12coDEqiC1IRCi0U/EKwQ==", + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.29.7.tgz", + "integrity": "sha512-j+7JYmk1JYDtACIGj0QJqqWZjoUpMoEikQGADMaHgCMCSDqd2+P32rfcibUNrGOMWrlzK1WJBdxrB3JJQZwWtg==", "dev": true, "license": "MIT", "dependencies": { - "@babel/traverse": "^7.25.9", - "@babel/types": "^7.25.9" + "@babel/traverse": "^7.29.7", + "@babel/types": "^7.29.7" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-module-imports": { - "version": "7.25.9", - "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.25.9.tgz", - "integrity": "sha512-tnUA4RsrmflIM6W6RFTLFSXITtl0wKjgpnLgXyowocVPrbYrLUXSBXDgTs8BlbmIzIdlBySRQjINYs2BAkiLtw==", + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.29.7.tgz", + "integrity": "sha512-ejHwrQQYcm9xnTivShn2IDOlIzInN34AXskvq9QicvCtEzq1Vzclu/tKF8Jq1Cg8JG2GL6/EmjgsCT7lXepE3g==", "dev": true, "license": "MIT", "dependencies": { - "@babel/traverse": "^7.25.9", - "@babel/types": "^7.25.9" + "@babel/traverse": "^7.29.7", + "@babel/types": "^7.29.7" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-module-transforms": { - "version": "7.26.0", - "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.26.0.tgz", - "integrity": "sha512-xO+xu6B5K2czEnQye6BHA7DolFFmS3LB7stHZFaOLb1pAwO1HWLS8fXA+eh0A2yIvltPVmx3eNNDBJA2SLHXFw==", + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.29.7.tgz", + "integrity": "sha512-UPUVSyXbOh627KiCIGQSgwWzGeBKLkaJ9PJEdrngIwMSzxLR4jS4+f1f1jb7VzBbg8nFLaYotvVPFCTqdrmTAg==", "dev": true, "license": "MIT", "dependencies": { - "@babel/helper-module-imports": "^7.25.9", - "@babel/helper-validator-identifier": "^7.25.9", - "@babel/traverse": "^7.25.9" + "@babel/helper-module-imports": "^7.29.7", + "@babel/helper-validator-identifier": "^7.29.7", + "@babel/traverse": "^7.29.7" }, "engines": { "node": ">=6.9.0" @@ -1718,56 +1064,38 @@ } }, "node_modules/@babel/helper-optimise-call-expression": { - "version": "7.25.9", - "resolved": "https://registry.npmjs.org/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.25.9.tgz", - "integrity": "sha512-FIpuNaz5ow8VyrYcnXQTDRGvV6tTjkNtCK/RYNDXGSLlUD6cBuQTSw43CShGxjvfBTfcUA/r6UhUCbtYqkhcuQ==", + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.29.7.tgz", + "integrity": "sha512-+kmGVjcT9RGYzoDwdwEqEvGgKe3BYq+O1iGzjFubaNgZHwYHP6lsF2Yghf4kEuv9BV7tYDZ913aBW9am6YKong==", "dev": true, "license": "MIT", "dependencies": { - "@babel/types": "^7.25.9" + "@babel/types": "^7.29.7" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-plugin-utils": { - "version": "7.25.9", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.25.9.tgz", - "integrity": "sha512-kSMlyUVdWe25rEsRGviIgOWnoT/nfABVWlqt9N19/dIPWViAOW2s9wznP5tURbs/IDuNk4gPy3YdYRgH3uxhBw==", + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.29.7.tgz", + "integrity": "sha512-G7sHYigPY17oO5SYWnfD/0MTBwVR781S/JI643e/JhUYgVgWE/61SoW3NH9KWUKyKq5LVh3npif99Wkt6j86Jw==", "dev": true, "license": "MIT", "engines": { "node": ">=6.9.0" } }, - "node_modules/@babel/helper-remap-async-to-generator": { - "version": "7.25.9", - "resolved": "https://registry.npmjs.org/@babel/helper-remap-async-to-generator/-/helper-remap-async-to-generator-7.25.9.tgz", - "integrity": "sha512-IZtukuUeBbhgOcaW2s06OXTzVNJR0ybm4W5xC1opWFFJMZbwRj5LCk+ByYH7WdZPZTt8KnFwA8pvjN2yqcPlgw==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/helper-annotate-as-pure": "^7.25.9", - "@babel/helper-wrap-function": "^7.25.9", - "@babel/traverse": "^7.25.9" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0" - } - }, "node_modules/@babel/helper-replace-supers": { - "version": "7.25.9", - "resolved": "https://registry.npmjs.org/@babel/helper-replace-supers/-/helper-replace-supers-7.25.9.tgz", - "integrity": "sha512-IiDqTOTBQy0sWyeXyGSC5TBJpGFXBkRynjBeXsvbhQFKj2viwJC76Epz35YLU1fpe/Am6Vppb7W7zM4fPQzLsQ==", + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/helper-replace-supers/-/helper-replace-supers-7.29.7.tgz", + "integrity": "sha512-atfGXWSeCiF4DnKZIfmJfQRkSw9b9gNNXR1kqKjbhG4pGYCOnkp8OcTB8E3NXjBu8NpheSnOeNKz8KT7UNFTmQ==", "dev": true, "license": "MIT", "dependencies": { - "@babel/helper-member-expression-to-functions": "^7.25.9", - "@babel/helper-optimise-call-expression": "^7.25.9", - "@babel/traverse": "^7.25.9" + "@babel/helper-member-expression-to-functions": "^7.29.7", + "@babel/helper-optimise-call-expression": "^7.29.7", + "@babel/traverse": "^7.29.7" }, "engines": { "node": ">=6.9.0" @@ -1777,83 +1105,69 @@ } }, "node_modules/@babel/helper-skip-transparent-expression-wrappers": { - "version": "7.25.9", - "resolved": "https://registry.npmjs.org/@babel/helper-skip-transparent-expression-wrappers/-/helper-skip-transparent-expression-wrappers-7.25.9.tgz", - "integrity": "sha512-K4Du3BFa3gvyhzgPcntrkDgZzQaq6uozzcpGbOO1OEJaI+EJdqWIMTLgFgQf6lrfiDFo5FU+BxKepI9RmZqahA==", + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/helper-skip-transparent-expression-wrappers/-/helper-skip-transparent-expression-wrappers-7.29.7.tgz", + "integrity": "sha512-brcMGQaVzIeUb+6/bs1Av0f8YuNNjKY2JyvfRCsFuFsdKccEQ5Ges2y74D74NZ1Rz8lKJ9ksJkfqwQFJ/iNEyQ==", "dev": true, "license": "MIT", "dependencies": { - "@babel/traverse": "^7.25.9", - "@babel/types": "^7.25.9" + "@babel/traverse": "^7.29.7", + "@babel/types": "^7.29.7" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-string-parser": { - "version": "7.25.9", - "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.25.9.tgz", - "integrity": "sha512-4A/SCr/2KLd5jrtOMFzaKjVtAei3+2r/NChoBNoZ3EyP/+GlhoaEGoWOZUmFmoITP7zOJyHIMm+DYRd8o3PvHA==", + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.29.7.tgz", + "integrity": "sha512-Pb5ijPrZ89GDH8223L4UP8i6QApWxs04RbPQJTeWDV0/keR2E36MeKnyr6LYmUUvqRRI+Iv87SuF1W6ErINzYw==", "license": "MIT", "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-validator-identifier": { - "version": "7.25.9", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.25.9.tgz", - "integrity": "sha512-Ed61U6XJc3CVRfkERJWDz4dJwKe7iLmmJsbOGu9wSloNSFttHV0I8g6UAgb7qnK5ly5bGLPd4oXZlxCdANBOWQ==", + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.29.7.tgz", + "integrity": "sha512-qehxGkRj55h/ff8EMaJ+cYhyaKlHIxqYDn682wQD7RNp9UujOQsHog2uS0r2vzr4pW+sXf90NeeayjcNaX3fFg==", "license": "MIT", "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-validator-option": { - "version": "7.25.9", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.25.9.tgz", - "integrity": "sha512-e/zv1co8pp55dNdEcCynfj9X7nyUKUXoUEwfXqaZt0omVOmDe9oOTdKStH4GmAw6zxMFs50ZayuMfHDKlO7Tfw==", + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.29.7.tgz", + "integrity": "sha512-N9ZErrD+yW5geCDtBqnOoxmR8+tNKiGuxKlDpuJxfsqpa2dFcexaziGAE/qoHLiDDreVNMupxGmSoNlyvsA3gw==", "dev": true, "license": "MIT", "engines": { "node": ">=6.9.0" } }, - "node_modules/@babel/helper-wrap-function": { - "version": "7.25.9", - "resolved": "https://registry.npmjs.org/@babel/helper-wrap-function/-/helper-wrap-function-7.25.9.tgz", - "integrity": "sha512-ETzz9UTjQSTmw39GboatdymDq4XIQbR8ySgVrylRhPOFpsd+JrKHIuF0de7GCWmem+T4uC5z7EZguod7Wj4A4g==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/template": "^7.25.9", - "@babel/traverse": "^7.25.9", - "@babel/types": "^7.25.9" - }, - "engines": { - "node": ">=6.9.0" - } - }, "node_modules/@babel/helpers": { - "version": "7.26.0", - "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.26.0.tgz", - "integrity": "sha512-tbhNuIxNcVb21pInl3ZSjksLCvgdZy9KwJ8brv993QtIVKJBBkYXz4q4ZbAv31GdnC+R90np23L5FbEBlthAEw==", + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.29.7.tgz", + "integrity": "sha512-1k2lAGRMfHTcwuNYcCNUmaUffmQv8KWMfh2iJUUeRlwlwH4FdNG7mfPI10NPfLHJFThE4Tyr4mv7kTNZOiPuBg==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { - "@babel/template": "^7.25.9", - "@babel/types": "^7.26.0" + "@babel/template": "^7.29.7", + "@babel/types": "^7.29.7" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/parser": { - "version": "7.26.3", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.26.3.tgz", - "integrity": "sha512-WJ/CvmY8Mea8iDXo6a7RK2wbmJITT5fN3BEkRuFlxVyNx8jOKIIhmC4fSkTcPcf8JyavbBwIe6OpiCOBXt/IcA==", + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.29.7.tgz", + "integrity": "sha512-hnORnjP/1P/zFEndoeX+n+t1RwWRJiJpM/jO7FW32Kn9r5+sJB2JWOdYo4L6k78j15eCwY3Gm/7364B1EMwtNg==", "license": "MIT", "dependencies": { - "@babel/types": "^7.26.3" + "@babel/types": "^7.29.7" }, "bin": { "parser": "bin/babel-parser.js" @@ -1862,195 +1176,14 @@ "node": ">=6.0.0" } }, - "node_modules/@babel/plugin-bugfix-firefox-class-in-computed-class-key": { - "version": "7.25.9", - "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-firefox-class-in-computed-class-key/-/plugin-bugfix-firefox-class-in-computed-class-key-7.25.9.tgz", - "integrity": "sha512-ZkRyVkThtxQ/J6nv3JFYv1RYY+JT5BvU0y3k5bWrmuG4woXypRa4PXmm9RhOwodRkYFWqC0C0cqcJ4OqR7kW+g==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/helper-plugin-utils": "^7.25.9", - "@babel/traverse": "^7.25.9" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0" - } - }, - "node_modules/@babel/plugin-bugfix-safari-class-field-initializer-scope": { - "version": "7.25.9", - "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-safari-class-field-initializer-scope/-/plugin-bugfix-safari-class-field-initializer-scope-7.25.9.tgz", - "integrity": "sha512-MrGRLZxLD/Zjj0gdU15dfs+HH/OXvnw/U4jJD8vpcP2CJQapPEv1IWwjc/qMg7ItBlPwSv1hRBbb7LeuANdcnw==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/helper-plugin-utils": "^7.25.9" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0" - } - }, - "node_modules/@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression": { - "version": "7.25.9", - "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression/-/plugin-bugfix-safari-id-destructuring-collision-in-function-expression-7.25.9.tgz", - "integrity": "sha512-2qUwwfAFpJLZqxd02YW9btUCZHl+RFvdDkNfZwaIJrvB8Tesjsk8pEQkTvGwZXLqXUx/2oyY3ySRhm6HOXuCug==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/helper-plugin-utils": "^7.25.9" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0" - } - }, - "node_modules/@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining": { - "version": "7.25.9", - "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining/-/plugin-bugfix-v8-spread-parameters-in-optional-chaining-7.25.9.tgz", - "integrity": "sha512-6xWgLZTJXwilVjlnV7ospI3xi+sl8lN8rXXbBD6vYn3UYDlGsag8wrZkKcSI8G6KgqKP7vNFaDgeDnfAABq61g==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/helper-plugin-utils": "^7.25.9", - "@babel/helper-skip-transparent-expression-wrappers": "^7.25.9", - "@babel/plugin-transform-optional-chaining": "^7.25.9" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.13.0" - } - }, - "node_modules/@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly": { - "version": "7.25.9", - "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly/-/plugin-bugfix-v8-static-class-fields-redefine-readonly-7.25.9.tgz", - "integrity": "sha512-aLnMXYPnzwwqhYSCyXfKkIkYgJ8zv9RK+roo9DkTXz38ynIhd9XCbN08s3MGvqL2MYGVUGdRQLL/JqBIeJhJBg==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/helper-plugin-utils": "^7.25.9", - "@babel/traverse": "^7.25.9" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0" - } - }, - "node_modules/@babel/plugin-proposal-class-properties": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-class-properties/-/plugin-proposal-class-properties-7.18.6.tgz", - "integrity": "sha512-cumfXOF0+nzZrrN8Rf0t7M+tF6sZc7vhQwYQck9q1/5w2OExlD+b4v4RpMJFaV1Z7WcDRgO6FqvxqxGlwo+RHQ==", - "deprecated": "This proposal has been merged to the ECMAScript standard and thus this plugin is no longer maintained. Please use @babel/plugin-transform-class-properties instead.", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/helper-create-class-features-plugin": "^7.18.6", - "@babel/helper-plugin-utils": "^7.18.6" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-proposal-decorators": { - "version": "7.25.9", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-decorators/-/plugin-proposal-decorators-7.25.9.tgz", - "integrity": "sha512-smkNLL/O1ezy9Nhy4CNosc4Va+1wo5w4gzSZeLe6y6dM4mmHfYOCPolXQPHQxonZCF+ZyebxN9vqOolkYrSn5g==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/helper-create-class-features-plugin": "^7.25.9", - "@babel/helper-plugin-utils": "^7.25.9", - "@babel/plugin-syntax-decorators": "^7.25.9" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-proposal-private-property-in-object": { - "version": "7.21.0-placeholder-for-preset-env.2", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-private-property-in-object/-/plugin-proposal-private-property-in-object-7.21.0-placeholder-for-preset-env.2.tgz", - "integrity": "sha512-SOSkfJDddaM7mak6cPEpswyTRnuRltl429hMraQEglW+OkovnCzsiszTmsrlY//qLFjCpQDFRvjdm2wA5pPm9w==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-syntax-decorators": { - "version": "7.25.9", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-decorators/-/plugin-syntax-decorators-7.25.9.tgz", - "integrity": "sha512-ryzI0McXUPJnRCvMo4lumIKZUzhYUO/ScI+Mz4YVaTLt04DHNSjEUjKVvbzQjZFLuod/cYEc07mJWhzl6v4DPg==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/helper-plugin-utils": "^7.25.9" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-syntax-import-assertions": { - "version": "7.26.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-assertions/-/plugin-syntax-import-assertions-7.26.0.tgz", - "integrity": "sha512-QCWT5Hh830hK5EQa7XzuqIkQU9tT/whqbDz7kuaZMHFl1inRRg7JnuAEOQ0Ur0QUl0NufCk1msK2BeY79Aj/eg==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/helper-plugin-utils": "^7.25.9" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-syntax-import-attributes": { - "version": "7.26.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-attributes/-/plugin-syntax-import-attributes-7.26.0.tgz", - "integrity": "sha512-e2dttdsJ1ZTpi3B9UYGLw41hifAubg19AtCu/2I/F1QNVclOBr1dYpTdmdyZ84Xiz43BS/tCUkMAZNLv12Pi+A==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/helper-plugin-utils": "^7.25.9" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, "node_modules/@babel/plugin-syntax-jsx": { - "version": "7.25.9", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.25.9.tgz", - "integrity": "sha512-ld6oezHQMZsZfp6pWtbjaNDF2tiiCYYDqQszHt5VV437lewP9aSi2Of99CK0D0XB21k7FLgnLcmQKyKzynfeAA==", + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.29.7.tgz", + "integrity": "sha512-TSu8+mHCoEaaCDEZ0I3+6mvTBYR4PCxQwf2z9/r5Tbztv6NaLR3B9thGTTxX2WGuGHJqRiAbKPeGTJ5XWXVg6A==", "dev": true, "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.25.9" + "@babel/helper-plugin-utils": "^7.29.7" }, "engines": { "node": ">=6.9.0" @@ -2060,416 +1193,13 @@ } }, "node_modules/@babel/plugin-syntax-typescript": { - "version": "7.25.9", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-typescript/-/plugin-syntax-typescript-7.25.9.tgz", - "integrity": "sha512-hjMgRy5hb8uJJjUcdWunWVcoi9bGpJp8p5Ol1229PoN6aytsLwNMgmdftO23wnCLMfVmTwZDWMPNq/D1SY60JQ==", + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-typescript/-/plugin-syntax-typescript-7.29.7.tgz", + "integrity": "sha512-ngr+82Sh0xMz25TPCZi+nC2iTzjfCdWS2ONXTp/PtSCHCgaCNBpdMqgvJ2ccdLlClVZ7sisIgB914j/JFe+RZA==", "dev": true, "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.25.9" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-syntax-unicode-sets-regex": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-unicode-sets-regex/-/plugin-syntax-unicode-sets-regex-7.18.6.tgz", - "integrity": "sha512-727YkEAPwSIQTv5im8QHz3upqp92JTWhidIC81Tdx4VJYIte/VndKf1qKrfnnhPLiPghStWfvC/iFaMCQu7Nqg==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/helper-create-regexp-features-plugin": "^7.18.6", - "@babel/helper-plugin-utils": "^7.18.6" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0" - } - }, - "node_modules/@babel/plugin-transform-arrow-functions": { - "version": "7.25.9", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-arrow-functions/-/plugin-transform-arrow-functions-7.25.9.tgz", - "integrity": "sha512-6jmooXYIwn9ca5/RylZADJ+EnSxVUS5sjeJ9UPk6RWRzXCmOJCy6dqItPJFpw2cuCangPK4OYr5uhGKcmrm5Qg==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/helper-plugin-utils": "^7.25.9" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-async-generator-functions": { - "version": "7.25.9", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-async-generator-functions/-/plugin-transform-async-generator-functions-7.25.9.tgz", - "integrity": "sha512-RXV6QAzTBbhDMO9fWwOmwwTuYaiPbggWQ9INdZqAYeSHyG7FzQ+nOZaUUjNwKv9pV3aE4WFqFm1Hnbci5tBCAw==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/helper-plugin-utils": "^7.25.9", - "@babel/helper-remap-async-to-generator": "^7.25.9", - "@babel/traverse": "^7.25.9" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-async-to-generator": { - "version": "7.25.9", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-async-to-generator/-/plugin-transform-async-to-generator-7.25.9.tgz", - "integrity": "sha512-NT7Ejn7Z/LjUH0Gv5KsBCxh7BH3fbLTV0ptHvpeMvrt3cPThHfJfst9Wrb7S8EvJ7vRTFI7z+VAvFVEQn/m5zQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/helper-module-imports": "^7.25.9", - "@babel/helper-plugin-utils": "^7.25.9", - "@babel/helper-remap-async-to-generator": "^7.25.9" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-block-scoped-functions": { - "version": "7.25.9", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoped-functions/-/plugin-transform-block-scoped-functions-7.25.9.tgz", - "integrity": "sha512-toHc9fzab0ZfenFpsyYinOX0J/5dgJVA2fm64xPewu7CoYHWEivIWKxkK2rMi4r3yQqLnVmheMXRdG+k239CgA==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/helper-plugin-utils": "^7.25.9" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-block-scoping": { - "version": "7.25.9", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.25.9.tgz", - "integrity": "sha512-1F05O7AYjymAtqbsFETboN1NvBdcnzMerO+zlMyJBEz6WkMdejvGWw9p05iTSjC85RLlBseHHQpYaM4gzJkBGg==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/helper-plugin-utils": "^7.25.9" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-class-properties": { - "version": "7.25.9", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-class-properties/-/plugin-transform-class-properties-7.25.9.tgz", - "integrity": "sha512-bbMAII8GRSkcd0h0b4X+36GksxuheLFjP65ul9w6C3KgAamI3JqErNgSrosX6ZPj+Mpim5VvEbawXxJCyEUV3Q==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/helper-create-class-features-plugin": "^7.25.9", - "@babel/helper-plugin-utils": "^7.25.9" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-class-static-block": { - "version": "7.26.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-class-static-block/-/plugin-transform-class-static-block-7.26.0.tgz", - "integrity": "sha512-6J2APTs7BDDm+UMqP1useWqhcRAXo0WIoVj26N7kPFB6S73Lgvyka4KTZYIxtgYXiN5HTyRObA72N2iu628iTQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/helper-create-class-features-plugin": "^7.25.9", - "@babel/helper-plugin-utils": "^7.25.9" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.12.0" - } - }, - "node_modules/@babel/plugin-transform-classes": { - "version": "7.25.9", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-classes/-/plugin-transform-classes-7.25.9.tgz", - "integrity": "sha512-mD8APIXmseE7oZvZgGABDyM34GUmK45Um2TXiBUt7PnuAxrgoSVf123qUzPxEr/+/BHrRn5NMZCdE2m/1F8DGg==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/helper-annotate-as-pure": "^7.25.9", - "@babel/helper-compilation-targets": "^7.25.9", - "@babel/helper-plugin-utils": "^7.25.9", - "@babel/helper-replace-supers": "^7.25.9", - "@babel/traverse": "^7.25.9", - "globals": "^11.1.0" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-computed-properties": { - "version": "7.25.9", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-computed-properties/-/plugin-transform-computed-properties-7.25.9.tgz", - "integrity": "sha512-HnBegGqXZR12xbcTHlJ9HGxw1OniltT26J5YpfruGqtUHlz/xKf/G2ak9e+t0rVqrjXa9WOhvYPz1ERfMj23AA==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/helper-plugin-utils": "^7.25.9", - "@babel/template": "^7.25.9" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-destructuring": { - "version": "7.25.9", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.25.9.tgz", - "integrity": "sha512-WkCGb/3ZxXepmMiX101nnGiU+1CAdut8oHyEOHxkKuS1qKpU2SMXE2uSvfz8PBuLd49V6LEsbtyPhWC7fnkgvQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/helper-plugin-utils": "^7.25.9" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-dotall-regex": { - "version": "7.25.9", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-dotall-regex/-/plugin-transform-dotall-regex-7.25.9.tgz", - "integrity": "sha512-t7ZQ7g5trIgSRYhI9pIJtRl64KHotutUJsh4Eze5l7olJv+mRSg4/MmbZ0tv1eeqRbdvo/+trvJD/Oc5DmW2cA==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/helper-create-regexp-features-plugin": "^7.25.9", - "@babel/helper-plugin-utils": "^7.25.9" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-duplicate-keys": { - "version": "7.25.9", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-duplicate-keys/-/plugin-transform-duplicate-keys-7.25.9.tgz", - "integrity": "sha512-LZxhJ6dvBb/f3x8xwWIuyiAHy56nrRG3PeYTpBkkzkYRRQ6tJLu68lEF5VIqMUZiAV7a8+Tb78nEoMCMcqjXBw==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/helper-plugin-utils": "^7.25.9" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-duplicate-named-capturing-groups-regex": { - "version": "7.25.9", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-duplicate-named-capturing-groups-regex/-/plugin-transform-duplicate-named-capturing-groups-regex-7.25.9.tgz", - "integrity": "sha512-0UfuJS0EsXbRvKnwcLjFtJy/Sxc5J5jhLHnFhy7u4zih97Hz6tJkLU+O+FMMrNZrosUPxDi6sYxJ/EA8jDiAog==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/helper-create-regexp-features-plugin": "^7.25.9", - "@babel/helper-plugin-utils": "^7.25.9" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0" - } - }, - "node_modules/@babel/plugin-transform-dynamic-import": { - "version": "7.25.9", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-dynamic-import/-/plugin-transform-dynamic-import-7.25.9.tgz", - "integrity": "sha512-GCggjexbmSLaFhqsojeugBpeaRIgWNTcgKVq/0qIteFEqY2A+b9QidYadrWlnbWQUrW5fn+mCvf3tr7OeBFTyg==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/helper-plugin-utils": "^7.25.9" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-exponentiation-operator": { - "version": "7.26.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-exponentiation-operator/-/plugin-transform-exponentiation-operator-7.26.3.tgz", - "integrity": "sha512-7CAHcQ58z2chuXPWblnn1K6rLDnDWieghSOEmqQsrBenH0P9InCUtOJYD89pvngljmZlJcz3fcmgYsXFNGa1ZQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/helper-plugin-utils": "^7.25.9" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-export-namespace-from": { - "version": "7.25.9", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-export-namespace-from/-/plugin-transform-export-namespace-from-7.25.9.tgz", - "integrity": "sha512-2NsEz+CxzJIVOPx2o9UsW1rXLqtChtLoVnwYHHiB04wS5sgn7mrV45fWMBX0Kk+ub9uXytVYfNP2HjbVbCB3Ww==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/helper-plugin-utils": "^7.25.9" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-for-of": { - "version": "7.25.9", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-for-of/-/plugin-transform-for-of-7.25.9.tgz", - "integrity": "sha512-LqHxduHoaGELJl2uhImHwRQudhCM50pT46rIBNvtT/Oql3nqiS3wOwP+5ten7NpYSXrrVLgtZU3DZmPtWZo16A==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/helper-plugin-utils": "^7.25.9", - "@babel/helper-skip-transparent-expression-wrappers": "^7.25.9" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-function-name": { - "version": "7.25.9", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-function-name/-/plugin-transform-function-name-7.25.9.tgz", - "integrity": "sha512-8lP+Yxjv14Vc5MuWBpJsoUCd3hD6V9DgBon2FVYL4jJgbnVQ9fTgYmonchzZJOVNgzEgbxp4OwAf6xz6M/14XA==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/helper-compilation-targets": "^7.25.9", - "@babel/helper-plugin-utils": "^7.25.9", - "@babel/traverse": "^7.25.9" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-json-strings": { - "version": "7.25.9", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-json-strings/-/plugin-transform-json-strings-7.25.9.tgz", - "integrity": "sha512-xoTMk0WXceiiIvsaquQQUaLLXSW1KJ159KP87VilruQm0LNNGxWzahxSS6T6i4Zg3ezp4vA4zuwiNUR53qmQAw==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/helper-plugin-utils": "^7.25.9" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-literals": { - "version": "7.25.9", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-literals/-/plugin-transform-literals-7.25.9.tgz", - "integrity": "sha512-9N7+2lFziW8W9pBl2TzaNht3+pgMIRP74zizeCSrtnSKVdUl8mAjjOP2OOVQAfZ881P2cNjDj1uAMEdeD50nuQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/helper-plugin-utils": "^7.25.9" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-logical-assignment-operators": { - "version": "7.25.9", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-logical-assignment-operators/-/plugin-transform-logical-assignment-operators-7.25.9.tgz", - "integrity": "sha512-wI4wRAzGko551Y8eVf6iOY9EouIDTtPb0ByZx+ktDGHwv6bHFimrgJM/2T021txPZ2s4c7bqvHbd+vXG6K948Q==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/helper-plugin-utils": "^7.25.9" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-member-expression-literals": { - "version": "7.25.9", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-member-expression-literals/-/plugin-transform-member-expression-literals-7.25.9.tgz", - "integrity": "sha512-PYazBVfofCQkkMzh2P6IdIUaCEWni3iYEerAsRWuVd8+jlM1S9S9cz1dF9hIzyoZ8IA3+OwVYIp9v9e+GbgZhA==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/helper-plugin-utils": "^7.25.9" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-modules-amd": { - "version": "7.25.9", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-amd/-/plugin-transform-modules-amd-7.25.9.tgz", - "integrity": "sha512-g5T11tnI36jVClQlMlt4qKDLlWnG5pP9CSM4GhdRciTNMRgkfpo5cR6b4rGIOYPgRRuFAvwjPQ/Yk+ql4dyhbw==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/helper-module-transforms": "^7.25.9", - "@babel/helper-plugin-utils": "^7.25.9" + "@babel/helper-plugin-utils": "^7.29.7" }, "engines": { "node": ">=6.9.0" @@ -2479,412 +1209,14 @@ } }, "node_modules/@babel/plugin-transform-modules-commonjs": { - "version": "7.26.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.26.3.tgz", - "integrity": "sha512-MgR55l4q9KddUDITEzEFYn5ZsGDXMSsU9E+kh7fjRXTIC3RHqfCo8RPRbyReYJh44HQ/yomFkqbOFohXvDCiIQ==", + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.29.7.tgz", + "integrity": "sha512-j0vCldybPC5b5dwCQOJ21uKtHzt7hxLygJTg9eF1ScfaikEDNfzn94XoW5Fi+seBR0nCyL23xaBFFkq7dTM8XQ==", "dev": true, "license": "MIT", "dependencies": { - "@babel/helper-module-transforms": "^7.26.0", - "@babel/helper-plugin-utils": "^7.25.9" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-modules-systemjs": { - "version": "7.25.9", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.25.9.tgz", - "integrity": "sha512-hyss7iIlH/zLHaehT+xwiymtPOpsiwIIRlCAOwBB04ta5Tt+lNItADdlXw3jAWZ96VJ2jlhl/c+PNIQPKNfvcA==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/helper-module-transforms": "^7.25.9", - "@babel/helper-plugin-utils": "^7.25.9", - "@babel/helper-validator-identifier": "^7.25.9", - "@babel/traverse": "^7.25.9" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-modules-umd": { - "version": "7.25.9", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-umd/-/plugin-transform-modules-umd-7.25.9.tgz", - "integrity": "sha512-bS9MVObUgE7ww36HEfwe6g9WakQ0KF07mQF74uuXdkoziUPfKyu/nIm663kz//e5O1nPInPFx36z7WJmJ4yNEw==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/helper-module-transforms": "^7.25.9", - "@babel/helper-plugin-utils": "^7.25.9" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-named-capturing-groups-regex": { - "version": "7.25.9", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-named-capturing-groups-regex/-/plugin-transform-named-capturing-groups-regex-7.25.9.tgz", - "integrity": "sha512-oqB6WHdKTGl3q/ItQhpLSnWWOpjUJLsOCLVyeFgeTktkBSCiurvPOsyt93gibI9CmuKvTUEtWmG5VhZD+5T/KA==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/helper-create-regexp-features-plugin": "^7.25.9", - "@babel/helper-plugin-utils": "^7.25.9" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0" - } - }, - "node_modules/@babel/plugin-transform-new-target": { - "version": "7.25.9", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-new-target/-/plugin-transform-new-target-7.25.9.tgz", - "integrity": "sha512-U/3p8X1yCSoKyUj2eOBIx3FOn6pElFOKvAAGf8HTtItuPyB+ZeOqfn+mvTtg9ZlOAjsPdK3ayQEjqHjU/yLeVQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/helper-plugin-utils": "^7.25.9" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-nullish-coalescing-operator": { - "version": "7.25.9", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-nullish-coalescing-operator/-/plugin-transform-nullish-coalescing-operator-7.25.9.tgz", - "integrity": "sha512-ENfftpLZw5EItALAD4WsY/KUWvhUlZndm5GC7G3evUsVeSJB6p0pBeLQUnRnBCBx7zV0RKQjR9kCuwrsIrjWog==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/helper-plugin-utils": "^7.25.9" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-numeric-separator": { - "version": "7.25.9", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-numeric-separator/-/plugin-transform-numeric-separator-7.25.9.tgz", - "integrity": "sha512-TlprrJ1GBZ3r6s96Yq8gEQv82s8/5HnCVHtEJScUj90thHQbwe+E5MLhi2bbNHBEJuzrvltXSru+BUxHDoog7Q==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/helper-plugin-utils": "^7.25.9" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-object-rest-spread": { - "version": "7.25.9", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-object-rest-spread/-/plugin-transform-object-rest-spread-7.25.9.tgz", - "integrity": "sha512-fSaXafEE9CVHPweLYw4J0emp1t8zYTXyzN3UuG+lylqkvYd7RMrsOQ8TYx5RF231be0vqtFC6jnx3UmpJmKBYg==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/helper-compilation-targets": "^7.25.9", - "@babel/helper-plugin-utils": "^7.25.9", - "@babel/plugin-transform-parameters": "^7.25.9" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-object-super": { - "version": "7.25.9", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-object-super/-/plugin-transform-object-super-7.25.9.tgz", - "integrity": "sha512-Kj/Gh+Rw2RNLbCK1VAWj2U48yxxqL2x0k10nPtSdRa0O2xnHXalD0s+o1A6a0W43gJ00ANo38jxkQreckOzv5A==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/helper-plugin-utils": "^7.25.9", - "@babel/helper-replace-supers": "^7.25.9" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-optional-catch-binding": { - "version": "7.25.9", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-optional-catch-binding/-/plugin-transform-optional-catch-binding-7.25.9.tgz", - "integrity": "sha512-qM/6m6hQZzDcZF3onzIhZeDHDO43bkNNlOX0i8n3lR6zLbu0GN2d8qfM/IERJZYauhAHSLHy39NF0Ctdvcid7g==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/helper-plugin-utils": "^7.25.9" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-optional-chaining": { - "version": "7.25.9", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-optional-chaining/-/plugin-transform-optional-chaining-7.25.9.tgz", - "integrity": "sha512-6AvV0FsLULbpnXeBjrY4dmWF8F7gf8QnvTEoO/wX/5xm/xE1Xo8oPuD3MPS+KS9f9XBEAWN7X1aWr4z9HdOr7A==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/helper-plugin-utils": "^7.25.9", - "@babel/helper-skip-transparent-expression-wrappers": "^7.25.9" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-parameters": { - "version": "7.25.9", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.25.9.tgz", - "integrity": "sha512-wzz6MKwpnshBAiRmn4jR8LYz/g8Ksg0o80XmwZDlordjwEk9SxBzTWC7F5ef1jhbrbOW2DJ5J6ayRukrJmnr0g==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/helper-plugin-utils": "^7.25.9" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-private-methods": { - "version": "7.25.9", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-private-methods/-/plugin-transform-private-methods-7.25.9.tgz", - "integrity": "sha512-D/JUozNpQLAPUVusvqMxyvjzllRaF8/nSrP1s2YGQT/W4LHK4xxsMcHjhOGTS01mp9Hda8nswb+FblLdJornQw==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/helper-create-class-features-plugin": "^7.25.9", - "@babel/helper-plugin-utils": "^7.25.9" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-private-property-in-object": { - "version": "7.25.9", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-private-property-in-object/-/plugin-transform-private-property-in-object-7.25.9.tgz", - "integrity": "sha512-Evf3kcMqzXA3xfYJmZ9Pg1OvKdtqsDMSWBDzZOPLvHiTt36E75jLDQo5w1gtRU95Q4E5PDttrTf25Fw8d/uWLw==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/helper-annotate-as-pure": "^7.25.9", - "@babel/helper-create-class-features-plugin": "^7.25.9", - "@babel/helper-plugin-utils": "^7.25.9" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-property-literals": { - "version": "7.25.9", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-property-literals/-/plugin-transform-property-literals-7.25.9.tgz", - "integrity": "sha512-IvIUeV5KrS/VPavfSM/Iu+RE6llrHrYIKY1yfCzyO/lMXHQ+p7uGhonmGVisv6tSBSVgWzMBohTcvkC9vQcQFA==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/helper-plugin-utils": "^7.25.9" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-regenerator": { - "version": "7.25.9", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-regenerator/-/plugin-transform-regenerator-7.25.9.tgz", - "integrity": "sha512-vwDcDNsgMPDGP0nMqzahDWE5/MLcX8sv96+wfX7as7LoF/kr97Bo/7fI00lXY4wUXYfVmwIIyG80fGZ1uvt2qg==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/helper-plugin-utils": "^7.25.9", - "regenerator-transform": "^0.15.2" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-regexp-modifiers": { - "version": "7.26.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-regexp-modifiers/-/plugin-transform-regexp-modifiers-7.26.0.tgz", - "integrity": "sha512-vN6saax7lrA2yA/Pak3sCxuD6F5InBjn9IcrIKQPjpsLvuHYLVroTxjdlVRHjjBWxKOqIwpTXDkOssYT4BFdRw==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/helper-create-regexp-features-plugin": "^7.25.9", - "@babel/helper-plugin-utils": "^7.25.9" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0" - } - }, - "node_modules/@babel/plugin-transform-reserved-words": { - "version": "7.25.9", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-reserved-words/-/plugin-transform-reserved-words-7.25.9.tgz", - "integrity": "sha512-7DL7DKYjn5Su++4RXu8puKZm2XBPHyjWLUidaPEkCUBbE7IPcsrkRHggAOOKydH1dASWdcUBxrkOGNxUv5P3Jg==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/helper-plugin-utils": "^7.25.9" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-runtime": { - "version": "7.25.9", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-runtime/-/plugin-transform-runtime-7.25.9.tgz", - "integrity": "sha512-nZp7GlEl+yULJrClz0SwHPqir3lc0zsPrDHQUcxGspSL7AKrexNSEfTbfqnDNJUO13bgKyfuOLMF8Xqtu8j3YQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/helper-module-imports": "^7.25.9", - "@babel/helper-plugin-utils": "^7.25.9", - "babel-plugin-polyfill-corejs2": "^0.4.10", - "babel-plugin-polyfill-corejs3": "^0.10.6", - "babel-plugin-polyfill-regenerator": "^0.6.1", - "semver": "^6.3.1" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-runtime/node_modules/semver": { - "version": "6.3.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", - "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", - "dev": true, - "license": "ISC", - "bin": { - "semver": "bin/semver.js" - } - }, - "node_modules/@babel/plugin-transform-shorthand-properties": { - "version": "7.25.9", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-shorthand-properties/-/plugin-transform-shorthand-properties-7.25.9.tgz", - "integrity": "sha512-MUv6t0FhO5qHnS/W8XCbHmiRWOphNufpE1IVxhK5kuN3Td9FT1x4rx4K42s3RYdMXCXpfWkGSbCSd0Z64xA7Ng==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/helper-plugin-utils": "^7.25.9" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-spread": { - "version": "7.25.9", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-spread/-/plugin-transform-spread-7.25.9.tgz", - "integrity": "sha512-oNknIB0TbURU5pqJFVbOOFspVlrpVwo2H1+HUIsVDvp5VauGGDP1ZEvO8Nn5xyMEs3dakajOxlmkNW7kNgSm6A==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/helper-plugin-utils": "^7.25.9", - "@babel/helper-skip-transparent-expression-wrappers": "^7.25.9" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-sticky-regex": { - "version": "7.25.9", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-sticky-regex/-/plugin-transform-sticky-regex-7.25.9.tgz", - "integrity": "sha512-WqBUSgeVwucYDP9U/xNRQam7xV8W5Zf+6Eo7T2SRVUFlhRiMNFdFz58u0KZmCVVqs2i7SHgpRnAhzRNmKfi2uA==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/helper-plugin-utils": "^7.25.9" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-template-literals": { - "version": "7.25.9", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-template-literals/-/plugin-transform-template-literals-7.25.9.tgz", - "integrity": "sha512-o97AE4syN71M/lxrCtQByzphAdlYluKPDBzDVzMmfCobUjjhAryZV0AIpRPrxN0eAkxXO6ZLEScmt+PNhj2OTw==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/helper-plugin-utils": "^7.25.9" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-typeof-symbol": { - "version": "7.25.9", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-typeof-symbol/-/plugin-transform-typeof-symbol-7.25.9.tgz", - "integrity": "sha512-v61XqUMiueJROUv66BVIOi0Fv/CUuZuZMl5NkRoCVxLAnMexZ0A3kMe7vvZ0nulxMuMp0Mk6S5hNh48yki08ZA==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/helper-plugin-utils": "^7.25.9" + "@babel/helper-module-transforms": "^7.29.7", + "@babel/helper-plugin-utils": "^7.29.7" }, "engines": { "node": ">=6.9.0" @@ -2894,17 +1226,17 @@ } }, "node_modules/@babel/plugin-transform-typescript": { - "version": "7.26.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-typescript/-/plugin-transform-typescript-7.26.3.tgz", - "integrity": "sha512-6+5hpdr6mETwSKjmJUdYw0EIkATiQhnELWlE3kJFBwSg/BGIVwVaVbX+gOXBCdc7Ln1RXZxyWGecIXhUfnl7oA==", + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-typescript/-/plugin-transform-typescript-7.29.7.tgz", + "integrity": "sha512-jK52h8LaLc7JarhQV2ofeFMts4H7vnOXnqZNA6fYglBTZewRBE51KWt3BUltW1P+KoPsYkHoJeXePuz4zo2LMw==", "dev": true, "license": "MIT", "dependencies": { - "@babel/helper-annotate-as-pure": "^7.25.9", - "@babel/helper-create-class-features-plugin": "^7.25.9", - "@babel/helper-plugin-utils": "^7.25.9", - "@babel/helper-skip-transparent-expression-wrappers": "^7.25.9", - "@babel/plugin-syntax-typescript": "^7.25.9" + "@babel/helper-annotate-as-pure": "^7.29.7", + "@babel/helper-create-class-features-plugin": "^7.29.7", + "@babel/helper-plugin-utils": "^7.29.7", + "@babel/helper-skip-transparent-expression-wrappers": "^7.29.7", + "@babel/plugin-syntax-typescript": "^7.29.7" }, "engines": { "node": ">=6.9.0" @@ -2913,194 +1245,18 @@ "@babel/core": "^7.0.0-0" } }, - "node_modules/@babel/plugin-transform-unicode-escapes": { - "version": "7.25.9", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-escapes/-/plugin-transform-unicode-escapes-7.25.9.tgz", - "integrity": "sha512-s5EDrE6bW97LtxOcGj1Khcx5AaXwiMmi4toFWRDP9/y0Woo6pXC+iyPu/KuhKtfSrNFd7jJB+/fkOtZy6aIC6Q==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/helper-plugin-utils": "^7.25.9" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-unicode-property-regex": { - "version": "7.25.9", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-property-regex/-/plugin-transform-unicode-property-regex-7.25.9.tgz", - "integrity": "sha512-Jt2d8Ga+QwRluxRQ307Vlxa6dMrYEMZCgGxoPR8V52rxPyldHu3hdlHspxaqYmE7oID5+kB+UKUB/eWS+DkkWg==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/helper-create-regexp-features-plugin": "^7.25.9", - "@babel/helper-plugin-utils": "^7.25.9" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-unicode-regex": { - "version": "7.25.9", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-regex/-/plugin-transform-unicode-regex-7.25.9.tgz", - "integrity": "sha512-yoxstj7Rg9dlNn9UQxzk4fcNivwv4nUYz7fYXBaKxvw/lnmPuOm/ikoELygbYq68Bls3D/D+NBPHiLwZdZZ4HA==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/helper-create-regexp-features-plugin": "^7.25.9", - "@babel/helper-plugin-utils": "^7.25.9" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-unicode-sets-regex": { - "version": "7.25.9", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-sets-regex/-/plugin-transform-unicode-sets-regex-7.25.9.tgz", - "integrity": "sha512-8BYqO3GeVNHtx69fdPshN3fnzUNLrWdHhk/icSwigksJGczKSizZ+Z6SBCxTs723Fr5VSNorTIK7a+R2tISvwQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/helper-create-regexp-features-plugin": "^7.25.9", - "@babel/helper-plugin-utils": "^7.25.9" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0" - } - }, - "node_modules/@babel/preset-env": { - "version": "7.26.0", - "resolved": "https://registry.npmjs.org/@babel/preset-env/-/preset-env-7.26.0.tgz", - "integrity": "sha512-H84Fxq0CQJNdPFT2DrfnylZ3cf5K43rGfWK4LJGPpjKHiZlk0/RzwEus3PDDZZg+/Er7lCA03MVacueUuXdzfw==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/compat-data": "^7.26.0", - "@babel/helper-compilation-targets": "^7.25.9", - "@babel/helper-plugin-utils": "^7.25.9", - "@babel/helper-validator-option": "^7.25.9", - "@babel/plugin-bugfix-firefox-class-in-computed-class-key": "^7.25.9", - "@babel/plugin-bugfix-safari-class-field-initializer-scope": "^7.25.9", - "@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression": "^7.25.9", - "@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining": "^7.25.9", - "@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly": "^7.25.9", - "@babel/plugin-proposal-private-property-in-object": "7.21.0-placeholder-for-preset-env.2", - "@babel/plugin-syntax-import-assertions": "^7.26.0", - "@babel/plugin-syntax-import-attributes": "^7.26.0", - "@babel/plugin-syntax-unicode-sets-regex": "^7.18.6", - "@babel/plugin-transform-arrow-functions": "^7.25.9", - "@babel/plugin-transform-async-generator-functions": "^7.25.9", - "@babel/plugin-transform-async-to-generator": "^7.25.9", - "@babel/plugin-transform-block-scoped-functions": "^7.25.9", - "@babel/plugin-transform-block-scoping": "^7.25.9", - "@babel/plugin-transform-class-properties": "^7.25.9", - "@babel/plugin-transform-class-static-block": "^7.26.0", - "@babel/plugin-transform-classes": "^7.25.9", - "@babel/plugin-transform-computed-properties": "^7.25.9", - "@babel/plugin-transform-destructuring": "^7.25.9", - "@babel/plugin-transform-dotall-regex": "^7.25.9", - "@babel/plugin-transform-duplicate-keys": "^7.25.9", - "@babel/plugin-transform-duplicate-named-capturing-groups-regex": "^7.25.9", - "@babel/plugin-transform-dynamic-import": "^7.25.9", - "@babel/plugin-transform-exponentiation-operator": "^7.25.9", - "@babel/plugin-transform-export-namespace-from": "^7.25.9", - "@babel/plugin-transform-for-of": "^7.25.9", - "@babel/plugin-transform-function-name": "^7.25.9", - "@babel/plugin-transform-json-strings": "^7.25.9", - "@babel/plugin-transform-literals": "^7.25.9", - "@babel/plugin-transform-logical-assignment-operators": "^7.25.9", - "@babel/plugin-transform-member-expression-literals": "^7.25.9", - "@babel/plugin-transform-modules-amd": "^7.25.9", - "@babel/plugin-transform-modules-commonjs": "^7.25.9", - "@babel/plugin-transform-modules-systemjs": "^7.25.9", - "@babel/plugin-transform-modules-umd": "^7.25.9", - "@babel/plugin-transform-named-capturing-groups-regex": "^7.25.9", - "@babel/plugin-transform-new-target": "^7.25.9", - "@babel/plugin-transform-nullish-coalescing-operator": "^7.25.9", - "@babel/plugin-transform-numeric-separator": "^7.25.9", - "@babel/plugin-transform-object-rest-spread": "^7.25.9", - "@babel/plugin-transform-object-super": "^7.25.9", - "@babel/plugin-transform-optional-catch-binding": "^7.25.9", - "@babel/plugin-transform-optional-chaining": "^7.25.9", - "@babel/plugin-transform-parameters": "^7.25.9", - "@babel/plugin-transform-private-methods": "^7.25.9", - "@babel/plugin-transform-private-property-in-object": "^7.25.9", - "@babel/plugin-transform-property-literals": "^7.25.9", - "@babel/plugin-transform-regenerator": "^7.25.9", - "@babel/plugin-transform-regexp-modifiers": "^7.26.0", - "@babel/plugin-transform-reserved-words": "^7.25.9", - "@babel/plugin-transform-shorthand-properties": "^7.25.9", - "@babel/plugin-transform-spread": "^7.25.9", - "@babel/plugin-transform-sticky-regex": "^7.25.9", - "@babel/plugin-transform-template-literals": "^7.25.9", - "@babel/plugin-transform-typeof-symbol": "^7.25.9", - "@babel/plugin-transform-unicode-escapes": "^7.25.9", - "@babel/plugin-transform-unicode-property-regex": "^7.25.9", - "@babel/plugin-transform-unicode-regex": "^7.25.9", - "@babel/plugin-transform-unicode-sets-regex": "^7.25.9", - "@babel/preset-modules": "0.1.6-no-external-plugins", - "babel-plugin-polyfill-corejs2": "^0.4.10", - "babel-plugin-polyfill-corejs3": "^0.10.6", - "babel-plugin-polyfill-regenerator": "^0.6.1", - "core-js-compat": "^3.38.1", - "semver": "^6.3.1" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/preset-env/node_modules/semver": { - "version": "6.3.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", - "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", - "dev": true, - "license": "ISC", - "bin": { - "semver": "bin/semver.js" - } - }, - "node_modules/@babel/preset-modules": { - "version": "0.1.6-no-external-plugins", - "resolved": "https://registry.npmjs.org/@babel/preset-modules/-/preset-modules-0.1.6-no-external-plugins.tgz", - "integrity": "sha512-HrcgcIESLm9aIR842yhJ5RWan/gebQUJ6E/E5+rf0y9o6oj7w0Br+sWuL6kEQ/o/AdfvR1Je9jG18/gnpwjEyA==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/helper-plugin-utils": "^7.0.0", - "@babel/types": "^7.4.4", - "esutils": "^2.0.2" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0 || ^8.0.0-0 <8.0.0" - } - }, "node_modules/@babel/preset-typescript": { - "version": "7.26.0", - "resolved": "https://registry.npmjs.org/@babel/preset-typescript/-/preset-typescript-7.26.0.tgz", - "integrity": "sha512-NMk1IGZ5I/oHhoXEElcm+xUnL/szL6xflkFZmoEU9xj1qSJXpiS7rsspYo92B4DRCDvZn2erT5LdsCeXAKNCkg==", + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/preset-typescript/-/preset-typescript-7.29.7.tgz", + "integrity": "sha512-/Foi8vKY2EVbed/1eZx0gJEEwHAIxogrySI7rULcRIvhZzbvoE/b5qG5Ghc0WKAFKOHA9SD1x7RsFlOYdutIiQ==", "dev": true, "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.25.9", - "@babel/helper-validator-option": "^7.25.9", - "@babel/plugin-syntax-jsx": "^7.25.9", - "@babel/plugin-transform-modules-commonjs": "^7.25.9", - "@babel/plugin-transform-typescript": "^7.25.9" + "@babel/helper-plugin-utils": "^7.29.7", + "@babel/helper-validator-option": "^7.29.7", + "@babel/plugin-syntax-jsx": "^7.29.7", + "@babel/plugin-transform-modules-commonjs": "^7.29.7", + "@babel/plugin-transform-typescript": "^7.29.7" }, "engines": { "node": ">=6.9.0" @@ -3109,66 +1265,63 @@ "@babel/core": "^7.0.0-0" } }, - "node_modules/@babel/runtime": { - "version": "7.26.0", - "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.26.0.tgz", - "integrity": "sha512-FDSOghenHTiToteC/QRlv2q3DhPZ/oOXTBoirfWNx1Cx3TMVcGWQtMMmQcSvb/JjpNeGzx8Pq/b4fKEJuWm1sw==", - "dev": true, - "license": "MIT", - "dependencies": { - "regenerator-runtime": "^0.14.0" - }, - "engines": { - "node": ">=6.9.0" - } - }, "node_modules/@babel/template": { - "version": "7.25.9", - "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.25.9.tgz", - "integrity": "sha512-9DGttpmPvIxBb/2uwpVo3dqJ+O6RooAFOS+lB+xDqoE2PVCE8nfoHMdZLpfCQRLwvohzXISPZcgxt80xLfsuwg==", + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.29.7.tgz", + "integrity": "sha512-puq+Gf35oI24FeN11LkoUQFqv9uwNeWpxXZi/Ji3rRIoKAzKnxRaZ+Gkj0vKS9ZCiTESfng1N9LyOyXvo+m+Gg==", "dev": true, "license": "MIT", "dependencies": { - "@babel/code-frame": "^7.25.9", - "@babel/parser": "^7.25.9", - "@babel/types": "^7.25.9" + "@babel/code-frame": "^7.29.7", + "@babel/parser": "^7.29.7", + "@babel/types": "^7.29.7" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/traverse": { - "version": "7.26.4", - "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.26.4.tgz", - "integrity": "sha512-fH+b7Y4p3yqvApJALCPJcwb0/XaOSgtK4pzV6WVjPR5GLFQBRI7pfoX2V2iM48NXvX07NUxxm1Vw98YjqTcU5w==", + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.29.7.tgz", + "integrity": "sha512-EhlfNQtZ+NK22w5BM61ciuiq1m58ed33Wr1Xan//ZRTy6hgjnwyCffRYwzsGXdASJSUJ1guZILsErh1eQcl+zw==", "dev": true, "license": "MIT", "dependencies": { - "@babel/code-frame": "^7.26.2", - "@babel/generator": "^7.26.3", - "@babel/parser": "^7.26.3", - "@babel/template": "^7.25.9", - "@babel/types": "^7.26.3", - "debug": "^4.3.1", - "globals": "^11.1.0" + "@babel/code-frame": "^7.29.7", + "@babel/generator": "^7.29.7", + "@babel/helper-globals": "^7.29.7", + "@babel/parser": "^7.29.7", + "@babel/template": "^7.29.7", + "@babel/types": "^7.29.7", + "debug": "^4.3.1" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/types": { - "version": "7.26.3", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.26.3.tgz", - "integrity": "sha512-vN5p+1kl59GVKMvTHt55NzzmYVxprfJD+ql7U9NFIfKCBkYE55LYtS+WtPlaYOyzydrKI8Nezd+aZextrd+FMA==", + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.29.7.tgz", + "integrity": "sha512-4zBIxpPzowiZpusoFkyGVwakdRJUyuH5PxQ/PrqghfdFWWasvnCdPfQXHrenDai+gyLARulZjZowCOj6fjT4pA==", "license": "MIT", "dependencies": { - "@babel/helper-string-parser": "^7.25.9", - "@babel/helper-validator-identifier": "^7.25.9" + "@babel/helper-string-parser": "^7.29.7", + "@babel/helper-validator-identifier": "^7.29.7" }, "engines": { "node": ">=6.9.0" } }, + "node_modules/@borewit/text-codec": { + "version": "0.2.2", + "resolved": "https://registry.npmjs.org/@borewit/text-codec/-/text-codec-0.2.2.tgz", + "integrity": "sha512-DDaRehssg1aNrH4+2hnj1B7vnUGEjU6OIlyRdkMd0aUdIUvKXrJfXsy8LVtXAy7DRvYVluWbMspsRhz2lcW0mQ==", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/Borewit" + } + }, "node_modules/@colors/colors": { "version": "1.5.0", "resolved": "https://registry.npmjs.org/@colors/colors/-/colors-1.5.0.tgz", @@ -3203,17 +1356,6 @@ "@jridgewell/sourcemap-codec": "^1.4.10" } }, - "node_modules/@discoveryjs/json-ext": { - "version": "0.5.7", - "resolved": "https://registry.npmjs.org/@discoveryjs/json-ext/-/json-ext-0.5.7.tgz", - "integrity": "sha512-dBVuXR082gk3jsFp7Rd/JI4kytwGHecnCoTtXFb7DB6CNHp4rg5k1bhg0nWdLGLnOV71lmDzGQaLMy8iPLY0pw==", - "dev": true, - "license": "MIT", - "peer": true, - "engines": { - "node": ">=10.0.0" - } - }, "node_modules/@eidellev/adonis-stardust": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/@eidellev/adonis-stardust/-/adonis-stardust-3.0.0.tgz", @@ -3227,9 +1369,9 @@ } }, "node_modules/@esbuild/aix-ppc64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.21.5.tgz", - "integrity": "sha512-1SDgH6ZSPTlggy1yI6+Dbkiz8xzpHJEVAlF/AM1tHPLsf5STom9rwtjE4hKAF20FfXXNTFqEYXyJNWh1GiZedQ==", + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.25.12.tgz", + "integrity": "sha512-Hhmwd6CInZ3dwpuGTF8fJG6yoWmsToE+vYgD4nytZVxcu1ulHpUQRAB1UJ8+N1Am3Mz4+xOByoQoSZf4D+CpkA==", "cpu": [ "ppc64" ], @@ -3238,15 +1380,14 @@ "os": [ "aix" ], - "peer": true, "engines": { - "node": ">=12" + "node": ">=18" } }, "node_modules/@esbuild/android-arm": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.21.5.tgz", - "integrity": "sha512-vCPvzSjpPHEi1siZdlvAlsPxXl7WbOVUBBAowWug4rJHb68Ox8KualB+1ocNvT5fjv6wpkX6o/iEpbDrf68zcg==", + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.25.12.tgz", + "integrity": "sha512-VJ+sKvNA/GE7Ccacc9Cha7bpS8nyzVv0jdVgwNDaR4gDMC/2TTRc33Ip8qrNYUcpkOHUT5OZ0bUcNNVZQ9RLlg==", "cpu": [ "arm" ], @@ -3255,15 +1396,14 @@ "os": [ "android" ], - "peer": true, "engines": { - "node": ">=12" + "node": ">=18" } }, "node_modules/@esbuild/android-arm64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.21.5.tgz", - "integrity": "sha512-c0uX9VAUBQ7dTDCjq+wdyGLowMdtR/GoC2U5IYk/7D1H1JYC0qseD7+11iMP2mRLN9RcCMRcjC4YMclCzGwS/A==", + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.25.12.tgz", + "integrity": "sha512-6AAmLG7zwD1Z159jCKPvAxZd4y/VTO0VkprYy+3N2FtJ8+BQWFXU+OxARIwA46c5tdD9SsKGZ/1ocqBS/gAKHg==", "cpu": [ "arm64" ], @@ -3272,15 +1412,14 @@ "os": [ "android" ], - "peer": true, "engines": { - "node": ">=12" + "node": ">=18" } }, "node_modules/@esbuild/android-x64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.21.5.tgz", - "integrity": "sha512-D7aPRUUNHRBwHxzxRvp856rjUHRFW1SdQATKXH2hqA0kAZb1hKmi02OpYRacl0TxIGz/ZmXWlbZgjwWYaCakTA==", + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.25.12.tgz", + "integrity": "sha512-5jbb+2hhDHx5phYR2By8GTWEzn6I9UqR11Kwf22iKbNpYrsmRB18aX/9ivc5cabcUiAT/wM+YIZ6SG9QO6a8kg==", "cpu": [ "x64" ], @@ -3289,15 +1428,14 @@ "os": [ "android" ], - "peer": true, "engines": { - "node": ">=12" + "node": ">=18" } }, "node_modules/@esbuild/darwin-arm64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.21.5.tgz", - "integrity": "sha512-DwqXqZyuk5AiWWf3UfLiRDJ5EDd49zg6O9wclZ7kUMv2WRFr4HKjXp/5t8JZ11QbQfUS6/cRCKGwYhtNAY88kQ==", + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.25.12.tgz", + "integrity": "sha512-N3zl+lxHCifgIlcMUP5016ESkeQjLj/959RxxNYIthIg+CQHInujFuXeWbWMgnTo4cp5XVHqFPmpyu9J65C1Yg==", "cpu": [ "arm64" ], @@ -3306,15 +1444,14 @@ "os": [ "darwin" ], - "peer": true, "engines": { - "node": ">=12" + "node": ">=18" } }, "node_modules/@esbuild/darwin-x64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.21.5.tgz", - "integrity": "sha512-se/JjF8NlmKVG4kNIuyWMV/22ZaerB+qaSi5MdrXtd6R08kvs2qCN4C09miupktDitvh8jRFflwGFBQcxZRjbw==", + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.25.12.tgz", + "integrity": "sha512-HQ9ka4Kx21qHXwtlTUVbKJOAnmG1ipXhdWTmNXiPzPfWKpXqASVcWdnf2bnL73wgjNrFXAa3yYvBSd9pzfEIpA==", "cpu": [ "x64" ], @@ -3323,15 +1460,14 @@ "os": [ "darwin" ], - "peer": true, "engines": { - "node": ">=12" + "node": ">=18" } }, "node_modules/@esbuild/freebsd-arm64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.21.5.tgz", - "integrity": "sha512-5JcRxxRDUJLX8JXp/wcBCy3pENnCgBR9bN6JsY4OmhfUtIHe3ZW0mawA7+RDAcMLrMIZaf03NlQiX9DGyB8h4g==", + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.25.12.tgz", + "integrity": "sha512-gA0Bx759+7Jve03K1S0vkOu5Lg/85dou3EseOGUes8flVOGxbhDDh/iZaoek11Y8mtyKPGF3vP8XhnkDEAmzeg==", "cpu": [ "arm64" ], @@ -3340,15 +1476,14 @@ "os": [ "freebsd" ], - "peer": true, "engines": { - "node": ">=12" + "node": ">=18" } }, "node_modules/@esbuild/freebsd-x64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.21.5.tgz", - "integrity": "sha512-J95kNBj1zkbMXtHVH29bBriQygMXqoVQOQYA+ISs0/2l3T9/kj42ow2mpqerRBxDJnmkUDCaQT/dfNXWX/ZZCQ==", + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.25.12.tgz", + "integrity": "sha512-TGbO26Yw2xsHzxtbVFGEXBFH0FRAP7gtcPE7P5yP7wGy7cXK2oO7RyOhL5NLiqTlBh47XhmIUXuGciXEqYFfBQ==", "cpu": [ "x64" ], @@ -3357,15 +1492,14 @@ "os": [ "freebsd" ], - "peer": true, "engines": { - "node": ">=12" + "node": ">=18" } }, "node_modules/@esbuild/linux-arm": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.21.5.tgz", - "integrity": "sha512-bPb5AHZtbeNGjCKVZ9UGqGwo8EUu4cLq68E95A53KlxAPRmUyYv2D6F0uUI65XisGOL1hBP5mTronbgo+0bFcA==", + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.25.12.tgz", + "integrity": "sha512-lPDGyC1JPDou8kGcywY0YILzWlhhnRjdof3UlcoqYmS9El818LLfJJc3PXXgZHrHCAKs/Z2SeZtDJr5MrkxtOw==", "cpu": [ "arm" ], @@ -3374,15 +1508,14 @@ "os": [ "linux" ], - "peer": true, "engines": { - "node": ">=12" + "node": ">=18" } }, "node_modules/@esbuild/linux-arm64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.21.5.tgz", - "integrity": "sha512-ibKvmyYzKsBeX8d8I7MH/TMfWDXBF3db4qM6sy+7re0YXya+K1cem3on9XgdT2EQGMu4hQyZhan7TeQ8XkGp4Q==", + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.25.12.tgz", + "integrity": "sha512-8bwX7a8FghIgrupcxb4aUmYDLp8pX06rGh5HqDT7bB+8Rdells6mHvrFHHW2JAOPZUbnjUpKTLg6ECyzvas2AQ==", "cpu": [ "arm64" ], @@ -3391,15 +1524,14 @@ "os": [ "linux" ], - "peer": true, "engines": { - "node": ">=12" + "node": ">=18" } }, "node_modules/@esbuild/linux-ia32": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.21.5.tgz", - "integrity": "sha512-YvjXDqLRqPDl2dvRODYmmhz4rPeVKYvppfGYKSNGdyZkA01046pLWyRKKI3ax8fbJoK5QbxblURkwK/MWY18Tg==", + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.25.12.tgz", + "integrity": "sha512-0y9KrdVnbMM2/vG8KfU0byhUN+EFCny9+8g202gYqSSVMonbsCfLjUO+rCci7pM0WBEtz+oK/PIwHkzxkyharA==", "cpu": [ "ia32" ], @@ -3408,15 +1540,14 @@ "os": [ "linux" ], - "peer": true, "engines": { - "node": ">=12" + "node": ">=18" } }, "node_modules/@esbuild/linux-loong64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.21.5.tgz", - "integrity": "sha512-uHf1BmMG8qEvzdrzAqg2SIG/02+4/DHB6a9Kbya0XDvwDEKCoC8ZRWI5JJvNdUjtciBGFQ5PuBlpEOXQj+JQSg==", + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.25.12.tgz", + "integrity": "sha512-h///Lr5a9rib/v1GGqXVGzjL4TMvVTv+s1DPoxQdz7l/AYv6LDSxdIwzxkrPW438oUXiDtwM10o9PmwS/6Z0Ng==", "cpu": [ "loong64" ], @@ -3425,15 +1556,14 @@ "os": [ "linux" ], - "peer": true, "engines": { - "node": ">=12" + "node": ">=18" } }, "node_modules/@esbuild/linux-mips64el": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.21.5.tgz", - "integrity": "sha512-IajOmO+KJK23bj52dFSNCMsz1QP1DqM6cwLUv3W1QwyxkyIWecfafnI555fvSGqEKwjMXVLokcV5ygHW5b3Jbg==", + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.25.12.tgz", + "integrity": "sha512-iyRrM1Pzy9GFMDLsXn1iHUm18nhKnNMWscjmp4+hpafcZjrr2WbT//d20xaGljXDBYHqRcl8HnxbX6uaA/eGVw==", "cpu": [ "mips64el" ], @@ -3442,15 +1572,14 @@ "os": [ "linux" ], - "peer": true, "engines": { - "node": ">=12" + "node": ">=18" } }, "node_modules/@esbuild/linux-ppc64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.21.5.tgz", - "integrity": "sha512-1hHV/Z4OEfMwpLO8rp7CvlhBDnjsC3CttJXIhBi+5Aj5r+MBvy4egg7wCbe//hSsT+RvDAG7s81tAvpL2XAE4w==", + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.25.12.tgz", + "integrity": "sha512-9meM/lRXxMi5PSUqEXRCtVjEZBGwB7P/D4yT8UG/mwIdze2aV4Vo6U5gD3+RsoHXKkHCfSxZKzmDssVlRj1QQA==", "cpu": [ "ppc64" ], @@ -3459,15 +1588,14 @@ "os": [ "linux" ], - "peer": true, "engines": { - "node": ">=12" + "node": ">=18" } }, "node_modules/@esbuild/linux-riscv64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.21.5.tgz", - "integrity": "sha512-2HdXDMd9GMgTGrPWnJzP2ALSokE/0O5HhTUvWIbD3YdjME8JwvSCnNGBnTThKGEB91OZhzrJ4qIIxk/SBmyDDA==", + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.25.12.tgz", + "integrity": "sha512-Zr7KR4hgKUpWAwb1f3o5ygT04MzqVrGEGXGLnj15YQDJErYu/BGg+wmFlIDOdJp0PmB0lLvxFIOXZgFRrdjR0w==", "cpu": [ "riscv64" ], @@ -3476,15 +1604,14 @@ "os": [ "linux" ], - "peer": true, "engines": { - "node": ">=12" + "node": ">=18" } }, "node_modules/@esbuild/linux-s390x": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.21.5.tgz", - "integrity": "sha512-zus5sxzqBJD3eXxwvjN1yQkRepANgxE9lgOW2qLnmr8ikMTphkjgXu1HR01K4FJg8h1kEEDAqDcZQtbrRnB41A==", + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.25.12.tgz", + "integrity": "sha512-MsKncOcgTNvdtiISc/jZs/Zf8d0cl/t3gYWX8J9ubBnVOwlk65UIEEvgBORTiljloIWnBzLs4qhzPkJcitIzIg==", "cpu": [ "s390x" ], @@ -3493,15 +1620,14 @@ "os": [ "linux" ], - "peer": true, "engines": { - "node": ">=12" + "node": ">=18" } }, "node_modules/@esbuild/linux-x64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.21.5.tgz", - "integrity": "sha512-1rYdTpyv03iycF1+BhzrzQJCdOuAOtaqHTWJZCWvijKD2N5Xu0TtVC8/+1faWqcP9iBCWOmjmhoH94dH82BxPQ==", + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.25.12.tgz", + "integrity": "sha512-uqZMTLr/zR/ed4jIGnwSLkaHmPjOjJvnm6TVVitAa08SLS9Z0VM8wIRx7gWbJB5/J54YuIMInDquWyYvQLZkgw==", "cpu": [ "x64" ], @@ -3510,15 +1636,30 @@ "os": [ "linux" ], - "peer": true, "engines": { - "node": ">=12" + "node": ">=18" + } + }, + "node_modules/@esbuild/netbsd-arm64": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-arm64/-/netbsd-arm64-0.25.12.tgz", + "integrity": "sha512-xXwcTq4GhRM7J9A8Gv5boanHhRa/Q9KLVmcyXHCTaM4wKfIpWkdXiMog/KsnxzJ0A1+nD+zoecuzqPmCRyBGjg==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "netbsd" + ], + "engines": { + "node": ">=18" } }, "node_modules/@esbuild/netbsd-x64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.21.5.tgz", - "integrity": "sha512-Woi2MXzXjMULccIwMnLciyZH4nCIMpWQAs049KEeMvOcNADVxo0UBIQPfSmxB3CWKedngg7sWZdLvLczpe0tLg==", + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.25.12.tgz", + "integrity": "sha512-Ld5pTlzPy3YwGec4OuHh1aCVCRvOXdH8DgRjfDy/oumVovmuSzWfnSJg+VtakB9Cm0gxNO9BzWkj6mtO1FMXkQ==", "cpu": [ "x64" ], @@ -3527,15 +1668,30 @@ "os": [ "netbsd" ], - "peer": true, "engines": { - "node": ">=12" + "node": ">=18" + } + }, + "node_modules/@esbuild/openbsd-arm64": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-arm64/-/openbsd-arm64-0.25.12.tgz", + "integrity": "sha512-fF96T6KsBo/pkQI950FARU9apGNTSlZGsv1jZBAlcLL1MLjLNIWPBkj5NlSz8aAzYKg+eNqknrUJ24QBybeR5A==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "openbsd" + ], + "engines": { + "node": ">=18" } }, "node_modules/@esbuild/openbsd-x64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.21.5.tgz", - "integrity": "sha512-HLNNw99xsvx12lFBUwoT8EVCsSvRNDVxNpjZ7bPn947b8gJPzeHWyNVhFsaerc0n3TsbOINvRP2byTZ5LKezow==", + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.25.12.tgz", + "integrity": "sha512-MZyXUkZHjQxUvzK7rN8DJ3SRmrVrke8ZyRusHlP+kuwqTcfWLyqMOE3sScPPyeIXN/mDJIfGXvcMqCgYKekoQw==", "cpu": [ "x64" ], @@ -3544,15 +1700,30 @@ "os": [ "openbsd" ], - "peer": true, "engines": { - "node": ">=12" + "node": ">=18" + } + }, + "node_modules/@esbuild/openharmony-arm64": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/openharmony-arm64/-/openharmony-arm64-0.25.12.tgz", + "integrity": "sha512-rm0YWsqUSRrjncSXGA7Zv78Nbnw4XL6/dzr20cyrQf7ZmRcsovpcRBdhD43Nuk3y7XIoW2OxMVvwuRvk9XdASg==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "openharmony" + ], + "engines": { + "node": ">=18" } }, "node_modules/@esbuild/sunos-x64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.21.5.tgz", - "integrity": "sha512-6+gjmFpfy0BHU5Tpptkuh8+uw3mnrvgs+dSPQXQOv3ekbordwnzTVEb4qnIvQcYXq6gzkyTnoZ9dZG+D4garKg==", + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.25.12.tgz", + "integrity": "sha512-3wGSCDyuTHQUzt0nV7bocDy72r2lI33QL3gkDNGkod22EsYl04sMf0qLb8luNKTOmgF/eDEDP5BFNwoBKH441w==", "cpu": [ "x64" ], @@ -3561,15 +1732,14 @@ "os": [ "sunos" ], - "peer": true, "engines": { - "node": ">=12" + "node": ">=18" } }, "node_modules/@esbuild/win32-arm64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.21.5.tgz", - "integrity": "sha512-Z0gOTd75VvXqyq7nsl93zwahcTROgqvuAcYDUr+vOv8uHhNSKROyU961kgtCD1e95IqPKSQKH7tBTslnS3tA8A==", + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.25.12.tgz", + "integrity": "sha512-rMmLrur64A7+DKlnSuwqUdRKyd3UE7oPJZmnljqEptesKM8wx9J8gx5u0+9Pq0fQQW8vqeKebwNXdfOyP+8Bsg==", "cpu": [ "arm64" ], @@ -3578,15 +1748,14 @@ "os": [ "win32" ], - "peer": true, "engines": { - "node": ">=12" + "node": ">=18" } }, "node_modules/@esbuild/win32-ia32": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.21.5.tgz", - "integrity": "sha512-SWXFF1CL2RVNMaVs+BBClwtfZSvDgtL//G/smwAc5oVK/UPu2Gu9tIaRgFmYFFKrmg3SyAjSrElf0TiJ1v8fYA==", + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.25.12.tgz", + "integrity": "sha512-HkqnmmBoCbCwxUKKNPBixiWDGCpQGVsrQfJoVGYLPT41XWF8lHuE5N6WhVia2n4o5QK5M4tYr21827fNhi4byQ==", "cpu": [ "ia32" ], @@ -3595,15 +1764,14 @@ "os": [ "win32" ], - "peer": true, "engines": { - "node": ">=12" + "node": ">=18" } }, "node_modules/@esbuild/win32-x64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.21.5.tgz", - "integrity": "sha512-tQd/1efJuzPC6rCFwEvLtci/xNFcTZknmXs98FYDfGE4wP9ClFV98nyKrzJKVPMhdDnjzLhdUyMX4PsQAPjwIw==", + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.25.12.tgz", + "integrity": "sha512-alJC0uCZpTFrSL0CCDjcgleBXPnCrEAhTBILpeAp7M/OFgoqtAetfBzX0xM00MUsVVPpVjlPuMbREqnZCXaTnA==", "cpu": [ "x64" ], @@ -3612,15 +1780,14 @@ "os": [ "win32" ], - "peer": true, "engines": { - "node": ">=12" + "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==", + "version": "4.9.1", + "resolved": "https://registry.npmjs.org/@eslint-community/eslint-utils/-/eslint-utils-4.9.1.tgz", + "integrity": "sha512-phrYmNiYppR7znFEdqgfWHXR6NCkZEK7hwWDHZUjit/2/U0r6XvkDl0SYnoM51Hq7FhCGdLDT6zxCCOY1hexsQ==", "dev": true, "license": "MIT", "dependencies": { @@ -3637,9 +1804,9 @@ } }, "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==", + "version": "4.12.2", + "resolved": "https://registry.npmjs.org/@eslint-community/regexpp/-/regexpp-4.12.2.tgz", + "integrity": "sha512-EriSTlt5OC9/7SXkRSCAhfSxxoSUgBm33OH+IkwbdpgoqsSsUg7y3uh+IICI/Qg4BBWr3U2i39RpmycbxMq4ew==", "dev": true, "license": "MIT", "engines": { @@ -3670,55 +1837,6 @@ "url": "https://opencollective.com/eslint" } }, - "node_modules/@eslint/eslintrc/node_modules/argparse": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", - "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==", - "dev": true, - "license": "Python-2.0" - }, - "node_modules/@eslint/eslintrc/node_modules/globals": { - "version": "13.24.0", - "resolved": "https://registry.npmjs.org/globals/-/globals-13.24.0.tgz", - "integrity": "sha512-AhO5QUcj8llrbG09iWhPU2B204J1xnPeL8kQmVorSsy+Sjj1sk8gIyh6cUocGmH4L0UuhAJy+hJMRA4mgA4mFQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "type-fest": "^0.20.2" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/@eslint/eslintrc/node_modules/js-yaml": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz", - "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==", - "dev": true, - "license": "MIT", - "dependencies": { - "argparse": "^2.0.1" - }, - "bin": { - "js-yaml": "bin/js-yaml.js" - } - }, - "node_modules/@eslint/eslintrc/node_modules/type-fest": { - "version": "0.20.2", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.20.2.tgz", - "integrity": "sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==", - "dev": true, - "license": "(MIT OR CC0-1.0)", - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, "node_modules/@eslint/js": { "version": "8.57.1", "resolved": "https://registry.npmjs.org/@eslint/js/-/js-8.57.1.tgz", @@ -3730,9 +1848,9 @@ } }, "node_modules/@faker-js/faker": { - "version": "9.3.0", - "resolved": "https://registry.npmjs.org/@faker-js/faker/-/faker-9.3.0.tgz", - "integrity": "sha512-r0tJ3ZOkMd9xsu3VRfqlFR6cz0V/jFYRswAIpC+m/DIfAUXq7g8N7wTAlhSANySXYGKzGryfDXwtwsY8TxEIDw==", + "version": "9.9.0", + "resolved": "https://registry.npmjs.org/@faker-js/faker/-/faker-9.9.0.tgz", + "integrity": "sha512-OEl393iCOoo/z8bMezRlJu+GlRGlsKbUAN7jKB6LhnKoqKve5DXRpalbItIIcwnCjs1k/FOPjFzcA6Qn+H+YbA==", "funding": [ { "type": "opencollective", @@ -3746,16 +1864,38 @@ } }, "node_modules/@fontsource/archivo-black": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/@fontsource/archivo-black/-/archivo-black-5.1.1.tgz", - "integrity": "sha512-3hmXvgYkXDsQ7msb+YrwU+6B5j4q7LBfVev1G4T8I5yRcRTo6H8OEA8tf0vULvcAGfOOhl38aRK/2I2+RLE/rQ==", - "license": "OFL-1.1" + "version": "5.2.8", + "resolved": "https://registry.npmjs.org/@fontsource/archivo-black/-/archivo-black-5.2.8.tgz", + "integrity": "sha512-3zNj/o9LzWyDl/UEpY5IOHpAQyUtFr3hQaFS7NSKwCLLkXOfH/CMCt1L2b2Z+OF25OURtOYenCadgAebALz7/A==", + "license": "OFL-1.1", + "funding": { + "url": "https://github.com/sponsors/ayuhito" + } }, "node_modules/@fontsource/inter": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/@fontsource/inter/-/inter-5.1.1.tgz", - "integrity": "sha512-weN3E+rq0Xb3Z93VHJ+Rc7WOQX9ETJPTAJ+gDcaMHtjft67L58sfS65rAjC5tZUXQ2FdZ/V1/sSzCwZ6v05kJw==", - "license": "OFL-1.1" + "version": "5.2.8", + "resolved": "https://registry.npmjs.org/@fontsource/inter/-/inter-5.2.8.tgz", + "integrity": "sha512-P6r5WnJoKiNVV+zvW2xM13gNdFhAEpQ9dQJHt3naLvfg+LkF2ldgSLiF4T41lf1SQCM9QmkqPTn4TH568IRagg==", + "license": "OFL-1.1", + "funding": { + "url": "https://github.com/sponsors/ayuhito" + } + }, + "node_modules/@headlessui/vue": { + "version": "1.7.23", + "resolved": "https://registry.npmjs.org/@headlessui/vue/-/vue-1.7.23.tgz", + "integrity": "sha512-JzdCNqurrtuu0YW6QaDtR2PIYCKPUWq28csDyMvN4zmGccmE7lz40Is6hc3LA4HFeCI7sekZ/PQMTNmn9I/4Wg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@tanstack/vue-virtual": "^3.0.0-beta.60" + }, + "engines": { + "node": ">=10" + }, + "peerDependencies": { + "vue": "^3.2.0" + } }, "node_modules/@humanwhocodes/config-array": { "version": "0.13.0", @@ -3795,33 +1935,37 @@ "dev": true, "license": "BSD-3-Clause" }, - "node_modules/@inertiajs/core": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/@inertiajs/core/-/core-1.3.0.tgz", - "integrity": "sha512-TJ8R1eUYY473m9DaKlCPRdHTdznFWTDuy5VvEzXg3t/hohbDQedLj46yn/uAqziJPEUZJrSftZzPI2NMzL9tQA==", - "license": "MIT", - "dependencies": { - "axios": "^1.6.0", - "deepmerge": "^4.0.0", - "nprogress": "^0.2.0", - "qs": "^6.9.0" + "node_modules/@humanwhocodes/retry": { + "version": "0.4.3", + "resolved": "https://registry.npmjs.org/@humanwhocodes/retry/-/retry-0.4.3.tgz", + "integrity": "sha512-bV0Tgo9K4hfPCek+aMAn81RppFKv2ySDQeMoSZuvTASywNTnVJCArCZE2FWqpvIatKu7VMRLWlR1EazvVhDyhQ==", + "license": "Apache-2.0", + "engines": { + "node": ">=18.18" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/nzakas" } }, - "node_modules/@inertiajs/core/node_modules/axios": { - "version": "1.7.9", - "resolved": "https://registry.npmjs.org/axios/-/axios-1.7.9.tgz", - "integrity": "sha512-LhLcE7Hbiryz8oMDdDptSrWowmB4Bl6RCt6sIJKpRB4XtVf0iEgewX3au/pJqm+Py1kCASkb/FFKjxQaLtxJvw==", + "node_modules/@inertiajs/core": { + "version": "2.3.25", + "resolved": "https://registry.npmjs.org/@inertiajs/core/-/core-2.3.25.tgz", + "integrity": "sha512-pA2KXR47xrEPO0JenidPq+x+ORc/gNs6Kfo0YnB2wkaUmtx/FM+N32uifAfW30EglIISCHP2O/DgIrkuQ+QrpQ==", "license": "MIT", "dependencies": { - "follow-redirects": "^1.15.6", - "form-data": "^4.0.0", - "proxy-from-env": "^1.1.0" + "@types/lodash-es": "^4.17.12", + "axios": "^1.13.5", + "laravel-precognition": "^1.0.2", + "lodash-es": "^4.18.1", + "qs": "^6.15.0" } }, "node_modules/@inertiajs/inertia": { "version": "0.11.1", "resolved": "https://registry.npmjs.org/@inertiajs/inertia/-/inertia-0.11.1.tgz", "integrity": "sha512-btmV53c54oW4Z9XF0YyTdIUnM7ue0ONy3/KJOz6J1C5CYIwimiKfDMpz8ZbGJuxS+SPdOlNsqj2ZhlHslpJRZg==", + "deprecated": "Package no longer supported. Contact Support at https://www.npmjs.com/support for more info.", "license": "MIT", "dependencies": { "axios": "^0.21.1", @@ -3829,198 +1973,68 @@ "qs": "^6.9.0" } }, - "node_modules/@inertiajs/vue3": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/@inertiajs/vue3/-/vue3-1.3.0.tgz", - "integrity": "sha512-GizqdCM3u4JWunit3uUbW4fEmTLKQTi1W7VvPRdrNy8XDt4Qy2cCmfFjq+aH5tHBSS3fI/ngYuhN7XvwqNaKvw==", + "node_modules/@inertiajs/inertia/node_modules/axios": { + "version": "0.21.4", + "resolved": "https://registry.npmjs.org/axios/-/axios-0.21.4.tgz", + "integrity": "sha512-ut5vewkiu8jjGBdqpM44XxjuCjq9LAKeHVmoVfHVzy8eHgxxq8SbAVQNovDA8mVi05kP0Ea/n/UzcSHcTJQfNg==", "license": "MIT", "dependencies": { - "@inertiajs/core": "1.3.0", - "lodash.clonedeep": "^4.5.0", - "lodash.isequal": "^4.5.0" + "follow-redirects": "^1.14.0" + } + }, + "node_modules/@inertiajs/vue3": { + "version": "2.3.25", + "resolved": "https://registry.npmjs.org/@inertiajs/vue3/-/vue3-2.3.25.tgz", + "integrity": "sha512-gh+R1SbKKhot6GKU9QhoB5bMNAiVKmQKYbnp95iF87DsVFeVt4iR0NNzj5ik9ptwlYhr7NHkChW5ZZRXI9gThA==", + "license": "MIT", + "dependencies": { + "@inertiajs/core": "2.3.25", + "@types/lodash-es": "^4.17.12", + "laravel-precognition": "^1.0.2", + "lodash-es": "^4.18.1" }, "peerDependencies": { "vue": "^3.0.0" } }, "node_modules/@ioredis/commands": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/@ioredis/commands/-/commands-1.2.0.tgz", - "integrity": "sha512-Sx1pU8EM64o2BrqNpEO1CNLtKQwyhuXuqyfH7oGKCk+1a33d2r5saW8zNwm3j6BTExtjrv2BxTgzzkMwts6vGg==", + "version": "1.10.0", + "resolved": "https://registry.npmjs.org/@ioredis/commands/-/commands-1.10.0.tgz", + "integrity": "sha512-UmeW7z4LfctwoQ5wkhVzgq8tXkreED2xZGpX+Bg+zA+WJFZCT6c062AfCK/Dfk81xZnnwdhJCUMkitihRaoC2Q==", "license": "MIT" }, - "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, - "license": "ISC", - "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/@isaacs/cliui/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, - "license": "MIT", - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/chalk/ansi-regex?sponsor=1" - } - }, - "node_modules/@isaacs/cliui/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, - "license": "MIT", - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" - } - }, - "node_modules/@isaacs/cliui/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, - "license": "MIT" - }, - "node_modules/@isaacs/cliui/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, - "license": "MIT", - "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/@isaacs/cliui/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, - "license": "MIT", - "dependencies": { - "ansi-regex": "^6.0.1" - }, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/chalk/strip-ansi?sponsor=1" - } - }, - "node_modules/@isaacs/cliui/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, - "license": "MIT", - "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/@japa/api-client": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/@japa/api-client/-/api-client-2.0.4.tgz", - "integrity": "sha512-hD0UbbyjrDG+hyzI1HXVvqYdwAxltX/lK7znVon5el1hu6FpYSbvboVwxRjW40ttRsy0l45EQDIlFBA+lW352A==", - "devOptional": true, - "license": "MIT", - "dependencies": { - "@poppinss/hooks": "^7.2.4", - "@poppinss/macroable": "^1.0.3", - "@types/superagent": "^8.1.9", - "cookie": "^1.0.1", - "set-cookie-parser": "^2.7.1", - "superagent": "^8.1.2" - }, - "engines": { - "node": ">=18.16.0" - }, - "peerDependencies": { - "@japa/assert": "^2.0.0 || ^3.0.0", - "@japa/runner": "^3.1.2" - }, - "peerDependenciesMeta": { - "@japa/assert": { - "optional": true - } - } - }, - "node_modules/@japa/api-client/node_modules/cookie": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/cookie/-/cookie-1.0.2.tgz", - "integrity": "sha512-9Kr/j4O16ISv8zBBhJoi4bXOYNTkFLOqSL3UDB0njXxCXNezjeyVrJyGOWtgfs/q2km1gwBcfH8q1yEGoMYunA==", - "devOptional": true, - "license": "MIT", - "engines": { - "node": ">=18" - } - }, "node_modules/@japa/assert": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/@japa/assert/-/assert-3.0.0.tgz", - "integrity": "sha512-4Uvixj78PBpRGeNTqO1GN/qYyl4EeWmIwt/cKiQSLLsoZQpQfe8tvF4PO2Z+zteUi3Zv7WR6pluKYbLQrn3vjg==", + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/@japa/assert/-/assert-4.2.0.tgz", + "integrity": "sha512-Krgrcee01BN1StlVwK5JQP6LL5t3DE3uFNbfFoDTfW7kQuHB0xh6yfaV0hrgcoiEjsqmm2OOsVWeju9aXK4vIA==", "dev": true, "license": "MIT", "dependencies": { - "@poppinss/macroable": "^1.0.2", - "@types/chai": "^4.3.14", - "api-contract-validator": "^2.2.8", - "chai": "^5.1.0" + "@poppinss/macroable": "^1.1.0", + "@types/chai": "^5.2.3", + "assertion-error": "^2.0.1", + "chai": "^6.2.1" }, "engines": { "node": ">=18.16.0" }, "peerDependencies": { - "@japa/runner": "^3.1.2" + "@japa/runner": "^3.1.2 || ^4.0.0 || ^5.0.0" } }, "node_modules/@japa/core": { - "version": "9.0.1", - "resolved": "https://registry.npmjs.org/@japa/core/-/core-9.0.1.tgz", - "integrity": "sha512-snngJNbvYC92nn+dB69DT2iyosWZLXPRnOp8NJnVEeotkkKAWSmcDqBKw9qq2+MVdshwClvKFVXTxko4MtmlEQ==", + "version": "10.3.0", + "resolved": "https://registry.npmjs.org/@japa/core/-/core-10.3.0.tgz", + "integrity": "sha512-+vaqMiPnVaxlKH1sAwRQ80AwzlPysPKivhB8q1I2+BGe35lNrfiHKGMC52fuGAZBNuH5W2nInSCxr4cN/BTEIQ==", "devOptional": true, "license": "MIT", "dependencies": { - "@poppinss/cliui": "^6.4.1", - "@poppinss/hooks": "^7.2.3", - "@poppinss/macroable": "^1.0.2", + "@poppinss/hooks": "^7.2.5", + "@poppinss/macroable": "^1.0.4", + "@poppinss/string": "^1.2.0", "async-retry": "^1.3.3", "emittery": "^1.0.3", - "string-width": "^7.1.0", + "string-width": "^7.2.0", "time-span": "^5.1.0" }, "engines": { @@ -4028,36 +2042,61 @@ } }, "node_modules/@japa/errors-printer": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/@japa/errors-printer/-/errors-printer-3.0.4.tgz", - "integrity": "sha512-gqBWkc8X6n5y91HH7H8fXyfe3rKV1+YeMNgE/+CY6hXf0/BS7J55s/QldosKEV2ZiWj/WmE6UPZiFH8W873fGw==", + "version": "4.1.4", + "resolved": "https://registry.npmjs.org/@japa/errors-printer/-/errors-printer-4.1.4.tgz", + "integrity": "sha512-ogPT87QLaugKyPVcq+ZypcetVeJpXZN7RfVRlRDIrSHsHBw6ILCtNXghVxD9POjqxtUM7RON3sUkgZzLnVQA5g==", "devOptional": true, "license": "MIT", "dependencies": { - "@poppinss/colors": "^4.1.3", - "jest-diff": "^29.7.0", - "supports-color": "^9.4.0", - "youch": "^3.3.3", - "youch-terminal": "^2.2.3" + "@poppinss/colors": "^4.1.6", + "jest-diff": "^30.2.0", + "supports-color": "^10.2.2", + "youch": "^4.1.0-beta.13" }, "engines": { "node": ">=18.16.0" } }, + "node_modules/@japa/errors-printer/node_modules/@poppinss/dumper": { + "version": "0.7.0", + "resolved": "https://registry.npmjs.org/@poppinss/dumper/-/dumper-0.7.0.tgz", + "integrity": "sha512-0UTYalzk2t6S4rA2uHOz5bSSW2CHdv4vggJI6Alg90yvl0UgXs6XSXpH96OH+bRkX4J/06djv29pqXJ0lq5Kag==", + "devOptional": true, + "license": "MIT", + "dependencies": { + "@poppinss/colors": "^4.1.5", + "@sindresorhus/is": "^7.0.2", + "supports-color": "^10.0.0" + } + }, + "node_modules/@japa/errors-printer/node_modules/youch": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/youch/-/youch-4.1.1.tgz", + "integrity": "sha512-mxW3qiSnl+GRxXsaUMzv2Mbada1Y8CDltET9UxejDQe6DBYlSekghl5U5K0ReAikcHDi0G1vKZEmmo/NWAGKLA==", + "devOptional": true, + "license": "MIT", + "dependencies": { + "@poppinss/colors": "^4.1.6", + "@poppinss/dumper": "^0.7.0", + "@speed-highlight/core": "^1.2.14", + "cookie-es": "^3.0.1", + "youch-core": "^0.3.3" + } + }, "node_modules/@japa/plugin-adonisjs": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/@japa/plugin-adonisjs/-/plugin-adonisjs-3.0.1.tgz", - "integrity": "sha512-xUZOzfBXSz2sWRoQT+qs+6LZBtWWE+cCBZ3j9ckz6+nPw3VI0nV6yLaX+oud3AY8Zb+BH+pErABBhaovZYv9dA==", + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/@japa/plugin-adonisjs/-/plugin-adonisjs-4.0.0.tgz", + "integrity": "sha512-M2LUtHhKr4KgBfX73tDHNCD1IOmcXp9dvC+AinmRxsggIFnarsClcfjT/sXc3uNzjZW7Lk31LvcH76AxJHBmJQ==", "devOptional": true, "license": "MIT", "engines": { "node": ">=18.16.0" }, "peerDependencies": { - "@adonisjs/core": "^6.5.0", - "@japa/api-client": "^2.0.3", + "@adonisjs/core": "^6.17.0", + "@japa/api-client": "^2.0.3 || ^3.0.0", "@japa/browser-client": "^2.0.3", - "@japa/runner": "^3.1.2", + "@japa/runner": "^3.1.2 || ^4.0.0", "playwright": "^1.42.1" }, "peerDependenciesMeta": { @@ -4073,133 +2112,99 @@ } }, "node_modules/@japa/runner": { - "version": "3.1.4", - "resolved": "https://registry.npmjs.org/@japa/runner/-/runner-3.1.4.tgz", - "integrity": "sha512-ShaVZLdYq3GbFwyNiqQMCfdEoNq9vgYC0P6Z9gflqPcSUfOmN5jeJTLrLpChCBM5Sx9kYuAm5Bh6cqv1ZrArkQ==", + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/@japa/runner/-/runner-4.5.0.tgz", + "integrity": "sha512-F5BWRY20V5D40EUXK+O4bd1IZ7pNpsz/ct2YJGjXa3NXwVJFjGCv8NYBxlUUlfLJyfXNXlLKi+iIjbaMq2UWIQ==", "devOptional": true, "license": "MIT", "dependencies": { - "@japa/core": "^9.0.1", - "@japa/errors-printer": "^3.0.4", - "@poppinss/colors": "^4.1.3", - "@poppinss/hooks": "^7.2.3", - "fast-glob": "^3.3.2", - "find-cache-dir": "^5.0.0", + "@japa/core": "^10.3.0", + "@japa/errors-printer": "^4.1.3", + "@poppinss/colors": "^4.1.5", + "@poppinss/hooks": "^7.2.6", + "@poppinss/string": "^1.7.0", + "@poppinss/utils": "7.0.0-next.6", + "error-stack-parser-es": "^1.0.5", + "fast-glob": "^3.3.3", + "find-cache-directory": "^6.0.0", "getopts": "^2.3.0", "ms": "^2.1.3", - "serialize-error": "^11.0.3", + "serialize-error": "^12.0.0", "slash": "^5.1.0", - "supports-color": "^9.4.0" + "supports-color": "^10.1.0" }, "engines": { "node": ">=18.16.0" } }, - "node_modules/@jest/schemas": { - "version": "29.6.3", - "resolved": "https://registry.npmjs.org/@jest/schemas/-/schemas-29.6.3.tgz", - "integrity": "sha512-mo5j5X+jIZmJQveBKeS/clAueipV7KgiX1vMgCxam1RNYiqE1w62n0/tJJnHtjW8ZHcQco5gY85jA3mi0L+nSA==", + "node_modules/@japa/runner/node_modules/@poppinss/utils": { + "version": "7.0.0-next.6", + "resolved": "https://registry.npmjs.org/@poppinss/utils/-/utils-7.0.0-next.6.tgz", + "integrity": "sha512-1OQDbCKmFROvWpmzvkQV/mCzBXSwhED8SJfJ0HiYKiLNEqYM8Kpa4EK0AfmXGQc+DdIj6eqib/vT8i5tJ2fatw==", "devOptional": true, "license": "MIT", "dependencies": { - "@sinclair/typebox": "^0.27.8" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + "@poppinss/exception": "^1.2.3", + "@poppinss/object-builder": "^1.1.0", + "@poppinss/string": "^1.7.1", + "@poppinss/types": "^1.2.1", + "flattie": "^1.1.1" } }, - "node_modules/@jest/types": { - "version": "25.5.0", - "resolved": "https://registry.npmjs.org/@jest/types/-/types-25.5.0.tgz", - "integrity": "sha512-OXD0RgQ86Tu3MazKo8bnrkDRaDXXMGUqd+kTtLtK1Zb7CRzQcaSRPPPV37SvYTdevXEBVxe0HXylEjs8ibkmCw==", - "dev": true, + "node_modules/@jest/diff-sequences": { + "version": "30.4.0", + "resolved": "https://registry.npmjs.org/@jest/diff-sequences/-/diff-sequences-30.4.0.tgz", + "integrity": "sha512-zOpzlfUs45l6u7jm39qr87JCHUDsaeCtvL+kQe/Vn9jSnRB4/5IPXISm0h9I1vZW/o00Kn4UTJ2MOlhnUGwv3g==", + "devOptional": true, "license": "MIT", - "dependencies": { - "@types/istanbul-lib-coverage": "^2.0.0", - "@types/istanbul-reports": "^1.1.1", - "@types/yargs": "^15.0.0", - "chalk": "^3.0.0" - }, "engines": { - "node": ">= 8.3" + "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" } }, - "node_modules/@jest/types/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, + "node_modules/@jest/get-type": { + "version": "30.1.0", + "resolved": "https://registry.npmjs.org/@jest/get-type/-/get-type-30.1.0.tgz", + "integrity": "sha512-eMbZE2hUnx1WV0pmURZY9XoXPkUYjpc55mb0CrhtdWLtzMQPFvu/rZkTLZFTsdaVQa+Tr4eWAteqcUzoawq/uA==", + "devOptional": true, "license": "MIT", - "dependencies": { - "color-convert": "^2.0.1" - }, "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" + "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" } }, - "node_modules/@jest/types/node_modules/chalk": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-3.0.0.tgz", - "integrity": "sha512-4D3B6Wf41KOYRFdszmDqMCGq5VV/uMAB273JILmO+3jAlh8X4qDtdtgCR3fxtbLEMzSx22QdhnDcJvu2u1fVwg==", - "dev": true, + "node_modules/@jest/schemas": { + "version": "30.4.1", + "resolved": "https://registry.npmjs.org/@jest/schemas/-/schemas-30.4.1.tgz", + "integrity": "sha512-i6b4qw5qnP8c5FEeBJg/uZQ4ddrkN6Ca8qISJh0pr7a5hfn3h3v5x60BEbOC7OYAGZNMs1LfFLwnW2CuK8F57Q==", + "devOptional": true, "license": "MIT", "dependencies": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" + "@sinclair/typebox": "^0.34.0" }, "engines": { - "node": ">=8" - } - }, - "node_modules/@jest/types/node_modules/color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "color-name": "~1.1.4" - }, - "engines": { - "node": ">=7.0.0" - } - }, - "node_modules/@jest/types/node_modules/color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "dev": true, - "license": "MIT" - }, - "node_modules/@jest/types/node_modules/supports-color": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", - "dev": true, - "license": "MIT", - "dependencies": { - "has-flag": "^4.0.0" - }, - "engines": { - "node": ">=8" + "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" } }, "node_modules/@jridgewell/gen-mapping": { - "version": "0.3.8", - "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.8.tgz", - "integrity": "sha512-imAbBGkb+ebQyxKgzv5Hu2nmROxoDOXHh80evxdoXNOrvAnVx7zimzc1Oo5h9RlfV4vPXaE2iM5pOFbvOCClWA==", + "version": "0.3.13", + "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.13.tgz", + "integrity": "sha512-2kkt/7niJ6MgEPxF0bYdQ6etZaA+fQvDcLKckhy1yIQOzaoKjBBjSj63/aLVjYE3qhRt5dvM+uUyfCg6UKCBbA==", "devOptional": true, "license": "MIT", "dependencies": { - "@jridgewell/set-array": "^1.2.1", - "@jridgewell/sourcemap-codec": "^1.4.10", + "@jridgewell/sourcemap-codec": "^1.5.0", + "@jridgewell/trace-mapping": "^0.3.24" + } + }, + "node_modules/@jridgewell/remapping": { + "version": "2.3.5", + "resolved": "https://registry.npmjs.org/@jridgewell/remapping/-/remapping-2.3.5.tgz", + "integrity": "sha512-LI9u/+laYG4Ds1TDKSJW2YPrIlcVYOwi2fUC6xB43lueCjgxV4lffOCZCtYFiH6TNOX+tQKXx97T4IKHbhyHEQ==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "@jridgewell/gen-mapping": "^0.3.5", "@jridgewell/trace-mapping": "^0.3.24" - }, - "engines": { - "node": ">=6.0.0" } }, "node_modules/@jridgewell/resolve-uri": { @@ -4212,37 +2217,28 @@ "node": ">=6.0.0" } }, - "node_modules/@jridgewell/set-array": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/@jridgewell/set-array/-/set-array-1.2.1.tgz", - "integrity": "sha512-R8gLRTZeyp03ymzP/6Lil/28tGeGEzhx1q2k703KGWRAI1VdvPIXdG70VJc2pAMw3NA6JKL5hhFu1sJX0Mnn/A==", - "devOptional": true, - "license": "MIT", - "engines": { - "node": ">=6.0.0" - } - }, "node_modules/@jridgewell/source-map": { - "version": "0.3.6", - "resolved": "https://registry.npmjs.org/@jridgewell/source-map/-/source-map-0.3.6.tgz", - "integrity": "sha512-1ZJTZebgqllO79ue2bm3rIGud/bOe0pP5BjSRCRxxYkEZS8STV7zN84UBbiYu7jy+eCKSnVIUgoWWE/tt+shMQ==", + "version": "0.3.11", + "resolved": "https://registry.npmjs.org/@jridgewell/source-map/-/source-map-0.3.11.tgz", + "integrity": "sha512-ZMp1V8ZFcPG5dIWnQLr3NSI1MiCU7UETdS/A0G8V/XWHvJv3ZsFqutJn1Y5RPmAPX6F3BiE397OqveU/9NCuIA==", "devOptional": true, "license": "MIT", + "peer": true, "dependencies": { "@jridgewell/gen-mapping": "^0.3.5", "@jridgewell/trace-mapping": "^0.3.25" } }, "node_modules/@jridgewell/sourcemap-codec": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.5.0.tgz", - "integrity": "sha512-gv3ZRaISU3fjPAgNsriBRqGWQL6quFx04YMPW/zD8XMLsU32mhCCbfbO6KZFLjvYpCZ8zyDEgqsgf+PwPaM7GQ==", + "version": "1.5.5", + "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.5.5.tgz", + "integrity": "sha512-cYQ9310grqxueWbl+WuIUIaiUaDcj7WOq5fVhEljNVgRfOUhY9fy2zTvfoqWsnebh8Sl70VScFbICvJnLKB0Og==", "license": "MIT" }, "node_modules/@jridgewell/trace-mapping": { - "version": "0.3.25", - "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.25.tgz", - "integrity": "sha512-vNk6aEwybGtawWmy/PzwnGDOjCkLWSD2wqvjGGAgOAwCGWySYXfYoxt00IJkTF+8Lb57DwOb3Aa0o9CApepiYQ==", + "version": "0.3.31", + "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.31.tgz", + "integrity": "sha512-zzNR+SdQSDJzc8joaeP8QQoCQr8NuYx2dIIytl1QeBEZHJ9uW6hebsrYgbz8hJwUQao3TWCMtmfV8Nu1twOLAw==", "devOptional": true, "license": "MIT", "dependencies": { @@ -4250,13 +2246,6 @@ "@jridgewell/sourcemap-codec": "^1.4.14" } }, - "node_modules/@jsdevtools/ono": { - "version": "7.1.3", - "resolved": "https://registry.npmjs.org/@jsdevtools/ono/-/ono-7.1.3.tgz", - "integrity": "sha512-4JQNk+3mVzK3xh2rqd6RB4J46qUR19azEHBneZyTZM+c456qOrbbM/5xcR8huNCCcbVt7+UmizG6GuUvPvKUYg==", - "dev": true, - "license": "MIT" - }, "node_modules/@jsonjoy.com/base64": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/@jsonjoy.com/base64/-/base64-1.1.2.tgz", @@ -4274,17 +2263,369 @@ "tslib": "2" } }, - "node_modules/@jsonjoy.com/json-pack": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/@jsonjoy.com/json-pack/-/json-pack-1.1.1.tgz", - "integrity": "sha512-osjeBqMJ2lb/j/M8NCPjs1ylqWIcTRTycIhVB5pt6LgzgeRSb0YRZ7j9RfA8wIUrsr/medIuhVyonXRZWLyfdw==", + "node_modules/@jsonjoy.com/buffers": { + "version": "17.67.0", + "resolved": "https://registry.npmjs.org/@jsonjoy.com/buffers/-/buffers-17.67.0.tgz", + "integrity": "sha512-tfExRpYxBvi32vPs9ZHaTjSP4fHAfzSmcahOfNxtvGHcyJel+aibkPlGeBB+7AoC6hL7lXIE++8okecBxx7lcw==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": ">=10.0" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/streamich" + }, + "peerDependencies": { + "tslib": "2" + } + }, + "node_modules/@jsonjoy.com/codegen": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/@jsonjoy.com/codegen/-/codegen-1.0.0.tgz", + "integrity": "sha512-E8Oy+08cmCf0EK/NMxpaJZmOxPqM+6iSe2S4nlSBrPZOORoDJILxtbSUEDKQyTamm/BVAhIGllOBNU79/dwf0g==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": ">=10.0" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/streamich" + }, + "peerDependencies": { + "tslib": "2" + } + }, + "node_modules/@jsonjoy.com/fs-core": { + "version": "4.57.6", + "resolved": "https://registry.npmjs.org/@jsonjoy.com/fs-core/-/fs-core-4.57.6.tgz", + "integrity": "sha512-uI++Wx6VkBJqVmkb4ZeExwAVpZiA2Do5NrEtXoDk0Pdvce3ytFXJoviT1sLOj16+qDIMnD5nWPfOhVpnDmRJKg==", "dev": true, "license": "Apache-2.0", "dependencies": { - "@jsonjoy.com/base64": "^1.1.1", - "@jsonjoy.com/util": "^1.1.2", + "@jsonjoy.com/fs-node-builtins": "4.57.6", + "@jsonjoy.com/fs-node-utils": "4.57.6", + "thingies": "^2.5.0" + }, + "engines": { + "node": ">=10.0" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/streamich" + }, + "peerDependencies": { + "tslib": "2" + } + }, + "node_modules/@jsonjoy.com/fs-fsa": { + "version": "4.57.6", + "resolved": "https://registry.npmjs.org/@jsonjoy.com/fs-fsa/-/fs-fsa-4.57.6.tgz", + "integrity": "sha512-pKkw/yC5CzSZKhIIUIsH1przOa+K5jGmZIg1sWaSF24JojyrUFbjcQv7QrcGAudriei6HQ6R0BFj+V8NbQinJw==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@jsonjoy.com/fs-core": "4.57.6", + "@jsonjoy.com/fs-node-builtins": "4.57.6", + "@jsonjoy.com/fs-node-utils": "4.57.6", + "thingies": "^2.5.0" + }, + "engines": { + "node": ">=10.0" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/streamich" + }, + "peerDependencies": { + "tslib": "2" + } + }, + "node_modules/@jsonjoy.com/fs-node": { + "version": "4.57.6", + "resolved": "https://registry.npmjs.org/@jsonjoy.com/fs-node/-/fs-node-4.57.6.tgz", + "integrity": "sha512-Kbn1jdkvDN4F2+BhoB6mMu7NCbhP0bgA5NcI1aJj/Q5UcU+I1JLLW+dEQean33iV4tXv35AzBVKPICnDltBpxw==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@jsonjoy.com/fs-core": "4.57.6", + "@jsonjoy.com/fs-node-builtins": "4.57.6", + "@jsonjoy.com/fs-node-utils": "4.57.6", + "@jsonjoy.com/fs-print": "4.57.6", + "@jsonjoy.com/fs-snapshot": "4.57.6", + "glob-to-regex.js": "^1.0.0", + "thingies": "^2.5.0" + }, + "engines": { + "node": ">=10.0" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/streamich" + }, + "peerDependencies": { + "tslib": "2" + } + }, + "node_modules/@jsonjoy.com/fs-node-builtins": { + "version": "4.57.6", + "resolved": "https://registry.npmjs.org/@jsonjoy.com/fs-node-builtins/-/fs-node-builtins-4.57.6.tgz", + "integrity": "sha512-V4DgEFT3Cg5S9fCMOZSCVdTxdJWWLBO0WnAazV7hnCM96u5zXHyW/ubDAfcSVwqjkMJ50W1Y44IXtxRoIwaCVg==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": ">=10.0" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/streamich" + }, + "peerDependencies": { + "tslib": "2" + } + }, + "node_modules/@jsonjoy.com/fs-node-to-fsa": { + "version": "4.57.6", + "resolved": "https://registry.npmjs.org/@jsonjoy.com/fs-node-to-fsa/-/fs-node-to-fsa-4.57.6.tgz", + "integrity": "sha512-+JptNw3iifihxH2rEXrninDzX4FFVW8JD/wPR8GbJPAeL9CQUSblrlumOPB5gZuS7tYRX+PJPLtT7XzKoRhv/Q==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@jsonjoy.com/fs-fsa": "4.57.6", + "@jsonjoy.com/fs-node-builtins": "4.57.6", + "@jsonjoy.com/fs-node-utils": "4.57.6" + }, + "engines": { + "node": ">=10.0" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/streamich" + }, + "peerDependencies": { + "tslib": "2" + } + }, + "node_modules/@jsonjoy.com/fs-node-utils": { + "version": "4.57.6", + "resolved": "https://registry.npmjs.org/@jsonjoy.com/fs-node-utils/-/fs-node-utils-4.57.6.tgz", + "integrity": "sha512-foyUrfS7WmYEUzqYXSNxmJBcSj04TABrkpFabwO9SCDCpVCfJ+qG+2sk5FjfiflG2n0SDFZDCJ6vYlJAEpxJFg==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@jsonjoy.com/fs-node-builtins": "4.57.6" + }, + "engines": { + "node": ">=10.0" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/streamich" + }, + "peerDependencies": { + "tslib": "2" + } + }, + "node_modules/@jsonjoy.com/fs-print": { + "version": "4.57.6", + "resolved": "https://registry.npmjs.org/@jsonjoy.com/fs-print/-/fs-print-4.57.6.tgz", + "integrity": "sha512-96eAn4Dudtt67LTeuU47yUD+pg9/G/oKpI10zei9ljk3X3WK4lYKc+n3cpaPCAbKPzoyfxl0mXm8f8Y7BOSFXw==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@jsonjoy.com/fs-node-utils": "4.57.6", + "tree-dump": "^1.1.0" + }, + "engines": { + "node": ">=10.0" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/streamich" + }, + "peerDependencies": { + "tslib": "2" + } + }, + "node_modules/@jsonjoy.com/fs-snapshot": { + "version": "4.57.6", + "resolved": "https://registry.npmjs.org/@jsonjoy.com/fs-snapshot/-/fs-snapshot-4.57.6.tgz", + "integrity": "sha512-V57CMzbOgTzUWGOWQ8GzHQdpJP6JnrYVNCtTBNxVYEnlVRvo4uEJqHhtAT8vhDFrIuJOXLrTL1Fki4h5oI7xxg==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@jsonjoy.com/buffers": "^17.65.0", + "@jsonjoy.com/fs-node-utils": "4.57.6", + "@jsonjoy.com/json-pack": "^17.65.0", + "@jsonjoy.com/util": "^17.65.0" + }, + "engines": { + "node": ">=10.0" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/streamich" + }, + "peerDependencies": { + "tslib": "2" + } + }, + "node_modules/@jsonjoy.com/fs-snapshot/node_modules/@jsonjoy.com/base64": { + "version": "17.67.0", + "resolved": "https://registry.npmjs.org/@jsonjoy.com/base64/-/base64-17.67.0.tgz", + "integrity": "sha512-5SEsJGsm15aP8TQGkDfJvz9axgPwAEm98S5DxOuYe8e1EbfajcDmgeXXzccEjh+mLnjqEKrkBdjHWS5vFNwDdw==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": ">=10.0" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/streamich" + }, + "peerDependencies": { + "tslib": "2" + } + }, + "node_modules/@jsonjoy.com/fs-snapshot/node_modules/@jsonjoy.com/codegen": { + "version": "17.67.0", + "resolved": "https://registry.npmjs.org/@jsonjoy.com/codegen/-/codegen-17.67.0.tgz", + "integrity": "sha512-idnkUplROpdBOV0HMcwhsCUS5TRUi9poagdGs70A6S4ux9+/aPuKbh8+UYRTLYQHtXvAdNfQWXDqZEx5k4Dj2Q==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": ">=10.0" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/streamich" + }, + "peerDependencies": { + "tslib": "2" + } + }, + "node_modules/@jsonjoy.com/fs-snapshot/node_modules/@jsonjoy.com/json-pack": { + "version": "17.67.0", + "resolved": "https://registry.npmjs.org/@jsonjoy.com/json-pack/-/json-pack-17.67.0.tgz", + "integrity": "sha512-t0ejURcGaZsn1ClbJ/3kFqSOjlryd92eQY465IYrezsXmPcfHPE/av4twRSxf6WE+TkZgLY+71vCZbiIiFKA/w==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@jsonjoy.com/base64": "17.67.0", + "@jsonjoy.com/buffers": "17.67.0", + "@jsonjoy.com/codegen": "17.67.0", + "@jsonjoy.com/json-pointer": "17.67.0", + "@jsonjoy.com/util": "17.67.0", "hyperdyperid": "^1.2.0", - "thingies": "^1.20.0" + "thingies": "^2.5.0", + "tree-dump": "^1.1.0" + }, + "engines": { + "node": ">=10.0" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/streamich" + }, + "peerDependencies": { + "tslib": "2" + } + }, + "node_modules/@jsonjoy.com/fs-snapshot/node_modules/@jsonjoy.com/json-pointer": { + "version": "17.67.0", + "resolved": "https://registry.npmjs.org/@jsonjoy.com/json-pointer/-/json-pointer-17.67.0.tgz", + "integrity": "sha512-+iqOFInH+QZGmSuaybBUNdh7yvNrXvqR+h3wjXm0N/3JK1EyyFAeGJvqnmQL61d1ARLlk/wJdFKSL+LHJ1eaUA==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@jsonjoy.com/util": "17.67.0" + }, + "engines": { + "node": ">=10.0" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/streamich" + }, + "peerDependencies": { + "tslib": "2" + } + }, + "node_modules/@jsonjoy.com/fs-snapshot/node_modules/@jsonjoy.com/util": { + "version": "17.67.0", + "resolved": "https://registry.npmjs.org/@jsonjoy.com/util/-/util-17.67.0.tgz", + "integrity": "sha512-6+8xBaz1rLSohlGh68D1pdw3AwDi9xydm8QNlAFkvnavCJYSze+pxoW2VKP8p308jtlMRLs5NTHfPlZLd4w7ew==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@jsonjoy.com/buffers": "17.67.0", + "@jsonjoy.com/codegen": "17.67.0" + }, + "engines": { + "node": ">=10.0" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/streamich" + }, + "peerDependencies": { + "tslib": "2" + } + }, + "node_modules/@jsonjoy.com/json-pack": { + "version": "1.21.0", + "resolved": "https://registry.npmjs.org/@jsonjoy.com/json-pack/-/json-pack-1.21.0.tgz", + "integrity": "sha512-+AKG+R2cfZMShzrF2uQw34v3zbeDYUqnQ+jg7ORic3BGtfw9p/+N6RJbq/kkV8JmYZaINknaEQ2m0/f693ZPpg==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@jsonjoy.com/base64": "^1.1.2", + "@jsonjoy.com/buffers": "^1.2.0", + "@jsonjoy.com/codegen": "^1.0.0", + "@jsonjoy.com/json-pointer": "^1.0.2", + "@jsonjoy.com/util": "^1.9.0", + "hyperdyperid": "^1.2.0", + "thingies": "^2.5.0", + "tree-dump": "^1.1.0" + }, + "engines": { + "node": ">=10.0" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/streamich" + }, + "peerDependencies": { + "tslib": "2" + } + }, + "node_modules/@jsonjoy.com/json-pack/node_modules/@jsonjoy.com/buffers": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/@jsonjoy.com/buffers/-/buffers-1.2.1.tgz", + "integrity": "sha512-12cdlDwX4RUM3QxmUbVJWqZ/mrK6dFQH4Zxq6+r1YXKXYBNgZXndx2qbCJwh3+WWkCSn67IjnlG3XYTvmvYtgA==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": ">=10.0" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/streamich" + }, + "peerDependencies": { + "tslib": "2" + } + }, + "node_modules/@jsonjoy.com/json-pointer": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/@jsonjoy.com/json-pointer/-/json-pointer-1.0.2.tgz", + "integrity": "sha512-Fsn6wM2zlDzY1U+v4Nc8bo3bVqgfNTGcn6dMgs6FjrEnt4ZCe60o6ByKRjOGlI2gow0aE/Q41QOigdTqkyK5fg==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@jsonjoy.com/codegen": "^1.0.0", + "@jsonjoy.com/util": "^1.9.0" }, "engines": { "node": ">=10.0" @@ -4298,9 +2639,30 @@ } }, "node_modules/@jsonjoy.com/util": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/@jsonjoy.com/util/-/util-1.5.0.tgz", - "integrity": "sha512-ojoNsrIuPI9g6o8UxhraZQSyF2ByJanAY4cTFbc8Mf2AXEF4aQRGY1dJxyJpuyav8r9FGflEt/Ff3u5Nt6YMPA==", + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/@jsonjoy.com/util/-/util-1.9.0.tgz", + "integrity": "sha512-pLuQo+VPRnN8hfPqUTLTHk126wuYdXVxE6aDmjSeV4NCAgyxWbiOIeNJVtID3h1Vzpoi9m4jXezf73I6LgabgQ==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@jsonjoy.com/buffers": "^1.0.0", + "@jsonjoy.com/codegen": "^1.0.0" + }, + "engines": { + "node": ">=10.0" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/streamich" + }, + "peerDependencies": { + "tslib": "2" + } + }, + "node_modules/@jsonjoy.com/util/node_modules/@jsonjoy.com/buffers": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/@jsonjoy.com/buffers/-/buffers-1.2.1.tgz", + "integrity": "sha512-12cdlDwX4RUM3QxmUbVJWqZ/mrK6dFQH4Zxq6+r1YXKXYBNgZXndx2qbCJwh3+WWkCSn67IjnlG3XYTvmvYtgA==", "dev": true, "license": "Apache-2.0", "engines": { @@ -4314,6 +2676,21 @@ "tslib": "2" } }, + "node_modules/@kdf/salt": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/@kdf/salt/-/salt-2.0.1.tgz", + "integrity": "sha512-1RBY7HcGYuWBm0+4ygjdRerN+mhpuT5picGB6+azqUXsz/IZljegrKkeHRiV6wuxY8n4HrxOuw8ou7JuGxRWdQ==", + "license": "MIT", + "engines": { + "node": ">=10" + } + }, + "node_modules/@keyv/serialize": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/@keyv/serialize/-/serialize-1.1.1.tgz", + "integrity": "sha512-dXn3FZhPv0US+7dtJsIi2R+c7qWYiReoEh5zUntWCf4oSpMNib8FDhSoed6m3QyZdx5hK7iLFkYk3rNxwt8vTA==", + "license": "MIT" + }, "node_modules/@kurkle/color": { "version": "0.3.4", "resolved": "https://registry.npmjs.org/@kurkle/color/-/color-0.3.4.tgz", @@ -4328,15 +2705,6 @@ "dev": true, "license": "MIT" }, - "node_modules/@lukeed/ms": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/@lukeed/ms/-/ms-2.0.2.tgz", - "integrity": "sha512-9I2Zn6+NJLfaGoz9jN3lpwDgAYvfGeNYdbAIjJOqzs4Tpc+VU3Jqq4IofSUBKajiDS8k9fZIg18/z13mpk1bsA==", - "license": "MIT", - "engines": { - "node": ">=8" - } - }, "node_modules/@mapbox/node-pre-gyp": { "version": "1.0.11", "resolved": "https://registry.npmjs.org/@mapbox/node-pre-gyp/-/node-pre-gyp-1.0.11.tgz", @@ -4357,6 +2725,18 @@ "node-pre-gyp": "bin/node-pre-gyp" } }, + "node_modules/@mapbox/node-pre-gyp/node_modules/semver": { + "version": "7.8.2", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.8.2.tgz", + "integrity": "sha512-c8jsqUZm3omBOI66G90z1Dyw5z622G8oLG+omfsHBJf3CWQTlOcwOjvOG6wtiNfW6anKm/eA39LMwMtMez2TiQ==", + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, "node_modules/@mdi/js": { "version": "7.4.47", "resolved": "https://registry.npmjs.org/@mdi/js/-/js-7.4.47.tgz", @@ -4365,9 +2745,9 @@ "license": "Apache-2.0" }, "node_modules/@noble/hashes": { - "version": "1.7.0", - "resolved": "https://registry.npmjs.org/@noble/hashes/-/hashes-1.7.0.tgz", - "integrity": "sha512-HXydb0DgzTpDPwbVeDGCG1gIu7X6+AuU6Zl6av/E/KG8LMsvPntvq+w17CHRpKBmN6Ybdrt1eP3k4cj8DJa78w==", + "version": "1.8.0", + "resolved": "https://registry.npmjs.org/@noble/hashes/-/hashes-1.8.0.tgz", + "integrity": "sha512-jCs9ldd7NwzpgXDIf6P3+NrHh9/sD6CQdxHyjQI+h/6rDNo88ypBxxz45UDuZHz9r3tNz7N/VInSVoVdtXEI4A==", "license": "MIT", "engines": { "node": "^14.21.3 || >=16" @@ -4414,110 +2794,58 @@ "node": ">= 8" } }, - "node_modules/@nuxt/friendly-errors-webpack-plugin": { - "version": "2.6.0", - "resolved": "https://registry.npmjs.org/@nuxt/friendly-errors-webpack-plugin/-/friendly-errors-webpack-plugin-2.6.0.tgz", - "integrity": "sha512-3IZj6MXbzlvUxDncAxgBMLQwGPY/JlNhy2i+AGyOHCAReR5HcBxYjVRBvyaKM9R3s5k4OODYKeHAbrToZH/47w==", - "dev": true, - "license": "MIT", - "dependencies": { - "chalk": "^2.4.2", - "consola": "^3.2.3", - "error-stack-parser": "^2.1.4", - "string-width": "^4.2.3" - }, - "engines": { - "node": ">=14.18.0", - "npm": ">=5.0.0" - }, - "peerDependencies": { - "webpack": "^2.0.0 || ^3.0.0 || ^4.0.0 || ^5.0.0" - } - }, - "node_modules/@nuxt/friendly-errors-webpack-plugin/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, - "license": "MIT" - }, - "node_modules/@nuxt/friendly-errors-webpack-plugin/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, - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/@nuxt/friendly-errors-webpack-plugin/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, - "license": "MIT", - "dependencies": { - "emoji-regex": "^8.0.0", - "is-fullwidth-code-point": "^3.0.0", - "strip-ansi": "^6.0.1" - }, - "engines": { - "node": ">=8" - } - }, "node_modules/@oozcitak/dom": { - "version": "1.15.10", - "resolved": "https://registry.npmjs.org/@oozcitak/dom/-/dom-1.15.10.tgz", - "integrity": "sha512-0JT29/LaxVgRcGKvHmSrUTEvZ8BXvZhGl2LASRUgHqDTC1M5g1pLmVv56IYNyt3bG2CUjDkc67wnyZC14pbQrQ==", + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/@oozcitak/dom/-/dom-2.0.2.tgz", + "integrity": "sha512-GjpKhkSYC3Mj4+lfwEyI1dqnsKTgwGy48ytZEhm4A/xnH/8z9M3ZVXKr/YGQi3uCLs1AEBS+x5T2JPiueEDW8w==", "license": "MIT", "dependencies": { - "@oozcitak/infra": "1.0.8", - "@oozcitak/url": "1.0.4", - "@oozcitak/util": "8.3.8" + "@oozcitak/infra": "^2.0.2", + "@oozcitak/url": "^3.0.0", + "@oozcitak/util": "^10.0.0" }, "engines": { - "node": ">=8.0" + "node": ">=20.0" } }, "node_modules/@oozcitak/infra": { - "version": "1.0.8", - "resolved": "https://registry.npmjs.org/@oozcitak/infra/-/infra-1.0.8.tgz", - "integrity": "sha512-JRAUc9VR6IGHOL7OGF+yrvs0LO8SlqGnPAMqyzOuFZPSZSXI7Xf2O9+awQPSMXgIWGtgUf/dA6Hs6X6ySEaWTg==", + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/@oozcitak/infra/-/infra-2.0.2.tgz", + "integrity": "sha512-2g+E7hoE2dgCz/APPOEK5s3rMhJvNxSMBrP+U+j1OWsIbtSpWxxlUjq1lU8RIsFJNYv7NMlnVsCuHcUzJW+8vA==", "license": "MIT", "dependencies": { - "@oozcitak/util": "8.3.8" + "@oozcitak/util": "^10.0.0" }, "engines": { - "node": ">=6.0" + "node": ">=20.0" } }, "node_modules/@oozcitak/url": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/@oozcitak/url/-/url-1.0.4.tgz", - "integrity": "sha512-kDcD8y+y3FCSOvnBI6HJgl00viO/nGbQoCINmQ0h98OhnGITrWR3bOGfwYCthgcrV8AnTJz8MzslTQbC3SOAmw==", + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/@oozcitak/url/-/url-3.0.0.tgz", + "integrity": "sha512-ZKfET8Ak1wsLAiLWNfFkZc/BraDccuTJKR6svTYc7sVjbR+Iu0vtXdiDMY4o6jaFl5TW2TlS7jbLl4VovtAJWQ==", "license": "MIT", "dependencies": { - "@oozcitak/infra": "1.0.8", - "@oozcitak/util": "8.3.8" + "@oozcitak/infra": "^2.0.2", + "@oozcitak/util": "^10.0.0" }, "engines": { - "node": ">=8.0" + "node": ">=20.0" } }, "node_modules/@oozcitak/util": { - "version": "8.3.8", - "resolved": "https://registry.npmjs.org/@oozcitak/util/-/util-8.3.8.tgz", - "integrity": "sha512-T8TbSnGsxo6TDBJx/Sgv/BlVJL3tshxZP7Aq5R1mSnM5OcHY2dQaxLMu2+E8u3gN0MLOzdjurqN4ZRVuzQycOQ==", + "version": "10.0.0", + "resolved": "https://registry.npmjs.org/@oozcitak/util/-/util-10.0.0.tgz", + "integrity": "sha512-hAX0pT/73190NLqBPPWSdBVGtbY6VOhWYK3qqHqtXQ1gK7kS2yz4+ivsN07hpJ6I3aeMtKP6J6npsEKOAzuTLA==", "license": "MIT", "engines": { - "node": ">=8.0" + "node": ">=20.0" } }, "node_modules/@opensearch-project/opensearch": { - "version": "2.13.0", - "resolved": "https://registry.npmjs.org/@opensearch-project/opensearch/-/opensearch-2.13.0.tgz", - "integrity": "sha512-Bu3jJ7pKzumbMMeefu7/npAWAvFu5W9SlbBow1ulhluqUpqc7QoXe0KidDrMy7Dy3BQrkI6llR3cWL4lQTZOFw==", + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/@opensearch-project/opensearch/-/opensearch-3.6.0.tgz", + "integrity": "sha512-ow1A/Z7MBlNL/JZzTY4+M+8psiVh66g0Z7EQSl/qbT0U6zLBsVDYh6nvm8D4e4tIzQtn6ODbA2OsqYGvqZj76g==", "license": "Apache-2.0", "dependencies": { "aws4": "^1.11.0", @@ -4528,19 +2856,188 @@ "secure-json-parse": "^2.4.0" }, "engines": { - "node": ">=10", + "node": ">=14", "yarn": "^1.22.10" } }, "node_modules/@paralleldrive/cuid2": { - "version": "2.2.2", - "resolved": "https://registry.npmjs.org/@paralleldrive/cuid2/-/cuid2-2.2.2.tgz", - "integrity": "sha512-ZOBkgDwEdoYVlSeRbYYXs0S9MejQofiVYoTbKzy/6GQa39/q5tQU2IX46+shYnUkpEl3wc+J6wRlar7r2EK2xA==", + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/@paralleldrive/cuid2/-/cuid2-2.3.1.tgz", + "integrity": "sha512-XO7cAxhnTZl0Yggq6jOgjiOHhbgcO4NqFqwSmQpjK3b6TEE6Uj/jfSk6wzYyemh3+I0sHirKSetjQwn5cZktFw==", "license": "MIT", "dependencies": { "@noble/hashes": "^1.1.5" } }, + "node_modules/@peculiar/asn1-cms": { + "version": "2.7.0", + "resolved": "https://registry.npmjs.org/@peculiar/asn1-cms/-/asn1-cms-2.7.0.tgz", + "integrity": "sha512-hew63shtzzvBcSHbhm+cyAmKe6AIfinT9hzEqSPjDC6opTTMKmTkQ0gHuN2KsWlvqiKw1S/fS94fhag/FJkioQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@peculiar/asn1-schema": "^2.7.0", + "@peculiar/asn1-x509": "^2.7.0", + "@peculiar/asn1-x509-attr": "^2.7.0", + "asn1js": "^3.0.6", + "tslib": "^2.8.1" + } + }, + "node_modules/@peculiar/asn1-csr": { + "version": "2.7.0", + "resolved": "https://registry.npmjs.org/@peculiar/asn1-csr/-/asn1-csr-2.7.0.tgz", + "integrity": "sha512-VVsAyGqErT9D1SY4aEqozThXMVI+ssVRiv2DDeYuvpBKLIgZ3hYs3Ay3u/VSoKq6ESFi9cf6rf3IOOzfwh7oMA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@peculiar/asn1-schema": "^2.7.0", + "@peculiar/asn1-x509": "^2.7.0", + "asn1js": "^3.0.6", + "tslib": "^2.8.1" + } + }, + "node_modules/@peculiar/asn1-ecc": { + "version": "2.7.0", + "resolved": "https://registry.npmjs.org/@peculiar/asn1-ecc/-/asn1-ecc-2.7.0.tgz", + "integrity": "sha512-n7KEs/Q/wrB415cxy4fHOBhegp4NdJ15fkJPwcB/3/8iNBQC2L/N7SChJPKDJPZGYH0jD4Tg4/0vnHmwghnbKw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@peculiar/asn1-schema": "^2.7.0", + "@peculiar/asn1-x509": "^2.7.0", + "asn1js": "^3.0.6", + "tslib": "^2.8.1" + } + }, + "node_modules/@peculiar/asn1-pfx": { + "version": "2.7.0", + "resolved": "https://registry.npmjs.org/@peculiar/asn1-pfx/-/asn1-pfx-2.7.0.tgz", + "integrity": "sha512-V/nrlQVmhg7lYAsM7E13UDL5erAwFv6kCIVFqNaMIHSVi7dngcT839JkRTkQBqznMG98l2XjxYk74ZztAohZzA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@peculiar/asn1-cms": "^2.7.0", + "@peculiar/asn1-pkcs8": "^2.7.0", + "@peculiar/asn1-rsa": "^2.7.0", + "@peculiar/asn1-schema": "^2.7.0", + "asn1js": "^3.0.6", + "tslib": "^2.8.1" + } + }, + "node_modules/@peculiar/asn1-pkcs8": { + "version": "2.7.0", + "resolved": "https://registry.npmjs.org/@peculiar/asn1-pkcs8/-/asn1-pkcs8-2.7.0.tgz", + "integrity": "sha512-9GTl1nE8Mx1kTZ+7QyYatDyKsm34QcWRBFkY1iPvWC3X4Dona5s/tlLiQsx5WzVdZqiMBZNYT0buyw4/vbhnjw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@peculiar/asn1-schema": "^2.7.0", + "@peculiar/asn1-x509": "^2.7.0", + "asn1js": "^3.0.6", + "tslib": "^2.8.1" + } + }, + "node_modules/@peculiar/asn1-pkcs9": { + "version": "2.7.0", + "resolved": "https://registry.npmjs.org/@peculiar/asn1-pkcs9/-/asn1-pkcs9-2.7.0.tgz", + "integrity": "sha512-Bh7m+OuIaSEllPQcSd9OSp93F4ROWH7sbITWV8MI+8dwsjE5111/87VxiWVvYFKyww3vp39geLv9ENqhwWHcew==", + "dev": true, + "license": "MIT", + "dependencies": { + "@peculiar/asn1-cms": "^2.7.0", + "@peculiar/asn1-pfx": "^2.7.0", + "@peculiar/asn1-pkcs8": "^2.7.0", + "@peculiar/asn1-schema": "^2.7.0", + "@peculiar/asn1-x509": "^2.7.0", + "@peculiar/asn1-x509-attr": "^2.7.0", + "asn1js": "^3.0.6", + "tslib": "^2.8.1" + } + }, + "node_modules/@peculiar/asn1-rsa": { + "version": "2.7.0", + "resolved": "https://registry.npmjs.org/@peculiar/asn1-rsa/-/asn1-rsa-2.7.0.tgz", + "integrity": "sha512-/qvENQrXyTZURjMqSeofHul0JJt2sNSzSwk36pl2olkHbaioMQgrASDZAlHXl0xUlnVbHj0uGgOrBMTb5x2aJQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@peculiar/asn1-schema": "^2.7.0", + "@peculiar/asn1-x509": "^2.7.0", + "asn1js": "^3.0.6", + "tslib": "^2.8.1" + } + }, + "node_modules/@peculiar/asn1-schema": { + "version": "2.7.0", + "resolved": "https://registry.npmjs.org/@peculiar/asn1-schema/-/asn1-schema-2.7.0.tgz", + "integrity": "sha512-W8ZfWzLmQnrcky+eh3tni4IozMdqBDiHWU0N+vve/UGjMaUs8c0L7A2oEdkBXS8rTpWDpK/aoI3DG/L/hxmxPg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@peculiar/utils": "^2.0.2", + "asn1js": "^3.0.6", + "tslib": "^2.8.1" + } + }, + "node_modules/@peculiar/asn1-x509": { + "version": "2.7.0", + "resolved": "https://registry.npmjs.org/@peculiar/asn1-x509/-/asn1-x509-2.7.0.tgz", + "integrity": "sha512-mUn9RRrkGDnG4ALfunDmzyRW5dg+sWCj/pfnCCqEHYbkGxEpvUt6iVJv8Yw1cyp6SWZ26ZE5oSmI5SqEaen15g==", + "dev": true, + "license": "MIT", + "dependencies": { + "@peculiar/asn1-schema": "^2.7.0", + "@peculiar/utils": "^2.0.2", + "asn1js": "^3.0.6", + "tslib": "^2.8.1" + } + }, + "node_modules/@peculiar/asn1-x509-attr": { + "version": "2.7.0", + "resolved": "https://registry.npmjs.org/@peculiar/asn1-x509-attr/-/asn1-x509-attr-2.7.0.tgz", + "integrity": "sha512-NS8e7SOgXipkzUPLF/sce7ukpMpWjhxYsH0n6Y+bHYo4TTxOb95Zv7hqwSuL212mj5YxovjdOKQOgH1As3E94w==", + "dev": true, + "license": "MIT", + "dependencies": { + "@peculiar/asn1-schema": "^2.7.0", + "@peculiar/asn1-x509": "^2.7.0", + "asn1js": "^3.0.6", + "tslib": "^2.8.1" + } + }, + "node_modules/@peculiar/utils": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/@peculiar/utils/-/utils-2.0.3.tgz", + "integrity": "sha512-+oL3HPFRIZ1St2K50lWCXiioIgSoxzz7R1J3uF6neO2yl1sgmpgY6XXJH4BdpoDkMWznQTeYF6oWNDZLCdQ4eQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "tslib": "^2.8.1" + } + }, + "node_modules/@peculiar/x509": { + "version": "1.14.3", + "resolved": "https://registry.npmjs.org/@peculiar/x509/-/x509-1.14.3.tgz", + "integrity": "sha512-C2Xj8FZ0uHWeCXXqX5B4/gVFQmtSkiuOolzAgutjTfseNOHT3pUjljDZsTSxXFGgio54bCzVFqmEOUrIVk8RDA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@peculiar/asn1-cms": "^2.6.0", + "@peculiar/asn1-csr": "^2.6.0", + "@peculiar/asn1-ecc": "^2.6.0", + "@peculiar/asn1-pkcs9": "^2.6.0", + "@peculiar/asn1-rsa": "^2.6.0", + "@peculiar/asn1-schema": "^2.6.0", + "@peculiar/asn1-x509": "^2.6.0", + "pvtsutils": "^1.3.6", + "reflect-metadata": "^0.2.2", + "tslib": "^2.8.1", + "tsyringe": "^4.10.0" + }, + "engines": { + "node": ">=20.0.0" + } + }, "node_modules/@phc/format": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/@phc/format/-/format-1.0.0.tgz", @@ -4550,40 +3047,35 @@ "node": ">=10" } }, - "node_modules/@pkgjs/parseargs": { - "version": "0.11.0", - "resolved": "https://registry.npmjs.org/@pkgjs/parseargs/-/parseargs-0.11.0.tgz", - "integrity": "sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg==", - "dev": true, - "license": "MIT", - "optional": true, - "engines": { - "node": ">=14" - } + "node_modules/@pinojs/redact": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/@pinojs/redact/-/redact-0.4.0.tgz", + "integrity": "sha512-k2ENnmBugE/rzQfEcdWHcCY+/FM3VLzH9cYEsbdsoqrvzAKRhUZeRNhAZvB8OitQJ1TBed3yqWtdjzS6wJKBwg==", + "license": "MIT" }, "node_modules/@pkgr/core": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/@pkgr/core/-/core-0.1.1.tgz", - "integrity": "sha512-cq8o4cWH0ibXh9VGi5P20Tu9XF/0fFXl9EUinr9QfTM7a7p0oTA4iJRCQWppXR1Pg8dSM0UCItCkPwsk9qWWYA==", + "version": "0.3.6", + "resolved": "https://registry.npmjs.org/@pkgr/core/-/core-0.3.6.tgz", + "integrity": "sha512-SEeaJLb3qBNF/OaXnaR1NmmBbFYk1zC0ZH/52fATcRPLFg/p791YrcyFFy44Bo9sLaGuSuLp5Q6axbb/O+v/RA==", "dev": true, "license": "MIT", "engines": { - "node": "^12.20.0 || ^14.18.0 || >=16.0.0" + "node": "^14.18.0 || >=16.0.0" }, "funding": { - "url": "https://opencollective.com/unts" + "url": "https://opencollective.com/pkgr" } }, "node_modules/@poppinss/chokidar-ts": { - "version": "4.1.5", - "resolved": "https://registry.npmjs.org/@poppinss/chokidar-ts/-/chokidar-ts-4.1.5.tgz", - "integrity": "sha512-V8QtYZZMTbpv9aMX/agZSssIVfig7HK2s9grUqs6x221PEB/YirYtasj6g0Jx1o+yg7D38Y9kKPmL7d9MgeXBw==", + "version": "4.1.9", + "resolved": "https://registry.npmjs.org/@poppinss/chokidar-ts/-/chokidar-ts-4.1.9.tgz", + "integrity": "sha512-Nl4JAb5dvwmZhXElSuiuHy4YkB7YFql/AE2tTu9TyJCfPnUrcwm2iMTUZVa+aGz+bolRPuPNKsuypxN59gBvQQ==", "devOptional": true, "license": "MIT", "dependencies": { "chokidar": "^4.0.3", - "emittery": "^1.0.3", - "memoize": "^10.0.0", + "emittery": "^1.1.0", + "memoize": "^10.1.0", "picomatch": "^4.0.2", "slash": "^5.1.0" }, @@ -4591,103 +3083,100 @@ "node": ">=18.16.0" }, "peerDependencies": { - "typescript": "^4.0.0 || ^5.0.0" + "typescript": "^5.0.0" } }, "node_modules/@poppinss/cliui": { - "version": "6.4.2", - "resolved": "https://registry.npmjs.org/@poppinss/cliui/-/cliui-6.4.2.tgz", - "integrity": "sha512-+zx32scWjFUReNAzi75/QBwTiQrQ70a3khF5TNnyJVA8V2I9wTRPBLPdLWt83E5m1nTufoilF2MI7UBALkFH1Q==", + "version": "6.8.1", + "resolved": "https://registry.npmjs.org/@poppinss/cliui/-/cliui-6.8.1.tgz", + "integrity": "sha512-o/ssbwr+r6woG65rk9eFHnn9dVUphZr/Rk+4+05ENVMBWYpYhTJGdE9RobTG5JLFubvO4gWIyFeNlC+I4EM6eA==", "license": "MIT", "dependencies": { - "@poppinss/colors": "^4.1.4", + "@poppinss/colors": "^4.1.6", "cli-boxes": "^4.0.1", "cli-table3": "^0.6.5", - "cli-truncate": "^4.0.0", - "log-update": "^6.1.0", + "cli-truncate": "^5.2.0", + "log-update": "^7.2.0", "pretty-hrtime": "^1.0.3", - "string-width": "^7.2.0", - "supports-color": "^10.0.0", - "terminal-size": "^4.0.0", - "wordwrap": "^1.0.0" - }, - "engines": { - "node": ">=18.16.0" + "string-width": "^8.2.0", + "supports-color": "^10.2.2", + "terminal-size": "^4.0.1" } }, - "node_modules/@poppinss/cliui/node_modules/supports-color": { - "version": "10.0.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-10.0.0.tgz", - "integrity": "sha512-HRVVSbCCMbj7/kdWF9Q+bbckjBHLtHMEoJWlkmYzzdwhYMkjkOwubLM6t7NbWKjgKamGDrWL1++KrjUO1t9oAQ==", + "node_modules/@poppinss/cliui/node_modules/ansi-regex": { + "version": "6.2.2", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.2.2.tgz", + "integrity": "sha512-Bq3SmSpyFHaWjPk8If9yc6svM8c56dB5BAtW4Qbw5jHTwwXXcTLoRMkpDJp6VL0XzlWaCHTXrkFURMYmD0sLqg==", "license": "MIT", "engines": { - "node": ">=18" + "node": ">=12" }, "funding": { - "url": "https://github.com/chalk/supports-color?sponsor=1" + "url": "https://github.com/chalk/ansi-regex?sponsor=1" + } + }, + "node_modules/@poppinss/cliui/node_modules/string-width": { + "version": "8.2.1", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-8.2.1.tgz", + "integrity": "sha512-IIaP0g3iy9Cyy18w3M9YcaDudujEAVHKt3a3QJg1+sr/oX96TbaGUubG0hJyCjCBThFH+tFpcIyoUHUn1ogaLA==", + "license": "MIT", + "dependencies": { + "get-east-asian-width": "^1.5.0", + "strip-ansi": "^7.1.2" + }, + "engines": { + "node": ">=20" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@poppinss/cliui/node_modules/strip-ansi": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.2.0.tgz", + "integrity": "sha512-yDPMNjp4WyfYBkHnjIRLfca1i6KMyGCtsVgoKe/z1+6vukgaENdgGBZt+ZmKPc4gavvEZ5OgHfHdrazhgNyG7w==", + "license": "MIT", + "dependencies": { + "ansi-regex": "^6.2.2" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/strip-ansi?sponsor=1" } }, "node_modules/@poppinss/colors": { - "version": "4.1.4", - "resolved": "https://registry.npmjs.org/@poppinss/colors/-/colors-4.1.4.tgz", - "integrity": "sha512-FA+nTU8p6OcSH4tLDY5JilGYr1bVWHpNmcLr7xmMEdbWmKHa+3QZ+DqefrXKmdjO/brHTnQZo20lLSjaO7ydog==", + "version": "4.1.6", + "resolved": "https://registry.npmjs.org/@poppinss/colors/-/colors-4.1.6.tgz", + "integrity": "sha512-H9xkIdFswbS8n1d6vmRd8+c10t2Qe+rZITbbDHHkQixH5+2x1FDGmi/0K+WgWiqQFKPSlIYB7jlH6Kpfn6Fleg==", "license": "MIT", "dependencies": { "kleur": "^4.1.5" - }, - "engines": { - "node": ">=18.16.0" } }, "node_modules/@poppinss/dumper": { - "version": "0.6.2", - "resolved": "https://registry.npmjs.org/@poppinss/dumper/-/dumper-0.6.2.tgz", - "integrity": "sha512-FhE9rY15aZ6Qp6ltQ0NZjseVRhwgWZ7+sg16343FqnjdUQvvBBi5eSeH/aZA4LF1ZOV5779DYrJXTHT42JlHNg==", + "version": "0.6.5", + "resolved": "https://registry.npmjs.org/@poppinss/dumper/-/dumper-0.6.5.tgz", + "integrity": "sha512-NBdYIb90J7LfOI32dOewKI1r7wnkiH6m920puQ3qHUeZkxNkQiFnXVWoE6YtFSv6QOiPPf7ys6i+HWWecDz7sw==", "license": "MIT", "dependencies": { - "@poppinss/colors": "^4.1.4", - "@sindresorhus/is": "^7.0.1", + "@poppinss/colors": "^4.1.5", + "@sindresorhus/is": "^7.0.2", "supports-color": "^10.0.0" } }, - "node_modules/@poppinss/dumper/node_modules/supports-color": { - "version": "10.0.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-10.0.0.tgz", - "integrity": "sha512-HRVVSbCCMbj7/kdWF9Q+bbckjBHLtHMEoJWlkmYzzdwhYMkjkOwubLM6t7NbWKjgKamGDrWL1++KrjUO1t9oAQ==", - "license": "MIT", - "engines": { - "node": ">=18" - }, - "funding": { - "url": "https://github.com/chalk/supports-color?sponsor=1" - } - }, "node_modules/@poppinss/exception": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/@poppinss/exception/-/exception-1.2.0.tgz", - "integrity": "sha512-WLneXKQYNClhaMXccO111VQmZahSrcSRDaHRbV6KL5R4pTvK87fMn/MXLUcvOjk0X5dTHDPKF61tM7j826wrjQ==", - "license": "MIT", - "engines": { - "node": ">=20.6.0" - } - }, - "node_modules/@poppinss/file-generator": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/@poppinss/file-generator/-/file-generator-1.0.2.tgz", - "integrity": "sha512-rRob//4jLbUVbDSsNRihloKGgpyVsWdFQWUmONxX/gyv4koT1OlVoc3ccWgk7Y/sEa2cFxj3zrFs+wdT09iXWw==", - "license": "MIT", - "dependencies": { - "bytes": "^3.1.2" - } + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/@poppinss/exception/-/exception-1.2.3.tgz", + "integrity": "sha512-dCED+QRChTVatE9ibtoaxc+WkdzOSjYTKi/+uacHWIsfodVfpsueo3+DKpgU5Px8qXjgmXkSvhXvSCz3fnP9lw==", + "license": "MIT" }, "node_modules/@poppinss/hooks": { - "version": "7.2.5", - "resolved": "https://registry.npmjs.org/@poppinss/hooks/-/hooks-7.2.5.tgz", - "integrity": "sha512-mxORKQ5CFzQNi6yK3zwCGWfGS507w23IhV3kFq42QzWlv/vpvf4aMJDbtfMCR5p52ghVoe0d1wmgp77ak2ORhQ==", - "license": "MIT", - "engines": { - "node": ">=18.16.0" - } + "version": "7.3.0", + "resolved": "https://registry.npmjs.org/@poppinss/hooks/-/hooks-7.3.0.tgz", + "integrity": "sha512-/H35z/bWqHg7085QOxWUDYMidx6Kl6b8kIyzIXlRYzWvsk1xm9hQOlXWdWEYch+Gmn8eL7tThx59MBj8BLxDrQ==", + "license": "MIT" }, "node_modules/@poppinss/inspect": { "version": "1.0.1", @@ -4699,13 +3188,10 @@ } }, "node_modules/@poppinss/macroable": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/@poppinss/macroable/-/macroable-1.0.4.tgz", - "integrity": "sha512-ct43jurbe7lsUX5eIrj4ijO3j/6zIPp7CDnFWXDs7UPAbw1Pu1iH3oAmFdP4jcskKJBURH5M9oTtyeiUXyHX8Q==", - "license": "MIT", - "engines": { - "node": ">=18.16.0" - } + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@poppinss/macroable/-/macroable-1.1.2.tgz", + "integrity": "sha512-FAVBRzzWhYP5mA3lCwLH1A0fKBqq5anyjGet90Z81aRK5c/+LTGUE1zJhZrErjaenBSOOI9BVUs3WVmotneFQA==", + "license": "MIT" }, "node_modules/@poppinss/manager": { "version": "5.0.2", @@ -4714,22 +3200,19 @@ "license": "MIT" }, "node_modules/@poppinss/matchit": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/@poppinss/matchit/-/matchit-3.1.2.tgz", - "integrity": "sha512-Bx+jY+vmdQFmwYiHliiPjr+oVBaGnh79B1h1FSAm3jME1QylLFt8PPYC0ymO8Q5PzJj/KuE3jeTnZhRHOWqq8g==", + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/@poppinss/matchit/-/matchit-3.2.0.tgz", + "integrity": "sha512-9SoMICN+LMO7ZtMj2ja8N7RHlC4mmuv5WwIBXWjabMd2SyXE1dIydh29exlgm+dGMP84PjwvfJH1TmWL4qz1og==", "license": "MIT", "dependencies": { "@arr/every": "^1.0.0" } }, "node_modules/@poppinss/middleware": { - "version": "3.2.5", - "resolved": "https://registry.npmjs.org/@poppinss/middleware/-/middleware-3.2.5.tgz", - "integrity": "sha512-+P9yY4KYYZFTbOoIvVK/R4PfPcPyxt4E23Dx4l7V8Z/8+DOzAL01eWZs9mMgHOYTbAokKVLQ+JIsyDmrTA0Uyg==", - "license": "MIT", - "engines": { - "node": ">=18.16.0" - } + "version": "3.2.7", + "resolved": "https://registry.npmjs.org/@poppinss/middleware/-/middleware-3.2.7.tgz", + "integrity": "sha512-MZC0Z97ozSz+PpfyxUPUy/ImuthpqvBbY7qku7f4Q2maHz+2uXfchfO8OggXLS6zEJ078l+jpAHZ2rDIRdjeVg==", + "license": "MIT" }, "node_modules/@poppinss/multiparty": { "version": "2.0.1", @@ -4742,26 +3225,6 @@ "uid-safe": "2.1.5" } }, - "node_modules/@poppinss/multiparty/node_modules/safe-buffer": { - "version": "5.2.1", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", - "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ], - "license": "MIT" - }, "node_modules/@poppinss/object-builder": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/@poppinss/object-builder/-/object-builder-1.1.0.tgz", @@ -4772,60 +3235,56 @@ } }, "node_modules/@poppinss/prompts": { - "version": "3.1.4", - "resolved": "https://registry.npmjs.org/@poppinss/prompts/-/prompts-3.1.4.tgz", - "integrity": "sha512-3xbwolmX8/G2jZZTRcymc1KysJ6b7vyonauKwyQtt3WOaUTHMFcxTJ/Sdp75ehHFJI1BOVzd4v6BS9pmqTcHlw==", + "version": "3.1.6", + "resolved": "https://registry.npmjs.org/@poppinss/prompts/-/prompts-3.1.6.tgz", + "integrity": "sha512-cKHfkID6b3wl1kbHJJRC/pznQ3KnRVydyk7CE38NfTV3VS45BDYCxeZZ7bfDin71qMzITh18lKnu8iuLxBngHA==", "license": "MIT", "dependencies": { - "@poppinss/colors": "^4.1.4", - "@poppinss/exception": "^1.1.0", + "@poppinss/colors": "^4.1.6", + "@poppinss/exception": "^1.2.2", "@poppinss/object-builder": "^1.1.0", "enquirer": "^2.4.1" - }, - "engines": { - "node": ">=18.16.0" } }, "node_modules/@poppinss/string": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/@poppinss/string/-/string-1.2.0.tgz", - "integrity": "sha512-1z78zjqhfjqsvWr+pQzCpRNcZpIM+5vNY5SFOvz28GrL/LRanwtmOku5tBX7jE8/ng3oXaOVrB59lnnXFtvkug==", + "version": "1.7.2", + "resolved": "https://registry.npmjs.org/@poppinss/string/-/string-1.7.2.tgz", + "integrity": "sha512-A182GLDfi36iDCbhDrHB0xzrPM1fO3GHnhCDIdadf8C6eycgct4m7zusbLwEh6GPaj2Pz5BVos7XK16w7tZ7wQ==", "license": "MIT", "dependencies": { - "@lukeed/ms": "^2.0.2", - "@types/bytes": "^3.1.5", "@types/pluralize": "^0.0.33", - "bytes": "^3.1.2", - "case-anything": "^3.1.0", + "case-anything": "^3.1.2", "pluralize": "^8.0.0", - "slugify": "^1.6.6", - "truncatise": "^0.0.8" - }, - "engines": { - "node": ">=20.6.0" + "slugify": "^1.6.9" } }, + "node_modules/@poppinss/types": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/@poppinss/types/-/types-1.2.1.tgz", + "integrity": "sha512-qUYnzl0m9HJTWsXtr8Xo7CwDx6wcjrvo14bOVbIMIlKJCzKrm3LX55dRTDr1/x4PpSvKVgmxvC6Ly2YiqXKOvQ==", + "license": "MIT" + }, "node_modules/@poppinss/utils": { - "version": "6.9.2", - "resolved": "https://registry.npmjs.org/@poppinss/utils/-/utils-6.9.2.tgz", - "integrity": "sha512-ypVszZxhwiehhklM5so2BI+nClQJwp7mBUSJh/R1GepeUH1vvD5GtxMz8Lp9dO9oAbKyDmq1jc4g/4E0dv8r2g==", + "version": "6.10.1", + "resolved": "https://registry.npmjs.org/@poppinss/utils/-/utils-6.10.1.tgz", + "integrity": "sha512-da+MMyeXhBaKtxQiWPfy7+056wk3lVIhioJnXHXkJ2/OHDaZfFcyKHNl1R06sdYO8lIRXcXdoZ6LO2ARmkAREA==", "license": "MIT", "dependencies": { - "@poppinss/exception": "^1.2.0", + "@poppinss/exception": "^1.2.1", "@poppinss/object-builder": "^1.1.0", - "@poppinss/string": "^1.1.0", + "@poppinss/string": "^1.3.0", "flattie": "^1.1.1", "safe-stable-stringify": "^2.5.0", - "secure-json-parse": "^3.0.1" + "secure-json-parse": "^4.0.0" }, "engines": { "node": ">=18.16.0" } }, "node_modules/@poppinss/utils/node_modules/secure-json-parse": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/secure-json-parse/-/secure-json-parse-3.0.2.tgz", - "integrity": "sha512-H6nS2o8bWfpFEV6U38sOSjS7bTbdgbCGU9wEM6W14P5H0QOsz94KCusifV44GpHDTu2nqZbuDNhTzu+mjDSw1w==", + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/secure-json-parse/-/secure-json-parse-4.1.0.tgz", + "integrity": "sha512-l4KnYfEyqYJxDwlNVyRfO2E4NTHfMKAWdUuA8J0yve2Dz/E/PdBepY03RvyJpssIpRFwJoCD55wA+mEDs6ByWA==", "funding": [ { "type": "github", @@ -4839,83 +3298,96 @@ "license": "BSD-3-Clause" }, "node_modules/@poppinss/validator-lite": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/@poppinss/validator-lite/-/validator-lite-1.0.3.tgz", - "integrity": "sha512-u4dmT7PDHwNtxY3q1jHVp/u+hMEEcBlkzd37QwwM4tVt/0mLlEDttSfPQ+TT7sqPG4VEtWKwVSlMInwPUYyJpA==", - "license": "MIT", - "dependencies": { - "validator": "^13.9.0" - } + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/@poppinss/validator-lite/-/validator-lite-2.1.2.tgz", + "integrity": "sha512-UhSG1ouT6r67VbEFHK/8ax3EMZYHioew9PqGmEZjV41G15aPZi6cyhXtBVvF9xqkHMflA5V680k7bQzV0kfD5w==", + "license": "MIT" }, "node_modules/@redis/bloom": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/@redis/bloom/-/bloom-1.2.0.tgz", - "integrity": "sha512-HG2DFjYKbpNmVXsa0keLHp/3leGJz1mjh09f2RLGGLQZzSHpkmZWuwJbAvo3QcRY8p80m5+ZdXZdYOSBLlp7Cg==", + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/@redis/bloom/-/bloom-6.0.0.tgz", + "integrity": "sha512-P0n5NkV9IIdT6nYXOfMHG83sho8pE7Nay7yw27wOGVLv4DthgvzebpGz6m7VuMTizeJmw3LPw2Xek5wFUhGpVw==", "license": "MIT", + "engines": { + "node": ">= 20.0.0" + }, "peerDependencies": { - "@redis/client": "^1.0.0" + "@redis/client": "^6.0.0" } }, "node_modules/@redis/client": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/@redis/client/-/client-1.6.0.tgz", - "integrity": "sha512-aR0uffYI700OEEH4gYnitAnv3vzVGXCFvYfdpu/CJKvk4pHfLPEy/JSZyrpQ+15WhXe1yJRXLtfQ84s4mEXnPg==", + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/@redis/client/-/client-6.0.0.tgz", + "integrity": "sha512-NS4iIT25r24sAjNQ2nSRdCW5jPJoV0rxkBee27oTeR+RXaOu89cjIsrww5rPBaYVGVdL1QCx9uz9141gZiSKdQ==", "license": "MIT", "dependencies": { - "cluster-key-slot": "1.1.2", - "generic-pool": "3.9.0", - "yallist": "4.0.0" + "cluster-key-slot": "1.1.2" }, "engines": { - "node": ">=14" + "node": ">= 20.0.0" + }, + "peerDependencies": { + "@node-rs/xxhash": "^1.1.0", + "@opentelemetry/api": ">=1 <2" + }, + "peerDependenciesMeta": { + "@node-rs/xxhash": { + "optional": true + }, + "@opentelemetry/api": { + "optional": true + } } }, - "node_modules/@redis/client/node_modules/yallist": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", - "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", - "license": "ISC" - }, - "node_modules/@redis/graph": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/@redis/graph/-/graph-1.1.1.tgz", - "integrity": "sha512-FEMTcTHZozZciLRl6GiiIB4zGm5z5F3F6a6FZCyrfxdKOhFlGkiAqlexWMBzCi4DcRoyiOsuLfW+cjlGWyExOw==", - "license": "MIT", - "peerDependencies": { - "@redis/client": "^1.0.0" + "node_modules/@redis/client/node_modules/cluster-key-slot": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/cluster-key-slot/-/cluster-key-slot-1.1.2.tgz", + "integrity": "sha512-RMr0FhtfXemyinomL4hrWcYJxmX6deFdCxpJzhDttxgO1+bcCnkk+9drydLVDmAMG7NE6aN/fl4F7ucU/90gAA==", + "license": "Apache-2.0", + "engines": { + "node": ">=0.10.0" } }, "node_modules/@redis/json": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/@redis/json/-/json-1.0.7.tgz", - "integrity": "sha512-6UyXfjVaTBTJtKNG4/9Z8PSpKE6XgSyEb8iwaqDcy+uKrd/DGYHTWkUdnQDyzm727V7p21WUMhsqz5oy65kPcQ==", + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/@redis/json/-/json-6.0.0.tgz", + "integrity": "sha512-F+eqFfgPcy57Zs1KW7UtLnBtRk6lxAUIoe7dyZerpm6e+ssYXG/dWJrbrHFYs0b7tt6QBtYpVuukBuM9XqhUAg==", "license": "MIT", + "engines": { + "node": ">= 20.0.0" + }, "peerDependencies": { - "@redis/client": "^1.0.0" + "@redis/client": "^6.0.0" } }, "node_modules/@redis/search": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/@redis/search/-/search-1.2.0.tgz", - "integrity": "sha512-tYoDBbtqOVigEDMAcTGsRlMycIIjwMCgD8eR2t0NANeQmgK/lvxNAvYyb6bZDD4frHRhIHkJu2TBRvB0ERkOmw==", + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/@redis/search/-/search-6.0.0.tgz", + "integrity": "sha512-VHuCJ2W0YWFixGZh/l//8JiyOsD4gN+NhjdRAGIoUe0UQ4mtq1NyY2ZJ973XT+vYhaU21XdK8r8oNrd5n7wbzQ==", "license": "MIT", + "engines": { + "node": ">= 20.0.0" + }, "peerDependencies": { - "@redis/client": "^1.0.0" + "@redis/client": "^6.0.0" } }, "node_modules/@redis/time-series": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/@redis/time-series/-/time-series-1.1.0.tgz", - "integrity": "sha512-c1Q99M5ljsIuc4YdaCwfUEXsofakb9c8+Zse2qxTadu8TalLXuAESzLvFAvNVbkmSlvlzIQOLpBCmWI9wTOt+g==", + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/@redis/time-series/-/time-series-6.0.0.tgz", + "integrity": "sha512-QWhkYsg+3lhBrBf+cbzybtV8LQcSrk7iXIgTaGU+pHNFTkql7TpVRE24ROS6M2ybVIV6O/zxTqfxgxxYiqyw0Q==", "license": "MIT", + "engines": { + "node": ">= 20.0.0" + }, "peerDependencies": { - "@redis/client": "^1.0.0" + "@redis/client": "^6.0.0" } }, "node_modules/@rollup/rollup-android-arm-eabi": { - "version": "4.30.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.30.1.tgz", - "integrity": "sha512-pSWY+EVt3rJ9fQ3IqlrEUtXh3cGqGtPDH1FQlNZehO2yYxCHEX1SPsz1M//NXwYfbTlcKr9WObLnJX9FsS9K1Q==", + "version": "4.61.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.61.1.tgz", + "integrity": "sha512-JnBB8MdXj45cajvTuO5FmPlvFVJRQgvrz1uSEl3NwqFnReAPGwb8EanbGi4z2nRaqLzjJSv5/JmycoTKlRZxHA==", "cpu": [ "arm" ], @@ -4923,13 +3395,12 @@ "optional": true, "os": [ "android" - ], - "peer": true + ] }, "node_modules/@rollup/rollup-android-arm64": { - "version": "4.30.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.30.1.tgz", - "integrity": "sha512-/NA2qXxE3D/BRjOJM8wQblmArQq1YoBVJjrjoTSBS09jgUisq7bqxNHJ8kjCHeV21W/9WDGwJEWSN0KQ2mtD/w==", + "version": "4.61.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.61.1.tgz", + "integrity": "sha512-Jx2g7iSjw4AOT0HDPHM9RV3GNjRXwybWtSFZiZAYUTjUwjVrYIwq3kBf+LnhqJlzXFAqTAh2F7IGI+O568exPw==", "cpu": [ "arm64" ], @@ -4937,13 +3408,12 @@ "optional": true, "os": [ "android" - ], - "peer": true + ] }, "node_modules/@rollup/rollup-darwin-arm64": { - "version": "4.30.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.30.1.tgz", - "integrity": "sha512-r7FQIXD7gB0WJ5mokTUgUWPl0eYIH0wnxqeSAhuIwvnnpjdVB8cRRClyKLQr7lgzjctkbp5KmswWszlwYln03Q==", + "version": "4.61.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.61.1.tgz", + "integrity": "sha512-0F1L/Z3Eqv8mT2n3dCpeO8GcTvHvVqkP5/t6DMsn0KzhYVcg+s7Ncl5DS8qjKYEeio6Az0Gt6nyBORay5qIlCA==", "cpu": [ "arm64" ], @@ -4951,13 +3421,12 @@ "optional": true, "os": [ "darwin" - ], - "peer": true + ] }, "node_modules/@rollup/rollup-darwin-x64": { - "version": "4.30.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.30.1.tgz", - "integrity": "sha512-x78BavIwSH6sqfP2xeI1hd1GpHL8J4W2BXcVM/5KYKoAD3nNsfitQhvWSw+TFtQTLZ9OmlF+FEInEHyubut2OA==", + "version": "4.61.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.61.1.tgz", + "integrity": "sha512-qLttcH871ujY4YcVfUSShhOw+CsoTatYz8gRbHO7Bb92QH059/P0y5do1KMs41fY0BpD2x4AJH/gID0zFiqVKQ==", "cpu": [ "x64" ], @@ -4965,13 +3434,12 @@ "optional": true, "os": [ "darwin" - ], - "peer": true + ] }, "node_modules/@rollup/rollup-freebsd-arm64": { - "version": "4.30.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-arm64/-/rollup-freebsd-arm64-4.30.1.tgz", - "integrity": "sha512-HYTlUAjbO1z8ywxsDFWADfTRfTIIy/oUlfIDmlHYmjUP2QRDTzBuWXc9O4CXM+bo9qfiCclmHk1x4ogBjOUpUQ==", + "version": "4.61.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-arm64/-/rollup-freebsd-arm64-4.61.1.tgz", + "integrity": "sha512-fUI4RapGE0Oh3mb8mgfvC1O2nU1RpDZUKnDQm3xB1Ipg7C2wTs5Kstz7G2uWK99a8S2yTMq8/P4uycwNa0nJyw==", "cpu": [ "arm64" ], @@ -4979,13 +3447,12 @@ "optional": true, "os": [ "freebsd" - ], - "peer": true + ] }, "node_modules/@rollup/rollup-freebsd-x64": { - "version": "4.30.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-x64/-/rollup-freebsd-x64-4.30.1.tgz", - "integrity": "sha512-1MEdGqogQLccphhX5myCJqeGNYTNcmTyaic9S7CG3JhwuIByJ7J05vGbZxsizQthP1xpVx7kd3o31eOogfEirw==", + "version": "4.61.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-x64/-/rollup-freebsd-x64-4.61.1.tgz", + "integrity": "sha512-H5YrdvJaDtI/U9/emrD4b++xkvp3y/JvOe4rizHbxvkyMfRS/CiRYdji+Pl8D0brEaNFWUh1drQxgAGIl6Xudw==", "cpu": [ "x64" ], @@ -4993,13 +3460,12 @@ "optional": true, "os": [ "freebsd" - ], - "peer": true + ] }, "node_modules/@rollup/rollup-linux-arm-gnueabihf": { - "version": "4.30.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.30.1.tgz", - "integrity": "sha512-PaMRNBSqCx7K3Wc9QZkFx5+CX27WFpAMxJNiYGAXfmMIKC7jstlr32UhTgK6T07OtqR+wYlWm9IxzennjnvdJg==", + "version": "4.61.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.61.1.tgz", + "integrity": "sha512-Q8CBCCQtDFrYtXoeUXSrnFXKOnyUhx6bz+SkL6A0E7V8kAiCJ5pamq1WtbfpVGhR5TSpXY6ak3avmDc5fHTyJA==", "cpu": [ "arm" ], @@ -5007,13 +3473,12 @@ "optional": true, "os": [ "linux" - ], - "peer": true + ] }, "node_modules/@rollup/rollup-linux-arm-musleabihf": { - "version": "4.30.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-musleabihf/-/rollup-linux-arm-musleabihf-4.30.1.tgz", - "integrity": "sha512-B8Rcyj9AV7ZlEFqvB5BubG5iO6ANDsRKlhIxySXcF1axXYUyqwBok+XZPgIYGBgs7LDXfWfifxhw0Ik57T0Yug==", + "version": "4.61.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-musleabihf/-/rollup-linux-arm-musleabihf-4.61.1.tgz", + "integrity": "sha512-nwnhk1581l0FBVellGcVCAT0Oi06onEA3WB53sf01VO3I0UPBkMH9sXONYME2K0ovXcNayJfNtHfm6mpJElatQ==", "cpu": [ "arm" ], @@ -5021,13 +3486,12 @@ "optional": true, "os": [ "linux" - ], - "peer": true + ] }, "node_modules/@rollup/rollup-linux-arm64-gnu": { - "version": "4.30.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.30.1.tgz", - "integrity": "sha512-hqVyueGxAj3cBKrAI4aFHLV+h0Lv5VgWZs9CUGqr1z0fZtlADVV1YPOij6AhcK5An33EXaxnDLmJdQikcn5NEw==", + "version": "4.61.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.61.1.tgz", + "integrity": "sha512-x5Xr49hwt3hdW75UOZm3395YwwzPyauktslv29KpWL/T+vVAzoT3azLcTWv0eMciBNrx+DYjH4paehHoLpPvpg==", "cpu": [ "arm64" ], @@ -5035,13 +3499,12 @@ "optional": true, "os": [ "linux" - ], - "peer": true + ] }, "node_modules/@rollup/rollup-linux-arm64-musl": { - "version": "4.30.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.30.1.tgz", - "integrity": "sha512-i4Ab2vnvS1AE1PyOIGp2kXni69gU2DAUVt6FSXeIqUCPIR3ZlheMW3oP2JkukDfu3PsexYRbOiJrY+yVNSk9oA==", + "version": "4.61.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.61.1.tgz", + "integrity": "sha512-unMS3H73DpaoPyyEVPjGKleM/s0mkmsauTENpw4INQY8y4+IuLNjkueQ5QCtC0D3N38Y38yhAU8OoZ20S2Tm6w==", "cpu": [ "arm64" ], @@ -5049,13 +3512,12 @@ "optional": true, "os": [ "linux" - ], - "peer": true + ] }, - "node_modules/@rollup/rollup-linux-loongarch64-gnu": { - "version": "4.30.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-loongarch64-gnu/-/rollup-linux-loongarch64-gnu-4.30.1.tgz", - "integrity": "sha512-fARcF5g296snX0oLGkVxPmysetwUk2zmHcca+e9ObOovBR++9ZPOhqFUM61UUZ2EYpXVPN1redgqVoBB34nTpQ==", + "node_modules/@rollup/rollup-linux-loong64-gnu": { + "version": "4.61.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-loong64-gnu/-/rollup-linux-loong64-gnu-4.61.1.tgz", + "integrity": "sha512-zNZzGRnAhwjFEYmvphJRV5XaQGjs62cCmeYYHUT//NbvEnHauw+I85nGG+SiVg5ld4GX8D1IbKIX+ozITQnhMQ==", "cpu": [ "loong64" ], @@ -5063,13 +3525,25 @@ "optional": true, "os": [ "linux" - ], - "peer": true + ] }, - "node_modules/@rollup/rollup-linux-powerpc64le-gnu": { - "version": "4.30.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-powerpc64le-gnu/-/rollup-linux-powerpc64le-gnu-4.30.1.tgz", - "integrity": "sha512-GLrZraoO3wVT4uFXh67ElpwQY0DIygxdv0BNW9Hkm3X34wu+BkqrDrkcsIapAY+N2ATEbvak0XQ9gxZtCIA5Rw==", + "node_modules/@rollup/rollup-linux-loong64-musl": { + "version": "4.61.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-loong64-musl/-/rollup-linux-loong64-musl-4.61.1.tgz", + "integrity": "sha512-LdpWGL8X209B2SIvWjqlc8VZgM6PKfontSerGepuldQmHYrAOtnMCXeJkxXGbC+PPZVOuu5czJo7fNV6aeW8rQ==", + "cpu": [ + "loong64" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-ppc64-gnu": { + "version": "4.61.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-ppc64-gnu/-/rollup-linux-ppc64-gnu-4.61.1.tgz", + "integrity": "sha512-EC5kTtNaNGOmbMGqar8dvJy6y/hg99GAwjfBz++pxZhQATXGcRjd6c5en5wcbru0vkRmiMGsQKdMJOOf6sza4g==", "cpu": [ "ppc64" ], @@ -5077,13 +3551,25 @@ "optional": true, "os": [ "linux" + ] + }, + "node_modules/@rollup/rollup-linux-ppc64-musl": { + "version": "4.61.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-ppc64-musl/-/rollup-linux-ppc64-musl-4.61.1.tgz", + "integrity": "sha512-8hiwp6D4acEcNK78I4rP0/XtS1sknWIAMJBPdR4l6zUtyTm5KiTDr5bXmWt4foY7nAN7AThDHgkLIEZOWKbzWw==", + "cpu": [ + "ppc64" ], - "peer": true + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] }, "node_modules/@rollup/rollup-linux-riscv64-gnu": { - "version": "4.30.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.30.1.tgz", - "integrity": "sha512-0WKLaAUUHKBtll0wvOmh6yh3S0wSU9+yas923JIChfxOaaBarmb/lBKPF0w/+jTVozFnOXJeRGZ8NvOxvk/jcw==", + "version": "4.61.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.61.1.tgz", + "integrity": "sha512-10dh/h/BqA7DuMPWSxkR8uks18FRwnwOEqr5zOTEl+NOwP/OMzKX8OFR/Of9xxDA7D5qef1Nzar5WDD2kCCr1g==", "cpu": [ "riscv64" ], @@ -5091,13 +3577,25 @@ "optional": true, "os": [ "linux" + ] + }, + "node_modules/@rollup/rollup-linux-riscv64-musl": { + "version": "4.61.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-musl/-/rollup-linux-riscv64-musl-4.61.1.tgz", + "integrity": "sha512-YKJ5lg35DP17gcAOggnihe+APw9HLyj1Xn7gsmGumBJAUDa6NGXNixJzmkWLhcK9TOuuyQjdamzvJefkO7qHZQ==", + "cpu": [ + "riscv64" ], - "peer": true + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] }, "node_modules/@rollup/rollup-linux-s390x-gnu": { - "version": "4.30.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-s390x-gnu/-/rollup-linux-s390x-gnu-4.30.1.tgz", - "integrity": "sha512-GWFs97Ruxo5Bt+cvVTQkOJ6TIx0xJDD/bMAOXWJg8TCSTEK8RnFeOeiFTxKniTc4vMIaWvCplMAFBt9miGxgkA==", + "version": "4.61.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-s390x-gnu/-/rollup-linux-s390x-gnu-4.61.1.tgz", + "integrity": "sha512-Mlil5G2Jj6a7B3LWGctg+XPL9vdXYuzCtNXfxOQ0nPjc2m6ueUktocPGH9bnAM0bNRKb/bAWTujUU7IJQdQA+g==", "cpu": [ "s390x" ], @@ -5105,13 +3603,12 @@ "optional": true, "os": [ "linux" - ], - "peer": true + ] }, "node_modules/@rollup/rollup-linux-x64-gnu": { - "version": "4.30.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.30.1.tgz", - "integrity": "sha512-UtgGb7QGgXDIO+tqqJ5oZRGHsDLO8SlpE4MhqpY9Llpzi5rJMvrK6ZGhsRCST2abZdBqIBeXW6WPD5fGK5SDwg==", + "version": "4.61.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.61.1.tgz", + "integrity": "sha512-bVWIOIk6pV01p4CdUbPP7CJ/434z+OooYjDuFcR+44N35YvKUC66G8MGnvcWx5mWKW3g61J+t74l3Kj15Kwn2Q==", "cpu": [ "x64" ], @@ -5119,13 +3616,12 @@ "optional": true, "os": [ "linux" - ], - "peer": true + ] }, "node_modules/@rollup/rollup-linux-x64-musl": { - "version": "4.30.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.30.1.tgz", - "integrity": "sha512-V9U8Ey2UqmQsBT+xTOeMzPzwDzyXmnAoO4edZhL7INkwQcaW1Ckv3WJX3qrrp/VHaDkEWIBWhRwP47r8cdrOow==", + "version": "4.61.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.61.1.tgz", + "integrity": "sha512-qy5pBvZbqNFheBz61R1rzsezjm0J7O2oNGoWtGoY89SZYLUfxAJTBAqDChqAIdB4rCiIbi9nF7yZ83GnNiLwSw==", "cpu": [ "x64" ], @@ -5133,13 +3629,38 @@ "optional": true, "os": [ "linux" + ] + }, + "node_modules/@rollup/rollup-openbsd-x64": { + "version": "4.61.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-openbsd-x64/-/rollup-openbsd-x64-4.61.1.tgz", + "integrity": "sha512-E83TXjI4zm0+5f2qO+UOudaCYIhYwpJ5jq6YCZNIZ+6CbfhKrkAGezeiASBL9ElxAxFsRS9ZhESv8mfnj6TKeg==", + "cpu": [ + "x64" ], - "peer": true + "license": "MIT", + "optional": true, + "os": [ + "openbsd" + ] + }, + "node_modules/@rollup/rollup-openharmony-arm64": { + "version": "4.61.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-openharmony-arm64/-/rollup-openharmony-arm64-4.61.1.tgz", + "integrity": "sha512-fbWnKqVkjrJN38vNe3ahkbk6iejS/3b0Nt7EEtPpE6RBacZcGXNKbzfHN3GUUlXOPghUg0j6XUGrtjX9z1sIvA==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "openharmony" + ] }, "node_modules/@rollup/rollup-win32-arm64-msvc": { - "version": "4.30.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.30.1.tgz", - "integrity": "sha512-WabtHWiPaFF47W3PkHnjbmWawnX/aE57K47ZDT1BXTS5GgrBUEpvOzq0FI0V/UYzQJgdb8XlhVNH8/fwV8xDjw==", + "version": "4.61.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.61.1.tgz", + "integrity": "sha512-ArMl38iVAbk0New1ogihQNY6iphLi4ZaRsa037gUzv5yeKPY8TD3Dmy4x2RNC1VztU/uqm+G+/RwFrSka3Oy2g==", "cpu": [ "arm64" ], @@ -5147,13 +3668,12 @@ "optional": true, "os": [ "win32" - ], - "peer": true + ] }, "node_modules/@rollup/rollup-win32-ia32-msvc": { - "version": "4.30.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.30.1.tgz", - "integrity": "sha512-pxHAU+Zv39hLUTdQQHUVHf4P+0C47y/ZloorHpzs2SXMRqeAWmGghzAhfOlzFHHwjvgokdFAhC4V+6kC1lRRfw==", + "version": "4.61.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.61.1.tgz", + "integrity": "sha512-0mYtjHS9ucAbcATycCNK9IGBk/cCe/ma7EmSLGZdsxnOA8cjRIyU04wDpVAD9NiOfLUR9KTxdiO53uOkherqjQ==", "cpu": [ "ia32" ], @@ -5161,13 +3681,12 @@ "optional": true, "os": [ "win32" - ], - "peer": true + ] }, - "node_modules/@rollup/rollup-win32-x64-msvc": { - "version": "4.30.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.30.1.tgz", - "integrity": "sha512-D6qjsXGcvhTjv0kI4fU8tUuBDF/Ueee4SVX79VfNDXZa64TfCW1Slkb6Z7O1p7vflqZjcmOVdZlqf8gvJxc6og==", + "node_modules/@rollup/rollup-win32-x64-gnu": { + "version": "4.61.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-gnu/-/rollup-win32-x64-gnu-4.61.1.tgz", + "integrity": "sha512-gK1iCEPfpoSG9wfBihXxvBMi8ZfcWffYkEsC/Eih+iFENTaewvNcrEQ69lIOWYO5pePHKLHHO7nq5AILGO/HQQ==", "cpu": [ "x64" ], @@ -5175,8 +3694,20 @@ "optional": true, "os": [ "win32" + ] + }, + "node_modules/@rollup/rollup-win32-x64-msvc": { + "version": "4.61.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.61.1.tgz", + "integrity": "sha512-X+zaP2x+j4RXGfbp/seSoRHWnPxzApilDszisZxbYH5C/jTxFhCtDNdPGZb9lJyYPs24wGxruPF7Y+sIXt9Gzw==", + "cpu": [ + "x64" ], - "peer": true + "license": "MIT", + "optional": true, + "os": [ + "win32" + ] }, "node_modules/@sec-ant/readable-stream": { "version": "0.4.1", @@ -5185,16 +3716,16 @@ "license": "MIT" }, "node_modules/@sinclair/typebox": { - "version": "0.27.8", - "resolved": "https://registry.npmjs.org/@sinclair/typebox/-/typebox-0.27.8.tgz", - "integrity": "sha512-+Fj43pSMwJs4KRrH/938Uf+uAELIgVBmQzg/q1YG10djyfA3TnrU8N8XzqCh/okZdszqBQTZf96idMfE5lnwTA==", + "version": "0.34.49", + "resolved": "https://registry.npmjs.org/@sinclair/typebox/-/typebox-0.34.49.tgz", + "integrity": "sha512-brySQQs7Jtn0joV8Xh9ZV/hZb9Ozb0pmazDIASBkYKCjXrXU3mpcFahmK/z4YDhGkQvP9mWJbVyahdtU5wQA+A==", "devOptional": true, "license": "MIT" }, "node_modules/@sindresorhus/is": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/@sindresorhus/is/-/is-7.0.1.tgz", - "integrity": "sha512-QWLl2P+rsCJeofkDNIT3WFmb6NrRud1SUYW8dIhXK/46XFV8Q/g7Bsvib0Askb0reRLe+WYPeeE+l5cH7SlkuQ==", + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/@sindresorhus/is/-/is-7.2.0.tgz", + "integrity": "sha512-P1Cz1dWaFfR4IR+U13mqqiGsLFf1KbayybWwdd2vfctdV6hDpUkgCY0nKOLLTMSoRd/jJNjtbqzf13K8DCCXQw==", "license": "MIT", "engines": { "node": ">=18" @@ -5216,397 +3747,24 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/@swc/core": { - "version": "1.10.6", - "resolved": "https://registry.npmjs.org/@swc/core/-/core-1.10.6.tgz", - "integrity": "sha512-zgXXsI6SAVwr6XsXyMnqlyLoa1lT+r09bAWI1xT3679ejWqI1Vnl14eJG0GjWYXCEMKHCNytfMq3OOQ62C39QQ==", - "dev": true, - "hasInstallScript": true, - "license": "Apache-2.0", - "dependencies": { - "@swc/counter": "^0.1.3", - "@swc/types": "^0.1.17" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/swc" - }, - "optionalDependencies": { - "@swc/core-darwin-arm64": "1.10.6", - "@swc/core-darwin-x64": "1.10.6", - "@swc/core-linux-arm-gnueabihf": "1.10.6", - "@swc/core-linux-arm64-gnu": "1.10.6", - "@swc/core-linux-arm64-musl": "1.10.6", - "@swc/core-linux-x64-gnu": "1.10.6", - "@swc/core-linux-x64-musl": "1.10.6", - "@swc/core-win32-arm64-msvc": "1.10.6", - "@swc/core-win32-ia32-msvc": "1.10.6", - "@swc/core-win32-x64-msvc": "1.10.6" - }, - "peerDependencies": { - "@swc/helpers": "*" - }, - "peerDependenciesMeta": { - "@swc/helpers": { - "optional": true - } - } + "node_modules/@speed-highlight/core": { + "version": "1.2.15", + "resolved": "https://registry.npmjs.org/@speed-highlight/core/-/core-1.2.15.tgz", + "integrity": "sha512-BMq1K3DsElxDWawkX6eLg9+CKJrTVGCBAWVuHXVUV2u0s2711qiChLSId6ikYPfxhdYocLNt3wWwSvDiTvFabw==", + "devOptional": true, + "license": "CC0-1.0" }, - "node_modules/@swc/core-darwin-arm64": { - "version": "1.10.6", - "resolved": "https://registry.npmjs.org/@swc/core-darwin-arm64/-/core-darwin-arm64-1.10.6.tgz", - "integrity": "sha512-USbMvT8Rw5PvIfF6HyTm+yW84J9c45emzmHBDIWY76vZHkFsS5MepNi+JLQyBzBBgE7ScwBRBNhRx6VNhkSoww==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "Apache-2.0 AND MIT", - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": ">=10" - } - }, - "node_modules/@swc/core-darwin-x64": { - "version": "1.10.6", - "resolved": "https://registry.npmjs.org/@swc/core-darwin-x64/-/core-darwin-x64-1.10.6.tgz", - "integrity": "sha512-7t2IozcZN4r1p27ei+Kb8IjN4aLoBDn107fPi+aPLcVp2uFgJEUzhCDuZXBNW2057Mx1OHcjzrkaleRpECz3Xg==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "Apache-2.0 AND MIT", - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": ">=10" - } - }, - "node_modules/@swc/core-linux-arm-gnueabihf": { - "version": "1.10.6", - "resolved": "https://registry.npmjs.org/@swc/core-linux-arm-gnueabihf/-/core-linux-arm-gnueabihf-1.10.6.tgz", - "integrity": "sha512-CPgWT+D0bDp/qhXsLkIJ54LmKU1/zvyGaf/yz8A4iR+YoF6R5CSXENXhNJY8cIrb6+uNWJZzHJ+gefB5V51bpA==", - "cpu": [ - "arm" - ], - "dev": true, - "license": "Apache-2.0", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=10" - } - }, - "node_modules/@swc/core-linux-arm64-gnu": { - "version": "1.10.6", - "resolved": "https://registry.npmjs.org/@swc/core-linux-arm64-gnu/-/core-linux-arm64-gnu-1.10.6.tgz", - "integrity": "sha512-5qZ6hVnqO/ShETXdGSzvdGUVx372qydlj1YWSYiaxQzTAepEBc8TC1NVUgYtOHOKVRkky1d7p6GQ9lymsd4bHw==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "Apache-2.0 AND MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=10" - } - }, - "node_modules/@swc/core-linux-arm64-musl": { - "version": "1.10.6", - "resolved": "https://registry.npmjs.org/@swc/core-linux-arm64-musl/-/core-linux-arm64-musl-1.10.6.tgz", - "integrity": "sha512-hB2xZFmXCKf2iJF5y2z01PSuLqEoUP3jIX/XlIHN+/AIP7PkSKsValE63LnjlnWPnSEI0IxUyRE3T3FzWE/fQQ==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "Apache-2.0 AND MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=10" - } - }, - "node_modules/@swc/core-linux-x64-gnu": { - "version": "1.10.6", - "resolved": "https://registry.npmjs.org/@swc/core-linux-x64-gnu/-/core-linux-x64-gnu-1.10.6.tgz", - "integrity": "sha512-PRGPp0I22+oJ8RMGg8M4hXYxEffH3ayu0WoSDPOjfol1F51Wj1tfTWN4wVa2RibzJjkBwMOT0KGLGb/hSEDDXQ==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "Apache-2.0 AND MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=10" - } - }, - "node_modules/@swc/core-linux-x64-musl": { - "version": "1.10.6", - "resolved": "https://registry.npmjs.org/@swc/core-linux-x64-musl/-/core-linux-x64-musl-1.10.6.tgz", - "integrity": "sha512-SoNBxlA86lnoV9vIz/TCyakLkdRhFSHx6tFMKNH8wAhz1kKYbZfDmpYoIzeQqdTh0tpx8e/Zu1zdK4smovsZqQ==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "Apache-2.0 AND MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=10" - } - }, - "node_modules/@swc/core-win32-arm64-msvc": { - "version": "1.10.6", - "resolved": "https://registry.npmjs.org/@swc/core-win32-arm64-msvc/-/core-win32-arm64-msvc-1.10.6.tgz", - "integrity": "sha512-6L5Y2E+FVvM+BtoA+mJFjf/SjpFr73w2kHBxINxwH8/PkjAjkePDr5m0ibQhPXV61bTwX49+1otzTY85EsUW9Q==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "Apache-2.0 AND MIT", - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": ">=10" - } - }, - "node_modules/@swc/core-win32-ia32-msvc": { - "version": "1.10.6", - "resolved": "https://registry.npmjs.org/@swc/core-win32-ia32-msvc/-/core-win32-ia32-msvc-1.10.6.tgz", - "integrity": "sha512-kxK3tW8DJwEkAkwy0vhwoBAShRebH1QTe0mvH9tlBQ21rToVZQn+GCV/I44dind80hYPw0Tw2JKFVfoEJyBszg==", - "cpu": [ - "ia32" - ], - "dev": true, - "license": "Apache-2.0 AND MIT", - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": ">=10" - } - }, - "node_modules/@swc/core-win32-x64-msvc": { - "version": "1.10.6", - "resolved": "https://registry.npmjs.org/@swc/core-win32-x64-msvc/-/core-win32-x64-msvc-1.10.6.tgz", - "integrity": "sha512-4pJka/+t8XcHee12G/R5VWcilkp5poT2EJhrybpuREkpQ7iC/4WOlOVrohbWQ4AhDQmojYQI/iS+gdF2JFLzTQ==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "Apache-2.0 AND MIT", - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": ">=10" - } - }, - "node_modules/@swc/counter": { - "version": "0.1.3", - "resolved": "https://registry.npmjs.org/@swc/counter/-/counter-0.1.3.tgz", - "integrity": "sha512-e2BR4lsJkkRlKZ/qCHPw9ZaSxc0MVUd7gtbtaB7aMvHeJVYe8sOB8DBZkP2DtISHGSku9sCK6T6cnY0CtXrOCQ==", + "node_modules/@swc/wasm": { + "version": "1.15.40", + "resolved": "https://registry.npmjs.org/@swc/wasm/-/wasm-1.15.40.tgz", + "integrity": "sha512-FVS3SEJXBxjpxVUGSzaTaCdJjnXUalRftA/6hILMAJIcYHBoiBfJlxuH6s47iajlAJZP25e5Kf4HNHvvwyOEgw==", "dev": true, "license": "Apache-2.0" }, - "node_modules/@swc/types": { - "version": "0.1.17", - "resolved": "https://registry.npmjs.org/@swc/types/-/types-0.1.17.tgz", - "integrity": "sha512-V5gRru+aD8YVyCOMAjMpWR1Ui577DD5KSJsHP8RAxopAH22jFz6GZd/qxqjO6MJHQhcsjvjOFXyDhyLQUnMveQ==", - "dev": true, - "license": "Apache-2.0", - "dependencies": { - "@swc/counter": "^0.1.3" - } - }, - "node_modules/@symfony/webpack-encore": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/@symfony/webpack-encore/-/webpack-encore-5.0.1.tgz", - "integrity": "sha512-2l9ssZCJDMKOXi1iggjn7HEaErdYvITvuheLvtXHAgR2mauV2FiE/pNFS+Bqz2sbj1g4pPcqJIl5AwFE9etOgg==", - "dev": true, - "license": "MIT", - "dependencies": { - "@nuxt/friendly-errors-webpack-plugin": "^2.5.1", - "babel-loader": "^9.1.3", - "css-loader": "^7.1.0", - "css-minimizer-webpack-plugin": "^7.0.0", - "fastest-levenshtein": "^1.0.16", - "mini-css-extract-plugin": "^2.6.0", - "picocolors": "^1.1.0", - "pretty-error": "^4.0.0", - "resolve-url-loader": "^5.0.0", - "semver": "^7.3.2", - "style-loader": "^3.3.0", - "tapable": "^2.2.1", - "terser-webpack-plugin": "^5.3.0", - "tmp": "^0.2.1", - "yargs-parser": "^21.0.0" - }, - "bin": { - "encore": "bin/encore.js" - }, - "engines": { - "node": "^18.12.0 || ^20.0.0 || >=22.0" - }, - "peerDependencies": { - "@babel/core": "^7.17.0", - "@babel/plugin-transform-react-jsx": "^7.12.11", - "@babel/preset-env": "^7.16.0", - "@babel/preset-react": "^7.9.0", - "@babel/preset-typescript": "^7.0.0", - "@symfony/stimulus-bridge": "^3.0.0", - "@vue/babel-helper-vue-jsx-merge-props": "^1.0.0", - "@vue/babel-plugin-jsx": "^1.0.0", - "@vue/babel-preset-jsx": "^1.0.0", - "@vue/compiler-sfc": "^2.6 || ^3.0.2", - "file-loader": "^6.0.0", - "fork-ts-checker-webpack-plugin": "^7.0.0 || ^8.0.0 || ^9.0.0", - "handlebars": "^4.7.7", - "handlebars-loader": "^1.7.0", - "less": "^4.0.0", - "less-loader": "^11.0.0 || ^12.2.0", - "postcss": "^8.3.0", - "postcss-loader": "^7.0.0 || ^8.1.0", - "sass": "^1.17.0", - "sass-loader": "^16.0.1", - "stylus-loader": "^7.0.0 || ^8.1.0", - "ts-loader": "^9.0.0", - "typescript": "^5.0.0", - "vue": "^3.2.14", - "vue-loader": "^17.0.0", - "webpack": "^5.72", - "webpack-cli": "^5.1.4", - "webpack-notifier": "^1.15.0" - }, - "peerDependenciesMeta": { - "@babel/core": { - "optional": false - }, - "@babel/plugin-transform-react-jsx": { - "optional": true - }, - "@babel/preset-env": { - "optional": false - }, - "@babel/preset-react": { - "optional": true - }, - "@babel/preset-typescript": { - "optional": true - }, - "@symfony/stimulus-bridge": { - "optional": true - }, - "@vue/babel-helper-vue-jsx-merge-props": { - "optional": true - }, - "@vue/babel-plugin-jsx": { - "optional": true - }, - "@vue/babel-preset-jsx": { - "optional": true - }, - "@vue/compiler-sfc": { - "optional": true - }, - "file-loader": { - "optional": true - }, - "fork-ts-checker-webpack-plugin": { - "optional": true - }, - "handlebars": { - "optional": true - }, - "handlebars-loader": { - "optional": true - }, - "less": { - "optional": true - }, - "less-loader": { - "optional": true - }, - "postcss": { - "optional": true - }, - "postcss-loader": { - "optional": true - }, - "sass": { - "optional": true - }, - "sass-loader": { - "optional": true - }, - "stylus-loader": { - "optional": true - }, - "ts-loader": { - "optional": true - }, - "typescript": { - "optional": true - }, - "vue": { - "optional": true - }, - "vue-loader": { - "optional": true - }, - "webpack": { - "optional": false - }, - "webpack-cli": { - "optional": false - }, - "webpack-dev-server": { - "optional": true - }, - "webpack-notifier": { - "optional": true - } - } - }, - "node_modules/@szmarczak/http-timer": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/@szmarczak/http-timer/-/http-timer-5.0.1.tgz", - "integrity": "sha512-+PmQX0PiAYPMeVYe237LJAYvOMYW1j2rH5YROyS3b4CTVJum34HfRvKvAzozHAQG0TnHNdUfY9nCeUyRAs//cw==", - "license": "MIT", - "dependencies": { - "defer-to-connect": "^2.0.1" - }, - "engines": { - "node": ">=14.16" - } - }, "node_modules/@tailwindcss/forms": { - "version": "0.5.10", - "resolved": "https://registry.npmjs.org/@tailwindcss/forms/-/forms-0.5.10.tgz", - "integrity": "sha512-utI1ONF6uf/pPNO68kmN1b8rEwNXv3czukalo8VtJH8ksIkZXr3Q3VYudZLkCsDd4Wku120uF02hYK25XGPorw==", + "version": "0.5.11", + "resolved": "https://registry.npmjs.org/@tailwindcss/forms/-/forms-0.5.11.tgz", + "integrity": "sha512-h9wegbZDPurxG22xZSoWtdzc41/OlNEUQERNqI/0fOwa2aVlWGu7C35E/x6LDyD3lgtztFSSjKZyuVM0hxhbgA==", "dev": true, "license": "MIT", "dependencies": { @@ -5616,22 +3774,57 @@ "tailwindcss": ">=3.0.0 || >= 3.0.0-alpha.1 || >= 4.0.0-alpha.20 || >= 4.0.0-beta.1" } }, + "node_modules/@tanstack/virtual-core": { + "version": "3.17.0", + "resolved": "https://registry.npmjs.org/@tanstack/virtual-core/-/virtual-core-3.17.0.tgz", + "integrity": "sha512-gOxY/hFkPh/XQYhnThBHzkbkX3Ed+z/iushyz+R+JAr213aXxUDgQoTgTdrDpBSRsjFM73P/KfUyWmaF9WHMkQ==", + "dev": true, + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/tannerlinsley" + } + }, + "node_modules/@tanstack/vue-virtual": { + "version": "3.13.28", + "resolved": "https://registry.npmjs.org/@tanstack/vue-virtual/-/vue-virtual-3.13.28.tgz", + "integrity": "sha512-A+jWpXtMpWXKhGLKQrXeC9mk1VgYeMWSJ+o0CTCEi+HLYMSQFdVmPG9lJz7d4XJyIkc5xVwZU9QY67QpScqnxA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@tanstack/virtual-core": "3.17.0" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/tannerlinsley" + }, + "peerDependencies": { + "vue": "^2.7.0 || ^3.0.0" + } + }, + "node_modules/@tokenizer/inflate": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/@tokenizer/inflate/-/inflate-0.4.1.tgz", + "integrity": "sha512-2mAv+8pkG6GIZiF1kNg1jAjh27IDxEPKwdGul3snfztFerfPGI1LjDezZp3i7BElXompqEtPmoPx6c2wgtWsOA==", + "license": "MIT", + "dependencies": { + "debug": "^4.4.3", + "token-types": "^6.1.1" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/Borewit" + } + }, "node_modules/@tokenizer/token": { "version": "0.3.0", "resolved": "https://registry.npmjs.org/@tokenizer/token/-/token-0.3.0.tgz", "integrity": "sha512-OvjF+z51L3ov0OyAU0duzsYuvO01PH7x4t6DJx+guahgTnBHkhJdG7soQeTSFLWN3efnHyibZ4Z8l2EuWwJN3A==", "license": "MIT" }, - "node_modules/@trysound/sax": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/@trysound/sax/-/sax-0.2.0.tgz", - "integrity": "sha512-L7z9BgrNEcYyUYtF+HaEfiS5ebkh9jXqbszz7pC0hRBPaatV0XjSD3+eHrpqFemQfgwiFF0QPIarnIihIDn7OA==", - "dev": true, - "license": "ISC", - "engines": { - "node": ">=10.13.0" - } - }, "node_modules/@ts-morph/common": { "version": "0.24.0", "resolved": "https://registry.npmjs.org/@ts-morph/common/-/common-0.24.0.tgz", @@ -5646,9 +3839,9 @@ } }, "node_modules/@ts-morph/common/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==", + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.1.1.tgz", + "integrity": "sha512-WR1cURNjuvBLMZBMbqM0UoE+WAfdUcEV1ccD8PVBVOI+Z3ND4+SZbN8RsfT2bMuG1qwz5RFvPukSZm5fF2D5eA==", "devOptional": true, "license": "MIT", "dependencies": { @@ -5656,13 +3849,13 @@ } }, "node_modules/@ts-morph/common/node_modules/minimatch": { - "version": "9.0.5", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.5.tgz", - "integrity": "sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==", + "version": "9.0.9", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.9.tgz", + "integrity": "sha512-OBwBN9AL4dqmETlpS2zasx+vTeWclWzkblfZk7KTA5j3jeOONz/tRCnZomUyvNg83wL5Zv9Ss6HMJXAgL8R2Yg==", "devOptional": true, "license": "ISC", "dependencies": { - "brace-expansion": "^2.0.1" + "brace-expansion": "^2.0.2" }, "engines": { "node": ">=16 || 14 >=14.17" @@ -5688,9 +3881,9 @@ } }, "node_modules/@tsconfig/node10": { - "version": "1.0.11", - "resolved": "https://registry.npmjs.org/@tsconfig/node10/-/node10-1.0.11.tgz", - "integrity": "sha512-DcRjDCujK/kCk/cUe8Xz8ZSpm8mS3mNNpta+jGCA6USEDfktlNvm1+IuZ9eTcDbNk41BHwpHHeW+N1lKCz4zOw==", + "version": "1.0.12", + "resolved": "https://registry.npmjs.org/@tsconfig/node10/-/node10-1.0.12.tgz", + "integrity": "sha512-UCYBaeFvM11aU2y3YPZ//O5Rhj+xKyzy7mvcIoAjASbigy8mHMryP5cK7dgjlz2hWxh1g5pLw084E0a/wlUSFQ==", "dev": true, "license": "MIT" }, @@ -5716,9 +3909,9 @@ "license": "MIT" }, "node_modules/@tuyau/utils": { - "version": "0.0.4", - "resolved": "https://registry.npmjs.org/@tuyau/utils/-/utils-0.0.4.tgz", - "integrity": "sha512-ex6CAJNLiTuOvx7nUrgs8FwNG/t88Mi8QTLSO3muHbB6vBSpYimZ6iSUkk4cjEFd4XDy0y+24GDgXKoBfGf4ag==", + "version": "0.0.7", + "resolved": "https://registry.npmjs.org/@tuyau/utils/-/utils-0.0.7.tgz", + "integrity": "sha512-Y1JgQoshbcxEwmajeWpJibBmoBlGuEq38ICKmWQ5dS+ESqY0J0757rWcHAQgiB74J1vf/DxHkt8veBRSKTAjJQ==", "license": "ISC" }, "node_modules/@types/bcryptjs": { @@ -5729,9 +3922,9 @@ "license": "MIT" }, "node_modules/@types/body-parser": { - "version": "1.19.5", - "resolved": "https://registry.npmjs.org/@types/body-parser/-/body-parser-1.19.5.tgz", - "integrity": "sha512-fB3Zu92ucau0iQ0JMCFQE7b/dv8Ot07NI3KaZIkIUNXq82k4eBAqUaneXfleGY9JWskeS9y+u0nXMyspcuQrCg==", + "version": "1.19.6", + "resolved": "https://registry.npmjs.org/@types/body-parser/-/body-parser-1.19.6.tgz", + "integrity": "sha512-HLFeCYgz89uk22N5Qg3dvGvsv46B8GLvKKo1zKG4NybA8U2DiEO3w9lqGg29t/tfLRJpJ6iQxnVw4OnB7MoM9g==", "dev": true, "license": "MIT", "dependencies": { @@ -5749,23 +3942,21 @@ "@types/node": "*" } }, - "node_modules/@types/bytes": { - "version": "3.1.5", - "resolved": "https://registry.npmjs.org/@types/bytes/-/bytes-3.1.5.tgz", - "integrity": "sha512-VgZkrJckypj85YxEsEavcMmmSOIzkUHqWmM4CCyia5dc54YwsXzJ5uT4fYxBQNEXx+oF1krlhgCbvfubXqZYsQ==", - "license": "MIT" - }, "node_modules/@types/chai": { - "version": "4.3.20", - "resolved": "https://registry.npmjs.org/@types/chai/-/chai-4.3.20.tgz", - "integrity": "sha512-/pC9HAB5I/xMlc5FP77qjCnI16ChlJfW0tGa0IUcFn38VJrTV6DeZ60NU5KZBtaOZqjdpwTWohz5HU1RrhiYxQ==", + "version": "5.2.3", + "resolved": "https://registry.npmjs.org/@types/chai/-/chai-5.2.3.tgz", + "integrity": "sha512-Mw558oeA9fFbv65/y4mHtXDs9bPnFMZAL/jxdPFUpOHHIXX91mcgEHbS5Lahr+pwZFR8A7GQleRWeI6cGFC2UA==", "dev": true, - "license": "MIT" + "license": "MIT", + "dependencies": { + "@types/deep-eql": "*", + "assertion-error": "^2.0.1" + } }, "node_modules/@types/clamscan": { - "version": "2.4.0", - "resolved": "https://registry.npmjs.org/@types/clamscan/-/clamscan-2.4.0.tgz", - "integrity": "sha512-wqYy+klgBWqCFAMNZsJrb5Q4d0VIjMPk2lfGsq5jHMPyq8E61YLOV+3VNrvoJdbNmzVIXGIc9npb0Tjw+MXEfw==", + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/@types/clamscan/-/clamscan-2.4.1.tgz", + "integrity": "sha512-KhBHhXsMGDoEkk87VRtHtDsjoqXD3epu+a09c1sjW7xqpvoihScxhZNdNIPegVCLDvPOp4khiIpy02XabseztQ==", "dev": true, "license": "MIT", "dependencies": { @@ -5797,13 +3988,14 @@ "version": "2.1.5", "resolved": "https://registry.npmjs.org/@types/cookiejar/-/cookiejar-2.1.5.tgz", "integrity": "sha512-he+DHOWReW0nghN24E1WUqM0efK4kI9oTqDm6XmK8ZPe2djZ90BSNdGnIyCLzCPw7/pogPlGbzI2wHGGmi4O/Q==", - "devOptional": true, + "dev": true, "license": "MIT" }, - "node_modules/@types/disposable-email-domains": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/@types/disposable-email-domains/-/disposable-email-domains-1.0.6.tgz", - "integrity": "sha512-+jHw0Q4ERuVYIChlUaoSm/VEuuNFeW7JgUU8Rwa9V1ym6q+gkGmBK5sGTDKqlfmsSdI5bFMHKlEatirPFvd8Xw==", + "node_modules/@types/deep-eql": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/@types/deep-eql/-/deep-eql-4.0.2.tgz", + "integrity": "sha512-c9h9dVVMigMPc4bwTvC5dxqtqJZwQPePsWjPlpSOnojbor6pGqdk541lfA7AqFQr5pB1BRdq0juY9db81BwyFw==", + "dev": true, "license": "MIT" }, "node_modules/@types/escape-html": { @@ -5813,67 +4005,29 @@ "dev": true, "license": "MIT" }, - "node_modules/@types/eslint": { - "version": "9.6.1", - "resolved": "https://registry.npmjs.org/@types/eslint/-/eslint-9.6.1.tgz", - "integrity": "sha512-FXx2pKgId/WyYo2jXw63kk7/+TY7u7AziEJxJAnSFzHlqTAS3Ync6SvgYAN/k4/PQpnnVuzoMuVnByKK2qp0ag==", - "dev": true, - "license": "MIT", - "peer": true, - "dependencies": { - "@types/estree": "*", - "@types/json-schema": "*" - } - }, - "node_modules/@types/eslint-scope": { - "version": "3.7.7", - "resolved": "https://registry.npmjs.org/@types/eslint-scope/-/eslint-scope-3.7.7.tgz", - "integrity": "sha512-MzMFlSLBqNF2gcHWO0G1vP/YQyfvrxZ0bF+u7mzUdZ1/xK4A4sru+nraZz5i3iEIk1l1uyicaDVTB4QbbEkAYg==", - "dev": true, - "license": "MIT", - "peer": true, - "dependencies": { - "@types/eslint": "*", - "@types/estree": "*" - } - }, "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==", - "license": "MIT", - "peer": true + "version": "1.0.9", + "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.9.tgz", + "integrity": "sha512-GhdPgy1el4/ImP05X05Uw4cw2/M93BCUmnEvWZNStlCzEKME4Fkk+YpoA5OiHNQmoS7Cafb8Xa3Pya8m1Qrzeg==", + "license": "MIT" }, "node_modules/@types/express": { - "version": "4.17.21", - "resolved": "https://registry.npmjs.org/@types/express/-/express-4.17.21.tgz", - "integrity": "sha512-ejlPM315qwLpaQlQDTjPdsUFSc6ZsP4AN6AlWnogPjQ7CVi7PYF3YVz+CY3jE2pwYf7E/7HlDAN0rV2GxTG0HQ==", + "version": "4.17.25", + "resolved": "https://registry.npmjs.org/@types/express/-/express-4.17.25.tgz", + "integrity": "sha512-dVd04UKsfpINUnK0yBoYHDF3xu7xVH4BuDotC/xGuycx4CgbP48X/KF/586bcObxT0HENHXEU8Nqtu6NR+eKhw==", "dev": true, "license": "MIT", "dependencies": { "@types/body-parser": "*", "@types/express-serve-static-core": "^4.17.33", "@types/qs": "*", - "@types/serve-static": "*" + "@types/serve-static": "^1" } }, "node_modules/@types/express-serve-static-core": { - "version": "5.0.4", - "resolved": "https://registry.npmjs.org/@types/express-serve-static-core/-/express-serve-static-core-5.0.4.tgz", - "integrity": "sha512-5kz9ScmzBdzTgB/3susoCgfqNDzBjvLL4taparufgSvlwjdLy6UyUy9T/tCpYd2GIdIilCatC4iSQS0QSYHt0w==", - "dev": true, - "license": "MIT", - "dependencies": { - "@types/node": "*", - "@types/qs": "*", - "@types/range-parser": "*", - "@types/send": "*" - } - }, - "node_modules/@types/express/node_modules/@types/express-serve-static-core": { - "version": "4.19.6", - "resolved": "https://registry.npmjs.org/@types/express-serve-static-core/-/express-serve-static-core-4.19.6.tgz", - "integrity": "sha512-N4LZ2xG7DatVqhCZzOGb1Yi5lMbXSZcmdLDe9EzSndPV2HpWYWzRbaerl2n27irrm94EPpprqa8KpskPT085+A==", + "version": "4.19.8", + "resolved": "https://registry.npmjs.org/@types/express-serve-static-core/-/express-serve-static-core-4.19.8.tgz", + "integrity": "sha512-02S5fmqeoKzVZCHPZid4b8JH2eM5HzQLZWN2FohQEy/0eXTq8VXZfSN6Pcr3F6N9R/vNrj7cpgbhjie6m/1tCA==", "dev": true, "license": "MIT", "dependencies": { @@ -5884,18 +4038,20 @@ } }, "node_modules/@types/fs-extra": { - "version": "9.0.13", - "resolved": "https://registry.npmjs.org/@types/fs-extra/-/fs-extra-9.0.13.tgz", - "integrity": "sha512-nEnwB++1u5lVDM2UI4c1+5R+FYaKfaAzS4OococimjVm3nQw3TuzH5UNsocrcTBbhnerblyHj4A49qXbIiZdpA==", + "version": "11.0.4", + "resolved": "https://registry.npmjs.org/@types/fs-extra/-/fs-extra-11.0.4.tgz", + "integrity": "sha512-yTbItCNreRooED33qjunPthRcSjERP1r4MqCZc7wv0u2sUkzTFp45tgUfS5+r7FrZPdmCCNflLhVSP/o+SemsQ==", + "dev": true, "license": "MIT", "dependencies": { + "@types/jsonfile": "*", "@types/node": "*" } }, "node_modules/@types/geojson": { - "version": "7946.0.15", - "resolved": "https://registry.npmjs.org/@types/geojson/-/geojson-7946.0.15.tgz", - "integrity": "sha512-9oSxFzDCT2Rj6DfcHF8G++jxBKS7mBqXl5xrRW+Kbvjry6Uduya2iiwqHPhVXpasAVMBYKkEPGgKhd3+/HZ6xA==", + "version": "7946.0.16", + "resolved": "https://registry.npmjs.org/@types/geojson/-/geojson-7946.0.16.tgz", + "integrity": "sha512-6C8nqWur3j98U6+lXDfTUWIfgvZU+EumvpHKcYjujKH7woYyLj2sUmff0tRhrqM7BohUw7Pz3ZB1jj2gW9Fvmg==", "dev": true, "license": "MIT" }, @@ -5906,56 +4062,28 @@ "license": "MIT" }, "node_modules/@types/http-cache-semantics": { - "version": "4.0.4", - "resolved": "https://registry.npmjs.org/@types/http-cache-semantics/-/http-cache-semantics-4.0.4.tgz", - "integrity": "sha512-1m0bIFVc7eJWyve9S0RnuRgcQqF/Xd5QsUZAZeQFr1Q3/p9JWoQQEqmVy+DPTNpGXwhgIetAoYF8JSc33q29QA==", + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/@types/http-cache-semantics/-/http-cache-semantics-4.2.0.tgz", + "integrity": "sha512-L3LgimLHXtGkWikKnsPg0/VFx9OGZaC+eN1u4r+OB1XRqH3meBIAVC2zr1WdMH+RHmnRkqliQAOHNJ/E0j/e0Q==", "license": "MIT" }, "node_modules/@types/http-errors": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/@types/http-errors/-/http-errors-2.0.4.tgz", - "integrity": "sha512-D0CFMMtydbJAegzOyHjtiKPLlvnm3iTZyZRSZoLq2mRhDdmLfIWOCYPfQJ4cu2erKghU++QvjcUjp/5h7hESpA==", + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/@types/http-errors/-/http-errors-2.0.5.tgz", + "integrity": "sha512-r8Tayk8HJnX0FztbZN7oVqGccWgw98T/0neJphO91KkmOzug1KkofZURD4UaD5uH8AqcFLfdPErnBod0u71/qg==", "dev": true, "license": "MIT" }, "node_modules/@types/http-proxy": { - "version": "1.17.15", - "resolved": "https://registry.npmjs.org/@types/http-proxy/-/http-proxy-1.17.15.tgz", - "integrity": "sha512-25g5atgiVNTIv0LBDTg1H74Hvayx0ajtJPLLcYE3whFv75J0pWNtOBzaXJQgDTmrX1bx5U9YC2w/n65BN1HwRQ==", + "version": "1.17.17", + "resolved": "https://registry.npmjs.org/@types/http-proxy/-/http-proxy-1.17.17.tgz", + "integrity": "sha512-ED6LB+Z1AVylNTu7hdzuBqOgMnvG/ld6wGCG8wFnAzKX5uyW2K3WD52v0gnLCTK/VLpXtKckgWuyScYK6cSPaw==", "dev": true, "license": "MIT", "dependencies": { "@types/node": "*" } }, - "node_modules/@types/istanbul-lib-coverage": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/@types/istanbul-lib-coverage/-/istanbul-lib-coverage-2.0.6.tgz", - "integrity": "sha512-2QF/t/auWm0lsy8XtKVPG19v3sSOQlJe/YHZgfjb/KBBHOGSV+J2q/S671rcq9uTBrLAXmZpqJiaQbMT+zNU1w==", - "dev": true, - "license": "MIT" - }, - "node_modules/@types/istanbul-lib-report": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/@types/istanbul-lib-report/-/istanbul-lib-report-3.0.3.tgz", - "integrity": "sha512-NQn7AHQnk/RSLOxrBbGyJM/aVQ+pjj5HCgasFxc0K/KhoATfQ/47AyUl15I2yBUpihjmas+a+VJBOqecrFH+uA==", - "dev": true, - "license": "MIT", - "dependencies": { - "@types/istanbul-lib-coverage": "*" - } - }, - "node_modules/@types/istanbul-reports": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/@types/istanbul-reports/-/istanbul-reports-1.1.2.tgz", - "integrity": "sha512-P/W9yOX/3oPZSpaYOCQzGqgCQRXn0FFO/V8bWrCQs+wLmvVVxk6CRBXALEvNs9OHIatlnlFokfhuDo2ug01ciw==", - "dev": true, - "license": "MIT", - "dependencies": { - "@types/istanbul-lib-coverage": "*", - "@types/istanbul-lib-report": "*" - } - }, "node_modules/@types/json-schema": { "version": "7.0.15", "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.15.tgz", @@ -5963,20 +4091,45 @@ "dev": true, "license": "MIT" }, + "node_modules/@types/jsonfile": { + "version": "6.1.4", + "resolved": "https://registry.npmjs.org/@types/jsonfile/-/jsonfile-6.1.4.tgz", + "integrity": "sha512-D5qGUYwjvnNNextdU59/+fI+spnwtTFmyQP0h+PfIOSkNfpU6AOICUOkm4i0OnSk+NyjdPJrxCDro0sJsWlRpQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/node": "*" + } + }, "node_modules/@types/leaflet": { - "version": "1.9.16", - "resolved": "https://registry.npmjs.org/@types/leaflet/-/leaflet-1.9.16.tgz", - "integrity": "sha512-wzZoyySUxkgMZ0ihJ7IaUIblG8Rdc8AbbZKLneyn+QjYsj5q1QU7TEKYqwTr10BGSzY5LI7tJk9Ifo+mEjdFRw==", + "version": "1.9.21", + "resolved": "https://registry.npmjs.org/@types/leaflet/-/leaflet-1.9.21.tgz", + "integrity": "sha512-TbAd9DaPGSnzp6QvtYngntMZgcRk+igFELwR2N99XZn7RXUdKgsXMR+28bUO0rPsWp8MIu/f47luLIQuSLYv/w==", "dev": true, "license": "MIT", "dependencies": { "@types/geojson": "*" } }, + "node_modules/@types/lodash": { + "version": "4.17.24", + "resolved": "https://registry.npmjs.org/@types/lodash/-/lodash-4.17.24.tgz", + "integrity": "sha512-gIW7lQLZbue7lRSWEFql49QJJWThrTFFeIMJdp3eH4tKoxm1OvEPg02rm4wCCSHS0cL3/Fizimb35b7k8atwsQ==", + "license": "MIT" + }, + "node_modules/@types/lodash-es": { + "version": "4.17.12", + "resolved": "https://registry.npmjs.org/@types/lodash-es/-/lodash-es-4.17.12.tgz", + "integrity": "sha512-0NgftHUcV4v34VhXm8QBSftKVXtbkBG3ViCjs6+eJ5a6y6Mi/jiFGPc1sC7QK+9BFhWrURE3EOggmWaSxL9OzQ==", + "license": "MIT", + "dependencies": { + "@types/lodash": "*" + } + }, "node_modules/@types/luxon": { - "version": "3.4.2", - "resolved": "https://registry.npmjs.org/@types/luxon/-/luxon-3.4.2.tgz", - "integrity": "sha512-TifLZlFudklWlMBfhubvgqTXRzLDI5pCbGa4P8a3wPyUQSW+1xQ5eDsreP9DWHX3tjq1ke96uYG/nwundroWcA==", + "version": "3.7.1", + "resolved": "https://registry.npmjs.org/@types/luxon/-/luxon-3.7.1.tgz", + "integrity": "sha512-H3iskjFIAn5SlJU7OuxUmTEpebK6TKB8rxZShDslBMZJ5u9S//KM1sbdAisiSrqwLQncVjnpi2OK2J51h+4lsg==", "devOptional": true, "license": "MIT" }, @@ -5984,7 +4137,7 @@ "version": "1.1.4", "resolved": "https://registry.npmjs.org/@types/methods/-/methods-1.1.4.tgz", "integrity": "sha512-ymXWVrDiCxTBE3+RIrrP533E70eA+9qu7zdWoHuOmGujkYtzf4HQF96b8nwHLqhuf4ykX61IGRIB38CC6/sImQ==", - "devOptional": true, + "dev": true, "license": "MIT" }, "node_modules/@types/mime": { @@ -5995,28 +4148,18 @@ "license": "MIT" }, "node_modules/@types/node": { - "version": "22.10.5", - "resolved": "https://registry.npmjs.org/@types/node/-/node-22.10.5.tgz", - "integrity": "sha512-F8Q+SeGimwOo86fiovQh8qiXfFEh2/ocYv7tU5pJ3EXMSSxk1Joj5wefpFK2fHTf/N6HKGSxIDBT9f3gCxXPkQ==", + "version": "22.19.20", + "resolved": "https://registry.npmjs.org/@types/node/-/node-22.19.20.tgz", + "integrity": "sha512-6tELRwSDYWW9EdZhbeZmYGZ1/7Djkt+Ah3/ScEYT9cDord7UJzasR/4D3VONg9tQI5CDp+/CZC1AXj2pCFOvpw==", "license": "MIT", "dependencies": { - "undici-types": "~6.20.0" - } - }, - "node_modules/@types/node-forge": { - "version": "1.3.11", - "resolved": "https://registry.npmjs.org/@types/node-forge/-/node-forge-1.3.11.tgz", - "integrity": "sha512-FQx220y22OKNTqaByeBGqHWYz4cl94tpcxeFdvBo3wjG6XPBuZ0BNgNZRV5J5TFmmcsJ4IzsLkmGRiQbnYsBEQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "@types/node": "*" + "undici-types": "~6.21.0" } }, "node_modules/@types/nodemailer": { - "version": "6.4.17", - "resolved": "https://registry.npmjs.org/@types/nodemailer/-/nodemailer-6.4.17.tgz", - "integrity": "sha512-I9CCaIp6DTldEg7vyUTZi8+9Vo0hi1/T8gv3C89yk1rSAAzoKQ8H8ki/jBYJSFoH/BisgLP8tkZMlQ91CIquww==", + "version": "6.4.23", + "resolved": "https://registry.npmjs.org/@types/nodemailer/-/nodemailer-6.4.23.tgz", + "integrity": "sha512-aFV3/NsYFLSx9mbb5gtirBSXJnAlrusoKNuPbxsASWc7vrKLmIrTQRpdcxNcSFL3VW2A2XpeLEavwb2qMi6nlQ==", "license": "MIT", "dependencies": { "@types/node": "*" @@ -6031,40 +4174,6 @@ "@types/node": "*" } }, - "node_modules/@types/pino": { - "version": "6.3.12", - "resolved": "https://registry.npmjs.org/@types/pino/-/pino-6.3.12.tgz", - "integrity": "sha512-dsLRTq8/4UtVSpJgl9aeqHvbh6pzdmjYD3C092SYgLD2TyoCqHpTJk6vp8DvCTGGc7iowZ2MoiYiVUUCcu7muw==", - "license": "MIT", - "peer": true, - "dependencies": { - "@types/node": "*", - "@types/pino-pretty": "*", - "@types/pino-std-serializers": "*", - "sonic-boom": "^2.1.0" - } - }, - "node_modules/@types/pino-pretty": { - "version": "4.7.5", - "resolved": "https://registry.npmjs.org/@types/pino-pretty/-/pino-pretty-4.7.5.tgz", - "integrity": "sha512-rfHe6VIknk14DymxGqc9maGsRe8/HQSvM2u46EAz2XrS92qsAJnW16dpdFejBuZKD8cRJX6Aw6uVZqIQctMpAg==", - "license": "MIT", - "peer": true, - "dependencies": { - "@types/node": "*", - "@types/pino": "6.3" - } - }, - "node_modules/@types/pino-std-serializers": { - "version": "2.4.1", - "resolved": "https://registry.npmjs.org/@types/pino-std-serializers/-/pino-std-serializers-2.4.1.tgz", - "integrity": "sha512-17XcksO47M24IVTVKPeAByWUd3Oez7EbIjXpSbzMPhXVzgjGtrOa49gKBwxH9hb8dKv58OelsWQ+A1G1l9S3wQ==", - "license": "MIT", - "peer": true, - "dependencies": { - "@types/node": "*" - } - }, "node_modules/@types/pluralize": { "version": "0.0.33", "resolved": "https://registry.npmjs.org/@types/pluralize/-/pluralize-0.0.33.tgz", @@ -6082,9 +4191,9 @@ } }, "node_modules/@types/qrcode": { - "version": "1.5.5", - "resolved": "https://registry.npmjs.org/@types/qrcode/-/qrcode-1.5.5.tgz", - "integrity": "sha512-CdfBi/e3Qk+3Z/fXYShipBT13OJ2fDO2Q2w5CIP5anLTLIndQG9z6P1cnm+8zCWSpm5dnxMFd/uREtb0EXuQzg==", + "version": "1.5.6", + "resolved": "https://registry.npmjs.org/@types/qrcode/-/qrcode-1.5.6.tgz", + "integrity": "sha512-te7NQcV2BOvdj2b1hCAHzAoMNuj65kNBMz0KBaxM6c3VGBOhU0dURQKOtH8CFNI/dsKkwlv32p26qYQTWoB5bw==", "dev": true, "license": "MIT", "dependencies": { @@ -6092,9 +4201,9 @@ } }, "node_modules/@types/qs": { - "version": "6.9.17", - "resolved": "https://registry.npmjs.org/@types/qs/-/qs-6.9.17.tgz", - "integrity": "sha512-rX4/bPcfmvxHDv0XjfJELTTr+iB+tn032nPILqHm5wbthUUUuVtNGGqzhya9XUxjTP8Fpr0qYgSZZKxGY++svQ==", + "version": "6.15.1", + "resolved": "https://registry.npmjs.org/@types/qs/-/qs-6.15.1.tgz", + "integrity": "sha512-GZHUBZR9hckSUhrxmp1nG6NwdpM9fCunJwyThLW1X3AyHgd9IlHb6VANpQQqDr2o/qQp6McZ3y/IA2rVzKzSbw==", "license": "MIT" }, "node_modules/@types/range-parser": { @@ -6112,20 +4221,19 @@ "license": "MIT" }, "node_modules/@types/semver": { - "version": "7.5.8", - "resolved": "https://registry.npmjs.org/@types/semver/-/semver-7.5.8.tgz", - "integrity": "sha512-I8EUhyrgfLrcTkzV3TSsGyl1tSuPrEDzr0yd5m90UgNxQkyDXULk3b6MlQqTCpZpNtWe1K0hzclnZkTcLBe2UQ==", + "version": "7.7.1", + "resolved": "https://registry.npmjs.org/@types/semver/-/semver-7.7.1.tgz", + "integrity": "sha512-FmgJfu+MOcQ370SD0ev7EI8TlCAfKYU+B4m5T3yXc1CiRN94g/SZPtsCkk506aUDtlMnFZvasDwHHUcZUEaYuA==", "dev": true, "license": "MIT" }, "node_modules/@types/send": { - "version": "0.17.4", - "resolved": "https://registry.npmjs.org/@types/send/-/send-0.17.4.tgz", - "integrity": "sha512-x2EM6TJOybec7c52BX0ZspPodMsQUd5L6PRwOunVyVUhXiBSKf3AezDL8Dgvgt5o0UfKNfuA0eMLr2wLT4AiBA==", + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/@types/send/-/send-1.2.1.tgz", + "integrity": "sha512-arsCikDvlU99zl1g69TcAB3mzZPpxgw0UQnaHeC1Nwb015xp8bknZv5rIfri9xTOcMuaVgvabfIRA7PSZVuZIQ==", "dev": true, "license": "MIT", "dependencies": { - "@types/mime": "^1", "@types/node": "*" } }, @@ -6140,15 +4248,26 @@ } }, "node_modules/@types/serve-static": { - "version": "1.15.7", - "resolved": "https://registry.npmjs.org/@types/serve-static/-/serve-static-1.15.7.tgz", - "integrity": "sha512-W8Ym+h8nhuRwaKPaDw34QUkwsGi6Rc4yYqvKFo5rm2FUEhCFbzVWrxXUxuKK8TASjWsysJY0nsmNCGhCOIsrOw==", + "version": "1.15.10", + "resolved": "https://registry.npmjs.org/@types/serve-static/-/serve-static-1.15.10.tgz", + "integrity": "sha512-tRs1dB+g8Itk72rlSI2ZrW6vZg0YrLI81iQSTkMmOqnqCaNr/8Ek4VwWcN5vZgCYWbg/JJSGBlUaYGAOP73qBw==", "dev": true, "license": "MIT", "dependencies": { "@types/http-errors": "*", "@types/node": "*", - "@types/send": "*" + "@types/send": "<1" + } + }, + "node_modules/@types/serve-static/node_modules/@types/send": { + "version": "0.17.6", + "resolved": "https://registry.npmjs.org/@types/send/-/send-0.17.6.tgz", + "integrity": "sha512-Uqt8rPBE8SY0RK8JB1EzVOIZ32uqy8HwdxCnoCOsYrvnswqmFZ/k+9Ikidlk/ImhsdvBsloHbAlewb2IEBV/Og==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/mime": "^1", + "@types/node": "*" } }, "node_modules/@types/sockjs": { @@ -6179,10 +4298,10 @@ "license": "MIT" }, "node_modules/@types/superagent": { - "version": "8.1.9", - "resolved": "https://registry.npmjs.org/@types/superagent/-/superagent-8.1.9.tgz", - "integrity": "sha512-pTVjI73witn+9ILmoJdajHGW2jkSaOzhiFYF1Rd3EQ94kymLqB9PjD9ISg7WaALC7+dCHT0FGe9T2LktLq/3GQ==", - "devOptional": true, + "version": "8.1.10", + "resolved": "https://registry.npmjs.org/@types/superagent/-/superagent-8.1.10.tgz", + "integrity": "sha512-nbt4IWXABhW0jGmmpRzCFNlbmwCTzZ2gTUsNIr+X+ItdqPms+PAJZbWsNzpS2USqXjcoNLQcO6nXo60zcPQiIg==", + "dev": true, "license": "MIT", "dependencies": { "@types/cookiejar": "^2.1.5", @@ -6192,9 +4311,9 @@ } }, "node_modules/@types/supertest": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/@types/supertest/-/supertest-6.0.2.tgz", - "integrity": "sha512-137ypx2lk/wTQbW6An6safu9hXmajAifU/s7szAHLN/FeIm5w7yR0Wkl9fdJMRSHwOn4HLAI0DaB2TOORuhPDg==", + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/@types/supertest/-/supertest-6.0.3.tgz", + "integrity": "sha512-8WzXq62EXFhJ7QsH3Ocb/iKQ/Ty9ZVWnVzoTKc9tyyFRRF3a74Tk2+TLFgaFFw364Ere+npzHKEJ6ga2LzIL7w==", "dev": true, "license": "MIT", "dependencies": { @@ -6203,38 +4322,21 @@ } }, "node_modules/@types/validator": { - "version": "13.12.2", - "resolved": "https://registry.npmjs.org/@types/validator/-/validator-13.12.2.tgz", - "integrity": "sha512-6SlHBzUW8Jhf3liqrGGXyTJSIFe4nqlJ5A5KaMZ2l/vbM3Wh3KSybots/wfWVzNLK4D1NZluDlSQIbIEPx6oyA==", + "version": "13.15.10", + "resolved": "https://registry.npmjs.org/@types/validator/-/validator-13.15.10.tgz", + "integrity": "sha512-T8L6i7wCuyoK8A/ZeLYt1+q0ty3Zb9+qbSSvrIVitzT3YjZqkTZ40IbRsPanlB4h1QB3JVL1SYCdR6ngtFYcuA==", "license": "MIT" }, "node_modules/@types/ws": { - "version": "8.5.13", - "resolved": "https://registry.npmjs.org/@types/ws/-/ws-8.5.13.tgz", - "integrity": "sha512-osM/gWBTPKgHV8XkTunnegTRIsvF6owmf5w+JtAfOw472dptdm0dlGv4xCt6GwQRcC2XVOvvRE/0bAoQcL2QkA==", + "version": "8.18.1", + "resolved": "https://registry.npmjs.org/@types/ws/-/ws-8.18.1.tgz", + "integrity": "sha512-ThVF6DCVhA8kUGy+aazFQ4kXQ7E1Ty7A3ypFOe0IcJV8O/M511G99AW24irKrW56Wt44yG9+ij8FaqoBGkuBXg==", "dev": true, "license": "MIT", "dependencies": { "@types/node": "*" } }, - "node_modules/@types/yargs": { - "version": "15.0.19", - "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-15.0.19.tgz", - "integrity": "sha512-2XUaGVmyQjgyAZldf0D0c14vvo/yv0MhQBSTJcejMMaitsn3nxCB6TmH4G0ZQf+uxROOa9mpanoSm8h6SG/1ZA==", - "dev": true, - "license": "MIT", - "dependencies": { - "@types/yargs-parser": "*" - } - }, - "node_modules/@types/yargs-parser": { - "version": "21.0.3", - "resolved": "https://registry.npmjs.org/@types/yargs-parser/-/yargs-parser-21.0.3.tgz", - "integrity": "sha512-I4q9QU9MQv4oEOz4tAHJtNz1cwuLxn2F3xcc2iV5WdqLPpUnj30aUuxt1mAxYTG+oe8CZMV/+6rU4S4gRDzqtQ==", - "dev": true, - "license": "MIT" - }, "node_modules/@typescript-eslint/eslint-plugin": { "version": "5.62.0", "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-5.62.0.tgz", @@ -6270,6 +4372,19 @@ } } }, + "node_modules/@typescript-eslint/eslint-plugin/node_modules/semver": { + "version": "7.8.2", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.8.2.tgz", + "integrity": "sha512-c8jsqUZm3omBOI66G90z1Dyw5z622G8oLG+omfsHBJf3CWQTlOcwOjvOG6wtiNfW6anKm/eA39LMwMtMez2TiQ==", + "dev": true, + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, "node_modules/@typescript-eslint/parser": { "version": "5.62.0", "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-5.62.0.tgz", @@ -6407,6 +4522,19 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/@typescript-eslint/typescript-estree/node_modules/semver": { + "version": "7.8.2", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.8.2.tgz", + "integrity": "sha512-c8jsqUZm3omBOI66G90z1Dyw5z622G8oLG+omfsHBJf3CWQTlOcwOjvOG6wtiNfW6anKm/eA39LMwMtMez2TiQ==", + "dev": true, + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, "node_modules/@typescript-eslint/typescript-estree/node_modules/slash": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", @@ -6468,6 +4596,19 @@ "node": ">=4.0" } }, + "node_modules/@typescript-eslint/utils/node_modules/semver": { + "version": "7.8.2", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.8.2.tgz", + "integrity": "sha512-c8jsqUZm3omBOI66G90z1Dyw5z622G8oLG+omfsHBJf3CWQTlOcwOjvOG6wtiNfW6anKm/eA39LMwMtMez2TiQ==", + "dev": true, + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, "node_modules/@typescript-eslint/visitor-keys": { "version": "5.62.0", "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-5.62.0.tgz", @@ -6487,33 +4628,32 @@ } }, "node_modules/@ungap/structured-clone": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/@ungap/structured-clone/-/structured-clone-1.2.1.tgz", - "integrity": "sha512-fEzPV3hSkSMltkw152tJKNARhOupqbH96MZWyRjNaYZOMIzbrTeQDG+MTc6Mr2pgzFQzFxAfmhGDNP5QK++2ZA==", + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/@ungap/structured-clone/-/structured-clone-1.3.1.tgz", + "integrity": "sha512-mUFwbeTqrVgDQxFveS+df2yfap6iuP20NAKAsBt5jDEoOTDew+zwLAOilHCeQJOVSvmgCX4ogqIrA0mnyr08yQ==", "dev": true, "license": "ISC" }, "node_modules/@vavite/multibuild": { - "version": "4.1.3", - "resolved": "https://registry.npmjs.org/@vavite/multibuild/-/multibuild-4.1.3.tgz", - "integrity": "sha512-V+6mskWf4GMQVb53w2fdJ5aR+zVkzpuCE9q3lDDo0v8AHjQApOeXydj/5rTERIFkO46yNHmr3insg2I/tC0TtA==", + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/@vavite/multibuild/-/multibuild-5.1.0.tgz", + "integrity": "sha512-xhJS6oAhQqDCRFFmpZWNCcAJw7145pvlfKX/IOCQX7oqulbw9amH9rdrNXmwz79UeYgOwxXpWfEavyYTPLY1KQ==", + "deprecated": "Package no longer supported. Contact Support at https://www.npmjs.com/support for more info.", "license": "MIT", - "peer": true, "dependencies": { - "@types/node": "^18.19.50", + "@types/node": "^18.19.67", "cac": "^6.7.14", - "picocolors": "^1.1.0" + "picocolors": "^1.1.1" }, "peerDependencies": { - "vite": "^2.8.1 || 3 || 4 || 5" + "vite": "^2.8.1 || 3 || 4 || 5 || 6" } }, "node_modules/@vavite/multibuild/node_modules/@types/node": { - "version": "18.19.70", - "resolved": "https://registry.npmjs.org/@types/node/-/node-18.19.70.tgz", - "integrity": "sha512-RE+K0+KZoEpDUbGGctnGdkrLFwi1eYKTlIHNl2Um98mUkGsm1u2Ff6Ltd0e8DktTtC98uy7rSj+hO8t/QuLoVQ==", + "version": "18.19.130", + "resolved": "https://registry.npmjs.org/@types/node/-/node-18.19.130.tgz", + "integrity": "sha512-GRaXQx6jGfL8sKfaIDD6OupbIHBr9jv7Jnaml9tB7l4v068PAOXqfcujMMo5PhbIs6ggR1XODELqahT2R8v0fg==", "license": "MIT", - "peer": true, "dependencies": { "undici-types": "~5.26.4" } @@ -6522,142 +4662,184 @@ "version": "5.26.5", "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-5.26.5.tgz", "integrity": "sha512-JlCMO+ehdEIKqlFxk6IfVoAUVmgz7cU7zD/h9XZ0qzeosSHmUJVOzSQvvYSYWXkFXC+IfLKSIffhv0sVZup6pA==", - "license": "MIT", - "peer": true + "license": "MIT" }, "node_modules/@vinejs/compiler": { - "version": "2.5.1", - "resolved": "https://registry.npmjs.org/@vinejs/compiler/-/compiler-2.5.1.tgz", - "integrity": "sha512-efiO/SCQSMCqz6LDZTI4R3Ceq1ik3K2IqefEbbch+ko4dZncaYmQWJpX/fXVwgmO78jTZuerzD4I2WphPJUCwg==", + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/@vinejs/compiler/-/compiler-3.0.0.tgz", + "integrity": "sha512-v9Lsv59nR56+bmy2p0+czjZxsLHwaibJ+SV5iK9JJfehlJMa501jUJQqqz4X/OqKXrxtE3uTQmSqjUqzF3B2mw==", "license": "MIT", "engines": { "node": ">=18.0.0" } }, "node_modules/@vinejs/vine": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/@vinejs/vine/-/vine-2.1.0.tgz", - "integrity": "sha512-09aJ2OauxpblqiNqd8qC9RAzzm5SV6fTqZhE4e25j4cM7fmNoXRTjM7Oo8llFADMO4eSA44HqYEO3mkRRYdbYw==", + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/@vinejs/vine/-/vine-3.0.1.tgz", + "integrity": "sha512-ZtvYkYpZOYdvbws3uaOAvTFuvFXoQGAtmzeiXu+XSMGxi5GVsODpoI9Xu9TplEMuD/5fmAtBbKb9cQHkWkLXDQ==", "license": "MIT", "dependencies": { - "@poppinss/macroable": "^1.0.2", - "@types/validator": "^13.11.9", - "@vinejs/compiler": "^2.5.0", + "@poppinss/macroable": "^1.0.4", + "@types/validator": "^13.12.2", + "@vinejs/compiler": "^3.0.0", "camelcase": "^8.0.0", - "dayjs": "^1.11.11", + "dayjs": "^1.11.13", "dlv": "^1.1.3", "normalize-url": "^8.0.1", - "validator": "^13.11.0" + "validator": "^13.12.0" }, "engines": { "node": ">=18.16.0" } }, + "node_modules/@vitejs/plugin-vue": { + "version": "5.2.4", + "resolved": "https://registry.npmjs.org/@vitejs/plugin-vue/-/plugin-vue-5.2.4.tgz", + "integrity": "sha512-7Yx/SXSOcQq5HiiV3orevHUFn+pmMB4cgbEkDYgnkUWb0WfeQ/wa2yFv6D5ICiCQOVpjA7vYDXrC7AGO8yjDHA==", + "dev": true, + "license": "MIT", + "engines": { + "node": "^18.0.0 || >=20.0.0" + }, + "peerDependencies": { + "vite": "^5.0.0 || ^6.0.0", + "vue": "^3.2.25" + } + }, "node_modules/@vue/compiler-core": { - "version": "3.5.13", - "resolved": "https://registry.npmjs.org/@vue/compiler-core/-/compiler-core-3.5.13.tgz", - "integrity": "sha512-oOdAkwqUfW1WqpwSYJce06wvt6HljgY3fGeM9NcVA1HaYOij3mZG9Rkysn0OHuyUAGMbEbARIpsG+LPVlBJ5/Q==", + "version": "3.5.35", + "resolved": "https://registry.npmjs.org/@vue/compiler-core/-/compiler-core-3.5.35.tgz", + "integrity": "sha512-BUmHaR1J+O+CKZ9uJucdVTEr1LHsdyvv7vG3eNRhK3CczEHeMd/LtsHAuD7PbrxvI2envCY2v7HI1vC1aBRzKw==", "license": "MIT", "dependencies": { - "@babel/parser": "^7.25.3", - "@vue/shared": "3.5.13", - "entities": "^4.5.0", + "@babel/parser": "^7.29.3", + "@vue/shared": "3.5.35", + "entities": "^7.0.1", "estree-walker": "^2.0.2", - "source-map-js": "^1.2.0" + "source-map-js": "^1.2.1" } }, "node_modules/@vue/compiler-dom": { - "version": "3.5.13", - "resolved": "https://registry.npmjs.org/@vue/compiler-dom/-/compiler-dom-3.5.13.tgz", - "integrity": "sha512-ZOJ46sMOKUjO3e94wPdCzQ6P1Lx/vhp2RSvfaab88Ajexs0AHeV0uasYhi99WPaogmBlRHNRuly8xV75cNTMDA==", + "version": "3.5.35", + "resolved": "https://registry.npmjs.org/@vue/compiler-dom/-/compiler-dom-3.5.35.tgz", + "integrity": "sha512-k+bprkXxuqhVajgTx5mUHuir7TwQzUKOWR40ng1ncAqQRPnrLngGGgqVEEhOnTMlc8btHYVKmrP8s5Qyg0hvYA==", "license": "MIT", "dependencies": { - "@vue/compiler-core": "3.5.13", - "@vue/shared": "3.5.13" + "@vue/compiler-core": "3.5.35", + "@vue/shared": "3.5.35" } }, "node_modules/@vue/compiler-sfc": { - "version": "3.5.13", - "resolved": "https://registry.npmjs.org/@vue/compiler-sfc/-/compiler-sfc-3.5.13.tgz", - "integrity": "sha512-6VdaljMpD82w6c2749Zhf5T9u5uLBWKnVue6XWxprDobftnletJ8+oel7sexFfM3qIxNmVE7LSFGTpv6obNyaQ==", + "version": "3.5.35", + "resolved": "https://registry.npmjs.org/@vue/compiler-sfc/-/compiler-sfc-3.5.35.tgz", + "integrity": "sha512-G5VPMcXTSywXBgtFOZOnHKBxKSrwXUcvY1iaF5/hRcy7t0J6CH/d8ha9F4nzi00Fax1eLV0QHM7v4mQu68jydw==", "license": "MIT", "dependencies": { - "@babel/parser": "^7.25.3", - "@vue/compiler-core": "3.5.13", - "@vue/compiler-dom": "3.5.13", - "@vue/compiler-ssr": "3.5.13", - "@vue/shared": "3.5.13", + "@babel/parser": "^7.29.3", + "@vue/compiler-core": "3.5.35", + "@vue/compiler-dom": "3.5.35", + "@vue/compiler-ssr": "3.5.35", + "@vue/shared": "3.5.35", "estree-walker": "^2.0.2", - "magic-string": "^0.30.11", - "postcss": "^8.4.48", - "source-map-js": "^1.2.0" + "magic-string": "^0.30.21", + "postcss": "^8.5.15", + "source-map-js": "^1.2.1" } }, "node_modules/@vue/compiler-ssr": { - "version": "3.5.13", - "resolved": "https://registry.npmjs.org/@vue/compiler-ssr/-/compiler-ssr-3.5.13.tgz", - "integrity": "sha512-wMH6vrYHxQl/IybKJagqbquvxpWCuVYpoUJfCqFZwa/JY1GdATAQ+TgVtgrwwMZ0D07QhA99rs/EAAWfvG6KpA==", + "version": "3.5.35", + "resolved": "https://registry.npmjs.org/@vue/compiler-ssr/-/compiler-ssr-3.5.35.tgz", + "integrity": "sha512-rGhAeXgdM7/ffTJGXT69rCCdTmjDewnFuUZfBQQHTdcEBeWdT5HCGY60y2ytLJr9/Dsu7IntUi5z/w0h6Rjnzw==", "license": "MIT", "dependencies": { - "@vue/compiler-dom": "3.5.13", - "@vue/shared": "3.5.13" + "@vue/compiler-dom": "3.5.35", + "@vue/shared": "3.5.35" } }, "node_modules/@vue/devtools-api": { - "version": "6.6.4", - "resolved": "https://registry.npmjs.org/@vue/devtools-api/-/devtools-api-6.6.4.tgz", - "integrity": "sha512-sGhTPMuXqZ1rVOk32RylztWkfXTRhuS7vgAKv0zjqk8gbsHkJ7xfFf+jbySxt7tWObEJwyKaHMikV/WGDiQm8g==", + "version": "7.7.9", + "resolved": "https://registry.npmjs.org/@vue/devtools-api/-/devtools-api-7.7.9.tgz", + "integrity": "sha512-kIE8wvwlcZ6TJTbNeU2HQNtaxLx3a84aotTITUuL/4bzfPxzajGBOoqjMhwZJ8L9qFYDU/lAYMEEm11dnZOD6g==", "dev": true, - "license": "MIT" - }, - "node_modules/@vue/reactivity": { - "version": "3.5.13", - "resolved": "https://registry.npmjs.org/@vue/reactivity/-/reactivity-3.5.13.tgz", - "integrity": "sha512-NaCwtw8o48B9I6L1zl2p41OHo/2Z4wqYGGIK1Khu5T7yxrn+ATOixn/Udn2m+6kZKB/J7cuT9DbWWhRxqixACg==", "license": "MIT", "dependencies": { - "@vue/shared": "3.5.13" + "@vue/devtools-kit": "^7.7.9" + } + }, + "node_modules/@vue/devtools-kit": { + "version": "7.7.9", + "resolved": "https://registry.npmjs.org/@vue/devtools-kit/-/devtools-kit-7.7.9.tgz", + "integrity": "sha512-PyQ6odHSgiDVd4hnTP+aDk2X4gl2HmLDfiyEnn3/oV+ckFDuswRs4IbBT7vacMuGdwY/XemxBoh302ctbsptuA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@vue/devtools-shared": "^7.7.9", + "birpc": "^2.3.0", + "hookable": "^5.5.3", + "mitt": "^3.0.1", + "perfect-debounce": "^1.0.0", + "speakingurl": "^14.0.1", + "superjson": "^2.2.2" + } + }, + "node_modules/@vue/devtools-shared": { + "version": "7.7.9", + "resolved": "https://registry.npmjs.org/@vue/devtools-shared/-/devtools-shared-7.7.9.tgz", + "integrity": "sha512-iWAb0v2WYf0QWmxCGy0seZNDPdO3Sp5+u78ORnyeonS6MT4PC7VPrryX2BpMJrwlDeaZ6BD4vP4XKjK0SZqaeA==", + "dev": true, + "license": "MIT", + "dependencies": { + "rfdc": "^1.4.1" + } + }, + "node_modules/@vue/reactivity": { + "version": "3.5.35", + "resolved": "https://registry.npmjs.org/@vue/reactivity/-/reactivity-3.5.35.tgz", + "integrity": "sha512-tVc+SsHConvh/Lz64qq1pP3rYArBmK42xonovEcxY74SQtvctZodG/zhq54P5dr38cVuw25d27cPNRdlMidpGQ==", + "license": "MIT", + "dependencies": { + "@vue/shared": "3.5.35" } }, "node_modules/@vue/runtime-core": { - "version": "3.5.13", - "resolved": "https://registry.npmjs.org/@vue/runtime-core/-/runtime-core-3.5.13.tgz", - "integrity": "sha512-Fj4YRQ3Az0WTZw1sFe+QDb0aXCerigEpw418pw1HBUKFtnQHWzwojaukAs2X/c9DQz4MQ4bsXTGlcpGxU/RCIw==", + "version": "3.5.35", + "resolved": "https://registry.npmjs.org/@vue/runtime-core/-/runtime-core-3.5.35.tgz", + "integrity": "sha512-A/xFNX9loIcWDygeQuNCfKuh0CoYBzxhqEMNah5TSFg9Z53DrFYEN2qi5CU9necjM1OWYegYREUTHmXTmhfXtg==", "license": "MIT", "dependencies": { - "@vue/reactivity": "3.5.13", - "@vue/shared": "3.5.13" + "@vue/reactivity": "3.5.35", + "@vue/shared": "3.5.35" } }, "node_modules/@vue/runtime-dom": { - "version": "3.5.13", - "resolved": "https://registry.npmjs.org/@vue/runtime-dom/-/runtime-dom-3.5.13.tgz", - "integrity": "sha512-dLaj94s93NYLqjLiyFzVs9X6dWhTdAlEAciC3Moq7gzAc13VJUdCnjjRurNM6uTLFATRHexHCTu/Xp3eW6yoog==", + "version": "3.5.35", + "resolved": "https://registry.npmjs.org/@vue/runtime-dom/-/runtime-dom-3.5.35.tgz", + "integrity": "sha512-odrJ1C391dbGnyDRh8U+rnP7J2amIEzfmRk5vXy7xi3aZhEXofTvpi0T4HJb6jlNqQZTNPR5MPHSB3RHNkIORA==", "license": "MIT", "dependencies": { - "@vue/reactivity": "3.5.13", - "@vue/runtime-core": "3.5.13", - "@vue/shared": "3.5.13", - "csstype": "^3.1.3" + "@vue/reactivity": "3.5.35", + "@vue/runtime-core": "3.5.35", + "@vue/shared": "3.5.35", + "csstype": "^3.2.3" } }, "node_modules/@vue/server-renderer": { - "version": "3.5.13", - "resolved": "https://registry.npmjs.org/@vue/server-renderer/-/server-renderer-3.5.13.tgz", - "integrity": "sha512-wAi4IRJV/2SAW3htkTlB+dHeRmpTiVIK1OGLWV1yeStVSebSQQOwGwIq0D3ZIoBj2C2qpgz5+vX9iEBkTdk5YA==", + "version": "3.5.35", + "resolved": "https://registry.npmjs.org/@vue/server-renderer/-/server-renderer-3.5.35.tgz", + "integrity": "sha512-NkebSOYdB97wi8OQcO3HqzZSlymJi/aWsN/7h74OSVhRTm6qGs3Jp3e0rCXynmWwSlKeRrnlIug+ilYoHBmQDA==", "license": "MIT", "dependencies": { - "@vue/compiler-ssr": "3.5.13", - "@vue/shared": "3.5.13" + "@vue/compiler-ssr": "3.5.35", + "@vue/shared": "3.5.35" }, "peerDependencies": { - "vue": "3.5.13" + "vue": "3.5.35" } }, "node_modules/@vue/shared": { - "version": "3.5.13", - "resolved": "https://registry.npmjs.org/@vue/shared/-/shared-3.5.13.tgz", - "integrity": "sha512-/hnE/qP5ZoGpol0a5mDi45bOd7t3tjYJBjsgCsivow7D48cJeV5l05RD82lPqi7gRiphZM37rnhW1l6ZoCNNnQ==", + "version": "3.5.35", + "resolved": "https://registry.npmjs.org/@vue/shared/-/shared-3.5.35.tgz", + "integrity": "sha512-zSbjL7gRXwks2ZQLRGCajBtBXEOXW9Ddhn/HvSdrGkE2dqGnumzW8XtusRrxrE9LvqtiqDXQ+A60Hp6mvdYxfA==", "license": "MIT" }, "node_modules/@webassemblyjs/ast": { @@ -6836,56 +5018,6 @@ "@xtuc/long": "4.2.2" } }, - "node_modules/@webpack-cli/configtest": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/@webpack-cli/configtest/-/configtest-2.1.1.tgz", - "integrity": "sha512-wy0mglZpDSiSS0XHrVR+BAdId2+yxPSoJW8fsna3ZpYSlufjvxnP4YbKTCBZnNIcGN4r6ZPXV55X4mYExOfLmw==", - "dev": true, - "license": "MIT", - "peer": true, - "engines": { - "node": ">=14.15.0" - }, - "peerDependencies": { - "webpack": "5.x.x", - "webpack-cli": "5.x.x" - } - }, - "node_modules/@webpack-cli/info": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/@webpack-cli/info/-/info-2.0.2.tgz", - "integrity": "sha512-zLHQdI/Qs1UyT5UBdWNqsARasIA+AaF8t+4u2aS2nEpBQh2mWIVb8qAklq0eUENnC5mOItrIB4LiS9xMtph18A==", - "dev": true, - "license": "MIT", - "peer": true, - "engines": { - "node": ">=14.15.0" - }, - "peerDependencies": { - "webpack": "5.x.x", - "webpack-cli": "5.x.x" - } - }, - "node_modules/@webpack-cli/serve": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/@webpack-cli/serve/-/serve-2.0.5.tgz", - "integrity": "sha512-lqaoKnRYBdo1UgDX8uF24AfGMifWK19TxPmM5FHc2vAGxrJ/qtyUyFBWoY1tISZdelsQ5fBcOusifo5o5wSJxQ==", - "dev": true, - "license": "MIT", - "peer": true, - "engines": { - "node": ">=14.15.0" - }, - "peerDependencies": { - "webpack": "5.x.x", - "webpack-cli": "5.x.x" - }, - "peerDependenciesMeta": { - "webpack-dev-server": { - "optional": true - } - } - }, "node_modules/@xtuc/ieee754": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/@xtuc/ieee754/-/ieee754-1.2.0.tgz", @@ -6908,19 +5040,6 @@ "integrity": "sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q==", "license": "ISC" }, - "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==", - "dev": true, - "license": "MIT", - "dependencies": { - "event-target-shim": "^5.0.0" - }, - "engines": { - "node": ">=6.5" - } - }, "node_modules/abstract-logging": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/abstract-logging/-/abstract-logging-2.0.1.tgz", @@ -6940,10 +5059,31 @@ "node": ">= 0.6" } }, + "node_modules/accepts/node_modules/mime-db": { + "version": "1.52.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", + "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==", + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/accepts/node_modules/mime-types": { + "version": "2.1.35", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz", + "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", + "license": "MIT", + "dependencies": { + "mime-db": "1.52.0" + }, + "engines": { + "node": ">= 0.6" + } + }, "node_modules/acorn": { - "version": "8.14.0", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.14.0.tgz", - "integrity": "sha512-cl669nCJTZBsL97OF4kUQm5g5hC2uihk0NxY3WENAC0TYdILVkAyHymAntgxGkl7K+t0cXIrH5siy5S4XkFycA==", + "version": "8.16.0", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.16.0.tgz", + "integrity": "sha512-UVJyE9MttOsBQIDKw1skb9nAwQuR5wuGD3+82K6JgJlm/Y+KI92oNsMNGZCYdDsVtRHSak0pcV5Dno5+4jh9sw==", "license": "MIT", "bin": { "acorn": "bin/acorn" @@ -6952,6 +5092,20 @@ "node": ">=0.4.0" } }, + "node_modules/acorn-import-phases": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/acorn-import-phases/-/acorn-import-phases-1.0.4.tgz", + "integrity": "sha512-wKmbr/DDiIXzEOiWrTTUcDm24kQ2vGfZQvM2fwg2vXqR5uW6aapr7ObPtj1th32b9u90/Pf4AItvdTh42fBmVQ==", + "dev": true, + "license": "MIT", + "peer": true, + "engines": { + "node": ">=10.13.0" + }, + "peerDependencies": { + "acorn": "^8.14.0" + } + }, "node_modules/acorn-jsx": { "version": "5.3.2", "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.2.tgz", @@ -6963,9 +5117,9 @@ } }, "node_modules/acorn-walk": { - "version": "8.3.4", - "resolved": "https://registry.npmjs.org/acorn-walk/-/acorn-walk-8.3.4.tgz", - "integrity": "sha512-ueEepnujpqee2o5aIYnvHU6C0A42MNdsIDeqy5BydrkuC5R1ZuUFnm27EeFJGoEHJQgn3uleRvmTXaJgfXbt4g==", + "version": "8.3.5", + "resolved": "https://registry.npmjs.org/acorn-walk/-/acorn-walk-8.3.5.tgz", + "integrity": "sha512-HEHNfbars9v4pgpW6SO1KSPkfoS0xVOM/9UzkJltjlsHZmJasxg8aXkuZa7SMf8vKGIBhpUsPluQSqhJFCqebw==", "dev": true, "license": "MIT", "dependencies": { @@ -6975,20 +5129,6 @@ "node": ">=0.4.0" } }, - "node_modules/adjust-sourcemap-loader": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/adjust-sourcemap-loader/-/adjust-sourcemap-loader-4.0.0.tgz", - "integrity": "sha512-OXwN5b9pCUXNQHJpwwD2qP40byEmSgzj8B4ydSN0uMNYWiFmJ6x6KwUllMmfk8Rwu/HJDFR7U8ubsWBoN0Xp0A==", - "dev": true, - "license": "MIT", - "dependencies": { - "loader-utils": "^2.0.0", - "regex-parser": "^2.2.11" - }, - "engines": { - "node": ">=8.9" - } - }, "node_modules/agent-base": { "version": "6.0.2", "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-6.0.2.tgz", @@ -7002,9 +5142,9 @@ } }, "node_modules/ajv": { - "version": "6.12.6", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", - "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", + "version": "6.15.0", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.15.0.tgz", + "integrity": "sha512-fgFx7Hfoq60ytK2c7DhnF8jIvzYgOMxfugjLOSMHjLIPgenqa7S7oaagATUq99mV6IYvN2tRmC0wnTYX6iPbMw==", "dev": true, "license": "MIT", "dependencies": { @@ -7037,9 +5177,9 @@ } }, "node_modules/ajv-formats/node_modules/ajv": { - "version": "8.17.1", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.17.1.tgz", - "integrity": "sha512-B/gBuNg5SiMTrPkC+A2+cW0RszwxYmn6VYxB/inlBStS5nx6xHIt/ehKRhIMhqusl7a8LjQoZnjCs5vhwxOQ1g==", + "version": "8.20.0", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.20.0.tgz", + "integrity": "sha512-Thbli+OlOj+iMPYFBVBfJ3OmCAnaSyNn4M1vz9T6Gka5Jt9ba/HIR56joy65tY6kx/FCF5VXNB819Y7/GUrBGA==", "dev": true, "license": "MIT", "dependencies": { @@ -7060,17 +5200,6 @@ "dev": true, "license": "MIT" }, - "node_modules/ajv-keywords": { - "version": "3.5.2", - "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-3.5.2.tgz", - "integrity": "sha512-5p6WTN0DdTGVQk6VjcEju19IgaHudalcfabD7yhDGeA6bcQnmL+CpveLJq/3hvfwd1aof6L386Ougkx6RfyMIQ==", - "dev": true, - "license": "MIT", - "peer": true, - "peerDependencies": { - "ajv": "^6.9.1" - } - }, "node_modules/ansi-colors": { "version": "4.1.3", "resolved": "https://registry.npmjs.org/ansi-colors/-/ansi-colors-4.1.3.tgz", @@ -7081,9 +5210,9 @@ } }, "node_modules/ansi-escapes": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-7.0.0.tgz", - "integrity": "sha512-GdYO7a61mR0fOlAsvC9/rIHf7L96sBc6dEWzeOu+KAea5bZyQRPIpojrVoI4AXGJS/ycu/fBTdLrUkA4ODrvjw==", + "version": "7.3.0", + "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-7.3.0.tgz", + "integrity": "sha512-BvU8nYgGQBxcmMuEeUEmNTvrMVjJNSH7RgW24vXexN4Ven6qCvy4TntnvlnwnMLTVlcRQQdbRY8NKnaIoeWDNg==", "license": "MIT", "dependencies": { "environment": "^1.0.0" @@ -7118,16 +5247,18 @@ } }, "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, + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", "license": "MIT", "dependencies": { - "color-convert": "^1.9.0" + "color-convert": "^2.0.1" }, "engines": { - "node": ">=4" + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" } }, "node_modules/any-promise": { @@ -7152,9 +5283,9 @@ } }, "node_modules/anymatch/node_modules/picomatch": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", - "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.2.tgz", + "integrity": "sha512-V7+vQEJ06Z+c5tSye8S+nHUfI51xoXIXjHQ99cQtKUkQqqO1kO/KCJUfZXuB47h/YBlDhah2H3hdUGXn8ie0oA==", "dev": true, "license": "MIT", "engines": { @@ -7164,173 +5295,10 @@ "url": "https://github.com/sponsors/jonschlinkert" } }, - "node_modules/api-contract-validator": { - "version": "2.2.8", - "resolved": "https://registry.npmjs.org/api-contract-validator/-/api-contract-validator-2.2.8.tgz", - "integrity": "sha512-YM3rMcrIp8Thf/WWbVBXBGX793Mm3Phw2pn3VbJpiZkpeTCTtF10huKPrzQ2gSIaK5GjAhTRJMAOyf+rsS7MAw==", - "dev": true, - "license": "Apache-2.0", - "dependencies": { - "api-schema-builder": "^2.0.10", - "chalk": "^3.0.0", - "columnify": "^1.5.4", - "jest-diff": "^25.5.0", - "jest-matcher-utils": "^25.5.0", - "lodash.flatten": "^4.4.0", - "lodash.get": "^4.4.2", - "lodash.set": "^4.3.2", - "uri-js": "^4.4.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/api-contract-validator/node_modules/ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "dev": true, - "license": "MIT", - "dependencies": { - "color-convert": "^2.0.1" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" - } - }, - "node_modules/api-contract-validator/node_modules/chalk": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-3.0.0.tgz", - "integrity": "sha512-4D3B6Wf41KOYRFdszmDqMCGq5VV/uMAB273JILmO+3jAlh8X4qDtdtgCR3fxtbLEMzSx22QdhnDcJvu2u1fVwg==", - "dev": true, - "license": "MIT", - "dependencies": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/api-contract-validator/node_modules/color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "color-name": "~1.1.4" - }, - "engines": { - "node": ">=7.0.0" - } - }, - "node_modules/api-contract-validator/node_modules/color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "dev": true, - "license": "MIT" - }, - "node_modules/api-contract-validator/node_modules/diff-sequences": { - "version": "25.2.6", - "resolved": "https://registry.npmjs.org/diff-sequences/-/diff-sequences-25.2.6.tgz", - "integrity": "sha512-Hq8o7+6GaZeoFjtpgvRBUknSXNeJiCx7V9Fr94ZMljNiCr9n9L8H8aJqgWOQiDDGdyn29fRNcDdRVJ5fdyihfg==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 8.3" - } - }, - "node_modules/api-contract-validator/node_modules/jest-diff": { - "version": "25.5.0", - "resolved": "https://registry.npmjs.org/jest-diff/-/jest-diff-25.5.0.tgz", - "integrity": "sha512-z1kygetuPiREYdNIumRpAHY6RXiGmp70YHptjdaxTWGmA085W3iCnXNx0DhflK3vwrKmrRWyY1wUpkPMVxMK7A==", - "dev": true, - "license": "MIT", - "dependencies": { - "chalk": "^3.0.0", - "diff-sequences": "^25.2.6", - "jest-get-type": "^25.2.6", - "pretty-format": "^25.5.0" - }, - "engines": { - "node": ">= 8.3" - } - }, - "node_modules/api-contract-validator/node_modules/jest-get-type": { - "version": "25.2.6", - "resolved": "https://registry.npmjs.org/jest-get-type/-/jest-get-type-25.2.6.tgz", - "integrity": "sha512-DxjtyzOHjObRM+sM1knti6or+eOgcGU4xVSb2HNP1TqO4ahsT+rqZg+nyqHWJSvWgKC5cG3QjGFBqxLghiF/Ig==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 8.3" - } - }, - "node_modules/api-contract-validator/node_modules/pretty-format": { - "version": "25.5.0", - "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-25.5.0.tgz", - "integrity": "sha512-kbo/kq2LQ/A/is0PQwsEHM7Ca6//bGPPvU6UnsdDRSKTWxT/ru/xb88v4BJf6a69H+uTytOEsTusT9ksd/1iWQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "@jest/types": "^25.5.0", - "ansi-regex": "^5.0.0", - "ansi-styles": "^4.0.0", - "react-is": "^16.12.0" - }, - "engines": { - "node": ">= 8.3" - } - }, - "node_modules/api-contract-validator/node_modules/react-is": { - "version": "16.13.1", - "resolved": "https://registry.npmjs.org/react-is/-/react-is-16.13.1.tgz", - "integrity": "sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==", - "dev": true, - "license": "MIT" - }, - "node_modules/api-contract-validator/node_modules/supports-color": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", - "dev": true, - "license": "MIT", - "dependencies": { - "has-flag": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/api-schema-builder": { - "version": "2.0.11", - "resolved": "https://registry.npmjs.org/api-schema-builder/-/api-schema-builder-2.0.11.tgz", - "integrity": "sha512-85zbwf8MtPWodhfnmQRW5YD/fuGR12FP+8TbcYai5wbRnoUmPYLftLSbp7NB6zQMPb61Gjz+ApPUSyTdcCos7g==", - "dev": true, - "license": "Apache-2.0", - "dependencies": { - "ajv": "^6.12.6", - "clone-deep": "^4.0.1", - "decimal.js": "^10.3.1", - "js-yaml": "^3.14.1", - "json-schema-deref-sync": "^0.14.0", - "lodash.get": "^4.4.2", - "openapi-schema-validator": "^3.0.3", - "swagger-parser": "^10.0.3" - }, - "engines": { - "node": ">=8" - } - }, "node_modules/aproba": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/aproba/-/aproba-2.0.0.tgz", - "integrity": "sha512-lYe4Gx7QT+MKGbDsA+Z+he/Wtef0BiwDOlK/XkBrdfsh9J/jPPXbX0tE9x9cl27Tmu5gg3QUbUrQYa/y+KOHPQ==", + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/aproba/-/aproba-2.1.0.tgz", + "integrity": "sha512-tLIEcj5GuR2RSTnxNKdkK0dJ/GrC7P38sUkiDmDuHfsHmbagTFAxDVIBltoklXEVIQ/f14IL8IMJ5pn9Hez1Ew==", "license": "ISC" }, "node_modules/are-we-there-yet": { @@ -7354,32 +5322,40 @@ "dev": true, "license": "MIT" }, - "node_modules/argparse": { - "version": "1.0.10", - "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", - "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", + "node_modules/argon2": { + "version": "0.43.1", + "resolved": "https://registry.npmjs.org/argon2/-/argon2-0.43.1.tgz", + "integrity": "sha512-TfOzvDWUaQPurCT1hOwIeFNkgrAJDpbBGBGWDgzDsm11nNhImc13WhdGdCU6K7brkp8VpeY07oGtSex0Wmhg8w==", + "hasInstallScript": true, "license": "MIT", + "optional": true, + "peer": true, "dependencies": { - "sprintf-js": "~1.0.2" - } - }, - "node_modules/array-buffer-byte-length": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/array-buffer-byte-length/-/array-buffer-byte-length-1.0.2.tgz", - "integrity": "sha512-LHE+8BuR7RYGDKvnrmcuSq3tDcKv9OFEXQt/HpbZhY7V6h0zlUXutnAD82GiFx9rdieCMjkvtcsPqBwgUl1Iiw==", - "dev": true, - "license": "MIT", - "dependencies": { - "call-bound": "^1.0.3", - "is-array-buffer": "^3.0.5" + "@phc/format": "^1.0.0", + "node-addon-api": "^8.4.0", + "node-gyp-build": "^4.8.4" }, "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" + "node": ">=16.17.0" } }, + "node_modules/argon2/node_modules/node-addon-api": { + "version": "8.8.0", + "resolved": "https://registry.npmjs.org/node-addon-api/-/node-addon-api-8.8.0.tgz", + "integrity": "sha512-c5Ko1fZJIJmzhFIkhRN76WTq+fC6tWnGy9CXA0fA+XygsWZmEwG8vmbkNqxMyoaa0Tin4djul49NzdVcJJcjeA==", + "license": "MIT", + "optional": true, + "peer": true, + "engines": { + "node": "^18 || ^20 || >= 21" + } + }, + "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==", + "license": "Python-2.0" + }, "node_modules/array-flatten": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-1.1.1.tgz", @@ -7397,28 +5373,6 @@ "node": ">=8" } }, - "node_modules/arraybuffer.prototype.slice": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/arraybuffer.prototype.slice/-/arraybuffer.prototype.slice-1.0.4.tgz", - "integrity": "sha512-BNoCY6SXXPQ7gF2opIP4GBE+Xw7U+pHMYKuzjgCN3GwiaIR09UUeKfheyIry77QtrCBlC0KK0q5/TER/tYh3PQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "array-buffer-byte-length": "^1.0.1", - "call-bind": "^1.0.8", - "define-properties": "^1.2.1", - "es-abstract": "^1.23.5", - "es-errors": "^1.3.0", - "get-intrinsic": "^1.2.6", - "is-array-buffer": "^3.0.4" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, "node_modules/as-table": { "version": "1.0.55", "resolved": "https://registry.npmjs.org/as-table/-/as-table-1.0.55.tgz", @@ -7432,9 +5386,24 @@ "version": "2.0.6", "resolved": "https://registry.npmjs.org/asap/-/asap-2.0.6.tgz", "integrity": "sha512-BSHWgDSAiKs50o2Re8ppvp3seVHXSRM44cdSsT9FfNEUUZLOGWVCsiWaRPWM1Znn+mqZ1OfVZ3z3DWEzSp7hRA==", - "devOptional": true, + "dev": true, "license": "MIT" }, + "node_modules/asn1js": { + "version": "3.0.10", + "resolved": "https://registry.npmjs.org/asn1js/-/asn1js-3.0.10.tgz", + "integrity": "sha512-S2s3aOytiKdFRdulw2qPE51MzjzVOisppcVv7jVFR+Kw0kxwvFrDcYA0h7Ndqbmj0HkMIXYWaoj7fli8kgx1eg==", + "dev": true, + "license": "BSD-3-Clause", + "dependencies": { + "pvtsutils": "^1.3.6", + "pvutils": "^1.1.5", + "tslib": "^2.8.1" + }, + "engines": { + "node": ">=12.0.0" + } + }, "node_modules/assertion-error": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/assertion-error/-/assertion-error-2.0.1.tgz", @@ -7480,9 +5449,9 @@ } }, "node_modules/autoprefixer": { - "version": "10.4.20", - "resolved": "https://registry.npmjs.org/autoprefixer/-/autoprefixer-10.4.20.tgz", - "integrity": "sha512-XY25y5xSv/wEoqzDyXXME4AFfkZI0P23z6Fs3YgymDnKJkCGOnkL0iTxCa85UTqaSgfcqyf3UA6+c7wUvx/16g==", + "version": "10.5.0", + "resolved": "https://registry.npmjs.org/autoprefixer/-/autoprefixer-10.5.0.tgz", + "integrity": "sha512-FMhOoZV4+qR6aTUALKX2rEqGG+oyATvwBt9IIzVR5rMa2HRWPkxf+P+PAJLD1I/H5/II+HuZcBJYEFBpq39ong==", "dev": true, "funding": [ { @@ -7500,11 +5469,10 @@ ], "license": "MIT", "dependencies": { - "browserslist": "^4.23.3", - "caniuse-lite": "^1.0.30001646", - "fraction.js": "^4.3.7", - "normalize-range": "^0.1.2", - "picocolors": "^1.0.1", + "browserslist": "^4.28.2", + "caniuse-lite": "^1.0.30001787", + "fraction.js": "^5.3.4", + "picocolors": "^1.1.1", "postcss-value-parser": "^4.2.0" }, "bin": { @@ -7517,22 +5485,6 @@ "postcss": "^8.1.0" } }, - "node_modules/available-typed-arrays": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/available-typed-arrays/-/available-typed-arrays-1.0.7.tgz", - "integrity": "sha512-wvUjBtSGN7+7SjNpq/9M2Tg350UZD3q62IFZLbRAR1bSMlCo1ZaeW+BJ+D090e4hIIZLBcTDWe4Mh4jvUDajzQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "possible-typed-array-names": "^1.0.0" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, "node_modules/aws4": { "version": "1.13.2", "resolved": "https://registry.npmjs.org/aws4/-/aws4-1.13.2.tgz", @@ -7540,112 +5492,28 @@ "license": "MIT" }, "node_modules/axios": { - "version": "0.21.4", - "resolved": "https://registry.npmjs.org/axios/-/axios-0.21.4.tgz", - "integrity": "sha512-ut5vewkiu8jjGBdqpM44XxjuCjq9LAKeHVmoVfHVzy8eHgxxq8SbAVQNovDA8mVi05kP0Ea/n/UzcSHcTJQfNg==", + "version": "1.17.0", + "resolved": "https://registry.npmjs.org/axios/-/axios-1.17.0.tgz", + "integrity": "sha512-J8SwNxprqqpbfenehxWYXE7CW+wM1BB4w3+N+g+/Wx40xM4rsLrfPmHHxSWIxJLYDgSY/HqlFPIYb2/S3rxafw==", "license": "MIT", "dependencies": { - "follow-redirects": "^1.14.0" - } - }, - "node_modules/babel-loader": { - "version": "9.2.1", - "resolved": "https://registry.npmjs.org/babel-loader/-/babel-loader-9.2.1.tgz", - "integrity": "sha512-fqe8naHt46e0yIdkjUZYqddSXfej3AHajX+CSO5X7oy0EmPc6o5Xh+RClNoHjnieWz9AW4kZxW9yyFMhVB1QLA==", - "dev": true, - "license": "MIT", - "dependencies": { - "find-cache-dir": "^4.0.0", - "schema-utils": "^4.0.0" - }, - "engines": { - "node": ">= 14.15.0" - }, - "peerDependencies": { - "@babel/core": "^7.12.0", - "webpack": ">=5" - } - }, - "node_modules/babel-loader/node_modules/find-cache-dir": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/find-cache-dir/-/find-cache-dir-4.0.0.tgz", - "integrity": "sha512-9ZonPT4ZAK4a+1pUPVPZJapbi7O5qbbJPdYw/NOQWZZbVLdDTYM3A4R9z/DpAM08IDaFGsvPgiGZ82WEwUDWjg==", - "dev": true, - "license": "MIT", - "dependencies": { - "common-path-prefix": "^3.0.0", - "pkg-dir": "^7.0.0" - }, - "engines": { - "node": ">=14.16" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/babel-plugin-polyfill-corejs2": { - "version": "0.4.12", - "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-corejs2/-/babel-plugin-polyfill-corejs2-0.4.12.tgz", - "integrity": "sha512-CPWT6BwvhrTO2d8QVorhTCQw9Y43zOu7G9HigcfxvepOU6b8o3tcWad6oVgZIsZCTt42FFv97aA7ZJsbM4+8og==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/compat-data": "^7.22.6", - "@babel/helper-define-polyfill-provider": "^0.6.3", - "semver": "^6.3.1" - }, - "peerDependencies": { - "@babel/core": "^7.4.0 || ^8.0.0-0 <8.0.0" - } - }, - "node_modules/babel-plugin-polyfill-corejs2/node_modules/semver": { - "version": "6.3.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", - "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", - "dev": true, - "license": "ISC", - "bin": { - "semver": "bin/semver.js" - } - }, - "node_modules/babel-plugin-polyfill-corejs3": { - "version": "0.10.6", - "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-corejs3/-/babel-plugin-polyfill-corejs3-0.10.6.tgz", - "integrity": "sha512-b37+KR2i/khY5sKmWNVQAnitvquQbNdWy6lJdsr0kmquCKEEUgMKK4SboVM3HtfnZilfjr4MMQ7vY58FVWDtIA==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/helper-define-polyfill-provider": "^0.6.2", - "core-js-compat": "^3.38.0" - }, - "peerDependencies": { - "@babel/core": "^7.4.0 || ^8.0.0-0 <8.0.0" - } - }, - "node_modules/babel-plugin-polyfill-regenerator": { - "version": "0.6.3", - "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-regenerator/-/babel-plugin-polyfill-regenerator-0.6.3.tgz", - "integrity": "sha512-LiWSbl4CRSIa5x/JAU6jZiG9eit9w6mz+yVMFwDE83LAWvt0AfGBoZ7HS/mkhrKuh2ZlzfVZYKoLjXdqw6Yt7Q==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/helper-define-polyfill-provider": "^0.6.3" - }, - "peerDependencies": { - "@babel/core": "^7.4.0 || ^8.0.0-0 <8.0.0" + "follow-redirects": "^1.16.0", + "form-data": "^4.0.5", + "https-proxy-agent": "^5.0.1", + "proxy-from-env": "^2.1.0" } }, "node_modules/babel-preset-typescript-vue3": { - "version": "2.0.17", - "resolved": "https://registry.npmjs.org/babel-preset-typescript-vue3/-/babel-preset-typescript-vue3-2.0.17.tgz", - "integrity": "sha512-6AdNf72Jd9OTap9ws12bAehn/GuuBSqUPN+nuOY7XCMckRcvPbO1G+yFvF+ahQsiMCk+gUZwTie1eoQMzeesog==", + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/babel-preset-typescript-vue3/-/babel-preset-typescript-vue3-2.1.1.tgz", + "integrity": "sha512-1AjtHb2eJzRErgtn7AnHUk1DyKtd5x8t0hntdZIsKvXf9W4fR43+/ZYEawWeiOrAEqWf7BnFMnNVkvbPu7erHg==", "dev": true, "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.0.0", - "@babel/plugin-transform-typescript": "^7.3.2", - "@babel/preset-typescript": "^7.3.3", - "@vue/compiler-sfc": "^3.0.5" + "@babel/helper-plugin-utils": "^7.27.1", + "@babel/plugin-transform-typescript": "^7.27.1", + "@babel/preset-typescript": "^7.27.1", + "@vue/compiler-sfc": "^3.5.13" }, "engines": { "node": ">=8.0.0" @@ -7660,26 +5528,18 @@ "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", "license": "MIT" }, - "node_modules/base64-js": { - "version": "1.5.1", - "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.5.1.tgz", - "integrity": "sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==", + "node_modules/baseline-browser-mapping": { + "version": "2.10.34", + "resolved": "https://registry.npmjs.org/baseline-browser-mapping/-/baseline-browser-mapping-2.10.34.tgz", + "integrity": "sha512-IMDedajPifLnHNY0X9n8hKxRTQ6/eTHwr5bDo04WnuqxyKw6LYtQywCuuqPZwhl3aBXMvQpJov42GLCwRRdQzw==", "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" - } - ], - "license": "MIT" + "license": "Apache-2.0", + "bin": { + "baseline-browser-mapping": "dist/cli.cjs" + }, + "engines": { + "node": ">=6.0.0" + } }, "node_modules/basic-auth": { "version": "2.0.1", @@ -7693,6 +5553,12 @@ "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==", + "license": "MIT" + }, "node_modules/batch": { "version": "0.6.1", "resolved": "https://registry.npmjs.org/batch/-/batch-0.6.1.tgz", @@ -7720,16 +5586,6 @@ "integrity": "sha512-V/Hy/X9Vt7f3BbPJEi8BdVFMByHi+jNXrYkW3huaybV/kQ0KJg0Y6PkEMbn+zeT+i+SiKZ/HMqJGIIt4LZDqNQ==", "license": "MIT" }, - "node_modules/big.js": { - "version": "5.2.2", - "resolved": "https://registry.npmjs.org/big.js/-/big.js-5.2.2.tgz", - "integrity": "sha512-vyL2OymJxmarO8gxMr0mhChsO9QGwhynfuu4+MHTAW6czfq9humCB7rKpUjDd9YUiDPU4mzpyupFSvOClAwbmQ==", - "dev": true, - "license": "MIT", - "engines": { - "node": "*" - } - }, "node_modules/binary-extensions": { "version": "2.3.0", "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.3.0.tgz", @@ -7743,31 +5599,51 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/birpc": { + "version": "2.9.0", + "resolved": "https://registry.npmjs.org/birpc/-/birpc-2.9.0.tgz", + "integrity": "sha512-KrayHS5pBi69Xi9JmvoqrIgYGDkD6mcSe/i6YKi3w5kekCLzrX4+nawcXqrj2tIp50Kw/mT/s3p+GVK0A0sKxw==", + "dev": true, + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/antfu" + } + }, "node_modules/body-parser": { - "version": "1.20.3", - "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.20.3.tgz", - "integrity": "sha512-7rAxByjUMqQ3/bHJy7D6OGXvx/MMc4IqBn/X0fcM1QUcAItpZrBEYhWGem+tzXH90c+G01ypMcYJBO9Y30203g==", + "version": "1.20.5", + "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.20.5.tgz", + "integrity": "sha512-3grm+/2tUOvu2cjJkvsIxrv/wVpfXQW4PsQHYm7yk4vfpu7Ekl6nEsYBoJUL6qDwZUx8wUhQ8tR2qz+ad9c9OA==", "dev": true, "license": "MIT", "dependencies": { - "bytes": "3.1.2", + "bytes": "~3.1.2", "content-type": "~1.0.5", "debug": "2.6.9", "depd": "2.0.0", - "destroy": "1.2.0", - "http-errors": "2.0.0", - "iconv-lite": "0.4.24", - "on-finished": "2.4.1", - "qs": "6.13.0", - "raw-body": "2.5.2", + "destroy": "~1.2.0", + "http-errors": "~2.0.1", + "iconv-lite": "~0.4.24", + "on-finished": "~2.4.1", + "qs": "~6.15.1", + "raw-body": "~2.5.3", "type-is": "~1.6.18", - "unpipe": "1.0.0" + "unpipe": "~1.0.0" }, "engines": { "node": ">= 0.8", "npm": "1.2.8000 || >= 1.4.16" } }, + "node_modules/body-parser/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, + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, "node_modules/body-parser/node_modules/debug": { "version": "2.6.9", "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", @@ -7778,6 +5654,52 @@ "ms": "2.0.0" } }, + "node_modules/body-parser/node_modules/iconv-lite": { + "version": "0.4.24", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", + "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", + "dev": true, + "license": "MIT", + "dependencies": { + "safer-buffer": ">= 2.1.2 < 3" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/body-parser/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, + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/body-parser/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==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/body-parser/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==", + "dev": true, + "license": "MIT", + "dependencies": { + "mime-db": "1.52.0" + }, + "engines": { + "node": ">= 0.6" + } + }, "node_modules/body-parser/node_modules/ms": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", @@ -7785,26 +5707,40 @@ "dev": true, "license": "MIT" }, - "node_modules/body-parser/node_modules/qs": { - "version": "6.13.0", - "resolved": "https://registry.npmjs.org/qs/-/qs-6.13.0.tgz", - "integrity": "sha512-+38qI9SOr8tfZ4QmJNplMUxqjbe7LKvvZgWdExBOmd+egZTtjLB67Gu0HRX3u/XOq7UU2Nx6nsjvS16Z9uwfpg==", + "node_modules/body-parser/node_modules/raw-body": { + "version": "2.5.3", + "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.5.3.tgz", + "integrity": "sha512-s4VSOf6yN0rvbRZGxs8Om5CWj6seneMwK3oDb4lWDH0UPhWcxwOWw5+qk24bxq87szX1ydrwylIOp2uG1ojUpA==", "dev": true, - "license": "BSD-3-Clause", + "license": "MIT", "dependencies": { - "side-channel": "^1.0.6" + "bytes": "~3.1.2", + "http-errors": "~2.0.1", + "iconv-lite": "~0.4.24", + "unpipe": "~1.0.0" }, "engines": { - "node": ">=0.6" + "node": ">= 0.8" + } + }, + "node_modules/body-parser/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, + "license": "MIT", + "dependencies": { + "media-typer": "0.3.0", + "mime-types": "~2.1.24" }, - "funding": { - "url": "https://github.com/sponsors/ljharb" + "engines": { + "node": ">= 0.6" } }, "node_modules/bonjour-service": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/bonjour-service/-/bonjour-service-1.3.0.tgz", - "integrity": "sha512-3YuAUiSkWykd+2Azjgyxei8OWf8thdn8AITIog2M4UICzoqfjlqr64WIjEXZllf/W6vK1goqleSR6brGomxQqA==", + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/bonjour-service/-/bonjour-service-1.4.0.tgz", + "integrity": "sha512-fGQtj1qdR9vIKjFiWPQd52qIqwjaYqhcI40JEiDuvlZ86E7ZBPBwY9fPgHy9r2rYGIjiRfctNPYz6OQU73ww2w==", "dev": true, "license": "MIT", "dependencies": { @@ -7812,17 +5748,10 @@ "multicast-dns": "^7.2.5" } }, - "node_modules/boolbase": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/boolbase/-/boolbase-1.0.0.tgz", - "integrity": "sha512-JZOSA7Mo9sNGB8+UjSgzdLtokWAky1zbztM3WRLCbZ70/3cTANmQmOdR7y2g+J0e2WXywy1yS468tY+IruqEww==", - "dev": true, - "license": "ISC" - }, "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==", + "version": "1.1.15", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.15.tgz", + "integrity": "sha512-EwOCDEex4quD37XhqM3omwtMoJjr//isUZz1JopUNWms+4Z2ViyM/k1YIRePpoVNnQhENnxtFjLaxNHrT7xIUg==", "license": "MIT", "dependencies": { "balanced-match": "^1.0.0", @@ -7842,9 +5771,9 @@ } }, "node_modules/browserslist": { - "version": "4.24.3", - "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.24.3.tgz", - "integrity": "sha512-1CPmv8iobE2fyRMV97dAcMVegvvWKxmq94hkLiAkUGwKVTyDLw33K+ZxiFrREKmmps4rIw6grcCFCnTMSZ/YiA==", + "version": "4.28.2", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.28.2.tgz", + "integrity": "sha512-48xSriZYYg+8qXna9kwqjIVzuQxi+KYWp2+5nCYnYKPTr0LvD89Jqk2Or5ogxz0NUMfIjhh2lIUX/LyX9B4oIg==", "dev": true, "funding": [ { @@ -7862,10 +5791,11 @@ ], "license": "MIT", "dependencies": { - "caniuse-lite": "^1.0.30001688", - "electron-to-chromium": "^1.5.73", - "node-releases": "^2.0.19", - "update-browserslist-db": "^1.1.1" + "baseline-browser-mapping": "^2.10.12", + "caniuse-lite": "^1.0.30001782", + "electron-to-chromium": "^1.5.328", + "node-releases": "^2.0.36", + "update-browserslist-db": "^1.2.3" }, "bin": { "browserslist": "cli.js" @@ -7874,37 +5804,13 @@ "node": "^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7" } }, - "node_modules/buffer": { - "version": "6.0.3", - "resolved": "https://registry.npmjs.org/buffer/-/buffer-6.0.3.tgz", - "integrity": "sha512-FTiCpNxtwiZZHEZbcbTIcZjERVICn9yq/pDFkTl95/AxzD1naBctN7YO68riM/gLSDY7sdrMby8hofADYuuqOA==", - "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" - } - ], - "license": "MIT", - "dependencies": { - "base64-js": "^1.3.1", - "ieee754": "^1.2.1" - } - }, "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==", "devOptional": true, - "license": "MIT" + "license": "MIT", + "peer": true }, "node_modules/bundle-name": { "version": "4.1.0", @@ -7922,6 +5828,18 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/byte-counter": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/byte-counter/-/byte-counter-0.1.0.tgz", + "integrity": "sha512-jheRLVMeUKrDBjVw2O5+k4EvR4t9wtxHL+bo/LxfkxsVeuGMy3a5SEGgXdAFA4FSzTrU8rQXQIrsZ3oBq5a0pQ==", + "license": "MIT", + "engines": { + "node": ">=20" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/bytes": { "version": "3.1.2", "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.2.tgz", @@ -7931,12 +5849,21 @@ "node": ">= 0.8" } }, + "node_modules/bytestreamjs": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/bytestreamjs/-/bytestreamjs-2.0.1.tgz", + "integrity": "sha512-U1Z/ob71V/bXfVABvNr/Kumf5VyeQRBEm6Txb0PQ6S7V5GpBM3w4Cbqz/xPDicR5tN0uvDifng8C+5qECeGwyQ==", + "dev": true, + "license": "BSD-3-Clause", + "engines": { + "node": ">=6.0.0" + } + }, "node_modules/cac": { "version": "6.7.14", "resolved": "https://registry.npmjs.org/cac/-/cac-6.7.14.tgz", "integrity": "sha512-b6Ilus+c3RrdDk+JhLKUAQfzzgLEPy6wcXqS7f/xe1EETvsDP6GORG7SFuOs6cID5YkqchW/LXZbX5bc8j7ZcQ==", "license": "MIT", - "peer": true, "engines": { "node": ">=8" } @@ -7951,46 +5878,36 @@ } }, "node_modules/cacheable-request": { - "version": "12.0.1", - "resolved": "https://registry.npmjs.org/cacheable-request/-/cacheable-request-12.0.1.tgz", - "integrity": "sha512-Yo9wGIQUaAfIbk+qY0X4cDQgCosecfBe3V9NSyeY4qPC2SAkbCS4Xj79VP8WOzitpJUZKc/wsRCYF5ariDIwkg==", + "version": "13.0.19", + "resolved": "https://registry.npmjs.org/cacheable-request/-/cacheable-request-13.0.19.tgz", + "integrity": "sha512-SVXGH037+Mo1aIMO5B2UcleR43FGjFdN+M8JObSyEoQ2Mn4CODRWx28gN5jiTF0n5ItsgtIZfyargMNs8GX4kg==", "license": "MIT", "dependencies": { - "@types/http-cache-semantics": "^4.0.4", + "@types/http-cache-semantics": "^4.2.0", "get-stream": "^9.0.1", - "http-cache-semantics": "^4.1.1", - "keyv": "^4.5.4", + "http-cache-semantics": "^4.2.0", + "keyv": "^5.6.0", "mimic-response": "^4.0.0", - "normalize-url": "^8.0.1", - "responselike": "^3.0.0" + "normalize-url": "^8.1.1", + "responselike": "^4.0.2" }, "engines": { "node": ">=18" } }, - "node_modules/call-bind": { - "version": "1.0.8", - "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.8.tgz", - "integrity": "sha512-oKlSFMcMwpUg2ednkhQ454wfWiU/ul3CkJe/PEHcTKuiX6RpbehUiFMXu13HalGZxfUwCQzZG747YXBn1im9ww==", - "dev": true, + "node_modules/cacheable-request/node_modules/keyv": { + "version": "5.6.0", + "resolved": "https://registry.npmjs.org/keyv/-/keyv-5.6.0.tgz", + "integrity": "sha512-CYDD3SOtsHtyXeEORYRx2qBtpDJFjRTGXUtmNEMGyzYOKj1TE3tycdlho7kA1Ufx9OYWZzg52QFBGALTirzDSw==", "license": "MIT", "dependencies": { - "call-bind-apply-helpers": "^1.0.0", - "es-define-property": "^1.0.0", - "get-intrinsic": "^1.2.4", - "set-function-length": "^1.2.2" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" + "@keyv/serialize": "^1.1.1" } }, "node_modules/call-bind-apply-helpers": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/call-bind-apply-helpers/-/call-bind-apply-helpers-1.0.1.tgz", - "integrity": "sha512-BhYE+WDaywFg2TBWYNXAE+8B1ATnThNBqXHP5nQu0jWJdVvY2hvkpyB3qOmtmDePiS5/BDQ8wASEWGMWRG148g==", + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/call-bind-apply-helpers/-/call-bind-apply-helpers-1.0.2.tgz", + "integrity": "sha512-Sp1ablJ0ivDkSzjcaJdxEunN5/XvksFJ2sMBFfq6x0ryhQV/2b/KwFe21cMpmHtPOSij8K99/wSfoEuTObmuMQ==", "license": "MIT", "dependencies": { "es-errors": "^1.3.0", @@ -8001,13 +5918,13 @@ } }, "node_modules/call-bound": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/call-bound/-/call-bound-1.0.3.tgz", - "integrity": "sha512-YTd+6wGlNlPxSuri7Y6X8tY2dmm12UMH66RpKMhiX6rsk5wXXnYgbUcOt8kiS31/AjfoTOvCsE+w8nZQLQnzHA==", + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/call-bound/-/call-bound-1.0.4.tgz", + "integrity": "sha512-+ys997U96po4Kx/ABpBCqhA9EuxJaQWDQg7295H4hBphv3IZg0boBKuwYpt4YXp6MZ5AmZQnU/tyMTlRpaSejg==", "license": "MIT", "dependencies": { - "call-bind-apply-helpers": "^1.0.1", - "get-intrinsic": "^1.2.6" + "call-bind-apply-helpers": "^1.0.2", + "get-intrinsic": "^1.3.0" }, "engines": { "node": ">= 0.4" @@ -8016,13 +5933,6 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/call-me-maybe": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/call-me-maybe/-/call-me-maybe-1.0.2.tgz", - "integrity": "sha512-HpX65o1Hnr9HH25ojC1YGs7HCQLq0GCOibSaWER0eNpgJ/Z1MZv2mTc7+xh6WOPxbRVcmgbv4hGU+uSQ/2xFZQ==", - "dev": true, - "license": "MIT" - }, "node_modules/callsites": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", @@ -8033,16 +5943,6 @@ "node": ">=6" } }, - "node_modules/camel-case": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/camel-case/-/camel-case-4.1.2.tgz", - "integrity": "sha512-gxGWBrTT1JuMx6R+o5PTXMmUnhnVzLQ9SNutD4YqKtI6ap897t3tKECYla6gCWEkplXnlNybEkZg9GEGxKFCgw==", - "license": "MIT", - "dependencies": { - "pascal-case": "^3.1.2", - "tslib": "^2.0.3" - } - }, "node_modules/camelcase": { "version": "8.0.0", "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-8.0.0.tgz", @@ -8065,23 +5965,10 @@ "node": ">= 6" } }, - "node_modules/caniuse-api": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/caniuse-api/-/caniuse-api-3.0.0.tgz", - "integrity": "sha512-bsTwuIg/BZZK/vreVTYYbSWoe2F+71P7K5QGEX+pT250DZbfU1MQ5prOKpPR+LL6uWKK3KMwMCAS74QB3Um1uw==", - "dev": true, - "license": "MIT", - "dependencies": { - "browserslist": "^4.0.0", - "caniuse-lite": "^1.0.0", - "lodash.memoize": "^4.1.2", - "lodash.uniq": "^4.5.0" - } - }, "node_modules/caniuse-lite": { - "version": "1.0.30001690", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001690.tgz", - "integrity": "sha512-5ExiE3qQN6oF8Clf8ifIDcMRCRE/dMGcETG/XGMD8/XiXm6HXQgQTh1yZYLXXpSOsEUlJm1Xr7kGULZTuGtP/w==", + "version": "1.0.30001797", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001797.tgz", + "integrity": "sha512-l8xKG+gwAIExZGl9FrF7KUwuOmk6wbEPC9Xoy/RtnWv1XG0Q4LFlagaLpUv3Kiza3W/wm27zy0yWJEieYKAP6w==", "dev": true, "funding": [ { @@ -8099,21 +5986,10 @@ ], "license": "CC-BY-4.0" }, - "node_modules/capital-case": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/capital-case/-/capital-case-1.0.4.tgz", - "integrity": "sha512-ds37W8CytHgwnhGGTi88pcPyR15qoNkOpYwmMMfnWqqWgESapLqvDx6huFjQ5vqWSn2Z06173XNA7LtMOeUh1A==", - "license": "MIT", - "dependencies": { - "no-case": "^3.0.4", - "tslib": "^2.0.3", - "upper-case-first": "^2.0.2" - } - }, "node_modules/case-anything": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/case-anything/-/case-anything-3.1.0.tgz", - "integrity": "sha512-rRYnn5Elur8RuNHKoJ2b0tgn+pjYxL7BzWom+JZ7NKKn1lt/yGV/tUNwOovxYa9l9VL5hnXQdMc+mENbhJzosQ==", + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/case-anything/-/case-anything-3.1.2.tgz", + "integrity": "sha512-wljhAjDDIv/hM2FzgJnYQg90AWmZMNtESCjTeLH680qTzdo0nErlCxOmgzgX4ZsZAtIvqHyD87ES8QyriXB+BQ==", "license": "MIT", "engines": { "node": ">=18" @@ -8123,94 +5999,49 @@ } }, "node_modules/chai": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/chai/-/chai-5.1.2.tgz", - "integrity": "sha512-aGtmf24DW6MLHHG5gCx4zaI3uBq3KRtxeVs0DjFH6Z0rDNbsvTxFASFvdj79pxjxZ8/5u3PIiN3IwEIQkiiuPw==", + "version": "6.2.2", + "resolved": "https://registry.npmjs.org/chai/-/chai-6.2.2.tgz", + "integrity": "sha512-NUPRluOfOiTKBKvWPtSD4PhFvWCqOi0BGStNWs57X9js7XGTprSmFoz5F0tWhR4WPjNeR9jXqdC7/UpSJTnlRg==", "dev": true, "license": "MIT", - "dependencies": { - "assertion-error": "^2.0.1", - "check-error": "^2.1.1", - "deep-eql": "^5.0.1", - "loupe": "^3.1.0", - "pathval": "^2.0.0" - }, "engines": { - "node": ">=12" + "node": ">=18" } }, "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, + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "devOptional": true, "license": "MIT", "dependencies": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" }, "engines": { - "node": ">=4" - } - }, - "node_modules/chalk/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, - "license": "MIT", - "engines": { - "node": ">=4" + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" } }, "node_modules/chalk/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, + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "devOptional": true, "license": "MIT", "dependencies": { - "has-flag": "^3.0.0" + "has-flag": "^4.0.0" }, "engines": { - "node": ">=4" - } - }, - "node_modules/change-case": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/change-case/-/change-case-4.1.2.tgz", - "integrity": "sha512-bSxY2ws9OtviILG1EiY5K7NNxkqg/JnRnFxLtKQ96JaviiIxi7djMrSd0ECT9AC+lttClmYwKw53BWpOMblo7A==", - "license": "MIT", - "dependencies": { - "camel-case": "^4.1.2", - "capital-case": "^1.0.4", - "constant-case": "^3.0.4", - "dot-case": "^3.0.4", - "header-case": "^2.0.4", - "no-case": "^3.0.4", - "param-case": "^3.0.4", - "pascal-case": "^3.1.2", - "path-case": "^3.0.4", - "sentence-case": "^3.0.4", - "snake-case": "^3.0.4", - "tslib": "^2.0.3" - } - }, - "node_modules/charenc": { - "version": "0.0.2", - "resolved": "https://registry.npmjs.org/charenc/-/charenc-0.0.2.tgz", - "integrity": "sha512-yrLQ/yVUFXkzg7EDQsPieE/53+0RlaWTs+wBrvW36cyilJ2SaDWfl4Yj7MtLTXleV9uEKefbAGUPv2/iWSooRA==", - "dev": true, - "license": "BSD-3-Clause", - "engines": { - "node": "*" + "node": ">=8" } }, "node_modules/chart.js": { - "version": "4.4.7", - "resolved": "https://registry.npmjs.org/chart.js/-/chart.js-4.4.7.tgz", - "integrity": "sha512-pwkcKfdzTMAU/+jNosKhNL2bHtJc/sSmYgVbuGTEDhzkrhmyihmP7vUc/5ZK9WopidMDHNe3Wm7jOd/WhuHWuw==", + "version": "4.5.1", + "resolved": "https://registry.npmjs.org/chart.js/-/chart.js-4.5.1.tgz", + "integrity": "sha512-GIjfiT9dbmHRiYi6Nl2yFCq7kkwdkp1W/lp2J99rX0yo9tgJGn3lKQATztIjb5tVtevcBtIdICNWqlq5+E8/Pw==", "dev": true, "license": "MIT", "dependencies": { @@ -8229,16 +6060,6 @@ "node": ">=16" } }, - "node_modules/check-error": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/check-error/-/check-error-2.1.1.tgz", - "integrity": "sha512-OAlb+T7V4Op9OwdkjmguYRqncdlx5JiofwOAUkmTF+jNdHwzTaTs4sRAGpzLF3oOz5xAyDGrPgeIDFQmDOTiJw==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 16" - } - }, "node_modules/chokidar": { "version": "4.0.3", "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-4.0.3.tgz", @@ -8275,22 +6096,6 @@ "node": ">=6.0" } }, - "node_modules/ci-info": { - "version": "3.9.0", - "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-3.9.0.tgz", - "integrity": "sha512-NIxF55hv4nSqQswkAeiOi1r83xy8JldOFDTWiug55KBu9Jnblncd2U6ViHmYgHf01TPZS77NJBhBMKdWj9HQMQ==", - "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/sibiraj-s" - } - ], - "license": "MIT", - "engines": { - "node": ">=8" - } - }, "node_modules/clamscan": { "version": "2.4.0", "resolved": "https://registry.npmjs.org/clamscan/-/clamscan-2.4.0.tgz", @@ -8300,12 +6105,6 @@ "node": ">=16.0.0" } }, - "node_modules/classnames": { - "version": "2.5.1", - "resolved": "https://registry.npmjs.org/classnames/-/classnames-2.5.1.tgz", - "integrity": "sha512-saHYOzhIQs6wy2sVxTM6bUDsQO4F50V9RQ22qBpEdCW+I+/Wmke2HOl6lS6dTpdxVhb88/I6+Hs+438c3lfUow==", - "license": "MIT" - }, "node_modules/cli-boxes": { "version": "4.0.1", "resolved": "https://registry.npmjs.org/cli-boxes/-/cli-boxes-4.0.1.tgz", @@ -8378,21 +6177,64 @@ } }, "node_modules/cli-truncate": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/cli-truncate/-/cli-truncate-4.0.0.tgz", - "integrity": "sha512-nPdaFdQ0h/GEigbPClz11D0v/ZJEwxmeVZGeMo3Z5StPtUTkA9o1lD6QwoirYiSDzbcwn2XcjwmCp68W1IS4TA==", + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/cli-truncate/-/cli-truncate-5.2.0.tgz", + "integrity": "sha512-xRwvIOMGrfOAnM1JYtqQImuaNtDEv9v6oIYAs4LIHwTiKee8uwvIi363igssOC0O5U04i4AlENs79LQLu9tEMw==", "license": "MIT", "dependencies": { - "slice-ansi": "^5.0.0", - "string-width": "^7.0.0" + "slice-ansi": "^8.0.0", + "string-width": "^8.2.0" }, "engines": { - "node": ">=18" + "node": ">=20" }, "funding": { "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/cli-truncate/node_modules/ansi-regex": { + "version": "6.2.2", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.2.2.tgz", + "integrity": "sha512-Bq3SmSpyFHaWjPk8If9yc6svM8c56dB5BAtW4Qbw5jHTwwXXcTLoRMkpDJp6VL0XzlWaCHTXrkFURMYmD0sLqg==", + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/ansi-regex?sponsor=1" + } + }, + "node_modules/cli-truncate/node_modules/string-width": { + "version": "8.2.1", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-8.2.1.tgz", + "integrity": "sha512-IIaP0g3iy9Cyy18w3M9YcaDudujEAVHKt3a3QJg1+sr/oX96TbaGUubG0hJyCjCBThFH+tFpcIyoUHUn1ogaLA==", + "license": "MIT", + "dependencies": { + "get-east-asian-width": "^1.5.0", + "strip-ansi": "^7.1.2" + }, + "engines": { + "node": ">=20" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/cli-truncate/node_modules/strip-ansi": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.2.0.tgz", + "integrity": "sha512-yDPMNjp4WyfYBkHnjIRLfca1i6KMyGCtsVgoKe/z1+6vukgaENdgGBZt+ZmKPc4gavvEZ5OgHfHdrazhgNyG7w==", + "license": "MIT", + "dependencies": { + "ansi-regex": "^6.2.2" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/strip-ansi?sponsor=1" + } + }, "node_modules/cliui": { "version": "6.0.0", "resolved": "https://registry.npmjs.org/cliui/-/cliui-6.0.0.tgz", @@ -8404,39 +6246,6 @@ "wrap-ansi": "^6.2.0" } }, - "node_modules/cliui/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==", - "license": "MIT", - "dependencies": { - "color-convert": "^2.0.1" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" - } - }, - "node_modules/cliui/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==", - "license": "MIT", - "dependencies": { - "color-name": "~1.1.4" - }, - "engines": { - "node": ">=7.0.0" - } - }, - "node_modules/cliui/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==", - "license": "MIT" - }, "node_modules/cliui/node_modules/emoji-regex": { "version": "8.0.0", "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", @@ -8480,47 +6289,15 @@ "node": ">=8" } }, - "node_modules/clone": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/clone/-/clone-2.1.2.tgz", - "integrity": "sha512-3Pe/CF1Nn94hyhIYpjtiLhdCoEoz0DqQ+988E9gmeEdQZlojxnOb74wctFyuwWQHzqyf9X7C7MG8juUpqBJT8w==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=0.8" - } - }, - "node_modules/clone-deep": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/clone-deep/-/clone-deep-4.0.1.tgz", - "integrity": "sha512-neHB9xuzh/wk0dIHweyAXv2aPGZIVk3pLMe+/RNzINf17fe0OG96QroktYAUm7SM1PBnzTabaLboqqxDyMU+SQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "is-plain-object": "^2.0.4", - "kind-of": "^6.0.2", - "shallow-clone": "^3.0.0" - }, - "engines": { - "node": ">=6" - } - }, "node_modules/cluster-key-slot": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/cluster-key-slot/-/cluster-key-slot-1.1.2.tgz", - "integrity": "sha512-RMr0FhtfXemyinomL4hrWcYJxmX6deFdCxpJzhDttxgO1+bcCnkk+9drydLVDmAMG7NE6aN/fl4F7ucU/90gAA==", + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/cluster-key-slot/-/cluster-key-slot-1.1.1.tgz", + "integrity": "sha512-rwHwUfXL40Chm1r08yrhU3qpUvdVlgkKNeyeGPOxnW8/SyVDvgRaed/Uz54AqWNaTCAThlj6QAs3TZcKI0xDEw==", "license": "Apache-2.0", "engines": { "node": ">=0.10.0" } }, - "node_modules/co-compose": { - "version": "7.0.3", - "resolved": "https://registry.npmjs.org/co-compose/-/co-compose-7.0.3.tgz", - "integrity": "sha512-ZHLSLzeBXe5yaEyIHo9T92uVrbsBRLMXlG0G4/pSm9f6148l4mJTr1cii8Jl9ce+mbLmW5XqHURPC7gZFJNeZA==", - "license": "MIT", - "peer": true - }, "node_modules/code-block-writer": { "version": "13.0.3", "resolved": "https://registry.npmjs.org/code-block-writer/-/code-block-writer-13.0.3.tgz", @@ -8529,20 +6306,21 @@ "license": "MIT" }, "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, + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", "license": "MIT", "dependencies": { - "color-name": "1.1.3" + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" } }, "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, + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", "license": "MIT" }, "node_modules/color-support": { @@ -8554,33 +6332,12 @@ "color-support": "bin.js" } }, - "node_modules/colord": { - "version": "2.9.3", - "resolved": "https://registry.npmjs.org/colord/-/colord-2.9.3.tgz", - "integrity": "sha512-jeC1axXpnb0/2nn/Y1LPuLdgXBLH7aDcHu4KEKfqw3CUhX7ZpfBSlPKyqXE6btIgEzfWtrX3/tyBCaCvXvMkOw==", - "dev": true, - "license": "MIT" - }, "node_modules/colorette": { "version": "2.0.19", "resolved": "https://registry.npmjs.org/colorette/-/colorette-2.0.19.tgz", "integrity": "sha512-3tlv/dIP7FWvj3BsbHrGLJ6l/oKh1O3TcgBqMn+yyCagOxc23fyzDS6HypQbgxWbkpDnf52p1LuR4eWDQ/K9WQ==", "license": "MIT" }, - "node_modules/columnify": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/columnify/-/columnify-1.6.0.tgz", - "integrity": "sha512-lomjuFZKfM6MSAnV9aCZC9sc0qGbmZdfygNv+nCpqVkSKdCxCklLtd16O0EILGkImHw9ZpHkAnHaB+8Zxq5W6Q==", - "dev": true, - "license": "MIT", - "dependencies": { - "strip-ansi": "^6.0.1", - "wcwidth": "^1.0.0" - }, - "engines": { - "node": ">=8.0.0" - } - }, "node_modules/combined-stream": { "version": "1.0.8", "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz", @@ -8613,7 +6370,7 @@ "version": "1.3.1", "resolved": "https://registry.npmjs.org/component-emitter/-/component-emitter-1.3.1.tgz", "integrity": "sha512-T0+barUSQRTUQASh8bx02dl+DhF54GtIDY13Y3m9oWTklKbb3Wv974meRpeZ3lp1JpLVECWWNHC4vaG2XHXouQ==", - "devOptional": true, + "dev": true, "license": "MIT", "funding": { "url": "https://github.com/sponsors/sindresorhus" @@ -8633,9 +6390,9 @@ } }, "node_modules/compression": { - "version": "1.7.5", - "resolved": "https://registry.npmjs.org/compression/-/compression-1.7.5.tgz", - "integrity": "sha512-bQJ0YRck5ak3LgtnpKkiabX5pNF7tMUh1BSy2ZBOTh0Dim0BUu6aPPwByIns6/A5Prh8PufSPerMDUklpzes2Q==", + "version": "1.8.1", + "resolved": "https://registry.npmjs.org/compression/-/compression-1.8.1.tgz", + "integrity": "sha512-9mAqGPHLakhCLeNyxPkK4xVo746zQ/czLH1Ky+vkitMnWfWZps8r0qXuwhwizagCRttsL4lfG4pIOvaWLpAP0w==", "dev": true, "license": "MIT", "dependencies": { @@ -8643,7 +6400,7 @@ "compressible": "~2.0.18", "debug": "2.6.9", "negotiator": "~0.6.4", - "on-headers": "~1.0.2", + "on-headers": "~1.1.0", "safe-buffer": "5.2.1", "vary": "~1.1.2" }, @@ -8678,27 +6435,6 @@ "node": ">= 0.6" } }, - "node_modules/compression/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" - } - ], - "license": "MIT" - }, "node_modules/concat-map": { "version": "0.0.1", "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", @@ -8715,33 +6451,12 @@ "node": ">=0.8" } }, - "node_modules/consola": { - "version": "3.3.3", - "resolved": "https://registry.npmjs.org/consola/-/consola-3.3.3.tgz", - "integrity": "sha512-Qil5KwghMzlqd51UXM0b6fyaGHtOC22scxrwrz4A2882LyUMwQjnvaedN1HAeXzphspQ6CpHkzMAWxBTUruDLg==", - "dev": true, - "license": "MIT", - "engines": { - "node": "^14.18.0 || >=16.10.0" - } - }, "node_modules/console-control-strings": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/console-control-strings/-/console-control-strings-1.1.0.tgz", "integrity": "sha512-ty/fTekppD2fIwRvnZAVdeOiGd1c7YXEixbgJTNzqcxJWKQnjJ/V1bNEEE6hygpM3WjwHFUVK6HTjWSzV4a8sQ==", "license": "ISC" }, - "node_modules/constant-case": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/constant-case/-/constant-case-3.0.4.tgz", - "integrity": "sha512-I2hSBi7Vvs7BEuJDr5dDHfzb/Ruj3FyvFyh7KLilAjNQw3Be+xgqUBA2W6scVEcL0hL1dwPRtIqEPVUCKkSsyQ==", - "license": "MIT", - "dependencies": { - "no-case": "^3.0.4", - "tslib": "^2.0.3", - "upper-case": "^2.0.2" - } - }, "node_modules/content-disposition": { "version": "0.5.4", "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.4.tgz", @@ -8754,34 +6469,17 @@ "node": ">= 0.6" } }, - "node_modules/content-disposition/node_modules/safe-buffer": { - "version": "5.2.1", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", - "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ], - "license": "MIT" - }, "node_modules/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, + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/content-type/-/content-type-2.0.0.tgz", + "integrity": "sha512-j/O/d7GcZCyNl7/hwZAb606rzqkyvaDctLmckbxLzHvFBzTJHuGEdodATcP3yIRoDrLHkIATJuvzbFlp/ki2cQ==", "license": "MIT", "engines": { - "node": ">= 0.6" + "node": ">=18" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/express" } }, "node_modules/convert-hrtime": { @@ -8802,22 +6500,33 @@ "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-2.0.0.tgz", "integrity": "sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==", "dev": true, - "license": "MIT" + "license": "MIT", + "peer": true }, "node_modules/cookie": { - "version": "0.5.0", - "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.5.0.tgz", - "integrity": "sha512-YZ3GUyn/o8gfKJlnlX7g7xq4gyO6OSuhGPKaaGssGB2qgDUS0gPgtTvoyZLTt9Ab6dC4hfc9dV5arkvc/OCmrw==", + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/cookie/-/cookie-1.1.1.tgz", + "integrity": "sha512-ei8Aos7ja0weRpFzJnEA9UHJ/7XQmqglbRwnf2ATjcB9Wq874VKH9kfjjirM6UhU2/E5fFYadylyhFldcqSidQ==", "license": "MIT", - "peer": true, "engines": { - "node": ">= 0.6" + "node": ">=18" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/express" } }, + "node_modules/cookie-es": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/cookie-es/-/cookie-es-3.1.1.tgz", + "integrity": "sha512-UaXxwISYJPTr9hwQxMFYZ7kNhSXboMXP+Z3TRX6f1/NyaGPfuNUZOWP1pUEb75B2HjfklIYLVRfWiFZJyC6Npg==", + "devOptional": true, + "license": "MIT" + }, "node_modules/cookie-signature": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.0.6.tgz", - "integrity": "sha512-QADzlaHc8icV8I7vbaJXJwod9HWYp8uCqf1xa4OfNu1T7JVxQIrUgOWtHdNDtPiywmFbiS12VjotIXLrKM3orQ==", + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.0.7.tgz", + "integrity": "sha512-NXdYc3dLr47pBkpUCHtKSwIOQXLVn8dZEuywboCOJY/osA0wFSLlSawr3KN8qXJEyX66FcONTH8EIlVuK0yyFA==", "dev": true, "license": "MIT" }, @@ -8825,13 +6534,29 @@ "version": "2.1.4", "resolved": "https://registry.npmjs.org/cookiejar/-/cookiejar-2.1.4.tgz", "integrity": "sha512-LDx6oHrK+PhzLKJU9j5S7/Y3jM/mUHvD/DeI1WQmJn652iPC5Y4TBzC9l+5OMOXlyTTA+SmVUPm0HQUwpD5Jqw==", - "devOptional": true, + "dev": true, "license": "MIT" }, + "node_modules/copy-anything": { + "version": "4.0.5", + "resolved": "https://registry.npmjs.org/copy-anything/-/copy-anything-4.0.5.tgz", + "integrity": "sha512-7Vv6asjS4gMOuILabD3l739tsaxFQmC+a7pLZm02zyvs8p977bL3zEgq3yDk5rn9B0PbYgIv++jmHcuUab4RhA==", + "dev": true, + "license": "MIT", + "dependencies": { + "is-what": "^5.2.0" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/mesqueeb" + } + }, "node_modules/copy-file": { - "version": "11.0.0", - "resolved": "https://registry.npmjs.org/copy-file/-/copy-file-11.0.0.tgz", - "integrity": "sha512-mFsNh/DIANLqFt5VHZoGirdg7bK5+oTWlhnGu6tgRhzBlnEKWaPX2xrFaLltii/6rmhqFMJqffUgknuRdpYlHw==", + "version": "11.1.0", + "resolved": "https://registry.npmjs.org/copy-file/-/copy-file-11.1.0.tgz", + "integrity": "sha512-X8XDzyvYaA6msMyAM575CUoygY5b44QzLcGRKsK3MFmXcOvQa518dNPLsKYwkYsn72g3EiW+LE0ytd/FlqWmyw==", "devOptional": true, "license": "MIT", "dependencies": { @@ -8845,20 +6570,6 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/core-js-compat": { - "version": "3.40.0", - "resolved": "https://registry.npmjs.org/core-js-compat/-/core-js-compat-3.40.0.tgz", - "integrity": "sha512-0XEDpr5y5mijvw8Lbc6E5AkjrHfp7eEoPlu36SWeAbcL8fn1G1ANe8DBlo2XoNN89oVpxWwOjYIPVzR4ZvsKCQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "browserslist": "^4.24.3" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/core-js" - } - }, "node_modules/core-util-is": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.3.tgz", @@ -8867,9 +6578,9 @@ "license": "MIT" }, "node_modules/cosmiconfig": { - "version": "9.0.0", - "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-9.0.0.tgz", - "integrity": "sha512-itvL5h8RETACmOTFc4UfIyB2RfEHi71Ax6E/PivVxq9NseKbOWpeyHEOIbmAw1rs8Ak0VursQNww7lf7YtUwzg==", + "version": "9.0.2", + "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-9.0.2.tgz", + "integrity": "sha512-gtTZxTDau1wL7Y7zifc2dd8jHSK/k6BTx/2Xp/BpdlAdnlYWFVt7qhJqgwi7637yRwRQ3qL4ZidbB4I8tA5VOg==", "dev": true, "license": "MIT", "dependencies": { @@ -8893,26 +6604,6 @@ } } }, - "node_modules/cosmiconfig/node_modules/argparse": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", - "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==", - "dev": true, - "license": "Python-2.0" - }, - "node_modules/cosmiconfig/node_modules/js-yaml": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz", - "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==", - "dev": true, - "license": "MIT", - "dependencies": { - "argparse": "^2.0.1" - }, - "bin": { - "js-yaml": "bin/js-yaml.js" - } - }, "node_modules/cpy": { "version": "11.1.0", "resolved": "https://registry.npmjs.org/cpy/-/cpy-11.1.0.tgz", @@ -8934,18 +6625,6 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/crc-32": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/crc-32/-/crc-32-1.2.2.tgz", - "integrity": "sha512-ROmzCKrTnOwybPcJApAA6WBWij23HVfGVNKqqrZpuyZOHqK2CwHSvpGuyt/UNNvaIjEd8X5IFGp4Mh+Ie1IHJQ==", - "license": "Apache-2.0", - "bin": { - "crc32": "bin/crc32.njs" - }, - "engines": { - "node": ">=0.8" - } - }, "node_modules/create-require": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/create-require/-/create-require-1.1.1.tgz", @@ -8968,23 +6647,6 @@ "node": ">= 8" } }, - "node_modules/crypt": { - "version": "0.0.2", - "resolved": "https://registry.npmjs.org/crypt/-/crypt-0.0.2.tgz", - "integrity": "sha512-mCxBlsHFYh9C+HVpiEacem8FEBnMXgU9gy4zmNC+SXAZNB/1idgp/aulFJ4FgCi7GPEVbfyng092GqL2k2rmow==", - "dev": true, - "license": "BSD-3-Clause", - "engines": { - "node": "*" - } - }, - "node_modules/crypto": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/crypto/-/crypto-1.0.1.tgz", - "integrity": "sha512-VxBKmeNcqQdiUQUW2Tzq0t377b54N2bMtXO/qiLa+6eRRmmC4qT3D4OnTGoT/U6O9aklQ/jTwbOtRMTTY8G0Ig==", - "deprecated": "This package is no longer supported. It's now a built-in Node module. If you've depended on crypto, you should switch to the one that's built-in.", - "license": "ISC" - }, "node_modules/csrf": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/csrf/-/csrf-3.1.0.tgz", @@ -8999,176 +6661,6 @@ "node": ">= 0.8" } }, - "node_modules/css-declaration-sorter": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/css-declaration-sorter/-/css-declaration-sorter-7.2.0.tgz", - "integrity": "sha512-h70rUM+3PNFuaBDTLe8wF/cdWu+dOZmb7pJt8Z2sedYbAcQVQV/tEchueg3GWxwqS0cxtbxmaHEdkNACqcvsow==", - "dev": true, - "license": "ISC", - "engines": { - "node": "^14 || ^16 || >=18" - }, - "peerDependencies": { - "postcss": "^8.0.9" - } - }, - "node_modules/css-loader": { - "version": "7.1.2", - "resolved": "https://registry.npmjs.org/css-loader/-/css-loader-7.1.2.tgz", - "integrity": "sha512-6WvYYn7l/XEGN8Xu2vWFt9nVzrCn39vKyTEFf/ExEyoksJjjSZV/0/35XPlMbpnr6VGhZIUg5yJrL8tGfes/FA==", - "dev": true, - "license": "MIT", - "dependencies": { - "icss-utils": "^5.1.0", - "postcss": "^8.4.33", - "postcss-modules-extract-imports": "^3.1.0", - "postcss-modules-local-by-default": "^4.0.5", - "postcss-modules-scope": "^3.2.0", - "postcss-modules-values": "^4.0.0", - "postcss-value-parser": "^4.2.0", - "semver": "^7.5.4" - }, - "engines": { - "node": ">= 18.12.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/webpack" - }, - "peerDependencies": { - "@rspack/core": "0.x || 1.x", - "webpack": "^5.27.0" - }, - "peerDependenciesMeta": { - "@rspack/core": { - "optional": true - }, - "webpack": { - "optional": true - } - } - }, - "node_modules/css-minimizer-webpack-plugin": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/css-minimizer-webpack-plugin/-/css-minimizer-webpack-plugin-7.0.0.tgz", - "integrity": "sha512-niy66jxsQHqO+EYbhPuIhqRQ1mNcNVUHrMnkzzir9kFOERJUaQDDRhh7dKDz33kBpkWMF9M8Vx0QlDbc5AHOsw==", - "dev": true, - "license": "MIT", - "dependencies": { - "@jridgewell/trace-mapping": "^0.3.25", - "cssnano": "^7.0.1", - "jest-worker": "^29.7.0", - "postcss": "^8.4.38", - "schema-utils": "^4.2.0", - "serialize-javascript": "^6.0.2" - }, - "engines": { - "node": ">= 18.12.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/webpack" - }, - "peerDependencies": { - "webpack": "^5.0.0" - }, - "peerDependenciesMeta": { - "@parcel/css": { - "optional": true - }, - "@swc/css": { - "optional": true - }, - "clean-css": { - "optional": true - }, - "csso": { - "optional": true - }, - "esbuild": { - "optional": true - }, - "lightningcss": { - "optional": true - } - } - }, - "node_modules/css-minimizer-webpack-plugin/node_modules/jest-worker": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-29.7.0.tgz", - "integrity": "sha512-eIz2msL/EzL9UFTFFx7jBTkeZfku0yUAyZZZmJ93H2TYEiroIx2PQjEXcwYtYl8zXCxb+PAmA2hLIt/6ZEkPHw==", - "dev": true, - "license": "MIT", - "dependencies": { - "@types/node": "*", - "jest-util": "^29.7.0", - "merge-stream": "^2.0.0", - "supports-color": "^8.0.0" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/css-minimizer-webpack-plugin/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, - "license": "MIT", - "dependencies": { - "has-flag": "^4.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/supports-color?sponsor=1" - } - }, - "node_modules/css-select": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/css-select/-/css-select-4.3.0.tgz", - "integrity": "sha512-wPpOYtnsVontu2mODhA19JrqWxNsfdatRKd64kmpRbQgh1KtItko5sTnEpPdpSaJszTOhEMlF/RPz28qj4HqhQ==", - "dev": true, - "license": "BSD-2-Clause", - "dependencies": { - "boolbase": "^1.0.0", - "css-what": "^6.0.1", - "domhandler": "^4.3.1", - "domutils": "^2.8.0", - "nth-check": "^2.0.1" - }, - "funding": { - "url": "https://github.com/sponsors/fb55" - } - }, - "node_modules/css-tree": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/css-tree/-/css-tree-2.3.1.tgz", - "integrity": "sha512-6Fv1DV/TYw//QF5IzQdqsNDjx/wc8TrMBZsqjL9eW01tWb7R7k/mq+/VXfJCl7SoD5emsJop9cOByJZfs8hYIw==", - "dev": true, - "license": "MIT", - "dependencies": { - "mdn-data": "2.0.30", - "source-map-js": "^1.0.1" - }, - "engines": { - "node": "^10 || ^12.20.0 || ^14.13.0 || >=15.0.0" - } - }, - "node_modules/css-what": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/css-what/-/css-what-6.1.0.tgz", - "integrity": "sha512-HTUrgRJ7r4dsZKU6GjmpfRK1O76h97Z8MfS1G0FozR+oF2kG6Vfe8JE6zwrkbxigziPHinCJ+gCPjA9EaBDtRw==", - "dev": true, - "license": "BSD-2-Clause", - "engines": { - "node": ">= 6" - }, - "funding": { - "url": "https://github.com/sponsors/fb55" - } - }, "node_modules/cssesc": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/cssesc/-/cssesc-3.0.0.tgz", @@ -9182,139 +6674,10 @@ "node": ">=4" } }, - "node_modules/cssnano": { - "version": "7.0.6", - "resolved": "https://registry.npmjs.org/cssnano/-/cssnano-7.0.6.tgz", - "integrity": "sha512-54woqx8SCbp8HwvNZYn68ZFAepuouZW4lTwiMVnBErM3VkO7/Sd4oTOt3Zz3bPx3kxQ36aISppyXj2Md4lg8bw==", - "dev": true, - "license": "MIT", - "dependencies": { - "cssnano-preset-default": "^7.0.6", - "lilconfig": "^3.1.2" - }, - "engines": { - "node": "^18.12.0 || ^20.9.0 || >=22.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/cssnano" - }, - "peerDependencies": { - "postcss": "^8.4.31" - } - }, - "node_modules/cssnano-preset-default": { - "version": "7.0.6", - "resolved": "https://registry.npmjs.org/cssnano-preset-default/-/cssnano-preset-default-7.0.6.tgz", - "integrity": "sha512-ZzrgYupYxEvdGGuqL+JKOY70s7+saoNlHSCK/OGn1vB2pQK8KSET8jvenzItcY+kA7NoWvfbb/YhlzuzNKjOhQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "browserslist": "^4.23.3", - "css-declaration-sorter": "^7.2.0", - "cssnano-utils": "^5.0.0", - "postcss-calc": "^10.0.2", - "postcss-colormin": "^7.0.2", - "postcss-convert-values": "^7.0.4", - "postcss-discard-comments": "^7.0.3", - "postcss-discard-duplicates": "^7.0.1", - "postcss-discard-empty": "^7.0.0", - "postcss-discard-overridden": "^7.0.0", - "postcss-merge-longhand": "^7.0.4", - "postcss-merge-rules": "^7.0.4", - "postcss-minify-font-values": "^7.0.0", - "postcss-minify-gradients": "^7.0.0", - "postcss-minify-params": "^7.0.2", - "postcss-minify-selectors": "^7.0.4", - "postcss-normalize-charset": "^7.0.0", - "postcss-normalize-display-values": "^7.0.0", - "postcss-normalize-positions": "^7.0.0", - "postcss-normalize-repeat-style": "^7.0.0", - "postcss-normalize-string": "^7.0.0", - "postcss-normalize-timing-functions": "^7.0.0", - "postcss-normalize-unicode": "^7.0.2", - "postcss-normalize-url": "^7.0.0", - "postcss-normalize-whitespace": "^7.0.0", - "postcss-ordered-values": "^7.0.1", - "postcss-reduce-initial": "^7.0.2", - "postcss-reduce-transforms": "^7.0.0", - "postcss-svgo": "^7.0.1", - "postcss-unique-selectors": "^7.0.3" - }, - "engines": { - "node": "^18.12.0 || ^20.9.0 || >=22.0" - }, - "peerDependencies": { - "postcss": "^8.4.31" - } - }, - "node_modules/cssnano-utils": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/cssnano-utils/-/cssnano-utils-5.0.0.tgz", - "integrity": "sha512-Uij0Xdxc24L6SirFr25MlwC2rCFX6scyUmuKpzI+JQ7cyqDEwD42fJ0xfB3yLfOnRDU5LKGgjQ9FA6LYh76GWQ==", - "dev": true, - "license": "MIT", - "engines": { - "node": "^18.12.0 || ^20.9.0 || >=22.0" - }, - "peerDependencies": { - "postcss": "^8.4.31" - } - }, - "node_modules/csso": { - "version": "5.0.5", - "resolved": "https://registry.npmjs.org/csso/-/csso-5.0.5.tgz", - "integrity": "sha512-0LrrStPOdJj+SPCCrGhzryycLjwcgUSHBtxNA8aIDxf0GLsRh1cKYhB00Gd1lDOS4yGH69+SNn13+TWbVHETFQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "css-tree": "~2.2.0" - }, - "engines": { - "node": "^10 || ^12.20.0 || ^14.13.0 || >=15.0.0", - "npm": ">=7.0.0" - } - }, - "node_modules/csso/node_modules/css-tree": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/css-tree/-/css-tree-2.2.1.tgz", - "integrity": "sha512-OA0mILzGc1kCOCSJerOeqDxDQ4HOh+G8NbOJFOTgOCzpw7fCBubk0fEyxp8AgOL/jvLgYA/uV0cMbe43ElF1JA==", - "dev": true, - "license": "MIT", - "dependencies": { - "mdn-data": "2.0.28", - "source-map-js": "^1.0.1" - }, - "engines": { - "node": "^10 || ^12.20.0 || ^14.13.0 || >=15.0.0", - "npm": ">=7.0.0" - } - }, - "node_modules/csso/node_modules/mdn-data": { - "version": "2.0.28", - "resolved": "https://registry.npmjs.org/mdn-data/-/mdn-data-2.0.28.tgz", - "integrity": "sha512-aylIc7Z9y4yzHYAJNuESG3hfhC+0Ibp/MAMiaOZgNv4pmEdFyfZhhhny4MNiAfWdBQ1RQ2mfDWmM1x8SvGyp8g==", - "dev": true, - "license": "CC0-1.0" - }, "node_modules/csstype": { - "version": "3.1.3", - "resolved": "https://registry.npmjs.org/csstype/-/csstype-3.1.3.tgz", - "integrity": "sha512-M1uQkMl8rQK/szD0LNhtqxIPLpimGm8sOBwU7lLnCpSbTyY3yeU1Vc7l4KT5zT4s/yOxHH5O7tIuuLOCnLADRw==", - "license": "MIT" - }, - "node_modules/cuid": { - "version": "2.1.8", - "resolved": "https://registry.npmjs.org/cuid/-/cuid-2.1.8.tgz", - "integrity": "sha512-xiEMER6E7TlTPnDxrM4eRiC6TRgjNX9xzEZ5U/Se2YJKr7Mq4pJn/2XEHjl3STcSh96GmkHPcBXLES8M29wyyg==", - "deprecated": "Cuid and other k-sortable and non-cryptographic ids (Ulid, ObjectId, KSUID, all UUIDs) are all insecure. Use @paralleldrive/cuid2 instead.", - "license": "MIT" - }, - "node_modules/dag-map": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/dag-map/-/dag-map-1.0.2.tgz", - "integrity": "sha512-+LSAiGFwQ9dRnRdOeaj7g47ZFJcOUPukAP8J3A3fuZ1g9Y44BG+P1sgApjLXTQPOzC4+7S9Wr8kXsfpINM4jpw==", - "dev": true, + "version": "3.2.3", + "resolved": "https://registry.npmjs.org/csstype/-/csstype-3.2.3.tgz", + "integrity": "sha512-z1HGKcYy2xA8AGQfwrn0PAy+PB7X/GSj3UVJW9qKyn43xWa+gl5nXmU4qqLMRzWVLFC8KusUX8T/0kCiOYpAIQ==", "license": "MIT" }, "node_modules/data-uri-to-buffer": { @@ -9323,60 +6686,6 @@ "integrity": "sha512-ND9qDTLc6diwj+Xe5cdAgVTbLVdXbtxTJRXRhli8Mowuaan+0EJOtdqJ0QCHNSSPyoXGx9HX2/VMnKeC34AChA==", "license": "MIT" }, - "node_modules/data-view-buffer": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/data-view-buffer/-/data-view-buffer-1.0.2.tgz", - "integrity": "sha512-EmKO5V3OLXh1rtK2wgXRansaK1/mtVdTUEiEI0W8RkvgT05kfxaH29PliLnpLP73yYO6142Q72QNa8Wx/A5CqQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "call-bound": "^1.0.3", - "es-errors": "^1.3.0", - "is-data-view": "^1.0.2" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/data-view-byte-length": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/data-view-byte-length/-/data-view-byte-length-1.0.2.tgz", - "integrity": "sha512-tuhGbE6CfTM9+5ANGf+oQb72Ky/0+s3xKUpHvShfiz2RxMFgFPjsXuRLBVMtvMs15awe45SRb83D6wH4ew6wlQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "call-bound": "^1.0.3", - "es-errors": "^1.3.0", - "is-data-view": "^1.0.2" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/inspect-js" - } - }, - "node_modules/data-view-byte-offset": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/data-view-byte-offset/-/data-view-byte-offset-1.0.1.tgz", - "integrity": "sha512-BS8PfmtDGnrgYdOonGZQdLZslWIeCGFP9tpan0hi1Co2Zr2NKADsvGYA8XxuG/4UWgJ6Cjtv+YJnB6MM69QGlQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "call-bound": "^1.0.2", - "es-errors": "^1.3.0", - "is-data-view": "^1.0.1" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, "node_modules/dateformat": { "version": "4.6.3", "resolved": "https://registry.npmjs.org/dateformat/-/dateformat-4.6.3.tgz", @@ -9388,15 +6697,15 @@ } }, "node_modules/dayjs": { - "version": "1.11.13", - "resolved": "https://registry.npmjs.org/dayjs/-/dayjs-1.11.13.tgz", - "integrity": "sha512-oaMBel6gjolK862uaPQOVTA7q3TZhuSvuMQAAglQDOWYO9A91IrAOUJEyKVlqJlHE0vq5p5UXxzdPfMH/x6xNg==", + "version": "1.11.21", + "resolved": "https://registry.npmjs.org/dayjs/-/dayjs-1.11.21.tgz", + "integrity": "sha512-98IT+HOahAisibz/yjKbzuOBwYcjJ7BCLPzARyHiyEBmRz4fatF+KPJszEHXsGYjUG234aH/cOjW1wwTbKUZlA==", "license": "MIT" }, "node_modules/debug": { - "version": "4.4.0", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.0.tgz", - "integrity": "sha512-6WTZ/IxCY/T6BALoZHaE4ctp9xm+Z5kY/pzYaCHRFeyVhojxlrm+46y68HA6hr0TcwEssoxNiDEUJQjfPZ/RYA==", + "version": "4.4.3", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.3.tgz", + "integrity": "sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA==", "license": "MIT", "dependencies": { "ms": "^2.1.3" @@ -9419,44 +6728,25 @@ "node": ">=0.10.0" } }, - "node_modules/decimal.js": { - "version": "10.4.3", - "resolved": "https://registry.npmjs.org/decimal.js/-/decimal.js-10.4.3.tgz", - "integrity": "sha512-VBBaLc1MgL5XpzgIP7ny5Z6Nx3UrRkIViUkPUdtl9aya5amy3De1gsUUSB1g3+3sExYNjCAsAznmukyxCb1GRA==", - "dev": true, - "license": "MIT" - }, "node_modules/decompress-response": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/decompress-response/-/decompress-response-6.0.0.tgz", - "integrity": "sha512-aW35yZM6Bb/4oJlZncMH2LCoZtJXTRxES17vE3hoRiowU2kWHaJKFkSBDnDR+cm9J+9QhXmREyIfv0pji9ejCQ==", + "version": "10.0.0", + "resolved": "https://registry.npmjs.org/decompress-response/-/decompress-response-10.0.0.tgz", + "integrity": "sha512-oj7KWToJuuxlPr7VV0vabvxEIiqNMo+q0NueIiL3XhtwC6FVOX7Hr1c0C4eD0bmf7Zr+S/dSf2xvkH3Ad6sU3Q==", "license": "MIT", "dependencies": { - "mimic-response": "^3.1.0" + "mimic-response": "^4.0.0" }, "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/decompress-response/node_modules/mimic-response": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/mimic-response/-/mimic-response-3.1.0.tgz", - "integrity": "sha512-z0yWI+4FDrrweS8Zmt4Ej5HdJmky15+L2e6Wgn3+iK5fWzb6T3fhNFq2+MeTRb064c6Wr4N/wv0DzQTjNzHNGQ==", - "license": "MIT", - "engines": { - "node": ">=10" + "node": ">=20" }, "funding": { "url": "https://github.com/sponsors/sindresorhus" } }, "node_modules/dedent": { - "version": "1.5.3", - "resolved": "https://registry.npmjs.org/dedent/-/dedent-1.5.3.tgz", - "integrity": "sha512-NHQtfOOW68WD8lgypbLA5oT+Bt0xXJhiYvoR6SmmNXZfpzOGXwdKWmcwG8N7PwVVWV3eF/68nmD9BaJSsTBhyQ==", + "version": "1.7.2", + "resolved": "https://registry.npmjs.org/dedent/-/dedent-1.7.2.tgz", + "integrity": "sha512-WzMx3mW98SN+zn3hgemf4OzdmyNhhhKz5Ay0pUfQiMQ3e1g+xmTJWp/pKdwKVXhdSkAEGIIzqeuWrL3mV/AXbA==", "devOptional": true, "license": "MIT", "peerDependencies": { @@ -9469,34 +6759,16 @@ } }, "node_modules/deep-email-validator": { - "version": "0.1.21", - "resolved": "https://registry.npmjs.org/deep-email-validator/-/deep-email-validator-0.1.21.tgz", - "integrity": "sha512-DBAmMzbr+MAubXQ+TS9tZuPwLcdKscb8YzKZiwoLqF3NmaeEgXvSSHhZ0EXOFeKFE2FNWC4mNXCyiQ/JdFXUwg==", + "version": "0.1.27", + "resolved": "https://registry.npmjs.org/deep-email-validator/-/deep-email-validator-0.1.27.tgz", + "integrity": "sha512-c5byUHycJHIdno+EZpnPAxHaq1NLGf/W5Trrd5ihF7wWAaWyPKYDXW9afQP5XiVhQeGiV9kKEUlVnbksMSQ20Q==", "license": "MIT", "dependencies": { - "@types/disposable-email-domains": "^1.0.1", - "axios": "^0.24.0", - "disposable-email-domains": "^1.0.59", + "disposable-email-domains": "^1.0.62", "mailcheck": "^1.1.1" - } - }, - "node_modules/deep-email-validator/node_modules/axios": { - "version": "0.24.0", - "resolved": "https://registry.npmjs.org/axios/-/axios-0.24.0.tgz", - "integrity": "sha512-Q6cWsys88HoPgAaFAVUb0WpPk0O8iTeisR9IMqy9G8AbO4NlpVknrnQS03zzF9PGAWgO3cgletO3VjV/P7VztA==", - "license": "MIT", - "dependencies": { - "follow-redirects": "^1.14.4" - } - }, - "node_modules/deep-eql": { - "version": "5.0.2", - "resolved": "https://registry.npmjs.org/deep-eql/-/deep-eql-5.0.2.tgz", - "integrity": "sha512-h5k/5U50IJJFpzfL6nO9jaaumfjO/f2NjK/oYB2Djzm4p9L+3T9qWpZqZ2hAbLPuuYq9wrU08WQyBTL5GbPk5Q==", - "dev": true, - "license": "MIT", + }, "engines": { - "node": ">=6" + "node": ">=20" } }, "node_modules/deep-is": { @@ -9516,9 +6788,9 @@ } }, "node_modules/default-browser": { - "version": "5.2.1", - "resolved": "https://registry.npmjs.org/default-browser/-/default-browser-5.2.1.tgz", - "integrity": "sha512-WY/3TUME0x3KPYdRRxEJJvXRHV4PyPoUsxtZa78lwItwRQRHhd2U9xOscaT/YTf8uCXIAjeJOFBVEh/7FtD8Xg==", + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/default-browser/-/default-browser-5.5.0.tgz", + "integrity": "sha512-H9LMLr5zwIbSxrmvikGuI/5KGhZ8E2zH3stkMgM5LpOWDutGM2JZaj460Udnf1a+946zc7YBgrqEWwbk7zHvGw==", "dev": true, "license": "MIT", "dependencies": { @@ -9533,9 +6805,9 @@ } }, "node_modules/default-browser-id": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/default-browser-id/-/default-browser-id-5.0.0.tgz", - "integrity": "sha512-A6p/pu/6fyBcA1TRz/GqWYPViplrftcW2gZC9q79ngNCKAeR/X3gcEdXQHl4KNXV+3wgIJ1CPkJQ3IHM6lcsyA==", + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/default-browser-id/-/default-browser-id-5.0.1.tgz", + "integrity": "sha512-x1VCxdX4t+8wVfd1so/9w+vQ4vx7lKd2Qp5tDRutErwmR85OgmfX7RlLRMWafRMY7hbEiXIbudNrjOAPa/hL8Q==", "dev": true, "license": "MIT", "engines": { @@ -9545,56 +6817,6 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/defaults": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/defaults/-/defaults-1.0.4.tgz", - "integrity": "sha512-eFuaLoy/Rxalv2kr+lqMlUnrDWV+3j4pljOIJgLIhI058IQfWJ7vXhyEIHu+HtC738klGALYxOKDO0bQP3tg8A==", - "dev": true, - "license": "MIT", - "dependencies": { - "clone": "^1.0.2" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/defaults/node_modules/clone": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/clone/-/clone-1.0.4.tgz", - "integrity": "sha512-JQHZ2QMW6l3aH/j6xCqQThY/9OH4D/9ls34cgkUBiEeocRTU04tHfKPBsUK1PqZCUQM7GiA0IIXJSuXHI64Kbg==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=0.8" - } - }, - "node_modules/defer-to-connect": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/defer-to-connect/-/defer-to-connect-2.0.1.tgz", - "integrity": "sha512-4tvttepXG1VaYGrRibk5EwJd1t4udunSOVMdLSAL6mId1ix438oPwPZMALY41FCijukO1L0twNcGsdzS7dHgDg==", - "license": "MIT", - "engines": { - "node": ">=10" - } - }, - "node_modules/define-data-property": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/define-data-property/-/define-data-property-1.1.4.tgz", - "integrity": "sha512-rBMvIzlpA8v6E+SJZoo++HAYqsLrkg7MSfIinMPFhmkorw7X+dOXVJQs+QT69zGkzMyfDnIMN2Wid1+NbL3T+A==", - "dev": true, - "license": "MIT", - "dependencies": { - "es-define-property": "^1.0.0", - "es-errors": "^1.3.0", - "gopd": "^1.0.1" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, "node_modules/define-lazy-prop": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/define-lazy-prop/-/define-lazy-prop-3.0.0.tgz", @@ -9608,24 +6830,6 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/define-properties": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.2.1.tgz", - "integrity": "sha512-8QmQKqEASLd5nx0U1B1okLElbUuuttJ/AnYmRXbbbGDWh6uS208EjD4Xqq/I9wK7u0v6O08XhTWnt5XtEbR6Dg==", - "dev": true, - "license": "MIT", - "dependencies": { - "define-data-property": "^1.0.1", - "has-property-descriptors": "^1.0.0", - "object-keys": "^1.1.1" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, "node_modules/delayed-stream": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", @@ -9670,9 +6874,9 @@ } }, "node_modules/detect-libc": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-2.0.3.tgz", - "integrity": "sha512-bwy0MGW55bG41VqxxypOsdSdGqLwXPI/focwgTYCFMbdUiBAxLg9CFzG08sz2aqzknwiX7Hkl0bQENjg8iLByw==", + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-2.1.2.tgz", + "integrity": "sha512-Btj2BOOO83o3WyH59e8MgXsxEQVcarkUOpEYrubB0urwnN10yQ364rsiByU11nZlqWYZm05i/of7io4mzihBtQ==", "license": "Apache-2.0", "engines": { "node": ">=8" @@ -9689,7 +6893,7 @@ "version": "1.0.4", "resolved": "https://registry.npmjs.org/dezalgo/-/dezalgo-1.0.4.tgz", "integrity": "sha512-rXSP0bf+5n0Qonsb+SVVfNfIsimO4HEtmnIpPHY8Q1UCzKlQrDMfdobr8nJOOsRgWCyMRqeSBQzmWUMq7zvVig==", - "devOptional": true, + "dev": true, "license": "ISC", "dependencies": { "asap": "^2.0.0", @@ -9704,25 +6908,15 @@ "license": "Apache-2.0" }, "node_modules/diff": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/diff/-/diff-4.0.2.tgz", - "integrity": "sha512-58lmxKSA4BNyLz+HHMUzlOEpg09FV+ev6ZMe3vJihgdxzgcwZ8VoEEPmALCZG9LmqfVoNMMKpttIYTVG6uDY7A==", + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/diff/-/diff-4.0.4.tgz", + "integrity": "sha512-X07nttJQkwkfKfvTPG/KSnE2OMdcUCao6+eXF3wmnIQRn2aPAHH3VxDbDOdegkd6JbPsXqShpvEOHfAT+nCNwQ==", "dev": true, "license": "BSD-3-Clause", "engines": { "node": ">=0.3.1" } }, - "node_modules/diff-sequences": { - "version": "29.6.3", - "resolved": "https://registry.npmjs.org/diff-sequences/-/diff-sequences-29.6.3.tgz", - "integrity": "sha512-EjePK1srD3P08o2j4f0ExnylqRs5B9tJjcp9t1krH2qRi8CCdsYfwe9JgSLurFBWwq4uOlipzfk5fHNvwFKr8Q==", - "devOptional": true, - "license": "MIT", - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, "node_modules/dijkstrajs": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/dijkstrajs/-/dijkstrajs-1.0.3.tgz", @@ -9790,99 +6984,10 @@ "node": ">=6.0.0" } }, - "node_modules/dom-converter": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/dom-converter/-/dom-converter-0.2.0.tgz", - "integrity": "sha512-gd3ypIPfOMr9h5jIKq8E3sHOTCjeirnl0WK5ZdS1AW0Odt0b1PaWaHdJ4Qk4klv+YB9aJBS7mESXjFoDQPu6DA==", - "dev": true, - "license": "MIT", - "dependencies": { - "utila": "~0.4" - } - }, - "node_modules/dom-serializer": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-1.4.1.tgz", - "integrity": "sha512-VHwB3KfrcOOkelEG2ZOfxqLZdfkil8PtJi4P8N2MMXucZq2yLp75ClViUlOVwyoHEDjYU433Aq+5zWP61+RGag==", - "dev": true, - "license": "MIT", - "dependencies": { - "domelementtype": "^2.0.1", - "domhandler": "^4.2.0", - "entities": "^2.0.0" - }, - "funding": { - "url": "https://github.com/cheeriojs/dom-serializer?sponsor=1" - } - }, - "node_modules/dom-serializer/node_modules/entities": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/entities/-/entities-2.2.0.tgz", - "integrity": "sha512-p92if5Nz619I0w+akJrLZH0MX0Pb5DX39XOwQTtXSdQQOaYH03S1uIQp4mhOZtAXrxq4ViO67YTiLBo2638o9A==", - "dev": true, - "license": "BSD-2-Clause", - "funding": { - "url": "https://github.com/fb55/entities?sponsor=1" - } - }, - "node_modules/domelementtype": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-2.3.0.tgz", - "integrity": "sha512-OLETBj6w0OsagBwdXnPdN0cnMfF9opN69co+7ZrbfPGrdpPVNBUj02spi6B1N7wChLQiPn4CSH/zJvXw56gmHw==", - "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/fb55" - } - ], - "license": "BSD-2-Clause" - }, - "node_modules/domhandler": { - "version": "4.3.1", - "resolved": "https://registry.npmjs.org/domhandler/-/domhandler-4.3.1.tgz", - "integrity": "sha512-GrwoxYN+uWlzO8uhUXRl0P+kHE4GtVPfYzVLcUxPL7KNdHKj66vvlhiweIHqYYXWlw+T8iLMp42Lm67ghw4WMQ==", - "dev": true, - "license": "BSD-2-Clause", - "dependencies": { - "domelementtype": "^2.2.0" - }, - "engines": { - "node": ">= 4" - }, - "funding": { - "url": "https://github.com/fb55/domhandler?sponsor=1" - } - }, - "node_modules/domutils": { - "version": "2.8.0", - "resolved": "https://registry.npmjs.org/domutils/-/domutils-2.8.0.tgz", - "integrity": "sha512-w96Cjofp72M5IIhpjgobBimYEfoPjx1Vx0BSX9P30WBdZW2WIKU0T1Bd0kz2eNZ9ikjKgHbEyKx8BB6H1L3h3A==", - "dev": true, - "license": "BSD-2-Clause", - "dependencies": { - "dom-serializer": "^1.0.1", - "domelementtype": "^2.2.0", - "domhandler": "^4.2.0" - }, - "funding": { - "url": "https://github.com/fb55/domutils?sponsor=1" - } - }, - "node_modules/dot-case": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/dot-case/-/dot-case-3.0.4.tgz", - "integrity": "sha512-Kv5nKlh6yRrdrGvxeJ2e5y2eRUpkUosIW4A2AS38zwSz27zu7ufDwQPi5Jhs3XAlGNetl3bmnGhQsMtkKJnj3w==", - "license": "MIT", - "dependencies": { - "no-case": "^3.0.4", - "tslib": "^2.0.3" - } - }, "node_modules/dotenv": { - "version": "16.4.7", - "resolved": "https://registry.npmjs.org/dotenv/-/dotenv-16.4.7.tgz", - "integrity": "sha512-47qPchRCykZC03FhkYAhrvwU4xDBFIj1QPqaarj6mdM/hgUzfPHcpkHJOn3mJAufFeeAxAzeGsr5X0M4k6fLZQ==", + "version": "16.6.1", + "resolved": "https://registry.npmjs.org/dotenv/-/dotenv-16.6.1.tgz", + "integrity": "sha512-uBq4egWHTcTt33a72vpSG0z3HnPuIl6NqYcTrKEg2azoEyl2hpW0zqlxysq2pK9HlDIHyHyakeYaYnSAwd8bow==", "license": "BSD-2-Clause", "engines": { "node": ">=12" @@ -9912,9 +7017,9 @@ } }, "node_modules/dotenv-webpack": { - "version": "8.1.0", - "resolved": "https://registry.npmjs.org/dotenv-webpack/-/dotenv-webpack-8.1.0.tgz", - "integrity": "sha512-owK1JcsPkIobeqjVrk6h7jPED/W6ZpdFsMPR+5ursB7/SdgDyO+VzAU+szK8C8u3qUhtENyYnj8eyXMR5kkGag==", + "version": "8.1.1", + "resolved": "https://registry.npmjs.org/dotenv-webpack/-/dotenv-webpack-8.1.1.tgz", + "integrity": "sha512-+TY/AJ2k9bU2EML3mxgLmaAvEcqs1Wbv6deCIUSI3eW3Xeo8LBQumYib6puyaSwbjC9JCzg/y5Pwjd/lePX04w==", "dev": true, "license": "MIT", "dependencies": { @@ -9941,73 +7046,76 @@ "node": ">= 0.4" } }, - "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, - "license": "MIT" - }, "node_modules/edge-error": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/edge-error/-/edge-error-4.0.1.tgz", - "integrity": "sha512-z5mNO97k8hRVpJ6Ew1qbkMTfQ44CwuWnl+ShMCrEFgD+b324CnjBS6HbiR+Wh6Wcmw9C+/XsFBHzZ+376PpD/w==", + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/edge-error/-/edge-error-4.0.2.tgz", + "integrity": "sha512-jB76VYn8wapDHKHSOmP3vbKLoa77RJYsTLNmfl8+cuCD69uxZtP3h+kqV+Prw/YkYmN7yHyp4IApE15pDByk0A==", "license": "MIT", "engines": { "node": ">=18.16.0" } }, "node_modules/edge-lexer": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/edge-lexer/-/edge-lexer-6.0.2.tgz", - "integrity": "sha512-C30wqcw66JwpepLnsTqTp0P4JqKa2xEbAfNj3dPOvBYq4zybiYuhlpSzExvNUeoAAnbjgozgVTVAQ38HctyV4g==", + "version": "6.0.5", + "resolved": "https://registry.npmjs.org/edge-lexer/-/edge-lexer-6.0.5.tgz", + "integrity": "sha512-paSprHn8GRzOUWTVLapgacqDBSOpJgOY60/V5QQ8bbNLHRKUMSxp8Z2oOO0WKtcKmb5+sAlmvG3izhbFulp19A==", "license": "MIT", "dependencies": { - "edge-error": "^4.0.1" + "edge-error": "^4.0.2" }, "engines": { - "node": ">=18.16.0" + "node": ">=24.0.0" } }, "node_modules/edge-parser": { - "version": "9.0.3", - "resolved": "https://registry.npmjs.org/edge-parser/-/edge-parser-9.0.3.tgz", - "integrity": "sha512-E9W+9wV8QVGLZCtrgKp6k9kIncsUxmrpa/yG+vwVGPpCMBZZZZaShJXwVDHThyL2mkHkWyYvhBpPhuucgW8kiA==", + "version": "9.1.1", + "resolved": "https://registry.npmjs.org/edge-parser/-/edge-parser-9.1.1.tgz", + "integrity": "sha512-kem/vInJgTzHCABdFe060WGjyGva8j23QwVbZkNFXkNAQhRz3mga5kNBuPFYQ3t73nPT2vZ8WOGV4OCS0P16Cw==", "license": "MIT", "dependencies": { - "acorn": "^8.12.1", + "acorn": "^8.16.0", "astring": "^1.9.0", - "edge-error": "^4.0.1", - "edge-lexer": "^6.0.2", + "edge-error": "^4.0.2", + "edge-lexer": "^6.0.5", "js-stringify": "^1.0.2" }, "engines": { - "node": ">=18.16.0" + "node": ">=24.0.0" } }, "node_modules/edge.js": { - "version": "6.2.0", - "resolved": "https://registry.npmjs.org/edge.js/-/edge.js-6.2.0.tgz", - "integrity": "sha512-xw82TzdPngccJiFqK6FE/79vO6mUvWVvKe6OEu/VHDOf199SIOW1q022d3UIaKGXcwf60lIXZYPIRqooQuzigA==", + "version": "6.5.1", + "resolved": "https://registry.npmjs.org/edge.js/-/edge.js-6.5.1.tgz", + "integrity": "sha512-+NgWA8KunEdhVB247GWdmqUZ3MSIExeUCAbWNgNvA0ONH43UL+a/l6AE8GsevT4beqVsbp4Q6USwSpfbnMqBkQ==", "license": "MIT", "dependencies": { "@poppinss/inspect": "^1.0.1", - "@poppinss/macroable": "^1.0.3", - "@poppinss/utils": "^6.8.1", - "classnames": "^2.5.1", - "edge-error": "^4.0.1", - "edge-lexer": "^6.0.2", - "edge-parser": "^9.0.3", - "fs-readdir-recursive": "^1.1.0", + "@poppinss/macroable": "^1.1.2", + "@poppinss/utils": "^7.0.1", + "edge-error": "^4.0.2", + "edge-lexer": "^6.0.5", + "edge-parser": "^9.1.1", "he": "^1.2.0", - "js-stringify": "^1.0.2", - "property-information": "^6.5.0", + "property-information": "^7.1.0", "stringify-attributes": "^4.0.0" }, "engines": { "node": ">=18.16.0" } }, + "node_modules/edge.js/node_modules/@poppinss/utils": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/@poppinss/utils/-/utils-7.0.1.tgz", + "integrity": "sha512-mveSvLI2YPC114mK5HCuSYfUtjpClf1wHG1VCqZJCp4U2ypPhIt62Iku5urh0kPAFvnvCVHx2bXBSH14qMTOlQ==", + "license": "MIT", + "dependencies": { + "@poppinss/exception": "^1.2.3", + "@poppinss/object-builder": "^1.1.0", + "@poppinss/string": "^1.7.1", + "@poppinss/types": "^1.2.1", + "flattie": "^1.1.1" + } + }, "node_modules/ee-first": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz", @@ -10015,16 +7123,16 @@ "license": "MIT" }, "node_modules/electron-to-chromium": { - "version": "1.5.79", - "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.79.tgz", - "integrity": "sha512-nYOxJNxQ9Om4EC88BE4pPoNI8xwSFf8pU/BAeOl4Hh/b/i6V4biTAzwV7pXi3ARKeoYO5JZKMIXTryXSVer5RA==", + "version": "1.5.368", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.368.tgz", + "integrity": "sha512-7RckJJK4uESJF9PxvfMWd3TGqIiieUTG4HxnKaKuIpGbcr+r2ZEB3g2gAhCP3Fqm42vJSzLfgab9eva/C4/XVw==", "dev": true, "license": "ISC" }, "node_modules/emittery": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/emittery/-/emittery-1.0.3.tgz", - "integrity": "sha512-tJdCJitoy2lrC2ldJcqN4vkqJ00lT+tOWNT1hBJjO/3FDMJa5TTIiYGCKGkn/WfCyOzUMObeohbVTj00fhiLiA==", + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/emittery/-/emittery-1.2.1.tgz", + "integrity": "sha512-sFz64DCRjirhwHLxofFqxYQm6DCp6o0Ix7jwKQvuCHPn4GMRZNuBZyLPu9Ccmk/QSCAMZt6FOUqA8JZCQvA9fw==", "license": "MIT", "engines": { "node": ">=14.16" @@ -10034,34 +7142,24 @@ } }, "node_modules/emoji-regex": { - "version": "10.4.0", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-10.4.0.tgz", - "integrity": "sha512-EC+0oUMY1Rqm4O6LLrgjtYDvcVYTy7chDnM4Q7030tP4Kwj3u/pR6gP9ygnp2CJMK5Gq+9Q2oqmrFJAz01DXjw==", + "version": "10.6.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-10.6.0.tgz", + "integrity": "sha512-toUI84YS5YmxW219erniWD0CIVOo46xGKColeNQRgOzDorgBi1v4D71/OFzgD9GO2UGKIv1C3Sp8DAn0+j5w7A==", "license": "MIT" }, - "node_modules/emojis-list": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/emojis-list/-/emojis-list-3.0.0.tgz", - "integrity": "sha512-/kyM18EfinwXZbno9FyUGeFh87KC8HRQBQGildHZbEuRyWFOmv1U10o9BBp8XVZDVNNuQKyIGIu5ZYAAXJ0V2Q==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 4" - } - }, "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==", + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-2.0.0.tgz", + "integrity": "sha512-Q0n9HRi4m6JuGIV1eFlmvJB7ZEVxu93IrMyiMsGC0lrMJMWzRgx6WGquyfQgZVb31vhGgXnfmPNNXmxnOkRBrg==", "license": "MIT", "engines": { "node": ">= 0.8" } }, "node_modules/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==", + "version": "1.4.5", + "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.5.tgz", + "integrity": "sha512-ooEGc6HP26xXq/N+GCGOT0JKCLDGrq2bQUZrQ7gyrJiZANJ/8YDTxTpQBXGMn+WbIQXNVpyWymm7KYVICQnyOg==", "dev": true, "license": "MIT", "dependencies": { @@ -10069,14 +7167,14 @@ } }, "node_modules/enhanced-resolve": { - "version": "5.18.0", - "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-5.18.0.tgz", - "integrity": "sha512-0/r0MySGYG8YqlayBZ6MuCfECmHFdJ5qyPh8s8wa5Hnm6SaFLSK1VYCbj+NKp090Nm1caZhD+QTnmxO7esYGyQ==", + "version": "5.23.0", + "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-5.23.0.tgz", + "integrity": "sha512-yJN/BOOLxcOW2aQgeif9mSnaUB8KtvmMMp56oA1kx1CRfBKbhZm2pJ+NBY+3eOboHxix8lfjWpHE0Ei5U8RbSA==", "dev": true, "license": "MIT", "dependencies": { "graceful-fs": "^4.2.4", - "tapable": "^2.2.0" + "tapable": "^2.3.3" }, "engines": { "node": ">=10.13.0" @@ -10096,9 +7194,9 @@ } }, "node_modules/entities": { - "version": "4.5.0", - "resolved": "https://registry.npmjs.org/entities/-/entities-4.5.0.tgz", - "integrity": "sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw==", + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/entities/-/entities-7.0.1.tgz", + "integrity": "sha512-TWrgLOFUQTH994YUyl1yT4uyavY5nNB5muff+RtWaqNVCAK408b5ZnnbNAUEWLTCpum9w6arT70i1XdQ4UeOPA==", "license": "BSD-2-Clause", "engines": { "node": ">=0.12" @@ -10117,20 +7215,6 @@ "node": ">=6" } }, - "node_modules/envinfo": { - "version": "7.14.0", - "resolved": "https://registry.npmjs.org/envinfo/-/envinfo-7.14.0.tgz", - "integrity": "sha512-CO40UI41xDQzhLB1hWyqUKgFhs250pNcGbyGKe1l/e4FSaI/+YE4IMG76GDt0In67WLPACIITC+sOi08x4wIvg==", - "dev": true, - "license": "MIT", - "peer": true, - "bin": { - "envinfo": "dist/cli.js" - }, - "engines": { - "node": ">=4" - } - }, "node_modules/environment": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/environment/-/environment-1.1.0.tgz", @@ -10144,100 +7228,24 @@ } }, "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==", + "version": "1.3.4", + "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.4.tgz", + "integrity": "sha512-sqQamAnR14VgCr1A618A3sGrygcpK+HEbenA/HiEAkkUwcZIIB/tgWqHFxWgOyDh4nB4JCRimh79dR5Ywc9MDQ==", "dev": true, "license": "MIT", "dependencies": { "is-arrayish": "^0.2.1" } }, - "node_modules/error-stack-parser": { - "version": "2.1.4", - "resolved": "https://registry.npmjs.org/error-stack-parser/-/error-stack-parser-2.1.4.tgz", - "integrity": "sha512-Sk5V6wVazPhq5MhpO+AUxJn5x7XSXGl1R93Vn7i+zS15KDVxQijejNCrz8340/2bgLBjR9GtEG8ZVKONDjcqGQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "stackframe": "^1.3.4" - } - }, "node_modules/error-stack-parser-es": { - "version": "0.1.5", - "resolved": "https://registry.npmjs.org/error-stack-parser-es/-/error-stack-parser-es-0.1.5.tgz", - "integrity": "sha512-xHku1X40RO+fO8yJ8Wh2f2rZWVjqyhb1zgq1yZ8aZRQkv6OOKhKWRUaht3eSCUbAOBaKIgM+ykwFLE+QUxgGeg==", + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/error-stack-parser-es/-/error-stack-parser-es-1.0.5.tgz", + "integrity": "sha512-5qucVt2XcuGMcEGgWI7i+yZpmpByQ8J1lHhcL7PwqCwu9FPP3VUXzT4ltHe5i2z9dePwEHcDVOAfSnHsOlCXRA==", "license": "MIT", "funding": { "url": "https://github.com/sponsors/antfu" } }, - "node_modules/es-abstract": { - "version": "1.23.9", - "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.23.9.tgz", - "integrity": "sha512-py07lI0wjxAC/DcfK1S6G7iANonniZwTISvdPzk9hzeH0IZIshbuuFxLIU96OyF89Yb9hiqWn8M/bY83KY5vzA==", - "dev": true, - "license": "MIT", - "dependencies": { - "array-buffer-byte-length": "^1.0.2", - "arraybuffer.prototype.slice": "^1.0.4", - "available-typed-arrays": "^1.0.7", - "call-bind": "^1.0.8", - "call-bound": "^1.0.3", - "data-view-buffer": "^1.0.2", - "data-view-byte-length": "^1.0.2", - "data-view-byte-offset": "^1.0.1", - "es-define-property": "^1.0.1", - "es-errors": "^1.3.0", - "es-object-atoms": "^1.0.0", - "es-set-tostringtag": "^2.1.0", - "es-to-primitive": "^1.3.0", - "function.prototype.name": "^1.1.8", - "get-intrinsic": "^1.2.7", - "get-proto": "^1.0.0", - "get-symbol-description": "^1.1.0", - "globalthis": "^1.0.4", - "gopd": "^1.2.0", - "has-property-descriptors": "^1.0.2", - "has-proto": "^1.2.0", - "has-symbols": "^1.1.0", - "hasown": "^2.0.2", - "internal-slot": "^1.1.0", - "is-array-buffer": "^3.0.5", - "is-callable": "^1.2.7", - "is-data-view": "^1.0.2", - "is-regex": "^1.2.1", - "is-shared-array-buffer": "^1.0.4", - "is-string": "^1.1.1", - "is-typed-array": "^1.1.15", - "is-weakref": "^1.1.0", - "math-intrinsics": "^1.1.0", - "object-inspect": "^1.13.3", - "object-keys": "^1.1.1", - "object.assign": "^4.1.7", - "own-keys": "^1.0.1", - "regexp.prototype.flags": "^1.5.3", - "safe-array-concat": "^1.1.3", - "safe-push-apply": "^1.0.0", - "safe-regex-test": "^1.1.0", - "set-proto": "^1.0.0", - "string.prototype.trim": "^1.2.10", - "string.prototype.trimend": "^1.0.9", - "string.prototype.trimstart": "^1.0.8", - "typed-array-buffer": "^1.0.3", - "typed-array-byte-length": "^1.0.3", - "typed-array-byte-offset": "^1.0.4", - "typed-array-length": "^1.0.7", - "unbox-primitive": "^1.1.0", - "which-typed-array": "^1.1.18" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, "node_modules/es-define-property": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/es-define-property/-/es-define-property-1.0.1.tgz", @@ -10257,15 +7265,15 @@ } }, "node_modules/es-module-lexer": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/es-module-lexer/-/es-module-lexer-1.6.0.tgz", - "integrity": "sha512-qqnD1yMU6tk/jnaMosogGySTZP8YtUgAffA9nMN+E/rjxcfRQ6IEk7IiozUjgxKoFHBGjTLnrHB/YC45r/59EQ==", + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/es-module-lexer/-/es-module-lexer-1.7.0.tgz", + "integrity": "sha512-jEQoCwk8hyb2AZziIOLhDqpm5+2ww5uIE6lkO/6jcOCusfk6LhMHpXXfBLXTZ7Ydyt0j4VoUQv6uGNYbdW+kBA==", "license": "MIT" }, "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==", + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/es-object-atoms/-/es-object-atoms-1.1.2.tgz", + "integrity": "sha512-HWcBoN6NileqtSydK2FqHbS/LoDd2pqrnQHLyJzBj4kOp/ky2MWMN694xOfkK8/SnUsW2DH7EfyVlydKCsm1Zw==", "license": "MIT", "dependencies": { "es-errors": "^1.3.0" @@ -10278,7 +7286,6 @@ "version": "2.1.0", "resolved": "https://registry.npmjs.org/es-set-tostringtag/-/es-set-tostringtag-2.1.0.tgz", "integrity": "sha512-j6vWzfrGVfyXxge+O0x5sh6cvxAog0a/4Rdd2K36zCMV5eJ+/+tOAngRO8cODMNWbVRdVlmGZQL2YS3yR8bIUA==", - "dev": true, "license": "MIT", "dependencies": { "es-errors": "^1.3.0", @@ -10290,61 +7297,45 @@ "node": ">= 0.4" } }, - "node_modules/es-to-primitive": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/es-to-primitive/-/es-to-primitive-1.3.0.tgz", - "integrity": "sha512-w+5mJ3GuFL+NjVtJlvydShqE1eN3h3PbI7/5LAsYJP/2qtuMXjfL2LpHSRqo4b4eSF5K/DH1JXKUAHSB2UW50g==", - "dev": true, - "license": "MIT", - "dependencies": { - "is-callable": "^1.2.7", - "is-date-object": "^1.0.5", - "is-symbol": "^1.0.4" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, "node_modules/esbuild": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.21.5.tgz", - "integrity": "sha512-mg3OPMV4hXywwpoDxu3Qda5xCKQi+vCTZq8S9J/EpkhB2HzKXq4SNFZE3+NK93JYxc8VMSep+lOUSC/RVKaBqw==", + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.25.12.tgz", + "integrity": "sha512-bbPBYYrtZbkt6Os6FiTLCTFxvq4tt3JKall1vRwshA3fdVztsLAatFaZobhkBC8/BrPetoa0oksYoKXoG4ryJg==", "hasInstallScript": true, "license": "MIT", - "peer": true, "bin": { "esbuild": "bin/esbuild" }, "engines": { - "node": ">=12" + "node": ">=18" }, "optionalDependencies": { - "@esbuild/aix-ppc64": "0.21.5", - "@esbuild/android-arm": "0.21.5", - "@esbuild/android-arm64": "0.21.5", - "@esbuild/android-x64": "0.21.5", - "@esbuild/darwin-arm64": "0.21.5", - "@esbuild/darwin-x64": "0.21.5", - "@esbuild/freebsd-arm64": "0.21.5", - "@esbuild/freebsd-x64": "0.21.5", - "@esbuild/linux-arm": "0.21.5", - "@esbuild/linux-arm64": "0.21.5", - "@esbuild/linux-ia32": "0.21.5", - "@esbuild/linux-loong64": "0.21.5", - "@esbuild/linux-mips64el": "0.21.5", - "@esbuild/linux-ppc64": "0.21.5", - "@esbuild/linux-riscv64": "0.21.5", - "@esbuild/linux-s390x": "0.21.5", - "@esbuild/linux-x64": "0.21.5", - "@esbuild/netbsd-x64": "0.21.5", - "@esbuild/openbsd-x64": "0.21.5", - "@esbuild/sunos-x64": "0.21.5", - "@esbuild/win32-arm64": "0.21.5", - "@esbuild/win32-ia32": "0.21.5", - "@esbuild/win32-x64": "0.21.5" + "@esbuild/aix-ppc64": "0.25.12", + "@esbuild/android-arm": "0.25.12", + "@esbuild/android-arm64": "0.25.12", + "@esbuild/android-x64": "0.25.12", + "@esbuild/darwin-arm64": "0.25.12", + "@esbuild/darwin-x64": "0.25.12", + "@esbuild/freebsd-arm64": "0.25.12", + "@esbuild/freebsd-x64": "0.25.12", + "@esbuild/linux-arm": "0.25.12", + "@esbuild/linux-arm64": "0.25.12", + "@esbuild/linux-ia32": "0.25.12", + "@esbuild/linux-loong64": "0.25.12", + "@esbuild/linux-mips64el": "0.25.12", + "@esbuild/linux-ppc64": "0.25.12", + "@esbuild/linux-riscv64": "0.25.12", + "@esbuild/linux-s390x": "0.25.12", + "@esbuild/linux-x64": "0.25.12", + "@esbuild/netbsd-arm64": "0.25.12", + "@esbuild/netbsd-x64": "0.25.12", + "@esbuild/openbsd-arm64": "0.25.12", + "@esbuild/openbsd-x64": "0.25.12", + "@esbuild/openharmony-arm64": "0.25.12", + "@esbuild/sunos-x64": "0.25.12", + "@esbuild/win32-arm64": "0.25.12", + "@esbuild/win32-ia32": "0.25.12", + "@esbuild/win32-x64": "0.25.12" } }, "node_modules/escalade": { @@ -10375,13 +7366,16 @@ "license": "MIT" }, "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==", + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz", + "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==", "dev": true, "license": "MIT", "engines": { - "node": ">=0.8.0" + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, "node_modules/eslint": { @@ -10442,14 +7436,17 @@ } }, "node_modules/eslint-config-prettier": { - "version": "9.1.0", - "resolved": "https://registry.npmjs.org/eslint-config-prettier/-/eslint-config-prettier-9.1.0.tgz", - "integrity": "sha512-NSWl5BFQWEPi1j4TjVNItzYV7dZXZ+wP6I6ZhrBGpChQhZRUaElihE9uRRkcbRnNb76UMKDF3r+WTmNcGPKsqw==", + "version": "10.1.8", + "resolved": "https://registry.npmjs.org/eslint-config-prettier/-/eslint-config-prettier-10.1.8.tgz", + "integrity": "sha512-82GZUjRS0p/jganf6q1rEO25VSoHH0hKPCTrgillPjdI/3bgBhAE1QzHrHTizjpRvy6pGAvKjDJtk2pF9NDq8w==", "dev": true, "license": "MIT", "bin": { "eslint-config-prettier": "bin/cli.js" }, + "funding": { + "url": "https://opencollective.com/eslint-config-prettier" + }, "peerDependencies": { "eslint": ">=7.0.0" } @@ -10472,14 +7469,14 @@ } }, "node_modules/eslint-plugin-prettier": { - "version": "5.2.1", - "resolved": "https://registry.npmjs.org/eslint-plugin-prettier/-/eslint-plugin-prettier-5.2.1.tgz", - "integrity": "sha512-gH3iR3g4JfF+yYPaJYkN7jEl9QbweL/YfkoRlNnuIEHEz1vHVlCmWOS+eGGiRuzHQXdJFCOTxRgvju9b8VUmrw==", + "version": "5.5.6", + "resolved": "https://registry.npmjs.org/eslint-plugin-prettier/-/eslint-plugin-prettier-5.5.6.tgz", + "integrity": "sha512-ifetmTcxWfz+4qRW3pH/ujdTq2jQIj59AxJMIN26K5avYgU8dxycUETQonWiW+wPrYXA0j3Try0l1CnwVQtDqQ==", "dev": true, "license": "MIT", "dependencies": { - "prettier-linter-helpers": "^1.0.0", - "synckit": "^0.9.1" + "prettier-linter-helpers": "^1.0.1", + "synckit": "^0.11.13" }, "engines": { "node": "^14.18.0 || >=16.0.0" @@ -10490,7 +7487,7 @@ "peerDependencies": { "@types/eslint": ">=8.0.0", "eslint": ">=8.0.0", - "eslint-config-prettier": "*", + "eslint-config-prettier": ">= 7.0.0 <10.0.0 || >=10.1.0", "prettier": ">=3.0.0" }, "peerDependenciesMeta": { @@ -10532,134 +7529,6 @@ "url": "https://opencollective.com/eslint" } }, - "node_modules/eslint/node_modules/ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "dev": true, - "license": "MIT", - "dependencies": { - "color-convert": "^2.0.1" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" - } - }, - "node_modules/eslint/node_modules/argparse": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", - "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==", - "dev": true, - "license": "Python-2.0" - }, - "node_modules/eslint/node_modules/chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", - "dev": true, - "license": "MIT", - "dependencies": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/chalk?sponsor=1" - } - }, - "node_modules/eslint/node_modules/color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "color-name": "~1.1.4" - }, - "engines": { - "node": ">=7.0.0" - } - }, - "node_modules/eslint/node_modules/color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "dev": true, - "license": "MIT" - }, - "node_modules/eslint/node_modules/escape-string-regexp": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz", - "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/eslint/node_modules/globals": { - "version": "13.24.0", - "resolved": "https://registry.npmjs.org/globals/-/globals-13.24.0.tgz", - "integrity": "sha512-AhO5QUcj8llrbG09iWhPU2B204J1xnPeL8kQmVorSsy+Sjj1sk8gIyh6cUocGmH4L0UuhAJy+hJMRA4mgA4mFQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "type-fest": "^0.20.2" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/eslint/node_modules/js-yaml": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz", - "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==", - "dev": true, - "license": "MIT", - "dependencies": { - "argparse": "^2.0.1" - }, - "bin": { - "js-yaml": "bin/js-yaml.js" - } - }, - "node_modules/eslint/node_modules/supports-color": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", - "dev": true, - "license": "MIT", - "dependencies": { - "has-flag": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/eslint/node_modules/type-fest": { - "version": "0.20.2", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.20.2.tgz", - "integrity": "sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==", - "dev": true, - "license": "(MIT OR CC0-1.0)", - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, "node_modules/esm": { "version": "3.2.25", "resolved": "https://registry.npmjs.org/esm/-/esm-3.2.25.tgz", @@ -10687,23 +7556,10 @@ "url": "https://opencollective.com/eslint" } }, - "node_modules/esprima": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz", - "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==", - "license": "BSD-2-Clause", - "bin": { - "esparse": "bin/esparse.js", - "esvalidate": "bin/esvalidate.js" - }, - "engines": { - "node": ">=4" - } - }, "node_modules/esquery": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.6.0.tgz", - "integrity": "sha512-ca9pw9fomFcKPvFLXhBKUK90ZvGibiGOvRJNbjljY7s7uq/5YO4BOzcYtJqExdx99rF6aAcnRxHmcUHcz6sQsg==", + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.7.0.tgz", + "integrity": "sha512-Ap6G0WQwcU/LHsvLwON1fAQX9Zp0A2Y6Y/cJBl9r/JbW90Zyg4/zbG6zzKa2OTALELarYHmKu0GhpM5EO+7T0g==", "dev": true, "license": "BSD-3-Clause", "dependencies": { @@ -10761,16 +7617,6 @@ "node": ">= 0.6" } }, - "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==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=6" - } - }, "node_modules/eventemitter3": { "version": "4.0.7", "resolved": "https://registry.npmjs.org/eventemitter3/-/eventemitter3-4.0.7.tgz", @@ -10784,29 +7630,30 @@ "integrity": "sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q==", "dev": true, "license": "MIT", + "peer": true, "engines": { "node": ">=0.8.x" } }, "node_modules/execa": { - "version": "9.5.2", - "resolved": "https://registry.npmjs.org/execa/-/execa-9.5.2.tgz", - "integrity": "sha512-EHlpxMCpHWSAh1dgS6bVeoLAXGnJNdR93aabr4QCGbzOM73o5XmRfM/e5FUqsw3aagP8S8XEWUWFAxnRBnAF0Q==", + "version": "9.6.1", + "resolved": "https://registry.npmjs.org/execa/-/execa-9.6.1.tgz", + "integrity": "sha512-9Be3ZoN4LmYR90tUoVu2te2BsbzHfhJyfEiAVfz7N5/zv+jduIfLrV2xdQXOHbaD6KgpGdO9PRPM1Y4Q9QkPkA==", "devOptional": true, "license": "MIT", "dependencies": { "@sindresorhus/merge-streams": "^4.0.0", - "cross-spawn": "^7.0.3", + "cross-spawn": "^7.0.6", "figures": "^6.1.0", "get-stream": "^9.0.0", - "human-signals": "^8.0.0", + "human-signals": "^8.0.1", "is-plain-obj": "^4.1.0", "is-stream": "^4.0.1", "npm-run-path": "^6.0.0", - "pretty-ms": "^9.0.0", + "pretty-ms": "^9.2.0", "signal-exit": "^4.1.0", "strip-final-newline": "^4.0.0", - "yoctocolors": "^2.0.0" + "yoctocolors": "^2.1.1" }, "engines": { "node": "^18.19.0 || >=20.5.0" @@ -10816,40 +7663,40 @@ } }, "node_modules/express": { - "version": "4.21.2", - "resolved": "https://registry.npmjs.org/express/-/express-4.21.2.tgz", - "integrity": "sha512-28HqgMZAmih1Czt9ny7qr6ek2qddF4FclbMzwhCREB6OFfH+rXAnuNCwo1/wFvrtbgsQDb4kSbX9de9lFbrXnA==", + "version": "4.22.2", + "resolved": "https://registry.npmjs.org/express/-/express-4.22.2.tgz", + "integrity": "sha512-IuL+Elrou2ZvCFHs18/CIzy2Nzvo25nZ1/D2eIZlz7c+QUayAcYoiM2BthCjs+EBHVpjYjcuLDAiCWgeIX3X1Q==", "dev": true, "license": "MIT", "dependencies": { "accepts": "~1.3.8", "array-flatten": "1.1.1", - "body-parser": "1.20.3", - "content-disposition": "0.5.4", + "body-parser": "~1.20.5", + "content-disposition": "~0.5.4", "content-type": "~1.0.4", - "cookie": "0.7.1", - "cookie-signature": "1.0.6", + "cookie": "~0.7.1", + "cookie-signature": "~1.0.6", "debug": "2.6.9", "depd": "2.0.0", "encodeurl": "~2.0.0", "escape-html": "~1.0.3", "etag": "~1.8.1", - "finalhandler": "1.3.1", - "fresh": "0.5.2", - "http-errors": "2.0.0", + "finalhandler": "~1.3.1", + "fresh": "~0.5.2", + "http-errors": "~2.0.0", "merge-descriptors": "1.0.3", "methods": "~1.1.2", - "on-finished": "2.4.1", + "on-finished": "~2.4.1", "parseurl": "~1.3.3", - "path-to-regexp": "0.1.12", + "path-to-regexp": "~0.1.12", "proxy-addr": "~2.0.7", - "qs": "6.13.0", + "qs": "~6.15.1", "range-parser": "~1.2.1", "safe-buffer": "5.2.1", - "send": "0.19.0", - "serve-static": "1.16.2", + "send": "~0.19.0", + "serve-static": "~1.16.2", "setprototypeof": "1.2.0", - "statuses": "2.0.1", + "statuses": "~2.0.1", "type-is": "~1.6.18", "utils-merge": "1.0.1", "vary": "~1.1.2" @@ -10862,10 +7709,20 @@ "url": "https://opencollective.com/express" } }, + "node_modules/express/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, + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, "node_modules/express/node_modules/cookie": { - "version": "0.7.1", - "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.7.1.tgz", - "integrity": "sha512-6DnInpx7SJ2AK3+CTUE/ZM0vWTUboZCegxhC2xiIydHR9jNuTAASBrfEpHhiGOZw/nX51bHt6YQl8jsGo4y/0w==", + "version": "0.7.2", + "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.7.2.tgz", + "integrity": "sha512-yki5XnKuf750l50uGTllt6kKILY4nQ1eNIQatoXEByZ5dWgnKqbnqmTrBE5B4N7lrMJKQ2ytWMiTO2o0v6Ew/w==", "dev": true, "license": "MIT", "engines": { @@ -10882,14 +7739,37 @@ "ms": "2.0.0" } }, - "node_modules/express/node_modules/encodeurl": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-2.0.0.tgz", - "integrity": "sha512-Q0n9HRi4m6JuGIV1eFlmvJB7ZEVxu93IrMyiMsGC0lrMJMWzRgx6WGquyfQgZVb31vhGgXnfmPNNXmxnOkRBrg==", + "node_modules/express/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, "license": "MIT", "engines": { - "node": ">= 0.8" + "node": ">= 0.6" + } + }, + "node_modules/express/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==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/express/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==", + "dev": true, + "license": "MIT", + "dependencies": { + "mime-db": "1.52.0" + }, + "engines": { + "node": ">= 0.6" } }, "node_modules/express/node_modules/ms": { @@ -10899,47 +7779,31 @@ "dev": true, "license": "MIT" }, - "node_modules/express/node_modules/qs": { - "version": "6.13.0", - "resolved": "https://registry.npmjs.org/qs/-/qs-6.13.0.tgz", - "integrity": "sha512-+38qI9SOr8tfZ4QmJNplMUxqjbe7LKvvZgWdExBOmd+egZTtjLB67Gu0HRX3u/XOq7UU2Nx6nsjvS16Z9uwfpg==", + "node_modules/express/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, - "license": "BSD-3-Clause", + "license": "MIT", "dependencies": { - "side-channel": "^1.0.6" + "media-typer": "0.3.0", + "mime-types": "~2.1.24" }, "engines": { - "node": ">=0.6" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" + "node": ">= 0.6" } }, - "node_modules/express/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==", + "node_modules/facing-metadata": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/facing-metadata/-/facing-metadata-2.0.3.tgz", + "integrity": "sha512-cznIFYEbjy5LCph7aolYr6+5B1PzJAPsW4q3xdsmJDdZgsepFCBq4vZkBgCGt2LZZKNwji0Qt1xU24JOqg/6xQ==", "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" - } - ], "license": "MIT" }, "node_modules/fast-copy": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/fast-copy/-/fast-copy-3.0.2.tgz", - "integrity": "sha512-dl0O9Vhju8IrcLndv2eU4ldt1ftXMqqfgN4H1cpmGV7P6jeB9FwpN9a2c8DPGE1Ys88rNUJVYDHq73CGAGOPfQ==", + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/fast-copy/-/fast-copy-4.0.3.tgz", + "integrity": "sha512-58apWr0GUiDFM8+3afrO6eYwJBn9ZAhDOzG3L+/9llab/haCARS2UIfffmOurYLwbgDRs8n0rfr6qAAPEAuAQw==", "dev": true, "license": "MIT" }, @@ -11000,25 +7864,17 @@ "dev": true, "license": "MIT" }, - "node_modules/fast-redact": { - "version": "3.5.0", - "resolved": "https://registry.npmjs.org/fast-redact/-/fast-redact-3.5.0.tgz", - "integrity": "sha512-dwsoQlS7h9hMeYUq1W++23NDcBLV4KqONnITDV9DjfS3q1SgDGVrBdvvTLUotWtPSD7asWDV9/CmsZPy8Hf70A==", - "license": "MIT", - "engines": { - "node": ">=6" - } - }, "node_modules/fast-safe-stringify": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/fast-safe-stringify/-/fast-safe-stringify-2.1.1.tgz", "integrity": "sha512-W+KJc2dmILlPplD/H4K9l9LcAHAfPtP6BY84uVLXQ6Evcz9Lcg33Y2z1IVblT6xdY54PXYVHEv+0Wpq8Io6zkA==", + "dev": true, "license": "MIT" }, "node_modules/fast-uri": { - "version": "3.0.5", - "resolved": "https://registry.npmjs.org/fast-uri/-/fast-uri-3.0.5.tgz", - "integrity": "sha512-5JnBCWpFlMo0a3ciDy/JckMzzv1U9coZrIhedq+HXxxUfDTAiS0LA8OKVao4G9BxmCVck/jtA5r3KAtRWEyD8Q==", + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/fast-uri/-/fast-uri-3.1.2.tgz", + "integrity": "sha512-rVjf7ArG3LTk+FS6Yw81V1DLuZl1bRbNrev6Tmd/9RaroeeRRJhAt7jg/6YFxbvAQXUCavSoZhPPj6oOx+5KjQ==", "dev": true, "funding": [ { @@ -11042,9 +7898,9 @@ } }, "node_modules/fastq": { - "version": "1.18.0", - "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.18.0.tgz", - "integrity": "sha512-QKHXPW0hD8g4UET03SdOdunzSouc9N4AuHdsX8XNcTsuz+yYFILVNIX4l9yHABMhiEI9Db0JTTIpu0wB+Y1QQw==", + "version": "1.20.1", + "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.20.1.tgz", + "integrity": "sha512-GGToxJ/w1x32s/D2EKND7kTil4n8OVk/9mycTc4VDza13lOvpUZTGX3mFSCtV9ksdGBVzvsyAVLM6mHFThxXxw==", "license": "ISC", "dependencies": { "reusify": "^1.0.4" @@ -11063,6 +7919,23 @@ "node": ">=0.8.0" } }, + "node_modules/fdir": { + "version": "6.5.0", + "resolved": "https://registry.npmjs.org/fdir/-/fdir-6.5.0.tgz", + "integrity": "sha512-tIbYtZbucOs0BRGqPJkshJUYdL+SDH7dVM8gjy+ERp3WAUjLEFJE+02kanyHtwjWOnwrKYBiwAmM0p4kLJAnXg==", + "license": "MIT", + "engines": { + "node": ">=12.0.0" + }, + "peerDependencies": { + "picomatch": "^3 || ^4" + }, + "peerDependenciesMeta": { + "picomatch": { + "optional": true + } + } + }, "node_modules/figures": { "version": "6.1.0", "resolved": "https://registry.npmjs.org/figures/-/figures-6.1.0.tgz", @@ -11093,18 +7966,18 @@ } }, "node_modules/file-type": { - "version": "19.6.0", - "resolved": "https://registry.npmjs.org/file-type/-/file-type-19.6.0.tgz", - "integrity": "sha512-VZR5I7k5wkD0HgFnMsq5hOsSc710MJMu5Nc5QYsbe38NN5iPV/XTObYLc/cpttRTf6lX538+5uO1ZQRhYibiZQ==", + "version": "21.3.4", + "resolved": "https://registry.npmjs.org/file-type/-/file-type-21.3.4.tgz", + "integrity": "sha512-Ievi/yy8DS3ygGvT47PjSfdFoX+2isQueoYP1cntFW1JLYAuS4GD7NUPGg4zv2iZfV52uDyk5w5Z0TdpRS6Q1g==", "license": "MIT", "dependencies": { - "get-stream": "^9.0.1", - "strtok3": "^9.0.1", - "token-types": "^6.0.0", - "uint8array-extras": "^1.3.0" + "@tokenizer/inflate": "^0.4.1", + "strtok3": "^10.3.4", + "token-types": "^6.1.1", + "uint8array-extras": "^1.4.0" }, "engines": { - "node": ">=18" + "node": ">=20" }, "funding": { "url": "https://github.com/sindresorhus/file-type?sponsor=1" @@ -11123,18 +7996,18 @@ } }, "node_modules/finalhandler": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.3.1.tgz", - "integrity": "sha512-6BN9trH7bp3qvnrRyzsBz+g3lZxTNZTbVO2EV1CS0WIcDbawYVdYvGflME/9QP0h0pYlCDBCTjYa9nZzMDpyxQ==", + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.3.2.tgz", + "integrity": "sha512-aA4RyPcd3badbdABGDuTXCMTtOneUCAYH/gxoYRTZlIJdF0YPWuGqiAsIrhNnnqdXGswYk6dGujem4w80UJFhg==", "dev": true, "license": "MIT", "dependencies": { "debug": "2.6.9", "encodeurl": "~2.0.0", "escape-html": "~1.0.3", - "on-finished": "2.4.1", + "on-finished": "~2.4.1", "parseurl": "~1.3.3", - "statuses": "2.0.1", + "statuses": "~2.0.2", "unpipe": "~1.0.0" }, "engines": { @@ -11151,16 +8024,6 @@ "ms": "2.0.0" } }, - "node_modules/finalhandler/node_modules/encodeurl": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-2.0.0.tgz", - "integrity": "sha512-Q0n9HRi4m6JuGIV1eFlmvJB7ZEVxu93IrMyiMsGC0lrMJMWzRgx6WGquyfQgZVb31vhGgXnfmPNNXmxnOkRBrg==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 0.8" - } - }, "node_modules/finalhandler/node_modules/ms": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", @@ -11168,18 +8031,18 @@ "dev": true, "license": "MIT" }, - "node_modules/find-cache-dir": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/find-cache-dir/-/find-cache-dir-5.0.0.tgz", - "integrity": "sha512-OuWNfjfP05JcpAP3JPgAKUhWefjMRfI5iAoSsvE24ANYWJaepAtlSgWECSVEuRgSXpyNEc9DJwG/TZpgcOqyig==", + "node_modules/find-cache-directory": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/find-cache-directory/-/find-cache-directory-6.0.0.tgz", + "integrity": "sha512-CvFd5ivA6HcSHbD+59P7CyzINHXzwhuQK8RY7CxJZtgDSAtRlHiCaQpZQ2lMR/WRyUIEmzUvL6G2AGurMfegZA==", "devOptional": true, "license": "MIT", "dependencies": { "common-path-prefix": "^3.0.0", - "pkg-dir": "^7.0.0" + "pkg-dir": "^8.0.0" }, "engines": { - "node": ">=16" + "node": ">=20" }, "funding": { "url": "https://github.com/sponsors/sindresorhus" @@ -11202,6 +8065,19 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/find-up-simple": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/find-up-simple/-/find-up-simple-1.0.1.tgz", + "integrity": "sha512-afd4O7zpqHeRyg4PfDQsXmlDe2PfdHtJt6Akt8jOWaApLOZk5JXs6VMR29lz03pRe9mpykrRCYIYxaJYcfpncQ==", + "devOptional": true, + "license": "MIT", + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/find-up/node_modules/locate-path": { "version": "6.0.0", "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz", @@ -11263,17 +8139,6 @@ "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, - "license": "BSD-3-Clause", - "peer": true, - "bin": { - "flat": "cli.js" - } - }, "node_modules/flat-cache": { "version": "3.2.0", "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-3.2.0.tgz", @@ -11289,17 +8154,10 @@ "node": "^10.12.0 || >=12.0.0" } }, - "node_modules/flatstr": { - "version": "1.0.12", - "resolved": "https://registry.npmjs.org/flatstr/-/flatstr-1.0.12.tgz", - "integrity": "sha512-4zPxDyhCyiN2wIAtSLI6gc82/EjqZc1onI4Mz/l0pWrAlsSfYH/2ZIcU+e3oA2wDwbzIWNKwa23F8rh6+DRWkw==", - "license": "MIT", - "peer": true - }, "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==", + "version": "3.4.2", + "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.4.2.tgz", + "integrity": "sha512-PjDse7RzhcPkIJwy5t7KPWQSZ9cAbzQXcafsetQoD7sOJRQlGikNbx7yZp2OotDnJyrDcbyRq3Ttb18iYOqkxA==", "dev": true, "license": "ISC" }, @@ -11312,19 +8170,50 @@ "node": ">=8" } }, - "node_modules/focus-trap": { - "version": "7.6.2", - "resolved": "https://registry.npmjs.org/focus-trap/-/focus-trap-7.6.2.tgz", - "integrity": "sha512-9FhUxK1hVju2+AiQIDJ5Dd//9R2n2RAfJ0qfhF4IHGHgcoEUTMpbTeG/zbEuwaiYXfuAH6XE0/aCyxDdRM+W5w==", + "node_modules/flydrive": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/flydrive/-/flydrive-1.3.0.tgz", + "integrity": "sha512-B0wsqrZR76d+J2ce6AxNcA1JDo4pViluaaFp5Fjso52zGY+s19uF8rKsQS8TJJsiyySKPI1b8K1w2j3RAUxd1Q==", "license": "MIT", "dependencies": { - "tabbable": "^6.2.0" + "@humanwhocodes/retry": "^0.4.3", + "@poppinss/utils": "^6.10.0", + "etag": "^1.8.1", + "mime-types": "^3.0.1" + }, + "engines": { + "node": ">=20.6.0" + }, + "peerDependencies": { + "@aws-sdk/client-s3": "^3.577.0", + "@aws-sdk/s3-request-presigner": "^3.577.0", + "@google-cloud/storage": "^7.10.2" + }, + "peerDependenciesMeta": { + "@aws-sdk/client-s3": { + "optional": true + }, + "@aws-sdk/s3-request-presigner": { + "optional": true + }, + "@google-cloud/storage": { + "optional": true + } + } + }, + "node_modules/focus-trap": { + "version": "7.8.0", + "resolved": "https://registry.npmjs.org/focus-trap/-/focus-trap-7.8.0.tgz", + "integrity": "sha512-/yNdlIkpWbM0ptxno3ONTuf+2g318kh2ez3KSeZN5dZ8YC6AAmgeWz+GasYYiBJPFaYcSAPeu4GfhUaChzIJXA==", + "license": "MIT", + "dependencies": { + "tabbable": "^6.4.0" } }, "node_modules/follow-redirects": { - "version": "1.15.9", - "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.9.tgz", - "integrity": "sha512-gew4GsXizNgdoRyqmyfMHyAmXsZDk6mHkSxZFCzW9gwlbtOW44CDtYavM+y+72qD/Vq2l550kMF52DT8fOLJqQ==", + "version": "1.16.0", + "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.16.0.tgz", + "integrity": "sha512-y5rN/uOsadFT/JfYwhxRS5R7Qce+g3zG97+JrtFZlC9klX/W5hD7iiLzScI4nZqUS7DNUdhPgw4xI8W2LuXlUw==", "funding": [ { "type": "individual", @@ -11341,41 +8230,16 @@ } } }, - "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, - "license": "MIT", - "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, - "license": "ISC", - "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==", + "version": "4.0.5", + "resolved": "https://registry.npmjs.org/form-data/-/form-data-4.0.5.tgz", + "integrity": "sha512-8RipRLol37bNs2bhoV67fiTEvdTrbMUYcFTiy3+wuuOnUog2QBHCZWXDRijWQfAkhBj2Uf5UnVaiWwA5vdd82w==", "license": "MIT", "dependencies": { "asynckit": "^0.4.0", "combined-stream": "^1.0.8", + "es-set-tostringtag": "^2.1.0", + "hasown": "^2.0.2", "mime-types": "^2.1.12" }, "engines": { @@ -11383,14 +8247,35 @@ } }, "node_modules/form-data-encoder": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/form-data-encoder/-/form-data-encoder-4.0.2.tgz", - "integrity": "sha512-KQVhvhK8ZkWzxKxOr56CPulAhH3dobtuQ4+hNQ+HekH/Wp5gSOafqRAeTphQUJAIk0GBvHZgJ2ZGRWd5kphMuw==", + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/form-data-encoder/-/form-data-encoder-4.1.0.tgz", + "integrity": "sha512-G6NsmEW15s0Uw9XnCg+33H3ViYRyiM0hMrMhhqQOR8NFc5GhYrI+6I3u7OTw7b91J2g8rtvMBZJDbcGb2YUniw==", "license": "MIT", "engines": { "node": ">= 18" } }, + "node_modules/form-data/node_modules/mime-db": { + "version": "1.52.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", + "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==", + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/form-data/node_modules/mime-types": { + "version": "2.1.35", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz", + "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", + "license": "MIT", + "dependencies": { + "mime-db": "1.52.0" + }, + "engines": { + "node": ">= 0.6" + } + }, "node_modules/formdata-node": { "version": "6.0.3", "resolved": "https://registry.npmjs.org/formdata-node/-/formdata-node-6.0.3.tgz", @@ -11401,14 +8286,14 @@ } }, "node_modules/formidable": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/formidable/-/formidable-2.1.2.tgz", - "integrity": "sha512-CM3GuJ57US06mlpQ47YcunuUZ9jpm8Vx+P2CGt2j7HpgkKZO/DJYQ0Bobim8G6PFQmK5lOqOOdUXboU+h73A4g==", - "devOptional": true, + "version": "2.1.5", + "resolved": "https://registry.npmjs.org/formidable/-/formidable-2.1.5.tgz", + "integrity": "sha512-Oz5Hwvwak/DCaXVVUtPn4oLMLLy1CdclLKO1LFgU7XzDpVMUU5UjlSLpGMocyQNNk8F6IJW9M/YdooSn2MRI+Q==", + "dev": true, "license": "MIT", "dependencies": { + "@paralleldrive/cuid2": "^2.2.2", "dezalgo": "^1.0.4", - "hexoid": "^1.0.0", "once": "^1.4.0", "qs": "^6.11.0" }, @@ -11426,16 +8311,16 @@ } }, "node_modules/fraction.js": { - "version": "4.3.7", - "resolved": "https://registry.npmjs.org/fraction.js/-/fraction.js-4.3.7.tgz", - "integrity": "sha512-ZsDfxO51wGAXREY55a7la9LScWpwv9RxIrYABrlvOFBlH/ShPnrtsXeuUIfXKKOVicNxQ+o8JTbJvjS4M89yew==", + "version": "5.3.4", + "resolved": "https://registry.npmjs.org/fraction.js/-/fraction.js-5.3.4.tgz", + "integrity": "sha512-1X1NTtiJphryn/uLQz3whtY6jK3fTqoE3ohKs0tT+Ujr1W59oopxmoEh7Lu5p6vBaPbgoM0bzveAW4Qi5RyWDQ==", "dev": true, "license": "MIT", "engines": { "node": "*" }, "funding": { - "type": "patreon", + "type": "github", "url": "https://github.com/sponsors/rawify" } }, @@ -11449,9 +8334,9 @@ } }, "node_modules/fs-extra": { - "version": "11.2.0", - "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-11.2.0.tgz", - "integrity": "sha512-PmDi3uwK5nFuXh7XDTlVnS17xJS7vW36is2+w3xcv8SVxiB4NyATf4ctkVY5bkSjX0Y4nbvZCq1/EjtEyr9ktw==", + "version": "11.3.5", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-11.3.5.tgz", + "integrity": "sha512-eKpRKAovdpZtR1WopLHxlBWvAgPny3c4gX1G5Jhwmmw4XJj0ifSD5qB5TOo8hmA0wlRKDAOAhEE1yVPgs6Fgcg==", "license": "MIT", "dependencies": { "graceful-fs": "^4.2.0", @@ -11492,18 +8377,6 @@ "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", "license": "ISC" }, - "node_modules/fs-monkey": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/fs-monkey/-/fs-monkey-1.0.6.tgz", - "integrity": "sha512-b1FMfwetIKymC0eioW7mTywihSQE4oLzQn1dB6rZB5fx/3NpNEdAWeCSMB+60/AeT0TCXsxzAlcYVEFCTAksWg==", - "license": "Unlicense" - }, - "node_modules/fs-readdir-recursive": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/fs-readdir-recursive/-/fs-readdir-recursive-1.1.0.tgz", - "integrity": "sha512-GNanXlVr2pf02+sPN40XN8HG+ePaNcvM0q5mZBd668Obwb0yD5GiUbZOFgwn8kGMY6I3mdyDJzieUy3PTYyTRA==", - "license": "MIT" - }, "node_modules/fs.realpath": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", @@ -11533,37 +8406,6 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/function.prototype.name": { - "version": "1.1.8", - "resolved": "https://registry.npmjs.org/function.prototype.name/-/function.prototype.name-1.1.8.tgz", - "integrity": "sha512-e5iwyodOHhbMr/yNrc7fDYG4qlbIvI5gajyzPnb5TCwyhjApznQh1BMFou9b30SevY43gCJKXycoCBjMbsuW0Q==", - "dev": true, - "license": "MIT", - "dependencies": { - "call-bind": "^1.0.8", - "call-bound": "^1.0.3", - "define-properties": "^1.2.1", - "functions-have-names": "^1.2.3", - "hasown": "^2.0.2", - "is-callable": "^1.2.7" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/functions-have-names": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/functions-have-names/-/functions-have-names-1.2.3.tgz", - "integrity": "sha512-xckBUXyTIqT97tq2x2AMb+g163b5JFysYk0x4qxNFwbfQkmNZoiRHb6sPzI9/QV33WeuvVYBUIiD4NzNIyqaRQ==", - "dev": true, - "license": "MIT", - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, "node_modules/gauge": { "version": "3.0.2", "resolved": "https://registry.npmjs.org/gauge/-/gauge-3.0.2.tgz", @@ -11620,21 +8462,13 @@ "node": ">=8" } }, - "node_modules/generic-pool": { - "version": "3.9.0", - "resolved": "https://registry.npmjs.org/generic-pool/-/generic-pool-3.9.0.tgz", - "integrity": "sha512-hymDOu5B53XvN4QT9dBmZxPX4CWhBPPLguTZ9MMFeFa/Kg0xWVfylOVNlJji/E7yTZWFd/q9GO5TxDLq156D7g==", - "license": "MIT", - "engines": { - "node": ">= 4" - } - }, "node_modules/gensync": { "version": "1.0.0-beta.2", "resolved": "https://registry.npmjs.org/gensync/-/gensync-1.0.0-beta.2.tgz", "integrity": "sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==", "dev": true, "license": "MIT", + "peer": true, "engines": { "node": ">=6.9.0" } @@ -11649,9 +8483,9 @@ } }, "node_modules/get-east-asian-width": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/get-east-asian-width/-/get-east-asian-width-1.3.0.tgz", - "integrity": "sha512-vpeMIQKxczTD/0s2CdEWHcb0eeJe6TFjxb+J5xgX7hScxqrGuyjmv4c1D4A/gelKfyox0gJJwIHF+fLjeaM8kQ==", + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/get-east-asian-width/-/get-east-asian-width-1.6.0.tgz", + "integrity": "sha512-QRbvDIbx6YklUe6RxeTeleMR0yv3cYH6PsPZHcnVn7xv7zO1BHN8r0XETu8n6Ye3Q+ahtSarc3WgtNWmehIBfA==", "license": "MIT", "engines": { "node": ">=18" @@ -11661,17 +8495,17 @@ } }, "node_modules/get-intrinsic": { - "version": "1.2.7", - "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.2.7.tgz", - "integrity": "sha512-VW6Pxhsrk0KAOqs3WEd0klDiF/+V7gQOpAvY1jVU/LHmaD/kQO4523aiJuikX/QAKYiW6x8Jh+RJej1almdtCA==", + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.3.0.tgz", + "integrity": "sha512-9fSjSaos/fRIVIp+xSJlE6lfwhES7LNtKaCBIamHsjr2na1BiABJPo0mOjjz8GJDURarmCPGqaiVg5mfjb98CQ==", "license": "MIT", "dependencies": { - "call-bind-apply-helpers": "^1.0.1", + "call-bind-apply-helpers": "^1.0.2", "es-define-property": "^1.0.1", "es-errors": "^1.3.0", - "es-object-atoms": "^1.0.0", + "es-object-atoms": "^1.1.1", "function-bind": "^1.1.2", - "get-proto": "^1.0.0", + "get-proto": "^1.0.1", "gopd": "^1.2.0", "has-symbols": "^1.1.0", "hasown": "^2.0.2", @@ -11694,9 +8528,9 @@ } }, "node_modules/get-port": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/get-port/-/get-port-7.1.0.tgz", - "integrity": "sha512-QB9NKEeDg3xxVwCCwJQ9+xycaz6pBB6iQ76wiWMl1927n0Kir6alPiP+yuiICLLU4jpMe08dXfpebuQppFA2zw==", + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/get-port/-/get-port-7.2.0.tgz", + "integrity": "sha512-afP4W205ONCuMoPBqcR6PSXnzX35KTcJygfJfcp+QY+uwm3p20p1YczWXhlICIzGMCxYBQcySEcOgsJcrkyobg==", "devOptional": true, "license": "MIT", "engines": { @@ -11745,24 +8579,6 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/get-symbol-description": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/get-symbol-description/-/get-symbol-description-1.1.0.tgz", - "integrity": "sha512-w9UMqWwJxHNOvoNzSJ2oPF5wvYcvP7jUvYzhp67yEhTi17ZDBBC1z9pTdGuzjD+EFIqLSYRweZjqfiPzQ06Ebg==", - "dev": true, - "license": "MIT", - "dependencies": { - "call-bound": "^1.0.3", - "es-errors": "^1.3.0", - "get-intrinsic": "^1.2.6" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, "node_modules/getopts": { "version": "2.3.0", "resolved": "https://registry.npmjs.org/getopts/-/getopts-2.3.0.tgz", @@ -11773,7 +8589,7 @@ "version": "7.2.3", "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", - "deprecated": "Glob versions prior to v9 are no longer supported", + "deprecated": "Old versions of glob are not supported, and contain widely publicized security vulnerabilities, which have been fixed in the current version. Please update. Support for old versions may be purchased (at exorbitant rates) by contacting i@izs.me", "license": "ISC", "dependencies": { "fs.realpath": "^1.0.0", @@ -11802,6 +8618,23 @@ "node": ">=10.13.0" } }, + "node_modules/glob-to-regex.js": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/glob-to-regex.js/-/glob-to-regex.js-1.2.0.tgz", + "integrity": "sha512-QMwlOQKU/IzqMUOAZWubUOT8Qft+Y0KQWnX9nK3ch0CJg0tTp4TvGZsTfudYKv2NzoQSyPcnA6TYeIQ3jGichQ==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": ">=10.0" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/streamich" + }, + "peerDependencies": { + "tslib": "2" + } + }, "node_modules/glob-to-regexp": { "version": "0.4.1", "resolved": "https://registry.npmjs.org/glob-to-regexp/-/glob-to-regexp-0.4.1.tgz", @@ -11810,45 +8643,34 @@ "license": "BSD-2-Clause" }, "node_modules/globals": { - "version": "11.12.0", - "resolved": "https://registry.npmjs.org/globals/-/globals-11.12.0.tgz", - "integrity": "sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=4" - } - }, - "node_modules/globalthis": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/globalthis/-/globalthis-1.0.4.tgz", - "integrity": "sha512-DpLKbNU4WylpxJykQujfCcwYWiV/Jhm50Goo0wrVILAv5jOr9d+H+UR3PhSCD2rCCEIg0uc+G+muBTwD54JhDQ==", + "version": "13.24.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-13.24.0.tgz", + "integrity": "sha512-AhO5QUcj8llrbG09iWhPU2B204J1xnPeL8kQmVorSsy+Sjj1sk8gIyh6cUocGmH4L0UuhAJy+hJMRA4mgA4mFQ==", "dev": true, "license": "MIT", "dependencies": { - "define-properties": "^1.2.1", - "gopd": "^1.0.1" + "type-fest": "^0.20.2" }, "engines": { - "node": ">= 0.4" + "node": ">=8" }, "funding": { - "url": "https://github.com/sponsors/ljharb" + "url": "https://github.com/sponsors/sindresorhus" } }, "node_modules/globby": { - "version": "14.0.2", - "resolved": "https://registry.npmjs.org/globby/-/globby-14.0.2.tgz", - "integrity": "sha512-s3Fq41ZVh7vbbe2PN3nrW7yC7U7MFVc5c98/iTl9c2GawNMKx/J648KQRW6WKkuU8GIbbh2IXfIRQjOZnXcTnw==", + "version": "14.1.0", + "resolved": "https://registry.npmjs.org/globby/-/globby-14.1.0.tgz", + "integrity": "sha512-0Ia46fDOaT7k4og1PDW4YbodWWr3scS2vAr2lTbsplOt2WkKp0vQbkI9wKis/T5LV/dqPjO3bpS/z6GTJB82LA==", "devOptional": true, "license": "MIT", "dependencies": { "@sindresorhus/merge-streams": "^2.1.0", - "fast-glob": "^3.3.2", - "ignore": "^5.2.4", - "path-type": "^5.0.0", + "fast-glob": "^3.3.3", + "ignore": "^7.0.3", + "path-type": "^6.0.0", "slash": "^5.1.0", - "unicorn-magic": "^0.1.0" + "unicorn-magic": "^0.3.0" }, "engines": { "node": ">=18" @@ -11870,6 +8692,16 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/globby/node_modules/ignore": { + "version": "7.0.5", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-7.0.5.tgz", + "integrity": "sha512-Hs59xBNfUIunMFgWAbGX5cq6893IbWg4KnrjbYwX3tx0ztorVgTDA6B2sxf8ejHJ4wz8BqGUMYlnzNBer5NvGg==", + "devOptional": true, + "license": "MIT", + "engines": { + "node": ">= 4" + } + }, "node_modules/gopd": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.2.0.tgz", @@ -11883,21 +8715,22 @@ } }, "node_modules/got": { - "version": "14.4.5", - "resolved": "https://registry.npmjs.org/got/-/got-14.4.5.tgz", - "integrity": "sha512-sq+uET8TnNKRNnjEOPJzMcxeI0irT8BBNmf+GtZcJpmhYsQM1DSKmCROUjPWKsXZ5HzwD5Cf5/RV+QD9BSTxJg==", + "version": "14.6.6", + "resolved": "https://registry.npmjs.org/got/-/got-14.6.6.tgz", + "integrity": "sha512-QLV1qeYSo5l13mQzWgP/y0LbMr5Plr5fJilgAIwgnwseproEbtNym8xpLsDzeZ6MWXgNE6kdWGBjdh3zT/Qerg==", "license": "MIT", "dependencies": { "@sindresorhus/is": "^7.0.1", - "@szmarczak/http-timer": "^5.0.1", + "byte-counter": "^0.1.0", "cacheable-lookup": "^7.0.0", - "cacheable-request": "^12.0.1", - "decompress-response": "^6.0.0", + "cacheable-request": "^13.0.12", + "decompress-response": "^10.0.0", "form-data-encoder": "^4.0.2", "http2-wrapper": "^2.2.1", + "keyv": "^5.5.3", "lowercase-keys": "^3.0.0", "p-cancelable": "^4.0.1", - "responselike": "^3.0.0", + "responselike": "^4.0.2", "type-fest": "^4.26.1" }, "engines": { @@ -11907,6 +8740,27 @@ "url": "https://github.com/sindresorhus/got?sponsor=1" } }, + "node_modules/got/node_modules/keyv": { + "version": "5.6.0", + "resolved": "https://registry.npmjs.org/keyv/-/keyv-5.6.0.tgz", + "integrity": "sha512-CYDD3SOtsHtyXeEORYRx2qBtpDJFjRTGXUtmNEMGyzYOKj1TE3tycdlho7kA1Ufx9OYWZzg52QFBGALTirzDSw==", + "license": "MIT", + "dependencies": { + "@keyv/serialize": "^1.1.1" + } + }, + "node_modules/got/node_modules/type-fest": { + "version": "4.41.0", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-4.41.0.tgz", + "integrity": "sha512-TeTSQ6H5YHvpqVwBRcnLDCBnDOHWYu7IvGbHT6N8AOymcr9PJGjc1GTtiWZTYg0NCgYwvnYWEkVChQAr9bjfwA==", + "license": "(MIT OR CC0-1.0)", + "engines": { + "node": ">=16" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/graceful-fs": { "version": "4.2.11", "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.11.tgz", @@ -11927,57 +8781,16 @@ "dev": true, "license": "MIT" }, - "node_modules/has-bigints": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/has-bigints/-/has-bigints-1.1.0.tgz", - "integrity": "sha512-R3pbpkcIqv2Pm3dUwgjclDRVmWpTJW2DcMzcIhEXEx1oh/CEMObMm3KLmRJOdvhM7o4uQBnwr8pzRK2sJWIqfg==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, "node_modules/has-flag": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "devOptional": true, "license": "MIT", "engines": { "node": ">=8" } }, - "node_modules/has-property-descriptors": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/has-property-descriptors/-/has-property-descriptors-1.0.2.tgz", - "integrity": "sha512-55JNKuIW+vq4Ke1BjOTjM2YctQIvCT7GFzHwmfZPGo5wnrgkid0YQtnAleFSqumZm4az3n2BS+erby5ipJdgrg==", - "dev": true, - "license": "MIT", - "dependencies": { - "es-define-property": "^1.0.0" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/has-proto": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/has-proto/-/has-proto-1.2.0.tgz", - "integrity": "sha512-KIL7eQPfHQRC8+XluaIw7BHUwwqL19bQn4hzNgdr+1wXoU0KKj6rufu47lhY7KbJR2C6T6+PfyN0Ea7wkSS+qQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "dunder-proto": "^1.0.0" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, "node_modules/has-symbols": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.1.0.tgz", @@ -11994,7 +8807,6 @@ "version": "1.0.2", "resolved": "https://registry.npmjs.org/has-tostringtag/-/has-tostringtag-1.0.2.tgz", "integrity": "sha512-NqADB8VjPFLM2V0VvHUewwwsw0ZWBaIdgo+ieHtK3hasLz4qeCRjYcqfB6AQrBggRKppKF8L52/VqdVsO47Dlw==", - "dev": true, "license": "MIT", "dependencies": { "has-symbols": "^1.0.3" @@ -12020,9 +8832,9 @@ "license": "MIT" }, "node_modules/hasown": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.2.tgz", - "integrity": "sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==", + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.4.tgz", + "integrity": "sha512-T2UbfbBEF32wiepXIsMlTW9+dDYC6wMh/t/vYA4tuOMKqWz/n3vr1NFSxQiyP+zk2mXsoMA/i/7qV6LKut1t1A==", "license": "MIT", "dependencies": { "function-bind": "^1.1.2" @@ -12031,13 +8843,6 @@ "node": ">= 0.4" } }, - "node_modules/haye": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/haye/-/haye-3.0.0.tgz", - "integrity": "sha512-yWxbPdeex78IR3x3X/DdqkZbVG4rP4UaRdUGmpClfnUh1C61mASt7Iav8vk2tXcTMSygBHDDfgoVqk68NJqzhQ==", - "license": "MIT", - "peer": true - }, "node_modules/he": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/he/-/he-1.2.0.tgz", @@ -12047,16 +8852,6 @@ "he": "bin/he" } }, - "node_modules/header-case": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/header-case/-/header-case-2.0.4.tgz", - "integrity": "sha512-H/vuk5TEEVZwrR0lp2zed9OCo1uAILMlx0JEMgC26rzyJJ3N1v6XkwHHXJQdR2doSjcGPM6OKPYoJgf0plJ11Q==", - "license": "MIT", - "dependencies": { - "capital-case": "^1.0.4", - "tslib": "^2.0.3" - } - }, "node_modules/helmet-csp": { "version": "3.4.0", "resolved": "https://registry.npmjs.org/helmet-csp/-/helmet-csp-3.4.0.tgz", @@ -12073,15 +8868,12 @@ "dev": true, "license": "MIT" }, - "node_modules/hexoid": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/hexoid/-/hexoid-1.0.0.tgz", - "integrity": "sha512-QFLV0taWQOZtvIRIAdBChesmogZrtuXvVWsFHZTk2SU+anspqZ2vMnoLg7IE1+Uk16N19APic1BuF8bC8c2m5g==", - "devOptional": true, - "license": "MIT", - "engines": { - "node": ">=8" - } + "node_modules/hookable": { + "version": "5.5.3", + "resolved": "https://registry.npmjs.org/hookable/-/hookable-5.5.3.tgz", + "integrity": "sha512-Yc+BQe8SvoXH1643Qez1zqLRmbA5rCL+sSmk6TVos0LWVfNIB7PGncdlId77WzLGSIB5KaWgTaNTs2lNVEI6VQ==", + "dev": true, + "license": "MIT" }, "node_modules/hpack.js": { "version": "2.1.6", @@ -12096,13 +8888,6 @@ "wbuf": "^1.1.0" } }, - "node_modules/hpack.js/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, - "license": "MIT" - }, "node_modules/hpack.js/node_modules/readable-stream": { "version": "2.3.8", "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.8.tgz", @@ -12119,6 +8904,13 @@ "util-deprecate": "~1.0.1" } }, + "node_modules/hpack.js/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, + "license": "MIT" + }, "node_modules/hpack.js/node_modules/string_decoder": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", @@ -12139,9 +8931,9 @@ } }, "node_modules/html-entities": { - "version": "2.5.2", - "resolved": "https://registry.npmjs.org/html-entities/-/html-entities-2.5.2.tgz", - "integrity": "sha512-K//PSRMQk4FZ78Kyau+mZurHn3FH0Vwr+H36eE0rPbeYkRRi9YxceYPhuN60UwWorxyKHhqoAJl2OFKa4BVtaA==", + "version": "2.6.0", + "resolved": "https://registry.npmjs.org/html-entities/-/html-entities-2.6.0.tgz", + "integrity": "sha512-kig+rMn/QOVRvr7c86gQ8lWXq+Hkv6CbAH1hLu+RG338StTpE8Z0b44SDVaqVu7HGKf27frdmUYEs9hTUX/cLQ==", "funding": [ { "type": "github", @@ -12154,40 +8946,10 @@ ], "license": "MIT" }, - "node_modules/htmlparser2": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/htmlparser2/-/htmlparser2-6.1.0.tgz", - "integrity": "sha512-gyyPk6rgonLFEDGoeRgQNaEUvdJ4ktTmmUh/h2t7s+M8oPpIPxgNACWa+6ESR57kXstwqPiCut0V8NRpcwgU7A==", - "dev": true, - "funding": [ - "https://github.com/fb55/htmlparser2?sponsor=1", - { - "type": "github", - "url": "https://github.com/sponsors/fb55" - } - ], - "license": "MIT", - "dependencies": { - "domelementtype": "^2.0.1", - "domhandler": "^4.0.0", - "domutils": "^2.5.2", - "entities": "^2.0.0" - } - }, - "node_modules/htmlparser2/node_modules/entities": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/entities/-/entities-2.2.0.tgz", - "integrity": "sha512-p92if5Nz619I0w+akJrLZH0MX0Pb5DX39XOwQTtXSdQQOaYH03S1uIQp4mhOZtAXrxq4ViO67YTiLBo2638o9A==", - "dev": true, - "license": "BSD-2-Clause", - "funding": { - "url": "https://github.com/fb55/entities?sponsor=1" - } - }, "node_modules/http-cache-semantics": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/http-cache-semantics/-/http-cache-semantics-4.1.1.tgz", - "integrity": "sha512-er295DKPVsV82j5kw1Gjt+ADA/XYHsajl82cGNQG2eyoPkvgUhX+nDIyelzhIWbbsXP39EHcI6l5tYs2FYqYXQ==", + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/http-cache-semantics/-/http-cache-semantics-4.2.0.tgz", + "integrity": "sha512-dTxcvPXqPvXBQpq5dUr6mEMJX4oIEFv6bwom3FDwKRDsuIjjJGANqhBuoAn9c1RQJIdAKav33ED65E2ys+87QQ==", "license": "BSD-2-Clause" }, "node_modules/http-deceiver": { @@ -12198,25 +8960,29 @@ "license": "MIT" }, "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==", + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-2.0.1.tgz", + "integrity": "sha512-4FbRdAX+bSdmo4AUFuS0WNiPz8NgFt+r8ThgNWmlrjQjt1Q7ZR9+zTlce2859x4KSXrwIsaeTqDoKQmtP8pLmQ==", "license": "MIT", "dependencies": { - "depd": "2.0.0", - "inherits": "2.0.4", - "setprototypeof": "1.2.0", - "statuses": "2.0.1", - "toidentifier": "1.0.1" + "depd": "~2.0.0", + "inherits": "~2.0.4", + "setprototypeof": "~1.2.0", + "statuses": "~2.0.2", + "toidentifier": "~1.0.1" }, "engines": { "node": ">= 0.8" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/express" } }, "node_modules/http-parser-js": { - "version": "0.5.8", - "resolved": "https://registry.npmjs.org/http-parser-js/-/http-parser-js-0.5.8.tgz", - "integrity": "sha512-SGeBX54F94Wgu5RH3X5jsDtf4eHyRogWX1XGT3b4HuW3tQPM4AaBzoUji/4AAJNXCEOWZ5O0DgZmJw1947gD5Q==", + "version": "0.5.10", + "resolved": "https://registry.npmjs.org/http-parser-js/-/http-parser-js-0.5.10.tgz", + "integrity": "sha512-Pysuw9XpUq5dVc/2SMHpuTY01RFl8fttgcyunjL7eEMhGM3cI4eOmiCycJDVCo/7O7ClfQD3SaI6ftDzqOXYMA==", "dev": true, "license": "MIT" }, @@ -12236,9 +9002,9 @@ } }, "node_modules/http-proxy-middleware": { - "version": "2.0.7", - "resolved": "https://registry.npmjs.org/http-proxy-middleware/-/http-proxy-middleware-2.0.7.tgz", - "integrity": "sha512-fgVY8AV7qU7z/MmXJ/rxwbrtQH4jBQ9m7kp3llF0liB7glmFeVZFBepQb32T3y8n8k2+AEYuMPCpinYW+/CuRA==", + "version": "2.0.9", + "resolved": "https://registry.npmjs.org/http-proxy-middleware/-/http-proxy-middleware-2.0.9.tgz", + "integrity": "sha512-c1IyJYLYppU574+YI7R4QyX2ystMtVXZwIdzazUIPIJsHuWNd+mho2j+bKoHftndicGj9yh+xjd+l0yj7VeT1Q==", "dev": true, "license": "MIT", "dependencies": { @@ -12306,9 +9072,9 @@ } }, "node_modules/human-signals": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-8.0.0.tgz", - "integrity": "sha512-/1/GPCpDUCCYwlERiYjxoczfP0zfvZMU/OWgQPMya9AbAE24vseigFdhAMObpc8Q4lc/kjutPfUddDYyAmejnA==", + "version": "8.0.1", + "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-8.0.1.tgz", + "integrity": "sha512-eKCa6bwnJhvxj14kZk5NCPc6Hb6BdsU9DZcOnmQKSnO1VKrfV0zCvtttPZUsBvjmNDn8rpcJfpwSYnHBjc95MQ==", "devOptional": true, "license": "Apache-2.0", "engines": { @@ -12377,28 +9143,19 @@ } }, "node_modules/iconv-lite": { - "version": "0.4.24", - "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", - "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", + "version": "0.7.2", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.7.2.tgz", + "integrity": "sha512-im9DjEDQ55s9fL4EYzOAv0yMqmMBSZp6G0VvFyTMPKWxiSBHUj9NW/qqLmXUwXrrM7AvqSlTCfvqRb0cM8yYqw==", "license": "MIT", "dependencies": { - "safer-buffer": ">= 2.1.2 < 3" + "safer-buffer": ">= 2.1.2 < 3.0.0" }, "engines": { "node": ">=0.10.0" - } - }, - "node_modules/icss-utils": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/icss-utils/-/icss-utils-5.1.0.tgz", - "integrity": "sha512-soFhflCVWLfRNOPU3iv5Z9VUdT44xFRbzjLsEzSr5AQmgqPMTHdU3PMT1Cf1ssx8fLNJDA1juftYl+PUcv3MqA==", - "dev": true, - "license": "ISC", - "engines": { - "node": "^10 || ^12 || >= 14" }, - "peerDependencies": { - "postcss": "^8.1.0" + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/express" } }, "node_modules/ieee754": { @@ -12434,16 +9191,16 @@ "version": "5.3.2", "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.3.2.tgz", "integrity": "sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g==", - "devOptional": true, + "dev": true, "license": "MIT", "engines": { "node": ">= 4" } }, "node_modules/import-fresh": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.0.tgz", - "integrity": "sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==", + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.1.tgz", + "integrity": "sha512-TR3KfrTZTYLPB6jUjfx6MF9WcWrHL9su5TObK4ZkYgBdWKPOFoSoQIdEuTuR82pmtxH2spWG9h6etwfr1pLBqQ==", "dev": true, "license": "MIT", "dependencies": { @@ -12457,101 +9214,6 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/import-local": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/import-local/-/import-local-3.2.0.tgz", - "integrity": "sha512-2SPlun1JUPWoM6t3F0dw0FkCF/jWY8kttcY4f599GLTSjh2OCuuhdTkJQsEcZzBqbXZGKMK2OqW1oZsjtf/gQA==", - "dev": true, - "license": "MIT", - "peer": true, - "dependencies": { - "pkg-dir": "^4.2.0", - "resolve-cwd": "^3.0.0" - }, - "bin": { - "import-local-fixture": "fixtures/cli.js" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/import-local/node_modules/find-up": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", - "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", - "dev": true, - "license": "MIT", - "peer": true, - "dependencies": { - "locate-path": "^5.0.0", - "path-exists": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/import-local/node_modules/locate-path": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", - "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", - "dev": true, - "license": "MIT", - "peer": true, - "dependencies": { - "p-locate": "^4.1.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/import-local/node_modules/p-limit": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", - "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", - "dev": true, - "license": "MIT", - "peer": true, - "dependencies": { - "p-try": "^2.0.0" - }, - "engines": { - "node": ">=6" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/import-local/node_modules/p-locate": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", - "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", - "dev": true, - "license": "MIT", - "peer": true, - "dependencies": { - "p-limit": "^2.2.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/import-local/node_modules/pkg-dir": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-4.2.0.tgz", - "integrity": "sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ==", - "dev": true, - "license": "MIT", - "peer": true, - "dependencies": { - "find-up": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, "node_modules/imurmurhash": { "version": "0.1.4", "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", @@ -12588,21 +9250,6 @@ "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", "license": "ISC" }, - "node_modules/internal-slot": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/internal-slot/-/internal-slot-1.1.0.tgz", - "integrity": "sha512-4gd7VpWNQNB4UKKCFFVcp1AVv+FMOgs9NKzjHKusc8jTMhd5eL1NqQqOpE0KzMds804/yHlglp3uxgluOqAPLw==", - "dev": true, - "license": "MIT", - "dependencies": { - "es-errors": "^1.3.0", - "hasown": "^2.0.2", - "side-channel": "^1.1.0" - }, - "engines": { - "node": ">= 0.4" - } - }, "node_modules/interpret": { "version": "2.2.0", "resolved": "https://registry.npmjs.org/interpret/-/interpret-2.2.0.tgz", @@ -12613,20 +9260,18 @@ } }, "node_modules/ioredis": { - "version": "5.4.2", - "resolved": "https://registry.npmjs.org/ioredis/-/ioredis-5.4.2.tgz", - "integrity": "sha512-0SZXGNGZ+WzISQ67QDyZ2x0+wVxjjUndtD8oSeik/4ajifeiRufed8fCb8QW8VMyi4MXcS+UO1k/0NGhvq1PAg==", + "version": "5.11.1", + "resolved": "https://registry.npmjs.org/ioredis/-/ioredis-5.11.1.tgz", + "integrity": "sha512-ehuGcf94bQXhfagULNXrJdfnWO38v070jxSx/qE87Kjzmu2fU7ro5EFAb+OPituLqgfyuQaym5DlrNydW2sJ9A==", "license": "MIT", "dependencies": { - "@ioredis/commands": "^1.1.1", - "cluster-key-slot": "^1.1.0", - "debug": "^4.3.4", - "denque": "^2.1.0", - "lodash.defaults": "^4.2.0", - "lodash.isarguments": "^3.1.0", - "redis-errors": "^1.2.0", - "redis-parser": "^3.0.0", - "standard-as-callback": "^2.1.0" + "@ioredis/commands": "1.10.0", + "cluster-key-slot": "1.1.1", + "debug": "4.4.3", + "denque": "2.1.0", + "redis-errors": "1.2.0", + "redis-parser": "3.0.0", + "standard-as-callback": "2.1.0" }, "engines": { "node": ">=12.22.0" @@ -12645,24 +9290,6 @@ "node": ">= 0.10" } }, - "node_modules/is-array-buffer": { - "version": "3.0.5", - "resolved": "https://registry.npmjs.org/is-array-buffer/-/is-array-buffer-3.0.5.tgz", - "integrity": "sha512-DDfANUiiG2wC1qawP66qlTugJeL5HyzMpfr8lLK+jMQirGzNod0B12cFB/9q838Ru27sBwfw78/rdoU7RERz6A==", - "dev": true, - "license": "MIT", - "dependencies": { - "call-bind": "^1.0.8", - "call-bound": "^1.0.3", - "get-intrinsic": "^1.2.6" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, "node_modules/is-arrayish": { "version": "0.2.1", "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz", @@ -12670,41 +9297,6 @@ "dev": true, "license": "MIT" }, - "node_modules/is-async-function": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/is-async-function/-/is-async-function-2.1.0.tgz", - "integrity": "sha512-GExz9MtyhlZyXYLxzlJRj5WUCE661zhDa1Yna52CN57AJsymh+DvXXjyveSioqSRdxvUrdKdvqB1b5cVKsNpWQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "call-bound": "^1.0.3", - "get-proto": "^1.0.1", - "has-tostringtag": "^1.0.2", - "safe-regex-test": "^1.1.0" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-bigint": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/is-bigint/-/is-bigint-1.1.0.tgz", - "integrity": "sha512-n4ZT37wG78iz03xPRKJrHTdZbe3IicyucEtdRsV5yglwc3GyUfbAfpSeD0FJ41NbUNSt5wbhqfp1fS+BgnvDFQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "has-bigints": "^1.0.2" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, "node_modules/is-binary-path": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz", @@ -12718,85 +9310,13 @@ "node": ">=8" } }, - "node_modules/is-boolean-object": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/is-boolean-object/-/is-boolean-object-1.2.1.tgz", - "integrity": "sha512-l9qO6eFlUETHtuihLcYOaLKByJ1f+N4kthcU9YjHy3N+B3hWv0y/2Nd0mu/7lTFnRQHTrSdXF50HQ3bl5fEnng==", - "dev": true, - "license": "MIT", - "dependencies": { - "call-bound": "^1.0.2", - "has-tostringtag": "^1.0.2" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-buffer": { - "version": "1.1.6", - "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-1.1.6.tgz", - "integrity": "sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w==", - "dev": true, - "license": "MIT" - }, - "node_modules/is-callable": { - "version": "1.2.7", - "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.2.7.tgz", - "integrity": "sha512-1BC0BVFhS/p0qtw6enp8e+8OD0UrK0oFLztSjNzhcKA3WDuJxxAPXzPuPtKkjEY9UUoEWlX/8fgKeu2S8i9JTA==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, "node_modules/is-core-module": { - "version": "2.16.1", - "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.16.1.tgz", - "integrity": "sha512-UfoeMA6fIJ8wTYFEUjelnaGI67v6+N7qXJEvQuIGa99l4xsCruSYOVSQ0uPANn4dAzm8lkYPaKLrrijLq7x23w==", + "version": "2.16.2", + "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.16.2.tgz", + "integrity": "sha512-evOr8xfXKxE6qSR0hSXL2r3sd7ALj8+7jQEUvPYcm5sgZFdJ+AYzT6yNmJenvIYQBgIGwfwz08sL8zoL7yq2BA==", "license": "MIT", "dependencies": { - "hasown": "^2.0.2" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-data-view": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/is-data-view/-/is-data-view-1.0.2.tgz", - "integrity": "sha512-RKtWF8pGmS87i2D6gqQu/l7EYRlVdfzemCJN/P3UOs//x1QE7mfhvzHIApBTRf7axvT6DMGwSwBXYCT0nfB9xw==", - "dev": true, - "license": "MIT", - "dependencies": { - "call-bound": "^1.0.2", - "get-intrinsic": "^1.2.6", - "is-typed-array": "^1.1.13" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-date-object": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/is-date-object/-/is-date-object-1.1.0.tgz", - "integrity": "sha512-PwwhEakHVKTdRNVOw+/Gyh0+MzlCl4R6qKvkhuvLtPMggI1WAHt9sOwZxQLSGpUaDnrdyDsomoRgNnCfKNSXXg==", - "dev": true, - "license": "MIT", - "dependencies": { - "call-bound": "^1.0.2", - "has-tostringtag": "^1.0.2" + "hasown": "^2.0.3" }, "engines": { "node": ">= 0.4" @@ -12830,53 +9350,21 @@ "node": ">=0.10.0" } }, - "node_modules/is-finalizationregistry": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/is-finalizationregistry/-/is-finalizationregistry-1.1.1.tgz", - "integrity": "sha512-1pC6N8qWJbWoPtEjgcL2xyhQOP491EQjeUo3qTKcmV8YSDDJrOepfG8pcC7h/QgnQHYSv0mJ3Z/ZWxmatVrysg==", - "dev": true, + "node_modules/is-fullwidth-code-point": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-5.1.0.tgz", + "integrity": "sha512-5XHYaSyiqADb4RnZ1Bdad6cPp8Toise4TzEjcOYDHZkTCbKgiUl7WTUCpNWHuxmDt91wnsZBc9xinNzopv3JMQ==", "license": "MIT", "dependencies": { - "call-bound": "^1.0.3" + "get-east-asian-width": "^1.3.1" }, "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-fullwidth-code-point": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-4.0.0.tgz", - "integrity": "sha512-O4L094N2/dZ7xqVdrXhh9r1KODPJpFms8B5sGdJLPy664AgvXsreZUyCQQNItZRDlYug4xStLjNp/sz3HvBowQ==", - "license": "MIT", - "engines": { - "node": ">=12" + "node": ">=18" }, "funding": { "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/is-generator-function": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/is-generator-function/-/is-generator-function-1.1.0.tgz", - "integrity": "sha512-nPUB5km40q9e8UfN/Zc24eLlzdSf9OfKByBw9CIdw4H1giPMeA0OIJvbchsCu4npfI2QcMVBsGEBHKZ7wLTWmQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "call-bound": "^1.0.3", - "get-proto": "^1.0.0", - "has-tostringtag": "^1.0.2", - "safe-regex-test": "^1.1.0" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, "node_modules/is-glob": { "version": "4.0.3", "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", @@ -12908,59 +9396,10 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/is-invalid-path": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/is-invalid-path/-/is-invalid-path-0.1.0.tgz", - "integrity": "sha512-aZMG0T3F34mTg4eTdszcGXx54oiZ4NtHSft3hWNJMGJXUUqdIj3cOZuHcU0nCWWcY3jd7yRe/3AEm3vSNTpBGQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "is-glob": "^2.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/is-invalid-path/node_modules/is-extglob": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-1.0.0.tgz", - "integrity": "sha512-7Q+VbVafe6x2T+Tu6NcOf6sRklazEPmBoB3IWk3WdGZM2iGUwU/Oe3Wtq5lSEkDTTlpp8yx+5t4pzO/i9Ty1ww==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/is-invalid-path/node_modules/is-glob": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-2.0.1.tgz", - "integrity": "sha512-a1dBeB19NXsf/E0+FHqkagizel/LQw2DjSQpvQrj3zT+jYPpaUCryPnrQajXKFLCMuf4I6FhRpaGtw4lPrG6Eg==", - "dev": true, - "license": "MIT", - "dependencies": { - "is-extglob": "^1.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/is-map": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/is-map/-/is-map-2.0.3.tgz", - "integrity": "sha512-1Qed0/Hr2m+YqxnM09CjA2d/i6YZNfF6R2oRAOj36eUdS6qIV/huPJNSEpKbupewFs+ZsJlxsjjPbc0/afW6Lw==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, "node_modules/is-network-error": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/is-network-error/-/is-network-error-1.1.0.tgz", - "integrity": "sha512-tUdRRAnhT+OtCZR/LxZelH/C7QtjtFrTu5tXCA8pl55eTUElUHT+GPYV8MBMBvea/j+NxQqVt3LbWMRir7Gx9g==", + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/is-network-error/-/is-network-error-1.3.2.tgz", + "integrity": "sha512-PhBY86zaxNZUuWP6h13Vu5oFe0XY6/UlKzQnYFELzGVHygP3MxmvTfYSG7GN3aIab/iWudSMgjSnG9Dq+nHrgA==", "dev": true, "license": "MIT", "engines": { @@ -12979,23 +9418,6 @@ "node": ">=0.12.0" } }, - "node_modules/is-number-object": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/is-number-object/-/is-number-object-1.1.1.tgz", - "integrity": "sha512-lZhclumE1G6VYD8VHe35wFaIif+CTy5SJIi5+3y4psDgWu4wPDoBhF8NxUOinEc7pHgiTsT6MaBb92rKhhD+Xw==", - "dev": true, - "license": "MIT", - "dependencies": { - "call-bound": "^1.0.3", - "has-tostringtag": "^1.0.2" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, "node_modules/is-path-inside": { "version": "3.0.3", "resolved": "https://registry.npmjs.org/is-path-inside/-/is-path-inside-3.0.3.tgz", @@ -13019,67 +9441,6 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/is-plain-object": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-2.0.4.tgz", - "integrity": "sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og==", - "dev": true, - "license": "MIT", - "dependencies": { - "isobject": "^3.0.1" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/is-regex": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.2.1.tgz", - "integrity": "sha512-MjYsKHO5O7mCsmRGxWcLWheFqN9DJ/2TmngvjKXihe6efViPqc274+Fx/4fYj/r03+ESvBdTXK0V6tA3rgez1g==", - "dev": true, - "license": "MIT", - "dependencies": { - "call-bound": "^1.0.2", - "gopd": "^1.2.0", - "has-tostringtag": "^1.0.2", - "hasown": "^2.0.2" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-set": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/is-set/-/is-set-2.0.3.tgz", - "integrity": "sha512-iPAjerrse27/ygGLxw+EBR9agv9Y6uLeYVJMu+QNCoouJ1/1ri0mGrcWpfCqFZuzzx3WjtwxG098X+n4OuRkPg==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-shared-array-buffer": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/is-shared-array-buffer/-/is-shared-array-buffer-1.0.4.tgz", - "integrity": "sha512-ISWac8drv4ZGfwKl5slpHG9OwPNty4jOWPRIhBpxOoD+hqITiwuipOQ2bNthAzwA3B4fIjO4Nln74N0S9byq8A==", - "dev": true, - "license": "MIT", - "dependencies": { - "call-bound": "^1.0.3" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, "node_modules/is-stream": { "version": "4.0.1", "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-4.0.1.tgz", @@ -13092,57 +9453,6 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/is-string": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/is-string/-/is-string-1.1.1.tgz", - "integrity": "sha512-BtEeSsoaQjlSPBemMQIrY1MY0uM6vnS1g5fmufYOtnxLGUZM2178PKbhsk7Ffv58IX+ZtcvoGwccYsh0PglkAA==", - "dev": true, - "license": "MIT", - "dependencies": { - "call-bound": "^1.0.3", - "has-tostringtag": "^1.0.2" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-symbol": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/is-symbol/-/is-symbol-1.1.1.tgz", - "integrity": "sha512-9gGx6GTtCQM73BgmHQXfDmLtfjjTUDSyoxTCbp5WtoixAhfgsDirWIcVQ/IHpvI5Vgd5i/J5F7B9cN/WlVbC/w==", - "dev": true, - "license": "MIT", - "dependencies": { - "call-bound": "^1.0.2", - "has-symbols": "^1.1.0", - "safe-regex-test": "^1.1.0" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-typed-array": { - "version": "1.1.15", - "resolved": "https://registry.npmjs.org/is-typed-array/-/is-typed-array-1.1.15.tgz", - "integrity": "sha512-p3EcsicXjit7SaskXHs1hA91QxgTw46Fv6EFKKGS5DRFLD8yKnohjF3hxoju94b/OcMZoQukzpPpBE9uLVKzgQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "which-typed-array": "^1.1.16" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, "node_modules/is-unicode-supported": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/is-unicode-supported/-/is-unicode-supported-2.1.0.tgz", @@ -13156,69 +9466,23 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/is-valid-path": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/is-valid-path/-/is-valid-path-0.1.1.tgz", - "integrity": "sha512-+kwPrVDu9Ms03L90Qaml+79+6DZHqHyRoANI6IsZJ/g8frhnfchDOBCa0RbQ6/kdHt5CS5OeIEyrYznNuVN+8A==", - "dev": true, - "license": "MIT", - "dependencies": { - "is-invalid-path": "^0.1.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "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==", + "node_modules/is-what": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/is-what/-/is-what-5.5.0.tgz", + "integrity": "sha512-oG7cgbmg5kLYae2N5IVd3jm2s+vldjxJzK1pcu9LfpGuQ93MQSzo0okvRna+7y5ifrD+20FE8FvjusyGaz14fw==", "dev": true, "license": "MIT", "engines": { - "node": ">= 0.4" + "node": ">=18" }, "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-weakref": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/is-weakref/-/is-weakref-1.1.0.tgz", - "integrity": "sha512-SXM8Nwyys6nT5WP6pltOwKytLV7FqQ4UiibxVmW+EIosHcmCqkkjViTb5SNssDlkCiEYRP1/pdWUKVvZBmsR2Q==", - "dev": true, - "license": "MIT", - "dependencies": { - "call-bound": "^1.0.2" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-weakset": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/is-weakset/-/is-weakset-2.0.4.tgz", - "integrity": "sha512-mfcwb6IzQyOKTs84CQMrOwW4gQcaTOAWJ0zzJCl2WSPDrWk/OzDaImWFH3djXhb24g4eudZfLRozAvPGw4d9hQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "call-bound": "^1.0.3", - "get-intrinsic": "^1.2.6" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" + "url": "https://github.com/sponsors/mesqueeb" } }, "node_modules/is-wsl": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/is-wsl/-/is-wsl-3.1.0.tgz", - "integrity": "sha512-UcVfVfaK4Sc4m7X3dUSoHoozQGBEFeDC+zVo06t98xe8CzHSZZBekNXH+tu0NalHolcJ/QAGqS46Hef7QXBIMw==", + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/is-wsl/-/is-wsl-3.1.1.tgz", + "integrity": "sha512-e6rvdUCiQCAuumZslxRJWR/Doq4VpPR82kqclvcS0efgt430SlGIk05vdCN58+VrzgtIcfNODjozVielycD4Sw==", "dev": true, "license": "MIT", "dependencies": { @@ -13232,9 +9496,9 @@ } }, "node_modules/isarray": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-2.0.5.tgz", - "integrity": "sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw==", + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", + "integrity": "sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==", "dev": true, "license": "MIT" }, @@ -13245,402 +9509,29 @@ "devOptional": true, "license": "ISC" }, - "node_modules/isobject": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", - "integrity": "sha512-WhB9zCku7EGTj/HQQRz5aUQEUeoQZH2bWcltRErOpymJ4boYE6wL9Tbr23krRPSZ+C5zqNSrSw+Cc7sZZ4b7vg==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/jackspeak": { - "version": "3.4.3", - "resolved": "https://registry.npmjs.org/jackspeak/-/jackspeak-3.4.3.tgz", - "integrity": "sha512-OGlZQpz2yfahA/Rd1Y8Cd9SIEsqvXkLVoSw/cgwhnhFMDbsQFeZYoJJ7bIZBS9BcamUW96asq/npPWugM+RQBw==", - "dev": true, - "license": "BlueOak-1.0.0", - "dependencies": { - "@isaacs/cliui": "^8.0.2" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - }, - "optionalDependencies": { - "@pkgjs/parseargs": "^0.11.0" - } - }, "node_modules/jest-diff": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/jest-diff/-/jest-diff-29.7.0.tgz", - "integrity": "sha512-LMIgiIrhigmPrs03JHpxUh2yISK3vLFPkAodPeo0+BuF7wA2FoQbkEg1u8gBYBThncu7e1oEDUfIXVuTqLRUjw==", + "version": "30.4.1", + "resolved": "https://registry.npmjs.org/jest-diff/-/jest-diff-30.4.1.tgz", + "integrity": "sha512-CRpFK0RtLriVDGcPPAnR6HMVI8bSR2jnUIgralhauzYQZIb4RH9AtEInTuQr65LmmGggGcRT6HIASxwqsVsmlA==", "devOptional": true, "license": "MIT", "dependencies": { - "chalk": "^4.0.0", - "diff-sequences": "^29.6.3", - "jest-get-type": "^29.6.3", - "pretty-format": "^29.7.0" + "@jest/diff-sequences": "30.4.0", + "@jest/get-type": "30.1.0", + "chalk": "^4.1.2", + "pretty-format": "30.4.1" }, "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/jest-diff/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==", - "devOptional": true, - "license": "MIT", - "dependencies": { - "color-convert": "^2.0.1" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" - } - }, - "node_modules/jest-diff/node_modules/chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", - "devOptional": true, - "license": "MIT", - "dependencies": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/chalk?sponsor=1" - } - }, - "node_modules/jest-diff/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==", - "devOptional": true, - "license": "MIT", - "dependencies": { - "color-name": "~1.1.4" - }, - "engines": { - "node": ">=7.0.0" - } - }, - "node_modules/jest-diff/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==", - "devOptional": true, - "license": "MIT" - }, - "node_modules/jest-diff/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==", - "devOptional": true, - "license": "MIT", - "dependencies": { - "has-flag": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/jest-get-type": { - "version": "29.6.3", - "resolved": "https://registry.npmjs.org/jest-get-type/-/jest-get-type-29.6.3.tgz", - "integrity": "sha512-zrteXnqYxfQh7l5FHyL38jL39di8H8rHoecLH3JNxH3BwOrBsNeabdap5e0I23lD4HHI8W5VFBZqG4Eaq5LNcw==", - "devOptional": true, - "license": "MIT", - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/jest-matcher-utils": { - "version": "25.5.0", - "resolved": "https://registry.npmjs.org/jest-matcher-utils/-/jest-matcher-utils-25.5.0.tgz", - "integrity": "sha512-VWI269+9JS5cpndnpCwm7dy7JtGQT30UHfrnM3mXl22gHGt/b7NkjBqXfbhZ8V4B7ANUsjK18PlSBmG0YH7gjw==", - "dev": true, - "license": "MIT", - "dependencies": { - "chalk": "^3.0.0", - "jest-diff": "^25.5.0", - "jest-get-type": "^25.2.6", - "pretty-format": "^25.5.0" - }, - "engines": { - "node": ">= 8.3" - } - }, - "node_modules/jest-matcher-utils/node_modules/ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "dev": true, - "license": "MIT", - "dependencies": { - "color-convert": "^2.0.1" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" - } - }, - "node_modules/jest-matcher-utils/node_modules/chalk": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-3.0.0.tgz", - "integrity": "sha512-4D3B6Wf41KOYRFdszmDqMCGq5VV/uMAB273JILmO+3jAlh8X4qDtdtgCR3fxtbLEMzSx22QdhnDcJvu2u1fVwg==", - "dev": true, - "license": "MIT", - "dependencies": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/jest-matcher-utils/node_modules/color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "color-name": "~1.1.4" - }, - "engines": { - "node": ">=7.0.0" - } - }, - "node_modules/jest-matcher-utils/node_modules/color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "dev": true, - "license": "MIT" - }, - "node_modules/jest-matcher-utils/node_modules/diff-sequences": { - "version": "25.2.6", - "resolved": "https://registry.npmjs.org/diff-sequences/-/diff-sequences-25.2.6.tgz", - "integrity": "sha512-Hq8o7+6GaZeoFjtpgvRBUknSXNeJiCx7V9Fr94ZMljNiCr9n9L8H8aJqgWOQiDDGdyn29fRNcDdRVJ5fdyihfg==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 8.3" - } - }, - "node_modules/jest-matcher-utils/node_modules/jest-diff": { - "version": "25.5.0", - "resolved": "https://registry.npmjs.org/jest-diff/-/jest-diff-25.5.0.tgz", - "integrity": "sha512-z1kygetuPiREYdNIumRpAHY6RXiGmp70YHptjdaxTWGmA085W3iCnXNx0DhflK3vwrKmrRWyY1wUpkPMVxMK7A==", - "dev": true, - "license": "MIT", - "dependencies": { - "chalk": "^3.0.0", - "diff-sequences": "^25.2.6", - "jest-get-type": "^25.2.6", - "pretty-format": "^25.5.0" - }, - "engines": { - "node": ">= 8.3" - } - }, - "node_modules/jest-matcher-utils/node_modules/jest-get-type": { - "version": "25.2.6", - "resolved": "https://registry.npmjs.org/jest-get-type/-/jest-get-type-25.2.6.tgz", - "integrity": "sha512-DxjtyzOHjObRM+sM1knti6or+eOgcGU4xVSb2HNP1TqO4ahsT+rqZg+nyqHWJSvWgKC5cG3QjGFBqxLghiF/Ig==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 8.3" - } - }, - "node_modules/jest-matcher-utils/node_modules/pretty-format": { - "version": "25.5.0", - "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-25.5.0.tgz", - "integrity": "sha512-kbo/kq2LQ/A/is0PQwsEHM7Ca6//bGPPvU6UnsdDRSKTWxT/ru/xb88v4BJf6a69H+uTytOEsTusT9ksd/1iWQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "@jest/types": "^25.5.0", - "ansi-regex": "^5.0.0", - "ansi-styles": "^4.0.0", - "react-is": "^16.12.0" - }, - "engines": { - "node": ">= 8.3" - } - }, - "node_modules/jest-matcher-utils/node_modules/react-is": { - "version": "16.13.1", - "resolved": "https://registry.npmjs.org/react-is/-/react-is-16.13.1.tgz", - "integrity": "sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==", - "dev": true, - "license": "MIT" - }, - "node_modules/jest-matcher-utils/node_modules/supports-color": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", - "dev": true, - "license": "MIT", - "dependencies": { - "has-flag": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/jest-util": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-29.7.0.tgz", - "integrity": "sha512-z6EbKajIpqGKU56y5KBUgy1dt1ihhQJgWzUlZHArA/+X2ad7Cb5iF+AK1EWVL/Bo7Rz9uurpqw6SiBCefUbCGA==", - "dev": true, - "license": "MIT", - "dependencies": { - "@jest/types": "^29.6.3", - "@types/node": "*", - "chalk": "^4.0.0", - "ci-info": "^3.2.0", - "graceful-fs": "^4.2.9", - "picomatch": "^2.2.3" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/jest-util/node_modules/@jest/types": { - "version": "29.6.3", - "resolved": "https://registry.npmjs.org/@jest/types/-/types-29.6.3.tgz", - "integrity": "sha512-u3UPsIilWKOM3F9CXtrG8LEJmNxwoCQC/XVj4IKYXvvpx7QIi/Kg1LI5uDmDpKlac62NUtX7eLjRh+jVZcLOzw==", - "dev": true, - "license": "MIT", - "dependencies": { - "@jest/schemas": "^29.6.3", - "@types/istanbul-lib-coverage": "^2.0.0", - "@types/istanbul-reports": "^3.0.0", - "@types/node": "*", - "@types/yargs": "^17.0.8", - "chalk": "^4.0.0" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/jest-util/node_modules/@types/istanbul-reports": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/@types/istanbul-reports/-/istanbul-reports-3.0.4.tgz", - "integrity": "sha512-pk2B1NWalF9toCRu6gjBzR69syFjP4Od8WRAX+0mmf9lAjCRicLOWc+ZrxZHx/0XRjotgkF9t6iaMJ+aXcOdZQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "@types/istanbul-lib-report": "*" - } - }, - "node_modules/jest-util/node_modules/@types/yargs": { - "version": "17.0.33", - "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-17.0.33.tgz", - "integrity": "sha512-WpxBCKWPLr4xSsHgz511rFJAM+wS28w2zEO1QDNY5zM/S8ok70NNfztH0xwhqKyaK0OHCbN98LDAZuy1ctxDkA==", - "dev": true, - "license": "MIT", - "dependencies": { - "@types/yargs-parser": "*" - } - }, - "node_modules/jest-util/node_modules/ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "dev": true, - "license": "MIT", - "dependencies": { - "color-convert": "^2.0.1" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" - } - }, - "node_modules/jest-util/node_modules/chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", - "dev": true, - "license": "MIT", - "dependencies": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/chalk?sponsor=1" - } - }, - "node_modules/jest-util/node_modules/color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "color-name": "~1.1.4" - }, - "engines": { - "node": ">=7.0.0" - } - }, - "node_modules/jest-util/node_modules/color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "dev": true, - "license": "MIT" - }, - "node_modules/jest-util/node_modules/picomatch": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", - "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=8.6" - }, - "funding": { - "url": "https://github.com/sponsors/jonschlinkert" - } - }, - "node_modules/jest-util/node_modules/supports-color": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", - "dev": true, - "license": "MIT", - "dependencies": { - "has-flag": "^4.0.0" - }, - "engines": { - "node": ">=8" + "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" } }, "node_modules/jest-worker": { "version": "27.5.1", "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-27.5.1.tgz", "integrity": "sha512-7vuh85V5cdDofPyxn58nrPjBktZo0u9x1g8WtjQol+jZDaE+fhN+cIvTj11GndBnMnyfrUOG1sZQxCdjKh+DKg==", + "dev": true, "license": "MIT", + "peer": true, "dependencies": { "@types/node": "*", "merge-stream": "^2.0.0", @@ -13654,7 +9545,9 @@ "version": "8.1.1", "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz", "integrity": "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==", + "dev": true, "license": "MIT", + "peer": true, "dependencies": { "has-flag": "^4.0.0" }, @@ -13666,13 +9559,13 @@ } }, "node_modules/jiti": { - "version": "1.21.7", - "resolved": "https://registry.npmjs.org/jiti/-/jiti-1.21.7.tgz", - "integrity": "sha512-/imKNG4EbWNrVjoNC/1H5/9GFy+tqjGBHCaSsN+P2RnPqjsLmv6UD3Ej+Kj8nBWaRAwyk7kK5ZUc+OEatnTR3A==", - "dev": true, + "version": "2.7.0", + "resolved": "https://registry.npmjs.org/jiti/-/jiti-2.7.0.tgz", + "integrity": "sha512-AC/7JofJvZGrrneWNaEnJeOLUx+JlGt7tNa0wZiRPT4MY1wmfKjt2+6O2p2uz2+skll8OZZmJMNqeke7kKbNgQ==", + "devOptional": true, "license": "MIT", "bin": { - "jiti": "bin/jiti.js" + "jiti": "lib/jiti-cli.mjs" } }, "node_modules/joycon": { @@ -13699,13 +9592,22 @@ "license": "MIT" }, "node_modules/js-yaml": { - "version": "3.14.1", - "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.1.tgz", - "integrity": "sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==", + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.2.0.tgz", + "integrity": "sha512-ePWsvanv0DWuDRsW8dnt+R4jQ31SCRCQ7hhNcPXZPsoBZiemuZNYGf7adZdqX2D86j6rvKp3RpCxVTSb8WQlOw==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/puzrin" + }, + { + "type": "github", + "url": "https://github.com/sponsors/nodeca" + } + ], "license": "MIT", "dependencies": { - "argparse": "^1.0.7", - "esprima": "^4.0.0" + "argparse": "^2.0.1" }, "bin": { "js-yaml": "bin/js-yaml.js" @@ -13728,6 +9630,7 @@ "version": "3.0.1", "resolved": "https://registry.npmjs.org/json-buffer/-/json-buffer-3.0.1.tgz", "integrity": "sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==", + "dev": true, "license": "MIT" }, "node_modules/json-parse-even-better-errors": { @@ -13737,26 +9640,6 @@ "dev": true, "license": "MIT" }, - "node_modules/json-schema-deref-sync": { - "version": "0.14.0", - "resolved": "https://registry.npmjs.org/json-schema-deref-sync/-/json-schema-deref-sync-0.14.0.tgz", - "integrity": "sha512-yGR1xmhdiD6R0MSrwWcFxQzAj5b3i5Gb/mt5tvQKgFMMeNe0KZYNEN/jWr7G+xn39Azqgcvk4ZKMs8dQl8e4wA==", - "dev": true, - "license": "MIT", - "dependencies": { - "clone": "^2.1.2", - "dag-map": "~1.0.0", - "is-valid-path": "^0.1.1", - "lodash": "^4.17.13", - "md5": "~2.2.0", - "memory-cache": "~0.2.0", - "traverse": "~0.6.6", - "valid-url": "~1.0.9" - }, - "engines": { - "node": ">=6.0.0" - } - }, "node_modules/json-schema-traverse": { "version": "0.4.1", "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", @@ -13772,9 +9655,9 @@ "license": "MIT" }, "node_modules/json11": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/json11/-/json11-2.0.0.tgz", - "integrity": "sha512-VuKJKUSPEJape+daTm70Nx7vdcdorf4S6LCyN2z0jUVH4UrQ4ftXo2kC0bnHpCREmxHuHqCNVPA75BjI3CB6Ag==", + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/json11/-/json11-2.0.2.tgz", + "integrity": "sha512-HIrd50UPYmP6sqLuLbFVm75g16o0oZrVfxrsY0EEys22klz8mRoWlX9KAEDOSOR9Q34rcxsyC8oDveGrCz5uLQ==", "license": "MIT", "bin": { "json11": "dist/cli.mjs" @@ -13786,6 +9669,7 @@ "integrity": "sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==", "dev": true, "license": "MIT", + "peer": true, "bin": { "json5": "lib/cli.js" }, @@ -13794,9 +9678,9 @@ } }, "node_modules/jsonfile": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.1.0.tgz", - "integrity": "sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==", + "version": "6.2.1", + "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.2.1.tgz", + "integrity": "sha512-zwOTdL3rFQ/lRdBnntKVOX6k5cKJwEc1HdilT71BWEu7J41gXIB2MRp+vxduPSwZJPWBxEzv4yH1wYLJGUHX4Q==", "license": "MIT", "dependencies": { "universalify": "^2.0.0" @@ -13831,20 +9715,12 @@ "version": "4.5.4", "resolved": "https://registry.npmjs.org/keyv/-/keyv-4.5.4.tgz", "integrity": "sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw==", + "dev": true, "license": "MIT", "dependencies": { "json-buffer": "3.0.1" } }, - "node_modules/kind-of": { - "version": "6.0.3", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.3.tgz", - "integrity": "sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==", - "license": "MIT", - "engines": { - "node": ">=0.10.0" - } - }, "node_modules/kleur": { "version": "4.1.5", "resolved": "https://registry.npmjs.org/kleur/-/kleur-4.1.5.tgz", @@ -13855,9 +9731,9 @@ } }, "node_modules/knex": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/knex/-/knex-3.1.0.tgz", - "integrity": "sha512-GLoII6hR0c4ti243gMs5/1Rb3B+AjwMOfjYm97pu0FOQa7JH56hgBxYf5WK2525ceSbBY1cjeZ9yk99GPMB6Kw==", + "version": "3.2.10", + "resolved": "https://registry.npmjs.org/knex/-/knex-3.2.10.tgz", + "integrity": "sha512-oypTHfrc9i72iyxaUQBKHOxhcr0xM65MPf6FpN02nimsftXwzXprIkLjfXdubvhbu4PMWLp023q8o8CYvHSuZw==", "license": "MIT", "dependencies": { "colorette": "2.0.19", @@ -13868,7 +9744,7 @@ "get-package-type": "^0.1.0", "getopts": "2.3.0", "interpret": "^2.2.0", - "lodash": "^4.17.21", + "lodash": "^4.18.1", "pg-connection-string": "2.6.2", "rechoir": "^0.8.0", "resolve-from": "^5.0.0", @@ -13881,6 +9757,9 @@ "engines": { "node": ">=16" }, + "peerDependencies": { + "pg-query-stream": "^4.14.0" + }, "peerDependenciesMeta": { "better-sqlite3": { "optional": true @@ -13897,6 +9776,9 @@ "pg-native": { "optional": true }, + "pg-query-stream": { + "optional": true + }, "sqlite3": { "optional": true }, @@ -13950,15 +9832,25 @@ "node": ">=8" } }, + "node_modules/laravel-precognition": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/laravel-precognition/-/laravel-precognition-1.0.2.tgz", + "integrity": "sha512-0H08JDdMWONrL/N314fvsO3FATJwGGlFKGkMF3nNmizVFJaWs17816iM+sX7Rp8d5hUjYCx6WLfsehSKfaTxjg==", + "license": "MIT", + "dependencies": { + "axios": "^1.4.0", + "lodash-es": "^4.17.21" + } + }, "node_modules/launch-editor": { - "version": "2.9.1", - "resolved": "https://registry.npmjs.org/launch-editor/-/launch-editor-2.9.1.tgz", - "integrity": "sha512-Gcnl4Bd+hRO9P9icCP/RVVT2o8SFlPXofuCxvA2SaZuH45whSvf5p8x5oih5ftLiVhEI4sp5xDY+R+b3zJBh5w==", + "version": "2.14.1", + "resolved": "https://registry.npmjs.org/launch-editor/-/launch-editor-2.14.1.tgz", + "integrity": "sha512-QWBrQsMpH7gPr965dsKD/3cKWiNoTjpATQf++Xq63N6sKRGMwlVXz41O1IZTMfZQgBctD/K5Zt06+/I6pP6+HA==", "dev": true, "license": "MIT", "dependencies": { - "picocolors": "^1.0.0", - "shell-quote": "^1.8.1" + "picocolors": "^1.1.1", + "shell-quote": "^1.8.4" } }, "node_modules/leaflet": { @@ -14002,29 +9894,18 @@ "license": "MIT" }, "node_modules/loader-runner": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/loader-runner/-/loader-runner-4.3.0.tgz", - "integrity": "sha512-3R/1M+yS3j5ou80Me59j7F9IMs4PXs3VqRrm0TU3AbKPxlmpoY1TNscJV/oGJXo8qCatFGTfDbY6W6ipGOYXfg==", + "version": "4.3.2", + "resolved": "https://registry.npmjs.org/loader-runner/-/loader-runner-4.3.2.tgz", + "integrity": "sha512-DFEqQ3ihfS9blba08cLfYf1NRAIEm+dDjic073DRDc3/JspI/8wYmtDsHwd3+4hwvdxSK7PGaElfTmm0awWJ4w==", "dev": true, "license": "MIT", "peer": true, "engines": { "node": ">=6.11.5" - } - }, - "node_modules/loader-utils": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-2.0.4.tgz", - "integrity": "sha512-xXqpXoINfFhgua9xiqD8fPFHgkoq1mmmpE92WlDbm9rNRd/EbRb+Gqf908T2DMfuHjjJlksiK2RbHVOdD/MqSw==", - "dev": true, - "license": "MIT", - "dependencies": { - "big.js": "^5.2.2", - "emojis-list": "^3.0.0", - "json5": "^2.1.2" }, - "engines": { - "node": ">=8.9.0" + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" } }, "node_modules/locate-path": { @@ -14043,61 +9924,15 @@ } }, "node_modules/lodash": { - "version": "4.17.21", - "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz", - "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==", + "version": "4.18.1", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.18.1.tgz", + "integrity": "sha512-dMInicTPVE8d1e5otfwmmjlxkZoUpiVLwyeTdUsi/Caj/gfzzblBcCE5sRHV/AsjuCmxWrte2TNGSYuCeCq+0Q==", "license": "MIT" }, - "node_modules/lodash.clonedeep": { - "version": "4.5.0", - "resolved": "https://registry.npmjs.org/lodash.clonedeep/-/lodash.clonedeep-4.5.0.tgz", - "integrity": "sha512-H5ZhCF25riFd9uB5UCkVKo61m3S/xZk1x4wA6yp/L3RFP6Z/eHH1ymQcGLo7J3GMPfm0V/7m1tryHuGVxpqEBQ==", - "license": "MIT" - }, - "node_modules/lodash.debounce": { - "version": "4.0.8", - "resolved": "https://registry.npmjs.org/lodash.debounce/-/lodash.debounce-4.0.8.tgz", - "integrity": "sha512-FT1yDzDYEoYWhnSGnpE/4Kj1fLZkDFyqRb7fNt6FdYOSxlUWAtp42Eh6Wb0rGIv/m9Bgo7x4GhQbm5Ys4SG5ow==", - "dev": true, - "license": "MIT" - }, - "node_modules/lodash.defaults": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/lodash.defaults/-/lodash.defaults-4.2.0.tgz", - "integrity": "sha512-qjxPLHd3r5DnsdGacqOMU6pb/avJzdh9tFX2ymgoZE27BmjXrNy/y4LoaiTeAb+O3gL8AfpJGtqfX/ae2leYYQ==", - "license": "MIT" - }, - "node_modules/lodash.flatten": { - "version": "4.4.0", - "resolved": "https://registry.npmjs.org/lodash.flatten/-/lodash.flatten-4.4.0.tgz", - "integrity": "sha512-C5N2Z3DgnnKr0LOpv/hKCgKdb7ZZwafIrsesve6lmzvZIRZRGaZ/l6Q8+2W7NaT+ZwO3fFlSCzCzrDCFdJfZ4g==", - "dev": true, - "license": "MIT" - }, - "node_modules/lodash.get": { - "version": "4.4.2", - "resolved": "https://registry.npmjs.org/lodash.get/-/lodash.get-4.4.2.tgz", - "integrity": "sha512-z+Uw/vLuy6gQe8cfaFWD7p0wVv8fJl3mbzXh33RS+0oW2wvUqiRXiQ69gLWSLpgB5/6sU+r6BlQR0MBILadqTQ==", - "dev": true, - "license": "MIT" - }, - "node_modules/lodash.isarguments": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/lodash.isarguments/-/lodash.isarguments-3.1.0.tgz", - "integrity": "sha512-chi4NHZlZqZD18a0imDHnZPrDeBbTtVN7GXMwuGdRH9qotxAjYs3aVLKc7zNOG9eddR5Ksd8rvFEBc9SsggPpg==", - "license": "MIT" - }, - "node_modules/lodash.isequal": { - "version": "4.5.0", - "resolved": "https://registry.npmjs.org/lodash.isequal/-/lodash.isequal-4.5.0.tgz", - "integrity": "sha512-pDo3lu8Jhfjqls6GkMgpahsF9kCyayhgykjyLMNFTKWrpVdAQtYyB4muAMWozBB4ig/dtWAmsMxLEI8wuz+DYQ==", - "license": "MIT" - }, - "node_modules/lodash.memoize": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/lodash.memoize/-/lodash.memoize-4.1.2.tgz", - "integrity": "sha512-t7j+NzmgnQzTAYXcsHYLgimltOV1MXHtlOWf6GjL9Kj8GK5FInw5JotxvbOs+IvV1/Dzo04/fCGfLVs7aXb4Ag==", - "dev": true, + "node_modules/lodash-es": { + "version": "4.18.1", + "resolved": "https://registry.npmjs.org/lodash-es/-/lodash-es-4.18.1.tgz", + "integrity": "sha512-J8xewKD/Gk22OZbhpOVSwcs60zhd95ESDwezOFuA3/099925PdHJ7OFHNTGtajL3AlZkykD32HykiMo+BIBI8A==", "license": "MIT" }, "node_modules/lodash.merge": { @@ -14107,43 +9942,29 @@ "dev": true, "license": "MIT" }, - "node_modules/lodash.set": { - "version": "4.3.2", - "resolved": "https://registry.npmjs.org/lodash.set/-/lodash.set-4.3.2.tgz", - "integrity": "sha512-4hNPN5jlm/N/HLMCO43v8BXKq9Z7QdAGc/VGrRD61w8gN9g/6jF9A4L1pbUgBLCffi0w9VsXfTOij5x8iTyFvg==", - "dev": true, - "license": "MIT" - }, - "node_modules/lodash.uniq": { - "version": "4.5.0", - "resolved": "https://registry.npmjs.org/lodash.uniq/-/lodash.uniq-4.5.0.tgz", - "integrity": "sha512-xfBaXQd9ryd9dlSDvnvI0lvxfLJlYAZzXomUYzLKtUeOQvOP5piqAWuGtrhWeqaXK9hhoM/iyJc5AV+XfsX3HQ==", - "dev": true, - "license": "MIT" - }, "node_modules/log-update": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/log-update/-/log-update-6.1.0.tgz", - "integrity": "sha512-9ie8ItPR6tjY5uYJh8K/Zrv/RMZ5VOlOWvtZdEHYSTFKZfIBPQa9tOAEeAWhd+AnIneLJ22w5fjOYtoutpWq5w==", + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/log-update/-/log-update-7.2.0.tgz", + "integrity": "sha512-iLs7dGSyjZiUgvrUvuD3FndAxVJk+TywBkkkwUSm9HdYoskJalWg5qVsEiXeufPvRVPbCUmNQewg798rx+sPXg==", "license": "MIT", "dependencies": { - "ansi-escapes": "^7.0.0", + "ansi-escapes": "^7.3.0", "cli-cursor": "^5.0.0", - "slice-ansi": "^7.1.0", - "strip-ansi": "^7.1.0", - "wrap-ansi": "^9.0.0" + "slice-ansi": "^8.0.0", + "strip-ansi": "^7.2.0", + "wrap-ansi": "^10.0.0" }, "engines": { - "node": ">=18" + "node": ">=20" }, "funding": { "url": "https://github.com/sponsors/sindresorhus" } }, "node_modules/log-update/node_modules/ansi-regex": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.1.0.tgz", - "integrity": "sha512-7HSX4QQb4CspciLpVFwyRe79O3xsIZDDLER21kERQ71oaPodF8jL725AgJMFAYbooIqolJoRLuM81SpeUkpkvA==", + "version": "6.2.2", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.2.2.tgz", + "integrity": "sha512-Bq3SmSpyFHaWjPk8If9yc6svM8c56dB5BAtW4Qbw5jHTwwXXcTLoRMkpDJp6VL0XzlWaCHTXrkFURMYmD0sLqg==", "license": "MIT", "engines": { "node": ">=12" @@ -14152,56 +9973,13 @@ "url": "https://github.com/chalk/ansi-regex?sponsor=1" } }, - "node_modules/log-update/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==", - "license": "MIT", - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" - } - }, - "node_modules/log-update/node_modules/is-fullwidth-code-point": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-5.0.0.tgz", - "integrity": "sha512-OVa3u9kkBbw7b8Xw5F9P+D/T9X+Z4+JruYVNapTjPYZYUznQ5YfWeFkOj606XYYW8yugTfC8Pj0hYqvi4ryAhA==", - "license": "MIT", - "dependencies": { - "get-east-asian-width": "^1.0.0" - }, - "engines": { - "node": ">=18" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/log-update/node_modules/slice-ansi": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-7.1.0.tgz", - "integrity": "sha512-bSiSngZ/jWeX93BqeIAbImyTbEihizcwNjFoRUIY/T1wWQsfsm2Vw1agPKylXvQTU7iASGdHhyqRlqQzfz+Htg==", - "license": "MIT", - "dependencies": { - "ansi-styles": "^6.2.1", - "is-fullwidth-code-point": "^5.0.0" - }, - "engines": { - "node": ">=18" - }, - "funding": { - "url": "https://github.com/chalk/slice-ansi?sponsor=1" - } - }, "node_modules/log-update/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==", + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.2.0.tgz", + "integrity": "sha512-yDPMNjp4WyfYBkHnjIRLfca1i6KMyGCtsVgoKe/z1+6vukgaENdgGBZt+ZmKPc4gavvEZ5OgHfHdrazhgNyG7w==", "license": "MIT", "dependencies": { - "ansi-regex": "^6.0.1" + "ansi-regex": "^6.2.2" }, "engines": { "node": ">=12" @@ -14210,22 +9988,6 @@ "url": "https://github.com/chalk/strip-ansi?sponsor=1" } }, - "node_modules/loupe": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/loupe/-/loupe-3.1.2.tgz", - "integrity": "sha512-23I4pFZHmAemUnz8WZXbYRSKYj801VDaNv9ETuMh7IrMc7VuVVSo+Z9iLE3ni30+U48iDWfi30d3twAXBYmnCg==", - "dev": true, - "license": "MIT" - }, - "node_modules/lower-case": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/lower-case/-/lower-case-2.0.2.tgz", - "integrity": "sha512-7fm3l3NAF9WfN6W3JOmf5drwpVqX78JtoGJ3A6W0a6ZnldM41w2fV5D490psKFTpMds8TJse/eHLFFsNHHjHgg==", - "license": "MIT", - "dependencies": { - "tslib": "^2.0.3" - } - }, "node_modules/lowercase-keys": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/lowercase-keys/-/lowercase-keys-3.0.0.tgz", @@ -14244,33 +10006,27 @@ "integrity": "sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==", "dev": true, "license": "ISC", + "peer": true, "dependencies": { "yallist": "^3.0.2" } }, "node_modules/luxon": { - "version": "3.5.0", - "resolved": "https://registry.npmjs.org/luxon/-/luxon-3.5.0.tgz", - "integrity": "sha512-rh+Zjr6DNfUYR3bPwJEnuwDdqMbxZW7LOQfUN4B54+Cl+0o5zaU9RJ6bcidfDtC1cWCZXQ+nvX8bf6bAji37QQ==", + "version": "3.7.2", + "resolved": "https://registry.npmjs.org/luxon/-/luxon-3.7.2.tgz", + "integrity": "sha512-vtEhXh/gNjI9Yg1u4jX/0YVPMvxzHuGgCm6tC5kZyb08yjGWGnqAjGJvcXbqQR2P3MyMEFnRbpcdFS6PBcLqew==", "license": "MIT", "engines": { "node": ">=12" } }, - "node_modules/macroable": { - "version": "7.0.2", - "resolved": "https://registry.npmjs.org/macroable/-/macroable-7.0.2.tgz", - "integrity": "sha512-QS9p+Q20YBxpE0dJBnF6CPURP7p1GUsxnhTxTWH5nG3A1F5w8Rg3T4Xyh5UlrFSbHp88oOciVP/0agsNLhkHdQ==", - "license": "MIT", - "peer": true - }, "node_modules/magic-string": { - "version": "0.30.17", - "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.30.17.tgz", - "integrity": "sha512-sNPKHvyjVf7gyjwS4xGTaW/mCnF8wnjtifKBEhxfZ7E/S8tQ0rssrwGNn6q8JH/ohItJfSQp9mBtQYuTlH5QnA==", + "version": "0.30.21", + "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.30.21.tgz", + "integrity": "sha512-vd2F4YUyEXKGcLHoq+TEyCjxueSeHnFxyyjNp80yg0XV4vUhnDer/lvvlqM/arB5bXQN5K2/3oinyCRyx8T2CQ==", "license": "MIT", "dependencies": { - "@jridgewell/sourcemap-codec": "^1.5.0" + "@jridgewell/sourcemap-codec": "^1.5.5" } }, "node_modules/mailcheck": { @@ -14293,15 +10049,6 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/make-dir/node_modules/semver": { - "version": "6.3.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", - "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", - "license": "ISC", - "bin": { - "semver": "bin/semver.js" - } - }, "node_modules/make-error": { "version": "1.3.6", "resolved": "https://registry.npmjs.org/make-error/-/make-error-1.3.6.tgz", @@ -14318,54 +10065,53 @@ "node": ">= 0.4" } }, - "node_modules/md5": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/md5/-/md5-2.2.1.tgz", - "integrity": "sha512-PlGG4z5mBANDGCKsYQe0CaUYHdZYZt8ZPZLmEt+Urf0W4GlpTX4HescwHU+dc9+Z/G/vZKYZYFrwgm9VxK6QOQ==", - "dev": true, - "license": "BSD-3-Clause", - "dependencies": { - "charenc": "~0.0.1", - "crypt": "~0.0.1", - "is-buffer": "~1.1.1" - } - }, - "node_modules/mdn-data": { - "version": "2.0.30", - "resolved": "https://registry.npmjs.org/mdn-data/-/mdn-data-2.0.30.tgz", - "integrity": "sha512-GaqWWShW4kv/G9IEucWScBx9G1/vsFZZJUO+tD26M8J8z3Kw5RDQjaoZe03YAClgeS/SWPOcb4nkFBTEi5DUEA==", - "dev": true, - "license": "CC0-1.0" - }, "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==", + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-1.1.0.tgz", + "integrity": "sha512-aisnrDP4GNe06UcKFnV5bfMNPBUw4jsLGaWwWfnH3v02GnBuXX2MCVn5RbrWo0j3pczUilYblq7fQ7Nw2t5XKw==", "license": "MIT", "engines": { - "node": ">= 0.6" + "node": ">= 0.8" } }, "node_modules/memfs": { - "version": "3.5.3", - "resolved": "https://registry.npmjs.org/memfs/-/memfs-3.5.3.tgz", - "integrity": "sha512-UERzLsxzllchadvbPs5aolHh65ISpKpM+ccLbOJ8/vvpBKmAWf+la7dXFy7Mr0ySHbdHrFv5kGFCUHHe6GFEmw==", - "license": "Unlicense", + "version": "4.57.6", + "resolved": "https://registry.npmjs.org/memfs/-/memfs-4.57.6.tgz", + "integrity": "sha512-WQK+DGjKCnPdpSyJUXphz+COF2uEhhsxQ3VIWBSbzpbbXuch3h4FePMqXrXGdLjsTgo4JFzBFsP6AWd9pVazGw==", + "dev": true, + "license": "Apache-2.0", "dependencies": { - "fs-monkey": "^1.0.4" + "@jsonjoy.com/fs-core": "4.57.6", + "@jsonjoy.com/fs-fsa": "4.57.6", + "@jsonjoy.com/fs-node": "4.57.6", + "@jsonjoy.com/fs-node-builtins": "4.57.6", + "@jsonjoy.com/fs-node-to-fsa": "4.57.6", + "@jsonjoy.com/fs-node-utils": "4.57.6", + "@jsonjoy.com/fs-print": "4.57.6", + "@jsonjoy.com/fs-snapshot": "4.57.6", + "@jsonjoy.com/json-pack": "^1.11.0", + "@jsonjoy.com/util": "^1.9.0", + "glob-to-regex.js": "^1.0.1", + "thingies": "^2.5.0", + "tree-dump": "^1.0.3", + "tslib": "^2.0.0" }, - "engines": { - "node": ">= 4.0.0" + "funding": { + "type": "github", + "url": "https://github.com/sponsors/streamich" + }, + "peerDependencies": { + "tslib": "2" } }, "node_modules/memoize": { - "version": "10.0.0", - "resolved": "https://registry.npmjs.org/memoize/-/memoize-10.0.0.tgz", - "integrity": "sha512-H6cBLgsi6vMWOcCpvVCdFFnl3kerEXbrYh9q+lY6VXvQSmM6CkmV08VOwT+WE2tzIEqRPFfAq3fm4v/UIW6mSA==", + "version": "10.2.0", + "resolved": "https://registry.npmjs.org/memoize/-/memoize-10.2.0.tgz", + "integrity": "sha512-DeC6b7QBrZsRs3Y02A6A7lQyzFbsQbqgjI6UW0GigGWV+u1s25TycMr0XHZE4cJce7rY/vyw2ctMQqfDkIhUEA==", "devOptional": true, "license": "MIT", "dependencies": { - "mimic-function": "^5.0.0" + "mimic-function": "^5.0.1" }, "engines": { "node": ">=18" @@ -14374,13 +10120,6 @@ "url": "https://github.com/sindresorhus/memoize?sponsor=1" } }, - "node_modules/memory-cache": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/memory-cache/-/memory-cache-0.2.0.tgz", - "integrity": "sha512-OcjA+jzjOYzKmKS6IQVALHLVz+rNTMPoJvCztFaZxwG14wtAW7VRZjwTQu06vKCYOxh4jVnik7ya0SXTB0W+xA==", - "dev": true, - "license": "BSD-2-Clause" - }, "node_modules/merge-descriptors": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-1.0.3.tgz", @@ -14395,7 +10134,9 @@ "version": "2.0.0", "resolved": "https://registry.npmjs.org/merge-stream/-/merge-stream-2.0.0.tgz", "integrity": "sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==", - "license": "MIT" + "dev": true, + "license": "MIT", + "peer": true }, "node_modules/merge2": { "version": "1.4.1", @@ -14411,7 +10152,7 @@ "version": "1.1.2", "resolved": "https://registry.npmjs.org/methods/-/methods-1.1.2.tgz", "integrity": "sha512-iclAHeNqNm68zFtnZ0e+1L2yUIdvzNoauKU4WBA3VvH/vPFieF7qfRlwUZU+DA9P9bPXIS90ulxoUoCH23sV2w==", - "devOptional": true, + "dev": true, "license": "MIT", "engines": { "node": ">= 0.6" @@ -14431,9 +10172,9 @@ } }, "node_modules/micromatch/node_modules/picomatch": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", - "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.2.tgz", + "integrity": "sha512-V7+vQEJ06Z+c5tSye8S+nHUfI51xoXIXjHQ99cQtKUkQqqO1kO/KCJUfZXuB47h/YBlDhah2H3hdUGXn8ie0oA==", "license": "MIT", "engines": { "node": ">=8.6" @@ -14443,9 +10184,9 @@ } }, "node_modules/mime": { - "version": "4.0.6", - "resolved": "https://registry.npmjs.org/mime/-/mime-4.0.6.tgz", - "integrity": "sha512-4rGt7rvQHBbaSOF9POGkk1ocRP16Md1x36Xma8sz8h8/vfCUI2OtEIeCqe4Ofes853x4xDoPiFLIT47J5fI/7A==", + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/mime/-/mime-4.1.0.tgz", + "integrity": "sha512-X5ju04+cAzsojXKes0B/S4tcYtFAJ6tTMuSPBEn9CPGlrWr8Fiw7qYeLT0XyH80HSoAoqWCaz+MWKh22P7G1cw==", "funding": [ "https://github.com/sponsors/broofa" ], @@ -14458,24 +10199,28 @@ } }, "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==", + "version": "1.54.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.54.0.tgz", + "integrity": "sha512-aU5EJuIN2WDemCcAp2vFBfp/m4EAhWJnUNSSw0ixs7/kXbd6Pg64EmwJkNdFhB8aWt1sH2CTXrLxo/iAGV3oPQ==", "license": "MIT", "engines": { "node": ">= 0.6" } }, "node_modules/mime-types": { - "version": "2.1.35", - "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz", - "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-3.0.2.tgz", + "integrity": "sha512-Lbgzdk0h4juoQ9fCKXW4by0UJqj+nOOrI9MJ1sSj4nI8aI2eo1qmvQEie4VD1glsS250n15LsWsYtCugiStS5A==", "license": "MIT", "dependencies": { - "mime-db": "1.52.0" + "mime-db": "^1.54.0" }, "engines": { - "node": ">= 0.6" + "node": ">=18" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/express" } }, "node_modules/mimic-function": { @@ -14502,27 +10247,6 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/mini-css-extract-plugin": { - "version": "2.9.2", - "resolved": "https://registry.npmjs.org/mini-css-extract-plugin/-/mini-css-extract-plugin-2.9.2.tgz", - "integrity": "sha512-GJuACcS//jtq4kCtd5ii/M0SZf7OZRH+BxdqXZHaJfb8TJiVl+NgQRPwiYt2EuqeSkNydn/7vP+bcE27C5mb9w==", - "dev": true, - "license": "MIT", - "dependencies": { - "schema-utils": "^4.0.0", - "tapable": "^2.2.1" - }, - "engines": { - "node": ">= 12.13.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/webpack" - }, - "peerDependencies": { - "webpack": "^5.0.0" - } - }, "node_modules/mini-svg-data-uri": { "version": "1.4.4", "resolved": "https://registry.npmjs.org/mini-svg-data-uri/-/mini-svg-data-uri-1.4.4.tgz", @@ -14541,9 +10265,9 @@ "license": "ISC" }, "node_modules/minimatch": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", - "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "version": "3.1.5", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.5.tgz", + "integrity": "sha512-VgjWUsnnT6n+NUk6eZq77zeFdpW2LWDzP6zFGrCbHXiYNul5Dzqk2HHQ5uFH2DNW5Xbp8+jVzaeNt94ssEEl4w==", "license": "ISC", "dependencies": { "brace-expansion": "^1.1.7" @@ -14662,9 +10386,9 @@ } }, "node_modules/nanoid": { - "version": "3.3.8", - "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.8.tgz", - "integrity": "sha512-WNLf5Sd8oZxOm+TzppcYk8gVOgP+l58xNy58D0nbUnOxOWRWvlcCV4kUF7ltmI6PsrLl/BgKEyS4mqsGChFN0w==", + "version": "3.3.12", + "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.12.tgz", + "integrity": "sha512-ZB9RH/39qpq5Vu6Y+NmUaFhQR6pp+M2Xt76XBnEwDaGcVAqhlvxrl3B2bKS5D3NH3QR76v3aSrKaF/Kiy7lEtQ==", "funding": [ { "type": "github", @@ -14710,16 +10434,6 @@ "license": "MIT", "peer": true }, - "node_modules/no-case": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/no-case/-/no-case-3.0.4.tgz", - "integrity": "sha512-fgAN3jGAh+RoxUGZHTSOLJIqUc2wmoBwGR4tbpNAKmmovFoWq0OdRkb0VkldReO2a2iBT/OEulG9XSUc10r3zg==", - "license": "MIT", - "dependencies": { - "lower-case": "^2.0.2", - "tslib": "^2.0.3" - } - }, "node_modules/node-2fa": { "version": "2.0.3", "resolved": "https://registry.npmjs.org/node-2fa/-/node-2fa-2.0.3.tgz", @@ -14764,27 +10478,33 @@ } } }, - "node_modules/node-forge": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/node-forge/-/node-forge-1.3.1.tgz", - "integrity": "sha512-dPEtOeMvF9VMcYV/1Wb8CPoVAXtp6MKMlcbAt4ddqmGqUJ6fQZFXkNZNkNlfevtNkGtaSoXf/vNNNSvgrdXwtA==", - "dev": true, - "license": "(BSD-3-Clause OR GPL-2.0)", - "engines": { - "node": ">= 6.13.0" + "node_modules/node-gyp-build": { + "version": "4.8.4", + "resolved": "https://registry.npmjs.org/node-gyp-build/-/node-gyp-build-4.8.4.tgz", + "integrity": "sha512-LA4ZjwlnUblHVgq0oBF3Jl/6h/Nvs5fzBLwdEF4nuxnFdsfajde4WfxtJr3CaiH+F6ewcIB/q4jQ4UzPyid+CQ==", + "license": "MIT", + "optional": true, + "peer": true, + "bin": { + "node-gyp-build": "bin.js", + "node-gyp-build-optional": "optional.js", + "node-gyp-build-test": "build-test.js" } }, "node_modules/node-releases": { - "version": "2.0.19", - "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.19.tgz", - "integrity": "sha512-xxOWJsBKtzAq7DY0J+DTzuz58K8e7sJbdgwkbMWQe8UYB6ekmsQ45q0M/tJDsGaZmbC+l7n57UV8Hl5tHxO9uw==", + "version": "2.0.47", + "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.47.tgz", + "integrity": "sha512-Uzmd6LXpouKo8EUK68IjH4+E01w/hXyV3R3g/geCJo+rXLNfh1xucB+LOzYEOQPSiUK3h/xZf0cQGcSsmyL2Og==", "dev": true, - "license": "MIT" + "license": "MIT", + "engines": { + "node": ">=18" + } }, "node_modules/nodemailer": { - "version": "6.9.16", - "resolved": "https://registry.npmjs.org/nodemailer/-/nodemailer-6.9.16.tgz", - "integrity": "sha512-psAuZdTIRN08HKVd/E8ObdV6NO7NTBY3KsC30F7M4H1OnmLCUNaS56FpYxyb26zWLSyYF9Ozch9KYHhHegsiOQ==", + "version": "6.10.1", + "resolved": "https://registry.npmjs.org/nodemailer/-/nodemailer-6.10.1.tgz", + "integrity": "sha512-Z+iLaBGVaSjbIzQ4pX6XV41HrooLsQ10ZWPUehGmuantvzWoDVBnmsdUcOIDM1t+yPor5pDhVlDESgOMEGxhHA==", "license": "MIT-0", "engines": { "node": ">=6.0.0" @@ -14815,20 +10535,10 @@ "node": ">=0.10.0" } }, - "node_modules/normalize-range": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/normalize-range/-/normalize-range-0.1.2.tgz", - "integrity": "sha512-bdok/XvKII3nUpklnV6P2hxtMNrCboOjAcyBuQnWEhO665FwrSNRxU+AqpsyvO6LgGYPspN+lu5CLtw4jPRKNA==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=0.10.0" - } - }, "node_modules/normalize-url": { - "version": "8.0.1", - "resolved": "https://registry.npmjs.org/normalize-url/-/normalize-url-8.0.1.tgz", - "integrity": "sha512-IO9QvjUMWxPQQhs60oOu10CRkWCiZzSUkzbXGGV9pviYl1fXYcvkzQ5jV9z8Y6un8ARoVRl4EtC6v6jNqbaJ/w==", + "version": "8.1.1", + "resolved": "https://registry.npmjs.org/normalize-url/-/normalize-url-8.1.1.tgz", + "integrity": "sha512-JYc0DPlpGWB40kH5g07gGTrYuMqV653k3uBKY6uITPWds3M0ov3GaWGp9lbE3Bzngx8+XkfzgvASb9vk9JDFXQ==", "license": "MIT", "engines": { "node": ">=14.16" @@ -14887,19 +10597,6 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/npm-run-path/node_modules/unicorn-magic": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/unicorn-magic/-/unicorn-magic-0.3.0.tgz", - "integrity": "sha512-+QBBXBCvifc56fsbuxZQ6Sic3wqqc3WWaqxs58gvJrcOuN83HGTCwz3oS5phzU9LthRNE9VrJCFCLUgHeeFnfA==", - "devOptional": true, - "license": "MIT", - "engines": { - "node": ">=18" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, "node_modules/npmlog": { "version": "5.0.1", "resolved": "https://registry.npmjs.org/npmlog/-/npmlog-5.0.1.tgz", @@ -14913,25 +10610,6 @@ "set-blocking": "^2.0.0" } }, - "node_modules/nprogress": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/nprogress/-/nprogress-0.2.0.tgz", - "integrity": "sha512-I19aIingLgR1fmhftnbWWO3dXc0hSxqHQHQb3H8m+K3TnEn/iSeTZZOyvKXWqQESMwuUVnatlCnZdLBZZt2VSA==", - "license": "MIT" - }, - "node_modules/nth-check": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/nth-check/-/nth-check-2.1.1.tgz", - "integrity": "sha512-lqjrjmaOoAnWfMmBPL+XNnynZh2+swxiX3WUE0s4yEHI6m+AwrK2UZOimIRl3X/4QctVqS8AiZjFqyOGrMXb/w==", - "dev": true, - "license": "BSD-2-Clause", - "dependencies": { - "boolbase": "^1.0.0" - }, - "funding": { - "url": "https://github.com/fb55/nth-check?sponsor=1" - } - }, "node_modules/numeral": { "version": "2.0.6", "resolved": "https://registry.npmjs.org/numeral/-/numeral-2.0.6.tgz", @@ -14962,9 +10640,9 @@ } }, "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==", + "version": "1.13.4", + "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.13.4.tgz", + "integrity": "sha512-W67iLl4J2EXEGTbfeHCffrjDfitvLANg0UlX3wFUUSTx92KXRFegMHUVgSqE+wvhAbi4WqjGg9czysTV2Epbew==", "license": "MIT", "engines": { "node": ">= 0.4" @@ -14973,37 +10651,6 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/object-keys": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.1.1.tgz", - "integrity": "sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/object.assign": { - "version": "4.1.7", - "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.7.tgz", - "integrity": "sha512-nK28WOo+QIjBkDduTINE4JkF/UJJKyf2EJxvJKfblDpyg0Q+pkOHNTL0Qwy6NP6FhE/EnzV73BxxqcJaXY9anw==", - "dev": true, - "license": "MIT", - "dependencies": { - "call-bind": "^1.0.8", - "call-bound": "^1.0.3", - "define-properties": "^1.2.1", - "es-object-atoms": "^1.0.0", - "has-symbols": "^1.1.0", - "object-keys": "^1.1.1" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, "node_modules/obuf": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/obuf/-/obuf-1.1.2.tgz", @@ -15033,9 +10680,9 @@ } }, "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==", + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/on-headers/-/on-headers-1.1.0.tgz", + "integrity": "sha512-737ZY3yNnXy37FHkQxPzt4UZ2UWPWiCZWLvFZ4fu5cueciegX0zGPnrlY6bwRg4FdQOe9YU8MkmJwGhoMybl8A==", "dev": true, "license": "MIT", "engines": { @@ -15067,16 +10714,16 @@ } }, "node_modules/open": { - "version": "10.1.0", - "resolved": "https://registry.npmjs.org/open/-/open-10.1.0.tgz", - "integrity": "sha512-mnkeQ1qP5Ue2wd+aivTD3NHd/lZ96Lu0jgf0pwktLPtx6cTZiH7tyeGRRHs0zX0rbrahXPnXlUnbeXyaBBuIaw==", + "version": "10.2.0", + "resolved": "https://registry.npmjs.org/open/-/open-10.2.0.tgz", + "integrity": "sha512-YgBpdJHPyQ2UE5x+hlSXcnejzAvD0b22U2OuAP+8OnlJT+PjWPxtgmGqKKc+RgTM63U9gN0YzrYc71R2WT/hTA==", "dev": true, "license": "MIT", "dependencies": { "default-browser": "^5.2.1", "define-lazy-prop": "^3.0.0", "is-inside-container": "^1.0.0", - "is-wsl": "^3.1.0" + "wsl-utils": "^0.1.0" }, "engines": { "node": ">=18" @@ -15085,26 +10732,6 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/openapi-schema-validator": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/openapi-schema-validator/-/openapi-schema-validator-3.0.3.tgz", - "integrity": "sha512-KKpeNEvAmpy6B2JCfyrM4yWjL6vggDCVbBoR8Yfkj0Jltc6PCW+dBbcg+1yrTCuDv80qBQJ6w0ejA71DlOFegA==", - "dev": true, - "license": "MIT", - "dependencies": { - "ajv": "^6.5.2", - "lodash.merge": "^4.6.1", - "openapi-types": "1.3.4", - "swagger-schema-official": "2.0.0-bab6bed" - } - }, - "node_modules/openapi-types": { - "version": "1.3.4", - "resolved": "https://registry.npmjs.org/openapi-types/-/openapi-types-1.3.4.tgz", - "integrity": "sha512-h8rADpW3k/wepLdERKF0VKMAPdoFYNQCLGPmc/f8sgQ2dxUy+7sY4WAX2XDUDjhKTjbJVbxxofLkzy7f1/tE4g==", - "dev": true, - "license": "MIT" - }, "node_modules/optionator": { "version": "0.9.4", "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.9.4.tgz", @@ -15123,24 +10750,6 @@ "node": ">= 0.8.0" } }, - "node_modules/own-keys": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/own-keys/-/own-keys-1.0.1.tgz", - "integrity": "sha512-qFOyK5PjiWZd+QQIh+1jhdb9LpxTF0qs7Pm8o5QHYZ0M3vKqSqzsZaEB6oWlxZ+q2sJBMI/Ktgd2N5ZwQoRHfg==", - "dev": true, - "license": "MIT", - "dependencies": { - "get-intrinsic": "^1.2.6", - "object-keys": "^1.1.1", - "safe-push-apply": "^1.0.0" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, "node_modules/p-cancelable": { "version": "4.0.1", "resolved": "https://registry.npmjs.org/p-cancelable/-/p-cancelable-4.0.1.tgz", @@ -15213,9 +10822,9 @@ } }, "node_modules/p-map": { - "version": "7.0.3", - "resolved": "https://registry.npmjs.org/p-map/-/p-map-7.0.3.tgz", - "integrity": "sha512-VkndIv2fIB99swvQoA65bm+fsmt6UNdGeIB0oxBs+WhAhdh08QA04JXpI7rbB9r08/nkbysKoya9rtDERYOYMA==", + "version": "7.0.4", + "resolved": "https://registry.npmjs.org/p-map/-/p-map-7.0.4.tgz", + "integrity": "sha512-tkAQEw8ysMzmkhgw8k+1U/iPhWNhykKnSk4Rd5zLoPJCuJaGRPo6YposrZgaxHKzDHdDWWZvE/Sk7hsL2X/CpQ==", "devOptional": true, "license": "MIT", "engines": { @@ -15265,27 +10874,14 @@ "node": ">=6" } }, - "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, - "license": "BlueOak-1.0.0" - }, "node_modules/package-manager-detector": { - "version": "0.2.8", - "resolved": "https://registry.npmjs.org/package-manager-detector/-/package-manager-detector-0.2.8.tgz", - "integrity": "sha512-ts9KSdroZisdvKMWVAVCXiKqnqNfXz4+IbrBG8/BWx/TR5le+jfenvoBuIZ6UWM9nz47W7AbD9qYfAwfWMIwzA==", - "license": "MIT" - }, - "node_modules/param-case": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/param-case/-/param-case-3.0.4.tgz", - "integrity": "sha512-RXlj7zCYokReqWpOPH9oYivUzLYZ5vAPIfEmCTNViosC78F8F0H9y7T7gG2M39ymgutxF5gcFEsyZQSph9Bp3A==", + "version": "0.2.11", + "resolved": "https://registry.npmjs.org/package-manager-detector/-/package-manager-detector-0.2.11.tgz", + "integrity": "sha512-BEnLolu+yuz22S56CU1SUKq3XC3PkwD5wv4ikR4MfGvnRVcmzXR9DwSlW2fEamyTPyXHomBJRzgapeuBvRNzJQ==", + "devOptional": true, "license": "MIT", "dependencies": { - "dot-case": "^3.0.4", - "tslib": "^2.0.3" + "quansync": "^0.2.7" } }, "node_modules/parent-module": { @@ -15355,16 +10951,6 @@ "node": ">= 0.8" } }, - "node_modules/pascal-case": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/pascal-case/-/pascal-case-3.1.2.tgz", - "integrity": "sha512-uWlGT3YSnK9x3BQJaOdcZwrnV6hPpd8jFH1/ucpiLRPh/2zCVJKS19E4GvYHvaCcACn3foXZ0cLB9Wrx1KGe5g==", - "license": "MIT", - "dependencies": { - "no-case": "^3.0.4", - "tslib": "^2.0.3" - } - }, "node_modules/path-browserify": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/path-browserify/-/path-browserify-1.0.1.tgz", @@ -15372,16 +10958,6 @@ "devOptional": true, "license": "MIT" }, - "node_modules/path-case": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/path-case/-/path-case-3.0.4.tgz", - "integrity": "sha512-qO4qCFjXqVTrcbPt/hQfhTQ+VhFsqNKOPtytgNKkKxSoEp3XPUQ8ObFuePylOIok5gjn69ry8XiULxCwot3Wfg==", - "license": "MIT", - "dependencies": { - "dot-case": "^3.0.4", - "tslib": "^2.0.3" - } - }, "node_modules/path-exists": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", @@ -15416,90 +10992,50 @@ "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==", "license": "MIT" }, - "node_modules/path-scurry": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/path-scurry/-/path-scurry-1.11.1.tgz", - "integrity": "sha512-Xa4Nw17FS9ApQFJ9umLiJS4orGjm7ZzwUrwamcGQuHSzDyth9boKDaycYdDcZDuqYATXw4HFXgaqWTctW/v1HA==", - "dev": true, - "license": "BlueOak-1.0.0", - "dependencies": { - "lru-cache": "^10.2.0", - "minipass": "^5.0.0 || ^6.0.2 || ^7.0.0" - }, - "engines": { - "node": ">=16 || 14 >=14.18" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/path-scurry/node_modules/lru-cache": { - "version": "10.4.3", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-10.4.3.tgz", - "integrity": "sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ==", - "dev": true, - "license": "ISC" - }, "node_modules/path-to-regexp": { - "version": "0.1.12", - "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.12.tgz", - "integrity": "sha512-RA1GjUVMnvYFxuqovrEqZoxxW5NUZqbwKtYz/Tt7nXerk0LbLblQmrsgdeOxV5SFHf0UDggjS/bSeOZwt1pmEQ==", + "version": "0.1.13", + "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.13.tgz", + "integrity": "sha512-A/AGNMFN3c8bOlvV9RreMdrv7jsmF9XIfDeCd87+I8RNg6s78BhJxMu69NEMHBSJFxKidViTEdruRwEk/WIKqA==", "dev": true, "license": "MIT" }, "node_modules/path-type": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/path-type/-/path-type-5.0.0.tgz", - "integrity": "sha512-5HviZNaZcfqP95rwpv+1HDgUamezbqdSYTyzjTvwtJSnIH+3vnbmWsItli8OFEndS984VT55M3jduxZbX351gg==", + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/path-type/-/path-type-6.0.0.tgz", + "integrity": "sha512-Vj7sf++t5pBD637NSfkxpHSMfWaeig5+DKWLhcqIYx6mWQz5hdJTGDVMQiJcw1ZYkhs7AazKDGpRVji1LJCZUQ==", "devOptional": true, "license": "MIT", "engines": { - "node": ">=12" + "node": ">=18" }, "funding": { "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/pathval": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/pathval/-/pathval-2.0.0.tgz", - "integrity": "sha512-vE7JKRyES09KiunauX7nd2Q9/L7lhok4smP9RZTDeD4MVs72Dp2qNFVz39Nz5a0FVEW0BJR6C0DYrq6unoziZA==", + "node_modules/perfect-debounce": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/perfect-debounce/-/perfect-debounce-1.0.0.tgz", + "integrity": "sha512-xCy9V055GLEqoFaHoC1SoLIaLmWctgCUaBaWxDZ7/Zx4CTyX7cJQLJOok/orfjZAh9kEYpjJa4d0KcJmCbctZA==", "dev": true, - "license": "MIT", - "engines": { - "node": ">= 14.16" - } - }, - "node_modules/peek-readable": { - "version": "5.3.1", - "resolved": "https://registry.npmjs.org/peek-readable/-/peek-readable-5.3.1.tgz", - "integrity": "sha512-GVlENSDW6KHaXcd9zkZltB7tCLosKB/4Hg0fqBJkAoBgYG2Tn1xtMgXtSUuMU9AK/gCm/tTdT8mgAeF4YNeeqw==", - "license": "MIT", - "engines": { - "node": ">=14.16" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/Borewit" - } + "license": "MIT" }, "node_modules/pg": { - "version": "8.13.1", - "resolved": "https://registry.npmjs.org/pg/-/pg-8.13.1.tgz", - "integrity": "sha512-OUir1A0rPNZlX//c7ksiu7crsGZTKSOXJPgtNiHGIlC9H0lO+NC6ZDYksSgBYY/thSWhnSRBv8w1lieNNGATNQ==", + "version": "8.21.0", + "resolved": "https://registry.npmjs.org/pg/-/pg-8.21.0.tgz", + "integrity": "sha512-AUP1EYJuHraQGsVoCQVIcM7TEJVGtDzxWtGFZd8rds9d+CCXlU5Js1rYgfLNvxy9iJrpHjGrRjoi/3BT9fRyiA==", "license": "MIT", "dependencies": { - "pg-connection-string": "^2.7.0", - "pg-pool": "^3.7.0", - "pg-protocol": "^1.7.0", - "pg-types": "^2.1.0", - "pgpass": "1.x" + "pg-connection-string": "^2.13.0", + "pg-pool": "^3.14.0", + "pg-protocol": "^1.14.0", + "pg-types": "2.2.0", + "pgpass": "1.0.5" }, "engines": { - "node": ">= 8.0.0" + "node": ">= 16.0.0" }, "optionalDependencies": { - "pg-cloudflare": "^1.1.1" + "pg-cloudflare": "^1.4.0" }, "peerDependencies": { "pg-native": ">=3.0.1" @@ -15511,9 +11047,9 @@ } }, "node_modules/pg-cloudflare": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/pg-cloudflare/-/pg-cloudflare-1.1.1.tgz", - "integrity": "sha512-xWPagP/4B6BgFO+EKz3JONXv3YDgvkbVrGw2mTo3D6tVDQRh1e7cqVGvyR3BE+eQgAvx1XhW/iEASj4/jCWl3Q==", + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/pg-cloudflare/-/pg-cloudflare-1.4.0.tgz", + "integrity": "sha512-Vo7z/6rrQYxpNRylp4Tlob2elzbh+N/MOQbxFVWCxS7oEx6jF53GTJFxK2WWpKuBRkmiin4Mt+xofFDjx09R0A==", "license": "MIT", "optional": true }, @@ -15533,18 +11069,18 @@ } }, "node_modules/pg-pool": { - "version": "3.7.0", - "resolved": "https://registry.npmjs.org/pg-pool/-/pg-pool-3.7.0.tgz", - "integrity": "sha512-ZOBQForurqh4zZWjrgSwwAtzJ7QiRX0ovFkZr2klsen3Nm0aoh33Ls0fzfv3imeH/nw/O27cjdz5kzYJfeGp/g==", + "version": "3.14.0", + "resolved": "https://registry.npmjs.org/pg-pool/-/pg-pool-3.14.0.tgz", + "integrity": "sha512-gKtPkFdQPU3DksooVLi9LsjZxrsBUZIpa+7aVx+LV5pNh0KzP4Zleud2po+ConrxbuXGBJ6Hfer6hdgpIBpBaw==", "license": "MIT", "peerDependencies": { "pg": ">=8.0" } }, "node_modules/pg-protocol": { - "version": "1.7.0", - "resolved": "https://registry.npmjs.org/pg-protocol/-/pg-protocol-1.7.0.tgz", - "integrity": "sha512-hTK/mE36i8fDDhgDFjy6xNOG+LCorxLG3WO17tku+ij6sVHXh1jQUJ8hYAnRhNla4QVD2H8er/FOjc/+EgC6yQ==", + "version": "1.14.0", + "resolved": "https://registry.npmjs.org/pg-protocol/-/pg-protocol-1.14.0.tgz", + "integrity": "sha512-n5taZ1kO3s9ngDTVxsEznOqCyToTgz0FLuPq0B33COy5pPpuWJpY3/2oRBVETuOgzdqRXfWpM9HIhp2LBBT1BA==", "license": "MIT" }, "node_modules/pg-types": { @@ -15564,9 +11100,9 @@ } }, "node_modules/pg/node_modules/pg-connection-string": { - "version": "2.7.0", - "resolved": "https://registry.npmjs.org/pg-connection-string/-/pg-connection-string-2.7.0.tgz", - "integrity": "sha512-PI2W9mv53rXJQEOb8xNR8lH7Hr+EKa6oJa38zsK0S/ky2er16ios1wLKhZyxzD7jUReiWokc9WK5nxSnC7W1TA==", + "version": "2.13.0", + "resolved": "https://registry.npmjs.org/pg-connection-string/-/pg-connection-string-2.13.0.tgz", + "integrity": "sha512-EMnU9E2fSULdsbErBbMaXJvFeD9B4+nPcM3f+4lsiCR0BHLPrLVjv3DbyM2hgQQviKJaTWIRRTjKjWlHg3p2ig==", "license": "MIT" }, "node_modules/pgpass": { @@ -15578,6 +11114,36 @@ "split2": "^4.1.0" } }, + "node_modules/phc-argon2": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/phc-argon2/-/phc-argon2-1.1.4.tgz", + "integrity": "sha512-iZGWarpCNY71Cu+Os5dsJPIUmuHb4EOC6wtnAfjRIPJ2SJ/MZ2ADLdrqqVw6GBeMmCT/EMMuyKRYG/ldIL2kOQ==", + "license": "MIT", + "dependencies": { + "@kdf/salt": "^2.0.1", + "@phc/format": "^1.0.0", + "argon2": "^0.30.2", + "tsse": "^2.0.0" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/phc-argon2/node_modules/argon2": { + "version": "0.30.3", + "resolved": "https://registry.npmjs.org/argon2/-/argon2-0.30.3.tgz", + "integrity": "sha512-DoH/kv8c9127ueJSBxAVJXinW9+EuPA3EMUxoV2sAY1qDE5H9BjTyVF/aD2XyHqbqUWabgBkIfcP3ZZuGhbJdg==", + "hasInstallScript": true, + "license": "MIT", + "dependencies": { + "@mapbox/node-pre-gyp": "^1.0.10", + "@phc/format": "^1.0.0", + "node-addon-api": "^5.0.0" + }, + "engines": { + "node": ">=14.0.0" + } + }, "node_modules/picocolors": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.1.1.tgz", @@ -15585,10 +11151,9 @@ "license": "ISC" }, "node_modules/picomatch": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.2.tgz", - "integrity": "sha512-M7BAV6Rlcy5u+m6oPhAPFgJTzAioX/6B0DxyvDlo9l8+T3nLKbrczg2WLUyzd45L8RqfUMyGPzekbMvX2Ldkwg==", - "devOptional": true, + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.4.tgz", + "integrity": "sha512-QP88BAKvMam/3NxH6vj2o21R6MjxZUAd6nlwAS/pnGvN9IVLocLHxGYIzFhg6fUQ+5th6P4dv4eW9jX3DSIj7A==", "license": "MIT", "engines": { "node": ">=12" @@ -15608,21 +11173,20 @@ } }, "node_modules/pinia": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/pinia/-/pinia-2.3.0.tgz", - "integrity": "sha512-ohZj3jla0LL0OH5PlLTDMzqKiVw2XARmC1XYLdLWIPBMdhDW/123ZWr4zVAhtJm+aoSkFa13pYXskAvAscIkhQ==", + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/pinia/-/pinia-3.0.4.tgz", + "integrity": "sha512-l7pqLUFTI/+ESXn6k3nu30ZIzW5E2WZF/LaHJEpoq6ElcLD+wduZoB2kBN19du6K/4FDpPMazY2wJr+IndBtQw==", "dev": true, "license": "MIT", "dependencies": { - "@vue/devtools-api": "^6.6.3", - "vue-demi": "^0.14.10" + "@vue/devtools-api": "^7.7.7" }, "funding": { "url": "https://github.com/sponsors/posva" }, "peerDependencies": { - "typescript": ">=4.4.4", - "vue": "^2.7.0 || ^3.5.11" + "typescript": ">=4.5.0", + "vue": "^3.5.11" }, "peerDependenciesMeta": { "typescript": { @@ -15631,123 +11195,84 @@ } }, "node_modules/pino": { - "version": "6.14.0", - "resolved": "https://registry.npmjs.org/pino/-/pino-6.14.0.tgz", - "integrity": "sha512-iuhEDel3Z3hF9Jfe44DPXR8l07bhjuFY3GMHIXbjnY9XcafbyDDwl2sN2vw2GjMPf5Nkoe+OFao7ffn9SXaKDg==", + "version": "10.3.1", + "resolved": "https://registry.npmjs.org/pino/-/pino-10.3.1.tgz", + "integrity": "sha512-r34yH/GlQpKZbU1BvFFqOjhISRo1MNx1tWYsYvmj6KIRHSPMT2+yHOEb1SG6NMvRoHRF0a07kCOox/9yakl1vg==", "license": "MIT", - "peer": true, "dependencies": { - "fast-redact": "^3.0.0", - "fast-safe-stringify": "^2.0.8", - "flatstr": "^1.0.12", - "pino-std-serializers": "^3.1.0", - "process-warning": "^1.0.0", + "@pinojs/redact": "^0.4.0", + "atomic-sleep": "^1.0.0", + "on-exit-leak-free": "^2.1.0", + "pino-abstract-transport": "^3.0.0", + "pino-std-serializers": "^7.0.0", + "process-warning": "^5.0.0", "quick-format-unescaped": "^4.0.3", - "sonic-boom": "^1.0.2" + "real-require": "^0.2.0", + "safe-stable-stringify": "^2.3.1", + "sonic-boom": "^4.0.1", + "thread-stream": "^4.0.0" }, "bin": { "pino": "bin.js" } }, "node_modules/pino-abstract-transport": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/pino-abstract-transport/-/pino-abstract-transport-2.0.0.tgz", - "integrity": "sha512-F63x5tizV6WCh4R6RHyi2Ml+M70DNRXt/+HANowMflpgGFMAym/VKm6G7ZOQRjqN7XbGxK1Lg9t6ZrtzOaivMw==", + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/pino-abstract-transport/-/pino-abstract-transport-3.0.0.tgz", + "integrity": "sha512-wlfUczU+n7Hy/Ha5j9a/gZNy7We5+cXp8YL+X+PG8S0KXxw7n/JXA3c46Y0zQznIJ83URJiwy7Lh56WLokNuxg==", "license": "MIT", "dependencies": { "split2": "^4.0.0" } }, "node_modules/pino-pretty": { - "version": "11.3.0", - "resolved": "https://registry.npmjs.org/pino-pretty/-/pino-pretty-11.3.0.tgz", - "integrity": "sha512-oXwn7ICywaZPHmu3epHGU2oJX4nPmKvHvB/bwrJHlGcbEWaVcotkpyVHMKLKmiVryWYByNp0jpgAcXpFJDXJzA==", + "version": "13.1.3", + "resolved": "https://registry.npmjs.org/pino-pretty/-/pino-pretty-13.1.3.tgz", + "integrity": "sha512-ttXRkkOz6WWC95KeY9+xxWL6AtImwbyMHrL1mSwqwW9u+vLp/WIElvHvCSDg0xO/Dzrggz1zv3rN5ovTRVowKg==", "dev": true, "license": "MIT", "dependencies": { "colorette": "^2.0.7", "dateformat": "^4.6.3", - "fast-copy": "^3.0.2", + "fast-copy": "^4.0.0", "fast-safe-stringify": "^2.1.1", "help-me": "^5.0.0", "joycon": "^3.1.1", "minimist": "^1.2.6", "on-exit-leak-free": "^2.1.0", - "pino-abstract-transport": "^2.0.0", + "pino-abstract-transport": "^3.0.0", "pump": "^3.0.0", - "readable-stream": "^4.0.0", - "secure-json-parse": "^2.4.0", + "secure-json-parse": "^4.0.0", "sonic-boom": "^4.0.1", - "strip-json-comments": "^3.1.1" + "strip-json-comments": "^5.0.2" }, "bin": { "pino-pretty": "bin.js" } }, - "node_modules/pino-pretty/node_modules/readable-stream": { - "version": "4.7.0", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-4.7.0.tgz", - "integrity": "sha512-oIGGmcpTLwPga8Bn6/Z75SVaH1z5dUut2ibSyAMVhmUggWpmDn2dapB0n7f8nwaSiRtepAsfJyfXIO5DCVAODg==", + "node_modules/pino-pretty/node_modules/secure-json-parse": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/secure-json-parse/-/secure-json-parse-4.1.0.tgz", + "integrity": "sha512-l4KnYfEyqYJxDwlNVyRfO2E4NTHfMKAWdUuA8J0yve2Dz/E/PdBepY03RvyJpssIpRFwJoCD55wA+mEDs6ByWA==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/fastify" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/fastify" + } + ], + "license": "BSD-3-Clause" + }, + "node_modules/pino-pretty/node_modules/strip-json-comments": { + "version": "5.0.3", + "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-5.0.3.tgz", + "integrity": "sha512-1tB5mhVo7U+ETBKNf92xT4hrQa3pm0MZ0PQvuDnWgAAGHDsfp4lPSpiS6psrSiet87wyGPh9ft6wmhOMQ0hDiw==", "dev": true, "license": "MIT", - "dependencies": { - "abort-controller": "^3.0.0", - "buffer": "^6.0.3", - "events": "^3.3.0", - "process": "^0.11.10", - "string_decoder": "^1.3.0" - }, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - } - }, - "node_modules/pino-pretty/node_modules/sonic-boom": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/sonic-boom/-/sonic-boom-4.2.0.tgz", - "integrity": "sha512-INb7TM37/mAcsGmc9hyyI6+QR3rR1zVRu36B0NeGXKnOOLiZOfER5SA+N7X7k3yUYRzLWafduTDvJAfDswwEww==", - "dev": true, - "license": "MIT", - "dependencies": { - "atomic-sleep": "^1.0.0" - } - }, - "node_modules/pino-std-serializers": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/pino-std-serializers/-/pino-std-serializers-3.2.0.tgz", - "integrity": "sha512-EqX4pwDPrt3MuOAAUBMU0Tk5kR/YcCM5fNPEzgCO2zJ5HfX0vbiH9HbJglnyeQsN96Kznae6MWD47pZB5avTrg==", - "license": "MIT", - "peer": true - }, - "node_modules/pino/node_modules/sonic-boom": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/sonic-boom/-/sonic-boom-1.4.1.tgz", - "integrity": "sha512-LRHh/A8tpW7ru89lrlkU4AszXt1dbwSjVWguGrmlxE7tawVmDBlI1PILMkXAxJTwqhgsEeTHzj36D5CmHgQmNg==", - "license": "MIT", - "peer": true, - "dependencies": { - "atomic-sleep": "^1.0.0", - "flatstr": "^1.0.12" - } - }, - "node_modules/pirates": { - "version": "4.0.6", - "resolved": "https://registry.npmjs.org/pirates/-/pirates-4.0.6.tgz", - "integrity": "sha512-saLsH7WeYYPiD25LDuLRRY/i+6HaPYr6G1OUlN39otzkSTxKnubR9RTxS3/Kk50s1g2JTgFwWQDQyplC5/SHZg==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 6" - } - }, - "node_modules/pkg-dir": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-7.0.0.tgz", - "integrity": "sha512-Ie9z/WINcxxLp27BKOCHGde4ITq9UklYKDzVo1nhk5sqGEXU3FpkwP5GM2voTGJkGd9B3Otl+Q4uwSOeSUtOBA==", - "devOptional": true, - "license": "MIT", - "dependencies": { - "find-up": "^6.3.0" - }, "engines": { "node": ">=14.16" }, @@ -15755,31 +11280,67 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/pkg-dir/node_modules/find-up": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-6.3.0.tgz", - "integrity": "sha512-v2ZsoEuVHYy8ZIlYqwPe/39Cy+cFDzp4dXPaxNvkEuouymu+2Jbz0PxpKarJHYJTmv2HWT3O382qY8l4jMWthw==", + "node_modules/pino-std-serializers": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/pino-std-serializers/-/pino-std-serializers-7.1.0.tgz", + "integrity": "sha512-BndPH67/JxGExRgiX1dX0w1FvZck5Wa4aal9198SrRhZjH3GxKQUKIBnYJTdj2HDN3UQAS06HlfcSbQj2OHmaw==", + "license": "MIT" + }, + "node_modules/pirates": { + "version": "4.0.7", + "resolved": "https://registry.npmjs.org/pirates/-/pirates-4.0.7.tgz", + "integrity": "sha512-TfySrs/5nm8fQJDcBDuUng3VOUKsd7S+zqvbOTiGXHfxX4wK31ard+hoNuvkicM/2YFzlpDgABOevKSsB4G/FA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 6" + } + }, + "node_modules/pkg-dir": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-8.0.0.tgz", + "integrity": "sha512-4peoBq4Wks0riS0z8741NVv+/8IiTvqnZAr8QGgtdifrtpdXbNw/FxRS1l6NFqm4EMzuS0EDqNNx4XGaz8cuyQ==", "devOptional": true, "license": "MIT", "dependencies": { - "locate-path": "^7.1.0", - "path-exists": "^5.0.0" + "find-up-simple": "^1.0.0" }, "engines": { - "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + "node": ">=18" }, "funding": { "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/pkg-dir/node_modules/path-exists": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-5.0.0.tgz", - "integrity": "sha512-RjhtfwJOxzcFmNOi6ltcbcu4Iu+FL3zEj83dk4kAS+fVpTxXLO1b38RvJgT/0QwvV/L3aY9TAnyv0EOqW4GoMQ==", - "devOptional": true, + "node_modules/pkijs": { + "version": "3.4.0", + "resolved": "https://registry.npmjs.org/pkijs/-/pkijs-3.4.0.tgz", + "integrity": "sha512-emEcLuomt2j03vxD54giVB4SxTjnsqkU692xZOZXHDVoYyypEm+b3jpiTcc+Cf+myooc+/Ly0z01jqeNHVgJGw==", + "dev": true, + "license": "BSD-3-Clause", + "dependencies": { + "@noble/hashes": "1.4.0", + "asn1js": "^3.0.6", + "bytestreamjs": "^2.0.1", + "pvtsutils": "^1.3.6", + "pvutils": "^1.1.3", + "tslib": "^2.8.1" + }, + "engines": { + "node": ">=16.0.0" + } + }, + "node_modules/pkijs/node_modules/@noble/hashes": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/@noble/hashes/-/hashes-1.4.0.tgz", + "integrity": "sha512-V1JJ1WTRUqHHrOSh597hURcMqVKVGL/ea3kv0gSnEdsEZ0/+VyPghM1lMNGc00z7CIQorSvbKpuJkxvuHbvdbg==", + "dev": true, "license": "MIT", "engines": { - "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + "node": ">= 16" + }, + "funding": { + "url": "https://paulmillr.com/funding/" } }, "node_modules/pluralize": { @@ -15800,20 +11361,10 @@ "node": ">=10.13.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, - "license": "MIT", - "engines": { - "node": ">= 0.4" - } - }, "node_modules/postcss": { - "version": "8.4.49", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.49.tgz", - "integrity": "sha512-OCVPnIObs4N29kxTjzLfUryOkvZEq+pf8jTF0lg8E7uETuWHA+v7j3c/xJmiqpX450191LlmZfUKkXxkTry7nA==", + "version": "8.5.15", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.5.15.tgz", + "integrity": "sha512-FfR8sjd4em2T6fb3I2MwAJU7HWVMr9zba+enmQeeWFfCbm+UOC/0X4DS8XtpUTMwWMGbjKYP7xjfNekzyGmB3A==", "funding": [ { "type": "opencollective", @@ -15830,7 +11381,7 @@ ], "license": "MIT", "dependencies": { - "nanoid": "^3.3.7", + "nanoid": "^3.3.12", "picocolors": "^1.1.1", "source-map-js": "^1.2.1" }, @@ -15838,128 +11389,6 @@ "node": "^10 || ^12 || >=14" } }, - "node_modules/postcss-calc": { - "version": "10.1.0", - "resolved": "https://registry.npmjs.org/postcss-calc/-/postcss-calc-10.1.0.tgz", - "integrity": "sha512-uQ/LDGsf3mgsSUEXmAt3VsCSHR3aKqtEIkmB+4PhzYwRYOW5MZs/GhCCFpsOtJJkP6EC6uGipbrnaTjqaJZcJw==", - "dev": true, - "license": "MIT", - "dependencies": { - "postcss-selector-parser": "^7.0.0", - "postcss-value-parser": "^4.2.0" - }, - "engines": { - "node": "^18.12 || ^20.9 || >=22.0" - }, - "peerDependencies": { - "postcss": "^8.4.38" - } - }, - "node_modules/postcss-colormin": { - "version": "7.0.2", - "resolved": "https://registry.npmjs.org/postcss-colormin/-/postcss-colormin-7.0.2.tgz", - "integrity": "sha512-YntRXNngcvEvDbEjTdRWGU606eZvB5prmHG4BF0yLmVpamXbpsRJzevyy6MZVyuecgzI2AWAlvFi8DAeCqwpvA==", - "dev": true, - "license": "MIT", - "dependencies": { - "browserslist": "^4.23.3", - "caniuse-api": "^3.0.0", - "colord": "^2.9.3", - "postcss-value-parser": "^4.2.0" - }, - "engines": { - "node": "^18.12.0 || ^20.9.0 || >=22.0" - }, - "peerDependencies": { - "postcss": "^8.4.31" - } - }, - "node_modules/postcss-convert-values": { - "version": "7.0.4", - "resolved": "https://registry.npmjs.org/postcss-convert-values/-/postcss-convert-values-7.0.4.tgz", - "integrity": "sha512-e2LSXPqEHVW6aoGbjV9RsSSNDO3A0rZLCBxN24zvxF25WknMPpX8Dm9UxxThyEbaytzggRuZxaGXqaOhxQ514Q==", - "dev": true, - "license": "MIT", - "dependencies": { - "browserslist": "^4.23.3", - "postcss-value-parser": "^4.2.0" - }, - "engines": { - "node": "^18.12.0 || ^20.9.0 || >=22.0" - }, - "peerDependencies": { - "postcss": "^8.4.31" - } - }, - "node_modules/postcss-discard-comments": { - "version": "7.0.3", - "resolved": "https://registry.npmjs.org/postcss-discard-comments/-/postcss-discard-comments-7.0.3.tgz", - "integrity": "sha512-q6fjd4WU4afNhWOA2WltHgCbkRhZPgQe7cXF74fuVB/ge4QbM9HEaOIzGSiMvM+g/cOsNAUGdf2JDzqA2F8iLA==", - "dev": true, - "license": "MIT", - "dependencies": { - "postcss-selector-parser": "^6.1.2" - }, - "engines": { - "node": "^18.12.0 || ^20.9.0 || >=22.0" - }, - "peerDependencies": { - "postcss": "^8.4.31" - } - }, - "node_modules/postcss-discard-comments/node_modules/postcss-selector-parser": { - "version": "6.1.2", - "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-6.1.2.tgz", - "integrity": "sha512-Q8qQfPiZ+THO/3ZrOrO0cJJKfpYCagtMUkXbnEfmgUjwXg6z/WBeOyS9APBBPCTSiDV+s4SwQGu8yFsiMRIudg==", - "dev": true, - "license": "MIT", - "dependencies": { - "cssesc": "^3.0.0", - "util-deprecate": "^1.0.2" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/postcss-discard-duplicates": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/postcss-discard-duplicates/-/postcss-discard-duplicates-7.0.1.tgz", - "integrity": "sha512-oZA+v8Jkpu1ct/xbbrntHRsfLGuzoP+cpt0nJe5ED2FQF8n8bJtn7Bo28jSmBYwqgqnqkuSXJfSUEE7if4nClQ==", - "dev": true, - "license": "MIT", - "engines": { - "node": "^18.12.0 || ^20.9.0 || >=22.0" - }, - "peerDependencies": { - "postcss": "^8.4.31" - } - }, - "node_modules/postcss-discard-empty": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/postcss-discard-empty/-/postcss-discard-empty-7.0.0.tgz", - "integrity": "sha512-e+QzoReTZ8IAwhnSdp/++7gBZ/F+nBq9y6PomfwORfP7q9nBpK5AMP64kOt0bA+lShBFbBDcgpJ3X4etHg4lzA==", - "dev": true, - "license": "MIT", - "engines": { - "node": "^18.12.0 || ^20.9.0 || >=22.0" - }, - "peerDependencies": { - "postcss": "^8.4.31" - } - }, - "node_modules/postcss-discard-overridden": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/postcss-discard-overridden/-/postcss-discard-overridden-7.0.0.tgz", - "integrity": "sha512-GmNAzx88u3k2+sBTZrJSDauR0ccpE24omTQCVmaTTZFz1du6AasspjaUPMJ2ud4RslZpoFKyf+6MSPETLojc6w==", - "dev": true, - "license": "MIT", - "engines": { - "node": "^18.12.0 || ^20.9.0 || >=22.0" - }, - "peerDependencies": { - "postcss": "^8.4.31" - } - }, "node_modules/postcss-import": { "version": "15.1.0", "resolved": "https://registry.npmjs.org/postcss-import/-/postcss-import-15.1.0.tgz", @@ -15979,29 +11408,9 @@ } }, "node_modules/postcss-js": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/postcss-js/-/postcss-js-4.0.1.tgz", - "integrity": "sha512-dDLF8pEO191hJMtlHFPRa8xsizHaM82MLfNkUHdUtVEV3tgTp5oj+8qbEqYM57SLfc74KSbw//4SeJma2LRVIw==", - "dev": true, - "license": "MIT", - "dependencies": { - "camelcase-css": "^2.0.1" - }, - "engines": { - "node": "^12 || ^14 || >= 16" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/postcss/" - }, - "peerDependencies": { - "postcss": "^8.4.21" - } - }, - "node_modules/postcss-load-config": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/postcss-load-config/-/postcss-load-config-4.0.2.tgz", - "integrity": "sha512-bSVhyJGL00wMVoPUzAVAnbEoWyqRxkjv64tUl427SKnPrENtq6hJwUojroMz2VB+Q1edmi4IfrAPpami5VVgMQ==", + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/postcss-js/-/postcss-js-4.1.0.tgz", + "integrity": "sha512-oIAOTqgIo7q2EOwbhb8UalYePMvYoIeRY2YKntdpFQXNosSu3vLrniGgmH9OKs/qAkfoj5oB3le/7mINW1LCfw==", "dev": true, "funding": [ { @@ -16015,35 +11424,68 @@ ], "license": "MIT", "dependencies": { - "lilconfig": "^3.0.0", - "yaml": "^2.3.4" + "camelcase-css": "^2.0.1" }, "engines": { - "node": ">= 14" + "node": "^12 || ^14 || >= 16" }, "peerDependencies": { + "postcss": "^8.4.21" + } + }, + "node_modules/postcss-load-config": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/postcss-load-config/-/postcss-load-config-6.0.1.tgz", + "integrity": "sha512-oPtTM4oerL+UXmx+93ytZVN82RrlY/wPUV8IeDxFrzIjXOLF1pN+EmKPLbubvKHT2HC20xXsCAH2Z+CKV6Oz/g==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", + "dependencies": { + "lilconfig": "^3.1.1" + }, + "engines": { + "node": ">= 18" + }, + "peerDependencies": { + "jiti": ">=1.21.0", "postcss": ">=8.0.9", - "ts-node": ">=9.0.0" + "tsx": "^4.8.1", + "yaml": "^2.4.2" }, "peerDependenciesMeta": { + "jiti": { + "optional": true + }, "postcss": { "optional": true }, - "ts-node": { + "tsx": { + "optional": true + }, + "yaml": { "optional": true } } }, "node_modules/postcss-loader": { - "version": "8.1.1", - "resolved": "https://registry.npmjs.org/postcss-loader/-/postcss-loader-8.1.1.tgz", - "integrity": "sha512-0IeqyAsG6tYiDRCYKQJLAmgQr47DX6N7sFSWvQxt6AcupX8DIdmykuk/o/tx0Lze3ErGHJEp5OSRxrelC6+NdQ==", + "version": "8.2.1", + "resolved": "https://registry.npmjs.org/postcss-loader/-/postcss-loader-8.2.1.tgz", + "integrity": "sha512-k98jtRzthjj3f76MYTs9JTpRqV1RaaMhEU0Lpw9OTmQZQdppg4B30VZ74BojuBHt3F4KyubHJoXCMUeM8Bqeow==", "dev": true, "license": "MIT", "dependencies": { "cosmiconfig": "^9.0.0", - "jiti": "^1.20.0", - "semver": "^7.5.4" + "jiti": "^2.5.1", + "semver": "^7.6.2" }, "engines": { "node": ">= 18.12.0" @@ -16053,7 +11495,7 @@ "url": "https://opencollective.com/webpack" }, "peerDependencies": { - "@rspack/core": "0.x || 1.x", + "@rspack/core": "0.x || ^1.0.0 || ^2.0.0-0", "postcss": "^7.0.0 || ^8.0.1", "webpack": "^5.0.0" }, @@ -16066,200 +11508,17 @@ } } }, - "node_modules/postcss-merge-longhand": { - "version": "7.0.4", - "resolved": "https://registry.npmjs.org/postcss-merge-longhand/-/postcss-merge-longhand-7.0.4.tgz", - "integrity": "sha512-zer1KoZA54Q8RVHKOY5vMke0cCdNxMP3KBfDerjH/BYHh4nCIh+1Yy0t1pAEQF18ac/4z3OFclO+ZVH8azjR4A==", - "dev": true, - "license": "MIT", - "dependencies": { - "postcss-value-parser": "^4.2.0", - "stylehacks": "^7.0.4" - }, - "engines": { - "node": "^18.12.0 || ^20.9.0 || >=22.0" - }, - "peerDependencies": { - "postcss": "^8.4.31" - } - }, - "node_modules/postcss-merge-rules": { - "version": "7.0.4", - "resolved": "https://registry.npmjs.org/postcss-merge-rules/-/postcss-merge-rules-7.0.4.tgz", - "integrity": "sha512-ZsaamiMVu7uBYsIdGtKJ64PkcQt6Pcpep/uO90EpLS3dxJi6OXamIobTYcImyXGoW0Wpugh7DSD3XzxZS9JCPg==", - "dev": true, - "license": "MIT", - "dependencies": { - "browserslist": "^4.23.3", - "caniuse-api": "^3.0.0", - "cssnano-utils": "^5.0.0", - "postcss-selector-parser": "^6.1.2" - }, - "engines": { - "node": "^18.12.0 || ^20.9.0 || >=22.0" - }, - "peerDependencies": { - "postcss": "^8.4.31" - } - }, - "node_modules/postcss-merge-rules/node_modules/postcss-selector-parser": { - "version": "6.1.2", - "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-6.1.2.tgz", - "integrity": "sha512-Q8qQfPiZ+THO/3ZrOrO0cJJKfpYCagtMUkXbnEfmgUjwXg6z/WBeOyS9APBBPCTSiDV+s4SwQGu8yFsiMRIudg==", - "dev": true, - "license": "MIT", - "dependencies": { - "cssesc": "^3.0.0", - "util-deprecate": "^1.0.2" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/postcss-minify-font-values": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/postcss-minify-font-values/-/postcss-minify-font-values-7.0.0.tgz", - "integrity": "sha512-2ckkZtgT0zG8SMc5aoNwtm5234eUx1GGFJKf2b1bSp8UflqaeFzR50lid4PfqVI9NtGqJ2J4Y7fwvnP/u1cQog==", - "dev": true, - "license": "MIT", - "dependencies": { - "postcss-value-parser": "^4.2.0" - }, - "engines": { - "node": "^18.12.0 || ^20.9.0 || >=22.0" - }, - "peerDependencies": { - "postcss": "^8.4.31" - } - }, - "node_modules/postcss-minify-gradients": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/postcss-minify-gradients/-/postcss-minify-gradients-7.0.0.tgz", - "integrity": "sha512-pdUIIdj/C93ryCHew0UgBnL2DtUS3hfFa5XtERrs4x+hmpMYGhbzo6l/Ir5de41O0GaKVpK1ZbDNXSY6GkXvtg==", - "dev": true, - "license": "MIT", - "dependencies": { - "colord": "^2.9.3", - "cssnano-utils": "^5.0.0", - "postcss-value-parser": "^4.2.0" - }, - "engines": { - "node": "^18.12.0 || ^20.9.0 || >=22.0" - }, - "peerDependencies": { - "postcss": "^8.4.31" - } - }, - "node_modules/postcss-minify-params": { - "version": "7.0.2", - "resolved": "https://registry.npmjs.org/postcss-minify-params/-/postcss-minify-params-7.0.2.tgz", - "integrity": "sha512-nyqVLu4MFl9df32zTsdcLqCFfE/z2+f8GE1KHPxWOAmegSo6lpV2GNy5XQvrzwbLmiU7d+fYay4cwto1oNdAaQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "browserslist": "^4.23.3", - "cssnano-utils": "^5.0.0", - "postcss-value-parser": "^4.2.0" - }, - "engines": { - "node": "^18.12.0 || ^20.9.0 || >=22.0" - }, - "peerDependencies": { - "postcss": "^8.4.31" - } - }, - "node_modules/postcss-minify-selectors": { - "version": "7.0.4", - "resolved": "https://registry.npmjs.org/postcss-minify-selectors/-/postcss-minify-selectors-7.0.4.tgz", - "integrity": "sha512-JG55VADcNb4xFCf75hXkzc1rNeURhlo7ugf6JjiiKRfMsKlDzN9CXHZDyiG6x/zGchpjQS+UAgb1d4nqXqOpmA==", - "dev": true, - "license": "MIT", - "dependencies": { - "cssesc": "^3.0.0", - "postcss-selector-parser": "^6.1.2" - }, - "engines": { - "node": "^18.12.0 || ^20.9.0 || >=22.0" - }, - "peerDependencies": { - "postcss": "^8.4.31" - } - }, - "node_modules/postcss-minify-selectors/node_modules/postcss-selector-parser": { - "version": "6.1.2", - "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-6.1.2.tgz", - "integrity": "sha512-Q8qQfPiZ+THO/3ZrOrO0cJJKfpYCagtMUkXbnEfmgUjwXg6z/WBeOyS9APBBPCTSiDV+s4SwQGu8yFsiMRIudg==", - "dev": true, - "license": "MIT", - "dependencies": { - "cssesc": "^3.0.0", - "util-deprecate": "^1.0.2" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/postcss-modules-extract-imports": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/postcss-modules-extract-imports/-/postcss-modules-extract-imports-3.1.0.tgz", - "integrity": "sha512-k3kNe0aNFQDAZGbin48pL2VNidTF0w4/eASDsxlyspobzU3wZQLOGj7L9gfRe0Jo9/4uud09DsjFNH7winGv8Q==", + "node_modules/postcss-loader/node_modules/semver": { + "version": "7.8.2", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.8.2.tgz", + "integrity": "sha512-c8jsqUZm3omBOI66G90z1Dyw5z622G8oLG+omfsHBJf3CWQTlOcwOjvOG6wtiNfW6anKm/eA39LMwMtMez2TiQ==", "dev": true, "license": "ISC", - "engines": { - "node": "^10 || ^12 || >= 14" - }, - "peerDependencies": { - "postcss": "^8.1.0" - } - }, - "node_modules/postcss-modules-local-by-default": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/postcss-modules-local-by-default/-/postcss-modules-local-by-default-4.2.0.tgz", - "integrity": "sha512-5kcJm/zk+GJDSfw+V/42fJ5fhjL5YbFDl8nVdXkJPLLW+Vf9mTD5Xe0wqIaDnLuL2U6cDNpTr+UQ+v2HWIBhzw==", - "dev": true, - "license": "MIT", - "dependencies": { - "icss-utils": "^5.0.0", - "postcss-selector-parser": "^7.0.0", - "postcss-value-parser": "^4.1.0" + "bin": { + "semver": "bin/semver.js" }, "engines": { - "node": "^10 || ^12 || >= 14" - }, - "peerDependencies": { - "postcss": "^8.1.0" - } - }, - "node_modules/postcss-modules-scope": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/postcss-modules-scope/-/postcss-modules-scope-3.2.1.tgz", - "integrity": "sha512-m9jZstCVaqGjTAuny8MdgE88scJnCiQSlSrOWcTQgM2t32UBe+MUmFSO5t7VMSfAf/FJKImAxBav8ooCHJXCJA==", - "dev": true, - "license": "ISC", - "dependencies": { - "postcss-selector-parser": "^7.0.0" - }, - "engines": { - "node": "^10 || ^12 || >= 14" - }, - "peerDependencies": { - "postcss": "^8.1.0" - } - }, - "node_modules/postcss-modules-values": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/postcss-modules-values/-/postcss-modules-values-4.0.0.tgz", - "integrity": "sha512-RDxHkAiEGI78gS2ofyvCsu7iycRv7oqw5xMWn9iMoR0N/7mf9D50ecQqUo5BZ9Zh2vH4bCUR/ktCqbB9m8vJjQ==", - "dev": true, - "license": "ISC", - "dependencies": { - "icss-utils": "^5.0.0" - }, - "engines": { - "node": "^10 || ^12 || >= 14" - }, - "peerDependencies": { - "postcss": "^8.1.0" + "node": ">=10" } }, "node_modules/postcss-nested": { @@ -16288,260 +11547,7 @@ "postcss": "^8.2.14" } }, - "node_modules/postcss-nested/node_modules/postcss-selector-parser": { - "version": "6.1.2", - "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-6.1.2.tgz", - "integrity": "sha512-Q8qQfPiZ+THO/3ZrOrO0cJJKfpYCagtMUkXbnEfmgUjwXg6z/WBeOyS9APBBPCTSiDV+s4SwQGu8yFsiMRIudg==", - "dev": true, - "license": "MIT", - "dependencies": { - "cssesc": "^3.0.0", - "util-deprecate": "^1.0.2" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/postcss-normalize-charset": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/postcss-normalize-charset/-/postcss-normalize-charset-7.0.0.tgz", - "integrity": "sha512-ABisNUXMeZeDNzCQxPxBCkXexvBrUHV+p7/BXOY+ulxkcjUZO0cp8ekGBwvIh2LbCwnWbyMPNJVtBSdyhM2zYQ==", - "dev": true, - "license": "MIT", - "engines": { - "node": "^18.12.0 || ^20.9.0 || >=22.0" - }, - "peerDependencies": { - "postcss": "^8.4.31" - } - }, - "node_modules/postcss-normalize-display-values": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/postcss-normalize-display-values/-/postcss-normalize-display-values-7.0.0.tgz", - "integrity": "sha512-lnFZzNPeDf5uGMPYgGOw7v0BfB45+irSRz9gHQStdkkhiM0gTfvWkWB5BMxpn0OqgOQuZG/mRlZyJxp0EImr2Q==", - "dev": true, - "license": "MIT", - "dependencies": { - "postcss-value-parser": "^4.2.0" - }, - "engines": { - "node": "^18.12.0 || ^20.9.0 || >=22.0" - }, - "peerDependencies": { - "postcss": "^8.4.31" - } - }, - "node_modules/postcss-normalize-positions": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/postcss-normalize-positions/-/postcss-normalize-positions-7.0.0.tgz", - "integrity": "sha512-I0yt8wX529UKIGs2y/9Ybs2CelSvItfmvg/DBIjTnoUSrPxSV7Z0yZ8ShSVtKNaV/wAY+m7bgtyVQLhB00A1NQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "postcss-value-parser": "^4.2.0" - }, - "engines": { - "node": "^18.12.0 || ^20.9.0 || >=22.0" - }, - "peerDependencies": { - "postcss": "^8.4.31" - } - }, - "node_modules/postcss-normalize-repeat-style": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/postcss-normalize-repeat-style/-/postcss-normalize-repeat-style-7.0.0.tgz", - "integrity": "sha512-o3uSGYH+2q30ieM3ppu9GTjSXIzOrRdCUn8UOMGNw7Af61bmurHTWI87hRybrP6xDHvOe5WlAj3XzN6vEO8jLw==", - "dev": true, - "license": "MIT", - "dependencies": { - "postcss-value-parser": "^4.2.0" - }, - "engines": { - "node": "^18.12.0 || ^20.9.0 || >=22.0" - }, - "peerDependencies": { - "postcss": "^8.4.31" - } - }, - "node_modules/postcss-normalize-string": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/postcss-normalize-string/-/postcss-normalize-string-7.0.0.tgz", - "integrity": "sha512-w/qzL212DFVOpMy3UGyxrND+Kb0fvCiBBujiaONIihq7VvtC7bswjWgKQU/w4VcRyDD8gpfqUiBQ4DUOwEJ6Qg==", - "dev": true, - "license": "MIT", - "dependencies": { - "postcss-value-parser": "^4.2.0" - }, - "engines": { - "node": "^18.12.0 || ^20.9.0 || >=22.0" - }, - "peerDependencies": { - "postcss": "^8.4.31" - } - }, - "node_modules/postcss-normalize-timing-functions": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/postcss-normalize-timing-functions/-/postcss-normalize-timing-functions-7.0.0.tgz", - "integrity": "sha512-tNgw3YV0LYoRwg43N3lTe3AEWZ66W7Dh7lVEpJbHoKOuHc1sLrzMLMFjP8SNULHaykzsonUEDbKedv8C+7ej6g==", - "dev": true, - "license": "MIT", - "dependencies": { - "postcss-value-parser": "^4.2.0" - }, - "engines": { - "node": "^18.12.0 || ^20.9.0 || >=22.0" - }, - "peerDependencies": { - "postcss": "^8.4.31" - } - }, - "node_modules/postcss-normalize-unicode": { - "version": "7.0.2", - "resolved": "https://registry.npmjs.org/postcss-normalize-unicode/-/postcss-normalize-unicode-7.0.2.tgz", - "integrity": "sha512-ztisabK5C/+ZWBdYC+Y9JCkp3M9qBv/XFvDtSw0d/XwfT3UaKeW/YTm/MD/QrPNxuecia46vkfEhewjwcYFjkg==", - "dev": true, - "license": "MIT", - "dependencies": { - "browserslist": "^4.23.3", - "postcss-value-parser": "^4.2.0" - }, - "engines": { - "node": "^18.12.0 || ^20.9.0 || >=22.0" - }, - "peerDependencies": { - "postcss": "^8.4.31" - } - }, - "node_modules/postcss-normalize-url": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/postcss-normalize-url/-/postcss-normalize-url-7.0.0.tgz", - "integrity": "sha512-+d7+PpE+jyPX1hDQZYG+NaFD+Nd2ris6r8fPTBAjE8z/U41n/bib3vze8x7rKs5H1uEw5ppe9IojewouHk0klQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "postcss-value-parser": "^4.2.0" - }, - "engines": { - "node": "^18.12.0 || ^20.9.0 || >=22.0" - }, - "peerDependencies": { - "postcss": "^8.4.31" - } - }, - "node_modules/postcss-normalize-whitespace": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/postcss-normalize-whitespace/-/postcss-normalize-whitespace-7.0.0.tgz", - "integrity": "sha512-37/toN4wwZErqohedXYqWgvcHUGlT8O/m2jVkAfAe9Bd4MzRqlBmXrJRePH0e9Wgnz2X7KymTgTOaaFizQe3AQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "postcss-value-parser": "^4.2.0" - }, - "engines": { - "node": "^18.12.0 || ^20.9.0 || >=22.0" - }, - "peerDependencies": { - "postcss": "^8.4.31" - } - }, - "node_modules/postcss-ordered-values": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/postcss-ordered-values/-/postcss-ordered-values-7.0.1.tgz", - "integrity": "sha512-irWScWRL6nRzYmBOXReIKch75RRhNS86UPUAxXdmW/l0FcAsg0lvAXQCby/1lymxn/o0gVa6Rv/0f03eJOwHxw==", - "dev": true, - "license": "MIT", - "dependencies": { - "cssnano-utils": "^5.0.0", - "postcss-value-parser": "^4.2.0" - }, - "engines": { - "node": "^18.12.0 || ^20.9.0 || >=22.0" - }, - "peerDependencies": { - "postcss": "^8.4.31" - } - }, - "node_modules/postcss-reduce-initial": { - "version": "7.0.2", - "resolved": "https://registry.npmjs.org/postcss-reduce-initial/-/postcss-reduce-initial-7.0.2.tgz", - "integrity": "sha512-pOnu9zqQww7dEKf62Nuju6JgsW2V0KRNBHxeKohU+JkHd/GAH5uvoObqFLqkeB2n20mr6yrlWDvo5UBU5GnkfA==", - "dev": true, - "license": "MIT", - "dependencies": { - "browserslist": "^4.23.3", - "caniuse-api": "^3.0.0" - }, - "engines": { - "node": "^18.12.0 || ^20.9.0 || >=22.0" - }, - "peerDependencies": { - "postcss": "^8.4.31" - } - }, - "node_modules/postcss-reduce-transforms": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/postcss-reduce-transforms/-/postcss-reduce-transforms-7.0.0.tgz", - "integrity": "sha512-pnt1HKKZ07/idH8cpATX/ujMbtOGhUfE+m8gbqwJE05aTaNw8gbo34a2e3if0xc0dlu75sUOiqvwCGY3fzOHew==", - "dev": true, - "license": "MIT", - "dependencies": { - "postcss-value-parser": "^4.2.0" - }, - "engines": { - "node": "^18.12.0 || ^20.9.0 || >=22.0" - }, - "peerDependencies": { - "postcss": "^8.4.31" - } - }, "node_modules/postcss-selector-parser": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-7.0.0.tgz", - "integrity": "sha512-9RbEr1Y7FFfptd/1eEdntyjMwLeghW1bHX9GWjXo19vx4ytPQhANltvVxDggzJl7mnWM+dX28kb6cyS/4iQjlQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "cssesc": "^3.0.0", - "util-deprecate": "^1.0.2" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/postcss-svgo": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/postcss-svgo/-/postcss-svgo-7.0.1.tgz", - "integrity": "sha512-0WBUlSL4lhD9rA5k1e5D8EN5wCEyZD6HJk0jIvRxl+FDVOMlJ7DePHYWGGVc5QRqrJ3/06FTXM0bxjmJpmTPSA==", - "dev": true, - "license": "MIT", - "dependencies": { - "postcss-value-parser": "^4.2.0", - "svgo": "^3.3.2" - }, - "engines": { - "node": "^18.12.0 || ^20.9.0 || >= 18" - }, - "peerDependencies": { - "postcss": "^8.4.31" - } - }, - "node_modules/postcss-unique-selectors": { - "version": "7.0.3", - "resolved": "https://registry.npmjs.org/postcss-unique-selectors/-/postcss-unique-selectors-7.0.3.tgz", - "integrity": "sha512-J+58u5Ic5T1QjP/LDV9g3Cx4CNOgB5vz+kM6+OxHHhFACdcDeKhBXjQmB7fnIZM12YSTvsL0Opwco83DmacW2g==", - "dev": true, - "license": "MIT", - "dependencies": { - "postcss-selector-parser": "^6.1.2" - }, - "engines": { - "node": "^18.12.0 || ^20.9.0 || >=22.0" - }, - "peerDependencies": { - "postcss": "^8.4.31" - } - }, - "node_modules/postcss-unique-selectors/node_modules/postcss-selector-parser": { "version": "6.1.2", "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-6.1.2.tgz", "integrity": "sha512-Q8qQfPiZ+THO/3ZrOrO0cJJKfpYCagtMUkXbnEfmgUjwXg6z/WBeOyS9APBBPCTSiDV+s4SwQGu8yFsiMRIudg==", @@ -16572,9 +11578,9 @@ } }, "node_modules/postgres-bytea": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/postgres-bytea/-/postgres-bytea-1.0.0.tgz", - "integrity": "sha512-xy3pmLuQqRBZBXDULy7KbaitYqLcmxigw14Q5sj8QBVLqEwXfeybIKVWiqAXTlcvdvb0+xkOtDbfQMOf4lST1w==", + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/postgres-bytea/-/postgres-bytea-1.0.1.tgz", + "integrity": "sha512-5+5HqXnsZPE65IJZSMkZtURARZelel2oXUEO8rH83VS/hxH5vv1uHquPg5wZs8yMAfdv971IU+kcPUczi7NVBQ==", "license": "MIT", "engines": { "node": ">=0.10.0" @@ -16612,9 +11618,9 @@ } }, "node_modules/prettier": { - "version": "3.4.2", - "resolved": "https://registry.npmjs.org/prettier/-/prettier-3.4.2.tgz", - "integrity": "sha512-e9MewbtFo+Fevyuxn/4rrcDAaq0IYxPGLvObpQjiZBMAzB9IGmzlnG9RZy3FFas+eBMu2vA0CszMeduow5dIuQ==", + "version": "3.8.3", + "resolved": "https://registry.npmjs.org/prettier/-/prettier-3.8.3.tgz", + "integrity": "sha512-7igPTM53cGHMW8xWuVTydi2KO233VFiTNyF5hLJqpilHfmn8C8gPf+PS7dUT64YcXFbiMGZxS9pCSxL/Dxm/Jw==", "dev": true, "license": "MIT", "bin": { @@ -16628,9 +11634,9 @@ } }, "node_modules/prettier-linter-helpers": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/prettier-linter-helpers/-/prettier-linter-helpers-1.0.0.tgz", - "integrity": "sha512-GbK2cP9nraSSUF9N2XwUwqfzlAFlMNYYl+ShE/V+H8a9uNl/oUqB1w2EL54Jh0OlyRSd8RfWYJ3coVS4TROP2w==", + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/prettier-linter-helpers/-/prettier-linter-helpers-1.0.1.tgz", + "integrity": "sha512-SxToR7P8Y2lWmv/kTzVLC1t/GDI2WGjMwNhLLE9qtH8Q13C+aEmuRlzDst4Up4s0Wc8sF2M+J57iB3cMLqftfg==", "dev": true, "license": "MIT", "dependencies": { @@ -16640,30 +11646,20 @@ "node": ">=6.0.0" } }, - "node_modules/pretty-error": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/pretty-error/-/pretty-error-4.0.0.tgz", - "integrity": "sha512-AoJ5YMAcXKYxKhuJGdcvse+Voc6v1RgnsR3nWcYU7q4t6z0Q6T86sv5Zq8VIRbOWWFpvdGE83LtdSMNd+6Y0xw==", - "dev": true, - "license": "MIT", - "dependencies": { - "lodash": "^4.17.20", - "renderkid": "^3.0.0" - } - }, "node_modules/pretty-format": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-29.7.0.tgz", - "integrity": "sha512-Pdlw/oPxN+aXdmM9R00JVC9WVFoCLTKJvDVLgmJ+qAffBMxsV85l/Lu7sNx4zSzPyoL2euImuEwHhOXdEgNFZQ==", + "version": "30.4.1", + "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-30.4.1.tgz", + "integrity": "sha512-K6KiKMHTL4jjX4u3Kir2EW07nRfcqVTXIImx50wbjHQTcZPgg+gjVeNTIT3l3L1Rd4UefxfogquC9J37SoFyyw==", "devOptional": true, "license": "MIT", "dependencies": { - "@jest/schemas": "^29.6.3", - "ansi-styles": "^5.0.0", - "react-is": "^18.0.0" + "@jest/schemas": "30.4.1", + "ansi-styles": "^5.2.0", + "react-is-18": "npm:react-is@^18.3.1", + "react-is-19": "npm:react-is@^19.2.5" }, "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" } }, "node_modules/pretty-format/node_modules/ansi-styles": { @@ -16689,9 +11685,9 @@ } }, "node_modules/pretty-ms": { - "version": "9.2.0", - "resolved": "https://registry.npmjs.org/pretty-ms/-/pretty-ms-9.2.0.tgz", - "integrity": "sha512-4yf0QO/sllf/1zbZWYnvWw3NxCQwLXKzIj0G849LSufP15BXKM0rbD2Z3wVnkMfjdn/CB0Dpp444gYAACdsplg==", + "version": "9.3.0", + "resolved": "https://registry.npmjs.org/pretty-ms/-/pretty-ms-9.3.0.tgz", + "integrity": "sha512-gjVS5hOP+M3wMm5nmNOucbIrqudzs9v/57bWRHQWLYklXqoXKrVfYW2W9+glfGsqtPgpiz5WwyEEB+ksXIx3gQ==", "devOptional": true, "license": "MIT", "dependencies": { @@ -16710,16 +11706,6 @@ "integrity": "sha512-dKp+C4iXWK4vVYZmYSd0KBH5F/h1HoZRsbJ82AVKRO3PEo8L4lBS/vLwhVtpwwuYcoIsVY+1JYKR268yn480uQ==", "license": "Unlicense" }, - "node_modules/process": { - "version": "0.11.10", - "resolved": "https://registry.npmjs.org/process/-/process-0.11.10.tgz", - "integrity": "sha512-cdGef/drWFoydD1JsMzuFf8100nZl+GT+yacc2bEced5f9Rjk4z+WtFUTBu9PhOi9j/jfmBPu0mMEY4wIdAF8A==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 0.6.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", @@ -16728,16 +11714,25 @@ "license": "MIT" }, "node_modules/process-warning": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/process-warning/-/process-warning-1.0.0.tgz", - "integrity": "sha512-du4wfLyj4yCZq1VupnVSZmRsPJsNuxoDQFdCFHLaYiEbFBD7QE0a+I4D7hOxrVnh78QE/YipFAj9lXHiXocV+Q==", - "license": "MIT", - "peer": true + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/process-warning/-/process-warning-5.0.0.tgz", + "integrity": "sha512-a39t9ApHNx2L4+HBnQKqxxHNs1r7KF+Intd8Q/g1bUh6q0WIp9voPXJ/x0j+ZL45KF1pJd9+q2jLIRMfvEshkA==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/fastify" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/fastify" + } + ], + "license": "MIT" }, "node_modules/property-information": { - "version": "6.5.0", - "resolved": "https://registry.npmjs.org/property-information/-/property-information-6.5.0.tgz", - "integrity": "sha512-PgTgs/BlvHxOu8QuEN7wi5A0OmXaBcHpmCSTehcs6Uuu9IkDIEo13Hy7n898RHfrQ49vKCoGeWZSaAK01nwVig==", + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/property-information/-/property-information-7.2.0.tgz", + "integrity": "sha512-IAtzIB6sUiWaJYrX9smp3V46pBGbBeLFRGdh25kg1334VcBlD8HzhPeNIWQH9zhGmo2itIe25EHt9dQP7G5hmg==", "license": "MIT", "funding": { "type": "github", @@ -16758,15 +11753,18 @@ } }, "node_modules/proxy-from-env": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/proxy-from-env/-/proxy-from-env-1.1.0.tgz", - "integrity": "sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg==", - "license": "MIT" + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/proxy-from-env/-/proxy-from-env-2.1.0.tgz", + "integrity": "sha512-cJ+oHTW1VAEa8cJslgmUZrc+sjRKgAKl3Zyse6+PV38hZe/V6Z14TbCuXcan9F9ghlz4QrFr2c92TNF82UkYHA==", + "license": "MIT", + "engines": { + "node": ">=10" + } }, "node_modules/pump": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/pump/-/pump-3.0.2.tgz", - "integrity": "sha512-tUPXtzlGM8FE3P0ZL6DVs/3P58k9nk8/jZeQCurTJylQA8qFYzHFfhBJkuqyE0FifOsQ0uKWekiZ5g8wtr28cw==", + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/pump/-/pump-3.0.4.tgz", + "integrity": "sha512-VS7sjc6KR7e1ukRFhQSY5LM2uBWAUPiOPa/A3mkKmiMwSmRFUITt0xuj+/lesgnCv+dPIEYlkzrcyXgquIHMcA==", "dev": true, "license": "MIT", "dependencies": { @@ -16784,6 +11782,26 @@ "node": ">=6" } }, + "node_modules/pvtsutils": { + "version": "1.3.6", + "resolved": "https://registry.npmjs.org/pvtsutils/-/pvtsutils-1.3.6.tgz", + "integrity": "sha512-PLgQXQ6H2FWCaeRak8vvk1GW462lMxB5s3Jm673N82zI4vqtVUPuZdffdZbPDFRoU8kAhItWFtPCWiPpp4/EDg==", + "dev": true, + "license": "MIT", + "dependencies": { + "tslib": "^2.8.1" + } + }, + "node_modules/pvutils": { + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/pvutils/-/pvutils-1.1.5.tgz", + "integrity": "sha512-KTqnxsgGiQ6ZAzZCVlJH5eOjSnvlyEgx1m8bkRJfOhmGRqfo5KLvmAlACQkrjEtOQ4B7wF9TdSLIs9O90MX9xA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=16.0.0" + } + }, "node_modules/qrcode": { "version": "1.5.4", "resolved": "https://registry.npmjs.org/qrcode/-/qrcode-1.5.4.tgz", @@ -16802,12 +11820,12 @@ } }, "node_modules/qs": { - "version": "6.13.1", - "resolved": "https://registry.npmjs.org/qs/-/qs-6.13.1.tgz", - "integrity": "sha512-EJPeIn0CYrGu+hli1xilKAPXODtJ12T0sP63Ijx2/khC2JtuaN3JyNIpvmnkmaEtha9ocbG4A4cMcr+TvqvwQg==", + "version": "6.15.2", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.15.2.tgz", + "integrity": "sha512-Rzq0KEyX/w/tEybncDgdkZrJgVUsUMk3xjh3t5bv3S1HTAtg+uOYt72+ZfwiQwKdysThkTBdL/rTi6HDmX9Ddw==", "license": "BSD-3-Clause", "dependencies": { - "side-channel": "^1.0.6" + "side-channel": "^1.1.0" }, "engines": { "node": ">=0.6" @@ -16816,6 +11834,23 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/quansync": { + "version": "0.2.11", + "resolved": "https://registry.npmjs.org/quansync/-/quansync-0.2.11.tgz", + "integrity": "sha512-AifT7QEbW9Nri4tAwR5M/uzpBuqfZf+zwaEM/QkzEjj7NBuFD2rBuy0K3dE+8wltbezDV7JMA0WfnCPYRSYbXA==", + "devOptional": true, + "funding": [ + { + "type": "individual", + "url": "https://github.com/sponsors/antfu" + }, + { + "type": "individual", + "url": "https://github.com/sponsors/sxzz" + } + ], + "license": "MIT" + }, "node_modules/queue-microtask": { "version": "1.2.3", "resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz", @@ -16864,16 +11899,6 @@ "node": ">= 0.8" } }, - "node_modules/randombytes": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/randombytes/-/randombytes-2.1.0.tgz", - "integrity": "sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "safe-buffer": "^5.1.0" - } - }, "node_modules/range-parser": { "version": "1.2.1", "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.1.tgz", @@ -16884,27 +11909,36 @@ } }, "node_modules/raw-body": { - "version": "2.5.2", - "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.5.2.tgz", - "integrity": "sha512-8zGqypfENjCIqGhgXToC8aB2r7YrBX+AQAfIPs/Mlk+BtPTztOvTS01NRW/3Eh60J+a48lt8qsCzirQ6loCVfA==", + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-3.0.2.tgz", + "integrity": "sha512-K5zQjDllxWkf7Z5xJdV0/B0WTNqx6vxG70zJE4N0kBs4LovmEYWJzQGxC9bS9RAKu3bgM40lrd5zoLJ12MQ5BA==", "license": "MIT", "dependencies": { - "bytes": "3.1.2", - "http-errors": "2.0.0", - "iconv-lite": "0.4.24", - "unpipe": "1.0.0" + "bytes": "~3.1.2", + "http-errors": "~2.0.1", + "iconv-lite": "~0.7.0", + "unpipe": "~1.0.0" }, "engines": { - "node": ">= 0.8" + "node": ">= 0.10" } }, - "node_modules/react-is": { + "node_modules/react-is-18": { + "name": "react-is", "version": "18.3.1", "resolved": "https://registry.npmjs.org/react-is/-/react-is-18.3.1.tgz", "integrity": "sha512-/LLMVyas0ljjAtoYiPqYiL8VWXzUUdThrmU5+n20DZv+a+ClRoevUzw5JxU+Ieh5/c87ytoTBV9G1FiKfNJdmg==", "devOptional": true, "license": "MIT" }, + "node_modules/react-is-19": { + "name": "react-is", + "version": "19.2.7", + "resolved": "https://registry.npmjs.org/react-is/-/react-is-19.2.7.tgz", + "integrity": "sha512-kZFnouyVv7eP/Phmrlo9FK+zcAdriZJvzxXHF1Sl1P377WSGe2G/JxVolhTrB/jeV47lKImhNUsijjHAAbcl/A==", + "devOptional": true, + "license": "MIT" + }, "node_modules/read-cache": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/read-cache/-/read-cache-1.0.0.tgz", @@ -16930,13 +11964,13 @@ } }, "node_modules/readdirp": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-4.0.2.tgz", - "integrity": "sha512-yDMz9g+VaZkqBYS/ozoBJwaBhTbZo3UNYQHNRw1D3UFQB8oHB4uS/tAODO+ZLjGWmUbKnIlOWO+aaIiAxrUWHA==", + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-4.1.2.tgz", + "integrity": "sha512-GDhwkLfywWL2s6vEjyhri+eXmfH6j1L7JE27WhqLeYzoh/A3DBaYGEj2H/HFZCn/kMfim73FXxEJTw06WtxQwg==", "devOptional": true, "license": "MIT", "engines": { - "node": ">= 14.16.0" + "node": ">= 14.18.0" }, "funding": { "type": "individual", @@ -16965,20 +11999,19 @@ } }, "node_modules/redis": { - "version": "4.7.0", - "resolved": "https://registry.npmjs.org/redis/-/redis-4.7.0.tgz", - "integrity": "sha512-zvmkHEAdGMn+hMRXuMBtu4Vo5P6rHQjLoHftu+lBqq8ZTA3RCVC/WzD790bkKKiNFp7d5/9PcSD19fJyyRvOdQ==", + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/redis/-/redis-6.0.0.tgz", + "integrity": "sha512-n9Thfc39OXleEoPT2k5gwKsqY+HfCww3YS71ofcr9KKbkn89bpjU9dToIlD+JRdM3/GYQkwMtVgTxLyed+LptQ==", "license": "MIT", - "workspaces": [ - "./packages/*" - ], "dependencies": { - "@redis/bloom": "1.2.0", - "@redis/client": "1.6.0", - "@redis/graph": "1.1.1", - "@redis/json": "1.0.7", - "@redis/search": "1.2.0", - "@redis/time-series": "1.1.0" + "@redis/bloom": "6.0.0", + "@redis/client": "6.0.0", + "@redis/json": "6.0.0", + "@redis/search": "6.0.0", + "@redis/time-series": "6.0.0" + }, + "engines": { + "node": ">= 20.0.0" } }, "node_modules/redis-errors": { @@ -17008,168 +12041,6 @@ "integrity": "sha512-urBwgfrvVP/eAyXx4hluJivBKzuEbSQs9rKWCrCkbSxNv8mxPcUZKeuoF3Uy4mJl3Lwprp6yy5/39VWigZ4K6Q==", "license": "Apache-2.0" }, - "node_modules/reflect.getprototypeof": { - "version": "1.0.10", - "resolved": "https://registry.npmjs.org/reflect.getprototypeof/-/reflect.getprototypeof-1.0.10.tgz", - "integrity": "sha512-00o4I+DVrefhv+nX0ulyi3biSHCPDe+yLv5o/p6d/UVlirijB8E16FtfwSAi4g3tcqrQ4lRAqQSoFEZJehYEcw==", - "dev": true, - "license": "MIT", - "dependencies": { - "call-bind": "^1.0.8", - "define-properties": "^1.2.1", - "es-abstract": "^1.23.9", - "es-errors": "^1.3.0", - "es-object-atoms": "^1.0.0", - "get-intrinsic": "^1.2.7", - "get-proto": "^1.0.1", - "which-builtin-type": "^1.2.1" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/regenerate": { - "version": "1.4.2", - "resolved": "https://registry.npmjs.org/regenerate/-/regenerate-1.4.2.tgz", - "integrity": "sha512-zrceR/XhGYU/d/opr2EKO7aRHUeiBI8qjtfHqADTwZd6Szfy16la6kqD0MIUs5z5hx6AaKa+PixpPrR289+I0A==", - "dev": true, - "license": "MIT" - }, - "node_modules/regenerate-unicode-properties": { - "version": "10.2.0", - "resolved": "https://registry.npmjs.org/regenerate-unicode-properties/-/regenerate-unicode-properties-10.2.0.tgz", - "integrity": "sha512-DqHn3DwbmmPVzeKj9woBadqmXxLvQoQIwu7nopMc72ztvxVmVk2SBhSnx67zuye5TP+lJsb/TBQsjLKhnDf3MA==", - "dev": true, - "license": "MIT", - "dependencies": { - "regenerate": "^1.4.2" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/regenerator-runtime": { - "version": "0.14.1", - "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.14.1.tgz", - "integrity": "sha512-dYnhHh0nJoMfnkZs6GmmhFknAGRrLznOu5nc9ML+EJxGvrx6H7teuevqVqCuPcPK//3eDrrjQhehXVx9cnkGdw==", - "dev": true, - "license": "MIT" - }, - "node_modules/regenerator-transform": { - "version": "0.15.2", - "resolved": "https://registry.npmjs.org/regenerator-transform/-/regenerator-transform-0.15.2.tgz", - "integrity": "sha512-hfMp2BoF0qOk3uc5V20ALGDS2ddjQaLrdl7xrGXvAIow7qeWRM2VA2HuCHkUKk9slq3VwEwLNK3DFBqDfPGYtg==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/runtime": "^7.8.4" - } - }, - "node_modules/regex-parser": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/regex-parser/-/regex-parser-2.3.0.tgz", - "integrity": "sha512-TVILVSz2jY5D47F4mA4MppkBrafEaiUWJO/TcZHEIuI13AqoZMkK1WMA4Om1YkYbTx+9Ki1/tSUXbceyr9saRg==", - "dev": true, - "license": "MIT" - }, - "node_modules/regexp.prototype.flags": { - "version": "1.5.4", - "resolved": "https://registry.npmjs.org/regexp.prototype.flags/-/regexp.prototype.flags-1.5.4.tgz", - "integrity": "sha512-dYqgNSZbDwkaJ2ceRd9ojCGjBq+mOm9LmtXnAnEGyHhN/5R7iDW2TRw3h+o/jCFxus3P2LfWIIiwowAjANm7IA==", - "dev": true, - "license": "MIT", - "dependencies": { - "call-bind": "^1.0.8", - "define-properties": "^1.2.1", - "es-errors": "^1.3.0", - "get-proto": "^1.0.1", - "gopd": "^1.2.0", - "set-function-name": "^2.0.2" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/regexpu-core": { - "version": "6.2.0", - "resolved": "https://registry.npmjs.org/regexpu-core/-/regexpu-core-6.2.0.tgz", - "integrity": "sha512-H66BPQMrv+V16t8xtmq+UC0CBpiTBA60V8ibS1QVReIp8T1z8hwFxqcGzm9K6lgsN7sB5edVH8a+ze6Fqm4weA==", - "dev": true, - "license": "MIT", - "dependencies": { - "regenerate": "^1.4.2", - "regenerate-unicode-properties": "^10.2.0", - "regjsgen": "^0.8.0", - "regjsparser": "^0.12.0", - "unicode-match-property-ecmascript": "^2.0.0", - "unicode-match-property-value-ecmascript": "^2.1.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/regjsgen": { - "version": "0.8.0", - "resolved": "https://registry.npmjs.org/regjsgen/-/regjsgen-0.8.0.tgz", - "integrity": "sha512-RvwtGe3d7LvWiDQXeQw8p5asZUmfU1G/l6WbUXeHta7Y2PEIvBTwH6E2EfmYUK8pxcxEdEmaomqyp0vZZ7C+3Q==", - "dev": true, - "license": "MIT" - }, - "node_modules/regjsparser": { - "version": "0.12.0", - "resolved": "https://registry.npmjs.org/regjsparser/-/regjsparser-0.12.0.tgz", - "integrity": "sha512-cnE+y8bz4NhMjISKbgeVJtqNbtf5QpjZP+Bslo+UqkIt9QPnX9q095eiRRASJG1/tz6dlNr6Z5NsBiWYokp6EQ==", - "dev": true, - "license": "BSD-2-Clause", - "dependencies": { - "jsesc": "~3.0.2" - }, - "bin": { - "regjsparser": "bin/parser" - } - }, - "node_modules/regjsparser/node_modules/jsesc": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-3.0.2.tgz", - "integrity": "sha512-xKqzzWXDttJuOcawBt4KnKHHIf5oQ/Cxax+0PWFG+DFDgHNAdi+TXECADI+RYiFUMmx8792xsMbbgXj4CwnP4g==", - "dev": true, - "license": "MIT", - "bin": { - "jsesc": "bin/jsesc" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/renderkid": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/renderkid/-/renderkid-3.0.0.tgz", - "integrity": "sha512-q/7VIQA8lmM1hF+jn+sFSPWGlMkSAeNYcPLmDQx2zzuiDfaLrOmumR8iaUKlenFgh0XRPIUeSPlH3A+AW3Z5pg==", - "dev": true, - "license": "MIT", - "dependencies": { - "css-select": "^4.1.3", - "dom-converter": "^0.2.0", - "htmlparser2": "^6.1.0", - "lodash": "^4.17.21", - "strip-ansi": "^6.0.1" - } - }, - "node_modules/require-all": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/require-all/-/require-all-3.0.0.tgz", - "integrity": "sha512-jPGN876lc5exWYrMcgZSd7U42P0PmVQzxnQB13fCSzmyGnqQWW4WUz5DosZ/qe24hz+5o9lSvW2epBNZ1xa6Fw==", - "license": "MIT", - "engines": { - "node": ">= 0.8" - } - }, "node_modules/require-directory": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", @@ -17203,12 +12074,13 @@ "license": "MIT" }, "node_modules/resolve": { - "version": "1.22.10", - "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.10.tgz", - "integrity": "sha512-NPRy+/ncIMeDlTAsuqwKIiferiawhefFJtkNSW0qZJEqMEb+qBt/77B/jGeeek+F0uOeN05CDa6HXbbIgtVX4w==", + "version": "1.22.12", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.12.tgz", + "integrity": "sha512-TyeJ1zif53BPfHootBGwPRYT1RUt6oGWsaQr8UyZW/eAm9bKoijtvruSDEmZHm92CwS9nj7/fWttqPCgzep8CA==", "license": "MIT", "dependencies": { - "is-core-module": "^2.16.0", + "es-errors": "^1.3.0", + "is-core-module": "^2.16.1", "path-parse": "^1.0.7", "supports-preserve-symlinks-flag": "^1.0.0" }, @@ -17228,31 +12100,6 @@ "integrity": "sha512-0a1F4l73/ZFZOakJnQ3FvkJ2+gSTQWz/r2KE5OdDY0TxPm5h4GkqkWWfM47T7HsbnOtcJVEF4epCVy6u7Q3K+g==", "license": "MIT" }, - "node_modules/resolve-cwd": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/resolve-cwd/-/resolve-cwd-3.0.0.tgz", - "integrity": "sha512-OrZaX2Mb+rJCpH/6CpSqt9xFVpN++x01XnN2ie9g6P5/3xelLAkXWVADpdz1IHD/KFfEXyE6V0U01OQ3UO2rEg==", - "dev": true, - "license": "MIT", - "peer": true, - "dependencies": { - "resolve-from": "^5.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/resolve-cwd/node_modules/resolve-from": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz", - "integrity": "sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==", - "dev": true, - "license": "MIT", - "peer": true, - "engines": { - "node": ">=8" - } - }, "node_modules/resolve-from": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz", @@ -17263,40 +12110,16 @@ "node": ">=4" } }, - "node_modules/resolve-url-loader": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/resolve-url-loader/-/resolve-url-loader-5.0.0.tgz", - "integrity": "sha512-uZtduh8/8srhBoMx//5bwqjQ+rfYOUq8zC9NrMUGtjBiGTtFJM42s58/36+hTqeqINcnYe08Nj3LkK9lW4N8Xg==", - "dev": true, - "license": "MIT", - "dependencies": { - "adjust-sourcemap-loader": "^4.0.0", - "convert-source-map": "^1.7.0", - "loader-utils": "^2.0.0", - "postcss": "^8.2.14", - "source-map": "0.6.1" - }, - "engines": { - "node": ">=12" - } - }, - "node_modules/resolve-url-loader/node_modules/convert-source-map": { - "version": "1.9.0", - "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.9.0.tgz", - "integrity": "sha512-ASFBup0Mz1uyiIjANan1jzLQami9z1PoYSZCiiYW2FczPbenXc45FZdBZLzOT+r6+iciuEModtmCti+hjaAk0A==", - "dev": true, - "license": "MIT" - }, "node_modules/responselike": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/responselike/-/responselike-3.0.0.tgz", - "integrity": "sha512-40yHxbNcl2+rzXvZuVkrYohathsSJlMTXKryG5y8uciHv1+xDLHQpgjG64JUO9nrEq2jGLH6IZ8BcZyw3wrweg==", + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/responselike/-/responselike-4.0.2.tgz", + "integrity": "sha512-cGk8IbWEAnaCpdAt1BHzJ3Ahz5ewDJa0KseTsE3qIRMJ3C698W8psM7byCeWVpd/Ha7FUYzuRVzXoKoM6nRUbA==", "license": "MIT", "dependencies": { "lowercase-keys": "^3.0.0" }, "engines": { - "node": ">=14.16" + "node": ">=20" }, "funding": { "url": "https://github.com/sponsors/sindresorhus" @@ -17329,15 +12152,22 @@ } }, "node_modules/reusify": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.0.4.tgz", - "integrity": "sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==", + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.1.0.tgz", + "integrity": "sha512-g6QUff04oZpHs0eG5p83rFLhHeV00ug/Yf9nZM6fLeUrPguBTkTQOdpAWWspMh55TZfVQDPaN3NQJfbVRAxdIw==", "license": "MIT", "engines": { "iojs": ">=1.0.0", "node": ">=0.10.0" } }, + "node_modules/rfdc": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/rfdc/-/rfdc-1.4.1.tgz", + "integrity": "sha512-q1b3N5QkRUWUl7iyylaaj3kOpIT0N2i9MqIEQXP73GVsN9cw3fdx8X63cEmWhJGi2PPCF23Ijp7ktmd39rawIA==", + "dev": true, + "license": "MIT" + }, "node_modules/rimraf": { "version": "3.0.2", "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", @@ -17361,13 +12191,12 @@ "license": "MIT" }, "node_modules/rollup": { - "version": "4.30.1", - "resolved": "https://registry.npmjs.org/rollup/-/rollup-4.30.1.tgz", - "integrity": "sha512-mlJ4glW020fPuLi7DkM/lN97mYEZGWeqBnrljzN0gs7GLctqX3lNWxKQ7Gl712UAX+6fog/L3jh4gb7R6aVi3w==", + "version": "4.61.1", + "resolved": "https://registry.npmjs.org/rollup/-/rollup-4.61.1.tgz", + "integrity": "sha512-I4KW6iuRpuu2uHBLraZ1wNZe0DP7lnRha+VJ9tNaYVaVgKhW0aI3h4RYnoRPeql0flHm/Co55b7snEDcOfOJrA==", "license": "MIT", - "peer": true, "dependencies": { - "@types/estree": "1.0.6" + "@types/estree": "1.0.9" }, "bin": { "rollup": "dist/bin/rollup" @@ -17377,32 +12206,38 @@ "npm": ">=8.0.0" }, "optionalDependencies": { - "@rollup/rollup-android-arm-eabi": "4.30.1", - "@rollup/rollup-android-arm64": "4.30.1", - "@rollup/rollup-darwin-arm64": "4.30.1", - "@rollup/rollup-darwin-x64": "4.30.1", - "@rollup/rollup-freebsd-arm64": "4.30.1", - "@rollup/rollup-freebsd-x64": "4.30.1", - "@rollup/rollup-linux-arm-gnueabihf": "4.30.1", - "@rollup/rollup-linux-arm-musleabihf": "4.30.1", - "@rollup/rollup-linux-arm64-gnu": "4.30.1", - "@rollup/rollup-linux-arm64-musl": "4.30.1", - "@rollup/rollup-linux-loongarch64-gnu": "4.30.1", - "@rollup/rollup-linux-powerpc64le-gnu": "4.30.1", - "@rollup/rollup-linux-riscv64-gnu": "4.30.1", - "@rollup/rollup-linux-s390x-gnu": "4.30.1", - "@rollup/rollup-linux-x64-gnu": "4.30.1", - "@rollup/rollup-linux-x64-musl": "4.30.1", - "@rollup/rollup-win32-arm64-msvc": "4.30.1", - "@rollup/rollup-win32-ia32-msvc": "4.30.1", - "@rollup/rollup-win32-x64-msvc": "4.30.1", + "@rollup/rollup-android-arm-eabi": "4.61.1", + "@rollup/rollup-android-arm64": "4.61.1", + "@rollup/rollup-darwin-arm64": "4.61.1", + "@rollup/rollup-darwin-x64": "4.61.1", + "@rollup/rollup-freebsd-arm64": "4.61.1", + "@rollup/rollup-freebsd-x64": "4.61.1", + "@rollup/rollup-linux-arm-gnueabihf": "4.61.1", + "@rollup/rollup-linux-arm-musleabihf": "4.61.1", + "@rollup/rollup-linux-arm64-gnu": "4.61.1", + "@rollup/rollup-linux-arm64-musl": "4.61.1", + "@rollup/rollup-linux-loong64-gnu": "4.61.1", + "@rollup/rollup-linux-loong64-musl": "4.61.1", + "@rollup/rollup-linux-ppc64-gnu": "4.61.1", + "@rollup/rollup-linux-ppc64-musl": "4.61.1", + "@rollup/rollup-linux-riscv64-gnu": "4.61.1", + "@rollup/rollup-linux-riscv64-musl": "4.61.1", + "@rollup/rollup-linux-s390x-gnu": "4.61.1", + "@rollup/rollup-linux-x64-gnu": "4.61.1", + "@rollup/rollup-linux-x64-musl": "4.61.1", + "@rollup/rollup-openbsd-x64": "4.61.1", + "@rollup/rollup-openharmony-arm64": "4.61.1", + "@rollup/rollup-win32-arm64-msvc": "4.61.1", + "@rollup/rollup-win32-ia32-msvc": "4.61.1", + "@rollup/rollup-win32-x64-gnu": "4.61.1", + "@rollup/rollup-win32-x64-msvc": "4.61.1", "fsevents": "~2.3.2" } }, "node_modules/run-applescript": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/run-applescript/-/run-applescript-7.0.0.tgz", - "integrity": "sha512-9by4Ij99JUr/MCFBUkDKLWK3G9HVXmabKz9U5MlIAIuvuzkiOicRYs8XJLxX+xahD+mLiiCYDqF9dKAgtzKP1A==", + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/run-applescript/-/run-applescript-7.1.0.tgz", + "integrity": "sha512-DPe5pVFaAsinSaV6QjQ6gdiedWDcRCbUuiQfQa2wmWV7+xC9bGulGI8+TdRmoFkAPaBXk8CrAbnlY2ISniJ47Q==", "dev": true, "license": "MIT", "engines": { @@ -17436,67 +12271,26 @@ "queue-microtask": "^1.2.2" } }, - "node_modules/safe-array-concat": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/safe-array-concat/-/safe-array-concat-1.1.3.tgz", - "integrity": "sha512-AURm5f0jYEOydBj7VQlVvDrjeFgthDdEF5H1dP+6mNpoXOMo1quQqJ4wvJDyRZ9+pO3kGWoOdmV08cSv2aJV6Q==", - "dev": true, - "license": "MIT", - "dependencies": { - "call-bind": "^1.0.8", - "call-bound": "^1.0.2", - "get-intrinsic": "^1.2.6", - "has-symbols": "^1.1.0", - "isarray": "^2.0.5" - }, - "engines": { - "node": ">=0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, "node_modules/safe-buffer": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", - "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", + "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], "license": "MIT" }, - "node_modules/safe-push-apply": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/safe-push-apply/-/safe-push-apply-1.0.0.tgz", - "integrity": "sha512-iKE9w/Z7xCzUMIZqdBsp6pEQvwuEebH4vdpjcDWnyzaI6yl6O9FHvVpmGelvEHNsoY6wGblkxR6Zty/h00WiSA==", - "dev": true, - "license": "MIT", - "dependencies": { - "es-errors": "^1.3.0", - "isarray": "^2.0.5" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/safe-regex-test": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/safe-regex-test/-/safe-regex-test-1.1.0.tgz", - "integrity": "sha512-x/+Cz4YrimQxQccJf5mKEbIa1NzeCRNI5Ecl/ekmlYaampdNLPalVyIcCZNNH3MvmqBugV5TMYZXv0ljslUlaw==", - "dev": true, - "license": "MIT", - "dependencies": { - "call-bound": "^1.0.2", - "es-errors": "^1.3.0", - "is-regex": "^1.2.1" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, "node_modules/safe-stable-stringify": { "version": "2.5.0", "resolved": "https://registry.npmjs.org/safe-stable-stringify/-/safe-stable-stringify-2.5.0.tgz", @@ -17521,21 +12315,10 @@ "axios": "^1.5.1" } }, - "node_modules/saxon-js/node_modules/axios": { - "version": "1.7.9", - "resolved": "https://registry.npmjs.org/axios/-/axios-1.7.9.tgz", - "integrity": "sha512-LhLcE7Hbiryz8oMDdDptSrWowmB4Bl6RCt6sIJKpRB4XtVf0iEgewX3au/pJqm+Py1kCASkb/FFKjxQaLtxJvw==", - "license": "MIT", - "dependencies": { - "follow-redirects": "^1.15.6", - "form-data": "^4.0.0", - "proxy-from-env": "^1.1.0" - } - }, "node_modules/schema-utils": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-4.3.0.tgz", - "integrity": "sha512-Gf9qqc58SpCA/xdziiHz35F4GNIWYWZrEshUc/G/r5BnLph6xpKuLeoJoQuj5WfBIx/eQLf+hmVPYHaxJu7V2g==", + "version": "4.3.3", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-4.3.3.tgz", + "integrity": "sha512-eflK8wEtyOE6+hsaRVPxvUKYCpRgzLqDTb8krvAsRIwOGlHoSgYLgBXoubGgLd2fT41/OUYdb48v4k4WWHQurA==", "dev": true, "license": "MIT", "dependencies": { @@ -17553,9 +12336,9 @@ } }, "node_modules/schema-utils/node_modules/ajv": { - "version": "8.17.1", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.17.1.tgz", - "integrity": "sha512-B/gBuNg5SiMTrPkC+A2+cW0RszwxYmn6VYxB/inlBStS5nx6xHIt/ehKRhIMhqusl7a8LjQoZnjCs5vhwxOQ1g==", + "version": "8.20.0", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.20.0.tgz", + "integrity": "sha512-Thbli+OlOj+iMPYFBVBfJ3OmCAnaSyNn4M1vz9T6Gka5Jt9ba/HIR56joy65tY6kx/FCF5VXNB819Y7/GUrBGA==", "dev": true, "license": "MIT", "dependencies": { @@ -17603,50 +12386,47 @@ "license": "MIT" }, "node_modules/selfsigned": { - "version": "2.4.1", - "resolved": "https://registry.npmjs.org/selfsigned/-/selfsigned-2.4.1.tgz", - "integrity": "sha512-th5B4L2U+eGLq1TVh7zNRGBapioSORUeymIydxgFpwww9d2qyKvtuPU2jJuHvYAwwqi2Y596QBL3eEqcPEYL8Q==", + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/selfsigned/-/selfsigned-5.5.0.tgz", + "integrity": "sha512-ftnu3TW4+3eBfLRFnDEkzGxSF/10BJBkaLJuBHZX0kiPS7bRdlpZGu6YGt4KngMkdTwJE6MbjavFpqHvqVt+Ew==", "dev": true, "license": "MIT", "dependencies": { - "@types/node-forge": "^1.3.0", - "node-forge": "^1" + "@peculiar/x509": "^1.14.2", + "pkijs": "^3.3.3" }, "engines": { - "node": ">=10" + "node": ">=18" } }, "node_modules/semver": { - "version": "7.6.3", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.3.tgz", - "integrity": "sha512-oVekP1cKtI+CTDvHWYFUcMtsK/00wmAEfyqKfNdARm8u1wNVhSgaX7A8d4UuIlUI5e84iEwOhs7ZPYRmzU9U6A==", + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", "license": "ISC", "bin": { "semver": "bin/semver.js" - }, - "engines": { - "node": ">=10" } }, "node_modules/send": { - "version": "0.19.0", - "resolved": "https://registry.npmjs.org/send/-/send-0.19.0.tgz", - "integrity": "sha512-dW41u5VfLXu8SJh5bwRmyYUbAoSB3c9uQh6L8h/KtsFREPWpbX1lrljJo186Jc4nmci/sGUZ9a0a0J2zgfq2hw==", + "version": "0.19.2", + "resolved": "https://registry.npmjs.org/send/-/send-0.19.2.tgz", + "integrity": "sha512-VMbMxbDeehAxpOtWJXlcUS5E8iXh6QmN+BkRX1GARS3wRaXEEgzCcB10gTQazO42tpNIya8xIyNx8fll1OFPrg==", "license": "MIT", "dependencies": { "debug": "2.6.9", "depd": "2.0.0", "destroy": "1.2.0", - "encodeurl": "~1.0.2", + "encodeurl": "~2.0.0", "escape-html": "~1.0.3", "etag": "~1.8.1", - "fresh": "0.5.2", - "http-errors": "2.0.0", + "fresh": "~0.5.2", + "http-errors": "~2.0.1", "mime": "1.6.0", "ms": "2.1.3", - "on-finished": "2.4.1", + "on-finished": "~2.4.1", "range-parser": "~1.2.1", - "statuses": "2.0.1" + "statuses": "~2.0.2" }, "engines": { "node": ">= 0.8.0" @@ -17679,73 +12459,56 @@ "node": ">=4" } }, - "node_modules/sentence-case": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/sentence-case/-/sentence-case-3.0.4.tgz", - "integrity": "sha512-8LS0JInaQMCRoQ7YUytAo/xUu5W2XnQxV2HI/6uM6U7CITS1RqPElr30V6uIqyMKM9lJGRVFy5/4CuzcixNYSg==", - "license": "MIT", - "dependencies": { - "no-case": "^3.0.4", - "tslib": "^2.0.3", - "upper-case-first": "^2.0.2" - } - }, "node_modules/serialize-error": { - "version": "11.0.3", - "resolved": "https://registry.npmjs.org/serialize-error/-/serialize-error-11.0.3.tgz", - "integrity": "sha512-2G2y++21dhj2R7iHAdd0FIzjGwuKZld+7Pl/bTU6YIkrC2ZMbVUjm+luj6A6V34Rv9XfKJDKpTWu9W4Gse1D9g==", + "version": "12.0.0", + "resolved": "https://registry.npmjs.org/serialize-error/-/serialize-error-12.0.0.tgz", + "integrity": "sha512-ZYkZLAvKTKQXWuh5XpBw7CdbSzagarX39WyZ2H07CDLC5/KfsRGlIXV8d4+tfqX1M7916mRqR1QfNHSij+c9Pw==", "devOptional": true, "license": "MIT", "dependencies": { - "type-fest": "^2.12.2" + "type-fest": "^4.31.0" }, "engines": { - "node": ">=14.16" + "node": ">=18" }, "funding": { "url": "https://github.com/sponsors/sindresorhus" } }, "node_modules/serialize-error/node_modules/type-fest": { - "version": "2.19.0", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-2.19.0.tgz", - "integrity": "sha512-RAH822pAdBgcNMAfWnCBU3CFZcfZ/i1eZjwFU/dsLKumyuuP3niueg2UAukXYF0E2AAoc82ZSSf9J0WQBinzHA==", + "version": "4.41.0", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-4.41.0.tgz", + "integrity": "sha512-TeTSQ6H5YHvpqVwBRcnLDCBnDOHWYu7IvGbHT6N8AOymcr9PJGjc1GTtiWZTYg0NCgYwvnYWEkVChQAr9bjfwA==", "devOptional": true, "license": "(MIT OR CC0-1.0)", "engines": { - "node": ">=12.20" + "node": ">=16" }, "funding": { "url": "https://github.com/sponsors/sindresorhus" } }, - "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, - "license": "BSD-3-Clause", - "dependencies": { - "randombytes": "^2.1.0" - } - }, "node_modules/serve-index": { - "version": "1.9.1", - "resolved": "https://registry.npmjs.org/serve-index/-/serve-index-1.9.1.tgz", - "integrity": "sha512-pXHfKNP4qujrtteMrSBb0rc8HJ9Ms/GrXwcUtUtD5s4ewDJI8bT3Cz2zTVRMKtri49pLx2e0Ya8ziP5Ya2pZZw==", + "version": "1.9.2", + "resolved": "https://registry.npmjs.org/serve-index/-/serve-index-1.9.2.tgz", + "integrity": "sha512-KDj11HScOaLmrPxl70KYNW1PksP4Nb/CLL2yvC+Qd2kHMPEEpfc4Re2e4FOay+bC/+XQl/7zAcWON3JVo5v3KQ==", "dev": true, "license": "MIT", "dependencies": { - "accepts": "~1.3.4", + "accepts": "~1.3.8", "batch": "0.6.1", "debug": "2.6.9", "escape-html": "~1.0.3", - "http-errors": "~1.6.2", - "mime-types": "~2.1.17", - "parseurl": "~1.3.2" + "http-errors": "~1.8.0", + "mime-types": "~2.1.35", + "parseurl": "~1.3.3" }, "engines": { "node": ">= 0.8.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/express" } }, "node_modules/serve-index/node_modules/debug": { @@ -17769,27 +12532,44 @@ } }, "node_modules/serve-index/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==", + "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, "license": "MIT", "dependencies": { "depd": "~1.1.2", - "inherits": "2.0.3", - "setprototypeof": "1.1.0", - "statuses": ">= 1.4.0 < 2" + "inherits": "2.0.4", + "setprototypeof": "1.2.0", + "statuses": ">= 1.5.0 < 2", + "toidentifier": "1.0.1" }, "engines": { "node": ">= 0.6" } }, - "node_modules/serve-index/node_modules/inherits": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", - "integrity": "sha512-x00IRNXNy63jwGkJmzPigoySHbaqpNuzKbBOmzK+g2OdZpQ9w+sxCN+VSB3ja7IAge2OP2qpfxTjeNcyjmW1uw==", + "node_modules/serve-index/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==", "dev": true, - "license": "ISC" + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/serve-index/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==", + "dev": true, + "license": "MIT", + "dependencies": { + "mime-db": "1.52.0" + }, + "engines": { + "node": ">= 0.6" + } }, "node_modules/serve-index/node_modules/ms": { "version": "2.0.0", @@ -17798,13 +12578,6 @@ "dev": true, "license": "MIT" }, - "node_modules/serve-index/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, - "license": "ISC" - }, "node_modules/serve-index/node_modules/statuses": { "version": "1.5.0", "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.5.0.tgz", @@ -17816,110 +12589,32 @@ } }, "node_modules/serve-static": { - "version": "1.16.2", - "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.16.2.tgz", - "integrity": "sha512-VqpjJZKadQB/PEbEwvFdO43Ax5dFBZ2UECszz8bQ7pi7wt//PWe1P6MN7eCnjsatYtBT6EuiClbjSWP2WrIoTw==", + "version": "1.16.3", + "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.16.3.tgz", + "integrity": "sha512-x0RTqQel6g5SY7Lg6ZreMmsOzncHFU7nhnRWkKgWuMTu5NN0DR5oruckMqRvacAN9d5w6ARnRBXl9xhDCgfMeA==", "license": "MIT", "dependencies": { "encodeurl": "~2.0.0", "escape-html": "~1.0.3", "parseurl": "~1.3.3", - "send": "0.19.0" + "send": "~0.19.1" }, "engines": { "node": ">= 0.8.0" } }, - "node_modules/serve-static/node_modules/encodeurl": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-2.0.0.tgz", - "integrity": "sha512-Q0n9HRi4m6JuGIV1eFlmvJB7ZEVxu93IrMyiMsGC0lrMJMWzRgx6WGquyfQgZVb31vhGgXnfmPNNXmxnOkRBrg==", - "license": "MIT", - "engines": { - "node": ">= 0.8" - } - }, "node_modules/set-blocking": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/set-blocking/-/set-blocking-2.0.0.tgz", "integrity": "sha512-KiKBS8AnWGEyLzofFfmvKwpdPzqiy16LvQfK3yv/fVH7Bj13/wl3JSR1J+rfgRE9q7xUJK4qvgS8raSOeLUehw==", "license": "ISC" }, - "node_modules/set-cookie-parser": { - "version": "2.7.1", - "resolved": "https://registry.npmjs.org/set-cookie-parser/-/set-cookie-parser-2.7.1.tgz", - "integrity": "sha512-IOc8uWeOZgnb3ptbCURJWNjWUPcO3ZnTTdzsurqERrP6nPyv+paC55vJM0LpOlT2ne+Ix+9+CRG1MNLlyZ4GjQ==", - "devOptional": true, - "license": "MIT" - }, - "node_modules/set-function-length": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/set-function-length/-/set-function-length-1.2.2.tgz", - "integrity": "sha512-pgRc4hJ4/sNjWCSS9AmnS40x3bNMDTknHgL5UaMBTMyJnU90EgWh1Rz+MC9eFu4BuN/UwZjKQuY/1v3rM7HMfg==", - "dev": true, - "license": "MIT", - "dependencies": { - "define-data-property": "^1.1.4", - "es-errors": "^1.3.0", - "function-bind": "^1.1.2", - "get-intrinsic": "^1.2.4", - "gopd": "^1.0.1", - "has-property-descriptors": "^1.0.2" - }, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/set-function-name": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/set-function-name/-/set-function-name-2.0.2.tgz", - "integrity": "sha512-7PGFlmtwsEADb0WYyvCMa1t+yke6daIG4Wirafur5kcf+MhUnPms1UeR0CKQdTZD81yESwMHbtn+TR+dMviakQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "define-data-property": "^1.1.4", - "es-errors": "^1.3.0", - "functions-have-names": "^1.2.3", - "has-property-descriptors": "^1.0.2" - }, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/set-proto": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/set-proto/-/set-proto-1.0.0.tgz", - "integrity": "sha512-RJRdvCo6IAnPdsvP/7m6bsQqNnn1FCBX5ZNtFL98MmFF/4xAIJTIg1YbHW5DC2W5SKZanrC6i4HsJqlajw/dZw==", - "dev": true, - "license": "MIT", - "dependencies": { - "dunder-proto": "^1.0.1", - "es-errors": "^1.3.0", - "es-object-atoms": "^1.0.0" - }, - "engines": { - "node": ">= 0.4" - } - }, "node_modules/setprototypeof": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.2.0.tgz", "integrity": "sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==", "license": "ISC" }, - "node_modules/shallow-clone": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/shallow-clone/-/shallow-clone-3.0.1.tgz", - "integrity": "sha512-/6KqX+GVUdqPuPPd2LxDDxzX6CAbjJehAAOKlNpqqUpAqPM6HeL8f+o3a+JsyGjn2lv0WY8UsTgUJjU9Ok55NA==", - "dev": true, - "license": "MIT", - "dependencies": { - "kind-of": "^6.0.2" - }, - "engines": { - "node": ">=8" - } - }, "node_modules/shebang-command": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", @@ -17944,9 +12639,9 @@ } }, "node_modules/shell-quote": { - "version": "1.8.2", - "resolved": "https://registry.npmjs.org/shell-quote/-/shell-quote-1.8.2.tgz", - "integrity": "sha512-AzqKpGKjrj7EM6rKVQEPpB288oCfnrEIuyoT9cyF4nmGa7V8Zk6f7RRqYisX8X9m+Q7bd632aZW4ky7EhbQztA==", + "version": "1.8.4", + "resolved": "https://registry.npmjs.org/shell-quote/-/shell-quote-1.8.4.tgz", + "integrity": "sha512-VsC6n6vz1ihYYyZZwX7YZSF5l5x36ca17OC+a69h94YqB7X6XLwf+5MOgynYir2SLFUbl8gIYvBo8K8RoNQ6bQ==", "dev": true, "license": "MIT", "engines": { @@ -17976,13 +12671,13 @@ } }, "node_modules/side-channel-list": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/side-channel-list/-/side-channel-list-1.0.0.tgz", - "integrity": "sha512-FCLHtRD/gnpCiCHEiJLOwdmFP+wzCmDEkc9y7NsYxeF4u7Btsn1ZuwgwJGxImImHicJArLP4R0yX4c2KCrMrTA==", + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/side-channel-list/-/side-channel-list-1.0.1.tgz", + "integrity": "sha512-mjn/0bi/oUURjc5Xl7IaWi/OJJJumuoJFQJfDDyO46+hBWsfaVM65TBHq2eoZBhzl9EchxOijpkbRC8SVBQU0w==", "license": "MIT", "dependencies": { "es-errors": "^1.3.0", - "object-inspect": "^1.13.3" + "object-inspect": "^1.13.4" }, "engines": { "node": ">= 0.4" @@ -18059,25 +12754,25 @@ "license": "ISC" }, "node_modules/slice-ansi": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-5.0.0.tgz", - "integrity": "sha512-FC+lgizVPfie0kkhqUScwRu1O/lF6NOgJmlCgK+/LYxDCTk8sGelYaHDhFcDN+Sn3Cv+3VSa4Byeo+IMCzpMgQ==", + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-8.0.0.tgz", + "integrity": "sha512-stxByr12oeeOyY2BlviTNQlYV5xOj47GirPr4yA1hE9JCtxfQN0+tVbkxwCtYDQWhEKWFHsEK48ORg5jrouCAg==", "license": "MIT", "dependencies": { - "ansi-styles": "^6.0.0", - "is-fullwidth-code-point": "^4.0.0" + "ansi-styles": "^6.2.3", + "is-fullwidth-code-point": "^5.1.0" }, "engines": { - "node": ">=12" + "node": ">=20" }, "funding": { "url": "https://github.com/chalk/slice-ansi?sponsor=1" } }, "node_modules/slice-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==", + "version": "6.2.3", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-6.2.3.tgz", + "integrity": "sha512-4Dj6M28JB+oAH8kFkTLUo+a2jwOFkuqb3yucU0CANcRRUbxS0cP0nZYCGjcc3BNXwRIsUVmDGgzawme7zvJHvg==", "license": "MIT", "engines": { "node": ">=12" @@ -18087,24 +12782,14 @@ } }, "node_modules/slugify": { - "version": "1.6.6", - "resolved": "https://registry.npmjs.org/slugify/-/slugify-1.6.6.tgz", - "integrity": "sha512-h+z7HKHYXj6wJU+AnS/+IH8Uh9fdcX1Lrhg1/VMdf9PwoBQXFcXiAdsy2tSK0P6gKwJLXp02r90ahUCqHk9rrw==", + "version": "1.6.9", + "resolved": "https://registry.npmjs.org/slugify/-/slugify-1.6.9.tgz", + "integrity": "sha512-vZ7rfeehZui7wQs438JXBckYLkIIdfHOXsaVEUMyS5fHo1483l1bMdo0EDSWYclY0yZKFOipDy4KHuKs6ssvdg==", "license": "MIT", "engines": { "node": ">=8.0.0" } }, - "node_modules/snake-case": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/snake-case/-/snake-case-3.0.4.tgz", - "integrity": "sha512-LAOh4z89bGQvl9pFfNF8V146i7o7/CqFPbqzYgP+yYzDIDeS9HaNFtXABamRW+AQzEVODcvE79ljJ+8a9YSdMg==", - "license": "MIT", - "dependencies": { - "dot-case": "^3.0.4", - "tslib": "^2.0.3" - } - }, "node_modules/sockjs": { "version": "0.3.24", "resolved": "https://registry.npmjs.org/sockjs/-/sockjs-0.3.24.tgz", @@ -18118,11 +12803,10 @@ } }, "node_modules/sonic-boom": { - "version": "2.8.0", - "resolved": "https://registry.npmjs.org/sonic-boom/-/sonic-boom-2.8.0.tgz", - "integrity": "sha512-kuonw1YOYYNOve5iHdSahXPOK49GqwA+LZhI6Wz/l0rP57iKyXXIHaRagOBHAPmGwJC6od2Z9zgvZ5loSgMlVg==", + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/sonic-boom/-/sonic-boom-4.2.1.tgz", + "integrity": "sha512-w6AxtubXa2wTXAUsZMMWERrsIRAdrK0Sc+FUytWvYAhBJLyuI4llrMIC1DtlNSdI99EI86KZum2MMq3EAZlF9Q==", "license": "MIT", - "peer": true, "dependencies": { "atomic-sleep": "^1.0.0" } @@ -18157,6 +12841,7 @@ "integrity": "sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w==", "devOptional": true, "license": "MIT", + "peer": true, "dependencies": { "buffer-from": "^1.0.0", "source-map": "^0.6.0" @@ -18194,6 +12879,16 @@ "wbuf": "^1.7.3" } }, + "node_modules/speakingurl": { + "version": "14.0.1", + "resolved": "https://registry.npmjs.org/speakingurl/-/speakingurl-14.0.1.tgz", + "integrity": "sha512-1POYv7uv2gXoyGFpBCmpDVSNV74IfsWlDW216UPjbWufNf+bSU6GdbDsxdcxtfwb4xlI3yxzOTKClUosxARYrQ==", + "dev": true, + "license": "BSD-3-Clause", + "engines": { + "node": ">=0.10.0" + } + }, "node_modules/split-lines": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/split-lines/-/split-lines-3.0.0.tgz", @@ -18215,23 +12910,10 @@ "node": ">= 10.x" } }, - "node_modules/sprintf-js": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", - "integrity": "sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g==", - "license": "BSD-3-Clause" - }, - "node_modules/stackframe": { - "version": "1.3.4", - "resolved": "https://registry.npmjs.org/stackframe/-/stackframe-1.3.4.tgz", - "integrity": "sha512-oeVtt7eWQS+Na6F//S4kJ2K2VbRlS9D43mAlMyVpVWovy9o+jfgH8O9agzANzaiLjclA0oYzUXEM4PurhSUChw==", - "dev": true, - "license": "MIT" - }, "node_modules/stacktracey": { - "version": "2.1.8", - "resolved": "https://registry.npmjs.org/stacktracey/-/stacktracey-2.1.8.tgz", - "integrity": "sha512-Kpij9riA+UNg7TnphqjH7/CzctQ/owJGNbFkfEeve4Z4uxT5+JapVLFXcsurIfN34gnTWZNJ/f7NMG0E8JDzTw==", + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/stacktracey/-/stacktracey-2.2.0.tgz", + "integrity": "sha512-ETyQEz+CzXiLjEbyJqpbp+/T79RQD/6wqFucRBIlVNZfYq2Ay7wbretD4cxpbymZlaPWx58aIhPEY1Cr8DlVvg==", "license": "Unlicense", "dependencies": { "as-table": "^1.0.36", @@ -18245,9 +12927,9 @@ "license": "MIT" }, "node_modules/statuses": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.1.tgz", - "integrity": "sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==", + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.2.tgz", + "integrity": "sha512-DvEy55V3DB7uknRo+4iOGT5fP1slR8wQohVdknigZPMpMstaKJQWhwiYBACJE3Ul2pTnATihhBYnRhZQHGBiRw==", "license": "MIT", "engines": { "node": ">= 0.8" @@ -18262,26 +12944,6 @@ "safe-buffer": "~5.2.0" } }, - "node_modules/string_decoder/node_modules/safe-buffer": { - "version": "5.2.1", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", - "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ], - "license": "MIT" - }, "node_modules/string-width": { "version": "7.2.0", "resolved": "https://registry.npmjs.org/string-width/-/string-width-7.2.0.tgz", @@ -18299,43 +12961,10 @@ "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, - "license": "MIT", - "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/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, - "license": "MIT" - }, - "node_modules/string-width-cjs/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, - "license": "MIT", - "engines": { - "node": ">=8" - } - }, "node_modules/string-width/node_modules/ansi-regex": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.1.0.tgz", - "integrity": "sha512-7HSX4QQb4CspciLpVFwyRe79O3xsIZDDLER21kERQ71oaPodF8jL725AgJMFAYbooIqolJoRLuM81SpeUkpkvA==", + "version": "6.2.2", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.2.2.tgz", + "integrity": "sha512-Bq3SmSpyFHaWjPk8If9yc6svM8c56dB5BAtW4Qbw5jHTwwXXcTLoRMkpDJp6VL0XzlWaCHTXrkFURMYmD0sLqg==", "license": "MIT", "engines": { "node": ">=12" @@ -18345,12 +12974,12 @@ } }, "node_modules/string-width/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==", + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.2.0.tgz", + "integrity": "sha512-yDPMNjp4WyfYBkHnjIRLfca1i6KMyGCtsVgoKe/z1+6vukgaENdgGBZt+ZmKPc4gavvEZ5OgHfHdrazhgNyG7w==", "license": "MIT", "dependencies": { - "ansi-regex": "^6.0.1" + "ansi-regex": "^6.2.2" }, "engines": { "node": ">=12" @@ -18359,65 +12988,6 @@ "url": "https://github.com/chalk/strip-ansi?sponsor=1" } }, - "node_modules/string.prototype.trim": { - "version": "1.2.10", - "resolved": "https://registry.npmjs.org/string.prototype.trim/-/string.prototype.trim-1.2.10.tgz", - "integrity": "sha512-Rs66F0P/1kedk5lyYyH9uBzuiI/kNRmwJAR9quK6VOtIpZ2G+hMZd+HQbbv25MgCA6gEffoMZYxlTod4WcdrKA==", - "dev": true, - "license": "MIT", - "dependencies": { - "call-bind": "^1.0.8", - "call-bound": "^1.0.2", - "define-data-property": "^1.1.4", - "define-properties": "^1.2.1", - "es-abstract": "^1.23.5", - "es-object-atoms": "^1.0.0", - "has-property-descriptors": "^1.0.2" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/string.prototype.trimend": { - "version": "1.0.9", - "resolved": "https://registry.npmjs.org/string.prototype.trimend/-/string.prototype.trimend-1.0.9.tgz", - "integrity": "sha512-G7Ok5C6E/j4SGfyLCloXTrngQIQU3PWtXGst3yM7Bea9FRURf1S42ZHlZZtsNque2FN2PoUhfZXYLNWwEr4dLQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "call-bind": "^1.0.8", - "call-bound": "^1.0.2", - "define-properties": "^1.2.1", - "es-object-atoms": "^1.0.0" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/string.prototype.trimstart": { - "version": "1.0.8", - "resolved": "https://registry.npmjs.org/string.prototype.trimstart/-/string.prototype.trimstart-1.0.8.tgz", - "integrity": "sha512-UXSH262CSZY1tfu3G3Secr6uGLCFVPMhIqHjlgCUtCCcgihYc/xKs9djMTMUOb2j1mVSeU8EU6NWc/iQKU6Gfg==", - "dev": true, - "license": "MIT", - "dependencies": { - "call-bind": "^1.0.7", - "define-properties": "^1.2.1", - "es-object-atoms": "^1.0.0" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, "node_modules/stringify-attributes": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/stringify-attributes/-/stringify-attributes-4.0.0.tgz", @@ -18445,20 +13015,6 @@ "node": ">=8" } }, - "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, - "license": "MIT", - "dependencies": { - "ansi-regex": "^5.0.1" - }, - "engines": { - "node": ">=8" - } - }, "node_modules/strip-final-newline": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/strip-final-newline/-/strip-final-newline-4.0.0.tgz", @@ -18486,83 +13042,34 @@ } }, "node_modules/strtok3": { - "version": "9.1.1", - "resolved": "https://registry.npmjs.org/strtok3/-/strtok3-9.1.1.tgz", - "integrity": "sha512-FhwotcEqjr241ZbjFzjlIYg6c5/L/s4yBGWSMvJ9UoExiSqL+FnFA/CaeZx17WGaZMS/4SOZp8wH18jSS4R4lw==", + "version": "10.3.5", + "resolved": "https://registry.npmjs.org/strtok3/-/strtok3-10.3.5.tgz", + "integrity": "sha512-ki4hZQfh5rX0QDLLkOCj+h+CVNkqmp/CMf8v8kZpkNVK6jGQooMytqzLZYUVYIZcFZ6yDB70EfD8POcFXiF5oA==", "license": "MIT", "dependencies": { - "@tokenizer/token": "^0.3.0", - "peek-readable": "^5.3.1" + "@tokenizer/token": "^0.3.0" }, "engines": { - "node": ">=16" + "node": ">=18" }, "funding": { "type": "github", "url": "https://github.com/sponsors/Borewit" } }, - "node_modules/style-loader": { - "version": "3.3.4", - "resolved": "https://registry.npmjs.org/style-loader/-/style-loader-3.3.4.tgz", - "integrity": "sha512-0WqXzrsMTyb8yjZJHDqwmnwRJvhALK9LfRtRc6B4UTWe8AijYLZYZ9thuJTZc2VfQWINADW/j+LiJnfy2RoC1w==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 12.13.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/webpack" - }, - "peerDependencies": { - "webpack": "^5.0.0" - } - }, - "node_modules/stylehacks": { - "version": "7.0.4", - "resolved": "https://registry.npmjs.org/stylehacks/-/stylehacks-7.0.4.tgz", - "integrity": "sha512-i4zfNrGMt9SB4xRK9L83rlsFCgdGANfeDAYacO1pkqcE7cRHPdWHwnKZVz7WY17Veq/FvyYsRAU++Ga+qDFIww==", - "dev": true, - "license": "MIT", - "dependencies": { - "browserslist": "^4.23.3", - "postcss-selector-parser": "^6.1.2" - }, - "engines": { - "node": "^18.12.0 || ^20.9.0 || >=22.0" - }, - "peerDependencies": { - "postcss": "^8.4.31" - } - }, - "node_modules/stylehacks/node_modules/postcss-selector-parser": { - "version": "6.1.2", - "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-6.1.2.tgz", - "integrity": "sha512-Q8qQfPiZ+THO/3ZrOrO0cJJKfpYCagtMUkXbnEfmgUjwXg6z/WBeOyS9APBBPCTSiDV+s4SwQGu8yFsiMRIudg==", - "dev": true, - "license": "MIT", - "dependencies": { - "cssesc": "^3.0.0", - "util-deprecate": "^1.0.2" - }, - "engines": { - "node": ">=4" - } - }, "node_modules/sucrase": { - "version": "3.35.0", - "resolved": "https://registry.npmjs.org/sucrase/-/sucrase-3.35.0.tgz", - "integrity": "sha512-8EbVDiu9iN/nESwxeSxDKe0dunta1GOlHufmSSXxMD2z2/tMZpDMpvXQGsc+ajGo8y2uYUmixaSRUc/QPoQ0GA==", + "version": "3.35.1", + "resolved": "https://registry.npmjs.org/sucrase/-/sucrase-3.35.1.tgz", + "integrity": "sha512-DhuTmvZWux4H1UOnWMB3sk0sbaCVOoQZjv8u1rDoTV0HTdGem9hkAZtl4JZy8P2z4Bg0nT+YMeOFyVr4zcG5Tw==", "dev": true, "license": "MIT", "dependencies": { "@jridgewell/gen-mapping": "^0.3.2", "commander": "^4.0.0", - "glob": "^10.3.10", "lines-and-columns": "^1.1.6", "mz": "^2.7.0", "pirates": "^4.0.1", + "tinyglobby": "^0.2.11", "ts-interface-checker": "^0.1.9" }, "bin": { @@ -18573,16 +13080,6 @@ "node": ">=16 || 14 >=14.17" } }, - "node_modules/sucrase/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, - "license": "MIT", - "dependencies": { - "balanced-match": "^1.0.0" - } - }, "node_modules/sucrase/node_modules/commander": { "version": "4.1.1", "resolved": "https://registry.npmjs.org/commander/-/commander-4.1.1.tgz", @@ -18593,59 +13090,12 @@ "node": ">= 6" } }, - "node_modules/sucrase/node_modules/glob": { - "version": "10.4.5", - "resolved": "https://registry.npmjs.org/glob/-/glob-10.4.5.tgz", - "integrity": "sha512-7Bv8RF0k6xjo7d4A/PxYLbUCfb6c+Vpd2/mB2yRDlew7Jb5hEXiCD9ibfO7wpk8i4sevK6DFny9h7EYbM3/sHg==", - "dev": true, - "license": "ISC", - "dependencies": { - "foreground-child": "^3.1.0", - "jackspeak": "^3.1.2", - "minimatch": "^9.0.4", - "minipass": "^7.1.2", - "package-json-from-dist": "^1.0.0", - "path-scurry": "^1.11.1" - }, - "bin": { - "glob": "dist/esm/bin.mjs" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/sucrase/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, - "license": "ISC", - "dependencies": { - "brace-expansion": "^2.0.1" - }, - "engines": { - "node": ">=16 || 14 >=14.17" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/sucrase/node_modules/minipass": { - "version": "7.1.2", - "resolved": "https://registry.npmjs.org/minipass/-/minipass-7.1.2.tgz", - "integrity": "sha512-qOOzS1cBTWYF4BH8fVePDBOO9iptMnGUEZwNc/cMWnTV2nVLZ7VoNWEPHkYczZA0pdoA7dl6e7FL659nX9S2aw==", - "dev": true, - "license": "ISC", - "engines": { - "node": ">=16 || 14 >=14.17" - } - }, "node_modules/superagent": { "version": "8.1.2", "resolved": "https://registry.npmjs.org/superagent/-/superagent-8.1.2.tgz", "integrity": "sha512-6WTxW1EB6yCxV5VFOIPQruWGHqc3yI7hEmZK6h+pyk69Lk/Ut7rLUY6W/ONF2MjBuGjvmMiIpsrVJ2vjrHlslA==", - "deprecated": "Please upgrade to v9.0.0+ as we have fixed a public vulnerability with formidable dependency. Note that v9.0.0+ requires Node.js v14.18.0+. See https://github.com/ladjs/superagent/pull/1800 for insight. This project is supported and maintained by the team at Forward Email @ https://forwardemail.net", - "devOptional": true, + "deprecated": "Please upgrade to superagent v10.2.2+, see release notes at https://github.com/forwardemail/superagent/releases/tag/v10.2.2 - maintenance is supported by Forward Email @ https://forwardemail.net", + "dev": true, "license": "MIT", "dependencies": { "component-emitter": "^1.3.0", @@ -18667,7 +13117,7 @@ "version": "2.6.0", "resolved": "https://registry.npmjs.org/mime/-/mime-2.6.0.tgz", "integrity": "sha512-USPkMeET31rOMiarsBNIHZKLGgvKc/LrjofAnBlOttf5ajRvqiRA8QsenbcooctK6d6Ts6aqZXBA+XbkKthiQg==", - "devOptional": true, + "dev": true, "license": "MIT", "bin": { "mime": "cli.js" @@ -18676,10 +13126,37 @@ "node": ">=4.0.0" } }, + "node_modules/superagent/node_modules/semver": { + "version": "7.8.2", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.8.2.tgz", + "integrity": "sha512-c8jsqUZm3omBOI66G90z1Dyw5z622G8oLG+omfsHBJf3CWQTlOcwOjvOG6wtiNfW6anKm/eA39LMwMtMez2TiQ==", + "dev": true, + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/superjson": { + "version": "2.2.6", + "resolved": "https://registry.npmjs.org/superjson/-/superjson-2.2.6.tgz", + "integrity": "sha512-H+ue8Zo4vJmV2nRjpx86P35lzwDT3nItnIsocgumgr0hHMQ+ZGq5vrERg9kJBo5AWGmxZDhzDo+WVIJqkB0cGA==", + "dev": true, + "license": "MIT", + "dependencies": { + "copy-anything": "^4" + }, + "engines": { + "node": ">=16" + } + }, "node_modules/supertest": { "version": "6.3.4", "resolved": "https://registry.npmjs.org/supertest/-/supertest-6.3.4.tgz", "integrity": "sha512-erY3HFDG0dPnhw4U+udPfrzXa4xhSG+n4rxfRuZWCUvjFWwKl+OxWf/7zk50s84/fAAs7vf5QAb9uRa0cCykxw==", + "deprecated": "Please upgrade to supertest v7.1.3+, see release notes at https://github.com/forwardemail/supertest/releases/tag/v7.1.3 - maintenance is supported by Forward Email @ https://forwardemail.net", "dev": true, "license": "MIT", "dependencies": { @@ -18691,13 +13168,12 @@ } }, "node_modules/supports-color": { - "version": "9.4.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-9.4.0.tgz", - "integrity": "sha512-VL+lNrEoIXww1coLPOmiEmK/0sGigko5COxI09KzHc2VJXJsQ37UaQ+8quuxjDeA7+KnLGTWRyOXSLLR2Wb4jw==", - "devOptional": true, + "version": "10.2.2", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-10.2.2.tgz", + "integrity": "sha512-SS+jx45GF1QjgEXQx4NJZV9ImqmO2NPz5FNsIHrsDjh2YsHnawpan7SNQ1o8NuhrbHZy9AZhIoCUiCeaW/C80g==", "license": "MIT", "engines": { - "node": ">=12" + "node": ">=18" }, "funding": { "url": "https://github.com/chalk/supports-color?sponsor=1" @@ -18715,178 +13191,32 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/svgo": { - "version": "3.3.2", - "resolved": "https://registry.npmjs.org/svgo/-/svgo-3.3.2.tgz", - "integrity": "sha512-OoohrmuUlBs8B8o6MB2Aevn+pRIH9zDALSR+6hhqVfa6fRwG/Qw9VUMSMW9VNg2CFc/MTIfabtdOVl9ODIJjpw==", - "dev": true, - "license": "MIT", - "dependencies": { - "@trysound/sax": "0.2.0", - "commander": "^7.2.0", - "css-select": "^5.1.0", - "css-tree": "^2.3.1", - "css-what": "^6.1.0", - "csso": "^5.0.5", - "picocolors": "^1.0.0" - }, - "bin": { - "svgo": "bin/svgo" - }, - "engines": { - "node": ">=14.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/svgo" - } - }, - "node_modules/svgo/node_modules/commander": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/commander/-/commander-7.2.0.tgz", - "integrity": "sha512-QrWXB+ZQSVPmIWIhtEO9H+gwHaMGYiF5ChvoJ+K9ZGHG/sVsa6yiesAD1GC/x46sET00Xlwo1u49RVVVzvcSkw==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 10" - } - }, - "node_modules/svgo/node_modules/css-select": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/css-select/-/css-select-5.1.0.tgz", - "integrity": "sha512-nwoRF1rvRRnnCqqY7updORDsuqKzqYJ28+oSMaJMMgOauh3fvwHqMS7EZpIPqK8GL+g9mKxF1vP/ZjSeNjEVHg==", - "dev": true, - "license": "BSD-2-Clause", - "dependencies": { - "boolbase": "^1.0.0", - "css-what": "^6.1.0", - "domhandler": "^5.0.2", - "domutils": "^3.0.1", - "nth-check": "^2.0.1" - }, - "funding": { - "url": "https://github.com/sponsors/fb55" - } - }, - "node_modules/svgo/node_modules/dom-serializer": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-2.0.0.tgz", - "integrity": "sha512-wIkAryiqt/nV5EQKqQpo3SToSOV9J0DnbJqwK7Wv/Trc92zIAYZ4FlMu+JPFW1DfGFt81ZTCGgDEabffXeLyJg==", - "dev": true, - "license": "MIT", - "dependencies": { - "domelementtype": "^2.3.0", - "domhandler": "^5.0.2", - "entities": "^4.2.0" - }, - "funding": { - "url": "https://github.com/cheeriojs/dom-serializer?sponsor=1" - } - }, - "node_modules/svgo/node_modules/domhandler": { - "version": "5.0.3", - "resolved": "https://registry.npmjs.org/domhandler/-/domhandler-5.0.3.tgz", - "integrity": "sha512-cgwlv/1iFQiFnU96XXgROh8xTeetsnJiDsTc7TYCLFd9+/WNkIqPTxiM/8pSd8VIrhXGTf1Ny1q1hquVqDJB5w==", - "dev": true, - "license": "BSD-2-Clause", - "dependencies": { - "domelementtype": "^2.3.0" - }, - "engines": { - "node": ">= 4" - }, - "funding": { - "url": "https://github.com/fb55/domhandler?sponsor=1" - } - }, - "node_modules/svgo/node_modules/domutils": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/domutils/-/domutils-3.2.2.tgz", - "integrity": "sha512-6kZKyUajlDuqlHKVX1w7gyslj9MPIXzIFiz/rGu35uC1wMi+kMhQwGhl4lt9unC9Vb9INnY9Z3/ZA3+FhASLaw==", - "dev": true, - "license": "BSD-2-Clause", - "dependencies": { - "dom-serializer": "^2.0.0", - "domelementtype": "^2.3.0", - "domhandler": "^5.0.3" - }, - "funding": { - "url": "https://github.com/fb55/domutils?sponsor=1" - } - }, - "node_modules/swagger-parser": { - "version": "10.0.3", - "resolved": "https://registry.npmjs.org/swagger-parser/-/swagger-parser-10.0.3.tgz", - "integrity": "sha512-nF7oMeL4KypldrQhac8RyHerJeGPD1p2xDh900GPvc+Nk7nWP6jX2FcC7WmkinMoAmoO774+AFXcWsW8gMWEIg==", - "dev": true, - "license": "MIT", - "dependencies": { - "@apidevtools/swagger-parser": "10.0.3" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/swagger-parser/node_modules/@apidevtools/swagger-parser": { - "version": "10.0.3", - "resolved": "https://registry.npmjs.org/@apidevtools/swagger-parser/-/swagger-parser-10.0.3.tgz", - "integrity": "sha512-sNiLY51vZOmSPFZA5TF35KZ2HbgYklQnTSDnkghamzLb3EkNtcQnrBQEj5AOCxHpTtXpqMCRM1CrmV2rG6nw4g==", - "dev": true, - "license": "MIT", - "dependencies": { - "@apidevtools/json-schema-ref-parser": "^9.0.6", - "@apidevtools/openapi-schemas": "^2.0.4", - "@apidevtools/swagger-methods": "^3.0.2", - "@jsdevtools/ono": "^7.1.3", - "call-me-maybe": "^1.0.1", - "z-schema": "^5.0.1" - }, - "peerDependencies": { - "openapi-types": ">=7" - } - }, - "node_modules/swagger-parser/node_modules/openapi-types": { - "version": "12.1.3", - "resolved": "https://registry.npmjs.org/openapi-types/-/openapi-types-12.1.3.tgz", - "integrity": "sha512-N4YtSYJqghVu4iek2ZUvcN/0aqH1kRDuNqzcycDxhOUpg7GdvLa2F3DgS6yBNhInhv2r/6I0Flkn7CqL8+nIcw==", - "dev": true, - "license": "MIT", - "peer": true - }, - "node_modules/swagger-schema-official": { - "version": "2.0.0-bab6bed", - "resolved": "https://registry.npmjs.org/swagger-schema-official/-/swagger-schema-official-2.0.0-bab6bed.tgz", - "integrity": "sha512-rCC0NWGKr/IJhtRuPq/t37qvZHI/mH4I4sxflVM+qgVe5Z2uOCivzWaVbuioJaB61kvm5UvB7b49E+oBY0M8jA==", - "dev": true, - "license": "ISC" - }, "node_modules/synckit": { - "version": "0.9.2", - "resolved": "https://registry.npmjs.org/synckit/-/synckit-0.9.2.tgz", - "integrity": "sha512-vrozgXDQwYO72vHjUb/HnFbQx1exDjoKzqx23aXEg2a9VIg2TSFZ8FmeZpTjUCFMYw7mpX4BE2SFu8wI7asYsw==", + "version": "0.11.13", + "resolved": "https://registry.npmjs.org/synckit/-/synckit-0.11.13.tgz", + "integrity": "sha512-eNRKgb3z66Yp3D2CixVujOUvXLFUTij/zVnV8KRyvFdQwpz7I5DS8UfRkTeLzb64u+dkzDSdelE24izu+zSSUg==", "dev": true, "license": "MIT", "dependencies": { - "@pkgr/core": "^0.1.0", - "tslib": "^2.6.2" + "@pkgr/core": "^0.3.6" }, "engines": { "node": "^14.18.0 || >=16.0.0" }, "funding": { - "url": "https://opencollective.com/unts" + "url": "https://opencollective.com/synckit" } }, "node_modules/tabbable": { - "version": "6.2.0", - "resolved": "https://registry.npmjs.org/tabbable/-/tabbable-6.2.0.tgz", - "integrity": "sha512-Cat63mxsVJlzYvN51JmVXIgNoUokrIaT2zLclCXjRd8boZ0004U4KCs/sToJ75C6sdlByWxpYnb5Boif1VSFew==", + "version": "6.4.0", + "resolved": "https://registry.npmjs.org/tabbable/-/tabbable-6.4.0.tgz", + "integrity": "sha512-05PUHKSNE8ou2dwIxTngl4EzcnsCDZGJ/iCLtDflR/SHB/ny14rXc+qU5P4mG9JkusiV7EivzY9Mhm55AzAvCg==", "license": "MIT" }, "node_modules/tailwindcss": { - "version": "3.4.17", - "resolved": "https://registry.npmjs.org/tailwindcss/-/tailwindcss-3.4.17.tgz", - "integrity": "sha512-w33E2aCvSDP0tW9RZuNXadXlkHXqFzSkQew/aIa2i/Sj8fThxwovwlXHSPXTbAHwEIhBFXAedUhP2tueAKP8Og==", + "version": "3.4.19", + "resolved": "https://registry.npmjs.org/tailwindcss/-/tailwindcss-3.4.19.tgz", + "integrity": "sha512-3ofp+LL8E+pK/JuPLPggVAIaEuhvIz4qNcf3nA1Xn2o/7fb7s/TYpHhwGDv1ZU3PkBluUVaF8PyCHcm48cKLWQ==", "dev": true, "license": "MIT", "dependencies": { @@ -18898,7 +13228,7 @@ "fast-glob": "^3.3.2", "glob-parent": "^6.0.2", "is-glob": "^4.0.3", - "jiti": "^1.21.6", + "jiti": "^1.21.7", "lilconfig": "^3.1.3", "micromatch": "^4.0.8", "normalize-path": "^3.0.0", @@ -18907,7 +13237,7 @@ "postcss": "^8.4.47", "postcss-import": "^15.1.0", "postcss-js": "^4.0.1", - "postcss-load-config": "^4.0.2", + "postcss-load-config": "^4.0.2 || ^5.0 || ^6.0", "postcss-nested": "^6.2.0", "postcss-selector-parser": "^6.1.2", "resolve": "^1.22.8", @@ -18959,10 +13289,20 @@ "node": ">= 6" } }, + "node_modules/tailwindcss/node_modules/jiti": { + "version": "1.21.7", + "resolved": "https://registry.npmjs.org/jiti/-/jiti-1.21.7.tgz", + "integrity": "sha512-/imKNG4EbWNrVjoNC/1H5/9GFy+tqjGBHCaSsN+P2RnPqjsLmv6UD3Ej+Kj8nBWaRAwyk7kK5ZUc+OEatnTR3A==", + "dev": true, + "license": "MIT", + "bin": { + "jiti": "bin/jiti.js" + } + }, "node_modules/tailwindcss/node_modules/picomatch": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", - "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.2.tgz", + "integrity": "sha512-V7+vQEJ06Z+c5tSye8S+nHUfI51xoXIXjHQ99cQtKUkQqqO1kO/KCJUfZXuB47h/YBlDhah2H3hdUGXn8ie0oA==", "dev": true, "license": "MIT", "engines": { @@ -18972,20 +13312,6 @@ "url": "https://github.com/sponsors/jonschlinkert" } }, - "node_modules/tailwindcss/node_modules/postcss-selector-parser": { - "version": "6.1.2", - "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-6.1.2.tgz", - "integrity": "sha512-Q8qQfPiZ+THO/3ZrOrO0cJJKfpYCagtMUkXbnEfmgUjwXg6z/WBeOyS9APBBPCTSiDV+s4SwQGu8yFsiMRIudg==", - "dev": true, - "license": "MIT", - "dependencies": { - "cssesc": "^3.0.0", - "util-deprecate": "^1.0.2" - }, - "engines": { - "node": ">=4" - } - }, "node_modules/tailwindcss/node_modules/readdirp": { "version": "3.6.0", "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz", @@ -19000,19 +13326,24 @@ } }, "node_modules/tapable": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/tapable/-/tapable-2.2.1.tgz", - "integrity": "sha512-GNzQvQTOIP6RyTfE2Qxb8ZVlNmw0n88vp1szwWRimP02mnTsx3Wtn5qRdqY9w2XduFNUgvOwhNnQsjwCp+kqaQ==", + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/tapable/-/tapable-2.3.3.tgz", + "integrity": "sha512-uxc/zpqFg6x7C8vOE7lh6Lbda8eEL9zmVm/PLeTPBRhh1xCgdWaQ+J1CUieGpIfm2HdtsUpRv+HshiasBMcc6A==", "dev": true, "license": "MIT", "engines": { "node": ">=6" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" } }, "node_modules/tar": { "version": "6.2.1", "resolved": "https://registry.npmjs.org/tar/-/tar-6.2.1.tgz", "integrity": "sha512-DZ4yORTwrbTj/7MZYq2w+/ZFdI6OZ/f9SFHR+71gIVUZhOQPHzVCLpvRnPgyaMpfWxxk/4ONva3GQSyNIKRv6A==", + "deprecated": "Old versions of tar are not supported, and contain widely publicized security vulnerabilities, which have been fixed in the current version. Please update. Support for old versions may be purchased (at exorbitant rates) by contacting i@izs.me", "license": "ISC", "dependencies": { "chownr": "^2.0.0", @@ -19051,9 +13382,9 @@ } }, "node_modules/terminal-size": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/terminal-size/-/terminal-size-4.0.0.tgz", - "integrity": "sha512-rcdty1xZ2/BkWa4ANjWRp4JGpda2quksXIHgn5TMjNBPZfwzJIgR68DKfSYiTL+CZWowDX/sbOo5ME/FRURvYQ==", + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/terminal-size/-/terminal-size-4.0.1.tgz", + "integrity": "sha512-avMLDQpUI9I5XFrklECw1ZEUPJhqzcwSWsyyI8blhRLT+8N1jLJWLWWYQpB2q2xthq8xDvjZPISVh53T/+CLYQ==", "license": "MIT", "engines": { "node": ">=18" @@ -19063,14 +13394,15 @@ } }, "node_modules/terser": { - "version": "5.37.0", - "resolved": "https://registry.npmjs.org/terser/-/terser-5.37.0.tgz", - "integrity": "sha512-B8wRRkmre4ERucLM/uXx4MOV5cbnOlVAqUst+1+iLKPI0dOgFO28f84ptoQt9HEI537PMzfYa/d+GEPKTRXmYA==", + "version": "5.48.0", + "resolved": "https://registry.npmjs.org/terser/-/terser-5.48.0.tgz", + "integrity": "sha512-J/9An6vs9Us6wKRriSFXBWdRZapREHqFzdNUKk0pmu804EMR6dr6winwo7e5JDxN4xahxQsuysyYFwlwj4XN/Q==", "devOptional": true, "license": "BSD-2-Clause", + "peer": true, "dependencies": { "@jridgewell/source-map": "^0.3.3", - "acorn": "^8.8.2", + "acorn": "^8.15.0", "commander": "^2.20.0", "source-map-support": "~0.5.20" }, @@ -19082,16 +13414,16 @@ } }, "node_modules/terser-webpack-plugin": { - "version": "5.3.11", - "resolved": "https://registry.npmjs.org/terser-webpack-plugin/-/terser-webpack-plugin-5.3.11.tgz", - "integrity": "sha512-RVCsMfuD0+cTt3EwX8hSl2Ks56EbFHWmhluwcqoPKtBnfjiT6olaq7PRIRfhyU8nnC2MrnDrBLfrD/RGE+cVXQ==", + "version": "5.6.1", + "resolved": "https://registry.npmjs.org/terser-webpack-plugin/-/terser-webpack-plugin-5.6.1.tgz", + "integrity": "sha512-201R5j+sJpK8nFWwKVyNfZot8FaJbLZDq5evriVzbV1wDtSXDjRUDRfJzHpAaxFDMEhsZL1QkeqM61wgsS3KaQ==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "@jridgewell/trace-mapping": "^0.3.25", "jest-worker": "^27.4.5", "schema-utils": "^4.3.0", - "serialize-javascript": "^6.0.2", "terser": "^5.31.1" }, "engines": { @@ -19105,12 +13437,39 @@ "webpack": "^5.1.0" }, "peerDependenciesMeta": { + "@minify-html/node": { + "optional": true + }, "@swc/core": { "optional": true }, + "@swc/css": { + "optional": true + }, + "@swc/html": { + "optional": true + }, + "clean-css": { + "optional": true + }, + "cssnano": { + "optional": true + }, + "csso": { + "optional": true + }, "esbuild": { "optional": true }, + "html-minifier-terser": { + "optional": true + }, + "lightningcss": { + "optional": true + }, + "postcss": { + "optional": true + }, "uglify-js": { "optional": true } @@ -19121,7 +13480,8 @@ "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz", "integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==", "devOptional": true, - "license": "MIT" + "license": "MIT", + "peer": true }, "node_modules/text-table": { "version": "0.2.0", @@ -19154,14 +13514,18 @@ } }, "node_modules/thingies": { - "version": "1.21.0", - "resolved": "https://registry.npmjs.org/thingies/-/thingies-1.21.0.tgz", - "integrity": "sha512-hsqsJsFMsV+aD4s3CWKk85ep/3I9XzYV/IXaSouJMYIoDlgyi11cBhsqYe9/geRfB0YIikBQg6raRaM+nIMP9g==", + "version": "2.6.0", + "resolved": "https://registry.npmjs.org/thingies/-/thingies-2.6.0.tgz", + "integrity": "sha512-rMHRjmlFLM1R96UYPvpmnc3LYtdFrT33JIB7L9hetGue1qAPfn1N2LJeEjxUSidu1Iku+haLZXDuEXUHNGO/lg==", "dev": true, - "license": "Unlicense", + "license": "MIT", "engines": { "node": ">=10.18" }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/streamich" + }, "peerDependencies": { "tslib": "^2" } @@ -19175,14 +13539,23 @@ } }, "node_modules/thread-stream": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/thread-stream/-/thread-stream-3.1.0.tgz", - "integrity": "sha512-OqyPZ9u96VohAyMfJykzmivOrY2wfMSf3C5TtFJVgN+Hm6aj+voFhlK+kZEIv2FBh1X6Xp3DlnCOfEQ3B2J86A==", + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/thread-stream/-/thread-stream-4.2.0.tgz", + "integrity": "sha512-e2zZ96wSChazBsbENf/Pcm/4swHt2cEKQ92rhUjkL9GCKiTDJIaTBenjE/m9DXi0QBmTMDkFDdOomUy20A1tDQ==", "license": "MIT", "dependencies": { - "real-require": "^0.2.0" + "real-require": "^1.0.0" + }, + "engines": { + "node": ">=20" } }, + "node_modules/thread-stream/node_modules/real-require": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/real-require/-/real-require-1.0.0.tgz", + "integrity": "sha512-P4nbQYQfePJxRSmY+v/KINxVucm4NF3p3s7pJveMTtom52FR4YGltUQLB8idDXwDDWW+eYrWDFbuzUnjoWHF7g==", + "license": "MIT" + }, "node_modules/thunky": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/thunky/-/thunky-1.1.0.tgz", @@ -19219,16 +13592,23 @@ "version": "0.3.2", "resolved": "https://registry.npmjs.org/tinyexec/-/tinyexec-0.3.2.tgz", "integrity": "sha512-KQQR9yN7R5+OSwaK0XQoj22pwHoTlgYqmUscPYoknOoWCWfj/5/ABTMRi69FrKU5ffPVh5QcFikpWJI/P1ocHA==", + "devOptional": true, "license": "MIT" }, - "node_modules/tmp": { - "version": "0.2.3", - "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.2.3.tgz", - "integrity": "sha512-nZD7m9iCPC5g0pYmcaxogYKggSfLsdxl8of3Q/oIbqCqLLIO9IAF0GWjX1z9NZRHPiXv8Wex4yDCaZsgEw0Y8w==", - "dev": true, + "node_modules/tinyglobby": { + "version": "0.2.17", + "resolved": "https://registry.npmjs.org/tinyglobby/-/tinyglobby-0.2.17.tgz", + "integrity": "sha512-wXR/dYpcqKmfWpEdZjiKJOwCNFndD0DMnrW/cYjVGttEkBfVgcLFHoNrlj47mjOVic9yyNu65alsgF4NQyTa2g==", "license": "MIT", + "dependencies": { + "fdir": "^6.5.0", + "picomatch": "^4.0.4" + }, "engines": { - "node": ">=14.14" + "node": ">=12.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/SuperchupuDev" } }, "node_modules/tmp-cache": { @@ -19268,11 +13648,12 @@ } }, "node_modules/token-types": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/token-types/-/token-types-6.0.0.tgz", - "integrity": "sha512-lbDrTLVsHhOMljPscd0yitpozq7Ga2M5Cvez5AjGg8GASBjtt6iERCAJ93yommPmz62fb45oFIXHEZ3u9bfJEA==", + "version": "6.1.2", + "resolved": "https://registry.npmjs.org/token-types/-/token-types-6.1.2.tgz", + "integrity": "sha512-dRXchy+C0IgK8WPC6xvCHFRIWYUbqqdEIKPaKo/AcTUNzwLTK6AH7RjdLWsEZcAN/TBdtfUw3PYEgPr5VPr6ww==", "license": "MIT", "dependencies": { + "@borewit/text-codec": "^0.2.1", "@tokenizer/token": "^0.3.0", "ieee754": "^1.2.1" }, @@ -19290,28 +13671,10 @@ "integrity": "sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==", "license": "MIT" }, - "node_modules/traverse": { - "version": "0.6.10", - "resolved": "https://registry.npmjs.org/traverse/-/traverse-0.6.10.tgz", - "integrity": "sha512-hN4uFRxbK+PX56DxYiGHsTn2dME3TVr9vbNqlQGcGcPhJAn+tdP126iA+TArMpI4YSgnTkMWyoLl5bf81Hi5TA==", - "dev": true, - "license": "MIT", - "dependencies": { - "gopd": "^1.0.1", - "typedarray.prototype.slice": "^1.0.3", - "which-typed-array": "^1.1.15" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, "node_modules/tree-dump": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/tree-dump/-/tree-dump-1.0.2.tgz", - "integrity": "sha512-dpev9ABuLWdEubk+cIaI9cHwRNNDjkBBLXTwI4UCUFdQ5xXKqNXoK4FEciw/vxf+NQ7Cb7sGUyeUtORvHIdRXQ==", + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/tree-dump/-/tree-dump-1.1.0.tgz", + "integrity": "sha512-rMuvhU4MCDbcbnleZTFezWsaZXRFemSqAM+7jPnzUl1fo9w3YEKOxAeui0fz3OI4EU4hf23iyA7uQRVko+UaBA==", "dev": true, "license": "Apache-2.0", "engines": { @@ -19325,12 +13688,6 @@ "tslib": "2" } }, - "node_modules/truncatise": { - "version": "0.0.8", - "resolved": "https://registry.npmjs.org/truncatise/-/truncatise-0.0.8.tgz", - "integrity": "sha512-cXzueh9pzBCsLzhToB4X4gZCb3KYkrsAcBAX97JnazE74HOl3cpBJYEV7nabHeG/6/WXCU5Yujlde/WPBUwnsg==", - "license": "MIT" - }, "node_modules/ts-interface-checker": { "version": "0.1.13", "resolved": "https://registry.npmjs.org/ts-interface-checker/-/ts-interface-checker-0.1.13.tgz", @@ -19339,9 +13696,9 @@ "license": "Apache-2.0" }, "node_modules/ts-loader": { - "version": "9.5.1", - "resolved": "https://registry.npmjs.org/ts-loader/-/ts-loader-9.5.1.tgz", - "integrity": "sha512-rNH3sK9kGZcH9dYzC7CewQm4NtxJTjSEVRJ2DyBZR7f8/wcta+iV44UPCXc5+nzDzivKtlzV6c9P4e+oFhDLYg==", + "version": "9.6.0", + "resolved": "https://registry.npmjs.org/ts-loader/-/ts-loader-9.6.0.tgz", + "integrity": "sha512-dsJO0S+T7grTDWTc4a0nTygXGjKncVUpx8Y+af8EvI/D5WgTJby5UEk5eoMCB9EcLQmnvitqh99MqtjtHgAwFQ==", "dev": true, "license": "MIT", "dependencies": { @@ -19355,84 +13712,37 @@ "node": ">=12.0.0" }, "peerDependencies": { + "loader-utils": "*", "typescript": "*", - "webpack": "^5.0.0" + "webpack": "^4.0.0 || ^5.0.0" + }, + "peerDependenciesMeta": { + "loader-utils": { + "optional": true + } } }, - "node_modules/ts-loader/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==", + "node_modules/ts-loader/node_modules/semver": { + "version": "7.8.2", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.8.2.tgz", + "integrity": "sha512-c8jsqUZm3omBOI66G90z1Dyw5z622G8oLG+omfsHBJf3CWQTlOcwOjvOG6wtiNfW6anKm/eA39LMwMtMez2TiQ==", "dev": true, - "license": "MIT", - "dependencies": { - "color-convert": "^2.0.1" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" - } - }, - "node_modules/ts-loader/node_modules/chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", - "dev": true, - "license": "MIT", - "dependencies": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" + "license": "ISC", + "bin": { + "semver": "bin/semver.js" }, "engines": { "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/chalk?sponsor=1" } }, - "node_modules/ts-loader/node_modules/color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "color-name": "~1.1.4" - }, - "engines": { - "node": ">=7.0.0" - } - }, - "node_modules/ts-loader/node_modules/color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "dev": true, - "license": "MIT" - }, "node_modules/ts-loader/node_modules/source-map": { - "version": "0.7.4", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.7.4.tgz", - "integrity": "sha512-l3BikUxvPOcn5E74dZiq5BGsTb5yEwhaTSzccU6t4sDOH8NWJCstKO5QT2CvtFoK6F0saL7p9xHAqHOlCPJygA==", + "version": "0.7.6", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.7.6.tgz", + "integrity": "sha512-i5uvt8C3ikiWeNZSVZNWcfZPItFQOsYTUAOkcUPGd8DqDy1uOUikjt5dG+uRlwyvR108Fb9DOd4GvXfT0N2/uQ==", "dev": true, "license": "BSD-3-Clause", "engines": { - "node": ">= 8" - } - }, - "node_modules/ts-loader/node_modules/supports-color": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", - "dev": true, - "license": "MIT", - "dependencies": { - "has-flag": "^4.0.0" - }, - "engines": { - "node": ">=8" + "node": ">= 12" } }, "node_modules/ts-morph": { @@ -19446,10 +13756,10 @@ "code-block-writer": "^13.0.1" } }, - "node_modules/ts-node": { - "version": "10.9.2", - "resolved": "https://registry.npmjs.org/ts-node/-/ts-node-10.9.2.tgz", - "integrity": "sha512-f0FFpIdcHgn8zcPSbf1dRevwt047YMnaiJM3u2w2RewrB+fob/zePZcrOyQoLMMO7aBIddLcQIEK5dYjkLnGrQ==", + "node_modules/ts-node-maintained": { + "version": "10.9.6", + "resolved": "https://registry.npmjs.org/ts-node-maintained/-/ts-node-maintained-10.9.6.tgz", + "integrity": "sha512-m/1ZCksNnIofWjmY5/K+6y8oia05Y/5+vMWTvuFzrr6UGRV7ImrLMyYAB06cHlwBW5/NuYeZoh44mAOGNRNxZA==", "dev": true, "license": "MIT", "dependencies": { @@ -19490,7 +13800,7 @@ } } }, - "node_modules/ts-node/node_modules/arg": { + "node_modules/ts-node-maintained/node_modules/arg": { "version": "4.1.3", "resolved": "https://registry.npmjs.org/arg/-/arg-4.1.3.tgz", "integrity": "sha512-58S9QDqG0Xx27YwPSt9fJxivjYl432YCwfDMfZ+71RAqUrZef7LrKQZ3LHLOwCS4FLNBplP533Zx895SeOCHvA==", @@ -19512,6 +13822,18 @@ "node": ">=0.6.x" } }, + "node_modules/tsse": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/tsse/-/tsse-2.1.0.tgz", + "integrity": "sha512-rYyp1CO0VcKCIoAlMKAaLEb/1v5arucsRWSc+kkz9k2/GQN7rVMUH5Dmc7l3ZuiJGZ7jwEDO9Z0Qv6LkAqCdDA==", + "license": "MIT", + "dependencies": { + "safe-buffer": "^5.1.1" + }, + "engines": { + "node": ">=4" + } + }, "node_modules/tsutils": { "version": "3.21.0", "resolved": "https://registry.npmjs.org/tsutils/-/tsutils-3.21.0.tgz", @@ -19535,6 +13857,26 @@ "dev": true, "license": "0BSD" }, + "node_modules/tsyringe": { + "version": "4.10.0", + "resolved": "https://registry.npmjs.org/tsyringe/-/tsyringe-4.10.0.tgz", + "integrity": "sha512-axr3IdNuVIxnaK5XGEUFTu3YmAQ6lllgrvqfEoR16g/HGnYY/6We4oWENtAnzK6/LpJ2ur9PAb80RBt7/U4ugw==", + "dev": true, + "license": "MIT", + "dependencies": { + "tslib": "^1.9.3" + }, + "engines": { + "node": ">= 6.0.0" + } + }, + "node_modules/tsyringe/node_modules/tslib": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", + "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==", + "dev": true, + "license": "0BSD" + }, "node_modules/type-check": { "version": "0.4.0", "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.4.0.tgz", @@ -19549,135 +13891,40 @@ } }, "node_modules/type-fest": { - "version": "4.31.0", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-4.31.0.tgz", - "integrity": "sha512-yCxltHW07Nkhv/1F6wWBr8kz+5BGMfP+RbRSYFnegVb0qV/UMT0G0ElBloPVerqn4M2ZV80Ir1FtCcYv1cT6vQ==", + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.20.2.tgz", + "integrity": "sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==", + "dev": true, "license": "(MIT OR CC0-1.0)", "engines": { - "node": ">=16" + "node": ">=10" }, "funding": { "url": "https://github.com/sponsors/sindresorhus" } }, "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==", + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/type-is/-/type-is-2.1.0.tgz", + "integrity": "sha512-faYHw0anBbc/kWF3zFTEnxSFOAGUX9GFbOBthvDdLsIlEoWOFOtS0zgCiQYwIskL9iGXZL3kAXD8OoZ4GmMATA==", "license": "MIT", "dependencies": { - "media-typer": "0.3.0", - "mime-types": "~2.1.24" + "content-type": "^2.0.0", + "media-typer": "^1.1.0", + "mime-types": "^3.0.0" }, "engines": { - "node": ">= 0.6" - } - }, - "node_modules/typed-array-buffer": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/typed-array-buffer/-/typed-array-buffer-1.0.3.tgz", - "integrity": "sha512-nAYYwfY3qnzX30IkA6AQZjVbtK6duGontcQm1WSG1MD94YLqK0515GNApXkoxKOWMusVssAHWLh9SeaoefYFGw==", - "dev": true, - "license": "MIT", - "dependencies": { - "call-bound": "^1.0.3", - "es-errors": "^1.3.0", - "is-typed-array": "^1.1.14" - }, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/typed-array-byte-length": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/typed-array-byte-length/-/typed-array-byte-length-1.0.3.tgz", - "integrity": "sha512-BaXgOuIxz8n8pIq3e7Atg/7s+DpiYrxn4vdot3w9KbnBhcRQq6o3xemQdIfynqSeXeDrF32x+WvfzmOjPiY9lg==", - "dev": true, - "license": "MIT", - "dependencies": { - "call-bind": "^1.0.8", - "for-each": "^0.3.3", - "gopd": "^1.2.0", - "has-proto": "^1.2.0", - "is-typed-array": "^1.1.14" - }, - "engines": { - "node": ">= 0.4" + "node": ">= 18" }, "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/typed-array-byte-offset": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/typed-array-byte-offset/-/typed-array-byte-offset-1.0.4.tgz", - "integrity": "sha512-bTlAFB/FBYMcuX81gbL4OcpH5PmlFHqlCCpAl8AlEzMz5k53oNDvN8p1PNOWLEmI2x4orp3raOFB51tv9X+MFQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "available-typed-arrays": "^1.0.7", - "call-bind": "^1.0.8", - "for-each": "^0.3.3", - "gopd": "^1.2.0", - "has-proto": "^1.2.0", - "is-typed-array": "^1.1.15", - "reflect.getprototypeof": "^1.0.9" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/typed-array-length": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/typed-array-length/-/typed-array-length-1.0.7.tgz", - "integrity": "sha512-3KS2b+kL7fsuk/eJZ7EQdnEmQoaho/r6KUef7hxvltNA5DR8NAUM+8wJMbJyZ4G9/7i3v5zPBIMN5aybAh2/Jg==", - "dev": true, - "license": "MIT", - "dependencies": { - "call-bind": "^1.0.7", - "for-each": "^0.3.3", - "gopd": "^1.0.1", - "is-typed-array": "^1.1.13", - "possible-typed-array-names": "^1.0.0", - "reflect.getprototypeof": "^1.0.6" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/typedarray.prototype.slice": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/typedarray.prototype.slice/-/typedarray.prototype.slice-1.0.5.tgz", - "integrity": "sha512-q7QNVDGTdl702bVFiI5eY4l/HkgCM6at9KhcFbgUAzezHFbOVy4+0O/lCjsABEQwbZPravVfBIiBVGo89yzHFg==", - "dev": true, - "license": "MIT", - "dependencies": { - "call-bind": "^1.0.8", - "define-properties": "^1.2.1", - "es-abstract": "^1.23.9", - "es-errors": "^1.3.0", - "get-proto": "^1.0.1", - "math-intrinsics": "^1.1.0", - "typed-array-buffer": "^1.0.3", - "typed-array-byte-offset": "^1.0.4" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" + "type": "opencollective", + "url": "https://opencollective.com/express" } }, "node_modules/typescript": { - "version": "5.7.2", - "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.7.2.tgz", - "integrity": "sha512-i5t66RHxDvVN40HfDd1PsEThGNnlMCMT3jMUuoh9/0TaqWevNontacunWyN02LA9/fIbEWlcHZcgTKb9QoaLfg==", + "version": "5.9.3", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.9.3.tgz", + "integrity": "sha512-jl1vZzPDinLr9eUt3J/t7V6FgNEw9QjvBPdysz9KfQDD41fQrC2Y4vKQdiaUpFT4bXlb1RHhLpp8wtm6M5TgSw==", "devOptional": true, "license": "Apache-2.0", "bin": { @@ -19701,9 +13948,9 @@ } }, "node_modules/uint8array-extras": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/uint8array-extras/-/uint8array-extras-1.4.0.tgz", - "integrity": "sha512-ZPtzy0hu4cZjv3z5NW9gfKnNLjoz4y6uv4HlelAjDK7sY/xOkKZv9xK/WQpcsBB3jEybChz9DPC2U/+cusjJVQ==", + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/uint8array-extras/-/uint8array-extras-1.5.0.tgz", + "integrity": "sha512-rvKSBiC5zqCCiDZ9kAOszZcDvdAHwwIKJG33Ykj43OKcWsnmcBRL09YTU4nOeHZ8Y2a7l1MgTd08SBe9A8Qj6A==", "license": "MIT", "engines": { "node": ">=18" @@ -19712,79 +13959,16 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/unbox-primitive": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/unbox-primitive/-/unbox-primitive-1.1.0.tgz", - "integrity": "sha512-nWJ91DjeOkej/TA8pXQ3myruKpKEYgqvpw9lz4OPHj/NWFNluYrjbz9j01CJ8yKQd2g4jFoOkINCTW2I5LEEyw==", - "dev": true, - "license": "MIT", - "dependencies": { - "call-bound": "^1.0.3", - "has-bigints": "^1.0.2", - "has-symbols": "^1.1.0", - "which-boxed-primitive": "^1.1.1" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, "node_modules/undici-types": { - "version": "6.20.0", - "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-6.20.0.tgz", - "integrity": "sha512-Ny6QZ2Nju20vw1SRHe3d9jVu6gJ+4e3+MMpqu7pqE5HT6WsTSlce++GQmK5UXS8mzV8DSYHrQH+Xrf2jVcuKNg==", + "version": "6.21.0", + "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-6.21.0.tgz", + "integrity": "sha512-iwDZqg0QAGrg9Rav5H4n0M64c3mkR59cJ6wQp+7C4nI0gsmExaedaYLNO44eT4AtBBwjbTiGPMlt2Md0T9H9JQ==", "license": "MIT" }, - "node_modules/unicode-canonical-property-names-ecmascript": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/unicode-canonical-property-names-ecmascript/-/unicode-canonical-property-names-ecmascript-2.0.1.tgz", - "integrity": "sha512-dA8WbNeb2a6oQzAQ55YlT5vQAWGV9WXOsi3SskE3bcCdM0P4SDd+24zS/OCacdRq5BkdsRj9q3Pg6YyQoxIGqg==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=4" - } - }, - "node_modules/unicode-match-property-ecmascript": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/unicode-match-property-ecmascript/-/unicode-match-property-ecmascript-2.0.0.tgz", - "integrity": "sha512-5kaZCrbp5mmbz5ulBkDkbY0SsPOjKqVS35VpL9ulMPfSl0J0Xsm+9Evphv9CoIZFwre7aJoa94AY6seMKGVN5Q==", - "dev": true, - "license": "MIT", - "dependencies": { - "unicode-canonical-property-names-ecmascript": "^2.0.0", - "unicode-property-aliases-ecmascript": "^2.0.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/unicode-match-property-value-ecmascript": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/unicode-match-property-value-ecmascript/-/unicode-match-property-value-ecmascript-2.2.0.tgz", - "integrity": "sha512-4IehN3V/+kkr5YeSSDDQG8QLqO26XpL2XP3GQtqwlT/QYSECAwFztxVHjlbh0+gjJ3XmNLS0zDsbgs9jWKExLg==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=4" - } - }, - "node_modules/unicode-property-aliases-ecmascript": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/unicode-property-aliases-ecmascript/-/unicode-property-aliases-ecmascript-2.1.0.tgz", - "integrity": "sha512-6t3foTQI9qne+OZoVQB/8x8rk2k1eVy1gRXhV3oFQ5T6R1dqQ1xtin3XqSlx3+ATBkliTaR/hHyJBm+LVPNM8w==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=4" - } - }, "node_modules/unicorn-magic": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/unicorn-magic/-/unicorn-magic-0.1.0.tgz", - "integrity": "sha512-lRfVq8fE8gz6QMBuDM6a+LO3IAzTi05H6gCVaUpir2E1Rwpo4ZUog45KpNXKC/Mn3Yb9UDuHumeFTo9iV/D9FQ==", + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/unicorn-magic/-/unicorn-magic-0.3.0.tgz", + "integrity": "sha512-+QBBXBCvifc56fsbuxZQ6Sic3wqqc3WWaqxs58gvJrcOuN83HGTCwz3oS5phzU9LthRNE9VrJCFCLUgHeeFnfA==", "devOptional": true, "license": "MIT", "engines": { @@ -19813,9 +13997,9 @@ } }, "node_modules/update-browserslist-db": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.1.1.tgz", - "integrity": "sha512-R8UzCaa9Az+38REPiJ1tXlImTJXlVfgHZsglwBD/k6nj76ctsH1E3q4doGrukiLQd3sGQYu56r5+lo5r94l29A==", + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.2.3.tgz", + "integrity": "sha512-Js0m9cx+qOgDxo0eMiFGEueWztz+d4+M3rGlmKPT+T4IS/jP4ylw3Nwpu6cpTTP8R1MAC1kF4VbdLt3ARf209w==", "dev": true, "funding": [ { @@ -19834,7 +14018,7 @@ "license": "MIT", "dependencies": { "escalade": "^3.2.0", - "picocolors": "^1.1.0" + "picocolors": "^1.1.1" }, "bin": { "update-browserslist-db": "cli.js" @@ -19843,24 +14027,6 @@ "browserslist": ">= 4.21.0" } }, - "node_modules/upper-case": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/upper-case/-/upper-case-2.0.2.tgz", - "integrity": "sha512-KgdgDGJt2TpuwBUIjgG6lzw2GWFRCW9Qkfkiv0DxqHHLYJHmtmdUIKcZd8rHgFSjopVTlw6ggzCm1b8MFQwikg==", - "license": "MIT", - "dependencies": { - "tslib": "^2.0.3" - } - }, - "node_modules/upper-case-first": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/upper-case-first/-/upper-case-first-2.0.2.tgz", - "integrity": "sha512-514ppYHBaKwfJRK/pNC6c/OxfGa0obSnAl106u97Ed0I625Nin96KAjttZF6ZL3e1XLtphxnqrOi9iWgm+u+bg==", - "license": "MIT", - "dependencies": { - "tslib": "^2.0.3" - } - }, "node_modules/uri-js": { "version": "4.4.1", "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz", @@ -19877,13 +14043,6 @@ "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==", "license": "MIT" }, - "node_modules/utila": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/utila/-/utila-0.4.0.tgz", - "integrity": "sha512-Z0DbgELS9/L/75wZbro8xAnT50pBVFQZ+hUEueGDU5FN51YSCYM+jdxsfCiHjwNP/4LCDD0i/graKpeBnOXKRA==", - "dev": true, - "license": "MIT" - }, "node_modules/utils-merge": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/utils-merge/-/utils-merge-1.0.1.tgz", @@ -19898,6 +14057,7 @@ "version": "8.3.2", "resolved": "https://registry.npmjs.org/uuid/-/uuid-8.3.2.tgz", "integrity": "sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg==", + "deprecated": "uuid@10 and below is no longer supported. For ESM codebases, update to uuid@latest. For CommonJS codebases, use uuid@11 (but be aware this version will likely be deprecated in 2028).", "dev": true, "license": "MIT", "bin": { @@ -19917,16 +14077,10 @@ "dev": true, "license": "MIT" }, - "node_modules/valid-url": { - "version": "1.0.9", - "resolved": "https://registry.npmjs.org/valid-url/-/valid-url-1.0.9.tgz", - "integrity": "sha512-QQDsV8OnSf5Uc30CKSwG9lnhMPe6exHtTXLRYX8uMwKENy640pU+2BgBL0LRbDh/eYRahNCS7aewCx0wf3NYVA==", - "dev": true - }, "node_modules/validator": { - "version": "13.12.0", - "resolved": "https://registry.npmjs.org/validator/-/validator-13.12.0.tgz", - "integrity": "sha512-c1Q0mCiPlgdTVVVIJIrBuxNicYE+t/7oKeI9MWLj3fh/uq2Pxh/3eeWbVZ4OcGW1TUf53At0njHw5SMdA3tmMg==", + "version": "13.15.35", + "resolved": "https://registry.npmjs.org/validator/-/validator-13.15.35.tgz", + "integrity": "sha512-TQ5pAGhd5whStmqWvYF4OjQROlmv9SMFVt37qoCBdqRffuuklWYQlCNnEs2ZaIBD1kZRNnikiZOS1eqgkar0iw==", "license": "MIT", "engines": { "node": ">= 0.10" @@ -19942,21 +14096,23 @@ } }, "node_modules/vite": { - "version": "5.4.11", - "resolved": "https://registry.npmjs.org/vite/-/vite-5.4.11.tgz", - "integrity": "sha512-c7jFQRklXua0mTzneGW9QVyxFjUgwcihC4bXEtujIo2ouWCe1Ajt/amn2PCxYnhYfd5k09JX3SB7OYWFKYqj8Q==", + "version": "6.4.3", + "resolved": "https://registry.npmjs.org/vite/-/vite-6.4.3.tgz", + "integrity": "sha512-NTKlcQjlAK7MlQoyb6LgaqHc8sso/pVyUJYWMws3jg21uTJw/LddqIFPcPqP6PzpgbIcZyKI85sFE4HBrQDA8A==", "license": "MIT", - "peer": true, "dependencies": { - "esbuild": "^0.21.3", - "postcss": "^8.4.43", - "rollup": "^4.20.0" + "esbuild": "^0.25.0", + "fdir": "^6.4.4", + "picomatch": "^4.0.2", + "postcss": "^8.5.3", + "rollup": "^4.34.9", + "tinyglobby": "^0.2.13" }, "bin": { "vite": "bin/vite.js" }, "engines": { - "node": "^18.0.0 || >=20.0.0" + "node": "^18.0.0 || ^20.0.0 || >=22.0.0" }, "funding": { "url": "https://github.com/vitejs/vite?sponsor=1" @@ -19965,19 +14121,25 @@ "fsevents": "~2.3.3" }, "peerDependencies": { - "@types/node": "^18.0.0 || >=20.0.0", + "@types/node": "^18.0.0 || ^20.0.0 || >=22.0.0", + "jiti": ">=1.21.0", "less": "*", "lightningcss": "^1.21.0", "sass": "*", "sass-embedded": "*", "stylus": "*", "sugarss": "*", - "terser": "^5.4.0" + "terser": "^5.16.0", + "tsx": "^4.8.1", + "yaml": "^2.4.2" }, "peerDependenciesMeta": { "@types/node": { "optional": true }, + "jiti": { + "optional": true + }, "less": { "optional": true }, @@ -19998,6 +14160,12 @@ }, "terser": { "optional": true + }, + "tsx": { + "optional": true + }, + "yaml": { + "optional": true } } }, @@ -20006,7 +14174,6 @@ "resolved": "https://registry.npmjs.org/vite-plugin-restart/-/vite-plugin-restart-0.4.2.tgz", "integrity": "sha512-9aWN2ScJ8hbT7aC8SDeZnsbWapnslz1vhNq6Vgf2GU9WdN4NExlrWhtnu7pmtOUG3Guj8y6lPcUZ+ls7SVP33w==", "license": "MIT", - "peer": true, "dependencies": { "micromatch": "^4.0.8" }, @@ -20018,16 +14185,16 @@ } }, "node_modules/vue": { - "version": "3.5.13", - "resolved": "https://registry.npmjs.org/vue/-/vue-3.5.13.tgz", - "integrity": "sha512-wmeiSMxkZCSc+PM2w2VRsOYAZC8GdipNFRTsLSfodVqI9mbejKeXEGr8SckuLnrQPGe3oJN5c3K0vpoU9q/wCQ==", + "version": "3.5.35", + "resolved": "https://registry.npmjs.org/vue/-/vue-3.5.35.tgz", + "integrity": "sha512-cx89fnr+0kVGHiNFG6y6s0bdjypJRFNZn6x3WPstNdQR1bi1mbB7h4v5IBGTsPJU3nK1+0Iqj3Zf+hZWMieR4Q==", "license": "MIT", "dependencies": { - "@vue/compiler-dom": "3.5.13", - "@vue/compiler-sfc": "3.5.13", - "@vue/runtime-dom": "3.5.13", - "@vue/server-renderer": "3.5.13", - "@vue/shared": "3.5.13" + "@vue/compiler-dom": "3.5.35", + "@vue/compiler-sfc": "3.5.35", + "@vue/runtime-dom": "3.5.35", + "@vue/server-renderer": "3.5.35", + "@vue/shared": "3.5.35" }, "peerDependencies": { "typescript": "*" @@ -20038,39 +14205,15 @@ } } }, - "node_modules/vue-demi": { - "version": "0.14.10", - "resolved": "https://registry.npmjs.org/vue-demi/-/vue-demi-0.14.10.tgz", - "integrity": "sha512-nMZBOwuzabUO0nLgIcc6rycZEebF6eeUfaiQx9+WSk8e29IbLvPU9feI6tqW4kTo3hvoYAJkMh8n8D0fuISphg==", - "dev": true, - "hasInstallScript": true, - "license": "MIT", - "bin": { - "vue-demi-fix": "bin/vue-demi-fix.js", - "vue-demi-switch": "bin/vue-demi-switch.js" - }, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/antfu" - }, - "peerDependencies": { - "@vue/composition-api": "^1.0.0-rc.1", - "vue": "^3.0.0-0 || ^2.6.0" - }, - "peerDependenciesMeta": { - "@vue/composition-api": { - "optional": true - } - } - }, "node_modules/vue-facing-decorator": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/vue-facing-decorator/-/vue-facing-decorator-3.0.4.tgz", - "integrity": "sha512-Lk90PevJllB6qRRdLvLFjATZrv00nof1Ob6afavKL7Pc7V3eEin3vhdvEDRORdWKVvNoXhJbHejngWVuT0Pt0g==", + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/vue-facing-decorator/-/vue-facing-decorator-4.0.1.tgz", + "integrity": "sha512-zBvPoiXVVCOSctoKmcYUHFu2qu0AGYAZOfT6LnPqcrSSOpElTJTd21cOIrGrnA1rYwzlp8jhQLmlcBKv1ETNRA==", "dev": true, "license": "MIT", + "dependencies": { + "facing-metadata": "^2.0.0" + }, "peerDependencies": { "vue": "^3.0.0" } @@ -20098,72 +14241,6 @@ } } }, - "node_modules/vue-loader/node_modules/ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "dev": true, - "license": "MIT", - "dependencies": { - "color-convert": "^2.0.1" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" - } - }, - "node_modules/vue-loader/node_modules/chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", - "dev": true, - "license": "MIT", - "dependencies": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/chalk?sponsor=1" - } - }, - "node_modules/vue-loader/node_modules/color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "color-name": "~1.1.4" - }, - "engines": { - "node": ">=7.0.0" - } - }, - "node_modules/vue-loader/node_modules/color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "dev": true, - "license": "MIT" - }, - "node_modules/vue-loader/node_modules/supports-color": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", - "dev": true, - "license": "MIT", - "dependencies": { - "has-flag": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, "node_modules/vuedraggable": { "version": "4.1.0", "resolved": "https://registry.npmjs.org/vuedraggable/-/vuedraggable-4.1.0.tgz", @@ -20177,9 +14254,9 @@ } }, "node_modules/watchpack": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/watchpack/-/watchpack-2.4.2.tgz", - "integrity": "sha512-TnbFSbcOCcDgjZ4piURLCbJ3nJhznVh9kw6F6iokjiFPl8ONxe9A6nMDVXDiNbrSfLILs6vB07F7wLBrwPYzJw==", + "version": "2.5.1", + "resolved": "https://registry.npmjs.org/watchpack/-/watchpack-2.5.1.tgz", + "integrity": "sha512-Zn5uXdcFNIA1+1Ei5McRd+iRzfhENPCe7LeABkJtNulSxjma+l7ltNx55BWZkRlwRnpOgHqxnjyaDgJnNXnqzg==", "dev": true, "license": "MIT", "dependencies": { @@ -20200,16 +14277,6 @@ "minimalistic-assert": "^1.0.0" } }, - "node_modules/wcwidth": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/wcwidth/-/wcwidth-1.0.1.tgz", - "integrity": "sha512-XHPEwS0q6TaxcvG85+8EYkbiCux2XtWG2mkc47Ng2A77BQu9+DqIOJldST4HgPkuea7dvKSj5VgX3P1d4rW8Tg==", - "dev": true, - "license": "MIT", - "dependencies": { - "defaults": "^1.0.3" - } - }, "node_modules/webidl-conversions": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-3.0.1.tgz", @@ -20217,36 +14284,36 @@ "license": "BSD-2-Clause" }, "node_modules/webpack": { - "version": "5.97.1", - "resolved": "https://registry.npmjs.org/webpack/-/webpack-5.97.1.tgz", - "integrity": "sha512-EksG6gFY3L1eFMROS/7Wzgrii5mBAFe4rIr3r2BTfo7bcc+DWwFZ4OJ/miOuHJO/A85HwyI4eQ0F6IKXesO7Fg==", + "version": "5.107.2", + "resolved": "https://registry.npmjs.org/webpack/-/webpack-5.107.2.tgz", + "integrity": "sha512-v7RhXaJbpMlV0D7hC7lb2EbnxkoeUqf9qhKr6lozx3Q48pmFrqqNRmZFUEGmi7pSwm6fCQ2H1IjvCkHqdpVdjQ==", "dev": true, "license": "MIT", "peer": true, "dependencies": { - "@types/eslint-scope": "^3.7.7", - "@types/estree": "^1.0.6", + "@types/estree": "^1.0.8", + "@types/json-schema": "^7.0.15", "@webassemblyjs/ast": "^1.14.1", "@webassemblyjs/wasm-edit": "^1.14.1", "@webassemblyjs/wasm-parser": "^1.14.1", - "acorn": "^8.14.0", - "browserslist": "^4.24.0", + "acorn": "^8.16.0", + "acorn-import-phases": "^1.0.3", + "browserslist": "^4.28.1", "chrome-trace-event": "^1.0.2", - "enhanced-resolve": "^5.17.1", - "es-module-lexer": "^1.2.1", + "enhanced-resolve": "^5.22.0", + "es-module-lexer": "^2.1.0", "eslint-scope": "5.1.1", "events": "^3.2.0", "glob-to-regexp": "^0.4.1", "graceful-fs": "^4.2.11", - "json-parse-even-better-errors": "^2.3.1", - "loader-runner": "^4.2.0", - "mime-types": "^2.1.27", + "loader-runner": "^4.3.2", + "mime-db": "^1.54.0", "neo-async": "^2.6.2", - "schema-utils": "^3.2.0", - "tapable": "^2.1.1", - "terser-webpack-plugin": "^5.3.10", - "watchpack": "^2.4.1", - "webpack-sources": "^3.2.3" + "schema-utils": "^4.3.3", + "tapable": "^2.3.0", + "terser-webpack-plugin": "^5.5.0", + "watchpack": "^2.5.1", + "webpack-sources": "^3.5.0" }, "bin": { "webpack": "bin/webpack.js" @@ -20264,74 +14331,16 @@ } } }, - "node_modules/webpack-cli": { - "version": "5.1.4", - "resolved": "https://registry.npmjs.org/webpack-cli/-/webpack-cli-5.1.4.tgz", - "integrity": "sha512-pIDJHIEI9LR0yxHXQ+Qh95k2EvXpWzZ5l+d+jIo+RdSm9MiHfzazIxwwni/p7+x4eJZuvG1AJwgC4TNQ7NRgsg==", - "dev": true, - "license": "MIT", - "peer": true, - "dependencies": { - "@discoveryjs/json-ext": "^0.5.0", - "@webpack-cli/configtest": "^2.1.1", - "@webpack-cli/info": "^2.0.2", - "@webpack-cli/serve": "^2.0.5", - "colorette": "^2.0.14", - "commander": "^10.0.1", - "cross-spawn": "^7.0.3", - "envinfo": "^7.7.3", - "fastest-levenshtein": "^1.0.12", - "import-local": "^3.0.2", - "interpret": "^3.1.1", - "rechoir": "^0.8.0", - "webpack-merge": "^5.7.3" - }, - "bin": { - "webpack-cli": "bin/cli.js" - }, - "engines": { - "node": ">=14.15.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/webpack" - }, - "peerDependencies": { - "webpack": "5.x.x" - }, - "peerDependenciesMeta": { - "@webpack-cli/generators": { - "optional": true - }, - "webpack-bundle-analyzer": { - "optional": true - }, - "webpack-dev-server": { - "optional": true - } - } - }, - "node_modules/webpack-cli/node_modules/interpret": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/interpret/-/interpret-3.1.1.tgz", - "integrity": "sha512-6xwYfHbajpoF0xLW+iwLkhwgvLoZDfjYfoFNu8ftMoXINzwuymNLd9u/KmwtdT2GbR+/Cz66otEGEVVUHX9QLQ==", - "dev": true, - "license": "MIT", - "peer": true, - "engines": { - "node": ">=10.13.0" - } - }, "node_modules/webpack-dev-middleware": { - "version": "7.4.2", - "resolved": "https://registry.npmjs.org/webpack-dev-middleware/-/webpack-dev-middleware-7.4.2.tgz", - "integrity": "sha512-xOO8n6eggxnwYpy1NlzUKpvrjfJTvae5/D6WOK0S2LSo7vjmo5gCM1DbLUmFqrMTJP+W/0YZNctm7jasWvLuBA==", + "version": "7.4.5", + "resolved": "https://registry.npmjs.org/webpack-dev-middleware/-/webpack-dev-middleware-7.4.5.tgz", + "integrity": "sha512-uxQ6YqGdE4hgDKNf7hUiPXOdtkXvBJXrfEGYSx7P7LC8hnUYGK70X6xQXUvXeNyBDDcsiQXpG2m3G9vxowaEuA==", "dev": true, "license": "MIT", "dependencies": { "colorette": "^2.0.10", - "memfs": "^4.6.0", - "mime-types": "^2.1.31", + "memfs": "^4.43.1", + "mime-types": "^3.0.1", "on-finished": "^2.4.1", "range-parser": "^1.2.1", "schema-utils": "^4.0.0" @@ -20352,36 +14361,17 @@ } } }, - "node_modules/webpack-dev-middleware/node_modules/memfs": { - "version": "4.15.3", - "resolved": "https://registry.npmjs.org/memfs/-/memfs-4.15.3.tgz", - "integrity": "sha512-vR/g1SgqvKJgAyYla+06G4p/EOcEmwhYuVb1yc1ixcKf8o/sh7Zngv63957ZSNd1xrZJoinmNyDf2LzuP8WJXw==", - "dev": true, - "license": "Apache-2.0", - "dependencies": { - "@jsonjoy.com/json-pack": "^1.0.3", - "@jsonjoy.com/util": "^1.3.0", - "tree-dump": "^1.0.1", - "tslib": "^2.0.0" - }, - "engines": { - "node": ">= 4.0.0" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/streamich" - } - }, "node_modules/webpack-dev-server": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/webpack-dev-server/-/webpack-dev-server-5.2.0.tgz", - "integrity": "sha512-90SqqYXA2SK36KcT6o1bvwvZfJFcmoamqeJY7+boioffX9g9C0wjjJRGUrQIuh43pb0ttX7+ssavmj/WN2RHtA==", + "version": "5.2.4", + "resolved": "https://registry.npmjs.org/webpack-dev-server/-/webpack-dev-server-5.2.4.tgz", + "integrity": "sha512-GqDPGZN9bRqKBTkp4aWkobDDHMsrXKoGSdOH56smIri8qR0JG8gfL8/v/f/OZR3/OKXjG8uwJbFVhKm/FNU/UA==", "dev": true, "license": "MIT", "dependencies": { "@types/bonjour": "^3.5.13", "@types/connect-history-api-fallback": "^1.5.4", - "@types/express": "^4.17.21", + "@types/express": "^4.17.25", + "@types/express-serve-static-core": "^4.17.21", "@types/serve-index": "^1.9.4", "@types/serve-static": "^1.15.5", "@types/sockjs": "^0.3.36", @@ -20390,17 +14380,17 @@ "bonjour-service": "^1.2.1", "chokidar": "^3.6.0", "colorette": "^2.0.10", - "compression": "^1.7.4", + "compression": "^1.8.1", "connect-history-api-fallback": "^2.0.0", - "express": "^4.21.2", + "express": "^4.22.1", "graceful-fs": "^4.2.6", - "http-proxy-middleware": "^2.0.7", + "http-proxy-middleware": "^2.0.9", "ipaddr.js": "^2.1.0", "launch-editor": "^2.6.1", "open": "^10.0.3", "p-retry": "^6.2.0", "schema-utils": "^4.2.0", - "selfsigned": "^2.4.1", + "selfsigned": "^5.5.0", "serve-index": "^1.9.1", "sockjs": "^0.3.24", "spdy": "^4.0.2", @@ -20468,9 +14458,9 @@ } }, "node_modules/webpack-dev-server/node_modules/ipaddr.js": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-2.2.0.tgz", - "integrity": "sha512-Ag3wB2o37wslZS19hZqorUnrnzSkpOVy+IiiDEiTqNubEYpYuHWIf6K4psgN2ZWKExS4xhVCrRVfb/wfW8fWJA==", + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-2.4.0.tgz", + "integrity": "sha512-9VGk3HGanVE6JoZXHiCpnGy5X0jYDnN4EA4lntFPj+1vIWlFhIylq2CrrCOJH9EAhc5CYhq18F2Av2tgoAPsYQ==", "dev": true, "license": "MIT", "engines": { @@ -20478,9 +14468,9 @@ } }, "node_modules/webpack-dev-server/node_modules/picomatch": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", - "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.2.tgz", + "integrity": "sha512-V7+vQEJ06Z+c5tSye8S+nHUfI51xoXIXjHQ99cQtKUkQqqO1kO/KCJUfZXuB47h/YBlDhah2H3hdUGXn8ie0oA==", "dev": true, "license": "MIT", "engines": { @@ -20503,26 +14493,10 @@ "node": ">=8.10.0" } }, - "node_modules/webpack-merge": { - "version": "5.10.0", - "resolved": "https://registry.npmjs.org/webpack-merge/-/webpack-merge-5.10.0.tgz", - "integrity": "sha512-+4zXKdx7UnO+1jaN4l2lHVD+mFvnlZQP/6ljaJVb4SZiwIKeUnrT5l0gkT8z+n4hKpC+jpOv6O9R+gLtag7pSA==", - "dev": true, - "license": "MIT", - "peer": true, - "dependencies": { - "clone-deep": "^4.0.1", - "flat": "^5.0.2", - "wildcard": "^2.0.0" - }, - "engines": { - "node": ">=10.0.0" - } - }, "node_modules/webpack-sources": { - "version": "3.2.3", - "resolved": "https://registry.npmjs.org/webpack-sources/-/webpack-sources-3.2.3.tgz", - "integrity": "sha512-/DyMEOrDgLKKIG0fmvtz+4dUX/3Ghozwgm6iPp8KRhvn+eQf9+Q7GWxVNMk3+uCPWfdXYC4ExGBckIXdFEfH1w==", + "version": "3.5.0", + "resolved": "https://registry.npmjs.org/webpack-sources/-/webpack-sources-3.5.0.tgz", + "integrity": "sha512-HPuy+uuoTCaaoEoI1LQ3JN9+vrPBvEesnnX1jADHy728cHSMlq4wUc4afYqahq2B1mhQVZxCXOkNTnXltr+2vQ==", "dev": true, "license": "MIT", "peer": true, @@ -20530,6 +14504,14 @@ "node": ">=10.13.0" } }, + "node_modules/webpack/node_modules/es-module-lexer": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/es-module-lexer/-/es-module-lexer-2.1.0.tgz", + "integrity": "sha512-n27zTYMjYu1aj4MjCWzSP7G9r75utsaoc8m61weK+W8JMBGGQybd43GstCXZ3WNmSFtGT9wi59qQTW6mhTR5LQ==", + "dev": true, + "license": "MIT", + "peer": true + }, "node_modules/webpack/node_modules/eslint-scope": { "version": "5.1.1", "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-5.1.1.tgz", @@ -20556,30 +14538,10 @@ "node": ">=4.0" } }, - "node_modules/webpack/node_modules/schema-utils": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-3.3.0.tgz", - "integrity": "sha512-pN/yOAvcC+5rQ5nERGuwrjLlYvLTbCibnZ1I7B1LaiAz9BRBlE9GMgE/eqV30P7aJQUf7Ddimy/RsbYO/GrVGg==", - "dev": true, - "license": "MIT", - "peer": true, - "dependencies": { - "@types/json-schema": "^7.0.8", - "ajv": "^6.12.5", - "ajv-keywords": "^3.5.2" - }, - "engines": { - "node": ">= 10.13.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/webpack" - } - }, "node_modules/websocket-driver": { - "version": "0.7.4", - "resolved": "https://registry.npmjs.org/websocket-driver/-/websocket-driver-0.7.4.tgz", - "integrity": "sha512-b17KeDIQVjvb0ssuSDF2cYXSg2iztliJ4B9WdsuB6J952qCPKmnVq4DyW5motImXHDC1cBT/1UezrJVsKw5zjg==", + "version": "0.7.5", + "resolved": "https://registry.npmjs.org/websocket-driver/-/websocket-driver-0.7.5.tgz", + "integrity": "sha512-ZL2+3c7kMBdIRCMz6l8jQMHyGVxj+UL+xVk74Ombiciboca8rHa15L86B19E5oh1pL9Ii/uj54gtsIrZGMo6zA==", "dev": true, "license": "Apache-2.0", "dependencies": { @@ -20627,100 +14589,12 @@ "node": ">= 8" } }, - "node_modules/which-boxed-primitive": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/which-boxed-primitive/-/which-boxed-primitive-1.1.1.tgz", - "integrity": "sha512-TbX3mj8n0odCBFVlY8AxkqcHASw3L60jIuF8jFP78az3C2YhmGvqbHBpAjTRH2/xqYunrJ9g1jSyjCjpoWzIAA==", - "dev": true, - "license": "MIT", - "dependencies": { - "is-bigint": "^1.1.0", - "is-boolean-object": "^1.2.1", - "is-number-object": "^1.1.1", - "is-string": "^1.1.1", - "is-symbol": "^1.1.1" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/which-builtin-type": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/which-builtin-type/-/which-builtin-type-1.2.1.tgz", - "integrity": "sha512-6iBczoX+kDQ7a3+YJBnh3T+KZRxM/iYNPXicqk66/Qfm1b93iu+yOImkg0zHbj5LNOcNv1TEADiZ0xa34B4q6Q==", - "dev": true, - "license": "MIT", - "dependencies": { - "call-bound": "^1.0.2", - "function.prototype.name": "^1.1.6", - "has-tostringtag": "^1.0.2", - "is-async-function": "^2.0.0", - "is-date-object": "^1.1.0", - "is-finalizationregistry": "^1.1.0", - "is-generator-function": "^1.0.10", - "is-regex": "^1.2.1", - "is-weakref": "^1.0.2", - "isarray": "^2.0.5", - "which-boxed-primitive": "^1.1.0", - "which-collection": "^1.0.2", - "which-typed-array": "^1.1.16" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/which-collection": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/which-collection/-/which-collection-1.0.2.tgz", - "integrity": "sha512-K4jVyjnBdgvc86Y6BkaLZEN933SwYOuBFkdmBu9ZfkcAbdVbpITnDmjvZ/aQjRXQrv5EPkTnD1s39GiiqbngCw==", - "dev": true, - "license": "MIT", - "dependencies": { - "is-map": "^2.0.3", - "is-set": "^2.0.3", - "is-weakmap": "^2.0.2", - "is-weakset": "^2.0.3" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, "node_modules/which-module": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/which-module/-/which-module-2.0.1.tgz", "integrity": "sha512-iBdZ57RDvnOR9AGBhML2vFZf7h8vmBjhoaZqODJBFWHVtKkDmKuHai3cx5PgVMrX5YDNp27AofYbAwctSS+vhQ==", "license": "ISC" }, - "node_modules/which-typed-array": { - "version": "1.1.18", - "resolved": "https://registry.npmjs.org/which-typed-array/-/which-typed-array-1.1.18.tgz", - "integrity": "sha512-qEcY+KJYlWyLH9vNbsr6/5j59AXk5ni5aakf8ldzBvGde6Iz4sxZGkJyWSAueTG7QhOvNRYb1lDdFmL5Td0QKA==", - "dev": true, - "license": "MIT", - "dependencies": { - "available-typed-arrays": "^1.0.7", - "call-bind": "^1.0.8", - "call-bound": "^1.0.3", - "for-each": "^0.3.3", - "gopd": "^1.2.0", - "has-tostringtag": "^1.0.2" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, "node_modules/wide-align": { "version": "1.1.5", "resolved": "https://registry.npmjs.org/wide-align/-/wide-align-1.1.5.tgz", @@ -20759,14 +14633,6 @@ "node": ">=8" } }, - "node_modules/wildcard": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/wildcard/-/wildcard-2.0.1.tgz", - "integrity": "sha512-CC1bOL87PIWSBhDcTrdeLo6eGT7mCFtrg0uIJtqJUFyK+eJnzl8A1niH56uu7KMa5XFrtiV+AQuHO3n7DsHnLQ==", - "dev": true, - "license": "MIT", - "peer": true - }, "node_modules/word-wrap": { "version": "1.2.5", "resolved": "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.5.tgz", @@ -20784,113 +14650,26 @@ "license": "MIT" }, "node_modules/wrap-ansi": { - "version": "9.0.0", - "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-9.0.0.tgz", - "integrity": "sha512-G8ura3S+3Z2G+mkgNRq8dqaFZAuxfsxpBB8OCTGRTCtp+l/v9nbFNmCUP1BZMts3G1142MsZfn6eeUKrr4PD1Q==", + "version": "10.0.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-10.0.0.tgz", + "integrity": "sha512-SGcvg80f0wUy2/fXES19feHMz8E0JoXv2uNgHOu4Dgi2OrCy1lqwFYEJz1BLbDI0exjPMe/ZdzZ/YpGECBG/aQ==", "license": "MIT", "dependencies": { - "ansi-styles": "^6.2.1", - "string-width": "^7.0.0", - "strip-ansi": "^7.1.0" + "ansi-styles": "^6.2.3", + "string-width": "^8.2.0", + "strip-ansi": "^7.1.2" }, "engines": { - "node": ">=18" + "node": ">=20" }, "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, - "license": "MIT", - "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-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "dev": true, - "license": "MIT", - "dependencies": { - "color-convert": "^2.0.1" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" - } - }, - "node_modules/wrap-ansi-cjs/node_modules/color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "color-name": "~1.1.4" - }, - "engines": { - "node": ">=7.0.0" - } - }, - "node_modules/wrap-ansi-cjs/node_modules/color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "dev": true, - "license": "MIT" - }, - "node_modules/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, - "license": "MIT" - }, - "node_modules/wrap-ansi-cjs/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, - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "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, - "license": "MIT", - "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/node_modules/ansi-regex": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.1.0.tgz", - "integrity": "sha512-7HSX4QQb4CspciLpVFwyRe79O3xsIZDDLER21kERQ71oaPodF8jL725AgJMFAYbooIqolJoRLuM81SpeUkpkvA==", + "version": "6.2.2", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.2.2.tgz", + "integrity": "sha512-Bq3SmSpyFHaWjPk8If9yc6svM8c56dB5BAtW4Qbw5jHTwwXXcTLoRMkpDJp6VL0XzlWaCHTXrkFURMYmD0sLqg==", "license": "MIT", "engines": { "node": ">=12" @@ -20900,9 +14679,9 @@ } }, "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==", + "version": "6.2.3", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-6.2.3.tgz", + "integrity": "sha512-4Dj6M28JB+oAH8kFkTLUo+a2jwOFkuqb3yucU0CANcRRUbxS0cP0nZYCGjcc3BNXwRIsUVmDGgzawme7zvJHvg==", "license": "MIT", "engines": { "node": ">=12" @@ -20911,13 +14690,29 @@ "url": "https://github.com/chalk/ansi-styles?sponsor=1" } }, - "node_modules/wrap-ansi/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==", + "node_modules/wrap-ansi/node_modules/string-width": { + "version": "8.2.1", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-8.2.1.tgz", + "integrity": "sha512-IIaP0g3iy9Cyy18w3M9YcaDudujEAVHKt3a3QJg1+sr/oX96TbaGUubG0hJyCjCBThFH+tFpcIyoUHUn1ogaLA==", "license": "MIT", "dependencies": { - "ansi-regex": "^6.0.1" + "get-east-asian-width": "^1.5.0", + "strip-ansi": "^7.1.2" + }, + "engines": { + "node": ">=20" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/wrap-ansi/node_modules/strip-ansi": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.2.0.tgz", + "integrity": "sha512-yDPMNjp4WyfYBkHnjIRLfca1i6KMyGCtsVgoKe/z1+6vukgaENdgGBZt+ZmKPc4gavvEZ5OgHfHdrazhgNyG7w==", + "license": "MIT", + "dependencies": { + "ansi-regex": "^6.2.2" }, "engines": { "node": ">=12" @@ -20933,9 +14728,9 @@ "license": "ISC" }, "node_modules/ws": { - "version": "8.18.0", - "resolved": "https://registry.npmjs.org/ws/-/ws-8.18.0.tgz", - "integrity": "sha512-8VbfWfHLbbwu3+N6OKsOMpBdT4kXPDDB9cJk2bJ6mh9ucxdlnNvH1e+roYkKmN9Nxw2yjz7VzeO9oOz2zJ04Pw==", + "version": "8.21.0", + "resolved": "https://registry.npmjs.org/ws/-/ws-8.21.0.tgz", + "integrity": "sha512-Vsp28b7DRcimFQvrqu2Wek3z1iYxDCWqHYB8Qsnk/S4RfaCQzPGPyBNuVjJV3cd6UiKtUtp6sNM77gWvzcCH+g==", "dev": true, "license": "MIT", "engines": { @@ -20954,19 +14749,35 @@ } } }, - "node_modules/xmlbuilder2": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/xmlbuilder2/-/xmlbuilder2-3.1.1.tgz", - "integrity": "sha512-WCSfbfZnQDdLQLiMdGUQpMxxckeQ4oZNMNhLVkcekTu7xhD4tuUDyAPoY8CwXvBYE6LwBHd6QW2WZXlOWr1vCw==", + "node_modules/wsl-utils": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/wsl-utils/-/wsl-utils-0.1.0.tgz", + "integrity": "sha512-h3Fbisa2nKGPxCpm89Hk33lBLsnaGBvctQopaBSOW/uIs6FTe1ATyAnKFJrzVs9vpGdsTe73WF3V4lIsk4Gacw==", + "dev": true, "license": "MIT", "dependencies": { - "@oozcitak/dom": "1.15.10", - "@oozcitak/infra": "1.0.8", - "@oozcitak/util": "8.3.8", - "js-yaml": "3.14.1" + "is-wsl": "^3.1.0" }, "engines": { - "node": ">=12.0" + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/xmlbuilder2": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/xmlbuilder2/-/xmlbuilder2-4.0.3.tgz", + "integrity": "sha512-bx8Q1STctnNaaDymWnkfQLKofs0mGNN7rLLapJlGuV3VlvegD7Ls4ggMjE3aUSWItCCzU0PEv45lI87iSigiCA==", + "license": "MIT", + "dependencies": { + "@oozcitak/dom": "^2.0.2", + "@oozcitak/infra": "^2.0.2", + "@oozcitak/util": "^10.0.0", + "js-yaml": "^4.1.1" + }, + "engines": { + "node": ">=20.0" } }, "node_modules/xslt3": { @@ -20983,18 +14794,6 @@ "xslt3": "xslt3.js" } }, - "node_modules/xslt3/node_modules/axios": { - "version": "1.7.9", - "resolved": "https://registry.npmjs.org/axios/-/axios-1.7.9.tgz", - "integrity": "sha512-LhLcE7Hbiryz8oMDdDptSrWowmB4Bl6RCt6sIJKpRB4XtVf0iEgewX3au/pJqm+Py1kCASkb/FFKjxQaLtxJvw==", - "dev": true, - "license": "MIT", - "dependencies": { - "follow-redirects": "^1.15.6", - "form-data": "^4.0.0", - "proxy-from-env": "^1.1.0" - } - }, "node_modules/xtend": { "version": "4.0.2", "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.2.tgz", @@ -21015,20 +14814,8 @@ "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz", "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==", "dev": true, - "license": "ISC" - }, - "node_modules/yaml": { - "version": "2.7.0", - "resolved": "https://registry.npmjs.org/yaml/-/yaml-2.7.0.tgz", - "integrity": "sha512-+hSoy/QHluxmC9kCIJyL/uyFmLmc+e5CFR5Wa+bpIhIj85LVb9ZH2nVnqrHoSvKogwODv0ClqZkmiSSaIH5LTA==", - "dev": true, "license": "ISC", - "bin": { - "yaml": "bin.mjs" - }, - "engines": { - "node": ">= 14" - } + "peer": true }, "node_modules/yargs": { "version": "15.4.1", @@ -21175,9 +14962,9 @@ } }, "node_modules/yocto-queue": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-1.1.1.tgz", - "integrity": "sha512-b4JR1PFR10y1mKjhHY9LaGo6tmrgjit7hxVIeAmyMw3jegXR4dhYqLaQF5zMXZxY7tLpMyJeLjr1C4rLmkVe8g==", + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-1.2.2.tgz", + "integrity": "sha512-4LCcse/U2MHZ63HAJVE+v71o7yOdIe4cZ70Wpf8D/IyjDKYQLV5GD46B+hSTjJsvV5PztjvHoU580EftxjDZFQ==", "license": "MIT", "engines": { "node": ">=12.20" @@ -21187,9 +14974,9 @@ } }, "node_modules/yoctocolors": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/yoctocolors/-/yoctocolors-2.1.1.tgz", - "integrity": "sha512-GQHQqAopRhwU8Kt1DDM8NjibDXHC8eoh1erhGAJPEyveY9qqVeXvVikNKrDz69sHowPMorbPUrH/mx8c50eiBQ==", + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/yoctocolors/-/yoctocolors-2.1.2.tgz", + "integrity": "sha512-CzhO+pFNo8ajLM2d2IW/R93ipy99LWjtwblvC1RsoSUMZgyLbYFr221TnSNT7GjGdYui6P459mw9JH/g/zW2ug==", "devOptional": true, "license": "MIT", "engines": { @@ -21210,6 +14997,17 @@ "stacktracey": "^2.1.8" } }, + "node_modules/youch-core": { + "version": "0.3.3", + "resolved": "https://registry.npmjs.org/youch-core/-/youch-core-0.3.3.tgz", + "integrity": "sha512-ho7XuGjLaJ2hWHoK8yFnsUGy2Y5uDpqSTq1FkHLK4/oqKtyUU1AFbOOxY4IpC9f0fTLjwYbslUz0Po5BpD1wrA==", + "devOptional": true, + "license": "MIT", + "dependencies": { + "@poppinss/exception": "^1.2.2", + "error-stack-parser-es": "^1.0.5" + } + }, "node_modules/youch-terminal": { "version": "2.2.3", "resolved": "https://registry.npmjs.org/youch-terminal/-/youch-terminal-2.2.3.tgz", @@ -21258,38 +15056,6 @@ "engines": { "node": ">= 0.6" } - }, - "node_modules/z-schema": { - "version": "5.0.5", - "resolved": "https://registry.npmjs.org/z-schema/-/z-schema-5.0.5.tgz", - "integrity": "sha512-D7eujBWkLa3p2sIpJA0d1pr7es+a7m0vFAnZLlCEKq/Ij2k0MLi9Br2UPxoxdYystm5K1yeBGzub0FlYUEWj2Q==", - "dev": true, - "license": "MIT", - "dependencies": { - "lodash.get": "^4.4.2", - "lodash.isequal": "^4.5.0", - "validator": "^13.7.0" - }, - "bin": { - "z-schema": "bin/z-schema" - }, - "engines": { - "node": ">=8.0.0" - }, - "optionalDependencies": { - "commander": "^9.4.1" - } - }, - "node_modules/z-schema/node_modules/commander": { - "version": "9.5.0", - "resolved": "https://registry.npmjs.org/commander/-/commander-9.5.0.tgz", - "integrity": "sha512-KRs7WVDKg86PWiuAqhDrAQnTXZKraVcCc6vFdL14qrZ/DcWwuRo7VoiYXalXO7S5GKpqYiVEwCbgFDfxNHKJBQ==", - "dev": true, - "license": "MIT", - "optional": true, - "engines": { - "node": "^12.20.0 || >=14" - } } } } diff --git a/package.json b/package.json index 9f4fb23..01f11fa 100644 --- a/package.json +++ b/package.json @@ -4,7 +4,8 @@ "private": true, "scripts": { "type-check": "tsc --noEmit", - "dev": "node ace serve --watch", + "dev": "node ace serve", + "devInspect": "node ace serve --watch --node-args='--inspect'", "compress:xslt": "./node_modules/xslt3/xslt3.js -xsl:public/assets2/datasetxml2oai-pmh.xslt -export:public/assets2/datasetxml2oai.sef.json -t -nogo '-ns:##html5'", "compress:solr": "./node_modules/xslt3/xslt3.js -xsl:public/assets2/solr.xslt -export:public/assets2/solr.sef.json -t -nogo '-ns:##html5'", "compress:doi": "./node_modules/xslt3/xslt3.js -xsl:public/assets2/doi_datacite.xslt -export:public/assets2/doi_datacite.sef.json -t -nogo '-ns:##html5'", @@ -15,90 +16,90 @@ "format-check": "prettier --check ./**/*.{ts,js}", "test": "node ace test" }, - "eslintIgnore": [ - "build" - ], + "eslintConfig": { + "ignorePatterns": [ + "build" + ] + }, "alias": { "vue": "./node_modules/vue/dist/vue.esm-bundler.js" }, "devDependencies": { "@adonisjs/assembler": "^7.1.1", - "@adonisjs/tsconfig": "^1.2.1", - "@babel/core": "^7.20.12", - "@babel/plugin-proposal-class-properties": "^7.18.6", - "@babel/plugin-proposal-decorators": "^7.20.13", - "@babel/plugin-transform-runtime": "^7.19.6", - "@babel/preset-env": "^7.20.2", - "@babel/preset-typescript": "^7.18.6", - "@japa/api-client": "^2.0.3", - "@japa/assert": "^3.0.0", - "@japa/plugin-adonisjs": "^3.0.0", - "@japa/runner": "^3.1.1", + "@adonisjs/tsconfig": "^1.4.0", + "@headlessui/vue": "^1.7.23", + "@japa/assert": "^4.0.1", + "@japa/plugin-adonisjs": "^4.0.0", + "@japa/runner": "^4.2.0", "@mdi/js": "^7.1.96", "@poppinss/utils": "^6.7.2", - "@swc/core": "^1.4.2", - "@symfony/webpack-encore": "^5.0.1", + "@swc/wasm": "^1.10.14", "@tailwindcss/forms": "^0.5.2", "@types/bcryptjs": "^2.4.6", "@types/clamscan": "^2.0.4", "@types/escape-html": "^1.0.4", - "@types/leaflet": "^1.9.3", + "@types/fs-extra": "^11.0.4", + "@types/leaflet": "^1.9.21", "@types/luxon": "^3.4.2", - "@types/node": "^22.5.5", + "@types/node": "^22.10.2", "@types/proxy-addr": "^2.0.0", "@types/qrcode": "^1.5.5", "@types/source-map-support": "^0.5.6", "@types/sprintf-js": "^1.1.4", "@types/supertest": "^6.0.2", + "@vitejs/plugin-vue": "^5.2.1", "autoprefixer": "^10.4.13", "babel-preset-typescript-vue3": "^2.0.17", "chart.js": "^4.2.0", "dotenv-webpack": "^8.0.1", "eslint": "^8.57.1", - "eslint-config-prettier": "^9.0.0", + "eslint-config-prettier": "^10.0.1", "eslint-plugin-adonis": "^2.1.1", "eslint-plugin-prettier": "^5.0.0-alpha.2", "numeral": "^2.0.6", - "pinia": "^2.0.30", - "pino-pretty": "^11.2.2", + "pinia": "^3.0.2", + "pino-pretty": "^13.0.0", "postcss-loader": "^8.1.1", - "prettier": "^3.0.0", + "prettier": "^3.4.2", "supertest": "^6.3.3", - "tailwindcss": "^3.2.4", + "tailwindcss": "^3.4.17", "ts-loader": "^9.4.2", - "ts-node": "^10.9.2", - "typescript": "^5.1.3", + "ts-node-maintained": "^10.9.5", + "typescript": "^5.9.3", + "vite": "^6.0.11", "vue": "^3.4.26", - "vue-facing-decorator": "^3.0.0", + "vue-facing-decorator": "^4.0.1", "vue-loader": "^17.0.1", "webpack-dev-server": "^5.1.0", "xslt3": "^2.5.0" }, "dependencies": { - "@adonisjs/auth": "^9.1.1", - "@adonisjs/core": "^6.3.1", + "@adonisjs/auth": "^9.2.4", + "@adonisjs/bodyparser": "^10.0.1", + "@adonisjs/core": "^6.21.0", "@adonisjs/cors": "^2.2.1", - "@adonisjs/drive": "^2.3.0", - "@adonisjs/encore": "^1.0.0", - "@adonisjs/inertia": "^1.0.0-7", - "@adonisjs/lucid": "^21.1.0", + "@adonisjs/drive": "^3.2.0", + "@adonisjs/inertia": "^3.1.1", + "@adonisjs/lucid": "^21.5.1", "@adonisjs/mail": "^9.2.2", "@adonisjs/redis": "^9.1.0", - "@adonisjs/session": "^7.1.1", + "@adonisjs/session": "^7.5.0", "@adonisjs/shield": "^8.1.1", "@adonisjs/static": "^1.1.1", + "@adonisjs/vite": "^4.0.0", "@eidellev/adonis-stardust": "^3.0.0", "@fontsource/archivo-black": "^5.0.1", "@fontsource/inter": "^5.0.1", "@inertiajs/inertia": "^0.11.1", - "@inertiajs/vue3": "^1.0.0", - "@opensearch-project/opensearch": "^2.4.0", + "@inertiajs/vue3": "^2.3.25", + "@opensearch-project/opensearch": "^3.2.0", "@phc/format": "^1.0.0", - "@vinejs/vine": "^2.0.0", + "@poppinss/manager": "^5.0.2", + "@vinejs/vine": "^3.0.0", + "axios": "^1.7.9", "bcrypt": "^5.1.1", "bcryptjs": "^2.4.3", "clamscan": "^2.1.2", - "crypto": "^1.0.1", "dayjs": "^1.11.7", "deep-email-validator": "^0.1.21", "edge.js": "^6.0.1", @@ -113,13 +114,20 @@ "node-exceptions": "^4.0.1", "notiwind": "^2.0.0", "pg": "^8.9.0", + "phc-argon2": "^1.1.4", "qrcode": "^1.5.3", - "redis": "^4.6.10", + "redis": "^6.0.0", "reflect-metadata": "^0.2.1", "saxon-js": "^2.5.0", "toastify-js": "^1.12.0", "vuedraggable": "^4.1.0", - "xmlbuilder2": "^3.1.1" + "xmlbuilder2": "^4.0.3" + }, + "hotHook": { + "boundaries": [ + "./app/Controllers/**/*.ts", + "./app/middleware/*.ts" + ] }, "type": "module", "imports": { diff --git a/postcss.config.cjs b/postcss.config.cjs index b6568f7..4ae9206 100644 --- a/postcss.config.cjs +++ b/postcss.config.cjs @@ -1,7 +1,10 @@ module.exports = { plugins: { // 'postcss-import': {}, - 'tailwindcss/nesting': {}, + // 'postcss-nesting': {}, + 'tailwindcss/nesting': {}, + // "@tailwindcss/postcss": {}, + // tailwindcss: {}, tailwindcss: {}, autoprefixer: {}, }, diff --git a/providers/drive/drivers/local.ts b/providers/drive/drivers/local.ts index b008752..7073cd0 100644 --- a/providers/drive/drivers/local.ts +++ b/providers/drive/drivers/local.ts @@ -74,7 +74,8 @@ export class LocalDriver implements LocalDriverContract { */ public async exists(location: string): Promise { try { - return await this.adapter.pathExists(this.makePath(location)); + let path_temp = this.makePath(location); //'/storage/app/files/421' + return await this.adapter.pathExists(path_temp); } catch (error) { throw CannotGetMetaDataException.invoke(location, 'exists', error); } diff --git a/providers/mail_provider.ts b/providers/mail_provider.ts index bb775d8..ba140bb 100644 --- a/providers/mail_provider.ts +++ b/providers/mail_provider.ts @@ -69,7 +69,7 @@ export default class MailProvider { const mailConfigProvider = this.app.config.get('mail'); const config = await configProvider.resolve(this.app, mailConfigProvider); - const iwas = await config.mailers.smtp(); + await config.mailers.smtp(); // iwas.config.host = 'hhhost'; // this.app.config.set('mail.mailers.smtp.host', 'xhost'); // const iwas = await config.mailers.smtp(); diff --git a/providers/query_builder_provider.ts b/providers/query_builder_provider.ts index 6509fae..ed7cfb7 100644 --- a/providers/query_builder_provider.ts +++ b/providers/query_builder_provider.ts @@ -63,6 +63,15 @@ export default class QueryBuilderProvider { public register() { // Register your own bindings + // const ModelQueryBuilder = this.app.container.bind('@adonisjs/lucid/orm/ModelQueryBuilder'); + + // ModelQueryBuilder.macro('whereTrue', function (columnName: string) { + // return this.where(columnName, true); + // }); + + // ModelQueryBuilder.macro('whereFalse', function (columnName: string) { + // return this.where(columnName, false); + // }); } public async boot() { @@ -73,15 +82,14 @@ export default class QueryBuilderProvider { // let rolesPluck = {}; let rolesPluck: { [key: number]: any } = {}; const result = await this.exec(); - result.forEach((user, index) => { - let idc; + result.forEach((user: { [key: string]: any }, index: number) => { + let idc: number; if (!id) { idc = index; } else { idc = user[id]; } - const value = user[valueColumn]; - // rolesPluck[idc] = user.name; + const value: any = user[valueColumn]; rolesPluck[idc] = value; }); return rolesPluck; diff --git a/providers/rule_provider.ts b/providers/rule_provider.ts new file mode 100644 index 0000000..c945a5d --- /dev/null +++ b/providers/rule_provider.ts @@ -0,0 +1,34 @@ +import { ApplicationService } from '@adonisjs/core/types'; + +export default class RuleProvider { + constructor(protected app: ApplicationService) {} + + public register() { + // Register your own bindings + } + + public async boot() { + // IoC container is ready + // await import("../src/rules/index.js"); + + await import('#start/rules/unique'); + await import('#start/rules/translated_language'); + await import('#start/rules/unique_person'); + // () => import('#start/rules/file_length'), + // () => import('#start/rules/file_scan'), + // () => import('#start/rules/allowed_extensions_mimetypes'), + await import('#start/rules/dependent_array_min_length'); + await import('#start/rules/referenceValidation'); + await import('#start/rules/valid_mimetype'); + await import('#start/rules/array_contains_types'); + await import('#start/rules/orcid'); + } + + public async ready() { + // App is ready + } + + public async shutdown() { + // Cleanup, since app is going down + } +} diff --git a/providers/vinejs_provider.ts b/providers/vinejs_provider.ts index f139594..568dd3e 100644 --- a/providers/vinejs_provider.ts +++ b/providers/vinejs_provider.ts @@ -4,9 +4,8 @@ |-------------------------------------------------------------------------- |*/ import type { ApplicationService } from '@adonisjs/core/types'; -import vine, { BaseLiteralType, Vine } from '@vinejs/vine'; -import type { Validation, FieldContext, FieldOptions } from '@vinejs/vine/types'; -// import type { MultipartFile, FileValidationOptions } from '@adonisjs/bodyparser/types'; +import vine, { symbols, BaseLiteralType, Vine } from '@vinejs/vine'; +import type { FieldContext, FieldOptions } from '@vinejs/vine/types'; import type { MultipartFile } from '@adonisjs/core/bodyparser'; import type { FileValidationOptions } from '@adonisjs/core/types/bodyparser'; import { Request, RequestValidator } from '@adonisjs/core/http'; @@ -16,6 +15,7 @@ import MimeType from '#models/mime_type'; * Validation options accepted by the "file" rule */ export type FileRuleValidationOptions = Partial | ((field: FieldContext) => Partial); + /** * Extend VineJS */ @@ -24,31 +24,66 @@ declare module '@vinejs/vine' { myfile(options?: FileRuleValidationOptions): VineMultipartFile; } } + /** * Extend HTTP request class */ declare module '@adonisjs/core/http' { - interface Request extends RequestValidator { - } + interface Request extends RequestValidator {} } /** * Checks if the value is an instance of multipart file * from bodyparser. */ -export function isBodyParserFile(file: MultipartFile | unknown): boolean { +export function isBodyParserFile(file: MultipartFile | unknown): file is MultipartFile { return !!(file && typeof file === 'object' && 'isMultipartFile' in file); } -export async function getEnabledExtensions() { - const enabledExtensions = await MimeType.query().select('file_extension').where('enabled', true).exec(); - const extensions = enabledExtensions - .map((extension) => { - return extension.file_extension.split('|'); - }) - .flat(); - return extensions; -}; +/** + * Cache for enabled extensions to reduce database queries + */ +let extensionsCache: string[] | null = null; +let cacheTimestamp = 0; +const CACHE_DURATION = 5 * 60 * 1000; // 5 minutes + +/** + * Get enabled extensions with caching + */ +export async function getEnabledExtensions(): Promise { + const now = Date.now(); + + if (extensionsCache && now - cacheTimestamp < CACHE_DURATION) { + return extensionsCache; + } + + try { + const enabledExtensions = await MimeType.query().select('file_extension').where('enabled', true).exec(); + + const extensions = enabledExtensions + .map((extension) => extension.file_extension.split('|')) + .flat() + .map((ext) => ext.toLowerCase().trim()) + .filter((ext) => ext.length > 0); + + extensionsCache = [...new Set(extensions)]; // Remove duplicates + cacheTimestamp = now; + + return extensionsCache; + } catch (error) { + console.error('Error fetching enabled extensions:', error); + return extensionsCache || []; + } +} + +/** + * Clear extensions cache + */ +export function clearExtensionsCache(): void { + extensionsCache = null; + cacheTimestamp = 0; +} + /** * VineJS validation rule that validates the file to be an * instance of BodyParser MultipartFile class. @@ -65,6 +100,7 @@ const isMultipartFile = vine.createRule(async (file: MultipartFile | unknown, op // At this point, you can use type assertion to explicitly tell TypeScript that file is of type MultipartFile const validatedFile = file as MultipartFile; const validationOptions = typeof options === 'function' ? options(field) : options; + /** * Set size when it's defined in the options and missing * on the file instance @@ -72,28 +108,29 @@ const isMultipartFile = vine.createRule(async (file: MultipartFile | unknown, op if (validatedFile.sizeLimit === undefined && validationOptions.size) { validatedFile.sizeLimit = validationOptions.size; } + /** * Set extensions when it's defined in the options and missing * on the file instance */ - // if (validatedFile.allowedExtensions === undefined && validationOptions.extnames) { - // validatedFile.allowedExtensions = validationOptions.extnames; - // } - if (validatedFile.allowedExtensions === undefined && validationOptions.extnames) { - validatedFile.allowedExtensions = await getEnabledExtensions(); + if (validatedFile.allowedExtensions === undefined) { + if (validationOptions.extnames !== undefined) { + validatedFile.allowedExtensions = validationOptions.extnames; + } else { + validatedFile.allowedExtensions = await getEnabledExtensions(); + } } - /** - * wieder löschen - * Set extensions when it's defined in the options and missing - * on the file instance - */ - // if (file.clientNameSizeLimit === undefined && validationOptions.clientNameSizeLimit) { - // file.clientNameSizeLimit = validationOptions.clientNameSizeLimit; - // } + /** * Validate file */ - validatedFile.validate(); + try { + validatedFile.validate(); + } catch (error) { + field.report(`File validation failed: ${error.message}`, 'file.validation_error', field, validationOptions); + return; + } + /** * Report errors */ @@ -102,24 +139,40 @@ const isMultipartFile = vine.createRule(async (file: MultipartFile | unknown, op }); }); -export class VineMultipartFile extends BaseLiteralType { - // #private; - // constructor(validationOptions?: FileRuleValidationOptions, options?: FieldOptions, validations?: Validation[]); - // clone(): this; +const MULTIPART_FILE: typeof symbols.SUBTYPE = symbols.SUBTYPE; - public validationOptions; +export class VineMultipartFile extends BaseLiteralType { + [MULTIPART_FILE]: string; + public validationOptions?: FileRuleValidationOptions; // extnames: (18) ['gpkg', 'htm', 'html', 'csv', 'txt', 'asc', 'c', 'cc', 'h', 'srt', 'tiff', 'pdf', 'png', 'zip', 'jpg', 'jpeg', 'jpe', 'xlsx'] // size: '512mb' - public constructor(validationOptions?: FileRuleValidationOptions, options?: FieldOptions, validations?: Validation[]) { - // super(options, validations); + public constructor(validationOptions?: FileRuleValidationOptions, options?: FieldOptions) { super(options, [isMultipartFile(validationOptions || {})]); this.validationOptions = validationOptions; } public clone(): any { - return new VineMultipartFile(this.validationOptions, this.cloneOptions(), this.cloneValidations()); + return new VineMultipartFile(this.validationOptions, this.cloneOptions()); } + + /** + * Set maximum file size + */ + public maxSize(size: string | number): this { + const newOptions = { ...this.validationOptions, size }; + return new VineMultipartFile(newOptions, this.cloneOptions()) as this; + } + + /** + * Set allowed extensions + */ + public extensions(extnames: string[]): this { + const newOptions = { ...this.validationOptions, extnames }; + return new VineMultipartFile(newOptions, this.cloneOptions()) as this; + } + + } export default class VinejsProvider { @@ -138,13 +191,8 @@ export default class VinejsProvider { /** * The container bindings have booted */ - boot(): void { - // VineString.macro('translatedLanguage', function (this: VineString, options: Options) { - // return this.use(translatedLanguageRule(options)); - // }); - - Vine.macro('myfile', function (this: Vine, options) { + Vine.macro('myfile', function (this: Vine, options?: FileRuleValidationOptions) { return new VineMultipartFile(options); }); @@ -152,10 +200,47 @@ export default class VinejsProvider { * The validate method can be used to validate the request * data for the current request using VineJS validators */ - Request.macro('validateUsing', function (...args) { - return new RequestValidator(this.ctx).validateUsing(...args); - }); + Request.macro('validateUsing', function (this: Request, ...args) { + if (!this.ctx) { + throw new Error('HttpContext is not available'); + } + return new RequestValidator(this.ctx).validateUsing(...args); + }); + // Ensure MIME validation macros are loaded + this.loadMimeValidationMacros(); + this.loadFileScanMacros(); + this.loadFileLengthMacros(); + } + + /** + * Load MIME validation macros - called during boot to ensure they're available + */ + private async loadMimeValidationMacros(): Promise { + try { + // Dynamically import the MIME validation rule to ensure macros are registered + await import('#start/rules/allowed_extensions_mimetypes'); + } catch (error) { + console.warn('Could not load MIME validation macros:', error); + } + } + + private async loadFileScanMacros(): Promise { + try { + // Dynamically import the MIME validation rule to ensure macros are registered + await import('#start/rules/file_scan'); + } catch (error) { + console.warn('Could not load MIME validation macros:', error); + } + } + + private async loadFileLengthMacros(): Promise { + try { + // Dynamically import the MIME validation rule to ensure macros are registered + await import('#start/rules/file_length'); + } catch (error) { + console.warn('Could not load MIME validation macros:', error); + } } /** @@ -171,5 +256,7 @@ export default class VinejsProvider { /** * Preparing to shutdown the app */ - async shutdown() {} + async shutdown() { + clearExtensionsCache(); + } } diff --git a/public/android-chrome-192x192.png b/public/android-chrome-192x192.png new file mode 100644 index 0000000..4d9cf1b Binary files /dev/null and b/public/android-chrome-192x192.png differ diff --git a/public/android-chrome-512x512.png b/public/android-chrome-512x512.png new file mode 100644 index 0000000..7929356 Binary files /dev/null and b/public/android-chrome-512x512.png differ diff --git a/public/apple-touch-icon.png b/public/apple-touch-icon.png new file mode 100644 index 0000000..50558dc Binary files /dev/null and b/public/apple-touch-icon.png differ diff --git a/public/assets/entrypoints.json b/public/assets/entrypoints.json deleted file mode 100644 index 21084b2..0000000 --- a/public/assets/entrypoints.json +++ /dev/null @@ -1,12 +0,0 @@ -{ - "entrypoints": { - "app": { - "css": [ - "http://localhost:8080/assets/app.css" - ], - "js": [ - "http://localhost:8080/assets/app.js" - ] - } - } -} \ No newline at end of file diff --git a/public/assets/manifest.json b/public/assets/manifest.json deleted file mode 100644 index 9062764..0000000 --- a/public/assets/manifest.json +++ /dev/null @@ -1,103 +0,0 @@ -{ - "assets/app.css": "http://localhost:8080/assets/app.css", - "assets/app.js": "http://localhost:8080/assets/app.js", - "assets/resources_js_apps_settings_l18n_de_js.js": "http://localhost:8080/assets/resources_js_apps_settings_l18n_de_js.js", - "assets/resources_js_apps_settings_l18n_en_js.js": "http://localhost:8080/assets/resources_js_apps_settings_l18n_en_js.js", - "assets/resources_js_Pages_Admin_License_Index_vue.js": "http://localhost:8080/assets/resources_js_Pages_Admin_License_Index_vue.js", - "assets/resources_js_Pages_Admin_Mimetype_Create_vue.js": "http://localhost:8080/assets/resources_js_Pages_Admin_Mimetype_Create_vue.js", - "assets/resources_js_Pages_Admin_Mimetype_Delete_vue.js": "http://localhost:8080/assets/resources_js_Pages_Admin_Mimetype_Delete_vue.js", - "assets/resources_js_Pages_Admin_Mimetype_Index_vue.js": "http://localhost:8080/assets/resources_js_Pages_Admin_Mimetype_Index_vue.js", - "assets/resources_js_Pages_Admin_Permission_Create_vue.js": "http://localhost:8080/assets/resources_js_Pages_Admin_Permission_Create_vue.js", - "assets/resources_js_Pages_Admin_Permission_Edit_vue.js": "http://localhost:8080/assets/resources_js_Pages_Admin_Permission_Edit_vue.js", - "assets/resources_js_Pages_Admin_Permission_Index_vue.js": "http://localhost:8080/assets/resources_js_Pages_Admin_Permission_Index_vue.js", - "assets/resources_js_Pages_Admin_Permission_Show_vue.js": "http://localhost:8080/assets/resources_js_Pages_Admin_Permission_Show_vue.js", - "assets/resources_js_Pages_Admin_Role_Create_vue.js": "http://localhost:8080/assets/resources_js_Pages_Admin_Role_Create_vue.js", - "assets/resources_js_Pages_Admin_Role_Edit_vue.js": "http://localhost:8080/assets/resources_js_Pages_Admin_Role_Edit_vue.js", - "assets/resources_js_Pages_Admin_Role_Index_vue.js": "http://localhost:8080/assets/resources_js_Pages_Admin_Role_Index_vue.js", - "assets/resources_js_Pages_Admin_Role_Show_vue.js": "http://localhost:8080/assets/resources_js_Pages_Admin_Role_Show_vue.js", - "assets/resources_js_Pages_Admin_Settings_vue-resources_js_utils_toast_css.css": "http://localhost:8080/assets/resources_js_Pages_Admin_Settings_vue-resources_js_utils_toast_css.css", - "assets/resources_js_Pages_Admin_Settings_vue-resources_js_utils_toast_css.js": "http://localhost:8080/assets/resources_js_Pages_Admin_Settings_vue-resources_js_utils_toast_css.js", - "assets/resources_js_Pages_Admin_User_Create_vue-resources_js_Components_SimplePasswordMeter_password-f3312a.css": "http://localhost:8080/assets/resources_js_Pages_Admin_User_Create_vue-resources_js_Components_SimplePasswordMeter_password-f3312a.css", - "assets/resources_js_Pages_Admin_User_Create_vue-resources_js_Components_SimplePasswordMeter_password-f3312a.js": "http://localhost:8080/assets/resources_js_Pages_Admin_User_Create_vue-resources_js_Components_SimplePasswordMeter_password-f3312a.js", - "assets/resources_js_Pages_Admin_User_Edit_vue-resources_js_Components_SimplePasswordMeter_password-m-6dc207.css": "http://localhost:8080/assets/resources_js_Pages_Admin_User_Edit_vue-resources_js_Components_SimplePasswordMeter_password-m-6dc207.css", - "assets/resources_js_Pages_Admin_User_Edit_vue-resources_js_Components_SimplePasswordMeter_password-m-6dc207.js": "http://localhost:8080/assets/resources_js_Pages_Admin_User_Edit_vue-resources_js_Components_SimplePasswordMeter_password-m-6dc207.js", - "assets/resources_js_Pages_Admin_User_Index_vue.js": "http://localhost:8080/assets/resources_js_Pages_Admin_User_Index_vue.js", - "assets/resources_js_Pages_Admin_User_Show_vue.js": "http://localhost:8080/assets/resources_js_Pages_Admin_User_Show_vue.js", - "assets/resources_js_Pages_App_vue.js": "http://localhost:8080/assets/resources_js_Pages_App_vue.js", - "assets/resources_js_Pages_Auth_AccountInfo_vue-resources_js_utils_toast_css-resources_js_Components_-06c7b5.css": "http://localhost:8080/assets/resources_js_Pages_Auth_AccountInfo_vue-resources_js_utils_toast_css-resources_js_Components_-06c7b5.css", - "assets/resources_js_Pages_Auth_AccountInfo_vue-resources_js_utils_toast_css-resources_js_Components_-06c7b5.js": "http://localhost:8080/assets/resources_js_Pages_Auth_AccountInfo_vue-resources_js_utils_toast_css-resources_js_Components_-06c7b5.js", - "assets/resources_js_Pages_Auth_Login_vue.js": "http://localhost:8080/assets/resources_js_Pages_Auth_Login_vue.js", - "assets/resources_js_Pages_Auth_Register_vue.js": "http://localhost:8080/assets/resources_js_Pages_Auth_Register_vue.js", - "assets/resources_js_Pages_Dashboard_vue.js": "http://localhost:8080/assets/resources_js_Pages_Dashboard_vue.js", - "assets/resources_js_Pages_Editor_Dataset_Approve_vue.js": "http://localhost:8080/assets/resources_js_Pages_Editor_Dataset_Approve_vue.js", - "assets/resources_js_Pages_Editor_Dataset_Doi_vue.js": "http://localhost:8080/assets/resources_js_Pages_Editor_Dataset_Doi_vue.js", - "assets/resources_js_Pages_Editor_Dataset_Index_vue.js": "http://localhost:8080/assets/resources_js_Pages_Editor_Dataset_Index_vue.js", - "assets/resources_js_Pages_Editor_Dataset_Publish_vue.js": "http://localhost:8080/assets/resources_js_Pages_Editor_Dataset_Publish_vue.js", - "assets/resources_js_Pages_Editor_Dataset_Receive_vue.js": "http://localhost:8080/assets/resources_js_Pages_Editor_Dataset_Receive_vue.js", - "assets/resources_js_Pages_Editor_Dataset_Reject_vue.js": "http://localhost:8080/assets/resources_js_Pages_Editor_Dataset_Reject_vue.js", - "assets/resources_js_Pages_Error_vue.js": "http://localhost:8080/assets/resources_js_Pages_Error_vue.js", - "assets/resources_js_Pages_Errors_ServerError_vue.js": "http://localhost:8080/assets/resources_js_Pages_Errors_ServerError_vue.js", - "assets/resources_js_Pages_Errors_not_found_vue.js": "http://localhost:8080/assets/resources_js_Pages_Errors_not_found_vue.js", - "assets/resources_js_Pages_Map_vue-resources_js_Components_Map_draw_component_vue-resources_js_Compon-b0925c.css": "http://localhost:8080/assets/resources_js_Pages_Map_vue-resources_js_Components_Map_draw_component_vue-resources_js_Compon-b0925c.css", - "assets/resources_js_Pages_Map_vue-resources_js_Components_Map_draw_component_vue-resources_js_Compon-b0925c.js": "http://localhost:8080/assets/resources_js_Pages_Map_vue-resources_js_Components_Map_draw_component_vue-resources_js_Compon-b0925c.js", - "assets/resources_js_Pages_ProfileView_vue.js": "http://localhost:8080/assets/resources_js_Pages_ProfileView_vue.js", - "assets/resources_js_Pages_Reviewer_Dataset_Index_vue.js": "http://localhost:8080/assets/resources_js_Pages_Reviewer_Dataset_Index_vue.js", - "assets/resources_js_Pages_Reviewer_Dataset_Reject_vue.js": "http://localhost:8080/assets/resources_js_Pages_Reviewer_Dataset_Reject_vue.js", - "assets/resources_js_Pages_Reviewer_Dataset_Review_vue.js": "http://localhost:8080/assets/resources_js_Pages_Reviewer_Dataset_Review_vue.js", - "assets/resources_js_Pages_Submitter_Dataset_Category_vue.css": "http://localhost:8080/assets/resources_js_Pages_Submitter_Dataset_Category_vue.css", - "assets/resources_js_Pages_Submitter_Dataset_Category_vue.js": "http://localhost:8080/assets/resources_js_Pages_Submitter_Dataset_Category_vue.js", - "assets/resources_js_Pages_Submitter_Dataset_Create_vue-resources_js_utils_toast_css-resources_js_Com-03a898.css": "http://localhost:8080/assets/resources_js_Pages_Submitter_Dataset_Create_vue-resources_js_utils_toast_css-resources_js_Com-03a898.css", - "assets/resources_js_Pages_Submitter_Dataset_Create_vue-resources_js_utils_toast_css-resources_js_Com-03a898.js": "http://localhost:8080/assets/resources_js_Pages_Submitter_Dataset_Create_vue-resources_js_utils_toast_css-resources_js_Com-03a898.js", - "assets/resources_js_Pages_Submitter_Dataset_Delete_vue.js": "http://localhost:8080/assets/resources_js_Pages_Submitter_Dataset_Delete_vue.js", - "assets/resources_js_Pages_Submitter_Dataset_Edit_vue-resources_js_utils_toast_css-resources_js_Compo-a37b65.css": "http://localhost:8080/assets/resources_js_Pages_Submitter_Dataset_Edit_vue-resources_js_utils_toast_css-resources_js_Compo-a37b65.css", - "assets/resources_js_Pages_Submitter_Dataset_Edit_vue-resources_js_utils_toast_css-resources_js_Compo-a37b65.js": "http://localhost:8080/assets/resources_js_Pages_Submitter_Dataset_Edit_vue-resources_js_utils_toast_css-resources_js_Compo-a37b65.js", - "assets/resources_js_Pages_Submitter_Dataset_Index_vue.css": "http://localhost:8080/assets/resources_js_Pages_Submitter_Dataset_Index_vue.css", - "assets/resources_js_Pages_Submitter_Dataset_Index_vue.js": "http://localhost:8080/assets/resources_js_Pages_Submitter_Dataset_Index_vue.js", - "assets/resources_js_Pages_Submitter_Dataset_Release_vue.js": "http://localhost:8080/assets/resources_js_Pages_Submitter_Dataset_Release_vue.js", - "assets/resources_js_Pages_Submitter_Person_Index_vue.js": "http://localhost:8080/assets/resources_js_Pages_Submitter_Person_Index_vue.js", - "assets/resources_js_Pages_register-view_register-view-component_vue.js": "http://localhost:8080/assets/resources_js_Pages_register-view_register-view-component_vue.js", - "assets/vendors-node_modules_mdi_js_mdi_js-node_modules_vue-loader_dist_exportHelper_js.js": "http://localhost:8080/assets/vendors-node_modules_mdi_js_mdi_js-node_modules_vue-loader_dist_exportHelper_js.js", - "assets/vendors-node_modules_focus-trap_dist_focus-trap_esm_js-node_modules_notiwind_dist_index_esm_js.js": "http://localhost:8080/assets/vendors-node_modules_focus-trap_dist_focus-trap_esm_js-node_modules_notiwind_dist_index_esm_js.js", - "assets/vendors-node_modules_vue-facing-decorator_dist_esm_utils_js.js": "http://localhost:8080/assets/vendors-node_modules_vue-facing-decorator_dist_esm_utils_js.js", - "assets/vendors-node_modules_toastify-js_src_toastify_js.js": "http://localhost:8080/assets/vendors-node_modules_toastify-js_src_toastify_js.js", - "assets/vendors-node_modules_leaflet_dist_leaflet-src_js-node_modules_leaflet_src_control_Control_Att-adabdc.js": "http://localhost:8080/assets/vendors-node_modules_leaflet_dist_leaflet-src_js-node_modules_leaflet_src_control_Control_Att-adabdc.js", - "assets/vendors-node_modules_buffer_index_js-node_modules_vuedraggable_dist_vuedraggable_umd_js.js": "http://localhost:8080/assets/vendors-node_modules_buffer_index_js-node_modules_vuedraggable_dist_vuedraggable_umd_js.js", - "assets/vendors-node_modules_mime_dist_src_index_js.js": "http://localhost:8080/assets/vendors-node_modules_mime_dist_src_index_js.js", - "assets/vendors-node_modules_numeral_numeral_js-node_modules_chart_js_dist_chart_js.js": "http://localhost:8080/assets/vendors-node_modules_numeral_numeral_js-node_modules_chart_js_dist_chart_js.js", - "assets/resources_js_Components_BaseButton_vue.js": "http://localhost:8080/assets/resources_js_Components_BaseButton_vue.js", - "assets/resources_js_Stores_main_ts-resources_js_Components_BaseDivider_vue-resources_js_Components_C-b45805.js": "http://localhost:8080/assets/resources_js_Stores_main_ts-resources_js_Components_BaseDivider_vue-resources_js_Components_C-b45805.js", - "assets/resources_js_Layouts_LayoutAuthenticated_vue.css": "http://localhost:8080/assets/resources_js_Layouts_LayoutAuthenticated_vue.css", - "assets/resources_js_Layouts_LayoutAuthenticated_vue.js": "http://localhost:8080/assets/resources_js_Layouts_LayoutAuthenticated_vue.js", - "assets/resources_js_Components_BaseButtons_vue-resources_js_Components_FormControl_vue-resources_js_-d830d6.js": "http://localhost:8080/assets/resources_js_Components_BaseButtons_vue-resources_js_Components_FormControl_vue-resources_js_-d830d6.js", - "assets/resources_js_Components_Admin_Pagination_vue-resources_js_Components_BaseButtons_vue-resource-6f3a70.js": "http://localhost:8080/assets/resources_js_Components_Admin_Pagination_vue-resources_js_Components_BaseButtons_vue-resource-6f3a70.js", - "assets/resources_js_utils_toast_ts-resources_js_Components_NotificationBar_vue.js": "http://localhost:8080/assets/resources_js_utils_toast_ts-resources_js_Components_NotificationBar_vue.js", - "assets/resources_js_Components_Map_draw_component_vue-resources_js_Components_Map_zoom_component_vue-058bcc.js": "http://localhost:8080/assets/resources_js_Components_Map_draw_component_vue-resources_js_Components_Map_zoom_component_vue-058bcc.js", - "assets/resources_js_Components_SectionMain_vue-resources_js_Components_SectionTitleLineWithButton_vu-764dfe.js": "http://localhost:8080/assets/resources_js_Components_SectionMain_vue-resources_js_Components_SectionTitleLineWithButton_vu-764dfe.js", - "assets/resources_js_Components_BaseButtons_vue-resources_js_Components_NotificationBar_vue-resources-7e06d8.js": "http://localhost:8080/assets/resources_js_Components_BaseButtons_vue-resources_js_Components_NotificationBar_vue-resources-7e06d8.js", - "assets/resources_js_Components_Admin_Sort_vue-resources_js_Components_SectionTitleLineWithButton_vue.js": "http://localhost:8080/assets/resources_js_Components_Admin_Sort_vue-resources_js_Components_SectionTitleLineWithButton_vue.js", - "assets/resources_js_Components_CardBoxModal_vue.js": "http://localhost:8080/assets/resources_js_Components_CardBoxModal_vue.js", - "assets/resources_js_Components_FileUpload_vue-resources_js_Components_FormCheckRadioGroup_vue-resour-25e686.js": "http://localhost:8080/assets/resources_js_Components_FileUpload_vue-resources_js_Components_FormCheckRadioGroup_vue-resour-25e686.js", - "assets/fonts/inter-latin-ext-400-normal.woff": "http://localhost:8080/assets/fonts/inter-latin-ext-400-normal.1c20f7dc.woff", - "assets/fonts/inter-latin-400-normal.woff": "http://localhost:8080/assets/fonts/inter-latin-400-normal.b0c8fe9d.woff", - "assets/fonts/inter-latin-ext-400-normal.woff2": "http://localhost:8080/assets/fonts/inter-latin-ext-400-normal.3d10c85f.woff2", - "assets/fonts/inter-latin-400-normal.woff2": "http://localhost:8080/assets/fonts/inter-latin-400-normal.9698cc7d.woff2", - "assets/fonts/archivo-black-latin-400-normal.woff2": "http://localhost:8080/assets/fonts/archivo-black-latin-400-normal.fc847a1f.woff2", - "assets/fonts/archivo-black-latin-ext-400-normal.woff2": "http://localhost:8080/assets/fonts/archivo-black-latin-ext-400-normal.21761451.woff2", - "assets/fonts/inter-cyrillic-ext-400-normal.woff": "http://localhost:8080/assets/fonts/inter-cyrillic-ext-400-normal.e8945162.woff", - "assets/fonts/archivo-black-latin-400-normal.woff": "http://localhost:8080/assets/fonts/archivo-black-latin-400-normal.58a301a6.woff", - "assets/fonts/inter-cyrillic-ext-400-normal.woff2": "http://localhost:8080/assets/fonts/inter-cyrillic-ext-400-normal.fd1478dc.woff2", - "assets/fonts/inter-cyrillic-400-normal.woff": "http://localhost:8080/assets/fonts/inter-cyrillic-400-normal.e2841352.woff", - "assets/fonts/inter-greek-400-normal.woff": "http://localhost:8080/assets/fonts/inter-greek-400-normal.a42da273.woff", - "assets/fonts/archivo-black-latin-ext-400-normal.woff": "http://localhost:8080/assets/fonts/archivo-black-latin-ext-400-normal.5ab5ba92.woff", - "assets/fonts/inter-greek-400-normal.woff2": "http://localhost:8080/assets/fonts/inter-greek-400-normal.a8de720a.woff2", - "assets/fonts/inter-cyrillic-400-normal.woff2": "http://localhost:8080/assets/fonts/inter-cyrillic-400-normal.cb04b2ee.woff2", - "assets/fonts/inter-greek-ext-400-normal.woff": "http://localhost:8080/assets/fonts/inter-greek-ext-400-normal.b9e1e894.woff", - "assets/fonts/inter-vietnamese-400-normal.woff": "http://localhost:8080/assets/fonts/inter-vietnamese-400-normal.96f8adc7.woff", - "assets/fonts/inter-greek-ext-400-normal.woff2": "http://localhost:8080/assets/fonts/inter-greek-ext-400-normal.f2fa0d9e.woff2", - "assets/fonts/inter-vietnamese-400-normal.woff2": "http://localhost:8080/assets/fonts/inter-vietnamese-400-normal.44c9df13.woff2", - "assets/images/marker-icon.png": "http://localhost:8080/assets/images/marker-icon.2b3e1faf.png", - "assets/images/layers-2x.png": "http://localhost:8080/assets/images/layers-2x.8f2c4d11.png", - "assets/images/layers.png": "http://localhost:8080/assets/images/layers.416d9136.png", - "assets/images/Close.svg": "http://localhost:8080/assets/images/Close.e4887675.svg", - "assets/vendors-node_modules_vue-facing-decorator_dist_esm_index_js-node_modules_vue-facing-decorator-818045.js": "http://localhost:8080/assets/vendors-node_modules_vue-facing-decorator_dist_esm_index_js-node_modules_vue-facing-decorator-818045.js" -} \ No newline at end of file diff --git a/public/assets2/doi_datacite.sef.json b/public/assets2/doi_datacite.sef.json index 8a074a6..6da5176 100644 --- a/public/assets2/doi_datacite.sef.json +++ b/public/assets2/doi_datacite.sef.json @@ -1 +1 @@ -{"N":"package","version":"30","packageVersion":"1","saxonVersion":"SaxonJS 2.6","target":"JS","targetVersion":"2","name":"TOP-LEVEL","relocatable":"false","buildDateTime":"2024-01-24T15:02:04.209+01:00","ns":"xml=~ xsl=~ oai_dc=http://www.openarchives.org/OAI/2.0/oai_dc/ dc=http://purl.org/dc/elements/1.1/ xsi=~","C":[{"N":"co","id":"0","uniform":"true","binds":"3","C":[{"N":"template","flags":"os","module":"doi_datacite.xslt","slots":"200","baseUri":"file:///home/administrator/tethys/tethys.myapp/public/assets2/doi_datacite.xslt","name":"Q{}RdrDate2","line":"152","ns":"xml=~ =http://datacite.org/schema/kernel-4 xsl=~ oai_dc=http://www.openarchives.org/OAI/2.0/oai_dc/ dc=http://purl.org/dc/elements/1.1/ xsi=~","expand-text":"false","sType":"* ","C":[{"N":"sequence","role":"body","sType":"* ","C":[{"N":"choose","sType":"? ","line":"153","C":[{"N":"and","sType":"1AB","ns":"= xml=~ fn=~ xsl=~ oai_dc=http://www.openarchives.org/OAI/2.0/oai_dc/ dc=http://purl.org/dc/elements/1.1/ xsi=~ ","line":"153","C":[{"N":"axis","name":"child","nodeTest":"*NE u[NE nQ{}EmbargoDate,NE nQ{http://www.w3.org/1999/xhtml}EmbargoDate]"},{"N":"gc","op":"<","comp":"GAC|http://www.w3.org/2005/xpath-functions/collation/codepoint","card":"1:1","C":[{"N":"data","diag":"1|0||gc","C":[{"N":"gVarRef","name":"Q{}unixTimestamp","bSlot":"0"}]},{"N":"data","diag":"1|1||gc","C":[{"N":"slash","op":"/","C":[{"N":"axis","name":"child","nodeTest":"*NE u[NE nQ{}EmbargoDate,NE nQ{http://www.w3.org/1999/xhtml}EmbargoDate]"},{"N":"axis","name":"attribute","nodeTest":"*NA nQ{}UnixTimestamp"}]}]}]}]},{"N":"elem","name":"date","sType":"1NE nQ{http://datacite.org/schema/kernel-4}date ","nsuri":"http://datacite.org/schema/kernel-4","namespaces":"=http://datacite.org/schema/kernel-4 xsi=http://www.w3.org/2001/XMLSchema-instance oai_dc=http://www.openarchives.org/OAI/2.0/oai_dc/ dc=http://purl.org/dc/elements/1.1/","line":"154","C":[{"N":"sequence","sType":"*N ","C":[{"N":"att","name":"dateType","sType":"1NA ","line":"155","C":[{"N":"fn","name":"string-join","role":"select","C":[{"N":"forEach","sType":"*AS ","C":[{"N":"data","sType":"*A ","C":[{"N":"mergeAdj","C":[{"N":"valueOf","sType":"1NT ","C":[{"N":"str","sType":"1AS ","val":"Available"}]}]}]},{"N":"fn","name":"string","sType":"1AS ","C":[{"N":"dot"}]}]},{"N":"str","sType":"1AS ","val":""}]}]},{"N":"let","var":"Q{}embargoDate","slot":"0","sType":"*NT ","line":"160","C":[{"N":"fn","name":"concat","sType":"1AS","ns":"= xml=~ fn=~ xsl=~ oai_dc=http://www.openarchives.org/OAI/2.0/oai_dc/ dc=http://purl.org/dc/elements/1.1/ xsi=~ ","role":"select","line":"160","C":[{"N":"check","card":"?","diag":"0|0||concat","C":[{"N":"data","diag":"0|0||concat","C":[{"N":"slash","op":"/","C":[{"N":"axis","name":"child","nodeTest":"*NE u[NE nQ{}EmbargoDate,NE nQ{http://www.w3.org/1999/xhtml}EmbargoDate]"},{"N":"axis","name":"attribute","nodeTest":"*NA nQ{}Year"}]}]}]},{"N":"str","val":"-"},{"N":"fn","name":"format-number","C":[{"N":"fn","name":"number","C":[{"N":"check","card":"?","diag":"0|0||number","C":[{"N":"data","diag":"0|0||number","C":[{"N":"slash","op":"/","C":[{"N":"axis","name":"child","nodeTest":"*NE u[NE nQ{}EmbargoDate,NE nQ{http://www.w3.org/1999/xhtml}EmbargoDate]"},{"N":"axis","name":"attribute","nodeTest":"*NA nQ{}Month"}]}]}]}]},{"N":"str","val":"00"}]},{"N":"str","val":"-"},{"N":"fn","name":"format-number","C":[{"N":"fn","name":"number","C":[{"N":"check","card":"?","diag":"0|0||number","C":[{"N":"data","diag":"0|0||number","C":[{"N":"slash","op":"/","C":[{"N":"axis","name":"child","nodeTest":"*NE u[NE nQ{}EmbargoDate,NE nQ{http://www.w3.org/1999/xhtml}EmbargoDate]"},{"N":"axis","name":"attribute","nodeTest":"*NA nQ{}Day"}]}]}]}]},{"N":"str","val":"00"}]}]},{"N":"valueOf","flags":"l","sType":"1NT ","line":"161","C":[{"N":"fn","name":"string-join","role":"select","C":[{"N":"forEach","sType":"*AS ","C":[{"N":"data","sType":"*A ","C":[{"N":"mergeAdj","C":[{"N":"varRef","sType":"*","name":"Q{}embargoDate","slot":"0","ns":"= xml=~ fn=~ xsl=~ oai_dc=http://www.openarchives.org/OAI/2.0/oai_dc/ dc=http://purl.org/dc/elements/1.1/ xsi=~ ","role":"select","line":"161"}]}]},{"N":"fn","name":"string","sType":"1AS ","C":[{"N":"dot"}]}]},{"N":"str","sType":"1AS ","val":" "}]}]}]}]}]},{"N":"true"},{"N":"empty","sType":"0 "}]},{"N":"choose","sType":"? ","line":"164","C":[{"N":"docOrder","sType":"*NE u[NE nQ{}CreatedAt,NE nQ{http://www.w3.org/1999/xhtml}CreatedAt]","line":"164","C":[{"N":"slash","role":"select","simple":"1","sType":"*NE u[NE nQ{}CreatedAt,NE nQ{http://www.w3.org/1999/xhtml}CreatedAt]","C":[{"N":"treat","as":"N","diag":"13|0|XTTE0510|","C":[{"N":"dot"}]},{"N":"axis","name":"child","nodeTest":"*NE u[NE nQ{}CreatedAt,NE nQ{http://www.w3.org/1999/xhtml}CreatedAt]","sType":"*NE u[NE nQ{}CreatedAt,NE nQ{http://www.w3.org/1999/xhtml}CreatedAt]","ns":"= xml=~ fn=~ xsl=~ oai_dc=http://www.openarchives.org/OAI/2.0/oai_dc/ dc=http://purl.org/dc/elements/1.1/ xsi=~ "}]}]},{"N":"elem","name":"date","sType":"1NE nQ{http://datacite.org/schema/kernel-4}date ","nsuri":"http://datacite.org/schema/kernel-4","namespaces":"=http://datacite.org/schema/kernel-4 xsi=http://www.w3.org/2001/XMLSchema-instance oai_dc=http://www.openarchives.org/OAI/2.0/oai_dc/ dc=http://purl.org/dc/elements/1.1/","line":"165","C":[{"N":"sequence","sType":"*N ","C":[{"N":"att","name":"dateType","sType":"1NA ","line":"166","C":[{"N":"fn","name":"string-join","role":"select","C":[{"N":"forEach","sType":"*AS ","C":[{"N":"data","sType":"*A ","C":[{"N":"mergeAdj","C":[{"N":"valueOf","sType":"1NT ","C":[{"N":"str","sType":"1AS ","val":"Created"}]}]}]},{"N":"fn","name":"string","sType":"1AS ","C":[{"N":"dot"}]}]},{"N":"str","sType":"1AS ","val":""}]}]},{"N":"let","var":"Q{}createdAt","slot":"0","sType":"*NT ","line":"171","C":[{"N":"fn","name":"concat","sType":"1AS","ns":"= xml=~ fn=~ xsl=~ oai_dc=http://www.openarchives.org/OAI/2.0/oai_dc/ dc=http://purl.org/dc/elements/1.1/ xsi=~ ","role":"select","line":"171","C":[{"N":"check","card":"?","diag":"0|0||concat","C":[{"N":"data","diag":"0|0||concat","C":[{"N":"slash","op":"/","C":[{"N":"axis","name":"child","nodeTest":"*NE u[NE nQ{}CreatedAt,NE nQ{http://www.w3.org/1999/xhtml}CreatedAt]"},{"N":"axis","name":"attribute","nodeTest":"*NA nQ{}Year"}]}]}]},{"N":"str","val":"-"},{"N":"fn","name":"format-number","C":[{"N":"fn","name":"number","C":[{"N":"check","card":"?","diag":"0|0||number","C":[{"N":"data","diag":"0|0||number","C":[{"N":"slash","op":"/","C":[{"N":"axis","name":"child","nodeTest":"*NE u[NE nQ{}CreatedAt,NE nQ{http://www.w3.org/1999/xhtml}CreatedAt]"},{"N":"axis","name":"attribute","nodeTest":"*NA nQ{}Month"}]}]}]}]},{"N":"str","val":"00"}]},{"N":"str","val":"-"},{"N":"fn","name":"format-number","C":[{"N":"fn","name":"number","C":[{"N":"check","card":"?","diag":"0|0||number","C":[{"N":"data","diag":"0|0||number","C":[{"N":"slash","op":"/","C":[{"N":"axis","name":"child","nodeTest":"*NE u[NE nQ{}CreatedAt,NE nQ{http://www.w3.org/1999/xhtml}CreatedAt]"},{"N":"axis","name":"attribute","nodeTest":"*NA nQ{}Day"}]}]}]}]},{"N":"str","val":"00"}]}]},{"N":"valueOf","flags":"l","sType":"1NT ","line":"172","C":[{"N":"fn","name":"string-join","role":"select","C":[{"N":"forEach","sType":"*AS ","C":[{"N":"data","sType":"*A ","C":[{"N":"mergeAdj","C":[{"N":"varRef","sType":"*","name":"Q{}createdAt","slot":"0","ns":"= xml=~ fn=~ xsl=~ oai_dc=http://www.openarchives.org/OAI/2.0/oai_dc/ dc=http://purl.org/dc/elements/1.1/ xsi=~ ","role":"select","line":"172"}]}]},{"N":"fn","name":"string","sType":"1AS ","C":[{"N":"dot"}]}]},{"N":"str","sType":"1AS ","val":" "}]}]}]}]}]},{"N":"true"},{"N":"empty","sType":"0 "}]}]}]}]},{"N":"co","binds":"","id":"1","uniform":"true","C":[{"N":"template","flags":"os","module":"doi_datacite.xslt","slots":"200","baseUri":"file:///home/administrator/tethys/tethys.myapp/public/assets2/doi_datacite.xslt","name":"Q{}CamelCaseWord","line":"229","expand-text":"false","sType":"* ","C":[{"N":"sequence","role":"body","sType":"* ","C":[{"N":"param","name":"Q{}text","slot":"0","sType":"* ","as":"* ","flags":"","line":"230","C":[{"N":"str","sType":"1AS ","val":"","role":"select"},{"N":"supplied","role":"conversion","slot":"0","sType":"* "}]},{"N":"param","name":"Q{}firstLower","slot":"1","sType":"* ","as":"* ","flags":"","line":"231","C":[{"N":"true","sType":"1AB","ns":"= xml=~ fn=~ xsl=~ oai_dc=http://www.openarchives.org/OAI/2.0/oai_dc/ dc=http://purl.org/dc/elements/1.1/ xsi=~ ","role":"select","line":"231"},{"N":"supplied","role":"conversion","slot":"1","sType":"* "}]},{"N":"let","var":"Q{}Upper","slot":"2","sType":"*NT ","line":"232","C":[{"N":"doc","sType":"1ND ","base":"file:///home/administrator/tethys/tethys.myapp/public/assets2/doi_datacite.xslt","role":"select","C":[{"N":"valueOf","sType":"1NT ","C":[{"N":"str","sType":"1AS ","val":"ABCDEFGHIJKLMNOPQRSTUVQXYZ"}]}]},{"N":"let","var":"Q{}Lower","slot":"3","sType":"*NT ","line":"233","C":[{"N":"doc","sType":"1ND ","base":"file:///home/administrator/tethys/tethys.myapp/public/assets2/doi_datacite.xslt","role":"select","C":[{"N":"valueOf","sType":"1NT ","C":[{"N":"str","sType":"1AS ","val":"abcdefghijklmnopqrstuvwxyz"}]}]},{"N":"forEach","sType":"*NT ","line":"234","C":[{"N":"fn","name":"tokenize","sType":"*AS","ns":"= xml=~ fn=~ xsl=~ oai_dc=http://www.openarchives.org/OAI/2.0/oai_dc/ dc=http://purl.org/dc/elements/1.1/ xsi=~ ","role":"select","line":"234","C":[{"N":"treat","as":"AS","diag":"0|0||tokenize","C":[{"N":"check","card":"?","diag":"0|0||tokenize","C":[{"N":"cvUntyped","to":"AS","diag":"0|0||tokenize","C":[{"N":"check","card":"?","diag":"0|0||tokenize","C":[{"N":"data","diag":"0|0||tokenize","C":[{"N":"varRef","name":"Q{}text","slot":"0"}]}]}]}]}]},{"N":"str","val":"_"}]},{"N":"sequence","sType":"*NT ","C":[{"N":"choose","sType":"?NT ","type":"item()*","line":"235","C":[{"N":"and","sType":"1AB","ns":"= xml=~ fn=~ xsl=~ oai_dc=http://www.openarchives.org/OAI/2.0/oai_dc/ dc=http://purl.org/dc/elements/1.1/ xsi=~ ","line":"236","C":[{"N":"compareToInt","op":"eq","val":"1","C":[{"N":"fn","name":"position"}]},{"N":"gc","op":"=","comp":"GAC|http://www.w3.org/2005/xpath-functions/collation/codepoint","card":"1:1","C":[{"N":"data","diag":"1|0||gc","C":[{"N":"varRef","name":"Q{}firstLower","slot":"1"}]},{"N":"true"}]}]},{"N":"valueOf","flags":"l","sType":"1NT ","line":"237","C":[{"N":"fn","name":"string-join","role":"select","C":[{"N":"fn","name":"substring","sType":"1AS","ns":"= xml=~ fn=~ xsl=~ oai_dc=http://www.openarchives.org/OAI/2.0/oai_dc/ dc=http://purl.org/dc/elements/1.1/ xsi=~ ","role":"select","line":"237","C":[{"N":"dot"},{"N":"convert","to":"AO","flags":"","C":[{"N":"int","val":"1"}]},{"N":"convert","to":"AO","flags":"","C":[{"N":"int","val":"1"}]}]},{"N":"str","sType":"1AS ","val":" "}]}]},{"N":"true"},{"N":"valueOf","flags":"l","sType":"1NT ","line":"240","C":[{"N":"fn","name":"string-join","role":"select","C":[{"N":"fn","name":"translate","sType":"1AS","ns":"= xml=~ fn=~ xsl=~ oai_dc=http://www.openarchives.org/OAI/2.0/oai_dc/ dc=http://purl.org/dc/elements/1.1/ xsi=~ ","role":"select","line":"240","C":[{"N":"fn","name":"substring","C":[{"N":"dot"},{"N":"convert","to":"AO","flags":"","C":[{"N":"int","val":"1"}]},{"N":"convert","to":"AO","flags":"","C":[{"N":"int","val":"1"}]}]},{"N":"treat","as":"AS","diag":"0|1||translate","C":[{"N":"check","card":"1","diag":"0|1||translate","C":[{"N":"cvUntyped","to":"AS","diag":"0|1||translate","C":[{"N":"check","card":"1","diag":"0|1||translate","C":[{"N":"data","diag":"0|1||translate","C":[{"N":"varRef","name":"Q{}Lower","slot":"3"}]}]}]}]}]},{"N":"treat","as":"AS","diag":"0|2||translate","C":[{"N":"check","card":"1","diag":"0|2||translate","C":[{"N":"cvUntyped","to":"AS","diag":"0|2||translate","C":[{"N":"check","card":"1","diag":"0|2||translate","C":[{"N":"data","diag":"0|2||translate","C":[{"N":"varRef","name":"Q{}Upper","slot":"2"}]}]}]}]}]}]},{"N":"str","sType":"1AS ","val":" "}]}]}]},{"N":"valueOf","flags":"l","sType":"1NT ","line":"243","C":[{"N":"fn","name":"string-join","role":"select","C":[{"N":"fn","name":"substring","sType":"1AS","ns":"= xml=~ fn=~ xsl=~ oai_dc=http://www.openarchives.org/OAI/2.0/oai_dc/ dc=http://purl.org/dc/elements/1.1/ xsi=~ ","role":"select","line":"243","C":[{"N":"dot"},{"N":"convert","to":"AO","flags":"","C":[{"N":"int","val":"2"}]},{"N":"convert","to":"AO","flags":"","C":[{"N":"fn","name":"string-length","C":[{"N":"dot"}]}]}]},{"N":"str","sType":"1AS ","val":" "}]}]}]}]}]}]}]}]}]},{"N":"co","binds":"","id":"2","uniform":"true","C":[{"N":"template","flags":"os","module":"doi_datacite.xslt","slots":"200","baseUri":"file:///home/administrator/tethys/tethys.myapp/public/assets2/doi_datacite.xslt","name":"Q{}AlternateIdentifier","line":"312","ns":"xml=~ =http://datacite.org/schema/kernel-4 xsl=~ oai_dc=http://www.openarchives.org/OAI/2.0/oai_dc/ dc=http://purl.org/dc/elements/1.1/ xsi=~","expand-text":"false","sType":"1NE nQ{http://datacite.org/schema/kernel-4}alternateIdentifier ","C":[{"N":"elem","name":"alternateIdentifier","sType":"1NE nQ{http://datacite.org/schema/kernel-4}alternateIdentifier ","nsuri":"http://datacite.org/schema/kernel-4","namespaces":"=http://datacite.org/schema/kernel-4 xsi=http://www.w3.org/2001/XMLSchema-instance oai_dc=http://www.openarchives.org/OAI/2.0/oai_dc/ dc=http://purl.org/dc/elements/1.1/","role":"body","line":"313","C":[{"N":"sequence","sType":"*N ","C":[{"N":"att","name":"alternateIdentifierType","sType":"1NA ","line":"314","C":[{"N":"fn","name":"string-join","role":"select","C":[{"N":"forEach","sType":"*AS ","C":[{"N":"data","sType":"*A ","C":[{"N":"mergeAdj","C":[{"N":"valueOf","sType":"1NT ","C":[{"N":"str","sType":"1AS ","val":"url"}]}]}]},{"N":"fn","name":"string","sType":"1AS ","C":[{"N":"dot"}]}]},{"N":"str","sType":"1AS ","val":""}]}]},{"N":"valueOf","flags":"l","sType":"1NT ","line":"318","C":[{"N":"fn","name":"string-join","role":"select","C":[{"N":"forEach","sType":"*AS ","C":[{"N":"data","sType":"*A ","C":[{"N":"mergeAdj","C":[{"N":"docOrder","sType":"*NA nQ{}landingpage","role":"select","line":"318","C":[{"N":"slash","role":"select","simple":"1","sType":"*NA nQ{}landingpage","C":[{"N":"treat","as":"N","diag":"13|0|XTTE0510|","C":[{"N":"dot"}]},{"N":"axis","name":"attribute","nodeTest":"*NA nQ{}landingpage","sType":"*NA nQ{}landingpage","ns":"= xml=~ fn=~ xsl=~ oai_dc=http://www.openarchives.org/OAI/2.0/oai_dc/ dc=http://purl.org/dc/elements/1.1/ xsi=~ "}]}]}]}]},{"N":"fn","name":"string","sType":"1AS ","C":[{"N":"dot"}]}]},{"N":"str","sType":"1AS ","val":" "}]}]}]}]}]}]},{"N":"co","binds":"","id":"3","vis":"PUBLIC","ex:uniform":"true","C":[{"N":"globalParam","name":"Q{}unixTimestamp","sType":"* ","slots":"200","module":"doi_datacite.xslt","baseUri":"file:///home/administrator/tethys/tethys.myapp/public/assets2/doi_datacite.xslt","as":"","ns":"xml=~ xsl=~ oai_dc=http://www.openarchives.org/OAI/2.0/oai_dc/ dc=http://purl.org/dc/elements/1.1/ xsi=~","C":[{"N":"str","sType":"1AS ","val":"","role":"select"}]}]},{"N":"co","binds":"","id":"4","vis":"PUBLIC","ex:uniform":"true","C":[{"N":"globalParam","name":"Q{}prefix","sType":"* ","slots":"200","module":"doi_datacite.xslt","baseUri":"file:///home/administrator/tethys/tethys.myapp/public/assets2/doi_datacite.xslt","as":"","ns":"xml=~ xsl=~ oai_dc=http://www.openarchives.org/OAI/2.0/oai_dc/ dc=http://purl.org/dc/elements/1.1/ xsi=~","C":[{"N":"str","sType":"1AS ","val":"","role":"select"}]}]},{"N":"co","binds":"","id":"5","vis":"PUBLIC","ex:uniform":"true","C":[{"N":"globalParam","name":"Q{}repIdentifier","sType":"* ","slots":"200","module":"doi_datacite.xslt","baseUri":"file:///home/administrator/tethys/tethys.myapp/public/assets2/doi_datacite.xslt","as":"","ns":"xml=~ xsl=~ oai_dc=http://www.openarchives.org/OAI/2.0/oai_dc/ dc=http://purl.org/dc/elements/1.1/ xsi=~","C":[{"N":"str","sType":"1AS ","val":"","role":"select"}]}]},{"N":"co","id":"6","binds":"7 4 5 0 2","C":[{"N":"mode","onNo":"TC","flags":"","patternSlots":"0","prec":"","C":[{"N":"templateRule","rank":"0","prec":"0","seq":"0","ns":"xml=~ xsl=~ oai_dc=http://www.openarchives.org/OAI/2.0/oai_dc/ dc=http://purl.org/dc/elements/1.1/ xsi=~","minImp":"0","flags":"s","slots":"200","baseUri":"file:///home/administrator/tethys/tethys.myapp/public/assets2/doi_datacite.xslt","line":"43","module":"doi_datacite.xslt","expand-text":"false","match":"Rdr_Dataset","prio":"0","matches":"NE u[NE nQ{}Rdr_Dataset,NE nQ{http://www.w3.org/1999/xhtml}Rdr_Dataset]","C":[{"N":"p.nodeTest","role":"match","test":"NE u[NE nQ{}Rdr_Dataset,NE nQ{http://www.w3.org/1999/xhtml}Rdr_Dataset]","sType":"1NE u[NE nQ{}Rdr_Dataset,NE nQ{http://www.w3.org/1999/xhtml}Rdr_Dataset]","ns":"= xml=~ fn=~ xsl=~ oai_dc=http://www.openarchives.org/OAI/2.0/oai_dc/ dc=http://purl.org/dc/elements/1.1/ xsi=~ "},{"N":"elem","name":"resource","sType":"1NE nQ{http://datacite.org/schema/kernel-4}resource ","nsuri":"http://datacite.org/schema/kernel-4","namespaces":"=http://datacite.org/schema/kernel-4 xsi=http://www.w3.org/2001/XMLSchema-instance oai_dc=http://www.openarchives.org/OAI/2.0/oai_dc/ dc=http://purl.org/dc/elements/1.1/","ns":"xml=~ xsi=~ =http://datacite.org/schema/kernel-4 xsl=~ oai_dc=http://www.openarchives.org/OAI/2.0/oai_dc/ dc=http://purl.org/dc/elements/1.1/","role":"action","line":"45","C":[{"N":"sequence","ns":"xml=~ xsi=~ =http://datacite.org/schema/kernel-4 xsl=~ oai_dc=http://www.openarchives.org/OAI/2.0/oai_dc/ dc=http://purl.org/dc/elements/1.1/","sType":"* ","C":[{"N":"att","name":"xsi:schemaLocation","nsuri":"http://www.w3.org/2001/XMLSchema-instance","sType":"1NA ","C":[{"N":"str","sType":"1AS ","val":"http://datacite.org/schema/kernel-4 http://schema.datacite.org/meta/kernel-4.3/metadata.xsd"}]},{"N":"choose","sType":"* ","type":"item()*","line":"49","C":[{"N":"axis","name":"child","nodeTest":"*NE u[NE nQ{}Identifier,NE nQ{http://www.w3.org/1999/xhtml}Identifier]","sType":"*NE u[NE nQ{}Identifier,NE nQ{http://www.w3.org/1999/xhtml}Identifier]","ns":"= xml=~ fn=~ xsi=~ xsl=~ oai_dc=http://www.openarchives.org/OAI/2.0/oai_dc/ dc=http://purl.org/dc/elements/1.1/ ","line":"50"},{"N":"applyT","sType":"* ","line":"51","mode":"Q{}oai_datacite","bSlot":"0","C":[{"N":"axis","name":"child","nodeTest":"*NE u[NE nQ{}Identifier,NE nQ{http://www.w3.org/1999/xhtml}Identifier]","sType":"*NE u[NE nQ{}Identifier,NE nQ{http://www.w3.org/1999/xhtml}Identifier]","ns":"= xml=~ fn=~ xsi=~ xsl=~ oai_dc=http://www.openarchives.org/OAI/2.0/oai_dc/ dc=http://purl.org/dc/elements/1.1/ ","role":"select","line":"51"}]},{"N":"true"},{"N":"elem","name":"identifier","sType":"1NE nQ{http://datacite.org/schema/kernel-4}identifier ","nsuri":"http://datacite.org/schema/kernel-4","namespaces":"=http://datacite.org/schema/kernel-4 xsi=http://www.w3.org/2001/XMLSchema-instance oai_dc=http://www.openarchives.org/OAI/2.0/oai_dc/ dc=http://purl.org/dc/elements/1.1/","line":"54","C":[{"N":"sequence","sType":"*N ","C":[{"N":"att","name":"identifierType","nsuri":"","sType":"1NA ","C":[{"N":"str","sType":"1AS ","val":"DOI"}]},{"N":"valueOf","flags":"l","sType":"1NT ","line":"55","C":[{"N":"fn","name":"string-join","role":"select","C":[{"N":"forEach","sType":"*AS ","C":[{"N":"data","sType":"*A ","C":[{"N":"mergeAdj","C":[{"N":"gVarRef","sType":"* ","name":"Q{}prefix","bSlot":"1","role":"select","line":"55"}]}]},{"N":"fn","name":"string","sType":"1AS ","C":[{"N":"dot"}]}]},{"N":"str","sType":"1AS ","val":" "}]}]},{"N":"valueOf","sType":"1NT ","C":[{"N":"str","sType":"1AS ","val":"/"}]},{"N":"valueOf","flags":"l","sType":"1NT ","line":"57","C":[{"N":"fn","name":"string-join","role":"select","C":[{"N":"forEach","sType":"*AS ","C":[{"N":"data","sType":"*A ","C":[{"N":"mergeAdj","C":[{"N":"gVarRef","sType":"* ","name":"Q{}repIdentifier","bSlot":"2","role":"select","line":"57"}]}]},{"N":"fn","name":"string","sType":"1AS ","C":[{"N":"dot"}]}]},{"N":"str","sType":"1AS ","val":" "}]}]},{"N":"valueOf","sType":"1NT ","C":[{"N":"str","sType":"1AS ","val":"."}]},{"N":"valueOf","flags":"l","sType":"1NT ","line":"59","C":[{"N":"fn","name":"string-join","role":"select","C":[{"N":"forEach","sType":"*AS ","C":[{"N":"data","sType":"*A ","C":[{"N":"mergeAdj","C":[{"N":"axis","sType":"*NA nQ{}PublishId","name":"attribute","nodeTest":"*NA nQ{}PublishId","ns":"= xml=~ fn=~ xsi=~ xsl=~ oai_dc=http://www.openarchives.org/OAI/2.0/oai_dc/ dc=http://purl.org/dc/elements/1.1/ ","role":"select","line":"59"}]}]},{"N":"fn","name":"string","sType":"1AS ","C":[{"N":"dot"}]}]},{"N":"str","sType":"1AS ","val":" "}]}]}]}]}]},{"N":"elem","name":"creators","sType":"1NE nQ{http://datacite.org/schema/kernel-4}creators ","nsuri":"http://datacite.org/schema/kernel-4","namespaces":"=http://datacite.org/schema/kernel-4 xsi=http://www.w3.org/2001/XMLSchema-instance oai_dc=http://www.openarchives.org/OAI/2.0/oai_dc/ dc=http://purl.org/dc/elements/1.1/","line":"65","C":[{"N":"applyT","sType":"* ","line":"66","mode":"Q{}oai_datacite","bSlot":"0","C":[{"N":"sort","role":"select","sType":"*NE u[NE nQ{}PersonAuthor,NE nQ{http://www.w3.org/1999/xhtml}PersonAuthor]","C":[{"N":"axis","name":"child","nodeTest":"*NE u[NE nQ{}PersonAuthor,NE nQ{http://www.w3.org/1999/xhtml}PersonAuthor]","sType":"*NE u[NE nQ{}PersonAuthor,NE nQ{http://www.w3.org/1999/xhtml}PersonAuthor]","ns":"= xml=~ fn=~ xsi=~ xsl=~ oai_dc=http://www.openarchives.org/OAI/2.0/oai_dc/ dc=http://purl.org/dc/elements/1.1/ ","role":"select","line":"66"},{"N":"sortKey","sType":"?A ","C":[{"N":"check","card":"?","sType":"?A ","diag":"2|0|XTTE1020|sort","role":"select","C":[{"N":"data","sType":"*A ","role":"select","C":[{"N":"axis","name":"attribute","nodeTest":"*NA nQ{}SortOrder","sType":"*NA nQ{}SortOrder","ns":"= xml=~ fn=~ xsi=~ xsl=~ oai_dc=http://www.openarchives.org/OAI/2.0/oai_dc/ dc=http://purl.org/dc/elements/1.1/ ","role":"select","line":"67"}]}]},{"N":"str","sType":"1AS ","val":"ascending","role":"order"},{"N":"str","sType":"1AS ","val":"en","role":"lang"},{"N":"str","sType":"1AS ","val":"#default","role":"caseOrder"},{"N":"str","sType":"1AS ","val":"true","role":"stable"}]}]}]}]},{"N":"elem","name":"titles","sType":"1NE nQ{http://datacite.org/schema/kernel-4}titles ","nsuri":"http://datacite.org/schema/kernel-4","namespaces":"=http://datacite.org/schema/kernel-4 xsi=http://www.w3.org/2001/XMLSchema-instance oai_dc=http://www.openarchives.org/OAI/2.0/oai_dc/ dc=http://purl.org/dc/elements/1.1/","line":"70","C":[{"N":"sequence","sType":"* ","C":[{"N":"applyT","sType":"* ","line":"71","mode":"Q{}oai_datacite","bSlot":"0","C":[{"N":"axis","name":"child","nodeTest":"*NE u[NE nQ{}TitleMain,NE nQ{http://www.w3.org/1999/xhtml}TitleMain]","sType":"*NE u[NE nQ{}TitleMain,NE nQ{http://www.w3.org/1999/xhtml}TitleMain]","ns":"= xml=~ fn=~ xsi=~ xsl=~ oai_dc=http://www.openarchives.org/OAI/2.0/oai_dc/ dc=http://purl.org/dc/elements/1.1/ ","role":"select","line":"71"}]},{"N":"applyT","sType":"* ","line":"72","mode":"Q{}oai_datacite","bSlot":"0","C":[{"N":"axis","name":"child","nodeTest":"*NE u[NE nQ{}TitleAdditional,NE nQ{http://www.w3.org/1999/xhtml}TitleAdditional]","sType":"*NE u[NE nQ{}TitleAdditional,NE nQ{http://www.w3.org/1999/xhtml}TitleAdditional]","ns":"= xml=~ fn=~ xsi=~ xsl=~ oai_dc=http://www.openarchives.org/OAI/2.0/oai_dc/ dc=http://purl.org/dc/elements/1.1/ ","role":"select","line":"72"}]}]}]},{"N":"elem","name":"publisher","sType":"1NE nQ{http://datacite.org/schema/kernel-4}publisher ","nsuri":"http://datacite.org/schema/kernel-4","namespaces":"=http://datacite.org/schema/kernel-4 xsi=http://www.w3.org/2001/XMLSchema-instance oai_dc=http://www.openarchives.org/OAI/2.0/oai_dc/ dc=http://purl.org/dc/elements/1.1/","line":"74","C":[{"N":"valueOf","flags":"l","sType":"1NT ","line":"76","C":[{"N":"fn","name":"string-join","role":"select","C":[{"N":"forEach","sType":"*AS ","C":[{"N":"data","sType":"*A ","C":[{"N":"mergeAdj","C":[{"N":"axis","sType":"*NA nQ{}CreatingCorporation","name":"attribute","nodeTest":"*NA nQ{}CreatingCorporation","ns":"= xml=~ fn=~ xsi=~ xsl=~ oai_dc=http://www.openarchives.org/OAI/2.0/oai_dc/ dc=http://purl.org/dc/elements/1.1/ ","role":"select","line":"76"}]}]},{"N":"fn","name":"string","sType":"1AS ","C":[{"N":"dot"}]}]},{"N":"str","sType":"1AS ","val":" "}]}]}]},{"N":"elem","name":"publicationYear","sType":"1NE nQ{http://datacite.org/schema/kernel-4}publicationYear ","nsuri":"http://datacite.org/schema/kernel-4","namespaces":"=http://datacite.org/schema/kernel-4 xsi=http://www.w3.org/2001/XMLSchema-instance oai_dc=http://www.openarchives.org/OAI/2.0/oai_dc/ dc=http://purl.org/dc/elements/1.1/","line":"78","C":[{"N":"valueOf","flags":"l","sType":"1NT ","line":"79","C":[{"N":"fn","name":"string-join","role":"select","C":[{"N":"forEach","sType":"*AS ","C":[{"N":"data","sType":"*A ","C":[{"N":"mergeAdj","C":[{"N":"docOrder","sType":"*NA nQ{}Year","role":"select","line":"79","C":[{"N":"slash","op":"/","sType":"*NA nQ{}Year","ns":"= xml=~ fn=~ xsi=~ xsl=~ oai_dc=http://www.openarchives.org/OAI/2.0/oai_dc/ dc=http://purl.org/dc/elements/1.1/ ","C":[{"N":"axis","name":"child","nodeTest":"*NE u[NE nQ{}ServerDatePublished,NE nQ{http://www.w3.org/1999/xhtml}ServerDatePublished]"},{"N":"axis","name":"attribute","nodeTest":"*NA nQ{}Year"}]}]}]}]},{"N":"fn","name":"string","sType":"1AS ","C":[{"N":"dot"}]}]},{"N":"str","sType":"1AS ","val":" "}]}]}]},{"N":"elem","name":"subjects","sType":"1NE nQ{http://datacite.org/schema/kernel-4}subjects ","nsuri":"http://datacite.org/schema/kernel-4","namespaces":"=http://datacite.org/schema/kernel-4 xsi=http://www.w3.org/2001/XMLSchema-instance oai_dc=http://www.openarchives.org/OAI/2.0/oai_dc/ dc=http://purl.org/dc/elements/1.1/","line":"81","C":[{"N":"applyT","sType":"* ","line":"82","mode":"Q{}oai_datacite","bSlot":"0","C":[{"N":"axis","name":"child","nodeTest":"*NE u[NE nQ{}Subject,NE nQ{http://www.w3.org/1999/xhtml}Subject]","sType":"*NE u[NE nQ{}Subject,NE nQ{http://www.w3.org/1999/xhtml}Subject]","ns":"= xml=~ fn=~ xsi=~ xsl=~ oai_dc=http://www.openarchives.org/OAI/2.0/oai_dc/ dc=http://purl.org/dc/elements/1.1/ ","role":"select","line":"82"}]}]},{"N":"elem","name":"language","sType":"1NE nQ{http://datacite.org/schema/kernel-4}language ","nsuri":"http://datacite.org/schema/kernel-4","namespaces":"=http://datacite.org/schema/kernel-4 xsi=http://www.w3.org/2001/XMLSchema-instance oai_dc=http://www.openarchives.org/OAI/2.0/oai_dc/ dc=http://purl.org/dc/elements/1.1/","line":"84","C":[{"N":"valueOf","flags":"l","sType":"1NT ","line":"85","C":[{"N":"fn","name":"string-join","role":"select","C":[{"N":"forEach","sType":"*AS ","C":[{"N":"data","sType":"*A ","C":[{"N":"mergeAdj","C":[{"N":"axis","sType":"*NA nQ{}Language","name":"attribute","nodeTest":"*NA nQ{}Language","ns":"= xml=~ fn=~ xsi=~ xsl=~ oai_dc=http://www.openarchives.org/OAI/2.0/oai_dc/ dc=http://purl.org/dc/elements/1.1/ ","role":"select","line":"85"}]}]},{"N":"fn","name":"string","sType":"1AS ","C":[{"N":"dot"}]}]},{"N":"str","sType":"1AS ","val":" "}]}]}]},{"N":"choose","sType":"? ","line":"87","C":[{"N":"axis","name":"child","nodeTest":"*NE u[NE nQ{}PersonContributor,NE nQ{http://www.w3.org/1999/xhtml}PersonContributor]","sType":"*NE u[NE nQ{}PersonContributor,NE nQ{http://www.w3.org/1999/xhtml}PersonContributor]","ns":"= xml=~ fn=~ xsi=~ xsl=~ oai_dc=http://www.openarchives.org/OAI/2.0/oai_dc/ dc=http://purl.org/dc/elements/1.1/ ","line":"87"},{"N":"elem","name":"contributors","sType":"1NE nQ{http://datacite.org/schema/kernel-4}contributors ","nsuri":"http://datacite.org/schema/kernel-4","namespaces":"=http://datacite.org/schema/kernel-4 xsi=http://www.w3.org/2001/XMLSchema-instance oai_dc=http://www.openarchives.org/OAI/2.0/oai_dc/ dc=http://purl.org/dc/elements/1.1/","line":"88","C":[{"N":"applyT","sType":"* ","line":"89","mode":"Q{}oai_datacite","bSlot":"0","C":[{"N":"sort","role":"select","sType":"*NE u[NE nQ{}PersonContributor,NE nQ{http://www.w3.org/1999/xhtml}PersonContributor]","C":[{"N":"axis","name":"child","nodeTest":"*NE u[NE nQ{}PersonContributor,NE nQ{http://www.w3.org/1999/xhtml}PersonContributor]","sType":"*NE u[NE nQ{}PersonContributor,NE nQ{http://www.w3.org/1999/xhtml}PersonContributor]","ns":"= xml=~ fn=~ xsi=~ xsl=~ oai_dc=http://www.openarchives.org/OAI/2.0/oai_dc/ dc=http://purl.org/dc/elements/1.1/ ","role":"select","line":"89"},{"N":"sortKey","sType":"?A ","C":[{"N":"check","card":"?","sType":"?A ","diag":"2|0|XTTE1020|sort","role":"select","C":[{"N":"data","sType":"*A ","role":"select","C":[{"N":"axis","name":"attribute","nodeTest":"*NA nQ{}SortOrder","sType":"*NA nQ{}SortOrder","ns":"= xml=~ fn=~ xsi=~ xsl=~ oai_dc=http://www.openarchives.org/OAI/2.0/oai_dc/ dc=http://purl.org/dc/elements/1.1/ ","role":"select","line":"90"}]}]},{"N":"str","sType":"1AS ","val":"ascending","role":"order"},{"N":"str","sType":"1AS ","val":"en","role":"lang"},{"N":"str","sType":"1AS ","val":"#default","role":"caseOrder"},{"N":"str","sType":"1AS ","val":"true","role":"stable"}]}]}]}]},{"N":"true"},{"N":"empty","sType":"0 "}]},{"N":"elem","name":"dates","sType":"1NE nQ{http://datacite.org/schema/kernel-4}dates ","nsuri":"http://datacite.org/schema/kernel-4","namespaces":"=http://datacite.org/schema/kernel-4 xsi=http://www.w3.org/2001/XMLSchema-instance oai_dc=http://www.openarchives.org/OAI/2.0/oai_dc/ dc=http://purl.org/dc/elements/1.1/","line":"94","C":[{"N":"callT","bSlot":"3","sType":"* ","name":"Q{}RdrDate2","line":"95"}]},{"N":"elem","name":"version","sType":"1NE nQ{http://datacite.org/schema/kernel-4}version ","nsuri":"http://datacite.org/schema/kernel-4","namespaces":"=http://datacite.org/schema/kernel-4 xsi=http://www.w3.org/2001/XMLSchema-instance oai_dc=http://www.openarchives.org/OAI/2.0/oai_dc/ dc=http://purl.org/dc/elements/1.1/","line":"97","C":[{"N":"choose","sType":"?NT ","type":"item()*","line":"98","C":[{"N":"axis","name":"attribute","nodeTest":"*NA nQ{}Version","sType":"*NA nQ{}Version","ns":"= xml=~ fn=~ xsi=~ xsl=~ oai_dc=http://www.openarchives.org/OAI/2.0/oai_dc/ dc=http://purl.org/dc/elements/1.1/ ","line":"99"},{"N":"valueOf","flags":"l","sType":"1NT ","line":"100","C":[{"N":"fn","name":"string-join","role":"select","C":[{"N":"forEach","sType":"*AS ","C":[{"N":"data","sType":"*A ","C":[{"N":"mergeAdj","C":[{"N":"axis","sType":"*NA nQ{}Version","name":"attribute","nodeTest":"*NA nQ{}Version","ns":"= xml=~ fn=~ xsi=~ xsl=~ oai_dc=http://www.openarchives.org/OAI/2.0/oai_dc/ dc=http://purl.org/dc/elements/1.1/ ","role":"select","line":"100"}]}]},{"N":"fn","name":"string","sType":"1AS ","C":[{"N":"dot"}]}]},{"N":"str","sType":"1AS ","val":" "}]}]},{"N":"true"},{"N":"valueOf","sType":"1NT ","C":[{"N":"str","sType":"1AS ","val":"1"}]}]}]},{"N":"elem","name":"resourceType","sType":"1NE nQ{http://datacite.org/schema/kernel-4}resourceType ","nsuri":"http://datacite.org/schema/kernel-4","namespaces":"=http://datacite.org/schema/kernel-4 xsi=http://www.w3.org/2001/XMLSchema-instance oai_dc=http://www.openarchives.org/OAI/2.0/oai_dc/ dc=http://purl.org/dc/elements/1.1/","line":"107","C":[{"N":"sequence","sType":"*N ","C":[{"N":"att","name":"resourceTypeGeneral","nsuri":"","sType":"1NA ","C":[{"N":"str","sType":"1AS ","val":"Dataset"}]},{"N":"valueOf","sType":"1NT ","C":[{"N":"str","sType":"1AS ","val":"Dataset"}]}]}]},{"N":"elem","name":"alternateIdentifiers","sType":"1NE nQ{http://datacite.org/schema/kernel-4}alternateIdentifiers ","nsuri":"http://datacite.org/schema/kernel-4","namespaces":"=http://datacite.org/schema/kernel-4 xsi=http://www.w3.org/2001/XMLSchema-instance oai_dc=http://www.openarchives.org/OAI/2.0/oai_dc/ dc=http://purl.org/dc/elements/1.1/","line":"112","C":[{"N":"callT","bSlot":"4","sType":"* ","name":"Q{}AlternateIdentifier","line":"113"}]},{"N":"choose","sType":"? ","line":"116","C":[{"N":"axis","name":"child","nodeTest":"*NE u[NE nQ{}Reference,NE nQ{http://www.w3.org/1999/xhtml}Reference]","sType":"*NE u[NE nQ{}Reference,NE nQ{http://www.w3.org/1999/xhtml}Reference]","ns":"= xml=~ fn=~ xsi=~ xsl=~ oai_dc=http://www.openarchives.org/OAI/2.0/oai_dc/ dc=http://purl.org/dc/elements/1.1/ ","line":"116"},{"N":"elem","name":"relatedIdentifiers","sType":"1NE nQ{http://datacite.org/schema/kernel-4}relatedIdentifiers ","nsuri":"http://datacite.org/schema/kernel-4","namespaces":"=http://datacite.org/schema/kernel-4 xsi=http://www.w3.org/2001/XMLSchema-instance oai_dc=http://www.openarchives.org/OAI/2.0/oai_dc/ dc=http://purl.org/dc/elements/1.1/","line":"117","C":[{"N":"applyT","sType":"* ","line":"118","mode":"Q{}oai_datacite","bSlot":"0","C":[{"N":"axis","name":"child","nodeTest":"*NE u[NE nQ{}Reference,NE nQ{http://www.w3.org/1999/xhtml}Reference]","sType":"*NE u[NE nQ{}Reference,NE nQ{http://www.w3.org/1999/xhtml}Reference]","ns":"= xml=~ fn=~ xsi=~ xsl=~ oai_dc=http://www.openarchives.org/OAI/2.0/oai_dc/ dc=http://purl.org/dc/elements/1.1/ ","role":"select","line":"118"}]}]},{"N":"true"},{"N":"empty","sType":"0 "}]},{"N":"elem","name":"rightsList","sType":"1NE nQ{http://datacite.org/schema/kernel-4}rightsList ","nsuri":"http://datacite.org/schema/kernel-4","namespaces":"=http://datacite.org/schema/kernel-4 xsi=http://www.w3.org/2001/XMLSchema-instance oai_dc=http://www.openarchives.org/OAI/2.0/oai_dc/ dc=http://purl.org/dc/elements/1.1/","line":"121","C":[{"N":"applyT","sType":"* ","line":"122","mode":"Q{}oai_datacite","bSlot":"0","C":[{"N":"axis","name":"child","nodeTest":"*NE u[NE nQ{}Licence,NE nQ{http://www.w3.org/1999/xhtml}Licence]","sType":"*NE u[NE nQ{}Licence,NE nQ{http://www.w3.org/1999/xhtml}Licence]","ns":"= xml=~ fn=~ xsi=~ xsl=~ oai_dc=http://www.openarchives.org/OAI/2.0/oai_dc/ dc=http://purl.org/dc/elements/1.1/ ","role":"select","line":"122"}]}]},{"N":"elem","name":"sizes","sType":"1NE nQ{http://datacite.org/schema/kernel-4}sizes ","nsuri":"http://datacite.org/schema/kernel-4","namespaces":"=http://datacite.org/schema/kernel-4 xsi=http://www.w3.org/2001/XMLSchema-instance oai_dc=http://www.openarchives.org/OAI/2.0/oai_dc/ dc=http://purl.org/dc/elements/1.1/","line":"124","C":[{"N":"elem","name":"size","sType":"1NE nQ{http://datacite.org/schema/kernel-4}size ","nsuri":"http://datacite.org/schema/kernel-4","namespaces":"=http://datacite.org/schema/kernel-4 xsi=http://www.w3.org/2001/XMLSchema-instance oai_dc=http://www.openarchives.org/OAI/2.0/oai_dc/ dc=http://purl.org/dc/elements/1.1/","line":"125","C":[{"N":"sequence","sType":"*NT ","C":[{"N":"valueOf","flags":"l","sType":"1NT ","line":"126","C":[{"N":"fn","name":"string-join","role":"select","C":[{"N":"forEach","sType":"*AS ","C":[{"N":"data","sType":"*A ","C":[{"N":"mergeAdj","C":[{"N":"fn","sType":"1ADI","name":"count","ns":"= xml=~ fn=~ xsi=~ xsl=~ oai_dc=http://www.openarchives.org/OAI/2.0/oai_dc/ dc=http://purl.org/dc/elements/1.1/ ","role":"select","line":"126","C":[{"N":"axis","name":"child","nodeTest":"*NE u[NE nQ{}File,NE nQ{http://www.w3.org/1999/xhtml}File]"}]}]}]},{"N":"fn","name":"string","sType":"1AS ","C":[{"N":"dot"}]}]},{"N":"str","sType":"1AS ","val":" "}]}]},{"N":"valueOf","sType":"1NT ","C":[{"N":"str","sType":"1AS ","val":" datasets"}]}]}]}]},{"N":"elem","name":"formats","sType":"1NE nQ{http://datacite.org/schema/kernel-4}formats ","nsuri":"http://datacite.org/schema/kernel-4","namespaces":"=http://datacite.org/schema/kernel-4 xsi=http://www.w3.org/2001/XMLSchema-instance oai_dc=http://www.openarchives.org/OAI/2.0/oai_dc/ dc=http://purl.org/dc/elements/1.1/","line":"130","C":[{"N":"applyT","sType":"* ","line":"131","mode":"Q{}oai_datacite","bSlot":"0","C":[{"N":"docOrder","sType":"*NA nQ{}MimeType","role":"select","line":"131","C":[{"N":"slash","op":"/","sType":"*NA nQ{}MimeType","ns":"= xml=~ fn=~ xsi=~ xsl=~ oai_dc=http://www.openarchives.org/OAI/2.0/oai_dc/ dc=http://purl.org/dc/elements/1.1/ ","C":[{"N":"axis","name":"child","nodeTest":"*NE u[NE nQ{}File,NE nQ{http://www.w3.org/1999/xhtml}File]"},{"N":"axis","name":"attribute","nodeTest":"*NA nQ{}MimeType"}]}]}]}]},{"N":"elem","name":"descriptions","sType":"1NE nQ{http://datacite.org/schema/kernel-4}descriptions ","nsuri":"http://datacite.org/schema/kernel-4","namespaces":"=http://datacite.org/schema/kernel-4 xsi=http://www.w3.org/2001/XMLSchema-instance oai_dc=http://www.openarchives.org/OAI/2.0/oai_dc/ dc=http://purl.org/dc/elements/1.1/","line":"133","C":[{"N":"sequence","sType":"* ","C":[{"N":"applyT","sType":"* ","line":"134","mode":"Q{}oai_datacite","bSlot":"0","C":[{"N":"axis","name":"child","nodeTest":"*NE u[NE nQ{}TitleAbstract,NE nQ{http://www.w3.org/1999/xhtml}TitleAbstract]","sType":"*NE u[NE nQ{}TitleAbstract,NE nQ{http://www.w3.org/1999/xhtml}TitleAbstract]","ns":"= xml=~ fn=~ xsi=~ xsl=~ oai_dc=http://www.openarchives.org/OAI/2.0/oai_dc/ dc=http://purl.org/dc/elements/1.1/ ","role":"select","line":"134"}]},{"N":"applyT","sType":"* ","line":"135","mode":"Q{}oai_datacite","bSlot":"0","C":[{"N":"axis","name":"child","nodeTest":"*NE u[NE nQ{}TitleAbstractAdditional,NE nQ{http://www.w3.org/1999/xhtml}TitleAbstractAdditional]","sType":"*NE u[NE nQ{}TitleAbstractAdditional,NE nQ{http://www.w3.org/1999/xhtml}TitleAbstractAdditional]","ns":"= xml=~ fn=~ xsi=~ xsl=~ oai_dc=http://www.openarchives.org/OAI/2.0/oai_dc/ dc=http://purl.org/dc/elements/1.1/ ","role":"select","line":"135"}]}]}]},{"N":"elem","name":"geoLocations","sType":"1NE nQ{http://datacite.org/schema/kernel-4}geoLocations ","nsuri":"http://datacite.org/schema/kernel-4","namespaces":"=http://datacite.org/schema/kernel-4 xsi=http://www.w3.org/2001/XMLSchema-instance oai_dc=http://www.openarchives.org/OAI/2.0/oai_dc/ dc=http://purl.org/dc/elements/1.1/","line":"137","C":[{"N":"applyT","sType":"* ","line":"138","mode":"Q{}oai_datacite","bSlot":"0","C":[{"N":"axis","name":"child","nodeTest":"*NE u[NE nQ{}Coverage,NE nQ{http://www.w3.org/1999/xhtml}Coverage]","sType":"*NE u[NE nQ{}Coverage,NE nQ{http://www.w3.org/1999/xhtml}Coverage]","ns":"= xml=~ fn=~ xsi=~ xsl=~ oai_dc=http://www.openarchives.org/OAI/2.0/oai_dc/ dc=http://purl.org/dc/elements/1.1/ ","role":"select","line":"138"}]}]}]}]}]}]}]},{"N":"co","id":"7","binds":"1","C":[{"N":"mode","onNo":"TC","flags":"","patternSlots":"0","name":"Q{}oai_datacite","prec":"","C":[{"N":"templateRule","rank":"0","prec":"0","seq":"12","ns":"xml=~ =http://datacite.org/schema/kernel-4 xsl=~ oai_dc=http://www.openarchives.org/OAI/2.0/oai_dc/ dc=http://purl.org/dc/elements/1.1/ xsi=~","minImp":"0","flags":"s","slots":"200","baseUri":"file:///home/administrator/tethys/tethys.myapp/public/assets2/doi_datacite.xslt","line":"405","module":"doi_datacite.xslt","expand-text":"false","match":"File/@MimeType","prio":"0.5","matches":"NA nQ{}MimeType","C":[{"N":"p.withUpper","role":"match","axis":"parent","sType":"1NA nQ{}MimeType","ns":"= xml=~ fn=~ xsl=~ oai_dc=http://www.openarchives.org/OAI/2.0/oai_dc/ dc=http://purl.org/dc/elements/1.1/ xsi=~ ","C":[{"N":"p.nodeTest","test":"NA nQ{}MimeType"},{"N":"p.nodeTest","test":"NE u[NE nQ{}File,NE nQ{http://www.w3.org/1999/xhtml}File]"}]},{"N":"elem","name":"format","sType":"1NE nQ{http://datacite.org/schema/kernel-4}format ","nsuri":"http://datacite.org/schema/kernel-4","namespaces":"=http://datacite.org/schema/kernel-4 xsi=http://www.w3.org/2001/XMLSchema-instance oai_dc=http://www.openarchives.org/OAI/2.0/oai_dc/ dc=http://purl.org/dc/elements/1.1/","role":"action","line":"406","C":[{"N":"valueOf","flags":"l","sType":"1NT ","line":"407","C":[{"N":"fn","name":"string-join","role":"select","C":[{"N":"forEach","sType":"*AS ","C":[{"N":"data","sType":"*A ","C":[{"N":"mergeAdj","C":[{"N":"dot","sType":"1NA nQ{}MimeType","ns":"= xml=~ fn=~ xsl=~ oai_dc=http://www.openarchives.org/OAI/2.0/oai_dc/ dc=http://purl.org/dc/elements/1.1/ xsi=~ ","role":"select","line":"407"}]}]},{"N":"fn","name":"string","sType":"1AS ","C":[{"N":"dot"}]}]},{"N":"str","sType":"1AS ","val":" "}]}]}]}]},{"N":"templateRule","rank":"1","prec":"0","seq":"13","ns":"xml=~ =http://datacite.org/schema/kernel-4 xsl=~ oai_dc=http://www.openarchives.org/OAI/2.0/oai_dc/ dc=http://purl.org/dc/elements/1.1/ xsi=~","minImp":"0","flags":"s","slots":"200","baseUri":"file:///home/administrator/tethys/tethys.myapp/public/assets2/doi_datacite.xslt","line":"412","module":"doi_datacite.xslt","expand-text":"false","match":"Licence","prio":"0","matches":"NE u[NE nQ{}Licence,NE nQ{http://www.w3.org/1999/xhtml}Licence]","C":[{"N":"p.nodeTest","role":"match","test":"NE u[NE nQ{}Licence,NE nQ{http://www.w3.org/1999/xhtml}Licence]","sType":"1NE u[NE nQ{}Licence,NE nQ{http://www.w3.org/1999/xhtml}Licence]","ns":"= xml=~ fn=~ xsl=~ oai_dc=http://www.openarchives.org/OAI/2.0/oai_dc/ dc=http://purl.org/dc/elements/1.1/ xsi=~ "},{"N":"sequence","role":"action","sType":"* ","C":[{"N":"elem","name":"rights","sType":"1NE nQ{http://datacite.org/schema/kernel-4}rights ","nsuri":"http://datacite.org/schema/kernel-4","namespaces":"=http://datacite.org/schema/kernel-4 xsi=http://www.w3.org/2001/XMLSchema-instance oai_dc=http://www.openarchives.org/OAI/2.0/oai_dc/ dc=http://purl.org/dc/elements/1.1/","line":"413","C":[{"N":"sequence","sType":"* ","C":[{"N":"att","name":"xml:lang","sType":"1NA ","nsuri":"http://www.w3.org/XML/1998/namespace","line":"414","C":[{"N":"fn","name":"string-join","role":"select","C":[{"N":"forEach","sType":"*AS ","C":[{"N":"data","sType":"*A ","C":[{"N":"mergeAdj","C":[{"N":"valueOf","sType":"1NT ","flags":"l","line":"415","C":[{"N":"fn","name":"string-join","role":"select","C":[{"N":"forEach","sType":"*AS ","C":[{"N":"data","sType":"*A ","C":[{"N":"mergeAdj","C":[{"N":"axis","sType":"*NA nQ{}Language","name":"attribute","nodeTest":"*NA nQ{}Language","ns":"= xml=~ fn=~ xsl=~ oai_dc=http://www.openarchives.org/OAI/2.0/oai_dc/ dc=http://purl.org/dc/elements/1.1/ xsi=~ ","role":"select","line":"415"}]}]},{"N":"fn","name":"string","sType":"1AS ","C":[{"N":"dot"}]}]},{"N":"str","sType":"1AS ","val":" "}]}]}]}]},{"N":"fn","name":"string","sType":"1AS ","C":[{"N":"dot"}]}]},{"N":"str","sType":"1AS ","val":""}]}]},{"N":"choose","sType":"? ","line":"417","C":[{"N":"gc","op":"!=","comp":"GAC|http://www.w3.org/2005/xpath-functions/collation/codepoint","card":"1:1","sType":"1AB","ns":"= xml=~ fn=~ xsl=~ oai_dc=http://www.openarchives.org/OAI/2.0/oai_dc/ dc=http://purl.org/dc/elements/1.1/ xsi=~ ","line":"417","C":[{"N":"attVal","name":"Q{}LinkLicence"},{"N":"str","val":""}]},{"N":"att","name":"rightsURI","sType":"1NA ","line":"418","C":[{"N":"fn","name":"string-join","role":"select","C":[{"N":"forEach","sType":"*AS ","C":[{"N":"data","sType":"*A ","C":[{"N":"mergeAdj","C":[{"N":"valueOf","sType":"1NT ","flags":"l","line":"419","C":[{"N":"fn","name":"string-join","role":"select","C":[{"N":"forEach","sType":"*AS ","C":[{"N":"data","sType":"*A ","C":[{"N":"mergeAdj","C":[{"N":"axis","sType":"*NA nQ{}LinkLicence","name":"attribute","nodeTest":"*NA nQ{}LinkLicence","ns":"= xml=~ fn=~ xsl=~ oai_dc=http://www.openarchives.org/OAI/2.0/oai_dc/ dc=http://purl.org/dc/elements/1.1/ xsi=~ ","role":"select","line":"419"}]}]},{"N":"fn","name":"string","sType":"1AS ","C":[{"N":"dot"}]}]},{"N":"str","sType":"1AS ","val":" "}]}]}]}]},{"N":"fn","name":"string","sType":"1AS ","C":[{"N":"dot"}]}]},{"N":"str","sType":"1AS ","val":""}]}]},{"N":"true"},{"N":"empty","sType":"0 "}]},{"N":"att","name":"schemeURI","sType":"1NA ","line":"422","C":[{"N":"fn","name":"string-join","role":"select","C":[{"N":"forEach","sType":"*AS ","C":[{"N":"data","sType":"*A ","C":[{"N":"mergeAdj","C":[{"N":"valueOf","sType":"1NT ","C":[{"N":"str","sType":"1AS ","val":"https://spdx.org/licenses/"}]}]}]},{"N":"fn","name":"string","sType":"1AS ","C":[{"N":"dot"}]}]},{"N":"str","sType":"1AS ","val":""}]}]},{"N":"att","name":"rightsIdentifierScheme","sType":"1NA ","line":"425","C":[{"N":"fn","name":"string-join","role":"select","C":[{"N":"forEach","sType":"*AS ","C":[{"N":"data","sType":"*A ","C":[{"N":"mergeAdj","C":[{"N":"valueOf","sType":"1NT ","C":[{"N":"str","sType":"1AS ","val":"SPDX"}]}]}]},{"N":"fn","name":"string","sType":"1AS ","C":[{"N":"dot"}]}]},{"N":"str","sType":"1AS ","val":""}]}]},{"N":"att","name":"rightsIdentifier","sType":"1NA ","line":"428","C":[{"N":"fn","name":"string-join","role":"select","C":[{"N":"forEach","sType":"*AS ","C":[{"N":"data","sType":"*A ","C":[{"N":"mergeAdj","C":[{"N":"valueOf","sType":"1NT ","flags":"l","line":"429","C":[{"N":"fn","name":"string-join","role":"select","C":[{"N":"forEach","sType":"*AS ","C":[{"N":"data","sType":"*A ","C":[{"N":"mergeAdj","C":[{"N":"axis","sType":"*NA nQ{}Name","name":"attribute","nodeTest":"*NA nQ{}Name","ns":"= xml=~ fn=~ xsl=~ oai_dc=http://www.openarchives.org/OAI/2.0/oai_dc/ dc=http://purl.org/dc/elements/1.1/ xsi=~ ","role":"select","line":"429"}]}]},{"N":"fn","name":"string","sType":"1AS ","C":[{"N":"dot"}]}]},{"N":"str","sType":"1AS ","val":" "}]}]}]}]},{"N":"fn","name":"string","sType":"1AS ","C":[{"N":"dot"}]}]},{"N":"str","sType":"1AS ","val":""}]}]},{"N":"valueOf","flags":"l","sType":"1NT ","line":"431","C":[{"N":"fn","name":"string-join","role":"select","C":[{"N":"forEach","sType":"*AS ","C":[{"N":"data","sType":"*A ","C":[{"N":"mergeAdj","C":[{"N":"axis","sType":"*NA nQ{}NameLong","name":"attribute","nodeTest":"*NA nQ{}NameLong","ns":"= xml=~ fn=~ xsl=~ oai_dc=http://www.openarchives.org/OAI/2.0/oai_dc/ dc=http://purl.org/dc/elements/1.1/ xsi=~ ","role":"select","line":"431"}]}]},{"N":"fn","name":"string","sType":"1AS ","C":[{"N":"dot"}]}]},{"N":"str","sType":"1AS ","val":" "}]}]}]}]},{"N":"choose","sType":"? ","line":"433","C":[{"N":"or","sType":"1AB","ns":"= xml=~ fn=~ xsl=~ oai_dc=http://www.openarchives.org/OAI/2.0/oai_dc/ dc=http://purl.org/dc/elements/1.1/ xsi=~ ","line":"433","C":[{"N":"gc","op":"=","comp":"GAC|http://www.w3.org/2005/xpath-functions/collation/codepoint","card":"1:1","C":[{"N":"attVal","name":"Q{}Name"},{"N":"str","val":"CC-BY-4.0"}]},{"N":"gc","op":"=","comp":"GAC|http://www.w3.org/2005/xpath-functions/collation/codepoint","card":"1:1","C":[{"N":"attVal","name":"Q{}Name"},{"N":"str","val":"CC-BY-SA-4.0"}]}]},{"N":"elem","name":"rights","sType":"1NE nQ{http://datacite.org/schema/kernel-4}rights ","nsuri":"http://datacite.org/schema/kernel-4","namespaces":"=http://datacite.org/schema/kernel-4 xsi=http://www.w3.org/2001/XMLSchema-instance oai_dc=http://www.openarchives.org/OAI/2.0/oai_dc/ dc=http://purl.org/dc/elements/1.1/","line":"434","C":[{"N":"sequence","sType":"*N ","C":[{"N":"att","name":"rightsURI","sType":"1NA ","line":"435","C":[{"N":"fn","name":"string-join","role":"select","C":[{"N":"forEach","sType":"*AS ","C":[{"N":"data","sType":"*A ","C":[{"N":"mergeAdj","C":[{"N":"valueOf","sType":"1NT ","C":[{"N":"str","sType":"1AS ","val":"info:eu-repo/semantics/openAccess"}]}]}]},{"N":"fn","name":"string","sType":"1AS ","C":[{"N":"dot"}]}]},{"N":"str","sType":"1AS ","val":""}]}]},{"N":"valueOf","sType":"1NT ","C":[{"N":"str","sType":"1AS ","val":"Open Access"}]}]}]},{"N":"true"},{"N":"empty","sType":"0 "}]}]}]},{"N":"templateRule","rank":"2","prec":"0","seq":"11","ns":"xml=~ =http://datacite.org/schema/kernel-4 xsl=~ oai_dc=http://www.openarchives.org/OAI/2.0/oai_dc/ dc=http://purl.org/dc/elements/1.1/ xsi=~","minImp":"0","flags":"s","slots":"200","baseUri":"file:///home/administrator/tethys/tethys.myapp/public/assets2/doi_datacite.xslt","line":"355","module":"doi_datacite.xslt","expand-text":"false","match":"PersonAuthor","prio":"0","matches":"NE u[NE nQ{}PersonAuthor,NE nQ{http://www.w3.org/1999/xhtml}PersonAuthor]","C":[{"N":"p.nodeTest","role":"match","test":"NE u[NE nQ{}PersonAuthor,NE nQ{http://www.w3.org/1999/xhtml}PersonAuthor]","sType":"1NE u[NE nQ{}PersonAuthor,NE nQ{http://www.w3.org/1999/xhtml}PersonAuthor]","ns":"= xml=~ fn=~ xsl=~ oai_dc=http://www.openarchives.org/OAI/2.0/oai_dc/ dc=http://purl.org/dc/elements/1.1/ xsi=~ "},{"N":"elem","name":"creator","sType":"1NE nQ{http://datacite.org/schema/kernel-4}creator ","nsuri":"http://datacite.org/schema/kernel-4","namespaces":"=http://datacite.org/schema/kernel-4 xsi=http://www.w3.org/2001/XMLSchema-instance oai_dc=http://www.openarchives.org/OAI/2.0/oai_dc/ dc=http://purl.org/dc/elements/1.1/","role":"action","line":"356","C":[{"N":"sequence","sType":"* ","C":[{"N":"elem","name":"creatorName","sType":"1NE nQ{http://datacite.org/schema/kernel-4}creatorName ","nsuri":"http://datacite.org/schema/kernel-4","namespaces":"=http://datacite.org/schema/kernel-4 xsi=http://www.w3.org/2001/XMLSchema-instance oai_dc=http://www.openarchives.org/OAI/2.0/oai_dc/ dc=http://purl.org/dc/elements/1.1/","line":"357","C":[{"N":"sequence","sType":"* ","C":[{"N":"choose","sType":"? ","line":"358","C":[{"N":"gc","op":"!=","comp":"GAC|http://www.w3.org/2005/xpath-functions/collation/codepoint","card":"1:1","sType":"1AB","ns":"= xml=~ fn=~ xsl=~ oai_dc=http://www.openarchives.org/OAI/2.0/oai_dc/ dc=http://purl.org/dc/elements/1.1/ xsi=~ ","line":"358","C":[{"N":"attVal","name":"Q{}NameType"},{"N":"str","val":""}]},{"N":"att","name":"nameType","sType":"1NA ","line":"359","C":[{"N":"fn","name":"string-join","role":"select","C":[{"N":"forEach","sType":"*AS ","C":[{"N":"data","sType":"*A ","C":[{"N":"mergeAdj","C":[{"N":"valueOf","sType":"1NT ","flags":"l","line":"360","C":[{"N":"fn","name":"string-join","role":"select","C":[{"N":"forEach","sType":"*AS ","C":[{"N":"data","sType":"*A ","C":[{"N":"mergeAdj","C":[{"N":"axis","sType":"*NA nQ{}NameType","name":"attribute","nodeTest":"*NA nQ{}NameType","ns":"= xml=~ fn=~ xsl=~ oai_dc=http://www.openarchives.org/OAI/2.0/oai_dc/ dc=http://purl.org/dc/elements/1.1/ xsi=~ ","role":"select","line":"360"}]}]},{"N":"fn","name":"string","sType":"1AS ","C":[{"N":"dot"}]}]},{"N":"str","sType":"1AS ","val":" "}]}]}]}]},{"N":"fn","name":"string","sType":"1AS ","C":[{"N":"dot"}]}]},{"N":"str","sType":"1AS ","val":""}]}]},{"N":"true"},{"N":"empty","sType":"0 "}]},{"N":"valueOf","flags":"l","sType":"1NT ","line":"363","C":[{"N":"fn","name":"string-join","role":"select","C":[{"N":"forEach","sType":"*AS ","C":[{"N":"data","sType":"*A ","C":[{"N":"mergeAdj","C":[{"N":"axis","sType":"*NA nQ{}LastName","name":"attribute","nodeTest":"*NA nQ{}LastName","ns":"= xml=~ fn=~ xsl=~ oai_dc=http://www.openarchives.org/OAI/2.0/oai_dc/ dc=http://purl.org/dc/elements/1.1/ xsi=~ ","role":"select","line":"363"}]}]},{"N":"fn","name":"string","sType":"1AS ","C":[{"N":"dot"}]}]},{"N":"str","sType":"1AS ","val":" "}]}]},{"N":"choose","sType":"? ","line":"364","C":[{"N":"gc","op":"!=","comp":"GAC|http://www.w3.org/2005/xpath-functions/collation/codepoint","card":"1:1","sType":"1AB","ns":"= xml=~ fn=~ xsl=~ oai_dc=http://www.openarchives.org/OAI/2.0/oai_dc/ dc=http://purl.org/dc/elements/1.1/ xsi=~ ","line":"364","C":[{"N":"attVal","name":"Q{}FirstName"},{"N":"str","val":""}]},{"N":"valueOf","sType":"1NT ","C":[{"N":"str","sType":"1AS ","val":", "}]},{"N":"true"},{"N":"empty","sType":"0 "}]},{"N":"valueOf","flags":"l","sType":"1NT ","line":"367","C":[{"N":"fn","name":"string-join","role":"select","C":[{"N":"forEach","sType":"*AS ","C":[{"N":"data","sType":"*A ","C":[{"N":"mergeAdj","C":[{"N":"axis","sType":"*NA nQ{}FirstName","name":"attribute","nodeTest":"*NA nQ{}FirstName","ns":"= xml=~ fn=~ xsl=~ oai_dc=http://www.openarchives.org/OAI/2.0/oai_dc/ dc=http://purl.org/dc/elements/1.1/ xsi=~ ","role":"select","line":"367"}]}]},{"N":"fn","name":"string","sType":"1AS ","C":[{"N":"dot"}]}]},{"N":"str","sType":"1AS ","val":" "}]}]},{"N":"choose","sType":"* ","line":"368","C":[{"N":"gc","op":"!=","comp":"GAC|http://www.w3.org/2005/xpath-functions/collation/codepoint","card":"1:1","sType":"1AB","ns":"= xml=~ fn=~ xsl=~ oai_dc=http://www.openarchives.org/OAI/2.0/oai_dc/ dc=http://purl.org/dc/elements/1.1/ xsi=~ ","line":"368","C":[{"N":"attVal","name":"Q{}AcademicTitle"},{"N":"str","val":""}]},{"N":"sequence","sType":"*NT ","C":[{"N":"valueOf","sType":"1NT ","C":[{"N":"str","sType":"1AS ","val":" ("}]},{"N":"valueOf","flags":"l","sType":"1NT ","line":"370","C":[{"N":"fn","name":"string-join","role":"select","C":[{"N":"forEach","sType":"*AS ","C":[{"N":"data","sType":"*A ","C":[{"N":"mergeAdj","C":[{"N":"axis","sType":"*NA nQ{}AcademicTitle","name":"attribute","nodeTest":"*NA nQ{}AcademicTitle","ns":"= xml=~ fn=~ xsl=~ oai_dc=http://www.openarchives.org/OAI/2.0/oai_dc/ dc=http://purl.org/dc/elements/1.1/ xsi=~ ","role":"select","line":"370"}]}]},{"N":"fn","name":"string","sType":"1AS ","C":[{"N":"dot"}]}]},{"N":"str","sType":"1AS ","val":" "}]}]},{"N":"valueOf","sType":"1NT ","C":[{"N":"str","sType":"1AS ","val":")"}]}]},{"N":"true"},{"N":"empty","sType":"0 "}]}]}]},{"N":"choose","sType":"* ","line":"375","C":[{"N":"gc","op":"=","comp":"GAC|http://www.w3.org/2005/xpath-functions/collation/codepoint","card":"1:1","sType":"1AB","ns":"= xml=~ fn=~ xsl=~ oai_dc=http://www.openarchives.org/OAI/2.0/oai_dc/ dc=http://purl.org/dc/elements/1.1/ xsi=~ ","line":"375","C":[{"N":"attVal","name":"Q{}NameType"},{"N":"str","val":"Personal"}]},{"N":"sequence","sType":"* ","C":[{"N":"elem","name":"givenName","sType":"1NE nQ{http://datacite.org/schema/kernel-4}givenName ","nsuri":"http://datacite.org/schema/kernel-4","namespaces":"=http://datacite.org/schema/kernel-4 xsi=http://www.w3.org/2001/XMLSchema-instance oai_dc=http://www.openarchives.org/OAI/2.0/oai_dc/ dc=http://purl.org/dc/elements/1.1/","line":"376","C":[{"N":"valueOf","flags":"l","sType":"1NT ","line":"377","C":[{"N":"fn","name":"string-join","role":"select","C":[{"N":"forEach","sType":"*AS ","C":[{"N":"data","sType":"*A ","C":[{"N":"mergeAdj","C":[{"N":"axis","sType":"*NA nQ{}FirstName","name":"attribute","nodeTest":"*NA nQ{}FirstName","ns":"= xml=~ fn=~ xsl=~ oai_dc=http://www.openarchives.org/OAI/2.0/oai_dc/ dc=http://purl.org/dc/elements/1.1/ xsi=~ ","role":"select","line":"377"}]}]},{"N":"fn","name":"string","sType":"1AS ","C":[{"N":"dot"}]}]},{"N":"str","sType":"1AS ","val":" "}]}]}]},{"N":"elem","name":"familyName","sType":"1NE nQ{http://datacite.org/schema/kernel-4}familyName ","nsuri":"http://datacite.org/schema/kernel-4","namespaces":"=http://datacite.org/schema/kernel-4 xsi=http://www.w3.org/2001/XMLSchema-instance oai_dc=http://www.openarchives.org/OAI/2.0/oai_dc/ dc=http://purl.org/dc/elements/1.1/","line":"379","C":[{"N":"valueOf","flags":"l","sType":"1NT ","line":"380","C":[{"N":"fn","name":"string-join","role":"select","C":[{"N":"forEach","sType":"*AS ","C":[{"N":"data","sType":"*A ","C":[{"N":"mergeAdj","C":[{"N":"axis","sType":"*NA nQ{}LastName","name":"attribute","nodeTest":"*NA nQ{}LastName","ns":"= xml=~ fn=~ xsl=~ oai_dc=http://www.openarchives.org/OAI/2.0/oai_dc/ dc=http://purl.org/dc/elements/1.1/ xsi=~ ","role":"select","line":"380"}]}]},{"N":"fn","name":"string","sType":"1AS ","C":[{"N":"dot"}]}]},{"N":"str","sType":"1AS ","val":" "}]}]}]},{"N":"choose","sType":"? ","line":"382","C":[{"N":"gc","op":"!=","comp":"GAC|http://www.w3.org/2005/xpath-functions/collation/codepoint","card":"1:1","sType":"1AB","ns":"= xml=~ fn=~ xsl=~ oai_dc=http://www.openarchives.org/OAI/2.0/oai_dc/ dc=http://purl.org/dc/elements/1.1/ xsi=~ ","line":"382","C":[{"N":"attVal","name":"Q{}IdentifierOrcid"},{"N":"str","val":""}]},{"N":"elem","name":"nameIdentifier","sType":"1NE nQ{http://datacite.org/schema/kernel-4}nameIdentifier ","nsuri":"http://datacite.org/schema/kernel-4","namespaces":"=http://datacite.org/schema/kernel-4 xsi=http://www.w3.org/2001/XMLSchema-instance oai_dc=http://www.openarchives.org/OAI/2.0/oai_dc/ dc=http://purl.org/dc/elements/1.1/","line":"383","C":[{"N":"sequence","sType":"*N ","C":[{"N":"att","name":"schemeURI","nsuri":"","sType":"1NA ","C":[{"N":"str","sType":"1AS ","val":"http://orcid.org/"}]},{"N":"att","name":"nameIdentifierScheme","nsuri":"","sType":"1NA ","C":[{"N":"str","sType":"1AS ","val":"ORCID"}]},{"N":"valueOf","flags":"l","sType":"1NT ","line":"384","C":[{"N":"fn","name":"string-join","role":"select","C":[{"N":"forEach","sType":"*AS ","C":[{"N":"data","sType":"*A ","C":[{"N":"mergeAdj","C":[{"N":"axis","sType":"*NA nQ{}IdentifierOrcid","name":"attribute","nodeTest":"*NA nQ{}IdentifierOrcid","ns":"= xml=~ fn=~ xsl=~ oai_dc=http://www.openarchives.org/OAI/2.0/oai_dc/ dc=http://purl.org/dc/elements/1.1/ xsi=~ ","role":"select","line":"384"}]}]},{"N":"fn","name":"string","sType":"1AS ","C":[{"N":"dot"}]}]},{"N":"str","sType":"1AS ","val":" "}]}]}]}]},{"N":"true"},{"N":"empty","sType":"0 "}]},{"N":"elem","name":"affiliation","sType":"1NE nQ{http://datacite.org/schema/kernel-4}affiliation ","nsuri":"http://datacite.org/schema/kernel-4","namespaces":"=http://datacite.org/schema/kernel-4 xsi=http://www.w3.org/2001/XMLSchema-instance oai_dc=http://www.openarchives.org/OAI/2.0/oai_dc/ dc=http://purl.org/dc/elements/1.1/","line":"387","C":[{"N":"valueOf","sType":"1NT ","C":[{"N":"str","sType":"1AS ","val":"GBA"}]}]}]},{"N":"true"},{"N":"empty","sType":"0 "}]},{"N":"choose","sType":"? ","line":"390","C":[{"N":"gc","op":"=","comp":"GAC|http://www.w3.org/2005/xpath-functions/collation/codepoint","card":"1:1","sType":"1AB","ns":"= xml=~ fn=~ xsl=~ oai_dc=http://www.openarchives.org/OAI/2.0/oai_dc/ dc=http://purl.org/dc/elements/1.1/ xsi=~ ","line":"390","C":[{"N":"attVal","name":"Q{}NameType"},{"N":"str","val":"Organizational"}]},{"N":"choose","sType":"? ","line":"391","C":[{"N":"gc","op":"!=","comp":"GAC|http://www.w3.org/2005/xpath-functions/collation/codepoint","card":"1:1","sType":"1AB","ns":"= xml=~ fn=~ xsl=~ oai_dc=http://www.openarchives.org/OAI/2.0/oai_dc/ dc=http://purl.org/dc/elements/1.1/ xsi=~ ","line":"391","C":[{"N":"attVal","name":"Q{}IdentifierOrcid"},{"N":"str","val":""}]},{"N":"elem","name":"nameIdentifier","sType":"1NE nQ{http://datacite.org/schema/kernel-4}nameIdentifier ","nsuri":"http://datacite.org/schema/kernel-4","namespaces":"=http://datacite.org/schema/kernel-4 xsi=http://www.w3.org/2001/XMLSchema-instance oai_dc=http://www.openarchives.org/OAI/2.0/oai_dc/ dc=http://purl.org/dc/elements/1.1/","line":"392","C":[{"N":"sequence","sType":"*N ","C":[{"N":"att","name":"schemeURI","nsuri":"","sType":"1NA ","C":[{"N":"str","sType":"1AS ","val":"http://orcid.org/"}]},{"N":"att","name":"nameIdentifierScheme","nsuri":"","sType":"1NA ","C":[{"N":"str","sType":"1AS ","val":"ORCID"}]},{"N":"valueOf","flags":"l","sType":"1NT ","line":"393","C":[{"N":"fn","name":"string-join","role":"select","C":[{"N":"forEach","sType":"*AS ","C":[{"N":"data","sType":"*A ","C":[{"N":"mergeAdj","C":[{"N":"axis","sType":"*NA nQ{}IdentifierOrcid","name":"attribute","nodeTest":"*NA nQ{}IdentifierOrcid","ns":"= xml=~ fn=~ xsl=~ oai_dc=http://www.openarchives.org/OAI/2.0/oai_dc/ dc=http://purl.org/dc/elements/1.1/ xsi=~ ","role":"select","line":"393"}]}]},{"N":"fn","name":"string","sType":"1AS ","C":[{"N":"dot"}]}]},{"N":"str","sType":"1AS ","val":" "}]}]}]}]},{"N":"true"},{"N":"empty","sType":"0 "}]},{"N":"true"},{"N":"empty","sType":"0 "}]}]}]}]},{"N":"templateRule","rank":"3","prec":"0","seq":"10","ns":"xml=~ =http://datacite.org/schema/kernel-4 xsl=~ oai_dc=http://www.openarchives.org/OAI/2.0/oai_dc/ dc=http://purl.org/dc/elements/1.1/ xsi=~","minImp":"0","flags":"s","slots":"200","baseUri":"file:///home/administrator/tethys/tethys.myapp/public/assets2/doi_datacite.xslt","line":"336","module":"doi_datacite.xslt","expand-text":"false","match":"PersonContributor","prio":"0","matches":"NE u[NE nQ{}PersonContributor,NE nQ{http://www.w3.org/1999/xhtml}PersonContributor]","C":[{"N":"p.nodeTest","role":"match","test":"NE u[NE nQ{}PersonContributor,NE nQ{http://www.w3.org/1999/xhtml}PersonContributor]","sType":"1NE u[NE nQ{}PersonContributor,NE nQ{http://www.w3.org/1999/xhtml}PersonContributor]","ns":"= xml=~ fn=~ xsl=~ oai_dc=http://www.openarchives.org/OAI/2.0/oai_dc/ dc=http://purl.org/dc/elements/1.1/ xsi=~ "},{"N":"elem","name":"contributor","sType":"1NE nQ{http://datacite.org/schema/kernel-4}contributor ","nsuri":"http://datacite.org/schema/kernel-4","namespaces":"=http://datacite.org/schema/kernel-4 xsi=http://www.w3.org/2001/XMLSchema-instance oai_dc=http://www.openarchives.org/OAI/2.0/oai_dc/ dc=http://purl.org/dc/elements/1.1/","role":"action","line":"337","C":[{"N":"sequence","sType":"* ","C":[{"N":"choose","sType":"? ","line":"338","C":[{"N":"gc","op":"!=","comp":"GAC|http://www.w3.org/2005/xpath-functions/collation/codepoint","card":"1:1","sType":"1AB","ns":"= xml=~ fn=~ xsl=~ oai_dc=http://www.openarchives.org/OAI/2.0/oai_dc/ dc=http://purl.org/dc/elements/1.1/ xsi=~ ","line":"338","C":[{"N":"attVal","name":"Q{}ContributorType"},{"N":"str","val":""}]},{"N":"att","name":"contributorType","sType":"1NA ","line":"339","C":[{"N":"fn","name":"string-join","role":"select","C":[{"N":"forEach","sType":"*AS ","C":[{"N":"data","sType":"*A ","C":[{"N":"mergeAdj","C":[{"N":"valueOf","sType":"1NT ","flags":"l","line":"340","C":[{"N":"fn","name":"string-join","role":"select","C":[{"N":"forEach","sType":"*AS ","C":[{"N":"data","sType":"*A ","C":[{"N":"mergeAdj","C":[{"N":"axis","sType":"*NA nQ{}ContributorType","name":"attribute","nodeTest":"*NA nQ{}ContributorType","ns":"= xml=~ fn=~ xsl=~ oai_dc=http://www.openarchives.org/OAI/2.0/oai_dc/ dc=http://purl.org/dc/elements/1.1/ xsi=~ ","role":"select","line":"340"}]}]},{"N":"fn","name":"string","sType":"1AS ","C":[{"N":"dot"}]}]},{"N":"str","sType":"1AS ","val":" "}]}]}]}]},{"N":"fn","name":"string","sType":"1AS ","C":[{"N":"dot"}]}]},{"N":"str","sType":"1AS ","val":""}]}]},{"N":"true"},{"N":"empty","sType":"0 "}]},{"N":"elem","name":"contributorName","sType":"1NE nQ{http://datacite.org/schema/kernel-4}contributorName ","nsuri":"http://datacite.org/schema/kernel-4","namespaces":"=http://datacite.org/schema/kernel-4 xsi=http://www.w3.org/2001/XMLSchema-instance oai_dc=http://www.openarchives.org/OAI/2.0/oai_dc/ dc=http://purl.org/dc/elements/1.1/","line":"343","C":[{"N":"valueOf","flags":"l","sType":"1NT ","line":"349","C":[{"N":"fn","name":"string-join","role":"select","C":[{"N":"fn","name":"concat","sType":"1AS","ns":"= xml=~ fn=~ xsl=~ oai_dc=http://www.openarchives.org/OAI/2.0/oai_dc/ dc=http://purl.org/dc/elements/1.1/ xsi=~ ","role":"select","line":"349","C":[{"N":"check","card":"?","diag":"0|0||concat","C":[{"N":"attVal","name":"Q{}FirstName"}]},{"N":"str","val":" "},{"N":"check","card":"?","diag":"0|2||concat","C":[{"N":"attVal","name":"Q{}LastName"}]}]},{"N":"str","sType":"1AS ","val":" "}]}]}]}]}]}]},{"N":"templateRule","rank":"4","prec":"0","seq":"9","ns":"xml=~ =http://datacite.org/schema/kernel-4 xsl=~ oai_dc=http://www.openarchives.org/OAI/2.0/oai_dc/ dc=http://purl.org/dc/elements/1.1/ xsi=~","minImp":"0","flags":"s","slots":"200","baseUri":"file:///home/administrator/tethys/tethys.myapp/public/assets2/doi_datacite.xslt","line":"323","module":"doi_datacite.xslt","expand-text":"false","match":"Reference","prio":"0","matches":"NE u[NE nQ{}Reference,NE nQ{http://www.w3.org/1999/xhtml}Reference]","C":[{"N":"p.nodeTest","role":"match","test":"NE u[NE nQ{}Reference,NE nQ{http://www.w3.org/1999/xhtml}Reference]","sType":"1NE u[NE nQ{}Reference,NE nQ{http://www.w3.org/1999/xhtml}Reference]","ns":"= xml=~ fn=~ xsl=~ oai_dc=http://www.openarchives.org/OAI/2.0/oai_dc/ dc=http://purl.org/dc/elements/1.1/ xsi=~ "},{"N":"elem","name":"relatedIdentifier","sType":"1NE nQ{http://datacite.org/schema/kernel-4}relatedIdentifier ","nsuri":"http://datacite.org/schema/kernel-4","namespaces":"=http://datacite.org/schema/kernel-4 xsi=http://www.w3.org/2001/XMLSchema-instance oai_dc=http://www.openarchives.org/OAI/2.0/oai_dc/ dc=http://purl.org/dc/elements/1.1/","role":"action","line":"324","C":[{"N":"sequence","sType":"*N ","C":[{"N":"att","name":"relatedIdentifierType","sType":"1NA ","line":"325","C":[{"N":"fn","name":"string-join","role":"select","C":[{"N":"forEach","sType":"*AS ","C":[{"N":"data","sType":"*A ","C":[{"N":"mergeAdj","C":[{"N":"valueOf","sType":"1NT ","flags":"l","line":"326","C":[{"N":"fn","name":"string-join","role":"select","C":[{"N":"forEach","sType":"*AS ","C":[{"N":"data","sType":"*A ","C":[{"N":"mergeAdj","C":[{"N":"axis","sType":"*NA nQ{}Type","name":"attribute","nodeTest":"*NA nQ{}Type","ns":"= xml=~ fn=~ xsl=~ oai_dc=http://www.openarchives.org/OAI/2.0/oai_dc/ dc=http://purl.org/dc/elements/1.1/ xsi=~ ","role":"select","line":"326"}]}]},{"N":"fn","name":"string","sType":"1AS ","C":[{"N":"dot"}]}]},{"N":"str","sType":"1AS ","val":" "}]}]}]}]},{"N":"fn","name":"string","sType":"1AS ","C":[{"N":"dot"}]}]},{"N":"str","sType":"1AS ","val":""}]}]},{"N":"att","name":"relationType","sType":"1NA ","line":"328","C":[{"N":"fn","name":"string-join","role":"select","C":[{"N":"forEach","sType":"*AS ","C":[{"N":"data","sType":"*A ","C":[{"N":"mergeAdj","C":[{"N":"valueOf","sType":"1NT ","flags":"l","line":"329","C":[{"N":"fn","name":"string-join","role":"select","C":[{"N":"forEach","sType":"*AS ","C":[{"N":"data","sType":"*A ","C":[{"N":"mergeAdj","C":[{"N":"axis","sType":"*NA nQ{}Relation","name":"attribute","nodeTest":"*NA nQ{}Relation","ns":"= xml=~ fn=~ xsl=~ oai_dc=http://www.openarchives.org/OAI/2.0/oai_dc/ dc=http://purl.org/dc/elements/1.1/ xsi=~ ","role":"select","line":"329"}]}]},{"N":"fn","name":"string","sType":"1AS ","C":[{"N":"dot"}]}]},{"N":"str","sType":"1AS ","val":" "}]}]}]}]},{"N":"fn","name":"string","sType":"1AS ","C":[{"N":"dot"}]}]},{"N":"str","sType":"1AS ","val":""}]}]},{"N":"valueOf","flags":"l","sType":"1NT ","line":"331","C":[{"N":"fn","name":"string-join","role":"select","C":[{"N":"forEach","sType":"*AS ","C":[{"N":"data","sType":"*A ","C":[{"N":"mergeAdj","C":[{"N":"axis","sType":"*NA nQ{}Value","name":"attribute","nodeTest":"*NA nQ{}Value","ns":"= xml=~ fn=~ xsl=~ oai_dc=http://www.openarchives.org/OAI/2.0/oai_dc/ dc=http://purl.org/dc/elements/1.1/ xsi=~ ","role":"select","line":"331"}]}]},{"N":"fn","name":"string","sType":"1AS ","C":[{"N":"dot"}]}]},{"N":"str","sType":"1AS ","val":" "}]}]}]}]}]},{"N":"templateRule","rank":"5","prec":"0","seq":"8","ns":"xml=~ =http://datacite.org/schema/kernel-4 xsl=~ oai_dc=http://www.openarchives.org/OAI/2.0/oai_dc/ dc=http://purl.org/dc/elements/1.1/ xsi=~","minImp":"0","flags":"s","slots":"200","baseUri":"file:///home/administrator/tethys/tethys.myapp/public/assets2/doi_datacite.xslt","line":"312","module":"doi_datacite.xslt","expand-text":"false","match":"AlternateIdentifier","prio":"0","matches":"NE u[NE nQ{}AlternateIdentifier,NE nQ{http://www.w3.org/1999/xhtml}AlternateIdentifier]","C":[{"N":"p.nodeTest","role":"match","test":"NE u[NE nQ{}AlternateIdentifier,NE nQ{http://www.w3.org/1999/xhtml}AlternateIdentifier]","sType":"1NE u[NE nQ{}AlternateIdentifier,NE nQ{http://www.w3.org/1999/xhtml}AlternateIdentifier]","ns":"= xml=~ fn=~ xsl=~ oai_dc=http://www.openarchives.org/OAI/2.0/oai_dc/ dc=http://purl.org/dc/elements/1.1/ xsi=~ "},{"N":"elem","name":"alternateIdentifier","sType":"1NE nQ{http://datacite.org/schema/kernel-4}alternateIdentifier ","nsuri":"http://datacite.org/schema/kernel-4","namespaces":"=http://datacite.org/schema/kernel-4 xsi=http://www.w3.org/2001/XMLSchema-instance oai_dc=http://www.openarchives.org/OAI/2.0/oai_dc/ dc=http://purl.org/dc/elements/1.1/","role":"action","line":"313","C":[{"N":"sequence","sType":"*N ","C":[{"N":"att","name":"alternateIdentifierType","sType":"1NA ","line":"314","C":[{"N":"fn","name":"string-join","role":"select","C":[{"N":"forEach","sType":"*AS ","C":[{"N":"data","sType":"*A ","C":[{"N":"mergeAdj","C":[{"N":"valueOf","sType":"1NT ","C":[{"N":"str","sType":"1AS ","val":"url"}]}]}]},{"N":"fn","name":"string","sType":"1AS ","C":[{"N":"dot"}]}]},{"N":"str","sType":"1AS ","val":""}]}]},{"N":"valueOf","flags":"l","sType":"1NT ","line":"318","C":[{"N":"fn","name":"string-join","role":"select","C":[{"N":"forEach","sType":"*AS ","C":[{"N":"data","sType":"*A ","C":[{"N":"mergeAdj","C":[{"N":"axis","sType":"*NA nQ{}landingpage","name":"attribute","nodeTest":"*NA nQ{}landingpage","ns":"= xml=~ fn=~ xsl=~ oai_dc=http://www.openarchives.org/OAI/2.0/oai_dc/ dc=http://purl.org/dc/elements/1.1/ xsi=~ ","role":"select","line":"318"}]}]},{"N":"fn","name":"string","sType":"1AS ","C":[{"N":"dot"}]}]},{"N":"str","sType":"1AS ","val":" "}]}]}]}]}]},{"N":"templateRule","rank":"6","prec":"0","seq":"7","ns":"xml=~ =http://datacite.org/schema/kernel-4 xsl=~ oai_dc=http://www.openarchives.org/OAI/2.0/oai_dc/ dc=http://purl.org/dc/elements/1.1/ xsi=~","minImp":"0","flags":"s","slots":"200","baseUri":"file:///home/administrator/tethys/tethys.myapp/public/assets2/doi_datacite.xslt","line":"300","module":"doi_datacite.xslt","expand-text":"false","match":"Subject","prio":"0","matches":"NE u[NE nQ{}Subject,NE nQ{http://www.w3.org/1999/xhtml}Subject]","C":[{"N":"p.nodeTest","role":"match","test":"NE u[NE nQ{}Subject,NE nQ{http://www.w3.org/1999/xhtml}Subject]","sType":"1NE u[NE nQ{}Subject,NE nQ{http://www.w3.org/1999/xhtml}Subject]","ns":"= xml=~ fn=~ xsl=~ oai_dc=http://www.openarchives.org/OAI/2.0/oai_dc/ dc=http://purl.org/dc/elements/1.1/ xsi=~ "},{"N":"elem","name":"subject","sType":"1NE nQ{http://datacite.org/schema/kernel-4}subject ","nsuri":"http://datacite.org/schema/kernel-4","namespaces":"=http://datacite.org/schema/kernel-4 xsi=http://www.w3.org/2001/XMLSchema-instance oai_dc=http://www.openarchives.org/OAI/2.0/oai_dc/ dc=http://purl.org/dc/elements/1.1/","role":"action","line":"301","C":[{"N":"sequence","sType":"* ","C":[{"N":"choose","sType":"? ","line":"302","C":[{"N":"gc","op":"!=","comp":"GAC|http://www.w3.org/2005/xpath-functions/collation/codepoint","card":"1:1","sType":"1AB","ns":"= xml=~ fn=~ xsl=~ oai_dc=http://www.openarchives.org/OAI/2.0/oai_dc/ dc=http://purl.org/dc/elements/1.1/ xsi=~ ","line":"302","C":[{"N":"attVal","name":"Q{}Language"},{"N":"str","val":""}]},{"N":"att","name":"xml:lang","sType":"1NA ","nsuri":"http://www.w3.org/XML/1998/namespace","line":"303","C":[{"N":"fn","name":"string-join","role":"select","C":[{"N":"forEach","sType":"*AS ","C":[{"N":"data","sType":"*A ","C":[{"N":"mergeAdj","C":[{"N":"valueOf","sType":"1NT ","flags":"l","line":"304","C":[{"N":"fn","name":"string-join","role":"select","C":[{"N":"forEach","sType":"*AS ","C":[{"N":"data","sType":"*A ","C":[{"N":"mergeAdj","C":[{"N":"axis","sType":"*NA nQ{}Language","name":"attribute","nodeTest":"*NA nQ{}Language","ns":"= xml=~ fn=~ xsl=~ oai_dc=http://www.openarchives.org/OAI/2.0/oai_dc/ dc=http://purl.org/dc/elements/1.1/ xsi=~ ","role":"select","line":"304"}]}]},{"N":"fn","name":"string","sType":"1AS ","C":[{"N":"dot"}]}]},{"N":"str","sType":"1AS ","val":" "}]}]}]}]},{"N":"fn","name":"string","sType":"1AS ","C":[{"N":"dot"}]}]},{"N":"str","sType":"1AS ","val":""}]}]},{"N":"true"},{"N":"empty","sType":"0 "}]},{"N":"valueOf","flags":"l","sType":"1NT ","line":"307","C":[{"N":"fn","name":"string-join","role":"select","C":[{"N":"forEach","sType":"*AS ","C":[{"N":"data","sType":"*A ","C":[{"N":"mergeAdj","C":[{"N":"axis","sType":"*NA nQ{}Value","name":"attribute","nodeTest":"*NA nQ{}Value","ns":"= xml=~ fn=~ xsl=~ oai_dc=http://www.openarchives.org/OAI/2.0/oai_dc/ dc=http://purl.org/dc/elements/1.1/ xsi=~ ","role":"select","line":"307"}]}]},{"N":"fn","name":"string","sType":"1AS ","C":[{"N":"dot"}]}]},{"N":"str","sType":"1AS ","val":" "}]}]}]}]}]},{"N":"templateRule","rank":"7","prec":"0","seq":"6","ns":"xml=~ =http://datacite.org/schema/kernel-4 xsl=~ oai_dc=http://www.openarchives.org/OAI/2.0/oai_dc/ dc=http://purl.org/dc/elements/1.1/ xsi=~","minImp":"0","flags":"s","slots":"200","baseUri":"file:///home/administrator/tethys/tethys.myapp/public/assets2/doi_datacite.xslt","line":"274","module":"doi_datacite.xslt","expand-text":"false","match":"TitleAdditional","prio":"0","matches":"NE u[NE nQ{}TitleAdditional,NE nQ{http://www.w3.org/1999/xhtml}TitleAdditional]","C":[{"N":"p.nodeTest","role":"match","test":"NE u[NE nQ{}TitleAdditional,NE nQ{http://www.w3.org/1999/xhtml}TitleAdditional]","sType":"1NE u[NE nQ{}TitleAdditional,NE nQ{http://www.w3.org/1999/xhtml}TitleAdditional]","ns":"= xml=~ fn=~ xsl=~ oai_dc=http://www.openarchives.org/OAI/2.0/oai_dc/ dc=http://purl.org/dc/elements/1.1/ xsi=~ "},{"N":"elem","name":"title","sType":"1NE nQ{http://datacite.org/schema/kernel-4}title ","nsuri":"http://datacite.org/schema/kernel-4","namespaces":"=http://datacite.org/schema/kernel-4 xsi=http://www.w3.org/2001/XMLSchema-instance oai_dc=http://www.openarchives.org/OAI/2.0/oai_dc/ dc=http://purl.org/dc/elements/1.1/","role":"action","line":"275","C":[{"N":"sequence","sType":"* ","C":[{"N":"choose","sType":"? ","line":"276","C":[{"N":"gc","op":"!=","comp":"GAC|http://www.w3.org/2005/xpath-functions/collation/codepoint","card":"1:1","sType":"1AB","ns":"= xml=~ fn=~ xsl=~ oai_dc=http://www.openarchives.org/OAI/2.0/oai_dc/ dc=http://purl.org/dc/elements/1.1/ xsi=~ ","line":"276","C":[{"N":"attVal","name":"Q{}Language"},{"N":"str","val":""}]},{"N":"att","name":"xml:lang","sType":"1NA ","nsuri":"http://www.w3.org/XML/1998/namespace","line":"277","C":[{"N":"fn","name":"string-join","role":"select","C":[{"N":"forEach","sType":"*AS ","C":[{"N":"data","sType":"*A ","C":[{"N":"mergeAdj","C":[{"N":"valueOf","sType":"1NT ","flags":"l","line":"278","C":[{"N":"fn","name":"string-join","role":"select","C":[{"N":"forEach","sType":"*AS ","C":[{"N":"data","sType":"*A ","C":[{"N":"mergeAdj","C":[{"N":"axis","sType":"*NA nQ{}Language","name":"attribute","nodeTest":"*NA nQ{}Language","ns":"= xml=~ fn=~ xsl=~ oai_dc=http://www.openarchives.org/OAI/2.0/oai_dc/ dc=http://purl.org/dc/elements/1.1/ xsi=~ ","role":"select","line":"278"}]}]},{"N":"fn","name":"string","sType":"1AS ","C":[{"N":"dot"}]}]},{"N":"str","sType":"1AS ","val":" "}]}]}]}]},{"N":"fn","name":"string","sType":"1AS ","C":[{"N":"dot"}]}]},{"N":"str","sType":"1AS ","val":""}]}]},{"N":"true"},{"N":"empty","sType":"0 "}]},{"N":"choose","sType":"? ","type":"item()*","line":"281","C":[{"N":"and","sType":"1AB","ns":"= xml=~ fn=~ xsl=~ oai_dc=http://www.openarchives.org/OAI/2.0/oai_dc/ dc=http://purl.org/dc/elements/1.1/ xsi=~ ","line":"282","C":[{"N":"and","C":[{"N":"gc","op":"!=","comp":"GAC|http://www.w3.org/2005/xpath-functions/collation/codepoint","card":"1:1","C":[{"N":"attVal","name":"Q{}Type"},{"N":"str","val":""}]},{"N":"gc","op":"!=","comp":"GAC|http://www.w3.org/2005/xpath-functions/collation/codepoint","card":"1:1","C":[{"N":"attVal","name":"Q{}Type"},{"N":"str","val":"Sub"}]}]},{"N":"gc","op":"!=","comp":"GAC|http://www.w3.org/2005/xpath-functions/collation/codepoint","card":"1:1","C":[{"N":"attVal","name":"Q{}Type"},{"N":"str","val":"Main"}]}]},{"N":"att","name":"titleType","sType":"1NA ","line":"283","C":[{"N":"fn","name":"string-join","role":"select","C":[{"N":"forEach","sType":"*AS ","C":[{"N":"data","sType":"*A ","C":[{"N":"mergeAdj","C":[{"N":"sequence","sType":"*NT ","C":[{"N":"valueOf","flags":"l","sType":"1NT ","line":"284","C":[{"N":"fn","name":"string-join","role":"select","C":[{"N":"forEach","sType":"*AS ","C":[{"N":"data","sType":"*A ","C":[{"N":"mergeAdj","C":[{"N":"axis","sType":"*NA nQ{}Type","name":"attribute","nodeTest":"*NA nQ{}Type","ns":"= xml=~ fn=~ xsl=~ oai_dc=http://www.openarchives.org/OAI/2.0/oai_dc/ dc=http://purl.org/dc/elements/1.1/ xsi=~ ","role":"select","line":"284"}]}]},{"N":"fn","name":"string","sType":"1AS ","C":[{"N":"dot"}]}]},{"N":"str","sType":"1AS ","val":" "}]}]},{"N":"valueOf","sType":"1NT ","C":[{"N":"str","sType":"1AS ","val":"Title"}]}]}]}]},{"N":"fn","name":"string","sType":"1AS ","C":[{"N":"dot"}]}]},{"N":"str","sType":"1AS ","val":""}]}]},{"N":"gc","op":"=","comp":"GAC|http://www.w3.org/2005/xpath-functions/collation/codepoint","card":"1:1","sType":"1AB","ns":"= xml=~ fn=~ xsl=~ oai_dc=http://www.openarchives.org/OAI/2.0/oai_dc/ dc=http://purl.org/dc/elements/1.1/ xsi=~ ","line":"288","C":[{"N":"attVal","name":"Q{}Type"},{"N":"str","val":"Sub"}]},{"N":"att","name":"titleType","sType":"1NA ","line":"289","C":[{"N":"fn","name":"string-join","role":"select","C":[{"N":"forEach","sType":"*AS ","C":[{"N":"data","sType":"*A ","C":[{"N":"mergeAdj","C":[{"N":"sequence","sType":"*NT ","C":[{"N":"valueOf","flags":"l","sType":"1NT ","line":"290","C":[{"N":"fn","name":"string-join","role":"select","C":[{"N":"forEach","sType":"*AS ","C":[{"N":"data","sType":"*A ","C":[{"N":"mergeAdj","C":[{"N":"axis","sType":"*NA nQ{}Type","name":"attribute","nodeTest":"*NA nQ{}Type","ns":"= xml=~ fn=~ xsl=~ oai_dc=http://www.openarchives.org/OAI/2.0/oai_dc/ dc=http://purl.org/dc/elements/1.1/ xsi=~ ","role":"select","line":"290"}]}]},{"N":"fn","name":"string","sType":"1AS ","C":[{"N":"dot"}]}]},{"N":"str","sType":"1AS ","val":" "}]}]},{"N":"valueOf","sType":"1NT ","C":[{"N":"str","sType":"1AS ","val":"title"}]}]}]}]},{"N":"fn","name":"string","sType":"1AS ","C":[{"N":"dot"}]}]},{"N":"str","sType":"1AS ","val":""}]}]},{"N":"true"},{"N":"empty","sType":"0 "}]},{"N":"valueOf","flags":"l","sType":"1NT ","line":"295","C":[{"N":"fn","name":"string-join","role":"select","C":[{"N":"forEach","sType":"*AS ","C":[{"N":"data","sType":"*A ","C":[{"N":"mergeAdj","C":[{"N":"axis","sType":"*NA nQ{}Value","name":"attribute","nodeTest":"*NA nQ{}Value","ns":"= xml=~ fn=~ xsl=~ oai_dc=http://www.openarchives.org/OAI/2.0/oai_dc/ dc=http://purl.org/dc/elements/1.1/ xsi=~ ","role":"select","line":"295"}]}]},{"N":"fn","name":"string","sType":"1AS ","C":[{"N":"dot"}]}]},{"N":"str","sType":"1AS ","val":" "}]}]}]}]}]},{"N":"templateRule","rank":"8","prec":"0","seq":"5","ns":"xml=~ =http://datacite.org/schema/kernel-4 xsl=~ oai_dc=http://www.openarchives.org/OAI/2.0/oai_dc/ dc=http://purl.org/dc/elements/1.1/ xsi=~","minImp":"0","flags":"s","slots":"200","baseUri":"file:///home/administrator/tethys/tethys.myapp/public/assets2/doi_datacite.xslt","line":"258","module":"doi_datacite.xslt","expand-text":"false","match":"TitleMain","prio":"0","matches":"NE u[NE nQ{}TitleMain,NE nQ{http://www.w3.org/1999/xhtml}TitleMain]","C":[{"N":"p.nodeTest","role":"match","test":"NE u[NE nQ{}TitleMain,NE nQ{http://www.w3.org/1999/xhtml}TitleMain]","sType":"1NE u[NE nQ{}TitleMain,NE nQ{http://www.w3.org/1999/xhtml}TitleMain]","ns":"= xml=~ fn=~ xsl=~ oai_dc=http://www.openarchives.org/OAI/2.0/oai_dc/ dc=http://purl.org/dc/elements/1.1/ xsi=~ "},{"N":"elem","name":"title","sType":"1NE nQ{http://datacite.org/schema/kernel-4}title ","nsuri":"http://datacite.org/schema/kernel-4","namespaces":"=http://datacite.org/schema/kernel-4 xsi=http://www.w3.org/2001/XMLSchema-instance oai_dc=http://www.openarchives.org/OAI/2.0/oai_dc/ dc=http://purl.org/dc/elements/1.1/","role":"action","line":"259","C":[{"N":"sequence","sType":"* ","C":[{"N":"choose","sType":"? ","line":"260","C":[{"N":"gc","op":"!=","comp":"GAC|http://www.w3.org/2005/xpath-functions/collation/codepoint","card":"1:1","sType":"1AB","ns":"= xml=~ fn=~ xsl=~ oai_dc=http://www.openarchives.org/OAI/2.0/oai_dc/ dc=http://purl.org/dc/elements/1.1/ xsi=~ ","line":"260","C":[{"N":"attVal","name":"Q{}Language"},{"N":"str","val":""}]},{"N":"att","name":"xml:lang","sType":"1NA ","nsuri":"http://www.w3.org/XML/1998/namespace","line":"261","C":[{"N":"fn","name":"string-join","role":"select","C":[{"N":"forEach","sType":"*AS ","C":[{"N":"data","sType":"*A ","C":[{"N":"mergeAdj","C":[{"N":"valueOf","sType":"1NT ","flags":"l","line":"262","C":[{"N":"fn","name":"string-join","role":"select","C":[{"N":"forEach","sType":"*AS ","C":[{"N":"data","sType":"*A ","C":[{"N":"mergeAdj","C":[{"N":"axis","sType":"*NA nQ{}Language","name":"attribute","nodeTest":"*NA nQ{}Language","ns":"= xml=~ fn=~ xsl=~ oai_dc=http://www.openarchives.org/OAI/2.0/oai_dc/ dc=http://purl.org/dc/elements/1.1/ xsi=~ ","role":"select","line":"262"}]}]},{"N":"fn","name":"string","sType":"1AS ","C":[{"N":"dot"}]}]},{"N":"str","sType":"1AS ","val":" "}]}]}]}]},{"N":"fn","name":"string","sType":"1AS ","C":[{"N":"dot"}]}]},{"N":"str","sType":"1AS ","val":""}]}]},{"N":"true"},{"N":"empty","sType":"0 "}]},{"N":"choose","sType":"? ","line":"265","C":[{"N":"and","sType":"1AB","ns":"= xml=~ fn=~ xsl=~ oai_dc=http://www.openarchives.org/OAI/2.0/oai_dc/ dc=http://purl.org/dc/elements/1.1/ xsi=~ ","line":"265","C":[{"N":"gc","op":"!=","comp":"GAC|http://www.w3.org/2005/xpath-functions/collation/codepoint","card":"1:1","C":[{"N":"attVal","name":"Q{}Type"},{"N":"str","val":""}]},{"N":"gc","op":"!=","comp":"GAC|http://www.w3.org/2005/xpath-functions/collation/codepoint","card":"1:1","C":[{"N":"attVal","name":"Q{}Type"},{"N":"str","val":"Main"}]}]},{"N":"att","name":"titleType","sType":"1NA ","line":"266","C":[{"N":"fn","name":"string-join","role":"select","C":[{"N":"forEach","sType":"*AS ","C":[{"N":"data","sType":"*A ","C":[{"N":"mergeAdj","C":[{"N":"valueOf","sType":"1NT ","flags":"l","line":"267","C":[{"N":"fn","name":"string-join","role":"select","C":[{"N":"forEach","sType":"*AS ","C":[{"N":"data","sType":"*A ","C":[{"N":"mergeAdj","C":[{"N":"axis","sType":"*NA nQ{}Type","name":"attribute","nodeTest":"*NA nQ{}Type","ns":"= xml=~ fn=~ xsl=~ oai_dc=http://www.openarchives.org/OAI/2.0/oai_dc/ dc=http://purl.org/dc/elements/1.1/ xsi=~ ","role":"select","line":"267"}]}]},{"N":"fn","name":"string","sType":"1AS ","C":[{"N":"dot"}]}]},{"N":"str","sType":"1AS ","val":" "}]}]}]}]},{"N":"fn","name":"string","sType":"1AS ","C":[{"N":"dot"}]}]},{"N":"str","sType":"1AS ","val":""}]}]},{"N":"true"},{"N":"empty","sType":"0 "}]},{"N":"valueOf","flags":"l","sType":"1NT ","line":"270","C":[{"N":"fn","name":"string-join","role":"select","C":[{"N":"forEach","sType":"*AS ","C":[{"N":"data","sType":"*A ","C":[{"N":"mergeAdj","C":[{"N":"axis","sType":"*NA nQ{}Value","name":"attribute","nodeTest":"*NA nQ{}Value","ns":"= xml=~ fn=~ xsl=~ oai_dc=http://www.openarchives.org/OAI/2.0/oai_dc/ dc=http://purl.org/dc/elements/1.1/ xsi=~ ","role":"select","line":"270"}]}]},{"N":"fn","name":"string","sType":"1AS ","C":[{"N":"dot"}]}]},{"N":"str","sType":"1AS ","val":" "}]}]}]}]}]},{"N":"templateRule","rank":"9","prec":"0","seq":"4","ns":"xml=~ =http://datacite.org/schema/kernel-4 xsl=~ oai_dc=http://www.openarchives.org/OAI/2.0/oai_dc/ dc=http://purl.org/dc/elements/1.1/ xsi=~","minImp":"0","flags":"s","slots":"200","baseUri":"file:///home/administrator/tethys/tethys.myapp/public/assets2/doi_datacite.xslt","line":"248","module":"doi_datacite.xslt","expand-text":"false","match":"Identifier","prio":"0","matches":"NE u[NE nQ{}Identifier,NE nQ{http://www.w3.org/1999/xhtml}Identifier]","C":[{"N":"p.nodeTest","role":"match","test":"NE u[NE nQ{}Identifier,NE nQ{http://www.w3.org/1999/xhtml}Identifier]","sType":"1NE u[NE nQ{}Identifier,NE nQ{http://www.w3.org/1999/xhtml}Identifier]","ns":"= xml=~ fn=~ xsl=~ oai_dc=http://www.openarchives.org/OAI/2.0/oai_dc/ dc=http://purl.org/dc/elements/1.1/ xsi=~ "},{"N":"elem","name":"identifier","sType":"1NE nQ{http://datacite.org/schema/kernel-4}identifier ","nsuri":"http://datacite.org/schema/kernel-4","namespaces":"=http://datacite.org/schema/kernel-4 xsi=http://www.w3.org/2001/XMLSchema-instance oai_dc=http://www.openarchives.org/OAI/2.0/oai_dc/ dc=http://purl.org/dc/elements/1.1/","role":"action","line":"249","C":[{"N":"sequence","sType":"*N ","C":[{"N":"att","name":"identifierType","sType":"1NA ","line":"250","C":[{"N":"fn","name":"string-join","role":"select","C":[{"N":"forEach","sType":"*AS ","C":[{"N":"data","sType":"*A ","C":[{"N":"mergeAdj","C":[{"N":"valueOf","sType":"1NT ","C":[{"N":"str","sType":"1AS ","val":"DOI"}]}]}]},{"N":"fn","name":"string","sType":"1AS ","C":[{"N":"dot"}]}]},{"N":"str","sType":"1AS ","val":""}]}]},{"N":"valueOf","flags":"l","sType":"1NT ","line":"253","C":[{"N":"fn","name":"string-join","role":"select","C":[{"N":"forEach","sType":"*AS ","C":[{"N":"data","sType":"*A ","C":[{"N":"mergeAdj","C":[{"N":"axis","sType":"*NA nQ{}Value","name":"attribute","nodeTest":"*NA nQ{}Value","ns":"= xml=~ fn=~ xsl=~ oai_dc=http://www.openarchives.org/OAI/2.0/oai_dc/ dc=http://purl.org/dc/elements/1.1/ xsi=~ ","role":"select","line":"253"}]}]},{"N":"fn","name":"string","sType":"1AS ","C":[{"N":"dot"}]}]},{"N":"str","sType":"1AS ","val":" "}]}]}]}]}]},{"N":"templateRule","rank":"10","prec":"0","seq":"3","ns":"xml=~ =http://datacite.org/schema/kernel-4 xsl=~ oai_dc=http://www.openarchives.org/OAI/2.0/oai_dc/ dc=http://purl.org/dc/elements/1.1/ xsi=~","minImp":"0","flags":"s","slots":"200","baseUri":"file:///home/administrator/tethys/tethys.myapp/public/assets2/doi_datacite.xslt","line":"213","module":"doi_datacite.xslt","expand-text":"false","match":"TitleAbstractAdditional","prio":"0","matches":"NE u[NE nQ{}TitleAbstractAdditional,NE nQ{http://www.w3.org/1999/xhtml}TitleAbstractAdditional]","C":[{"N":"p.nodeTest","role":"match","test":"NE u[NE nQ{}TitleAbstractAdditional,NE nQ{http://www.w3.org/1999/xhtml}TitleAbstractAdditional]","sType":"1NE u[NE nQ{}TitleAbstractAdditional,NE nQ{http://www.w3.org/1999/xhtml}TitleAbstractAdditional]","ns":"= xml=~ fn=~ xsl=~ oai_dc=http://www.openarchives.org/OAI/2.0/oai_dc/ dc=http://purl.org/dc/elements/1.1/ xsi=~ "},{"N":"elem","name":"description","sType":"1NE nQ{http://datacite.org/schema/kernel-4}description ","nsuri":"http://datacite.org/schema/kernel-4","namespaces":"=http://datacite.org/schema/kernel-4 xsi=http://www.w3.org/2001/XMLSchema-instance oai_dc=http://www.openarchives.org/OAI/2.0/oai_dc/ dc=http://purl.org/dc/elements/1.1/","role":"action","line":"214","C":[{"N":"sequence","sType":"* ","C":[{"N":"att","name":"xml:lang","sType":"1NA ","nsuri":"http://www.w3.org/XML/1998/namespace","line":"215","C":[{"N":"fn","name":"string-join","role":"select","C":[{"N":"forEach","sType":"*AS ","C":[{"N":"data","sType":"*A ","C":[{"N":"mergeAdj","C":[{"N":"valueOf","sType":"1NT ","flags":"l","line":"216","C":[{"N":"fn","name":"string-join","role":"select","C":[{"N":"forEach","sType":"*AS ","C":[{"N":"data","sType":"*A ","C":[{"N":"mergeAdj","C":[{"N":"axis","sType":"*NA nQ{}Language","name":"attribute","nodeTest":"*NA nQ{}Language","ns":"= xml=~ fn=~ xsl=~ oai_dc=http://www.openarchives.org/OAI/2.0/oai_dc/ dc=http://purl.org/dc/elements/1.1/ xsi=~ ","role":"select","line":"216"}]}]},{"N":"fn","name":"string","sType":"1AS ","C":[{"N":"dot"}]}]},{"N":"str","sType":"1AS ","val":" "}]}]}]}]},{"N":"fn","name":"string","sType":"1AS ","C":[{"N":"dot"}]}]},{"N":"str","sType":"1AS ","val":""}]}]},{"N":"choose","sType":"? ","line":"218","C":[{"N":"gc","op":"!=","comp":"GAC|http://www.w3.org/2005/xpath-functions/collation/codepoint","card":"1:1","sType":"1AB","ns":"= xml=~ fn=~ xsl=~ oai_dc=http://www.openarchives.org/OAI/2.0/oai_dc/ dc=http://purl.org/dc/elements/1.1/ xsi=~ ","line":"218","C":[{"N":"attVal","name":"Q{}Type"},{"N":"str","val":""}]},{"N":"att","name":"descriptionType","sType":"1NA ","line":"219","C":[{"N":"fn","name":"string-join","role":"select","C":[{"N":"forEach","sType":"*AS ","C":[{"N":"data","sType":"*A ","C":[{"N":"mergeAdj","C":[{"N":"callT","sType":"* ","bSlot":"0","name":"Q{}CamelCaseWord","line":"220","C":[{"N":"withParam","name":"Q{}text","slot":"0","sType":"*NA nQ{}Type","C":[{"N":"axis","name":"attribute","nodeTest":"*NA nQ{}Type","sType":"*NA nQ{}Type","ns":"= xml=~ fn=~ xsl=~ oai_dc=http://www.openarchives.org/OAI/2.0/oai_dc/ dc=http://purl.org/dc/elements/1.1/ xsi=~ ","role":"select","line":"221"}]}]}]}]},{"N":"fn","name":"string","sType":"1AS ","C":[{"N":"dot"}]}]},{"N":"str","sType":"1AS ","val":""}]}]},{"N":"true"},{"N":"empty","sType":"0 "}]},{"N":"valueOf","flags":"l","sType":"1NT ","line":"225","C":[{"N":"fn","name":"string-join","role":"select","C":[{"N":"forEach","sType":"*AS ","C":[{"N":"data","sType":"*A ","C":[{"N":"mergeAdj","C":[{"N":"axis","sType":"*NA nQ{}Value","name":"attribute","nodeTest":"*NA nQ{}Value","ns":"= xml=~ fn=~ xsl=~ oai_dc=http://www.openarchives.org/OAI/2.0/oai_dc/ dc=http://purl.org/dc/elements/1.1/ xsi=~ ","role":"select","line":"225"}]}]},{"N":"fn","name":"string","sType":"1AS ","C":[{"N":"dot"}]}]},{"N":"str","sType":"1AS ","val":" "}]}]}]}]}]},{"N":"templateRule","rank":"11","prec":"0","seq":"2","ns":"xml=~ =http://datacite.org/schema/kernel-4 xsl=~ oai_dc=http://www.openarchives.org/OAI/2.0/oai_dc/ dc=http://purl.org/dc/elements/1.1/ xsi=~","minImp":"0","flags":"s","slots":"200","baseUri":"file:///home/administrator/tethys/tethys.myapp/public/assets2/doi_datacite.xslt","line":"198","module":"doi_datacite.xslt","expand-text":"false","match":"TitleAbstract","prio":"0","matches":"NE u[NE nQ{}TitleAbstract,NE nQ{http://www.w3.org/1999/xhtml}TitleAbstract]","C":[{"N":"p.nodeTest","role":"match","test":"NE u[NE nQ{}TitleAbstract,NE nQ{http://www.w3.org/1999/xhtml}TitleAbstract]","sType":"1NE u[NE nQ{}TitleAbstract,NE nQ{http://www.w3.org/1999/xhtml}TitleAbstract]","ns":"= xml=~ fn=~ xsl=~ oai_dc=http://www.openarchives.org/OAI/2.0/oai_dc/ dc=http://purl.org/dc/elements/1.1/ xsi=~ "},{"N":"elem","name":"description","sType":"1NE nQ{http://datacite.org/schema/kernel-4}description ","nsuri":"http://datacite.org/schema/kernel-4","namespaces":"=http://datacite.org/schema/kernel-4 xsi=http://www.w3.org/2001/XMLSchema-instance oai_dc=http://www.openarchives.org/OAI/2.0/oai_dc/ dc=http://purl.org/dc/elements/1.1/","role":"action","line":"199","C":[{"N":"sequence","sType":"* ","C":[{"N":"att","name":"xml:lang","sType":"1NA ","nsuri":"http://www.w3.org/XML/1998/namespace","line":"200","C":[{"N":"fn","name":"string-join","role":"select","C":[{"N":"forEach","sType":"*AS ","C":[{"N":"data","sType":"*A ","C":[{"N":"mergeAdj","C":[{"N":"valueOf","sType":"1NT ","flags":"l","line":"201","C":[{"N":"fn","name":"string-join","role":"select","C":[{"N":"forEach","sType":"*AS ","C":[{"N":"data","sType":"*A ","C":[{"N":"mergeAdj","C":[{"N":"axis","sType":"*NA nQ{}Language","name":"attribute","nodeTest":"*NA nQ{}Language","ns":"= xml=~ fn=~ xsl=~ oai_dc=http://www.openarchives.org/OAI/2.0/oai_dc/ dc=http://purl.org/dc/elements/1.1/ xsi=~ ","role":"select","line":"201"}]}]},{"N":"fn","name":"string","sType":"1AS ","C":[{"N":"dot"}]}]},{"N":"str","sType":"1AS ","val":" "}]}]}]}]},{"N":"fn","name":"string","sType":"1AS ","C":[{"N":"dot"}]}]},{"N":"str","sType":"1AS ","val":""}]}]},{"N":"choose","sType":"? ","line":"203","C":[{"N":"gc","op":"!=","comp":"GAC|http://www.w3.org/2005/xpath-functions/collation/codepoint","card":"1:1","sType":"1AB","ns":"= xml=~ fn=~ xsl=~ oai_dc=http://www.openarchives.org/OAI/2.0/oai_dc/ dc=http://purl.org/dc/elements/1.1/ xsi=~ ","line":"203","C":[{"N":"attVal","name":"Q{}Type"},{"N":"str","val":""}]},{"N":"att","name":"descriptionType","sType":"1NA ","line":"204","C":[{"N":"fn","name":"string-join","role":"select","C":[{"N":"forEach","sType":"*AS ","C":[{"N":"data","sType":"*A ","C":[{"N":"mergeAdj","C":[{"N":"valueOf","sType":"1NT ","C":[{"N":"str","sType":"1AS ","val":"Abstract"}]}]}]},{"N":"fn","name":"string","sType":"1AS ","C":[{"N":"dot"}]}]},{"N":"str","sType":"1AS ","val":""}]}]},{"N":"true"},{"N":"empty","sType":"0 "}]},{"N":"valueOf","flags":"l","sType":"1NT ","line":"209","C":[{"N":"fn","name":"string-join","role":"select","C":[{"N":"forEach","sType":"*AS ","C":[{"N":"data","sType":"*A ","C":[{"N":"mergeAdj","C":[{"N":"axis","sType":"*NA nQ{}Value","name":"attribute","nodeTest":"*NA nQ{}Value","ns":"= xml=~ fn=~ xsl=~ oai_dc=http://www.openarchives.org/OAI/2.0/oai_dc/ dc=http://purl.org/dc/elements/1.1/ xsi=~ ","role":"select","line":"209"}]}]},{"N":"fn","name":"string","sType":"1AS ","C":[{"N":"dot"}]}]},{"N":"str","sType":"1AS ","val":" "}]}]}]}]}]},{"N":"templateRule","rank":"12","prec":"0","seq":"1","ns":"xml=~ =http://datacite.org/schema/kernel-4 xsl=~ oai_dc=http://www.openarchives.org/OAI/2.0/oai_dc/ dc=http://purl.org/dc/elements/1.1/ xsi=~","minImp":"0","flags":"s","slots":"200","baseUri":"file:///home/administrator/tethys/tethys.myapp/public/assets2/doi_datacite.xslt","line":"178","module":"doi_datacite.xslt","expand-text":"false","match":"Coverage","prio":"0","matches":"NE u[NE nQ{}Coverage,NE nQ{http://www.w3.org/1999/xhtml}Coverage]","C":[{"N":"p.nodeTest","role":"match","test":"NE u[NE nQ{}Coverage,NE nQ{http://www.w3.org/1999/xhtml}Coverage]","sType":"1NE u[NE nQ{}Coverage,NE nQ{http://www.w3.org/1999/xhtml}Coverage]","ns":"= xml=~ fn=~ xsl=~ oai_dc=http://www.openarchives.org/OAI/2.0/oai_dc/ dc=http://purl.org/dc/elements/1.1/ xsi=~ "},{"N":"elem","name":"geoLocation","sType":"1NE nQ{http://datacite.org/schema/kernel-4}geoLocation ","nsuri":"http://datacite.org/schema/kernel-4","namespaces":"=http://datacite.org/schema/kernel-4 xsi=http://www.w3.org/2001/XMLSchema-instance oai_dc=http://www.openarchives.org/OAI/2.0/oai_dc/ dc=http://purl.org/dc/elements/1.1/","role":"action","line":"179","C":[{"N":"elem","name":"geoLocationBox","sType":"1NE nQ{http://datacite.org/schema/kernel-4}geoLocationBox ","nsuri":"http://datacite.org/schema/kernel-4","namespaces":"=http://datacite.org/schema/kernel-4 xsi=http://www.w3.org/2001/XMLSchema-instance oai_dc=http://www.openarchives.org/OAI/2.0/oai_dc/ dc=http://purl.org/dc/elements/1.1/","line":"180","C":[{"N":"sequence","sType":"*NE ","C":[{"N":"elem","name":"westBoundLongitude","sType":"1NE nQ{http://datacite.org/schema/kernel-4}westBoundLongitude ","nsuri":"http://datacite.org/schema/kernel-4","namespaces":"=http://datacite.org/schema/kernel-4 xsi=http://www.w3.org/2001/XMLSchema-instance oai_dc=http://www.openarchives.org/OAI/2.0/oai_dc/ dc=http://purl.org/dc/elements/1.1/","line":"181","C":[{"N":"valueOf","flags":"l","sType":"1NT ","line":"182","C":[{"N":"fn","name":"string-join","role":"select","C":[{"N":"forEach","sType":"*AS ","C":[{"N":"data","sType":"*A ","C":[{"N":"mergeAdj","C":[{"N":"axis","sType":"*NA nQ{}XMin","name":"attribute","nodeTest":"*NA nQ{}XMin","ns":"= xml=~ fn=~ xsl=~ oai_dc=http://www.openarchives.org/OAI/2.0/oai_dc/ dc=http://purl.org/dc/elements/1.1/ xsi=~ ","role":"select","line":"182"}]}]},{"N":"fn","name":"string","sType":"1AS ","C":[{"N":"dot"}]}]},{"N":"str","sType":"1AS ","val":" "}]}]}]},{"N":"elem","name":"eastBoundLongitude","sType":"1NE nQ{http://datacite.org/schema/kernel-4}eastBoundLongitude ","nsuri":"http://datacite.org/schema/kernel-4","namespaces":"=http://datacite.org/schema/kernel-4 xsi=http://www.w3.org/2001/XMLSchema-instance oai_dc=http://www.openarchives.org/OAI/2.0/oai_dc/ dc=http://purl.org/dc/elements/1.1/","line":"184","C":[{"N":"valueOf","flags":"l","sType":"1NT ","line":"185","C":[{"N":"fn","name":"string-join","role":"select","C":[{"N":"forEach","sType":"*AS ","C":[{"N":"data","sType":"*A ","C":[{"N":"mergeAdj","C":[{"N":"axis","sType":"*NA nQ{}XMax","name":"attribute","nodeTest":"*NA nQ{}XMax","ns":"= xml=~ fn=~ xsl=~ oai_dc=http://www.openarchives.org/OAI/2.0/oai_dc/ dc=http://purl.org/dc/elements/1.1/ xsi=~ ","role":"select","line":"185"}]}]},{"N":"fn","name":"string","sType":"1AS ","C":[{"N":"dot"}]}]},{"N":"str","sType":"1AS ","val":" "}]}]}]},{"N":"elem","name":"southBoundLatitude","sType":"1NE nQ{http://datacite.org/schema/kernel-4}southBoundLatitude ","nsuri":"http://datacite.org/schema/kernel-4","namespaces":"=http://datacite.org/schema/kernel-4 xsi=http://www.w3.org/2001/XMLSchema-instance oai_dc=http://www.openarchives.org/OAI/2.0/oai_dc/ dc=http://purl.org/dc/elements/1.1/","line":"187","C":[{"N":"valueOf","flags":"l","sType":"1NT ","line":"188","C":[{"N":"fn","name":"string-join","role":"select","C":[{"N":"forEach","sType":"*AS ","C":[{"N":"data","sType":"*A ","C":[{"N":"mergeAdj","C":[{"N":"axis","sType":"*NA nQ{}YMin","name":"attribute","nodeTest":"*NA nQ{}YMin","ns":"= xml=~ fn=~ xsl=~ oai_dc=http://www.openarchives.org/OAI/2.0/oai_dc/ dc=http://purl.org/dc/elements/1.1/ xsi=~ ","role":"select","line":"188"}]}]},{"N":"fn","name":"string","sType":"1AS ","C":[{"N":"dot"}]}]},{"N":"str","sType":"1AS ","val":" "}]}]}]},{"N":"elem","name":"northBoundLatitude","sType":"1NE nQ{http://datacite.org/schema/kernel-4}northBoundLatitude ","nsuri":"http://datacite.org/schema/kernel-4","namespaces":"=http://datacite.org/schema/kernel-4 xsi=http://www.w3.org/2001/XMLSchema-instance oai_dc=http://www.openarchives.org/OAI/2.0/oai_dc/ dc=http://purl.org/dc/elements/1.1/","line":"190","C":[{"N":"valueOf","flags":"l","sType":"1NT ","line":"191","C":[{"N":"fn","name":"string-join","role":"select","C":[{"N":"forEach","sType":"*AS ","C":[{"N":"data","sType":"*A ","C":[{"N":"mergeAdj","C":[{"N":"axis","sType":"*NA nQ{}YMax","name":"attribute","nodeTest":"*NA nQ{}YMax","ns":"= xml=~ fn=~ xsl=~ oai_dc=http://www.openarchives.org/OAI/2.0/oai_dc/ dc=http://purl.org/dc/elements/1.1/ xsi=~ ","role":"select","line":"191"}]}]},{"N":"fn","name":"string","sType":"1AS ","C":[{"N":"dot"}]}]},{"N":"str","sType":"1AS ","val":" "}]}]}]}]}]}]}]}]}]},{"N":"overridden"},{"N":"output","C":[{"N":"property","name":"Q{http://saxon.sf.net/}stylesheet-version","value":"30"},{"N":"property","name":"method","value":"xml"},{"N":"property","name":"encoding","value":"utf-8"},{"N":"property","name":"indent","value":"yes"}]},{"N":"decimalFormat"}],"Σ":"9daa8d0b"} \ No newline at end of file +{"N":"package","version":"30","packageVersion":"1","saxonVersion":"SaxonJS 2.7","target":"JS","targetVersion":"2","name":"TOP-LEVEL","relocatable":"false","buildDateTime":"2025-12-04T16:44:40.209+01:00","ns":"xml=~ xsl=~ oai_dc=http://www.openarchives.org/OAI/2.0/oai_dc/ dc=http://purl.org/dc/elements/1.1/ xsi=~","C":[{"N":"co","id":"0","uniform":"true","binds":"3","C":[{"N":"template","flags":"os","module":"doi_datacite.xslt","slots":"200","baseUri":"file:///home/administrator/tethys/tethys.myapp/public/assets2/doi_datacite.xslt","name":"Q{}RdrDate2","line":"164","ns":"xml=~ =http://datacite.org/schema/kernel-4 xsl=~ oai_dc=http://www.openarchives.org/OAI/2.0/oai_dc/ dc=http://purl.org/dc/elements/1.1/ xsi=~","expand-text":"false","sType":"* ","C":[{"N":"sequence","role":"body","sType":"* ","C":[{"N":"choose","sType":"? ","line":"165","C":[{"N":"and","sType":"1AB","ns":"= xml=~ xsl=~ oai_dc=http://www.openarchives.org/OAI/2.0/oai_dc/ dc=http://purl.org/dc/elements/1.1/ xsi=~ ","line":"165","C":[{"N":"axis","name":"child","nodeTest":"*NE u[NE nQ{}EmbargoDate,NE nQ{http://www.w3.org/1999/xhtml}EmbargoDate]"},{"N":"gc","op":"<","comp":"GAC|http://www.w3.org/2005/xpath-functions/collation/codepoint","card":"1:1","C":[{"N":"data","diag":"1|0||gc","C":[{"N":"gVarRef","name":"Q{}unixTimestamp","bSlot":"0"}]},{"N":"data","diag":"1|1||gc","C":[{"N":"slash","op":"/","C":[{"N":"axis","name":"child","nodeTest":"*NE u[NE nQ{}EmbargoDate,NE nQ{http://www.w3.org/1999/xhtml}EmbargoDate]"},{"N":"axis","name":"attribute","nodeTest":"*NA nQ{}UnixTimestamp"}]}]}]}]},{"N":"elem","name":"date","sType":"1NE nQ{http://datacite.org/schema/kernel-4}date ","nsuri":"http://datacite.org/schema/kernel-4","namespaces":"=http://datacite.org/schema/kernel-4 xsi=http://www.w3.org/2001/XMLSchema-instance oai_dc=http://www.openarchives.org/OAI/2.0/oai_dc/ dc=http://purl.org/dc/elements/1.1/","line":"166","C":[{"N":"sequence","sType":"*N ","C":[{"N":"att","name":"dateType","sType":"1NA ","line":"167","C":[{"N":"fn","name":"string-join","role":"select","C":[{"N":"forEach","sType":"*AS ","C":[{"N":"data","sType":"*A ","C":[{"N":"mergeAdj","C":[{"N":"valueOf","sType":"1NT ","C":[{"N":"str","sType":"1AS ","val":"Available"}]}]}]},{"N":"fn","name":"string","sType":"1AS ","C":[{"N":"dot"}]}]},{"N":"str","sType":"1AS ","val":""}]}]},{"N":"let","var":"Q{}embargoDate","slot":"0","sType":"*NT ","line":"172","C":[{"N":"fn","name":"concat","sType":"1AS","ns":"= xml=~ xsl=~ oai_dc=http://www.openarchives.org/OAI/2.0/oai_dc/ dc=http://purl.org/dc/elements/1.1/ xsi=~ ","role":"select","line":"172","C":[{"N":"check","card":"?","diag":"0|0||concat","C":[{"N":"data","diag":"0|0||concat","C":[{"N":"slash","op":"/","C":[{"N":"axis","name":"child","nodeTest":"*NE u[NE nQ{}EmbargoDate,NE nQ{http://www.w3.org/1999/xhtml}EmbargoDate]"},{"N":"axis","name":"attribute","nodeTest":"*NA nQ{}Year"}]}]}]},{"N":"str","val":"-"},{"N":"fn","name":"format-number","C":[{"N":"fn","name":"number","C":[{"N":"check","card":"?","diag":"0|0||number","C":[{"N":"data","diag":"0|0||number","C":[{"N":"slash","op":"/","C":[{"N":"axis","name":"child","nodeTest":"*NE u[NE nQ{}EmbargoDate,NE nQ{http://www.w3.org/1999/xhtml}EmbargoDate]"},{"N":"axis","name":"attribute","nodeTest":"*NA nQ{}Month"}]}]}]}]},{"N":"str","val":"00"}]},{"N":"str","val":"-"},{"N":"fn","name":"format-number","C":[{"N":"fn","name":"number","C":[{"N":"check","card":"?","diag":"0|0||number","C":[{"N":"data","diag":"0|0||number","C":[{"N":"slash","op":"/","C":[{"N":"axis","name":"child","nodeTest":"*NE u[NE nQ{}EmbargoDate,NE nQ{http://www.w3.org/1999/xhtml}EmbargoDate]"},{"N":"axis","name":"attribute","nodeTest":"*NA nQ{}Day"}]}]}]}]},{"N":"str","val":"00"}]}]},{"N":"valueOf","flags":"l","sType":"1NT ","line":"173","C":[{"N":"fn","name":"string-join","role":"select","C":[{"N":"forEach","sType":"*AS ","C":[{"N":"data","sType":"*A ","C":[{"N":"mergeAdj","C":[{"N":"varRef","sType":"*","name":"Q{}embargoDate","slot":"0","ns":"= xml=~ xsl=~ oai_dc=http://www.openarchives.org/OAI/2.0/oai_dc/ dc=http://purl.org/dc/elements/1.1/ xsi=~ ","role":"select","line":"173"}]}]},{"N":"fn","name":"string","sType":"1AS ","C":[{"N":"dot"}]}]},{"N":"str","sType":"1AS ","val":" "}]}]}]}]}]},{"N":"true"},{"N":"empty","sType":"0 "}]},{"N":"choose","sType":"? ","line":"176","C":[{"N":"docOrder","sType":"*NE u[NE nQ{}CreatedAt,NE nQ{http://www.w3.org/1999/xhtml}CreatedAt]","line":"176","C":[{"N":"slash","role":"select","simple":"1","sType":"*NE u[NE nQ{}CreatedAt,NE nQ{http://www.w3.org/1999/xhtml}CreatedAt]","C":[{"N":"treat","as":"N","diag":"13|0|XTTE0510|","C":[{"N":"dot"}]},{"N":"axis","name":"child","nodeTest":"*NE u[NE nQ{}CreatedAt,NE nQ{http://www.w3.org/1999/xhtml}CreatedAt]","sType":"*NE u[NE nQ{}CreatedAt,NE nQ{http://www.w3.org/1999/xhtml}CreatedAt]","ns":"= xml=~ xsl=~ oai_dc=http://www.openarchives.org/OAI/2.0/oai_dc/ dc=http://purl.org/dc/elements/1.1/ xsi=~ "}]}]},{"N":"elem","name":"date","sType":"1NE nQ{http://datacite.org/schema/kernel-4}date ","nsuri":"http://datacite.org/schema/kernel-4","namespaces":"=http://datacite.org/schema/kernel-4 xsi=http://www.w3.org/2001/XMLSchema-instance oai_dc=http://www.openarchives.org/OAI/2.0/oai_dc/ dc=http://purl.org/dc/elements/1.1/","line":"177","C":[{"N":"sequence","sType":"*N ","C":[{"N":"att","name":"dateType","sType":"1NA ","line":"178","C":[{"N":"fn","name":"string-join","role":"select","C":[{"N":"forEach","sType":"*AS ","C":[{"N":"data","sType":"*A ","C":[{"N":"mergeAdj","C":[{"N":"valueOf","sType":"1NT ","C":[{"N":"str","sType":"1AS ","val":"Created"}]}]}]},{"N":"fn","name":"string","sType":"1AS ","C":[{"N":"dot"}]}]},{"N":"str","sType":"1AS ","val":""}]}]},{"N":"let","var":"Q{}createdAt","slot":"0","sType":"*NT ","line":"183","C":[{"N":"fn","name":"concat","sType":"1AS","ns":"= xml=~ xsl=~ oai_dc=http://www.openarchives.org/OAI/2.0/oai_dc/ dc=http://purl.org/dc/elements/1.1/ xsi=~ ","role":"select","line":"183","C":[{"N":"check","card":"?","diag":"0|0||concat","C":[{"N":"data","diag":"0|0||concat","C":[{"N":"slash","op":"/","C":[{"N":"axis","name":"child","nodeTest":"*NE u[NE nQ{}CreatedAt,NE nQ{http://www.w3.org/1999/xhtml}CreatedAt]"},{"N":"axis","name":"attribute","nodeTest":"*NA nQ{}Year"}]}]}]},{"N":"str","val":"-"},{"N":"fn","name":"format-number","C":[{"N":"fn","name":"number","C":[{"N":"check","card":"?","diag":"0|0||number","C":[{"N":"data","diag":"0|0||number","C":[{"N":"slash","op":"/","C":[{"N":"axis","name":"child","nodeTest":"*NE u[NE nQ{}CreatedAt,NE nQ{http://www.w3.org/1999/xhtml}CreatedAt]"},{"N":"axis","name":"attribute","nodeTest":"*NA nQ{}Month"}]}]}]}]},{"N":"str","val":"00"}]},{"N":"str","val":"-"},{"N":"fn","name":"format-number","C":[{"N":"fn","name":"number","C":[{"N":"check","card":"?","diag":"0|0||number","C":[{"N":"data","diag":"0|0||number","C":[{"N":"slash","op":"/","C":[{"N":"axis","name":"child","nodeTest":"*NE u[NE nQ{}CreatedAt,NE nQ{http://www.w3.org/1999/xhtml}CreatedAt]"},{"N":"axis","name":"attribute","nodeTest":"*NA nQ{}Day"}]}]}]}]},{"N":"str","val":"00"}]}]},{"N":"valueOf","flags":"l","sType":"1NT ","line":"184","C":[{"N":"fn","name":"string-join","role":"select","C":[{"N":"forEach","sType":"*AS ","C":[{"N":"data","sType":"*A ","C":[{"N":"mergeAdj","C":[{"N":"varRef","sType":"*","name":"Q{}createdAt","slot":"0","ns":"= xml=~ xsl=~ oai_dc=http://www.openarchives.org/OAI/2.0/oai_dc/ dc=http://purl.org/dc/elements/1.1/ xsi=~ ","role":"select","line":"184"}]}]},{"N":"fn","name":"string","sType":"1AS ","C":[{"N":"dot"}]}]},{"N":"str","sType":"1AS ","val":" "}]}]}]}]}]},{"N":"true"},{"N":"empty","sType":"0 "}]}]}]}]},{"N":"co","binds":"","id":"1","uniform":"true","C":[{"N":"template","flags":"os","module":"doi_datacite.xslt","slots":"200","baseUri":"file:///home/administrator/tethys/tethys.myapp/public/assets2/doi_datacite.xslt","name":"Q{}CamelCaseWord","line":"241","expand-text":"false","sType":"* ","C":[{"N":"sequence","role":"body","sType":"* ","C":[{"N":"param","name":"Q{}text","slot":"0","sType":"* ","as":"* ","flags":"","line":"242","C":[{"N":"str","sType":"1AS ","val":"","role":"select"},{"N":"supplied","role":"conversion","slot":"0","sType":"* "}]},{"N":"param","name":"Q{}firstLower","slot":"1","sType":"* ","as":"* ","flags":"","line":"243","C":[{"N":"true","sType":"1AB","ns":"= xml=~ xsl=~ oai_dc=http://www.openarchives.org/OAI/2.0/oai_dc/ dc=http://purl.org/dc/elements/1.1/ xsi=~ ","role":"select","line":"243"},{"N":"supplied","role":"conversion","slot":"1","sType":"* "}]},{"N":"let","var":"Q{}Upper","slot":"2","sType":"*NT ","line":"244","C":[{"N":"doc","sType":"1ND ","base":"file:///home/administrator/tethys/tethys.myapp/public/assets2/doi_datacite.xslt","role":"select","C":[{"N":"valueOf","sType":"1NT ","C":[{"N":"str","sType":"1AS ","val":"ABCDEFGHIJKLMNOPQRSTUVQXYZ"}]}]},{"N":"let","var":"Q{}Lower","slot":"3","sType":"*NT ","line":"245","C":[{"N":"doc","sType":"1ND ","base":"file:///home/administrator/tethys/tethys.myapp/public/assets2/doi_datacite.xslt","role":"select","C":[{"N":"valueOf","sType":"1NT ","C":[{"N":"str","sType":"1AS ","val":"abcdefghijklmnopqrstuvwxyz"}]}]},{"N":"forEach","sType":"*NT ","line":"246","C":[{"N":"fn","name":"tokenize","sType":"*AS","ns":"= xml=~ xsl=~ oai_dc=http://www.openarchives.org/OAI/2.0/oai_dc/ dc=http://purl.org/dc/elements/1.1/ xsi=~ ","role":"select","line":"246","C":[{"N":"treat","as":"AS","diag":"0|0||tokenize","C":[{"N":"check","card":"?","diag":"0|0||tokenize","C":[{"N":"cvUntyped","to":"AS","diag":"0|0||tokenize","C":[{"N":"check","card":"?","diag":"0|0||tokenize","C":[{"N":"data","diag":"0|0||tokenize","C":[{"N":"varRef","name":"Q{}text","slot":"0"}]}]}]}]}]},{"N":"str","val":"_"}]},{"N":"sequence","sType":"*NT ","C":[{"N":"choose","sType":"?NT ","type":"item()*","line":"247","C":[{"N":"and","sType":"1AB","ns":"= xml=~ xsl=~ oai_dc=http://www.openarchives.org/OAI/2.0/oai_dc/ dc=http://purl.org/dc/elements/1.1/ xsi=~ ","line":"248","C":[{"N":"compareToInt","op":"eq","val":"1","C":[{"N":"fn","name":"position"}]},{"N":"gc","op":"=","comp":"GAC|http://www.w3.org/2005/xpath-functions/collation/codepoint","card":"1:1","C":[{"N":"data","diag":"1|0||gc","C":[{"N":"varRef","name":"Q{}firstLower","slot":"1"}]},{"N":"true"}]}]},{"N":"valueOf","flags":"l","sType":"1NT ","line":"249","C":[{"N":"fn","name":"string-join","role":"select","C":[{"N":"fn","name":"substring","sType":"1AS","ns":"= xml=~ xsl=~ oai_dc=http://www.openarchives.org/OAI/2.0/oai_dc/ dc=http://purl.org/dc/elements/1.1/ xsi=~ ","role":"select","line":"249","C":[{"N":"dot"},{"N":"convert","to":"AO","flags":"","C":[{"N":"int","val":"1"}]},{"N":"convert","to":"AO","flags":"","C":[{"N":"int","val":"1"}]}]},{"N":"str","sType":"1AS ","val":" "}]}]},{"N":"true"},{"N":"valueOf","flags":"l","sType":"1NT ","line":"252","C":[{"N":"fn","name":"string-join","role":"select","C":[{"N":"fn","name":"translate","sType":"1AS","ns":"= xml=~ xsl=~ oai_dc=http://www.openarchives.org/OAI/2.0/oai_dc/ dc=http://purl.org/dc/elements/1.1/ xsi=~ ","role":"select","line":"252","C":[{"N":"fn","name":"substring","C":[{"N":"dot"},{"N":"convert","to":"AO","flags":"","C":[{"N":"int","val":"1"}]},{"N":"convert","to":"AO","flags":"","C":[{"N":"int","val":"1"}]}]},{"N":"treat","as":"AS","diag":"0|1||translate","C":[{"N":"check","card":"1","diag":"0|1||translate","C":[{"N":"cvUntyped","to":"AS","diag":"0|1||translate","C":[{"N":"check","card":"1","diag":"0|1||translate","C":[{"N":"data","diag":"0|1||translate","C":[{"N":"varRef","name":"Q{}Lower","slot":"3"}]}]}]}]}]},{"N":"treat","as":"AS","diag":"0|2||translate","C":[{"N":"check","card":"1","diag":"0|2||translate","C":[{"N":"cvUntyped","to":"AS","diag":"0|2||translate","C":[{"N":"check","card":"1","diag":"0|2||translate","C":[{"N":"data","diag":"0|2||translate","C":[{"N":"varRef","name":"Q{}Upper","slot":"2"}]}]}]}]}]}]},{"N":"str","sType":"1AS ","val":" "}]}]}]},{"N":"valueOf","flags":"l","sType":"1NT ","line":"255","C":[{"N":"fn","name":"string-join","role":"select","C":[{"N":"fn","name":"substring","sType":"1AS","ns":"= xml=~ xsl=~ oai_dc=http://www.openarchives.org/OAI/2.0/oai_dc/ dc=http://purl.org/dc/elements/1.1/ xsi=~ ","role":"select","line":"255","C":[{"N":"dot"},{"N":"convert","to":"AO","flags":"","C":[{"N":"int","val":"2"}]},{"N":"convert","to":"AO","flags":"","C":[{"N":"fn","name":"string-length","C":[{"N":"dot"}]}]}]},{"N":"str","sType":"1AS ","val":" "}]}]}]}]}]}]}]}]}]},{"N":"co","binds":"","id":"2","uniform":"true","C":[{"N":"template","flags":"os","module":"doi_datacite.xslt","slots":"200","baseUri":"file:///home/administrator/tethys/tethys.myapp/public/assets2/doi_datacite.xslt","name":"Q{}AlternateIdentifier","line":"331","ns":"xml=~ =http://datacite.org/schema/kernel-4 xsl=~ oai_dc=http://www.openarchives.org/OAI/2.0/oai_dc/ dc=http://purl.org/dc/elements/1.1/ xsi=~","expand-text":"false","sType":"? ","C":[{"N":"choose","sType":"? ","role":"body","line":"332","C":[{"N":"compareToString","op":"ne","val":"","comp":"GAC|http://www.w3.org/2005/xpath-functions/collation/codepoint","sType":"1AB","ns":"= xml=~ xsl=~ oai_dc=http://www.openarchives.org/OAI/2.0/oai_dc/ dc=http://purl.org/dc/elements/1.1/ xsi=~ ","line":"332","C":[{"N":"fn","name":"normalize-space","C":[{"N":"cvUntyped","to":"AS","diag":"0|0||normalize-space","C":[{"N":"check","card":"?","diag":"0|0||normalize-space","C":[{"N":"attVal","name":"Q{}landingpage"}]}]}]}]},{"N":"elem","name":"alternateIdentifier","sType":"1NE nQ{http://datacite.org/schema/kernel-4}alternateIdentifier ","nsuri":"http://datacite.org/schema/kernel-4","namespaces":"=http://datacite.org/schema/kernel-4 xsi=http://www.w3.org/2001/XMLSchema-instance oai_dc=http://www.openarchives.org/OAI/2.0/oai_dc/ dc=http://purl.org/dc/elements/1.1/","line":"333","C":[{"N":"sequence","sType":"*N ","C":[{"N":"att","name":"alternateIdentifierType","sType":"1NA ","line":"334","C":[{"N":"fn","name":"string-join","role":"select","C":[{"N":"forEach","sType":"*AS ","C":[{"N":"data","sType":"*A ","C":[{"N":"mergeAdj","C":[{"N":"valueOf","sType":"1NT ","C":[{"N":"str","sType":"1AS ","val":"url"}]}]}]},{"N":"fn","name":"string","sType":"1AS ","C":[{"N":"dot"}]}]},{"N":"str","sType":"1AS ","val":""}]}]},{"N":"valueOf","flags":"l","sType":"1NT ","line":"337","C":[{"N":"fn","name":"string-join","role":"select","C":[{"N":"forEach","sType":"*AS ","C":[{"N":"data","sType":"*A ","C":[{"N":"mergeAdj","C":[{"N":"docOrder","sType":"*NA nQ{}landingpage","role":"select","line":"337","C":[{"N":"slash","role":"select","simple":"1","sType":"*NA nQ{}landingpage","C":[{"N":"treat","as":"N","diag":"13|0|XTTE0510|","C":[{"N":"dot"}]},{"N":"axis","name":"attribute","nodeTest":"*NA nQ{}landingpage","sType":"*NA nQ{}landingpage","ns":"= xml=~ xsl=~ oai_dc=http://www.openarchives.org/OAI/2.0/oai_dc/ dc=http://purl.org/dc/elements/1.1/ xsi=~ "}]}]}]}]},{"N":"fn","name":"string","sType":"1AS ","C":[{"N":"dot"}]}]},{"N":"str","sType":"1AS ","val":" "}]}]}]}]},{"N":"true"},{"N":"empty","sType":"0 "}]}]}]},{"N":"co","binds":"","id":"3","vis":"PUBLIC","ex:uniform":"true","C":[{"N":"globalParam","name":"Q{}unixTimestamp","sType":"* ","slots":"200","module":"doi_datacite.xslt","baseUri":"file:///home/administrator/tethys/tethys.myapp/public/assets2/doi_datacite.xslt","as":"","ns":"xml=~ xsl=~ oai_dc=http://www.openarchives.org/OAI/2.0/oai_dc/ dc=http://purl.org/dc/elements/1.1/ xsi=~","C":[{"N":"str","sType":"1AS ","val":"","role":"select"}]}]},{"N":"co","binds":"","id":"4","vis":"PUBLIC","ex:uniform":"true","C":[{"N":"globalParam","name":"Q{}prefix","sType":"* ","slots":"200","module":"doi_datacite.xslt","baseUri":"file:///home/administrator/tethys/tethys.myapp/public/assets2/doi_datacite.xslt","as":"","ns":"xml=~ xsl=~ oai_dc=http://www.openarchives.org/OAI/2.0/oai_dc/ dc=http://purl.org/dc/elements/1.1/ xsi=~","C":[{"N":"str","sType":"1AS ","val":"","role":"select"}]}]},{"N":"co","binds":"","id":"5","vis":"PUBLIC","ex:uniform":"true","C":[{"N":"globalParam","name":"Q{}repIdentifier","sType":"* ","slots":"200","module":"doi_datacite.xslt","baseUri":"file:///home/administrator/tethys/tethys.myapp/public/assets2/doi_datacite.xslt","as":"","ns":"xml=~ xsl=~ oai_dc=http://www.openarchives.org/OAI/2.0/oai_dc/ dc=http://purl.org/dc/elements/1.1/ xsi=~","C":[{"N":"str","sType":"1AS ","val":"","role":"select"}]}]},{"N":"co","id":"6","binds":"7 4 5 3 0 2","C":[{"N":"mode","onNo":"TC","flags":"","patternSlots":"0","prec":"","C":[{"N":"templateRule","rank":"0","prec":"0","seq":"0","ns":"xml=~ xsl=~ oai_dc=http://www.openarchives.org/OAI/2.0/oai_dc/ dc=http://purl.org/dc/elements/1.1/ xsi=~","minImp":"0","flags":"s","slots":"200","baseUri":"file:///home/administrator/tethys/tethys.myapp/public/assets2/doi_datacite.xslt","line":"43","module":"doi_datacite.xslt","expand-text":"false","match":"Rdr_Dataset","prio":"0","matches":"NE u[NE nQ{}Rdr_Dataset,NE nQ{http://www.w3.org/1999/xhtml}Rdr_Dataset]","C":[{"N":"p.nodeTest","role":"match","test":"NE u[NE nQ{}Rdr_Dataset,NE nQ{http://www.w3.org/1999/xhtml}Rdr_Dataset]","sType":"1NE u[NE nQ{}Rdr_Dataset,NE nQ{http://www.w3.org/1999/xhtml}Rdr_Dataset]","ns":"= xml=~ xsl=~ oai_dc=http://www.openarchives.org/OAI/2.0/oai_dc/ dc=http://purl.org/dc/elements/1.1/ xsi=~ "},{"N":"elem","name":"resource","sType":"1NE nQ{http://datacite.org/schema/kernel-4}resource ","nsuri":"http://datacite.org/schema/kernel-4","namespaces":"=http://datacite.org/schema/kernel-4 xsi=http://www.w3.org/2001/XMLSchema-instance oai_dc=http://www.openarchives.org/OAI/2.0/oai_dc/ dc=http://purl.org/dc/elements/1.1/","ns":"xml=~ xsi=~ =http://datacite.org/schema/kernel-4 xsl=~ oai_dc=http://www.openarchives.org/OAI/2.0/oai_dc/ dc=http://purl.org/dc/elements/1.1/","role":"action","line":"45","C":[{"N":"sequence","ns":"xml=~ xsi=~ =http://datacite.org/schema/kernel-4 xsl=~ oai_dc=http://www.openarchives.org/OAI/2.0/oai_dc/ dc=http://purl.org/dc/elements/1.1/","sType":"* ","C":[{"N":"att","name":"xsi:schemaLocation","nsuri":"http://www.w3.org/2001/XMLSchema-instance","sType":"1NA ","C":[{"N":"str","sType":"1AS ","val":"http://datacite.org/schema/kernel-4 http://schema.datacite.org/meta/kernel-4.3/metadata.xsd"}]},{"N":"choose","sType":"* ","type":"item()*","line":"49","C":[{"N":"axis","name":"child","nodeTest":"*NE u[NE nQ{}Identifier,NE nQ{http://www.w3.org/1999/xhtml}Identifier]","sType":"*NE u[NE nQ{}Identifier,NE nQ{http://www.w3.org/1999/xhtml}Identifier]","ns":"= xml=~ xsi=~ xsl=~ oai_dc=http://www.openarchives.org/OAI/2.0/oai_dc/ dc=http://purl.org/dc/elements/1.1/ ","line":"50"},{"N":"applyT","sType":"* ","line":"51","mode":"Q{}oai_datacite","bSlot":"0","C":[{"N":"axis","name":"child","nodeTest":"*NE u[NE nQ{}Identifier,NE nQ{http://www.w3.org/1999/xhtml}Identifier]","sType":"*NE u[NE nQ{}Identifier,NE nQ{http://www.w3.org/1999/xhtml}Identifier]","ns":"= xml=~ xsi=~ xsl=~ oai_dc=http://www.openarchives.org/OAI/2.0/oai_dc/ dc=http://purl.org/dc/elements/1.1/ ","role":"select","line":"51"}]},{"N":"true"},{"N":"elem","name":"identifier","sType":"1NE nQ{http://datacite.org/schema/kernel-4}identifier ","nsuri":"http://datacite.org/schema/kernel-4","namespaces":"=http://datacite.org/schema/kernel-4 xsi=http://www.w3.org/2001/XMLSchema-instance oai_dc=http://www.openarchives.org/OAI/2.0/oai_dc/ dc=http://purl.org/dc/elements/1.1/","line":"54","C":[{"N":"sequence","sType":"*N ","C":[{"N":"att","name":"identifierType","nsuri":"","sType":"1NA ","C":[{"N":"str","sType":"1AS ","val":"DOI"}]},{"N":"valueOf","flags":"l","sType":"1NT ","line":"55","C":[{"N":"fn","name":"string-join","role":"select","C":[{"N":"forEach","sType":"*AS ","C":[{"N":"data","sType":"*A ","C":[{"N":"mergeAdj","C":[{"N":"gVarRef","sType":"* ","name":"Q{}prefix","bSlot":"1","role":"select","line":"55"}]}]},{"N":"fn","name":"string","sType":"1AS ","C":[{"N":"dot"}]}]},{"N":"str","sType":"1AS ","val":" "}]}]},{"N":"valueOf","sType":"1NT ","C":[{"N":"str","sType":"1AS ","val":"/"}]},{"N":"valueOf","flags":"l","sType":"1NT ","line":"57","C":[{"N":"fn","name":"string-join","role":"select","C":[{"N":"forEach","sType":"*AS ","C":[{"N":"data","sType":"*A ","C":[{"N":"mergeAdj","C":[{"N":"gVarRef","sType":"* ","name":"Q{}repIdentifier","bSlot":"2","role":"select","line":"57"}]}]},{"N":"fn","name":"string","sType":"1AS ","C":[{"N":"dot"}]}]},{"N":"str","sType":"1AS ","val":" "}]}]},{"N":"valueOf","sType":"1NT ","C":[{"N":"str","sType":"1AS ","val":"."}]},{"N":"valueOf","flags":"l","sType":"1NT ","line":"59","C":[{"N":"fn","name":"string-join","role":"select","C":[{"N":"forEach","sType":"*AS ","C":[{"N":"data","sType":"*A ","C":[{"N":"mergeAdj","C":[{"N":"axis","sType":"*NA nQ{}PublishId","name":"attribute","nodeTest":"*NA nQ{}PublishId","ns":"= xml=~ xsi=~ xsl=~ oai_dc=http://www.openarchives.org/OAI/2.0/oai_dc/ dc=http://purl.org/dc/elements/1.1/ ","role":"select","line":"59"}]}]},{"N":"fn","name":"string","sType":"1AS ","C":[{"N":"dot"}]}]},{"N":"str","sType":"1AS ","val":" "}]}]}]}]}]},{"N":"choose","sType":"? ","line":"65","C":[{"N":"filter","sType":"*NE u[NE nQ{}PersonAuthor,NE nQ{http://www.w3.org/1999/xhtml}PersonAuthor]","ns":"= xml=~ xsi=~ xsl=~ oai_dc=http://www.openarchives.org/OAI/2.0/oai_dc/ dc=http://purl.org/dc/elements/1.1/ ","line":"65","C":[{"N":"axis","name":"child","nodeTest":"*NE u[NE nQ{}PersonAuthor,NE nQ{http://www.w3.org/1999/xhtml}PersonAuthor]"},{"N":"compareToString","op":"ne","val":"","comp":"GAC|http://www.w3.org/2005/xpath-functions/collation/codepoint","C":[{"N":"fn","name":"normalize-space","C":[{"N":"fn","name":"concat","C":[{"N":"check","card":"?","diag":"0|0||concat","C":[{"N":"attVal","name":"Q{}FirstName"}]},{"N":"check","card":"?","diag":"0|1||concat","C":[{"N":"attVal","name":"Q{}LastName"}]}]}]}]}]},{"N":"elem","name":"creators","sType":"1NE nQ{http://datacite.org/schema/kernel-4}creators ","nsuri":"http://datacite.org/schema/kernel-4","namespaces":"=http://datacite.org/schema/kernel-4 xsi=http://www.w3.org/2001/XMLSchema-instance oai_dc=http://www.openarchives.org/OAI/2.0/oai_dc/ dc=http://purl.org/dc/elements/1.1/","line":"66","C":[{"N":"applyT","sType":"* ","line":"67","mode":"Q{}oai_datacite","bSlot":"0","C":[{"N":"sort","role":"select","sType":"*NE u[NE nQ{}PersonAuthor,NE nQ{http://www.w3.org/1999/xhtml}PersonAuthor]","C":[{"N":"axis","name":"child","nodeTest":"*NE u[NE nQ{}PersonAuthor,NE nQ{http://www.w3.org/1999/xhtml}PersonAuthor]","sType":"*NE u[NE nQ{}PersonAuthor,NE nQ{http://www.w3.org/1999/xhtml}PersonAuthor]","ns":"= xml=~ xsi=~ xsl=~ oai_dc=http://www.openarchives.org/OAI/2.0/oai_dc/ dc=http://purl.org/dc/elements/1.1/ ","role":"select","line":"67"},{"N":"sortKey","sType":"?A ","C":[{"N":"check","card":"?","sType":"?A ","diag":"2|0|XTTE1020|sort","role":"select","C":[{"N":"data","sType":"*A ","role":"select","C":[{"N":"axis","name":"attribute","nodeTest":"*NA nQ{}SortOrder","sType":"*NA nQ{}SortOrder","ns":"= xml=~ xsi=~ xsl=~ oai_dc=http://www.openarchives.org/OAI/2.0/oai_dc/ dc=http://purl.org/dc/elements/1.1/ ","role":"select","line":"68"}]}]},{"N":"str","sType":"1AS ","val":"ascending","role":"order"},{"N":"str","sType":"1AS ","val":"en","role":"lang"},{"N":"str","sType":"1AS ","val":"#default","role":"caseOrder"},{"N":"str","sType":"1AS ","val":"true","role":"stable"}]}]}]}]},{"N":"true"},{"N":"empty","sType":"0 "}]},{"N":"choose","sType":"? ","line":"72","C":[{"N":"or","sType":"1AB","ns":"= xml=~ xsi=~ xsl=~ oai_dc=http://www.openarchives.org/OAI/2.0/oai_dc/ dc=http://purl.org/dc/elements/1.1/ ","line":"72","C":[{"N":"filter","C":[{"N":"axis","name":"child","nodeTest":"*NE u[NE nQ{}TitleMain,NE nQ{http://www.w3.org/1999/xhtml}TitleMain]"},{"N":"compareToString","op":"ne","val":"","comp":"GAC|http://www.w3.org/2005/xpath-functions/collation/codepoint","C":[{"N":"fn","name":"normalize-space","C":[{"N":"cvUntyped","to":"AS","diag":"0|0||normalize-space","C":[{"N":"check","card":"?","diag":"0|0||normalize-space","C":[{"N":"attVal","name":"Q{}Value"}]}]}]}]}]},{"N":"filter","C":[{"N":"axis","name":"child","nodeTest":"*NE u[NE nQ{}TitleAdditional,NE nQ{http://www.w3.org/1999/xhtml}TitleAdditional]"},{"N":"compareToString","op":"ne","val":"","comp":"GAC|http://www.w3.org/2005/xpath-functions/collation/codepoint","C":[{"N":"fn","name":"normalize-space","C":[{"N":"cvUntyped","to":"AS","diag":"0|0||normalize-space","C":[{"N":"check","card":"?","diag":"0|0||normalize-space","C":[{"N":"attVal","name":"Q{}Value"}]}]}]}]}]}]},{"N":"elem","name":"titles","sType":"1NE nQ{http://datacite.org/schema/kernel-4}titles ","nsuri":"http://datacite.org/schema/kernel-4","namespaces":"=http://datacite.org/schema/kernel-4 xsi=http://www.w3.org/2001/XMLSchema-instance oai_dc=http://www.openarchives.org/OAI/2.0/oai_dc/ dc=http://purl.org/dc/elements/1.1/","line":"73","C":[{"N":"sequence","sType":"* ","C":[{"N":"applyT","sType":"* ","line":"74","mode":"Q{}oai_datacite","bSlot":"0","C":[{"N":"axis","name":"child","nodeTest":"*NE u[NE nQ{}TitleMain,NE nQ{http://www.w3.org/1999/xhtml}TitleMain]","sType":"*NE u[NE nQ{}TitleMain,NE nQ{http://www.w3.org/1999/xhtml}TitleMain]","ns":"= xml=~ xsi=~ xsl=~ oai_dc=http://www.openarchives.org/OAI/2.0/oai_dc/ dc=http://purl.org/dc/elements/1.1/ ","role":"select","line":"74"}]},{"N":"applyT","sType":"* ","line":"75","mode":"Q{}oai_datacite","bSlot":"0","C":[{"N":"axis","name":"child","nodeTest":"*NE u[NE nQ{}TitleAdditional,NE nQ{http://www.w3.org/1999/xhtml}TitleAdditional]","sType":"*NE u[NE nQ{}TitleAdditional,NE nQ{http://www.w3.org/1999/xhtml}TitleAdditional]","ns":"= xml=~ xsi=~ xsl=~ oai_dc=http://www.openarchives.org/OAI/2.0/oai_dc/ dc=http://purl.org/dc/elements/1.1/ ","role":"select","line":"75"}]}]}]},{"N":"true"},{"N":"empty","sType":"0 "}]},{"N":"elem","name":"publisher","sType":"1NE nQ{http://datacite.org/schema/kernel-4}publisher ","nsuri":"http://datacite.org/schema/kernel-4","namespaces":"=http://datacite.org/schema/kernel-4 xsi=http://www.w3.org/2001/XMLSchema-instance oai_dc=http://www.openarchives.org/OAI/2.0/oai_dc/ dc=http://purl.org/dc/elements/1.1/","line":"78","C":[{"N":"valueOf","flags":"l","sType":"1NT ","line":"80","C":[{"N":"fn","name":"string-join","role":"select","C":[{"N":"forEach","sType":"*AS ","C":[{"N":"data","sType":"*A ","C":[{"N":"mergeAdj","C":[{"N":"axis","sType":"*NA nQ{}CreatingCorporation","name":"attribute","nodeTest":"*NA nQ{}CreatingCorporation","ns":"= xml=~ xsi=~ xsl=~ oai_dc=http://www.openarchives.org/OAI/2.0/oai_dc/ dc=http://purl.org/dc/elements/1.1/ ","role":"select","line":"80"}]}]},{"N":"fn","name":"string","sType":"1AS ","C":[{"N":"dot"}]}]},{"N":"str","sType":"1AS ","val":" "}]}]}]},{"N":"elem","name":"publicationYear","sType":"1NE nQ{http://datacite.org/schema/kernel-4}publicationYear ","nsuri":"http://datacite.org/schema/kernel-4","namespaces":"=http://datacite.org/schema/kernel-4 xsi=http://www.w3.org/2001/XMLSchema-instance oai_dc=http://www.openarchives.org/OAI/2.0/oai_dc/ dc=http://purl.org/dc/elements/1.1/","line":"82","C":[{"N":"valueOf","flags":"l","sType":"1NT ","line":"83","C":[{"N":"fn","name":"string-join","role":"select","C":[{"N":"forEach","sType":"*AS ","C":[{"N":"data","sType":"*A ","C":[{"N":"mergeAdj","C":[{"N":"docOrder","sType":"*NA nQ{}Year","role":"select","line":"83","C":[{"N":"slash","op":"/","sType":"*NA nQ{}Year","ns":"= xml=~ xsi=~ xsl=~ oai_dc=http://www.openarchives.org/OAI/2.0/oai_dc/ dc=http://purl.org/dc/elements/1.1/ ","C":[{"N":"axis","name":"child","nodeTest":"*NE u[NE nQ{}ServerDatePublished,NE nQ{http://www.w3.org/1999/xhtml}ServerDatePublished]"},{"N":"axis","name":"attribute","nodeTest":"*NA nQ{}Year"}]}]}]}]},{"N":"fn","name":"string","sType":"1AS ","C":[{"N":"dot"}]}]},{"N":"str","sType":"1AS ","val":" "}]}]}]},{"N":"choose","sType":"? ","line":"85","C":[{"N":"filter","sType":"*NE u[NE nQ{}Subject,NE nQ{http://www.w3.org/1999/xhtml}Subject]","ns":"= xml=~ xsi=~ xsl=~ oai_dc=http://www.openarchives.org/OAI/2.0/oai_dc/ dc=http://purl.org/dc/elements/1.1/ ","line":"85","C":[{"N":"axis","name":"child","nodeTest":"*NE u[NE nQ{}Subject,NE nQ{http://www.w3.org/1999/xhtml}Subject]"},{"N":"compareToString","op":"ne","val":"","comp":"GAC|http://www.w3.org/2005/xpath-functions/collation/codepoint","C":[{"N":"fn","name":"normalize-space","C":[{"N":"cvUntyped","to":"AS","diag":"0|0||normalize-space","C":[{"N":"check","card":"?","diag":"0|0||normalize-space","C":[{"N":"attVal","name":"Q{}Value"}]}]}]}]}]},{"N":"elem","name":"subjects","sType":"1NE nQ{http://datacite.org/schema/kernel-4}subjects ","nsuri":"http://datacite.org/schema/kernel-4","namespaces":"=http://datacite.org/schema/kernel-4 xsi=http://www.w3.org/2001/XMLSchema-instance oai_dc=http://www.openarchives.org/OAI/2.0/oai_dc/ dc=http://purl.org/dc/elements/1.1/","line":"86","C":[{"N":"applyT","sType":"* ","line":"87","mode":"Q{}oai_datacite","bSlot":"0","C":[{"N":"axis","name":"child","nodeTest":"*NE u[NE nQ{}Subject,NE nQ{http://www.w3.org/1999/xhtml}Subject]","sType":"*NE u[NE nQ{}Subject,NE nQ{http://www.w3.org/1999/xhtml}Subject]","ns":"= xml=~ xsi=~ xsl=~ oai_dc=http://www.openarchives.org/OAI/2.0/oai_dc/ dc=http://purl.org/dc/elements/1.1/ ","role":"select","line":"87"}]}]},{"N":"true"},{"N":"empty","sType":"0 "}]},{"N":"elem","name":"language","sType":"1NE nQ{http://datacite.org/schema/kernel-4}language ","nsuri":"http://datacite.org/schema/kernel-4","namespaces":"=http://datacite.org/schema/kernel-4 xsi=http://www.w3.org/2001/XMLSchema-instance oai_dc=http://www.openarchives.org/OAI/2.0/oai_dc/ dc=http://purl.org/dc/elements/1.1/","line":"90","C":[{"N":"valueOf","flags":"l","sType":"1NT ","line":"91","C":[{"N":"fn","name":"string-join","role":"select","C":[{"N":"forEach","sType":"*AS ","C":[{"N":"data","sType":"*A ","C":[{"N":"mergeAdj","C":[{"N":"axis","sType":"*NA nQ{}Language","name":"attribute","nodeTest":"*NA nQ{}Language","ns":"= xml=~ xsi=~ xsl=~ oai_dc=http://www.openarchives.org/OAI/2.0/oai_dc/ dc=http://purl.org/dc/elements/1.1/ ","role":"select","line":"91"}]}]},{"N":"fn","name":"string","sType":"1AS ","C":[{"N":"dot"}]}]},{"N":"str","sType":"1AS ","val":" "}]}]}]},{"N":"choose","sType":"? ","line":"93","C":[{"N":"filter","sType":"*NE u[NE nQ{}PersonContributor,NE nQ{http://www.w3.org/1999/xhtml}PersonContributor]","ns":"= xml=~ xsi=~ xsl=~ oai_dc=http://www.openarchives.org/OAI/2.0/oai_dc/ dc=http://purl.org/dc/elements/1.1/ ","line":"93","C":[{"N":"axis","name":"child","nodeTest":"*NE u[NE nQ{}PersonContributor,NE nQ{http://www.w3.org/1999/xhtml}PersonContributor]"},{"N":"compareToString","op":"ne","val":"","comp":"GAC|http://www.w3.org/2005/xpath-functions/collation/codepoint","C":[{"N":"fn","name":"normalize-space","C":[{"N":"fn","name":"concat","C":[{"N":"check","card":"?","diag":"0|0||concat","C":[{"N":"attVal","name":"Q{}FirstName"}]},{"N":"check","card":"?","diag":"0|1||concat","C":[{"N":"attVal","name":"Q{}LastName"}]}]}]}]}]},{"N":"elem","name":"contributors","sType":"1NE nQ{http://datacite.org/schema/kernel-4}contributors ","nsuri":"http://datacite.org/schema/kernel-4","namespaces":"=http://datacite.org/schema/kernel-4 xsi=http://www.w3.org/2001/XMLSchema-instance oai_dc=http://www.openarchives.org/OAI/2.0/oai_dc/ dc=http://purl.org/dc/elements/1.1/","line":"94","C":[{"N":"applyT","sType":"* ","line":"95","mode":"Q{}oai_datacite","bSlot":"0","C":[{"N":"sort","role":"select","sType":"*NE u[NE nQ{}PersonContributor,NE nQ{http://www.w3.org/1999/xhtml}PersonContributor]","C":[{"N":"axis","name":"child","nodeTest":"*NE u[NE nQ{}PersonContributor,NE nQ{http://www.w3.org/1999/xhtml}PersonContributor]","sType":"*NE u[NE nQ{}PersonContributor,NE nQ{http://www.w3.org/1999/xhtml}PersonContributor]","ns":"= xml=~ xsi=~ xsl=~ oai_dc=http://www.openarchives.org/OAI/2.0/oai_dc/ dc=http://purl.org/dc/elements/1.1/ ","role":"select","line":"95"},{"N":"sortKey","sType":"?A ","C":[{"N":"check","card":"?","sType":"?A ","diag":"2|0|XTTE1020|sort","role":"select","C":[{"N":"data","sType":"*A ","role":"select","C":[{"N":"axis","name":"attribute","nodeTest":"*NA nQ{}SortOrder","sType":"*NA nQ{}SortOrder","ns":"= xml=~ xsi=~ xsl=~ oai_dc=http://www.openarchives.org/OAI/2.0/oai_dc/ dc=http://purl.org/dc/elements/1.1/ ","role":"select","line":"96"}]}]},{"N":"str","sType":"1AS ","val":"ascending","role":"order"},{"N":"str","sType":"1AS ","val":"en","role":"lang"},{"N":"str","sType":"1AS ","val":"#default","role":"caseOrder"},{"N":"str","sType":"1AS ","val":"true","role":"stable"}]}]}]}]},{"N":"true"},{"N":"empty","sType":"0 "}]},{"N":"choose","sType":"? ","line":"100","C":[{"N":"or","sType":"1AB","ns":"= xml=~ xsi=~ xsl=~ oai_dc=http://www.openarchives.org/OAI/2.0/oai_dc/ dc=http://purl.org/dc/elements/1.1/ ","line":"100","C":[{"N":"and","C":[{"N":"axis","name":"child","nodeTest":"*NE u[NE nQ{}EmbargoDate,NE nQ{http://www.w3.org/1999/xhtml}EmbargoDate]"},{"N":"gc","op":"<","comp":"GAC|http://www.w3.org/2005/xpath-functions/collation/codepoint","card":"1:1","C":[{"N":"data","diag":"1|0||gc","C":[{"N":"gVarRef","name":"Q{}unixTimestamp","bSlot":"3"}]},{"N":"data","diag":"1|1||gc","C":[{"N":"slash","op":"/","C":[{"N":"axis","name":"child","nodeTest":"*NE u[NE nQ{}EmbargoDate,NE nQ{http://www.w3.org/1999/xhtml}EmbargoDate]"},{"N":"axis","name":"attribute","nodeTest":"*NA nQ{}UnixTimestamp"}]}]}]}]},{"N":"axis","name":"child","nodeTest":"*NE u[NE nQ{}CreatedAt,NE nQ{http://www.w3.org/1999/xhtml}CreatedAt]"}]},{"N":"elem","name":"dates","sType":"1NE nQ{http://datacite.org/schema/kernel-4}dates ","nsuri":"http://datacite.org/schema/kernel-4","namespaces":"=http://datacite.org/schema/kernel-4 xsi=http://www.w3.org/2001/XMLSchema-instance oai_dc=http://www.openarchives.org/OAI/2.0/oai_dc/ dc=http://purl.org/dc/elements/1.1/","line":"101","C":[{"N":"callT","bSlot":"4","sType":"* ","name":"Q{}RdrDate2","line":"102"}]},{"N":"true"},{"N":"empty","sType":"0 "}]},{"N":"elem","name":"version","sType":"1NE nQ{http://datacite.org/schema/kernel-4}version ","nsuri":"http://datacite.org/schema/kernel-4","namespaces":"=http://datacite.org/schema/kernel-4 xsi=http://www.w3.org/2001/XMLSchema-instance oai_dc=http://www.openarchives.org/OAI/2.0/oai_dc/ dc=http://purl.org/dc/elements/1.1/","line":"105","C":[{"N":"choose","sType":"?NT ","type":"item()*","line":"106","C":[{"N":"axis","name":"attribute","nodeTest":"*NA nQ{}Version","sType":"*NA nQ{}Version","ns":"= xml=~ xsi=~ xsl=~ oai_dc=http://www.openarchives.org/OAI/2.0/oai_dc/ dc=http://purl.org/dc/elements/1.1/ ","line":"107"},{"N":"valueOf","flags":"l","sType":"1NT ","line":"108","C":[{"N":"fn","name":"string-join","role":"select","C":[{"N":"forEach","sType":"*AS ","C":[{"N":"data","sType":"*A ","C":[{"N":"mergeAdj","C":[{"N":"axis","sType":"*NA nQ{}Version","name":"attribute","nodeTest":"*NA nQ{}Version","ns":"= xml=~ xsi=~ xsl=~ oai_dc=http://www.openarchives.org/OAI/2.0/oai_dc/ dc=http://purl.org/dc/elements/1.1/ ","role":"select","line":"108"}]}]},{"N":"fn","name":"string","sType":"1AS ","C":[{"N":"dot"}]}]},{"N":"str","sType":"1AS ","val":" "}]}]},{"N":"true"},{"N":"valueOf","sType":"1NT ","C":[{"N":"str","sType":"1AS ","val":"1"}]}]}]},{"N":"elem","name":"resourceType","sType":"1NE nQ{http://datacite.org/schema/kernel-4}resourceType ","nsuri":"http://datacite.org/schema/kernel-4","namespaces":"=http://datacite.org/schema/kernel-4 xsi=http://www.w3.org/2001/XMLSchema-instance oai_dc=http://www.openarchives.org/OAI/2.0/oai_dc/ dc=http://purl.org/dc/elements/1.1/","line":"115","C":[{"N":"sequence","sType":"*N ","C":[{"N":"att","name":"resourceTypeGeneral","nsuri":"","sType":"1NA ","C":[{"N":"str","sType":"1AS ","val":"Dataset"}]},{"N":"valueOf","sType":"1NT ","C":[{"N":"str","sType":"1AS ","val":"Dataset"}]}]}]},{"N":"choose","sType":"? ","line":"120","C":[{"N":"compareToString","op":"ne","val":"","comp":"GAC|http://www.w3.org/2005/xpath-functions/collation/codepoint","sType":"1AB","ns":"= xml=~ xsi=~ xsl=~ oai_dc=http://www.openarchives.org/OAI/2.0/oai_dc/ dc=http://purl.org/dc/elements/1.1/ ","line":"120","C":[{"N":"fn","name":"normalize-space","C":[{"N":"cvUntyped","to":"AS","diag":"0|0||normalize-space","C":[{"N":"check","card":"?","diag":"0|0||normalize-space","C":[{"N":"attVal","name":"Q{}landingpage"}]}]}]}]},{"N":"elem","name":"alternateIdentifiers","sType":"1NE nQ{http://datacite.org/schema/kernel-4}alternateIdentifiers ","nsuri":"http://datacite.org/schema/kernel-4","namespaces":"=http://datacite.org/schema/kernel-4 xsi=http://www.w3.org/2001/XMLSchema-instance oai_dc=http://www.openarchives.org/OAI/2.0/oai_dc/ dc=http://purl.org/dc/elements/1.1/","line":"121","C":[{"N":"callT","bSlot":"5","sType":"* ","name":"Q{}AlternateIdentifier","line":"122"}]},{"N":"true"},{"N":"empty","sType":"0 "}]},{"N":"choose","sType":"? ","line":"126","C":[{"N":"filter","sType":"*NE u[NE nQ{}Reference,NE nQ{http://www.w3.org/1999/xhtml}Reference]","ns":"= xml=~ xsi=~ xsl=~ oai_dc=http://www.openarchives.org/OAI/2.0/oai_dc/ dc=http://purl.org/dc/elements/1.1/ ","line":"126","C":[{"N":"axis","name":"child","nodeTest":"*NE u[NE nQ{}Reference,NE nQ{http://www.w3.org/1999/xhtml}Reference]"},{"N":"and","C":[{"N":"compareToString","op":"ne","val":"","comp":"GAC|http://www.w3.org/2005/xpath-functions/collation/codepoint","C":[{"N":"fn","name":"normalize-space","C":[{"N":"cvUntyped","to":"AS","diag":"0|0||normalize-space","C":[{"N":"check","card":"?","diag":"0|0||normalize-space","C":[{"N":"attVal","name":"Q{}Type"}]}]}]}]},{"N":"compareToString","op":"ne","val":"","comp":"GAC|http://www.w3.org/2005/xpath-functions/collation/codepoint","C":[{"N":"fn","name":"normalize-space","C":[{"N":"cvUntyped","to":"AS","diag":"0|0||normalize-space","C":[{"N":"check","card":"?","diag":"0|0||normalize-space","C":[{"N":"attVal","name":"Q{}Relation"}]}]}]}]}]}]},{"N":"elem","name":"relatedIdentifiers","sType":"1NE nQ{http://datacite.org/schema/kernel-4}relatedIdentifiers ","nsuri":"http://datacite.org/schema/kernel-4","namespaces":"=http://datacite.org/schema/kernel-4 xsi=http://www.w3.org/2001/XMLSchema-instance oai_dc=http://www.openarchives.org/OAI/2.0/oai_dc/ dc=http://purl.org/dc/elements/1.1/","line":"127","C":[{"N":"applyT","sType":"* ","line":"128","mode":"Q{}oai_datacite","bSlot":"0","C":[{"N":"axis","name":"child","nodeTest":"*NE u[NE nQ{}Reference,NE nQ{http://www.w3.org/1999/xhtml}Reference]","sType":"*NE u[NE nQ{}Reference,NE nQ{http://www.w3.org/1999/xhtml}Reference]","ns":"= xml=~ xsi=~ xsl=~ oai_dc=http://www.openarchives.org/OAI/2.0/oai_dc/ dc=http://purl.org/dc/elements/1.1/ ","role":"select","line":"128"}]}]},{"N":"true"},{"N":"empty","sType":"0 "}]},{"N":"choose","sType":"? ","line":"131","C":[{"N":"filter","sType":"*NE u[NE nQ{}Licence,NE nQ{http://www.w3.org/1999/xhtml}Licence]","ns":"= xml=~ xsi=~ xsl=~ oai_dc=http://www.openarchives.org/OAI/2.0/oai_dc/ dc=http://purl.org/dc/elements/1.1/ ","line":"131","C":[{"N":"axis","name":"child","nodeTest":"*NE u[NE nQ{}Licence,NE nQ{http://www.w3.org/1999/xhtml}Licence]"},{"N":"or","C":[{"N":"compareToString","op":"ne","val":"","comp":"GAC|http://www.w3.org/2005/xpath-functions/collation/codepoint","C":[{"N":"fn","name":"normalize-space","C":[{"N":"cvUntyped","to":"AS","diag":"0|0||normalize-space","C":[{"N":"check","card":"?","diag":"0|0||normalize-space","C":[{"N":"attVal","name":"Q{}Name"}]}]}]}]},{"N":"compareToString","op":"ne","val":"","comp":"GAC|http://www.w3.org/2005/xpath-functions/collation/codepoint","C":[{"N":"fn","name":"normalize-space","C":[{"N":"cvUntyped","to":"AS","diag":"0|0||normalize-space","C":[{"N":"check","card":"?","diag":"0|0||normalize-space","C":[{"N":"attVal","name":"Q{}Url"}]}]}]}]}]}]},{"N":"elem","name":"rightsList","sType":"1NE nQ{http://datacite.org/schema/kernel-4}rightsList ","nsuri":"http://datacite.org/schema/kernel-4","namespaces":"=http://datacite.org/schema/kernel-4 xsi=http://www.w3.org/2001/XMLSchema-instance oai_dc=http://www.openarchives.org/OAI/2.0/oai_dc/ dc=http://purl.org/dc/elements/1.1/","line":"132","C":[{"N":"applyT","sType":"* ","line":"133","mode":"Q{}oai_datacite","bSlot":"0","C":[{"N":"axis","name":"child","nodeTest":"*NE u[NE nQ{}Licence,NE nQ{http://www.w3.org/1999/xhtml}Licence]","sType":"*NE u[NE nQ{}Licence,NE nQ{http://www.w3.org/1999/xhtml}Licence]","ns":"= xml=~ xsi=~ xsl=~ oai_dc=http://www.openarchives.org/OAI/2.0/oai_dc/ dc=http://purl.org/dc/elements/1.1/ ","role":"select","line":"133"}]}]},{"N":"true"},{"N":"empty","sType":"0 "}]},{"N":"choose","sType":"? ","line":"136","C":[{"N":"axis","name":"child","nodeTest":"*NE u[NE nQ{}File,NE nQ{http://www.w3.org/1999/xhtml}File]","sType":"*NE u[NE nQ{}File,NE nQ{http://www.w3.org/1999/xhtml}File]","ns":"= xml=~ xsi=~ xsl=~ oai_dc=http://www.openarchives.org/OAI/2.0/oai_dc/ dc=http://purl.org/dc/elements/1.1/ ","line":"136"},{"N":"elem","name":"sizes","sType":"1NE nQ{http://datacite.org/schema/kernel-4}sizes ","nsuri":"http://datacite.org/schema/kernel-4","namespaces":"=http://datacite.org/schema/kernel-4 xsi=http://www.w3.org/2001/XMLSchema-instance oai_dc=http://www.openarchives.org/OAI/2.0/oai_dc/ dc=http://purl.org/dc/elements/1.1/","line":"137","C":[{"N":"elem","name":"size","sType":"1NE nQ{http://datacite.org/schema/kernel-4}size ","nsuri":"http://datacite.org/schema/kernel-4","namespaces":"=http://datacite.org/schema/kernel-4 xsi=http://www.w3.org/2001/XMLSchema-instance oai_dc=http://www.openarchives.org/OAI/2.0/oai_dc/ dc=http://purl.org/dc/elements/1.1/","line":"138","C":[{"N":"sequence","sType":"*NT ","C":[{"N":"valueOf","flags":"l","sType":"1NT ","line":"139","C":[{"N":"fn","name":"string-join","role":"select","C":[{"N":"forEach","sType":"*AS ","C":[{"N":"data","sType":"*A ","C":[{"N":"mergeAdj","C":[{"N":"fn","sType":"1ADI","name":"count","ns":"= xml=~ xsi=~ xsl=~ oai_dc=http://www.openarchives.org/OAI/2.0/oai_dc/ dc=http://purl.org/dc/elements/1.1/ ","role":"select","line":"139","C":[{"N":"axis","name":"child","nodeTest":"*NE u[NE nQ{}File,NE nQ{http://www.w3.org/1999/xhtml}File]"}]}]}]},{"N":"fn","name":"string","sType":"1AS ","C":[{"N":"dot"}]}]},{"N":"str","sType":"1AS ","val":" "}]}]},{"N":"valueOf","sType":"1NT ","C":[{"N":"str","sType":"1AS ","val":" datasets"}]}]}]}]},{"N":"true"},{"N":"empty","sType":"0 "}]},{"N":"choose","sType":"? ","line":"144","C":[{"N":"filter","sType":"*NE u[NE nQ{}File,NE nQ{http://www.w3.org/1999/xhtml}File]","ns":"= xml=~ xsi=~ xsl=~ oai_dc=http://www.openarchives.org/OAI/2.0/oai_dc/ dc=http://purl.org/dc/elements/1.1/ ","line":"144","C":[{"N":"axis","name":"child","nodeTest":"*NE u[NE nQ{}File,NE nQ{http://www.w3.org/1999/xhtml}File]"},{"N":"compareToString","op":"ne","val":"","comp":"GAC|http://www.w3.org/2005/xpath-functions/collation/codepoint","C":[{"N":"fn","name":"normalize-space","C":[{"N":"cvUntyped","to":"AS","diag":"0|0||normalize-space","C":[{"N":"check","card":"?","diag":"0|0||normalize-space","C":[{"N":"attVal","name":"Q{}MimeType"}]}]}]}]}]},{"N":"elem","name":"formats","sType":"1NE nQ{http://datacite.org/schema/kernel-4}formats ","nsuri":"http://datacite.org/schema/kernel-4","namespaces":"=http://datacite.org/schema/kernel-4 xsi=http://www.w3.org/2001/XMLSchema-instance oai_dc=http://www.openarchives.org/OAI/2.0/oai_dc/ dc=http://purl.org/dc/elements/1.1/","line":"145","C":[{"N":"applyT","sType":"* ","line":"146","mode":"Q{}oai_datacite","bSlot":"0","C":[{"N":"docOrder","sType":"*NA nQ{}MimeType","role":"select","line":"146","C":[{"N":"slash","op":"/","sType":"*NA nQ{}MimeType","ns":"= xml=~ xsi=~ xsl=~ oai_dc=http://www.openarchives.org/OAI/2.0/oai_dc/ dc=http://purl.org/dc/elements/1.1/ ","C":[{"N":"axis","name":"child","nodeTest":"*NE u[NE nQ{}File,NE nQ{http://www.w3.org/1999/xhtml}File]"},{"N":"axis","name":"attribute","nodeTest":"*NA nQ{}MimeType"}]}]}]}]},{"N":"true"},{"N":"empty","sType":"0 "}]},{"N":"choose","sType":"? ","line":"149","C":[{"N":"or","sType":"1AB","ns":"= xml=~ xsi=~ xsl=~ oai_dc=http://www.openarchives.org/OAI/2.0/oai_dc/ dc=http://purl.org/dc/elements/1.1/ ","line":"149","C":[{"N":"filter","C":[{"N":"axis","name":"child","nodeTest":"*NE u[NE nQ{}TitleAbstract,NE nQ{http://www.w3.org/1999/xhtml}TitleAbstract]"},{"N":"compareToString","op":"ne","val":"","comp":"GAC|http://www.w3.org/2005/xpath-functions/collation/codepoint","C":[{"N":"fn","name":"normalize-space","C":[{"N":"cvUntyped","to":"AS","diag":"0|0||normalize-space","C":[{"N":"check","card":"?","diag":"0|0||normalize-space","C":[{"N":"attVal","name":"Q{}Value"}]}]}]}]}]},{"N":"filter","C":[{"N":"axis","name":"child","nodeTest":"*NE u[NE nQ{}TitleAbstractAdditional,NE nQ{http://www.w3.org/1999/xhtml}TitleAbstractAdditional]"},{"N":"compareToString","op":"ne","val":"","comp":"GAC|http://www.w3.org/2005/xpath-functions/collation/codepoint","C":[{"N":"fn","name":"normalize-space","C":[{"N":"cvUntyped","to":"AS","diag":"0|0||normalize-space","C":[{"N":"check","card":"?","diag":"0|0||normalize-space","C":[{"N":"attVal","name":"Q{}Value"}]}]}]}]}]}]},{"N":"elem","name":"descriptions","sType":"1NE nQ{http://datacite.org/schema/kernel-4}descriptions ","nsuri":"http://datacite.org/schema/kernel-4","namespaces":"=http://datacite.org/schema/kernel-4 xsi=http://www.w3.org/2001/XMLSchema-instance oai_dc=http://www.openarchives.org/OAI/2.0/oai_dc/ dc=http://purl.org/dc/elements/1.1/","line":"150","C":[{"N":"sequence","sType":"* ","C":[{"N":"applyT","sType":"* ","line":"151","mode":"Q{}oai_datacite","bSlot":"0","C":[{"N":"axis","name":"child","nodeTest":"*NE u[NE nQ{}TitleAbstract,NE nQ{http://www.w3.org/1999/xhtml}TitleAbstract]","sType":"*NE u[NE nQ{}TitleAbstract,NE nQ{http://www.w3.org/1999/xhtml}TitleAbstract]","ns":"= xml=~ xsi=~ xsl=~ oai_dc=http://www.openarchives.org/OAI/2.0/oai_dc/ dc=http://purl.org/dc/elements/1.1/ ","role":"select","line":"151"}]},{"N":"applyT","sType":"* ","line":"152","mode":"Q{}oai_datacite","bSlot":"0","C":[{"N":"axis","name":"child","nodeTest":"*NE u[NE nQ{}TitleAbstractAdditional,NE nQ{http://www.w3.org/1999/xhtml}TitleAbstractAdditional]","sType":"*NE u[NE nQ{}TitleAbstractAdditional,NE nQ{http://www.w3.org/1999/xhtml}TitleAbstractAdditional]","ns":"= xml=~ xsi=~ xsl=~ oai_dc=http://www.openarchives.org/OAI/2.0/oai_dc/ dc=http://purl.org/dc/elements/1.1/ ","role":"select","line":"152"}]}]}]},{"N":"true"},{"N":"empty","sType":"0 "}]},{"N":"choose","sType":"? ","line":"155","C":[{"N":"filter","sType":"*NE u[NE nQ{}Coverage,NE nQ{http://www.w3.org/1999/xhtml}Coverage]","ns":"= xml=~ xsi=~ xsl=~ oai_dc=http://www.openarchives.org/OAI/2.0/oai_dc/ dc=http://purl.org/dc/elements/1.1/ ","line":"155","C":[{"N":"axis","name":"child","nodeTest":"*NE u[NE nQ{}Coverage,NE nQ{http://www.w3.org/1999/xhtml}Coverage]"},{"N":"and","C":[{"N":"and","C":[{"N":"and","C":[{"N":"compareToString","op":"ne","val":"","comp":"GAC|http://www.w3.org/2005/xpath-functions/collation/codepoint","C":[{"N":"fn","name":"normalize-space","C":[{"N":"cvUntyped","to":"AS","diag":"0|0||normalize-space","C":[{"N":"check","card":"?","diag":"0|0||normalize-space","C":[{"N":"attVal","name":"Q{}XMin"}]}]}]}]},{"N":"compareToString","op":"ne","val":"","comp":"GAC|http://www.w3.org/2005/xpath-functions/collation/codepoint","C":[{"N":"fn","name":"normalize-space","C":[{"N":"cvUntyped","to":"AS","diag":"0|0||normalize-space","C":[{"N":"check","card":"?","diag":"0|0||normalize-space","C":[{"N":"attVal","name":"Q{}XMax"}]}]}]}]}]},{"N":"compareToString","op":"ne","val":"","comp":"GAC|http://www.w3.org/2005/xpath-functions/collation/codepoint","C":[{"N":"fn","name":"normalize-space","C":[{"N":"cvUntyped","to":"AS","diag":"0|0||normalize-space","C":[{"N":"check","card":"?","diag":"0|0||normalize-space","C":[{"N":"attVal","name":"Q{}YMin"}]}]}]}]}]},{"N":"compareToString","op":"ne","val":"","comp":"GAC|http://www.w3.org/2005/xpath-functions/collation/codepoint","C":[{"N":"fn","name":"normalize-space","C":[{"N":"cvUntyped","to":"AS","diag":"0|0||normalize-space","C":[{"N":"check","card":"?","diag":"0|0||normalize-space","C":[{"N":"attVal","name":"Q{}YMax"}]}]}]}]}]}]},{"N":"elem","name":"geoLocations","sType":"1NE nQ{http://datacite.org/schema/kernel-4}geoLocations ","nsuri":"http://datacite.org/schema/kernel-4","namespaces":"=http://datacite.org/schema/kernel-4 xsi=http://www.w3.org/2001/XMLSchema-instance oai_dc=http://www.openarchives.org/OAI/2.0/oai_dc/ dc=http://purl.org/dc/elements/1.1/","line":"156","C":[{"N":"applyT","sType":"* ","line":"157","mode":"Q{}oai_datacite","bSlot":"0","C":[{"N":"axis","name":"child","nodeTest":"*NE u[NE nQ{}Coverage,NE nQ{http://www.w3.org/1999/xhtml}Coverage]","sType":"*NE u[NE nQ{}Coverage,NE nQ{http://www.w3.org/1999/xhtml}Coverage]","ns":"= xml=~ xsi=~ xsl=~ oai_dc=http://www.openarchives.org/OAI/2.0/oai_dc/ dc=http://purl.org/dc/elements/1.1/ ","role":"select","line":"157"}]}]},{"N":"true"},{"N":"empty","sType":"0 "}]}]}]}]}]}]},{"N":"co","id":"7","binds":"1","C":[{"N":"mode","onNo":"TC","flags":"","patternSlots":"0","name":"Q{}oai_datacite","prec":"","C":[{"N":"templateRule","rank":"0","prec":"0","seq":"12","ns":"xml=~ =http://datacite.org/schema/kernel-4 xsl=~ oai_dc=http://www.openarchives.org/OAI/2.0/oai_dc/ dc=http://purl.org/dc/elements/1.1/ xsi=~","minImp":"0","flags":"s","slots":"200","baseUri":"file:///home/administrator/tethys/tethys.myapp/public/assets2/doi_datacite.xslt","line":"430","module":"doi_datacite.xslt","expand-text":"false","match":"File/@MimeType","prio":"0.5","matches":"NA nQ{}MimeType","C":[{"N":"p.withUpper","role":"match","axis":"parent","sType":"1NA nQ{}MimeType","ns":"= xml=~ xsl=~ oai_dc=http://www.openarchives.org/OAI/2.0/oai_dc/ dc=http://purl.org/dc/elements/1.1/ xsi=~ ","C":[{"N":"p.nodeTest","test":"NA nQ{}MimeType"},{"N":"p.nodeTest","test":"NE u[NE nQ{}File,NE nQ{http://www.w3.org/1999/xhtml}File]"}]},{"N":"choose","sType":"? ","role":"action","line":"431","C":[{"N":"compareToString","op":"ne","val":"","comp":"GAC|http://www.w3.org/2005/xpath-functions/collation/codepoint","sType":"1AB","ns":"= xml=~ xsl=~ oai_dc=http://www.openarchives.org/OAI/2.0/oai_dc/ dc=http://purl.org/dc/elements/1.1/ xsi=~ ","line":"431","C":[{"N":"fn","name":"normalize-space","C":[{"N":"cvUntyped","to":"AS","diag":"0|0||normalize-space","C":[{"N":"atomSing","diag":"0|0||normalize-space","card":"?","C":[{"N":"dot"}]}]}]}]},{"N":"elem","name":"format","sType":"1NE nQ{http://datacite.org/schema/kernel-4}format ","nsuri":"http://datacite.org/schema/kernel-4","namespaces":"=http://datacite.org/schema/kernel-4 xsi=http://www.w3.org/2001/XMLSchema-instance oai_dc=http://www.openarchives.org/OAI/2.0/oai_dc/ dc=http://purl.org/dc/elements/1.1/","line":"432","C":[{"N":"valueOf","flags":"l","sType":"1NT ","line":"433","C":[{"N":"fn","name":"string-join","role":"select","C":[{"N":"forEach","sType":"*AS ","C":[{"N":"data","sType":"*A ","C":[{"N":"mergeAdj","C":[{"N":"dot","sType":"1NA nQ{}MimeType","ns":"= xml=~ xsl=~ oai_dc=http://www.openarchives.org/OAI/2.0/oai_dc/ dc=http://purl.org/dc/elements/1.1/ xsi=~ ","role":"select","line":"433"}]}]},{"N":"fn","name":"string","sType":"1AS ","C":[{"N":"dot"}]}]},{"N":"str","sType":"1AS ","val":" "}]}]}]},{"N":"true"},{"N":"empty","sType":"0 "}]}]},{"N":"templateRule","rank":"1","prec":"0","seq":"13","ns":"xml=~ =http://datacite.org/schema/kernel-4 xsl=~ oai_dc=http://www.openarchives.org/OAI/2.0/oai_dc/ dc=http://purl.org/dc/elements/1.1/ xsi=~","minImp":"0","flags":"s","slots":"200","baseUri":"file:///home/administrator/tethys/tethys.myapp/public/assets2/doi_datacite.xslt","line":"439","module":"doi_datacite.xslt","expand-text":"false","match":"Licence","prio":"0","matches":"NE u[NE nQ{}Licence,NE nQ{http://www.w3.org/1999/xhtml}Licence]","C":[{"N":"p.nodeTest","role":"match","test":"NE u[NE nQ{}Licence,NE nQ{http://www.w3.org/1999/xhtml}Licence]","sType":"1NE u[NE nQ{}Licence,NE nQ{http://www.w3.org/1999/xhtml}Licence]","ns":"= xml=~ xsl=~ oai_dc=http://www.openarchives.org/OAI/2.0/oai_dc/ dc=http://purl.org/dc/elements/1.1/ xsi=~ "},{"N":"sequence","role":"action","sType":"* ","C":[{"N":"elem","name":"rights","sType":"1NE nQ{http://datacite.org/schema/kernel-4}rights ","nsuri":"http://datacite.org/schema/kernel-4","namespaces":"=http://datacite.org/schema/kernel-4 xsi=http://www.w3.org/2001/XMLSchema-instance oai_dc=http://www.openarchives.org/OAI/2.0/oai_dc/ dc=http://purl.org/dc/elements/1.1/","line":"440","C":[{"N":"sequence","sType":"* ","C":[{"N":"att","name":"xml:lang","sType":"1NA ","nsuri":"http://www.w3.org/XML/1998/namespace","line":"441","C":[{"N":"fn","name":"string-join","role":"select","C":[{"N":"forEach","sType":"*AS ","C":[{"N":"data","sType":"*A ","C":[{"N":"mergeAdj","C":[{"N":"valueOf","sType":"1NT ","flags":"l","line":"442","C":[{"N":"fn","name":"string-join","role":"select","C":[{"N":"forEach","sType":"*AS ","C":[{"N":"data","sType":"*A ","C":[{"N":"mergeAdj","C":[{"N":"axis","sType":"*NA nQ{}Language","name":"attribute","nodeTest":"*NA nQ{}Language","ns":"= xml=~ xsl=~ oai_dc=http://www.openarchives.org/OAI/2.0/oai_dc/ dc=http://purl.org/dc/elements/1.1/ xsi=~ ","role":"select","line":"442"}]}]},{"N":"fn","name":"string","sType":"1AS ","C":[{"N":"dot"}]}]},{"N":"str","sType":"1AS ","val":" "}]}]}]}]},{"N":"fn","name":"string","sType":"1AS ","C":[{"N":"dot"}]}]},{"N":"str","sType":"1AS ","val":""}]}]},{"N":"choose","sType":"? ","line":"444","C":[{"N":"gc","op":"!=","comp":"GAC|http://www.w3.org/2005/xpath-functions/collation/codepoint","card":"1:1","sType":"1AB","ns":"= xml=~ xsl=~ oai_dc=http://www.openarchives.org/OAI/2.0/oai_dc/ dc=http://purl.org/dc/elements/1.1/ xsi=~ ","line":"444","C":[{"N":"attVal","name":"Q{}LinkLicence"},{"N":"str","val":""}]},{"N":"att","name":"rightsURI","sType":"1NA ","line":"445","C":[{"N":"fn","name":"string-join","role":"select","C":[{"N":"forEach","sType":"*AS ","C":[{"N":"data","sType":"*A ","C":[{"N":"mergeAdj","C":[{"N":"valueOf","sType":"1NT ","flags":"l","line":"446","C":[{"N":"fn","name":"string-join","role":"select","C":[{"N":"forEach","sType":"*AS ","C":[{"N":"data","sType":"*A ","C":[{"N":"mergeAdj","C":[{"N":"axis","sType":"*NA nQ{}LinkLicence","name":"attribute","nodeTest":"*NA nQ{}LinkLicence","ns":"= xml=~ xsl=~ oai_dc=http://www.openarchives.org/OAI/2.0/oai_dc/ dc=http://purl.org/dc/elements/1.1/ xsi=~ ","role":"select","line":"446"}]}]},{"N":"fn","name":"string","sType":"1AS ","C":[{"N":"dot"}]}]},{"N":"str","sType":"1AS ","val":" "}]}]}]}]},{"N":"fn","name":"string","sType":"1AS ","C":[{"N":"dot"}]}]},{"N":"str","sType":"1AS ","val":""}]}]},{"N":"true"},{"N":"empty","sType":"0 "}]},{"N":"att","name":"schemeURI","sType":"1NA ","line":"449","C":[{"N":"fn","name":"string-join","role":"select","C":[{"N":"forEach","sType":"*AS ","C":[{"N":"data","sType":"*A ","C":[{"N":"mergeAdj","C":[{"N":"valueOf","sType":"1NT ","C":[{"N":"str","sType":"1AS ","val":"https://spdx.org/licenses/"}]}]}]},{"N":"fn","name":"string","sType":"1AS ","C":[{"N":"dot"}]}]},{"N":"str","sType":"1AS ","val":""}]}]},{"N":"att","name":"rightsIdentifierScheme","sType":"1NA ","line":"452","C":[{"N":"fn","name":"string-join","role":"select","C":[{"N":"forEach","sType":"*AS ","C":[{"N":"data","sType":"*A ","C":[{"N":"mergeAdj","C":[{"N":"valueOf","sType":"1NT ","C":[{"N":"str","sType":"1AS ","val":"SPDX"}]}]}]},{"N":"fn","name":"string","sType":"1AS ","C":[{"N":"dot"}]}]},{"N":"str","sType":"1AS ","val":""}]}]},{"N":"att","name":"rightsIdentifier","sType":"1NA ","line":"455","C":[{"N":"fn","name":"string-join","role":"select","C":[{"N":"forEach","sType":"*AS ","C":[{"N":"data","sType":"*A ","C":[{"N":"mergeAdj","C":[{"N":"valueOf","sType":"1NT ","flags":"l","line":"456","C":[{"N":"fn","name":"string-join","role":"select","C":[{"N":"forEach","sType":"*AS ","C":[{"N":"data","sType":"*A ","C":[{"N":"mergeAdj","C":[{"N":"axis","sType":"*NA nQ{}Name","name":"attribute","nodeTest":"*NA nQ{}Name","ns":"= xml=~ xsl=~ oai_dc=http://www.openarchives.org/OAI/2.0/oai_dc/ dc=http://purl.org/dc/elements/1.1/ xsi=~ ","role":"select","line":"456"}]}]},{"N":"fn","name":"string","sType":"1AS ","C":[{"N":"dot"}]}]},{"N":"str","sType":"1AS ","val":" "}]}]}]}]},{"N":"fn","name":"string","sType":"1AS ","C":[{"N":"dot"}]}]},{"N":"str","sType":"1AS ","val":""}]}]},{"N":"valueOf","flags":"l","sType":"1NT ","line":"458","C":[{"N":"fn","name":"string-join","role":"select","C":[{"N":"forEach","sType":"*AS ","C":[{"N":"data","sType":"*A ","C":[{"N":"mergeAdj","C":[{"N":"axis","sType":"*NA nQ{}NameLong","name":"attribute","nodeTest":"*NA nQ{}NameLong","ns":"= xml=~ xsl=~ oai_dc=http://www.openarchives.org/OAI/2.0/oai_dc/ dc=http://purl.org/dc/elements/1.1/ xsi=~ ","role":"select","line":"458"}]}]},{"N":"fn","name":"string","sType":"1AS ","C":[{"N":"dot"}]}]},{"N":"str","sType":"1AS ","val":" "}]}]}]}]},{"N":"choose","sType":"? ","line":"460","C":[{"N":"or","sType":"1AB","ns":"= xml=~ xsl=~ oai_dc=http://www.openarchives.org/OAI/2.0/oai_dc/ dc=http://purl.org/dc/elements/1.1/ xsi=~ ","line":"460","C":[{"N":"gc","op":"=","comp":"GAC|http://www.w3.org/2005/xpath-functions/collation/codepoint","card":"1:1","C":[{"N":"attVal","name":"Q{}Name"},{"N":"str","val":"CC-BY-4.0"}]},{"N":"gc","op":"=","comp":"GAC|http://www.w3.org/2005/xpath-functions/collation/codepoint","card":"1:1","C":[{"N":"attVal","name":"Q{}Name"},{"N":"str","val":"CC-BY-SA-4.0"}]}]},{"N":"elem","name":"rights","sType":"1NE nQ{http://datacite.org/schema/kernel-4}rights ","nsuri":"http://datacite.org/schema/kernel-4","namespaces":"=http://datacite.org/schema/kernel-4 xsi=http://www.w3.org/2001/XMLSchema-instance oai_dc=http://www.openarchives.org/OAI/2.0/oai_dc/ dc=http://purl.org/dc/elements/1.1/","line":"461","C":[{"N":"sequence","sType":"*N ","C":[{"N":"att","name":"rightsURI","sType":"1NA ","line":"462","C":[{"N":"fn","name":"string-join","role":"select","C":[{"N":"forEach","sType":"*AS ","C":[{"N":"data","sType":"*A ","C":[{"N":"mergeAdj","C":[{"N":"valueOf","sType":"1NT ","C":[{"N":"str","sType":"1AS ","val":"info:eu-repo/semantics/openAccess"}]}]}]},{"N":"fn","name":"string","sType":"1AS ","C":[{"N":"dot"}]}]},{"N":"str","sType":"1AS ","val":""}]}]},{"N":"valueOf","sType":"1NT ","C":[{"N":"str","sType":"1AS ","val":"Open Access"}]}]}]},{"N":"true"},{"N":"empty","sType":"0 "}]}]}]},{"N":"templateRule","rank":"2","prec":"0","seq":"11","ns":"xml=~ =http://datacite.org/schema/kernel-4 xsl=~ oai_dc=http://www.openarchives.org/OAI/2.0/oai_dc/ dc=http://purl.org/dc/elements/1.1/ xsi=~","minImp":"0","flags":"s","slots":"200","baseUri":"file:///home/administrator/tethys/tethys.myapp/public/assets2/doi_datacite.xslt","line":"380","module":"doi_datacite.xslt","expand-text":"false","match":"PersonAuthor","prio":"0","matches":"NE u[NE nQ{}PersonAuthor,NE nQ{http://www.w3.org/1999/xhtml}PersonAuthor]","C":[{"N":"p.nodeTest","role":"match","test":"NE u[NE nQ{}PersonAuthor,NE nQ{http://www.w3.org/1999/xhtml}PersonAuthor]","sType":"1NE u[NE nQ{}PersonAuthor,NE nQ{http://www.w3.org/1999/xhtml}PersonAuthor]","ns":"= xml=~ xsl=~ oai_dc=http://www.openarchives.org/OAI/2.0/oai_dc/ dc=http://purl.org/dc/elements/1.1/ xsi=~ "},{"N":"elem","name":"creator","sType":"1NE nQ{http://datacite.org/schema/kernel-4}creator ","nsuri":"http://datacite.org/schema/kernel-4","namespaces":"=http://datacite.org/schema/kernel-4 xsi=http://www.w3.org/2001/XMLSchema-instance oai_dc=http://www.openarchives.org/OAI/2.0/oai_dc/ dc=http://purl.org/dc/elements/1.1/","role":"action","line":"381","C":[{"N":"sequence","sType":"* ","C":[{"N":"elem","name":"creatorName","sType":"1NE nQ{http://datacite.org/schema/kernel-4}creatorName ","nsuri":"http://datacite.org/schema/kernel-4","namespaces":"=http://datacite.org/schema/kernel-4 xsi=http://www.w3.org/2001/XMLSchema-instance oai_dc=http://www.openarchives.org/OAI/2.0/oai_dc/ dc=http://purl.org/dc/elements/1.1/","line":"382","C":[{"N":"sequence","sType":"* ","C":[{"N":"choose","sType":"? ","line":"383","C":[{"N":"gc","op":"!=","comp":"GAC|http://www.w3.org/2005/xpath-functions/collation/codepoint","card":"1:1","sType":"1AB","ns":"= xml=~ xsl=~ oai_dc=http://www.openarchives.org/OAI/2.0/oai_dc/ dc=http://purl.org/dc/elements/1.1/ xsi=~ ","line":"383","C":[{"N":"attVal","name":"Q{}NameType"},{"N":"str","val":""}]},{"N":"att","name":"nameType","sType":"1NA ","line":"384","C":[{"N":"fn","name":"string-join","role":"select","C":[{"N":"forEach","sType":"*AS ","C":[{"N":"data","sType":"*A ","C":[{"N":"mergeAdj","C":[{"N":"valueOf","sType":"1NT ","flags":"l","line":"385","C":[{"N":"fn","name":"string-join","role":"select","C":[{"N":"forEach","sType":"*AS ","C":[{"N":"data","sType":"*A ","C":[{"N":"mergeAdj","C":[{"N":"axis","sType":"*NA nQ{}NameType","name":"attribute","nodeTest":"*NA nQ{}NameType","ns":"= xml=~ xsl=~ oai_dc=http://www.openarchives.org/OAI/2.0/oai_dc/ dc=http://purl.org/dc/elements/1.1/ xsi=~ ","role":"select","line":"385"}]}]},{"N":"fn","name":"string","sType":"1AS ","C":[{"N":"dot"}]}]},{"N":"str","sType":"1AS ","val":" "}]}]}]}]},{"N":"fn","name":"string","sType":"1AS ","C":[{"N":"dot"}]}]},{"N":"str","sType":"1AS ","val":""}]}]},{"N":"true"},{"N":"empty","sType":"0 "}]},{"N":"valueOf","flags":"l","sType":"1NT ","line":"388","C":[{"N":"fn","name":"string-join","role":"select","C":[{"N":"forEach","sType":"*AS ","C":[{"N":"data","sType":"*A ","C":[{"N":"mergeAdj","C":[{"N":"axis","sType":"*NA nQ{}LastName","name":"attribute","nodeTest":"*NA nQ{}LastName","ns":"= xml=~ xsl=~ oai_dc=http://www.openarchives.org/OAI/2.0/oai_dc/ dc=http://purl.org/dc/elements/1.1/ xsi=~ ","role":"select","line":"388"}]}]},{"N":"fn","name":"string","sType":"1AS ","C":[{"N":"dot"}]}]},{"N":"str","sType":"1AS ","val":" "}]}]},{"N":"choose","sType":"? ","line":"389","C":[{"N":"gc","op":"!=","comp":"GAC|http://www.w3.org/2005/xpath-functions/collation/codepoint","card":"1:1","sType":"1AB","ns":"= xml=~ xsl=~ oai_dc=http://www.openarchives.org/OAI/2.0/oai_dc/ dc=http://purl.org/dc/elements/1.1/ xsi=~ ","line":"389","C":[{"N":"attVal","name":"Q{}FirstName"},{"N":"str","val":""}]},{"N":"valueOf","sType":"1NT ","C":[{"N":"str","sType":"1AS ","val":", "}]},{"N":"true"},{"N":"empty","sType":"0 "}]},{"N":"valueOf","flags":"l","sType":"1NT ","line":"392","C":[{"N":"fn","name":"string-join","role":"select","C":[{"N":"forEach","sType":"*AS ","C":[{"N":"data","sType":"*A ","C":[{"N":"mergeAdj","C":[{"N":"axis","sType":"*NA nQ{}FirstName","name":"attribute","nodeTest":"*NA nQ{}FirstName","ns":"= xml=~ xsl=~ oai_dc=http://www.openarchives.org/OAI/2.0/oai_dc/ dc=http://purl.org/dc/elements/1.1/ xsi=~ ","role":"select","line":"392"}]}]},{"N":"fn","name":"string","sType":"1AS ","C":[{"N":"dot"}]}]},{"N":"str","sType":"1AS ","val":" "}]}]},{"N":"choose","sType":"* ","line":"393","C":[{"N":"gc","op":"!=","comp":"GAC|http://www.w3.org/2005/xpath-functions/collation/codepoint","card":"1:1","sType":"1AB","ns":"= xml=~ xsl=~ oai_dc=http://www.openarchives.org/OAI/2.0/oai_dc/ dc=http://purl.org/dc/elements/1.1/ xsi=~ ","line":"393","C":[{"N":"attVal","name":"Q{}AcademicTitle"},{"N":"str","val":""}]},{"N":"sequence","sType":"*NT ","C":[{"N":"valueOf","sType":"1NT ","C":[{"N":"str","sType":"1AS ","val":" ("}]},{"N":"valueOf","flags":"l","sType":"1NT ","line":"395","C":[{"N":"fn","name":"string-join","role":"select","C":[{"N":"forEach","sType":"*AS ","C":[{"N":"data","sType":"*A ","C":[{"N":"mergeAdj","C":[{"N":"axis","sType":"*NA nQ{}AcademicTitle","name":"attribute","nodeTest":"*NA nQ{}AcademicTitle","ns":"= xml=~ xsl=~ oai_dc=http://www.openarchives.org/OAI/2.0/oai_dc/ dc=http://purl.org/dc/elements/1.1/ xsi=~ ","role":"select","line":"395"}]}]},{"N":"fn","name":"string","sType":"1AS ","C":[{"N":"dot"}]}]},{"N":"str","sType":"1AS ","val":" "}]}]},{"N":"valueOf","sType":"1NT ","C":[{"N":"str","sType":"1AS ","val":")"}]}]},{"N":"true"},{"N":"empty","sType":"0 "}]}]}]},{"N":"choose","sType":"* ","line":"400","C":[{"N":"gc","op":"=","comp":"GAC|http://www.w3.org/2005/xpath-functions/collation/codepoint","card":"1:1","sType":"1AB","ns":"= xml=~ xsl=~ oai_dc=http://www.openarchives.org/OAI/2.0/oai_dc/ dc=http://purl.org/dc/elements/1.1/ xsi=~ ","line":"400","C":[{"N":"attVal","name":"Q{}NameType"},{"N":"str","val":"Personal"}]},{"N":"sequence","sType":"* ","C":[{"N":"elem","name":"givenName","sType":"1NE nQ{http://datacite.org/schema/kernel-4}givenName ","nsuri":"http://datacite.org/schema/kernel-4","namespaces":"=http://datacite.org/schema/kernel-4 xsi=http://www.w3.org/2001/XMLSchema-instance oai_dc=http://www.openarchives.org/OAI/2.0/oai_dc/ dc=http://purl.org/dc/elements/1.1/","line":"401","C":[{"N":"valueOf","flags":"l","sType":"1NT ","line":"402","C":[{"N":"fn","name":"string-join","role":"select","C":[{"N":"forEach","sType":"*AS ","C":[{"N":"data","sType":"*A ","C":[{"N":"mergeAdj","C":[{"N":"axis","sType":"*NA nQ{}FirstName","name":"attribute","nodeTest":"*NA nQ{}FirstName","ns":"= xml=~ xsl=~ oai_dc=http://www.openarchives.org/OAI/2.0/oai_dc/ dc=http://purl.org/dc/elements/1.1/ xsi=~ ","role":"select","line":"402"}]}]},{"N":"fn","name":"string","sType":"1AS ","C":[{"N":"dot"}]}]},{"N":"str","sType":"1AS ","val":" "}]}]}]},{"N":"elem","name":"familyName","sType":"1NE nQ{http://datacite.org/schema/kernel-4}familyName ","nsuri":"http://datacite.org/schema/kernel-4","namespaces":"=http://datacite.org/schema/kernel-4 xsi=http://www.w3.org/2001/XMLSchema-instance oai_dc=http://www.openarchives.org/OAI/2.0/oai_dc/ dc=http://purl.org/dc/elements/1.1/","line":"404","C":[{"N":"valueOf","flags":"l","sType":"1NT ","line":"405","C":[{"N":"fn","name":"string-join","role":"select","C":[{"N":"forEach","sType":"*AS ","C":[{"N":"data","sType":"*A ","C":[{"N":"mergeAdj","C":[{"N":"axis","sType":"*NA nQ{}LastName","name":"attribute","nodeTest":"*NA nQ{}LastName","ns":"= xml=~ xsl=~ oai_dc=http://www.openarchives.org/OAI/2.0/oai_dc/ dc=http://purl.org/dc/elements/1.1/ xsi=~ ","role":"select","line":"405"}]}]},{"N":"fn","name":"string","sType":"1AS ","C":[{"N":"dot"}]}]},{"N":"str","sType":"1AS ","val":" "}]}]}]},{"N":"choose","sType":"? ","line":"407","C":[{"N":"gc","op":"!=","comp":"GAC|http://www.w3.org/2005/xpath-functions/collation/codepoint","card":"1:1","sType":"1AB","ns":"= xml=~ xsl=~ oai_dc=http://www.openarchives.org/OAI/2.0/oai_dc/ dc=http://purl.org/dc/elements/1.1/ xsi=~ ","line":"407","C":[{"N":"attVal","name":"Q{}IdentifierOrcid"},{"N":"str","val":""}]},{"N":"elem","name":"nameIdentifier","sType":"1NE nQ{http://datacite.org/schema/kernel-4}nameIdentifier ","nsuri":"http://datacite.org/schema/kernel-4","namespaces":"=http://datacite.org/schema/kernel-4 xsi=http://www.w3.org/2001/XMLSchema-instance oai_dc=http://www.openarchives.org/OAI/2.0/oai_dc/ dc=http://purl.org/dc/elements/1.1/","line":"408","C":[{"N":"sequence","sType":"*N ","C":[{"N":"att","name":"schemeURI","nsuri":"","sType":"1NA ","C":[{"N":"str","sType":"1AS ","val":"http://orcid.org/"}]},{"N":"att","name":"nameIdentifierScheme","nsuri":"","sType":"1NA ","C":[{"N":"str","sType":"1AS ","val":"ORCID"}]},{"N":"valueOf","flags":"l","sType":"1NT ","line":"409","C":[{"N":"fn","name":"string-join","role":"select","C":[{"N":"forEach","sType":"*AS ","C":[{"N":"data","sType":"*A ","C":[{"N":"mergeAdj","C":[{"N":"axis","sType":"*NA nQ{}IdentifierOrcid","name":"attribute","nodeTest":"*NA nQ{}IdentifierOrcid","ns":"= xml=~ xsl=~ oai_dc=http://www.openarchives.org/OAI/2.0/oai_dc/ dc=http://purl.org/dc/elements/1.1/ xsi=~ ","role":"select","line":"409"}]}]},{"N":"fn","name":"string","sType":"1AS ","C":[{"N":"dot"}]}]},{"N":"str","sType":"1AS ","val":" "}]}]}]}]},{"N":"true"},{"N":"empty","sType":"0 "}]},{"N":"elem","name":"affiliation","sType":"1NE nQ{http://datacite.org/schema/kernel-4}affiliation ","nsuri":"http://datacite.org/schema/kernel-4","namespaces":"=http://datacite.org/schema/kernel-4 xsi=http://www.w3.org/2001/XMLSchema-instance oai_dc=http://www.openarchives.org/OAI/2.0/oai_dc/ dc=http://purl.org/dc/elements/1.1/","line":"412","C":[{"N":"valueOf","sType":"1NT ","C":[{"N":"str","sType":"1AS ","val":"GBA"}]}]}]},{"N":"true"},{"N":"empty","sType":"0 "}]},{"N":"choose","sType":"? ","line":"415","C":[{"N":"gc","op":"=","comp":"GAC|http://www.w3.org/2005/xpath-functions/collation/codepoint","card":"1:1","sType":"1AB","ns":"= xml=~ xsl=~ oai_dc=http://www.openarchives.org/OAI/2.0/oai_dc/ dc=http://purl.org/dc/elements/1.1/ xsi=~ ","line":"415","C":[{"N":"attVal","name":"Q{}NameType"},{"N":"str","val":"Organizational"}]},{"N":"choose","sType":"? ","line":"416","C":[{"N":"gc","op":"!=","comp":"GAC|http://www.w3.org/2005/xpath-functions/collation/codepoint","card":"1:1","sType":"1AB","ns":"= xml=~ xsl=~ oai_dc=http://www.openarchives.org/OAI/2.0/oai_dc/ dc=http://purl.org/dc/elements/1.1/ xsi=~ ","line":"416","C":[{"N":"attVal","name":"Q{}IdentifierOrcid"},{"N":"str","val":""}]},{"N":"elem","name":"nameIdentifier","sType":"1NE nQ{http://datacite.org/schema/kernel-4}nameIdentifier ","nsuri":"http://datacite.org/schema/kernel-4","namespaces":"=http://datacite.org/schema/kernel-4 xsi=http://www.w3.org/2001/XMLSchema-instance oai_dc=http://www.openarchives.org/OAI/2.0/oai_dc/ dc=http://purl.org/dc/elements/1.1/","line":"417","C":[{"N":"sequence","sType":"*N ","C":[{"N":"att","name":"schemeURI","nsuri":"","sType":"1NA ","C":[{"N":"str","sType":"1AS ","val":"http://orcid.org/"}]},{"N":"att","name":"nameIdentifierScheme","nsuri":"","sType":"1NA ","C":[{"N":"str","sType":"1AS ","val":"ORCID"}]},{"N":"valueOf","flags":"l","sType":"1NT ","line":"418","C":[{"N":"fn","name":"string-join","role":"select","C":[{"N":"forEach","sType":"*AS ","C":[{"N":"data","sType":"*A ","C":[{"N":"mergeAdj","C":[{"N":"axis","sType":"*NA nQ{}IdentifierOrcid","name":"attribute","nodeTest":"*NA nQ{}IdentifierOrcid","ns":"= xml=~ xsl=~ oai_dc=http://www.openarchives.org/OAI/2.0/oai_dc/ dc=http://purl.org/dc/elements/1.1/ xsi=~ ","role":"select","line":"418"}]}]},{"N":"fn","name":"string","sType":"1AS ","C":[{"N":"dot"}]}]},{"N":"str","sType":"1AS ","val":" "}]}]}]}]},{"N":"true"},{"N":"empty","sType":"0 "}]},{"N":"true"},{"N":"empty","sType":"0 "}]}]}]}]},{"N":"templateRule","rank":"3","prec":"0","seq":"10","ns":"xml=~ =http://datacite.org/schema/kernel-4 xsl=~ oai_dc=http://www.openarchives.org/OAI/2.0/oai_dc/ dc=http://purl.org/dc/elements/1.1/ xsi=~","minImp":"0","flags":"s","slots":"200","baseUri":"file:///home/administrator/tethys/tethys.myapp/public/assets2/doi_datacite.xslt","line":"359","module":"doi_datacite.xslt","expand-text":"false","match":"PersonContributor","prio":"0","matches":"NE u[NE nQ{}PersonContributor,NE nQ{http://www.w3.org/1999/xhtml}PersonContributor]","C":[{"N":"p.nodeTest","role":"match","test":"NE u[NE nQ{}PersonContributor,NE nQ{http://www.w3.org/1999/xhtml}PersonContributor]","sType":"1NE u[NE nQ{}PersonContributor,NE nQ{http://www.w3.org/1999/xhtml}PersonContributor]","ns":"= xml=~ xsl=~ oai_dc=http://www.openarchives.org/OAI/2.0/oai_dc/ dc=http://purl.org/dc/elements/1.1/ xsi=~ "},{"N":"choose","sType":"? ","role":"action","line":"360","C":[{"N":"compareToString","op":"ne","val":"","comp":"GAC|http://www.w3.org/2005/xpath-functions/collation/codepoint","sType":"1AB","ns":"= xml=~ xsl=~ oai_dc=http://www.openarchives.org/OAI/2.0/oai_dc/ dc=http://purl.org/dc/elements/1.1/ xsi=~ ","line":"360","C":[{"N":"fn","name":"normalize-space","C":[{"N":"fn","name":"concat","C":[{"N":"check","card":"?","diag":"0|0||concat","C":[{"N":"attVal","name":"Q{}FirstName"}]},{"N":"check","card":"?","diag":"0|1||concat","C":[{"N":"attVal","name":"Q{}LastName"}]}]}]}]},{"N":"elem","name":"contributor","sType":"1NE nQ{http://datacite.org/schema/kernel-4}contributor ","nsuri":"http://datacite.org/schema/kernel-4","namespaces":"=http://datacite.org/schema/kernel-4 xsi=http://www.w3.org/2001/XMLSchema-instance oai_dc=http://www.openarchives.org/OAI/2.0/oai_dc/ dc=http://purl.org/dc/elements/1.1/","line":"361","C":[{"N":"sequence","sType":"* ","C":[{"N":"choose","sType":"? ","line":"362","C":[{"N":"gc","op":"!=","comp":"GAC|http://www.w3.org/2005/xpath-functions/collation/codepoint","card":"1:1","sType":"1AB","ns":"= xml=~ xsl=~ oai_dc=http://www.openarchives.org/OAI/2.0/oai_dc/ dc=http://purl.org/dc/elements/1.1/ xsi=~ ","line":"362","C":[{"N":"attVal","name":"Q{}ContributorType"},{"N":"str","val":""}]},{"N":"att","name":"contributorType","sType":"1NA ","line":"363","C":[{"N":"fn","name":"string-join","role":"select","C":[{"N":"forEach","sType":"*AS ","C":[{"N":"data","sType":"*A ","C":[{"N":"mergeAdj","C":[{"N":"valueOf","sType":"1NT ","flags":"l","line":"364","C":[{"N":"fn","name":"string-join","role":"select","C":[{"N":"forEach","sType":"*AS ","C":[{"N":"data","sType":"*A ","C":[{"N":"mergeAdj","C":[{"N":"axis","sType":"*NA nQ{}ContributorType","name":"attribute","nodeTest":"*NA nQ{}ContributorType","ns":"= xml=~ xsl=~ oai_dc=http://www.openarchives.org/OAI/2.0/oai_dc/ dc=http://purl.org/dc/elements/1.1/ xsi=~ ","role":"select","line":"364"}]}]},{"N":"fn","name":"string","sType":"1AS ","C":[{"N":"dot"}]}]},{"N":"str","sType":"1AS ","val":" "}]}]}]}]},{"N":"fn","name":"string","sType":"1AS ","C":[{"N":"dot"}]}]},{"N":"str","sType":"1AS ","val":""}]}]},{"N":"true"},{"N":"empty","sType":"0 "}]},{"N":"elem","name":"contributorName","sType":"1NE nQ{http://datacite.org/schema/kernel-4}contributorName ","nsuri":"http://datacite.org/schema/kernel-4","namespaces":"=http://datacite.org/schema/kernel-4 xsi=http://www.w3.org/2001/XMLSchema-instance oai_dc=http://www.openarchives.org/OAI/2.0/oai_dc/ dc=http://purl.org/dc/elements/1.1/","line":"367","C":[{"N":"valueOf","flags":"l","sType":"1NT ","line":"373","C":[{"N":"fn","name":"string-join","role":"select","C":[{"N":"fn","name":"concat","sType":"1AS","ns":"= xml=~ xsl=~ oai_dc=http://www.openarchives.org/OAI/2.0/oai_dc/ dc=http://purl.org/dc/elements/1.1/ xsi=~ ","role":"select","line":"373","C":[{"N":"check","card":"?","diag":"0|0||concat","C":[{"N":"attVal","name":"Q{}FirstName"}]},{"N":"str","val":" "},{"N":"check","card":"?","diag":"0|2||concat","C":[{"N":"attVal","name":"Q{}LastName"}]}]},{"N":"str","sType":"1AS ","val":" "}]}]}]}]}]},{"N":"true"},{"N":"empty","sType":"0 "}]}]},{"N":"templateRule","rank":"4","prec":"0","seq":"9","ns":"xml=~ =http://datacite.org/schema/kernel-4 xsl=~ oai_dc=http://www.openarchives.org/OAI/2.0/oai_dc/ dc=http://purl.org/dc/elements/1.1/ xsi=~","minImp":"0","flags":"s","slots":"200","baseUri":"file:///home/administrator/tethys/tethys.myapp/public/assets2/doi_datacite.xslt","line":"343","module":"doi_datacite.xslt","expand-text":"false","match":"Reference","prio":"0","matches":"NE u[NE nQ{}Reference,NE nQ{http://www.w3.org/1999/xhtml}Reference]","C":[{"N":"p.nodeTest","role":"match","test":"NE u[NE nQ{}Reference,NE nQ{http://www.w3.org/1999/xhtml}Reference]","sType":"1NE u[NE nQ{}Reference,NE nQ{http://www.w3.org/1999/xhtml}Reference]","ns":"= xml=~ xsl=~ oai_dc=http://www.openarchives.org/OAI/2.0/oai_dc/ dc=http://purl.org/dc/elements/1.1/ xsi=~ "},{"N":"choose","sType":"? ","role":"action","line":"344","C":[{"N":"and","sType":"1AB","ns":"= xml=~ xsl=~ oai_dc=http://www.openarchives.org/OAI/2.0/oai_dc/ dc=http://purl.org/dc/elements/1.1/ xsi=~ ","line":"344","C":[{"N":"compareToString","op":"ne","val":"","comp":"GAC|http://www.w3.org/2005/xpath-functions/collation/codepoint","C":[{"N":"fn","name":"normalize-space","C":[{"N":"cvUntyped","to":"AS","diag":"0|0||normalize-space","C":[{"N":"check","card":"?","diag":"0|0||normalize-space","C":[{"N":"attVal","name":"Q{}Type"}]}]}]}]},{"N":"compareToString","op":"ne","val":"","comp":"GAC|http://www.w3.org/2005/xpath-functions/collation/codepoint","C":[{"N":"fn","name":"normalize-space","C":[{"N":"cvUntyped","to":"AS","diag":"0|0||normalize-space","C":[{"N":"check","card":"?","diag":"0|0||normalize-space","C":[{"N":"attVal","name":"Q{}Relation"}]}]}]}]}]},{"N":"elem","name":"relatedIdentifier","sType":"1NE nQ{http://datacite.org/schema/kernel-4}relatedIdentifier ","nsuri":"http://datacite.org/schema/kernel-4","namespaces":"=http://datacite.org/schema/kernel-4 xsi=http://www.w3.org/2001/XMLSchema-instance oai_dc=http://www.openarchives.org/OAI/2.0/oai_dc/ dc=http://purl.org/dc/elements/1.1/","line":"345","C":[{"N":"sequence","sType":"*N ","C":[{"N":"att","name":"relatedIdentifierType","sType":"1NA ","line":"346","C":[{"N":"fn","name":"string-join","role":"select","C":[{"N":"forEach","sType":"*AS ","C":[{"N":"data","sType":"*A ","C":[{"N":"mergeAdj","C":[{"N":"valueOf","sType":"1NT ","flags":"l","line":"347","C":[{"N":"fn","name":"string-join","role":"select","C":[{"N":"forEach","sType":"*AS ","C":[{"N":"data","sType":"*A ","C":[{"N":"mergeAdj","C":[{"N":"axis","sType":"*NA nQ{}Type","name":"attribute","nodeTest":"*NA nQ{}Type","ns":"= xml=~ xsl=~ oai_dc=http://www.openarchives.org/OAI/2.0/oai_dc/ dc=http://purl.org/dc/elements/1.1/ xsi=~ ","role":"select","line":"347"}]}]},{"N":"fn","name":"string","sType":"1AS ","C":[{"N":"dot"}]}]},{"N":"str","sType":"1AS ","val":" "}]}]}]}]},{"N":"fn","name":"string","sType":"1AS ","C":[{"N":"dot"}]}]},{"N":"str","sType":"1AS ","val":""}]}]},{"N":"att","name":"relationType","sType":"1NA ","line":"349","C":[{"N":"fn","name":"string-join","role":"select","C":[{"N":"forEach","sType":"*AS ","C":[{"N":"data","sType":"*A ","C":[{"N":"mergeAdj","C":[{"N":"valueOf","sType":"1NT ","flags":"l","line":"350","C":[{"N":"fn","name":"string-join","role":"select","C":[{"N":"forEach","sType":"*AS ","C":[{"N":"data","sType":"*A ","C":[{"N":"mergeAdj","C":[{"N":"axis","sType":"*NA nQ{}Relation","name":"attribute","nodeTest":"*NA nQ{}Relation","ns":"= xml=~ xsl=~ oai_dc=http://www.openarchives.org/OAI/2.0/oai_dc/ dc=http://purl.org/dc/elements/1.1/ xsi=~ ","role":"select","line":"350"}]}]},{"N":"fn","name":"string","sType":"1AS ","C":[{"N":"dot"}]}]},{"N":"str","sType":"1AS ","val":" "}]}]}]}]},{"N":"fn","name":"string","sType":"1AS ","C":[{"N":"dot"}]}]},{"N":"str","sType":"1AS ","val":""}]}]},{"N":"valueOf","flags":"l","sType":"1NT ","line":"352","C":[{"N":"fn","name":"string-join","role":"select","C":[{"N":"forEach","sType":"*AS ","C":[{"N":"data","sType":"*A ","C":[{"N":"mergeAdj","C":[{"N":"axis","sType":"*NA nQ{}Value","name":"attribute","nodeTest":"*NA nQ{}Value","ns":"= xml=~ xsl=~ oai_dc=http://www.openarchives.org/OAI/2.0/oai_dc/ dc=http://purl.org/dc/elements/1.1/ xsi=~ ","role":"select","line":"352"}]}]},{"N":"fn","name":"string","sType":"1AS ","C":[{"N":"dot"}]}]},{"N":"str","sType":"1AS ","val":" "}]}]}]}]},{"N":"true"},{"N":"empty","sType":"0 "}]}]},{"N":"templateRule","rank":"5","prec":"0","seq":"8","ns":"xml=~ =http://datacite.org/schema/kernel-4 xsl=~ oai_dc=http://www.openarchives.org/OAI/2.0/oai_dc/ dc=http://purl.org/dc/elements/1.1/ xsi=~","minImp":"0","flags":"s","slots":"200","baseUri":"file:///home/administrator/tethys/tethys.myapp/public/assets2/doi_datacite.xslt","line":"331","module":"doi_datacite.xslt","expand-text":"false","match":"AlternateIdentifier","prio":"0","matches":"NE u[NE nQ{}AlternateIdentifier,NE nQ{http://www.w3.org/1999/xhtml}AlternateIdentifier]","C":[{"N":"p.nodeTest","role":"match","test":"NE u[NE nQ{}AlternateIdentifier,NE nQ{http://www.w3.org/1999/xhtml}AlternateIdentifier]","sType":"1NE u[NE nQ{}AlternateIdentifier,NE nQ{http://www.w3.org/1999/xhtml}AlternateIdentifier]","ns":"= xml=~ xsl=~ oai_dc=http://www.openarchives.org/OAI/2.0/oai_dc/ dc=http://purl.org/dc/elements/1.1/ xsi=~ "},{"N":"choose","sType":"? ","role":"action","line":"332","C":[{"N":"compareToString","op":"ne","val":"","comp":"GAC|http://www.w3.org/2005/xpath-functions/collation/codepoint","sType":"1AB","ns":"= xml=~ xsl=~ oai_dc=http://www.openarchives.org/OAI/2.0/oai_dc/ dc=http://purl.org/dc/elements/1.1/ xsi=~ ","line":"332","C":[{"N":"fn","name":"normalize-space","C":[{"N":"cvUntyped","to":"AS","diag":"0|0||normalize-space","C":[{"N":"check","card":"?","diag":"0|0||normalize-space","C":[{"N":"attVal","name":"Q{}landingpage"}]}]}]}]},{"N":"elem","name":"alternateIdentifier","sType":"1NE nQ{http://datacite.org/schema/kernel-4}alternateIdentifier ","nsuri":"http://datacite.org/schema/kernel-4","namespaces":"=http://datacite.org/schema/kernel-4 xsi=http://www.w3.org/2001/XMLSchema-instance oai_dc=http://www.openarchives.org/OAI/2.0/oai_dc/ dc=http://purl.org/dc/elements/1.1/","line":"333","C":[{"N":"sequence","sType":"*N ","C":[{"N":"att","name":"alternateIdentifierType","sType":"1NA ","line":"334","C":[{"N":"fn","name":"string-join","role":"select","C":[{"N":"forEach","sType":"*AS ","C":[{"N":"data","sType":"*A ","C":[{"N":"mergeAdj","C":[{"N":"valueOf","sType":"1NT ","C":[{"N":"str","sType":"1AS ","val":"url"}]}]}]},{"N":"fn","name":"string","sType":"1AS ","C":[{"N":"dot"}]}]},{"N":"str","sType":"1AS ","val":""}]}]},{"N":"valueOf","flags":"l","sType":"1NT ","line":"337","C":[{"N":"fn","name":"string-join","role":"select","C":[{"N":"forEach","sType":"*AS ","C":[{"N":"data","sType":"*A ","C":[{"N":"mergeAdj","C":[{"N":"axis","sType":"*NA nQ{}landingpage","name":"attribute","nodeTest":"*NA nQ{}landingpage","ns":"= xml=~ xsl=~ oai_dc=http://www.openarchives.org/OAI/2.0/oai_dc/ dc=http://purl.org/dc/elements/1.1/ xsi=~ ","role":"select","line":"337"}]}]},{"N":"fn","name":"string","sType":"1AS ","C":[{"N":"dot"}]}]},{"N":"str","sType":"1AS ","val":" "}]}]}]}]},{"N":"true"},{"N":"empty","sType":"0 "}]}]},{"N":"templateRule","rank":"6","prec":"0","seq":"7","ns":"xml=~ =http://datacite.org/schema/kernel-4 xsl=~ oai_dc=http://www.openarchives.org/OAI/2.0/oai_dc/ dc=http://purl.org/dc/elements/1.1/ xsi=~","minImp":"0","flags":"s","slots":"200","baseUri":"file:///home/administrator/tethys/tethys.myapp/public/assets2/doi_datacite.xslt","line":"317","module":"doi_datacite.xslt","expand-text":"false","match":"Subject","prio":"0","matches":"NE u[NE nQ{}Subject,NE nQ{http://www.w3.org/1999/xhtml}Subject]","C":[{"N":"p.nodeTest","role":"match","test":"NE u[NE nQ{}Subject,NE nQ{http://www.w3.org/1999/xhtml}Subject]","sType":"1NE u[NE nQ{}Subject,NE nQ{http://www.w3.org/1999/xhtml}Subject]","ns":"= xml=~ xsl=~ oai_dc=http://www.openarchives.org/OAI/2.0/oai_dc/ dc=http://purl.org/dc/elements/1.1/ xsi=~ "},{"N":"choose","sType":"? ","role":"action","line":"318","C":[{"N":"compareToString","op":"ne","val":"","comp":"GAC|http://www.w3.org/2005/xpath-functions/collation/codepoint","sType":"1AB","ns":"= xml=~ xsl=~ oai_dc=http://www.openarchives.org/OAI/2.0/oai_dc/ dc=http://purl.org/dc/elements/1.1/ xsi=~ ","line":"318","C":[{"N":"fn","name":"normalize-space","C":[{"N":"cvUntyped","to":"AS","diag":"0|0||normalize-space","C":[{"N":"check","card":"?","diag":"0|0||normalize-space","C":[{"N":"attVal","name":"Q{}Value"}]}]}]}]},{"N":"elem","name":"subject","sType":"1NE nQ{http://datacite.org/schema/kernel-4}subject ","nsuri":"http://datacite.org/schema/kernel-4","namespaces":"=http://datacite.org/schema/kernel-4 xsi=http://www.w3.org/2001/XMLSchema-instance oai_dc=http://www.openarchives.org/OAI/2.0/oai_dc/ dc=http://purl.org/dc/elements/1.1/","line":"319","C":[{"N":"sequence","sType":"* ","C":[{"N":"choose","sType":"? ","line":"320","C":[{"N":"gc","op":"!=","comp":"GAC|http://www.w3.org/2005/xpath-functions/collation/codepoint","card":"1:1","sType":"1AB","ns":"= xml=~ xsl=~ oai_dc=http://www.openarchives.org/OAI/2.0/oai_dc/ dc=http://purl.org/dc/elements/1.1/ xsi=~ ","line":"320","C":[{"N":"attVal","name":"Q{}Language"},{"N":"str","val":""}]},{"N":"att","name":"xml:lang","sType":"1NA ","nsuri":"http://www.w3.org/XML/1998/namespace","line":"321","C":[{"N":"fn","name":"string-join","role":"select","C":[{"N":"forEach","sType":"*AS ","C":[{"N":"data","sType":"*A ","C":[{"N":"mergeAdj","C":[{"N":"valueOf","sType":"1NT ","flags":"l","line":"322","C":[{"N":"fn","name":"string-join","role":"select","C":[{"N":"forEach","sType":"*AS ","C":[{"N":"data","sType":"*A ","C":[{"N":"mergeAdj","C":[{"N":"axis","sType":"*NA nQ{}Language","name":"attribute","nodeTest":"*NA nQ{}Language","ns":"= xml=~ xsl=~ oai_dc=http://www.openarchives.org/OAI/2.0/oai_dc/ dc=http://purl.org/dc/elements/1.1/ xsi=~ ","role":"select","line":"322"}]}]},{"N":"fn","name":"string","sType":"1AS ","C":[{"N":"dot"}]}]},{"N":"str","sType":"1AS ","val":" "}]}]}]}]},{"N":"fn","name":"string","sType":"1AS ","C":[{"N":"dot"}]}]},{"N":"str","sType":"1AS ","val":""}]}]},{"N":"true"},{"N":"empty","sType":"0 "}]},{"N":"valueOf","flags":"l","sType":"1NT ","line":"325","C":[{"N":"fn","name":"string-join","role":"select","C":[{"N":"forEach","sType":"*AS ","C":[{"N":"data","sType":"*A ","C":[{"N":"mergeAdj","C":[{"N":"axis","sType":"*NA nQ{}Value","name":"attribute","nodeTest":"*NA nQ{}Value","ns":"= xml=~ xsl=~ oai_dc=http://www.openarchives.org/OAI/2.0/oai_dc/ dc=http://purl.org/dc/elements/1.1/ xsi=~ ","role":"select","line":"325"}]}]},{"N":"fn","name":"string","sType":"1AS ","C":[{"N":"dot"}]}]},{"N":"str","sType":"1AS ","val":" "}]}]}]}]},{"N":"true"},{"N":"empty","sType":"0 "}]}]},{"N":"templateRule","rank":"7","prec":"0","seq":"6","ns":"xml=~ =http://datacite.org/schema/kernel-4 xsl=~ oai_dc=http://www.openarchives.org/OAI/2.0/oai_dc/ dc=http://purl.org/dc/elements/1.1/ xsi=~","minImp":"0","flags":"s","slots":"200","baseUri":"file:///home/administrator/tethys/tethys.myapp/public/assets2/doi_datacite.xslt","line":"289","module":"doi_datacite.xslt","expand-text":"false","match":"TitleAdditional","prio":"0","matches":"NE u[NE nQ{}TitleAdditional,NE nQ{http://www.w3.org/1999/xhtml}TitleAdditional]","C":[{"N":"p.nodeTest","role":"match","test":"NE u[NE nQ{}TitleAdditional,NE nQ{http://www.w3.org/1999/xhtml}TitleAdditional]","sType":"1NE u[NE nQ{}TitleAdditional,NE nQ{http://www.w3.org/1999/xhtml}TitleAdditional]","ns":"= xml=~ xsl=~ oai_dc=http://www.openarchives.org/OAI/2.0/oai_dc/ dc=http://purl.org/dc/elements/1.1/ xsi=~ "},{"N":"choose","sType":"? ","role":"action","line":"290","C":[{"N":"compareToString","op":"ne","val":"","comp":"GAC|http://www.w3.org/2005/xpath-functions/collation/codepoint","sType":"1AB","ns":"= xml=~ xsl=~ oai_dc=http://www.openarchives.org/OAI/2.0/oai_dc/ dc=http://purl.org/dc/elements/1.1/ xsi=~ ","line":"290","C":[{"N":"fn","name":"normalize-space","C":[{"N":"cvUntyped","to":"AS","diag":"0|0||normalize-space","C":[{"N":"check","card":"?","diag":"0|0||normalize-space","C":[{"N":"attVal","name":"Q{}Value"}]}]}]}]},{"N":"elem","name":"title","sType":"1NE nQ{http://datacite.org/schema/kernel-4}title ","nsuri":"http://datacite.org/schema/kernel-4","namespaces":"=http://datacite.org/schema/kernel-4 xsi=http://www.w3.org/2001/XMLSchema-instance oai_dc=http://www.openarchives.org/OAI/2.0/oai_dc/ dc=http://purl.org/dc/elements/1.1/","line":"291","C":[{"N":"sequence","sType":"* ","C":[{"N":"choose","sType":"? ","line":"292","C":[{"N":"gc","op":"!=","comp":"GAC|http://www.w3.org/2005/xpath-functions/collation/codepoint","card":"1:1","sType":"1AB","ns":"= xml=~ xsl=~ oai_dc=http://www.openarchives.org/OAI/2.0/oai_dc/ dc=http://purl.org/dc/elements/1.1/ xsi=~ ","line":"292","C":[{"N":"attVal","name":"Q{}Language"},{"N":"str","val":""}]},{"N":"att","name":"xml:lang","sType":"1NA ","nsuri":"http://www.w3.org/XML/1998/namespace","line":"293","C":[{"N":"fn","name":"string-join","role":"select","C":[{"N":"forEach","sType":"*AS ","C":[{"N":"data","sType":"*A ","C":[{"N":"mergeAdj","C":[{"N":"valueOf","sType":"1NT ","flags":"l","line":"294","C":[{"N":"fn","name":"string-join","role":"select","C":[{"N":"forEach","sType":"*AS ","C":[{"N":"data","sType":"*A ","C":[{"N":"mergeAdj","C":[{"N":"axis","sType":"*NA nQ{}Language","name":"attribute","nodeTest":"*NA nQ{}Language","ns":"= xml=~ xsl=~ oai_dc=http://www.openarchives.org/OAI/2.0/oai_dc/ dc=http://purl.org/dc/elements/1.1/ xsi=~ ","role":"select","line":"294"}]}]},{"N":"fn","name":"string","sType":"1AS ","C":[{"N":"dot"}]}]},{"N":"str","sType":"1AS ","val":" "}]}]}]}]},{"N":"fn","name":"string","sType":"1AS ","C":[{"N":"dot"}]}]},{"N":"str","sType":"1AS ","val":""}]}]},{"N":"true"},{"N":"empty","sType":"0 "}]},{"N":"choose","sType":"? ","type":"item()*","line":"297","C":[{"N":"and","sType":"1AB","ns":"= xml=~ xsl=~ oai_dc=http://www.openarchives.org/OAI/2.0/oai_dc/ dc=http://purl.org/dc/elements/1.1/ xsi=~ ","line":"298","C":[{"N":"and","C":[{"N":"gc","op":"!=","comp":"GAC|http://www.w3.org/2005/xpath-functions/collation/codepoint","card":"1:1","C":[{"N":"attVal","name":"Q{}Type"},{"N":"str","val":""}]},{"N":"gc","op":"!=","comp":"GAC|http://www.w3.org/2005/xpath-functions/collation/codepoint","card":"1:1","C":[{"N":"attVal","name":"Q{}Type"},{"N":"str","val":"Sub"}]}]},{"N":"gc","op":"!=","comp":"GAC|http://www.w3.org/2005/xpath-functions/collation/codepoint","card":"1:1","C":[{"N":"attVal","name":"Q{}Type"},{"N":"str","val":"Main"}]}]},{"N":"att","name":"titleType","sType":"1NA ","line":"299","C":[{"N":"fn","name":"string-join","role":"select","C":[{"N":"forEach","sType":"*AS ","C":[{"N":"data","sType":"*A ","C":[{"N":"mergeAdj","C":[{"N":"sequence","sType":"*NT ","C":[{"N":"valueOf","flags":"l","sType":"1NT ","line":"300","C":[{"N":"fn","name":"string-join","role":"select","C":[{"N":"forEach","sType":"*AS ","C":[{"N":"data","sType":"*A ","C":[{"N":"mergeAdj","C":[{"N":"axis","sType":"*NA nQ{}Type","name":"attribute","nodeTest":"*NA nQ{}Type","ns":"= xml=~ xsl=~ oai_dc=http://www.openarchives.org/OAI/2.0/oai_dc/ dc=http://purl.org/dc/elements/1.1/ xsi=~ ","role":"select","line":"300"}]}]},{"N":"fn","name":"string","sType":"1AS ","C":[{"N":"dot"}]}]},{"N":"str","sType":"1AS ","val":" "}]}]},{"N":"valueOf","sType":"1NT ","C":[{"N":"str","sType":"1AS ","val":"Title"}]}]}]}]},{"N":"fn","name":"string","sType":"1AS ","C":[{"N":"dot"}]}]},{"N":"str","sType":"1AS ","val":""}]}]},{"N":"gc","op":"=","comp":"GAC|http://www.w3.org/2005/xpath-functions/collation/codepoint","card":"1:1","sType":"1AB","ns":"= xml=~ xsl=~ oai_dc=http://www.openarchives.org/OAI/2.0/oai_dc/ dc=http://purl.org/dc/elements/1.1/ xsi=~ ","line":"304","C":[{"N":"attVal","name":"Q{}Type"},{"N":"str","val":"Sub"}]},{"N":"att","name":"titleType","sType":"1NA ","line":"305","C":[{"N":"fn","name":"string-join","role":"select","C":[{"N":"forEach","sType":"*AS ","C":[{"N":"data","sType":"*A ","C":[{"N":"mergeAdj","C":[{"N":"sequence","sType":"*NT ","C":[{"N":"valueOf","flags":"l","sType":"1NT ","line":"306","C":[{"N":"fn","name":"string-join","role":"select","C":[{"N":"forEach","sType":"*AS ","C":[{"N":"data","sType":"*A ","C":[{"N":"mergeAdj","C":[{"N":"axis","sType":"*NA nQ{}Type","name":"attribute","nodeTest":"*NA nQ{}Type","ns":"= xml=~ xsl=~ oai_dc=http://www.openarchives.org/OAI/2.0/oai_dc/ dc=http://purl.org/dc/elements/1.1/ xsi=~ ","role":"select","line":"306"}]}]},{"N":"fn","name":"string","sType":"1AS ","C":[{"N":"dot"}]}]},{"N":"str","sType":"1AS ","val":" "}]}]},{"N":"valueOf","sType":"1NT ","C":[{"N":"str","sType":"1AS ","val":"title"}]}]}]}]},{"N":"fn","name":"string","sType":"1AS ","C":[{"N":"dot"}]}]},{"N":"str","sType":"1AS ","val":""}]}]},{"N":"true"},{"N":"empty","sType":"0 "}]},{"N":"valueOf","flags":"l","sType":"1NT ","line":"311","C":[{"N":"fn","name":"string-join","role":"select","C":[{"N":"forEach","sType":"*AS ","C":[{"N":"data","sType":"*A ","C":[{"N":"mergeAdj","C":[{"N":"axis","sType":"*NA nQ{}Value","name":"attribute","nodeTest":"*NA nQ{}Value","ns":"= xml=~ xsl=~ oai_dc=http://www.openarchives.org/OAI/2.0/oai_dc/ dc=http://purl.org/dc/elements/1.1/ xsi=~ ","role":"select","line":"311"}]}]},{"N":"fn","name":"string","sType":"1AS ","C":[{"N":"dot"}]}]},{"N":"str","sType":"1AS ","val":" "}]}]}]}]},{"N":"true"},{"N":"empty","sType":"0 "}]}]},{"N":"templateRule","rank":"8","prec":"0","seq":"5","ns":"xml=~ =http://datacite.org/schema/kernel-4 xsl=~ oai_dc=http://www.openarchives.org/OAI/2.0/oai_dc/ dc=http://purl.org/dc/elements/1.1/ xsi=~","minImp":"0","flags":"s","slots":"200","baseUri":"file:///home/administrator/tethys/tethys.myapp/public/assets2/doi_datacite.xslt","line":"270","module":"doi_datacite.xslt","expand-text":"false","match":"TitleMain","prio":"0","matches":"NE u[NE nQ{}TitleMain,NE nQ{http://www.w3.org/1999/xhtml}TitleMain]","C":[{"N":"p.nodeTest","role":"match","test":"NE u[NE nQ{}TitleMain,NE nQ{http://www.w3.org/1999/xhtml}TitleMain]","sType":"1NE u[NE nQ{}TitleMain,NE nQ{http://www.w3.org/1999/xhtml}TitleMain]","ns":"= xml=~ xsl=~ oai_dc=http://www.openarchives.org/OAI/2.0/oai_dc/ dc=http://purl.org/dc/elements/1.1/ xsi=~ "},{"N":"choose","sType":"? ","role":"action","line":"271","C":[{"N":"compareToString","op":"ne","val":"","comp":"GAC|http://www.w3.org/2005/xpath-functions/collation/codepoint","sType":"1AB","ns":"= xml=~ xsl=~ oai_dc=http://www.openarchives.org/OAI/2.0/oai_dc/ dc=http://purl.org/dc/elements/1.1/ xsi=~ ","line":"271","C":[{"N":"fn","name":"normalize-space","C":[{"N":"cvUntyped","to":"AS","diag":"0|0||normalize-space","C":[{"N":"check","card":"?","diag":"0|0||normalize-space","C":[{"N":"attVal","name":"Q{}Value"}]}]}]}]},{"N":"elem","name":"title","sType":"1NE nQ{http://datacite.org/schema/kernel-4}title ","nsuri":"http://datacite.org/schema/kernel-4","namespaces":"=http://datacite.org/schema/kernel-4 xsi=http://www.w3.org/2001/XMLSchema-instance oai_dc=http://www.openarchives.org/OAI/2.0/oai_dc/ dc=http://purl.org/dc/elements/1.1/","line":"272","C":[{"N":"sequence","sType":"* ","C":[{"N":"choose","sType":"? ","line":"273","C":[{"N":"gc","op":"!=","comp":"GAC|http://www.w3.org/2005/xpath-functions/collation/codepoint","card":"1:1","sType":"1AB","ns":"= xml=~ xsl=~ oai_dc=http://www.openarchives.org/OAI/2.0/oai_dc/ dc=http://purl.org/dc/elements/1.1/ xsi=~ ","line":"273","C":[{"N":"attVal","name":"Q{}Language"},{"N":"str","val":""}]},{"N":"att","name":"xml:lang","sType":"1NA ","nsuri":"http://www.w3.org/XML/1998/namespace","line":"274","C":[{"N":"fn","name":"string-join","role":"select","C":[{"N":"forEach","sType":"*AS ","C":[{"N":"data","sType":"*A ","C":[{"N":"mergeAdj","C":[{"N":"valueOf","sType":"1NT ","flags":"l","line":"275","C":[{"N":"fn","name":"string-join","role":"select","C":[{"N":"forEach","sType":"*AS ","C":[{"N":"data","sType":"*A ","C":[{"N":"mergeAdj","C":[{"N":"axis","sType":"*NA nQ{}Language","name":"attribute","nodeTest":"*NA nQ{}Language","ns":"= xml=~ xsl=~ oai_dc=http://www.openarchives.org/OAI/2.0/oai_dc/ dc=http://purl.org/dc/elements/1.1/ xsi=~ ","role":"select","line":"275"}]}]},{"N":"fn","name":"string","sType":"1AS ","C":[{"N":"dot"}]}]},{"N":"str","sType":"1AS ","val":" "}]}]}]}]},{"N":"fn","name":"string","sType":"1AS ","C":[{"N":"dot"}]}]},{"N":"str","sType":"1AS ","val":""}]}]},{"N":"true"},{"N":"empty","sType":"0 "}]},{"N":"choose","sType":"? ","line":"278","C":[{"N":"and","sType":"1AB","ns":"= xml=~ xsl=~ oai_dc=http://www.openarchives.org/OAI/2.0/oai_dc/ dc=http://purl.org/dc/elements/1.1/ xsi=~ ","line":"278","C":[{"N":"gc","op":"!=","comp":"GAC|http://www.w3.org/2005/xpath-functions/collation/codepoint","card":"1:1","C":[{"N":"attVal","name":"Q{}Type"},{"N":"str","val":""}]},{"N":"gc","op":"!=","comp":"GAC|http://www.w3.org/2005/xpath-functions/collation/codepoint","card":"1:1","C":[{"N":"attVal","name":"Q{}Type"},{"N":"str","val":"Main"}]}]},{"N":"att","name":"titleType","sType":"1NA ","line":"279","C":[{"N":"fn","name":"string-join","role":"select","C":[{"N":"forEach","sType":"*AS ","C":[{"N":"data","sType":"*A ","C":[{"N":"mergeAdj","C":[{"N":"valueOf","sType":"1NT ","flags":"l","line":"280","C":[{"N":"fn","name":"string-join","role":"select","C":[{"N":"forEach","sType":"*AS ","C":[{"N":"data","sType":"*A ","C":[{"N":"mergeAdj","C":[{"N":"axis","sType":"*NA nQ{}Type","name":"attribute","nodeTest":"*NA nQ{}Type","ns":"= xml=~ xsl=~ oai_dc=http://www.openarchives.org/OAI/2.0/oai_dc/ dc=http://purl.org/dc/elements/1.1/ xsi=~ ","role":"select","line":"280"}]}]},{"N":"fn","name":"string","sType":"1AS ","C":[{"N":"dot"}]}]},{"N":"str","sType":"1AS ","val":" "}]}]}]}]},{"N":"fn","name":"string","sType":"1AS ","C":[{"N":"dot"}]}]},{"N":"str","sType":"1AS ","val":""}]}]},{"N":"true"},{"N":"empty","sType":"0 "}]},{"N":"valueOf","flags":"l","sType":"1NT ","line":"283","C":[{"N":"fn","name":"string-join","role":"select","C":[{"N":"forEach","sType":"*AS ","C":[{"N":"data","sType":"*A ","C":[{"N":"mergeAdj","C":[{"N":"axis","sType":"*NA nQ{}Value","name":"attribute","nodeTest":"*NA nQ{}Value","ns":"= xml=~ xsl=~ oai_dc=http://www.openarchives.org/OAI/2.0/oai_dc/ dc=http://purl.org/dc/elements/1.1/ xsi=~ ","role":"select","line":"283"}]}]},{"N":"fn","name":"string","sType":"1AS ","C":[{"N":"dot"}]}]},{"N":"str","sType":"1AS ","val":" "}]}]}]}]},{"N":"true"},{"N":"empty","sType":"0 "}]}]},{"N":"templateRule","rank":"9","prec":"0","seq":"4","ns":"xml=~ =http://datacite.org/schema/kernel-4 xsl=~ oai_dc=http://www.openarchives.org/OAI/2.0/oai_dc/ dc=http://purl.org/dc/elements/1.1/ xsi=~","minImp":"0","flags":"s","slots":"200","baseUri":"file:///home/administrator/tethys/tethys.myapp/public/assets2/doi_datacite.xslt","line":"260","module":"doi_datacite.xslt","expand-text":"false","match":"Identifier","prio":"0","matches":"NE u[NE nQ{}Identifier,NE nQ{http://www.w3.org/1999/xhtml}Identifier]","C":[{"N":"p.nodeTest","role":"match","test":"NE u[NE nQ{}Identifier,NE nQ{http://www.w3.org/1999/xhtml}Identifier]","sType":"1NE u[NE nQ{}Identifier,NE nQ{http://www.w3.org/1999/xhtml}Identifier]","ns":"= xml=~ xsl=~ oai_dc=http://www.openarchives.org/OAI/2.0/oai_dc/ dc=http://purl.org/dc/elements/1.1/ xsi=~ "},{"N":"elem","name":"identifier","sType":"1NE nQ{http://datacite.org/schema/kernel-4}identifier ","nsuri":"http://datacite.org/schema/kernel-4","namespaces":"=http://datacite.org/schema/kernel-4 xsi=http://www.w3.org/2001/XMLSchema-instance oai_dc=http://www.openarchives.org/OAI/2.0/oai_dc/ dc=http://purl.org/dc/elements/1.1/","role":"action","line":"261","C":[{"N":"sequence","sType":"*N ","C":[{"N":"att","name":"identifierType","sType":"1NA ","line":"262","C":[{"N":"fn","name":"string-join","role":"select","C":[{"N":"forEach","sType":"*AS ","C":[{"N":"data","sType":"*A ","C":[{"N":"mergeAdj","C":[{"N":"valueOf","sType":"1NT ","C":[{"N":"str","sType":"1AS ","val":"DOI"}]}]}]},{"N":"fn","name":"string","sType":"1AS ","C":[{"N":"dot"}]}]},{"N":"str","sType":"1AS ","val":""}]}]},{"N":"valueOf","flags":"l","sType":"1NT ","line":"265","C":[{"N":"fn","name":"string-join","role":"select","C":[{"N":"forEach","sType":"*AS ","C":[{"N":"data","sType":"*A ","C":[{"N":"mergeAdj","C":[{"N":"axis","sType":"*NA nQ{}Value","name":"attribute","nodeTest":"*NA nQ{}Value","ns":"= xml=~ xsl=~ oai_dc=http://www.openarchives.org/OAI/2.0/oai_dc/ dc=http://purl.org/dc/elements/1.1/ xsi=~ ","role":"select","line":"265"}]}]},{"N":"fn","name":"string","sType":"1AS ","C":[{"N":"dot"}]}]},{"N":"str","sType":"1AS ","val":" "}]}]}]}]}]},{"N":"templateRule","rank":"10","prec":"0","seq":"3","ns":"xml=~ =http://datacite.org/schema/kernel-4 xsl=~ oai_dc=http://www.openarchives.org/OAI/2.0/oai_dc/ dc=http://purl.org/dc/elements/1.1/ xsi=~","minImp":"0","flags":"s","slots":"200","baseUri":"file:///home/administrator/tethys/tethys.myapp/public/assets2/doi_datacite.xslt","line":"223","module":"doi_datacite.xslt","expand-text":"false","match":"TitleAbstractAdditional","prio":"0","matches":"NE u[NE nQ{}TitleAbstractAdditional,NE nQ{http://www.w3.org/1999/xhtml}TitleAbstractAdditional]","C":[{"N":"p.nodeTest","role":"match","test":"NE u[NE nQ{}TitleAbstractAdditional,NE nQ{http://www.w3.org/1999/xhtml}TitleAbstractAdditional]","sType":"1NE u[NE nQ{}TitleAbstractAdditional,NE nQ{http://www.w3.org/1999/xhtml}TitleAbstractAdditional]","ns":"= xml=~ xsl=~ oai_dc=http://www.openarchives.org/OAI/2.0/oai_dc/ dc=http://purl.org/dc/elements/1.1/ xsi=~ "},{"N":"choose","sType":"? ","role":"action","line":"224","C":[{"N":"compareToString","op":"ne","val":"","comp":"GAC|http://www.w3.org/2005/xpath-functions/collation/codepoint","sType":"1AB","ns":"= xml=~ xsl=~ oai_dc=http://www.openarchives.org/OAI/2.0/oai_dc/ dc=http://purl.org/dc/elements/1.1/ xsi=~ ","line":"224","C":[{"N":"fn","name":"normalize-space","C":[{"N":"cvUntyped","to":"AS","diag":"0|0||normalize-space","C":[{"N":"check","card":"?","diag":"0|0||normalize-space","C":[{"N":"attVal","name":"Q{}Value"}]}]}]}]},{"N":"elem","name":"description","sType":"1NE nQ{http://datacite.org/schema/kernel-4}description ","nsuri":"http://datacite.org/schema/kernel-4","namespaces":"=http://datacite.org/schema/kernel-4 xsi=http://www.w3.org/2001/XMLSchema-instance oai_dc=http://www.openarchives.org/OAI/2.0/oai_dc/ dc=http://purl.org/dc/elements/1.1/","line":"225","C":[{"N":"sequence","sType":"* ","C":[{"N":"att","name":"xml:lang","sType":"1NA ","nsuri":"http://www.w3.org/XML/1998/namespace","line":"226","C":[{"N":"fn","name":"string-join","role":"select","C":[{"N":"forEach","sType":"*AS ","C":[{"N":"data","sType":"*A ","C":[{"N":"mergeAdj","C":[{"N":"valueOf","sType":"1NT ","flags":"l","line":"227","C":[{"N":"fn","name":"string-join","role":"select","C":[{"N":"forEach","sType":"*AS ","C":[{"N":"data","sType":"*A ","C":[{"N":"mergeAdj","C":[{"N":"axis","sType":"*NA nQ{}Language","name":"attribute","nodeTest":"*NA nQ{}Language","ns":"= xml=~ xsl=~ oai_dc=http://www.openarchives.org/OAI/2.0/oai_dc/ dc=http://purl.org/dc/elements/1.1/ xsi=~ ","role":"select","line":"227"}]}]},{"N":"fn","name":"string","sType":"1AS ","C":[{"N":"dot"}]}]},{"N":"str","sType":"1AS ","val":" "}]}]}]}]},{"N":"fn","name":"string","sType":"1AS ","C":[{"N":"dot"}]}]},{"N":"str","sType":"1AS ","val":""}]}]},{"N":"choose","sType":"? ","line":"229","C":[{"N":"gc","op":"!=","comp":"GAC|http://www.w3.org/2005/xpath-functions/collation/codepoint","card":"1:1","sType":"1AB","ns":"= xml=~ xsl=~ oai_dc=http://www.openarchives.org/OAI/2.0/oai_dc/ dc=http://purl.org/dc/elements/1.1/ xsi=~ ","line":"229","C":[{"N":"attVal","name":"Q{}Type"},{"N":"str","val":""}]},{"N":"att","name":"descriptionType","sType":"1NA ","line":"230","C":[{"N":"fn","name":"string-join","role":"select","C":[{"N":"forEach","sType":"*AS ","C":[{"N":"data","sType":"*A ","C":[{"N":"mergeAdj","C":[{"N":"callT","sType":"* ","bSlot":"0","name":"Q{}CamelCaseWord","line":"231","C":[{"N":"withParam","name":"Q{}text","slot":"0","sType":"*NA nQ{}Type","C":[{"N":"axis","name":"attribute","nodeTest":"*NA nQ{}Type","sType":"*NA nQ{}Type","ns":"= xml=~ xsl=~ oai_dc=http://www.openarchives.org/OAI/2.0/oai_dc/ dc=http://purl.org/dc/elements/1.1/ xsi=~ ","role":"select","line":"232"}]}]}]}]},{"N":"fn","name":"string","sType":"1AS ","C":[{"N":"dot"}]}]},{"N":"str","sType":"1AS ","val":""}]}]},{"N":"true"},{"N":"empty","sType":"0 "}]},{"N":"valueOf","flags":"l","sType":"1NT ","line":"236","C":[{"N":"fn","name":"string-join","role":"select","C":[{"N":"forEach","sType":"*AS ","C":[{"N":"data","sType":"*A ","C":[{"N":"mergeAdj","C":[{"N":"axis","sType":"*NA nQ{}Value","name":"attribute","nodeTest":"*NA nQ{}Value","ns":"= xml=~ xsl=~ oai_dc=http://www.openarchives.org/OAI/2.0/oai_dc/ dc=http://purl.org/dc/elements/1.1/ xsi=~ ","role":"select","line":"236"}]}]},{"N":"fn","name":"string","sType":"1AS ","C":[{"N":"dot"}]}]},{"N":"str","sType":"1AS ","val":" "}]}]}]}]},{"N":"true"},{"N":"empty","sType":"0 "}]}]},{"N":"templateRule","rank":"11","prec":"0","seq":"2","ns":"xml=~ =http://datacite.org/schema/kernel-4 xsl=~ oai_dc=http://www.openarchives.org/OAI/2.0/oai_dc/ dc=http://purl.org/dc/elements/1.1/ xsi=~","minImp":"0","flags":"s","slots":"200","baseUri":"file:///home/administrator/tethys/tethys.myapp/public/assets2/doi_datacite.xslt","line":"205","module":"doi_datacite.xslt","expand-text":"false","match":"TitleAbstract","prio":"0","matches":"NE u[NE nQ{}TitleAbstract,NE nQ{http://www.w3.org/1999/xhtml}TitleAbstract]","C":[{"N":"p.nodeTest","role":"match","test":"NE u[NE nQ{}TitleAbstract,NE nQ{http://www.w3.org/1999/xhtml}TitleAbstract]","sType":"1NE u[NE nQ{}TitleAbstract,NE nQ{http://www.w3.org/1999/xhtml}TitleAbstract]","ns":"= xml=~ xsl=~ oai_dc=http://www.openarchives.org/OAI/2.0/oai_dc/ dc=http://purl.org/dc/elements/1.1/ xsi=~ "},{"N":"choose","sType":"? ","role":"action","line":"206","C":[{"N":"compareToString","op":"ne","val":"","comp":"GAC|http://www.w3.org/2005/xpath-functions/collation/codepoint","sType":"1AB","ns":"= xml=~ xsl=~ oai_dc=http://www.openarchives.org/OAI/2.0/oai_dc/ dc=http://purl.org/dc/elements/1.1/ xsi=~ ","line":"206","C":[{"N":"fn","name":"normalize-space","C":[{"N":"cvUntyped","to":"AS","diag":"0|0||normalize-space","C":[{"N":"check","card":"?","diag":"0|0||normalize-space","C":[{"N":"attVal","name":"Q{}Value"}]}]}]}]},{"N":"elem","name":"description","sType":"1NE nQ{http://datacite.org/schema/kernel-4}description ","nsuri":"http://datacite.org/schema/kernel-4","namespaces":"=http://datacite.org/schema/kernel-4 xsi=http://www.w3.org/2001/XMLSchema-instance oai_dc=http://www.openarchives.org/OAI/2.0/oai_dc/ dc=http://purl.org/dc/elements/1.1/","line":"207","C":[{"N":"sequence","sType":"* ","C":[{"N":"att","name":"xml:lang","sType":"1NA ","nsuri":"http://www.w3.org/XML/1998/namespace","line":"208","C":[{"N":"fn","name":"string-join","role":"select","C":[{"N":"forEach","sType":"*AS ","C":[{"N":"data","sType":"*A ","C":[{"N":"mergeAdj","C":[{"N":"valueOf","sType":"1NT ","flags":"l","line":"209","C":[{"N":"fn","name":"string-join","role":"select","C":[{"N":"forEach","sType":"*AS ","C":[{"N":"data","sType":"*A ","C":[{"N":"mergeAdj","C":[{"N":"axis","sType":"*NA nQ{}Language","name":"attribute","nodeTest":"*NA nQ{}Language","ns":"= xml=~ xsl=~ oai_dc=http://www.openarchives.org/OAI/2.0/oai_dc/ dc=http://purl.org/dc/elements/1.1/ xsi=~ ","role":"select","line":"209"}]}]},{"N":"fn","name":"string","sType":"1AS ","C":[{"N":"dot"}]}]},{"N":"str","sType":"1AS ","val":" "}]}]}]}]},{"N":"fn","name":"string","sType":"1AS ","C":[{"N":"dot"}]}]},{"N":"str","sType":"1AS ","val":""}]}]},{"N":"choose","sType":"? ","line":"211","C":[{"N":"gc","op":"!=","comp":"GAC|http://www.w3.org/2005/xpath-functions/collation/codepoint","card":"1:1","sType":"1AB","ns":"= xml=~ xsl=~ oai_dc=http://www.openarchives.org/OAI/2.0/oai_dc/ dc=http://purl.org/dc/elements/1.1/ xsi=~ ","line":"211","C":[{"N":"attVal","name":"Q{}Type"},{"N":"str","val":""}]},{"N":"att","name":"descriptionType","sType":"1NA ","line":"212","C":[{"N":"fn","name":"string-join","role":"select","C":[{"N":"forEach","sType":"*AS ","C":[{"N":"data","sType":"*A ","C":[{"N":"mergeAdj","C":[{"N":"valueOf","sType":"1NT ","C":[{"N":"str","sType":"1AS ","val":"Abstract"}]}]}]},{"N":"fn","name":"string","sType":"1AS ","C":[{"N":"dot"}]}]},{"N":"str","sType":"1AS ","val":""}]}]},{"N":"true"},{"N":"empty","sType":"0 "}]},{"N":"valueOf","flags":"l","sType":"1NT ","line":"216","C":[{"N":"fn","name":"string-join","role":"select","C":[{"N":"forEach","sType":"*AS ","C":[{"N":"data","sType":"*A ","C":[{"N":"mergeAdj","C":[{"N":"axis","sType":"*NA nQ{}Value","name":"attribute","nodeTest":"*NA nQ{}Value","ns":"= xml=~ xsl=~ oai_dc=http://www.openarchives.org/OAI/2.0/oai_dc/ dc=http://purl.org/dc/elements/1.1/ xsi=~ ","role":"select","line":"216"}]}]},{"N":"fn","name":"string","sType":"1AS ","C":[{"N":"dot"}]}]},{"N":"str","sType":"1AS ","val":" "}]}]}]}]},{"N":"true"},{"N":"empty","sType":"0 "}]}]},{"N":"templateRule","rank":"12","prec":"0","seq":"1","ns":"xml=~ =http://datacite.org/schema/kernel-4 xsl=~ oai_dc=http://www.openarchives.org/OAI/2.0/oai_dc/ dc=http://purl.org/dc/elements/1.1/ xsi=~","minImp":"0","flags":"s","slots":"200","baseUri":"file:///home/administrator/tethys/tethys.myapp/public/assets2/doi_datacite.xslt","line":"190","module":"doi_datacite.xslt","expand-text":"false","match":"Coverage","prio":"0","matches":"NE u[NE nQ{}Coverage,NE nQ{http://www.w3.org/1999/xhtml}Coverage]","C":[{"N":"p.nodeTest","role":"match","test":"NE u[NE nQ{}Coverage,NE nQ{http://www.w3.org/1999/xhtml}Coverage]","sType":"1NE u[NE nQ{}Coverage,NE nQ{http://www.w3.org/1999/xhtml}Coverage]","ns":"= xml=~ xsl=~ oai_dc=http://www.openarchives.org/OAI/2.0/oai_dc/ dc=http://purl.org/dc/elements/1.1/ xsi=~ "},{"N":"choose","sType":"? ","role":"action","line":"191","C":[{"N":"and","sType":"1AB","ns":"= xml=~ xsl=~ oai_dc=http://www.openarchives.org/OAI/2.0/oai_dc/ dc=http://purl.org/dc/elements/1.1/ xsi=~ ","line":"191","C":[{"N":"and","C":[{"N":"and","C":[{"N":"compareToString","op":"ne","val":"","comp":"GAC|http://www.w3.org/2005/xpath-functions/collation/codepoint","C":[{"N":"fn","name":"normalize-space","C":[{"N":"cvUntyped","to":"AS","diag":"0|0||normalize-space","C":[{"N":"check","card":"?","diag":"0|0||normalize-space","C":[{"N":"attVal","name":"Q{}XMin"}]}]}]}]},{"N":"compareToString","op":"ne","val":"","comp":"GAC|http://www.w3.org/2005/xpath-functions/collation/codepoint","C":[{"N":"fn","name":"normalize-space","C":[{"N":"cvUntyped","to":"AS","diag":"0|0||normalize-space","C":[{"N":"check","card":"?","diag":"0|0||normalize-space","C":[{"N":"attVal","name":"Q{}XMax"}]}]}]}]}]},{"N":"compareToString","op":"ne","val":"","comp":"GAC|http://www.w3.org/2005/xpath-functions/collation/codepoint","C":[{"N":"fn","name":"normalize-space","C":[{"N":"cvUntyped","to":"AS","diag":"0|0||normalize-space","C":[{"N":"check","card":"?","diag":"0|0||normalize-space","C":[{"N":"attVal","name":"Q{}YMin"}]}]}]}]}]},{"N":"compareToString","op":"ne","val":"","comp":"GAC|http://www.w3.org/2005/xpath-functions/collation/codepoint","C":[{"N":"fn","name":"normalize-space","C":[{"N":"cvUntyped","to":"AS","diag":"0|0||normalize-space","C":[{"N":"check","card":"?","diag":"0|0||normalize-space","C":[{"N":"attVal","name":"Q{}YMax"}]}]}]}]}]},{"N":"elem","name":"geoLocation","sType":"1NE nQ{http://datacite.org/schema/kernel-4}geoLocation ","nsuri":"http://datacite.org/schema/kernel-4","namespaces":"=http://datacite.org/schema/kernel-4 xsi=http://www.w3.org/2001/XMLSchema-instance oai_dc=http://www.openarchives.org/OAI/2.0/oai_dc/ dc=http://purl.org/dc/elements/1.1/","line":"192","C":[{"N":"elem","name":"geoLocationBox","sType":"1NE nQ{http://datacite.org/schema/kernel-4}geoLocationBox ","nsuri":"http://datacite.org/schema/kernel-4","namespaces":"=http://datacite.org/schema/kernel-4 xsi=http://www.w3.org/2001/XMLSchema-instance oai_dc=http://www.openarchives.org/OAI/2.0/oai_dc/ dc=http://purl.org/dc/elements/1.1/","line":"193","C":[{"N":"sequence","sType":"*NE ","C":[{"N":"elem","name":"westBoundLongitude","sType":"1NE nQ{http://datacite.org/schema/kernel-4}westBoundLongitude ","nsuri":"http://datacite.org/schema/kernel-4","namespaces":"=http://datacite.org/schema/kernel-4 xsi=http://www.w3.org/2001/XMLSchema-instance oai_dc=http://www.openarchives.org/OAI/2.0/oai_dc/ dc=http://purl.org/dc/elements/1.1/","line":"194","C":[{"N":"valueOf","flags":"l","sType":"1NT ","C":[{"N":"fn","name":"string-join","role":"select","C":[{"N":"forEach","sType":"*AS ","C":[{"N":"data","sType":"*A ","C":[{"N":"mergeAdj","C":[{"N":"axis","sType":"*NA nQ{}XMin","name":"attribute","nodeTest":"*NA nQ{}XMin","ns":"= xml=~ xsl=~ oai_dc=http://www.openarchives.org/OAI/2.0/oai_dc/ dc=http://purl.org/dc/elements/1.1/ xsi=~ ","role":"select","line":"6"}]}]},{"N":"fn","name":"string","sType":"1AS ","C":[{"N":"dot"}]}]},{"N":"str","sType":"1AS ","val":" "}]}]}]},{"N":"elem","name":"eastBoundLongitude","sType":"1NE nQ{http://datacite.org/schema/kernel-4}eastBoundLongitude ","nsuri":"http://datacite.org/schema/kernel-4","namespaces":"=http://datacite.org/schema/kernel-4 xsi=http://www.w3.org/2001/XMLSchema-instance oai_dc=http://www.openarchives.org/OAI/2.0/oai_dc/ dc=http://purl.org/dc/elements/1.1/","line":"195","C":[{"N":"valueOf","flags":"l","sType":"1NT ","C":[{"N":"fn","name":"string-join","role":"select","C":[{"N":"forEach","sType":"*AS ","C":[{"N":"data","sType":"*A ","C":[{"N":"mergeAdj","C":[{"N":"axis","sType":"*NA nQ{}XMax","name":"attribute","nodeTest":"*NA nQ{}XMax","ns":"= xml=~ xsl=~ oai_dc=http://www.openarchives.org/OAI/2.0/oai_dc/ dc=http://purl.org/dc/elements/1.1/ xsi=~ ","role":"select","line":"8"}]}]},{"N":"fn","name":"string","sType":"1AS ","C":[{"N":"dot"}]}]},{"N":"str","sType":"1AS ","val":" "}]}]}]},{"N":"elem","name":"southBoundLatitude","sType":"1NE nQ{http://datacite.org/schema/kernel-4}southBoundLatitude ","nsuri":"http://datacite.org/schema/kernel-4","namespaces":"=http://datacite.org/schema/kernel-4 xsi=http://www.w3.org/2001/XMLSchema-instance oai_dc=http://www.openarchives.org/OAI/2.0/oai_dc/ dc=http://purl.org/dc/elements/1.1/","line":"196","C":[{"N":"valueOf","flags":"l","sType":"1NT ","C":[{"N":"fn","name":"string-join","role":"select","C":[{"N":"forEach","sType":"*AS ","C":[{"N":"data","sType":"*A ","C":[{"N":"mergeAdj","C":[{"N":"axis","sType":"*NA nQ{}YMin","name":"attribute","nodeTest":"*NA nQ{}YMin","ns":"= xml=~ xsl=~ oai_dc=http://www.openarchives.org/OAI/2.0/oai_dc/ dc=http://purl.org/dc/elements/1.1/ xsi=~ ","role":"select","line":"10"}]}]},{"N":"fn","name":"string","sType":"1AS ","C":[{"N":"dot"}]}]},{"N":"str","sType":"1AS ","val":" "}]}]}]},{"N":"elem","name":"northBoundLatitude","sType":"1NE nQ{http://datacite.org/schema/kernel-4}northBoundLatitude ","nsuri":"http://datacite.org/schema/kernel-4","namespaces":"=http://datacite.org/schema/kernel-4 xsi=http://www.w3.org/2001/XMLSchema-instance oai_dc=http://www.openarchives.org/OAI/2.0/oai_dc/ dc=http://purl.org/dc/elements/1.1/","line":"197","C":[{"N":"valueOf","flags":"l","sType":"1NT ","C":[{"N":"fn","name":"string-join","role":"select","C":[{"N":"forEach","sType":"*AS ","C":[{"N":"data","sType":"*A ","C":[{"N":"mergeAdj","C":[{"N":"axis","sType":"*NA nQ{}YMax","name":"attribute","nodeTest":"*NA nQ{}YMax","ns":"= xml=~ xsl=~ oai_dc=http://www.openarchives.org/OAI/2.0/oai_dc/ dc=http://purl.org/dc/elements/1.1/ xsi=~ ","role":"select","line":"12"}]}]},{"N":"fn","name":"string","sType":"1AS ","C":[{"N":"dot"}]}]},{"N":"str","sType":"1AS ","val":" "}]}]}]}]}]}]},{"N":"true"},{"N":"empty","sType":"0 "}]}]}]}]},{"N":"overridden"},{"N":"output","C":[{"N":"property","name":"Q{http://saxon.sf.net/}stylesheet-version","value":"30"},{"N":"property","name":"method","value":"xml"},{"N":"property","name":"encoding","value":"utf-8"},{"N":"property","name":"indent","value":"yes"}]},{"N":"decimalFormat"}],"Σ":"eb403554"} \ No newline at end of file diff --git a/public/assets2/doi_datacite.xslt b/public/assets2/doi_datacite.xslt index 7ae5fab..e52af64 100644 --- a/public/assets2/doi_datacite.xslt +++ b/public/assets2/doi_datacite.xslt @@ -62,15 +62,19 @@ - - - - - - - - - + + + + + + + + + + + + + @@ -78,22 +82,26 @@ - - - + + + + + - + - - - + + + + + @@ -109,42 +117,46 @@ - - - + + + + + - + - - - - - - - datasets - - - - - - - - - - - - - + + + + + + + + + + datasets + + + + + + + + + + + + + + + + + + + @@ -176,54 +188,54 @@ - - - - - - - - - - - - - - - - + + + + + + + + + + - + + - - - - - - - - Abstract + + + + - - - + + + Abstract + + + + + + + - - - - - - - - - + + + + - - - + + + + + + + + + + @@ -256,6 +268,7 @@ + <xsl:if test="@Language != ''"> <xsl:attribute name="xml:lang"> @@ -269,9 +282,12 @@ </xsl:if> <xsl:value-of select="@Value" /> + + + <xsl:if test="@Language != ''"> <xsl:attribute name="xml:lang"> @@ -294,61 +310,70 @@ </xsl:choose> <xsl:value-of select="@Value" /> + - + - - - - - - - - + + + + + + + + + + - - - url - - - - + + + + url + + + + - - - - - - - - - + + + + + + + + + + + + - - - - - - - - - - - + + + + + + + + + + + + + - - - + + + + + "server_date_modified": " - + + ", + + + + + "embargo_date": " + ", @@ -200,7 +207,8 @@ - + + " " diff --git a/public/favicon-16x16.png b/public/favicon-16x16.png new file mode 100644 index 0000000..c614e7d Binary files /dev/null and b/public/favicon-16x16.png differ diff --git a/public/favicon-32x32.png b/public/favicon-32x32.png new file mode 100644 index 0000000..6886e7b Binary files /dev/null and b/public/favicon-32x32.png differ diff --git a/public/favicon-32x32.png:Zone.Identifier b/public/favicon-32x32.png:Zone.Identifier new file mode 100644 index 0000000..8bcdfdc --- /dev/null +++ b/public/favicon-32x32.png:Zone.Identifier @@ -0,0 +1,3 @@ +[ZoneTransfer] +ZoneId=3 +HostUrl=https://sea1.geoinformation.dev/favicon-32x32.png diff --git a/public/favicon.ico b/public/favicon.ico deleted file mode 100644 index ce3fc0a..0000000 Binary files a/public/favicon.ico and /dev/null differ diff --git a/public/favicon.png b/public/favicon.png deleted file mode 100644 index d3d3eb5..0000000 Binary files a/public/favicon.png and /dev/null differ diff --git a/public/favicon.svg b/public/favicon.svg new file mode 100644 index 0000000..eb81bca --- /dev/null +++ b/public/favicon.svg @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/public/site.webmanifest b/public/site.webmanifest new file mode 100644 index 0000000..45dc8a2 --- /dev/null +++ b/public/site.webmanifest @@ -0,0 +1 @@ +{"name":"","short_name":"","icons":[{"src":"/android-chrome-192x192.png","sizes":"192x192","type":"image/png"},{"src":"/android-chrome-512x512.png","sizes":"512x512","type":"image/png"}],"theme_color":"#ffffff","background_color":"#ffffff","display":"standalone"} \ No newline at end of file diff --git a/readme.md b/readme.md index 0fd7e64..7d032ce 100644 --- a/readme.md +++ b/readme.md @@ -11,6 +11,8 @@ Welcome to the Tethys Research Repository Backend System! This is the backend co - [Configuration](#configuration) - [Database](#database) - [API Documentation](#api-documentation) +- [Commands](#commands) +- [Documentation](#documentation) - [Contributing](#contributing) - [License](#license) @@ -29,5 +31,175 @@ Before you begin, ensure you have met the following requirements: 1. Clone this repository: ```bash - git clone https://gitea.geologie.ac.at/geolba/tethys.backend.git + git clone git clone https://gitea.geologie.ac.at/geolba/tethys.backend.git + cd tethys-backend ``` + +2. Install dependencies: + + ```bash + npm install + ``` + +3. Configure environment variables (see [Configuration](#configuration)) + +4. Run database migrations: + + ```bash + node ace migration:run + ``` + +5. Start the development server: + + ```bash + npm run dev + ``` + +## Usage + +The Tethys Backend provides RESTful APIs for managing research datasets, user authentication, DOI registration, and search functionality. + +## Configuration + +Copy the `.env.example` file to `.env` and configure the following variables: + +### Database Configuration +```bash +DB_CONNECTION=pg +DB_HOST=localhost +DB_PORT=5432 +DB_USER=your_username +DB_PASSWORD=your_password +DB_DATABASE=tethys_db +``` + +### DataCite Configuration +```bash +# DataCite Credentials +DATACITE_USERNAME=your_datacite_username +DATACITE_PASSWORD=your_datacite_password +DATACITE_PREFIX=10.21388 + +# Environment-specific API endpoints +DATACITE_API_URL=https://api.test.datacite.org # Test environment +DATACITE_SERVICE_URL=https://mds.test.datacite.org # Test MDS + +# For production: +# DATACITE_API_URL=https://api.datacite.org +# DATACITE_SERVICE_URL=https://mds.datacite.org +``` + +### OpenSearch Configuration +```bash +OPENSEARCH_HOST=localhost:9200 +``` + +### Application Configuration +```bash +BASE_DOMAIN=tethys.at +APP_KEY=your_app_key +``` + +## Database + +The system uses PostgreSQL with Lucid ORM. Key models include: + +- **Dataset**: Research dataset metadata +- **DatasetIdentifier**: DOI and other identifiers for datasets +- **User**: User management and authentication +- **XmlCache**: Cached XML metadata + +Run migrations and seeders: + +```bash +# Run migrations +node ace migration:run + +# Run seeders (if available) +node ace db:seed +``` + +## API Documentation + +API endpoints are available for: + +- Dataset management (`/api/datasets`) +- User authentication (`/api/auth`) +- DOI registration (`/api/doi`) +- Search functionality (`/api/search`) + +*Detailed API documentation can be found in the `/docs/api` directory.* + +## Commands + +The system includes several Ace commands for maintenance and data management: + +### Dataset Indexing +```bash +# Index all published datasets to OpenSearch +node ace index:datasets + +# Index a specific dataset +node ace index:datasets --publish_id 123 +``` + +### DataCite DOI Management +```bash +# Update DataCite records for modified datasets +node ace update:datacite + +# Show detailed statistics for datasets needing updates +node ace update:datacite --stats + +# Preview what would be updated (dry run) +node ace update:datacite --dry-run + +# Force update all DOI records +node ace update:datacite --force + +# Update a specific dataset +node ace update:datacite --publish_id 123 +``` + +*For detailed command documentation, see the [Commands Documentation](docs/commands/)* + +## Documentation + +Comprehensive documentation is available in the `/docs` directory: + +- **[Commands Documentation](docs/commands/)** - Detailed guides for Ace commands + - [DataCite Update Command](docs/commands/update-datacite.md) - DOI synchronization and management + - [Dataset Indexing Command](docs/commands/index-datasets.md) - Search index management +- **[API Documentation](docs/api/)** - REST API endpoints and usage +- **[Deployment Guide](docs/deployment/)** - Production deployment instructions +- **[Configuration Guide](docs/configuration/)** - Environment setup and configuration options + +## Contributing + +1. Fork the repository +2. Create a feature branch (`git checkout -b feature/amazing-feature`) +3. Commit your changes (`git commit -m 'Add some amazing feature'`) +4. Push to the branch (`git push origin feature/amazing-feature`) +5. Open a Pull Request + +### Development Guidelines + +- Follow the existing code style and conventions +- Write tests for new features +- Update documentation for any API changes +- Ensure all commands and migrations work properly + +### Testing Commands + +```bash +# Run tests +npm test + +# Test specific commands +node ace update:datacite --dry-run --publish_id 123 +node ace index:datasets --publish_id 123 +``` + +## License + +This project is licensed under the [MIT License](LICENSE). \ No newline at end of file diff --git a/resources/css/app.css b/resources/css/app.css index 1347a65..0301a3a 100644 --- a/resources/css/app.css +++ b/resources/css/app.css @@ -1,19 +1,20 @@ /* @import url('https://fonts.googleapis.com/css2?family=Poppins:wght@400;500&display=swap'); */ /* @import url('https://fonts.googleapis.com/css?family=Roboto:400,400i,600,700'); */ -@tailwind base; -@tailwind components; -@tailwind utilities; - -@import '_checkbox-radio-switch.css'; +/* @import '_checkbox-radio-switch.css'; */ @import '_progress.css'; @import '_scrollbars.css'; @import '_table.css'; -@import '~leaflet/dist/leaflet.css'; +/* @import '~leaflet/dist/leaflet.css'; */ +@import '~/leaflet/dist/leaflet.css'; @import '@fontsource/inter/index.css'; @import '@fontsource/archivo-black/index.css'; + +@tailwind base; +@tailwind components; +@tailwind utilities; :root { --color-main-background: #ffffff; --color-main-background-rgb: 255,255,255; @@ -108,6 +109,9 @@ --radius: 15; --pi: 3.14159265358979; } +.leaflet-container .leaflet-pane { + z-index: 30!important; +} /* @layer base { html, diff --git a/resources/js/Components/.FormField.vue.swo b/resources/js/Components/.FormField.vue.swo new file mode 100644 index 0000000..b00c9b9 Binary files /dev/null and b/resources/js/Components/.FormField.vue.swo differ diff --git a/resources/js/Components/AsideMenuItem.vue b/resources/js/Components/AsideMenuItem.vue index 4e52d40..158e80e 100644 --- a/resources/js/Components/AsideMenuItem.vue +++ b/resources/js/Components/AsideMenuItem.vue @@ -1,162 +1,147 @@ diff --git a/resources/js/Components/AsideMenuLayer.vue b/resources/js/Components/AsideMenuLayer.vue index 7617136..6e6c5b0 100644 --- a/resources/js/Components/AsideMenuLayer.vue +++ b/resources/js/Components/AsideMenuLayer.vue @@ -36,13 +36,24 @@ const logoutItemClick = async () => { await router.post(stardust.route('logout')); }; -const menuClick = (event, item) => { +interface MenuItem { + name: string; + label: string; + icon: string; + color: string; + link: string; +} + +const menuClick = (event: Event, item: MenuItem) => { emit('menu-click', event, item); };