From fba28b30ee94db9823c6891867cf561560433651 Mon Sep 17 00:00:00 2001 From: Alban Mouton Date: Wed, 22 Jan 2025 19:23:07 +0100 Subject: [PATCH] refactor: new major version (#77) * chore: deactivate quality checks for refactor branch * chore: remove deprecated doc * chore: move stuff into api directory * chore: upgrade node version and docker/github build * chore: work on dev env * chore: move ui source code into vite app * chore: move stuff around in api folder * chore: work on api types * chore: some setup for api * chore: apply linter fix * refactor: work on tokens and keys management * refactor: work on storages manager * refactor: work on storages manager * refactor: move routers into topical folders * refactor: fix some imports * refactor: use reqUser accessor * refactor: replace shortid with nanoid * refactor: broken import to events log * refactor: fix some imports * refactor: replace all commonjs exports with esm * refactor: work on password and keys management * refactor: work on i18n * refactor: work on 2fa and sites management * refactor: typed anonymous actions router * refactor: worked on avatars management * refactor: work on invitations and mongo storage typing * refactor: work on invitations and tokens * refactor: types for mails utils * refactor: types for oauth tokens utils * refactor: work on ontypes of organizations router * refactor: oauth typing * refactor: types for saml2 utils * refactor: use mongoPagination and mongoSort utils * refactor: types of webhooks utils * refactor: types of limiter utils * refactor: better orgStorage management * refactor: sites routes typing * refactor: types of limits router * refactor: some more typings and structuring * refactor: some more restructurung * refactor: some more restructuring * refactor: typing of users router * refactor: work on typing of auth routes * refactor: auth router typing * refactor: typings ofr storages * refactor: organize imports * refactor: dynamic import of validation functions * refactor: work on express initialization * refactor: some more work on api app * refactor: work on express app init * chore: move deprecated tests * refactor: work on tests * refactor: work on tests * refactor: work on tests * refactor: work on ldap tests * refactor: work on ldap tests * refactor: work on user creation * refactor: work on ldap tests * refactor: work on tests * refactor: work on tests * refactor: test suite passes * test: add a simple oidc workflow test * refactor: work on testing sign keys rotation * chore: apply linter * fix: some typing problems * test: add a test of core id oauth tokens refresh * refactor: start working on ui * refactor: work on ui * refactor: ui home page is ok * refactor: work on login page * refactor: work on vuetify theme init * refactor: work on vue 3 migration * refactor: work on colors management * refactor: keep working on vue 3 ui * refactor: more components and pages moved to vue 3 * refactor: more components and pages moved to vue 3 * feat: work on color management * fix: small bugs in ui code * feat: work on auth providers links * fix: broken avatar creation * refactor: small changes in ui code * refactor: use of VForm * chore: upgrade linter * refactor: work on vue 3 ui * refactor: work on vue 3 ui * refactor: download webfont * refactor: use a separate exchange token * refactor: fix broken tests * feat: work on sites separated by path * feat: sessions management UI * feat: work on sessions management * fix: broken session deletion * refactor: work on error management in login page * chore: composable is now named useAsyncAction * chore: upgrage node image * chore: linter errors * fix: page file names * refactor: work on some regressions * refactor: some more work on vue 3 ui * refactor: work on sites management * refactor: a few changes to site management * chore: linter errors * refactor: make all quality checks pass * chore: reactivate husky checks * fix: broken docker build * feat: manage default webfont * fix: format of CLEANUP_DELETE_INACTIVE_DELAY env vatr * fix: manage retro-compatibility with STORAGE_MONGO_URL and STORAGE_MONGO_CLIENT_OPTIONS * fix: broken creation of saml certificate * fix: broken creation of saml certificate * fix: missing user.isAdmin after calling getUser from storage * fix: small UI problem when using 2FA * fix: constraint on logo size in login page * fix: getting org info from all accounts * feat: work on auth from one site to another * feat: keep working on other site redirect * fix: reference error in UI code * fix: error in url path * chore: better delayed rendering * fix: manage retro-compat with old volume directories * chore: upgrade lib-express * fix: always expose sites express router * chore: slightly better cookies options * fix: broken definition of secure cookie * fix: typo in route path * fix: broken error display * fix: typo in route path * fix: some problems in admin vue of organization * fix: some problems in config stucture * fix: mussing get on user limits * fix: color typing error * fix: list of oauth standard providers was not filtered * fix: bug fix in data-fair lib * fix: small ui problems * chore: broken tests * fix: broken links * fix: missing i18n messages in UI * chore: style of links * fix: some regressions in departments and members management * fix: some regression in partners management * fix: some problems with avatar rendering * fix: prevent accumulating sessions * fix: some UI problems * fix: error in env var name * fix: broken org select in me page * fix: broken edition of birthday * feat: try to get old saml certificates * feat: onlyCreateInvited option is not applied on coreIdProviders * fix: comparison of coreId auth provider * fix: comparison of coreId auth provider * fix: broken pagination in admin pages * fix: refresh after user deletion * chore: use events and d-frame instead of v-iframe and notify * chore: add debug * fix: missing application of manageSessions env var * chore: add debug logs * fix: prevent mutating sessions array * fix: all properties in patch body are nullable * fix: error in passwordless schema * fix: error in change host api request * fix: broken patch of member * feat: work on multi-site management * fix: 2FA info of orga is not required * fix: build error * feat: work on sites and colors management * feat: show site color warnings * feat: work on themes management * feat: work on theme management * chore: upgrade vuetify * fix: prevent unnecessary scroll on tab change * fix: missing init of hcDark when creating a site * fix: missing upgrade directory * fix: missing stuff in upgrade script * feat: work on colors preview * perf: faster update of colors in colors preview * feat: work on themes edition * chore: small improvements in site edit * fix: broken docker build * fix: wrong theme returned in _public endpoint * fix: wrong theme returned in _public endpoint * feat: work on assisted theme edition * fix: missing tinycolor2 in ui * chore: work on cross workspaces references * fix: error in _theme.css * chore: upgrade vjsf * refactor: work on events queue integration * chore: debug events queue init * fix: export of events queue util * fix: broken __all method in i18n utils * chore: upgrade lib-node * fix: prevent flicking effect by waiting for router readiness before mounting * feat: improve users and orgs search fields * chore: use white background for older portals * fix: broken asAdmin mode with server session storage * feat: work on retro-compatibility of post site endpoint * chore: add debug logs * fix: small problem with theme filling * chore: show site info on top of edit page * fix: small retro-compatiibility bug in itentities webhook * chore: add transparent background rule in print mode * fix: missing authOnlyOtherSite in sitePublic info * fix: broken double redirect on sso config * chore: add debug logs * fix: add filter on sites suggested for auth on onlyOtherSite mode * fix: missing patchable properties for admins * fix: type of user.2FA * fix: margin problem in 2fa config * fix: broken partner invitation * fix: updat lib-vue * fix: department admin should be able to read org limits * fix: broken switch to newly created orga after invitation * fix: broken redirect after org creation * feat: add link to org page from sites list * fix: broken select of redirect site when inviting member * fix: missing theme env vars * chore: disable alternative themes by default * chore: add debug logs * chore: add debug logs * fix: closing menu too early * chore: remove debug watcher * feat: accept tokens signed by a key before the introduction of the exchange token * fix: broken signature keys rotation * fix: prevent error when updating session lst logged date * chore: add debug logs * fix: some problems when reusing deprecated secrets * chore: add some TODOs * chore: apply last version number --- .dockerignore | 10 +- .eslintignore | 7 - .github/release.yaml | 23 + .github/workflows/build.yml | 76 - .github/workflows/commits.yml | 21 + .github/workflows/conventional-label.yaml | 12 + .github/workflows/pull-requests.yml | 9 + .github/workflows/releases.yml | 27 + .github/workflows/reuse-build.yml | 51 + .github/workflows/reuse-quality.yml | 22 + .gitignore | 20 +- .husky/commit-msg | 3 - .husky/pre-commit | 3 - .husky/pre-push | 7 +- .zellij.kdl | 17 +- CONTRIBUTING.md | 10 +- Dockerfile | 169 +- FUNDING.yml | 1 + api/config/custom-environment-variables.cjs | 292 + api/config/default.cjs | 386 + .../config/development.cjs | 46 +- .../config/production.cjs | 0 api/config/test.cjs | 46 + api/config/type/index.ts | 1 + api/config/type/schema.json | 1007 + api/contract/JWK.ts | 19 + .../api-docs.js => api/contract/api-docs.ts | 14 +- api/contract/contact-mail.ts | 17 + api/contract/mail.ts | 39 + api/doc/auth/post-action-req/index.d.ts | 1 + api/doc/auth/post-action-req/index.ts | 1 + api/doc/auth/post-action-req/schema.js | 22 + api/doc/auth/post-password-req/index.ts | 1 + api/doc/auth/post-password-req/schema.js | 34 + api/doc/auth/post-passwordless-req/index.ts | 1 + api/doc/auth/post-passwordless-req/schema.js | 33 + api/doc/auth/post-token-callback-req/index.ts | 1 + .../auth/post-token-callback-req/schema.js | 21 + api/doc/invitations/post-req/index.ts | 1 + api/doc/invitations/post-req/schema.json | 23 + .../organizations/patch-member-req/index.ts | 1 + .../organizations/patch-member-req/schema.js | 32 + api/doc/organizations/patch-req/index.ts | 1 + api/doc/organizations/patch-req/schema.js | 19 + .../post-partner-accept-req/index.ts | 1 + .../post-partner-accept-req/schema.js | 30 + .../organizations/post-partner-req/index.ts | 1 + .../organizations/post-partner-req/schema.js | 33 + api/doc/organizations/post-req/index.ts | 1 + api/doc/organizations/post-req/schema.js | 19 + api/doc/sites/list-req/index.ts | 1 + api/doc/sites/list-req/schema.json | 25 + api/doc/sites/patch-req-body/index.ts | 1 + api/doc/sites/patch-req-body/schema.js | 24 + api/doc/sites/post-req-body/index.ts | 1 + api/doc/sites/post-req-body/schema.js | 15 + api/doc/users/patch-req/index.ts | 1 + api/doc/users/patch-req/schema.js | 20 + api/doc/users/post-host-req/index.ts | 1 + api/doc/users/post-host-req/schema.js | 25 + api/doc/users/post-password-req/index.ts | 1 + api/doc/users/post-password-req/schema.js | 25 + api/doc/users/post-req/index.ts | 1 + api/doc/users/post-req/schema.js | 32 + {i18n => api/i18n}/de.js | 2 +- {i18n => api/i18n}/en.js | 31 +- {i18n => api/i18n}/es.js | 2 +- {i18n => api/i18n}/fr.js | 43 +- api/i18n/index.ts | 63 + {i18n => api/i18n}/it.js | 2 +- api/i18n/messages.ts | 27 + {i18n => api/i18n}/pt.js | 2 +- api/index.ts | 17 + api/package.json | 60 + .../resources/nunito-ttf/Nunito-ExtraBold.ttf | Bin .../scripts/admin-credentials.ts | 14 +- api/scripts/trigger-webhooks.ts | 17 + api/src/2fa/router.ts | 65 + api/src/2fa/service.ts | 27 + api/src/accounts/router.ts | 67 + api/src/admin/router.ts | 19 + api/src/anonymous-action/router.ts | 23 + api/src/app.ts | 81 + api/src/auth/providers.ts | 56 + api/src/auth/router.ts | 1021 + api/src/auth/service.ts | 84 + api/src/avatars/router.ts | 116 + api/src/avatars/service.ts | 18 + api/src/config.ts | 38 + api/src/events-queue.ts | 22 + api/src/invitations/router.ts | 280 + api/src/invitations/service.ts | 36 + api/src/limits/router.ts | 70 + api/src/limits/service.ts | 33 + {server => api/src}/mails/mail-nobutton.mjml | 0 {server => api/src}/mails/mail.mjml | 0 .../mails.js => api/src/mails/router.ts | 101 +- api/src/mails/service.ts | 58 + api/src/mails/transport.ts | 34 + api/src/mongo.ts | 133 + api/src/oauth-tokens/router.ts | 12 + api/src/oauth-tokens/service.ts | 46 + api/src/oauth/oidc.ts | 75 + api/src/oauth/service.ts | 167 + api/src/oauth/standard-providers.ts | 198 + api/src/organizations/router.ts | 462 + api/src/saml2/service.ts | 137 + api/src/server.ts | 74 + api/src/services.ts | 14 + api/src/sites/router.ts | 216 + api/src/sites/service.ts | 99 + api/src/storages/file.ts | 298 + api/src/storages/index.ts | 85 + api/src/storages/interface.ts | 80 + api/src/storages/ldap.ts | 655 + api/src/storages/mongo.ts | 479 + api/src/tokens/jwk.d.ts | 1 + api/src/tokens/keys-manager.ts | 131 + api/src/tokens/router.ts | 10 + api/src/tokens/service.ts | 250 + api/src/ui-config.ts | 34 + api/src/users/router.ts | 335 + api/src/users/worker.ts | 110 + api/src/utils/cipher.ts | 34 + api/src/utils/color.ts | 44 + api/src/utils/limiter.ts | 20 + .../metrics.js => api/src/utils/metrics.ts | 58 +- api/src/utils/partners.ts | 20 + api/src/utils/passwords.ts | 43 + api/src/utils/user-name.ts | 9 + api/src/webhooks/service.ts | 44 + api/types/index.ts | 65 + api/types/invitation/index.ts | 1 + api/types/invitation/schema.json | 33 + api/types/ldap-params/index.ts | 1 + api/types/ldap-params/schema.js | 150 + api/types/limits/index.ts | 1 + api/types/limits/schema.json | 36 + api/types/organization/index.ts | 1 + api/types/organization/schema.js | 135 + api/types/partial/index.ts | 1 + api/types/partial/schema.json | 29 + api/types/partner/index.ts | 1 + api/types/partner/schema.js | 15 + api/types/site-public/index.ts | 1 + {types => api/types}/site-public/schema.json | 12 +- api/types/site/index.ts | 1 + api/types/site/schema.js | 371 + api/types/user/index.ts | 1 + api/types/user/schema.js | 218 + commitlint.config.js | 2 +- config/custom-environment-variables.js | 353 - config/default.js | 281 - config/test.js | 55 - contract/JWK.json | 19 - contract/contact-mail.json | 17 - contract/mail.json | 39 - contract/organization.json | 116 - contract/user.json | 66 - {test => dev}/resources/ldap-user.ldif | 0 dev/resources/nginx.conf | 191 + {test => dev}/resources/organizations.json | 9 + {test => dev}/resources/users.json | 13 +- doc/layouts/default.vue | 117 - doc/nuxt.config.js | 49 - doc/pages/doc/_id.vue | 90 - doc/pages/doc/about-en.md | 3 - doc/pages/doc/about-fr.md | 31 - doc/pages/doc/config-en.md | 19 - doc/pages/doc/config-fr.md | 21 - doc/pages/doc/install-en.md | 3 - doc/pages/doc/install-fr.md | 3 - doc/pages/doc/use-en.md | 3 - doc/pages/doc/use-fr.md | 3 - doc/pages/index.vue | 31 - doc/plugins/vuetify.js | 7 - docker-compose.yml | 69 +- eslint.config.mjs | 8 + i18n/index.js | 76 - nodemon.json | 5 - nuxt.config.js | 153 - package-lock.json | 31058 ++++------------ package.json | 204 +- patches/@nuxt+server+2.18.1.patch | 13 - patches/samlify+2.8.8.patch | 105 - public/assets/variables.scss | 1 - public/components/add-department-menu.vue | 94 - public/components/add-member-menu.vue | 193 - public/components/add-partner-menu.vue | 130 - .../components/auth-providers-login-links.vue | 121 - public/components/cancel-deletion.vue | 38 - public/components/change-host.vue | 81 - public/components/delete-department-menu.vue | 95 - public/components/edit-department-menu.vue | 91 - public/components/load-avatar.vue | 146 - public/components/logo.vue | 166 - public/components/notify-menu.vue | 40 - .../components/organization-departments.vue | 204 - public/components/organization-members.vue | 334 - public/components/organization-partners.vue | 169 - public/components/organization-storage.vue | 127 - public/components/partner-invitation.vue | 197 - .../components/resend-partner-invitation.vue | 118 - public/components/site-patch.vue | 107 - public/components/site-post.vue | 109 - public/components/v-jsf.vue | 35 - public/event-bus.js | 4 - public/layouts/default.vue | 300 - public/layouts/error.vue | 19 - public/pages/admin/oauth-tokens.vue | 70 - public/pages/admin/organizations.vue | 255 - public/pages/admin/sites.vue | 164 - public/pages/admin/users.vue | 429 - public/pages/api-doc.vue | 28 - public/pages/invitation.vue | 54 - public/pages/login.vue | 1082 - public/pages/me.vue | 402 - .../_id/department/_departmentId.vue | 87 - public/pages/organization/_id/index.vue | 195 - public/plugins/analytics.js | 6 - public/plugins/axios.js | 9 - public/plugins/iframe-resizer.js | 5 - public/plugins/moment.js | 4 - public/plugins/query-params.js | 17 - public/plugins/session.js | 25 - public/plugins/site-public.js | 13 - public/plugins/vuetify.js | 11 - public/static/favicon.ico | Bin 1150 -> 0 bytes public/store/index.js | 107 - public/store/style.js | 82 - scripts/trigger-webhooks.js | 17 - server/app.js | 284 - server/index.js | 19 - server/mails/index.js | 55 - server/nuxt.js | 19 - server/resources/nunito-ttf/Nunito-Black.ttf | Bin 131568 -> 0 bytes .../nunito-ttf/Nunito-BlackItalic.ttf | Bin 134488 -> 0 bytes server/resources/nunito-ttf/Nunito-Bold.ttf | Bin 131672 -> 0 bytes .../nunito-ttf/Nunito-BoldItalic.ttf | Bin 134540 -> 0 bytes .../nunito-ttf/Nunito-ExtraBoldItalic.ttf | Bin 134576 -> 0 bytes .../nunito-ttf/Nunito-ExtraLight.ttf | Bin 131548 -> 0 bytes .../nunito-ttf/Nunito-ExtraLightItalic.ttf | Bin 134516 -> 0 bytes server/resources/nunito-ttf/Nunito-Italic.ttf | Bin 134664 -> 0 bytes server/resources/nunito-ttf/Nunito-Light.ttf | Bin 131756 -> 0 bytes .../nunito-ttf/Nunito-LightItalic.ttf | Bin 134816 -> 0 bytes server/resources/nunito-ttf/Nunito-Medium.ttf | Bin 131844 -> 0 bytes .../nunito-ttf/Nunito-MediumItalic.ttf | Bin 134744 -> 0 bytes .../resources/nunito-ttf/Nunito-Regular.ttf | Bin 131736 -> 0 bytes .../resources/nunito-ttf/Nunito-SemiBold.ttf | Bin 131704 -> 0 bytes .../nunito-ttf/Nunito-SemiBoldItalic.ttf | Bin 134572 -> 0 bytes server/routers/2fa.js | 86 - server/routers/anonymous-action.js | 20 - server/routers/auth.js | 1167 - server/routers/avatars.js | 121 - server/routers/invitations.js | 306 - server/routers/oauth-tokens.js | 11 - server/routers/organizations.js | 500 - server/routers/sites.js | 75 - server/routers/users.js | 369 - server/storages/file.js | 182 - server/storages/index.js | 51 - server/storages/ldap.js | 560 - server/storages/mongo.js | 578 - server/utils/async-wrap.js | 4 - server/utils/axios.js | 28 - server/utils/dayjs.js | 10 - server/utils/find.js | 28 - server/utils/invitations.js | 32 - server/utils/limiter.js | 22 - server/utils/limits.js | 124 - server/utils/locks.js | 55 - server/utils/metrics.js | 28 - server/utils/mongo.js | 13 - server/utils/notifications.js | 13 - server/utils/oauth.js | 353 - server/utils/partners.js | 18 - server/utils/passwords.js | 67 - server/utils/saml2.js | 77 - server/utils/tokens.js | 220 - server/utils/user-name.js | 8 - server/webhooks.js | 32 - shared/package.json | 10 + shared/site.ts | 76 + test-it/file-storage.ts | 135 + test-it/i18n.ts | 37 + .../invitations.js => test-it/invitations.ts | 115 +- test-it/jwks.ts | 79 + test-it/ldap-api.ts | 47 + test-it/ldap-per-org-file.ts | 60 + test-it/ldap-per-org-mongo.ts | 64 + test-it/ldap-storage-single-org.ts | 53 + test-it/ldap-storage.ts | 78 + test/file/mails.js => test-it/mails.ts | 27 +- test-it/oidc-core-id.ts | 108 + test-it/oidc.ts | 68 + .../members.js => test-it/organizations.ts | 110 +- test-it/session.ts | 111 + test-it/sites.ts | 63 + test/mongo/users.js => test-it/users.ts | 56 +- test-it/utils/index.ts | 97 + test/.eslintrc.js | 5 - test/file/auth.js | 36 - test/file/i18n.js | 36 - test/file/organizations.js | 39 - test/file/setup-teardown.js | 27 - test/file/storage-ldap-per-org.js | 66 - test/file/storage.js | 27 - test/file/users.js | 56 - test/ldap/setup-teardown.js | 27 - test/ldap/storage-ldap-single-org.js | 54 - test/ldap/storage-ldap.js | 82 - test/mongo/oidc.js | 15 - test/mongo/organizations.js | 30 - test/mongo/partners.js | 45 - test/mongo/setup-teardown.js | 38 - test/mongo/sites.js | 34 - test/resources/nginx.conf | 109 - test/resources/test.key | 28 - test/resources/test.key.pub | 9 - test/utils.js | 48 - tsconfig.json | 7 +- tsconfig.tests.json | 7 + types/partner-accept/index.mjs | 1 - types/partner-accept/schema.json | 20 - types/partner-post/index.mjs | 1 - types/partner-post/schema.json | 20 - types/site-patch/index.mjs | 1 - types/site-patch/schema.json | 35 - types/site-post/index.mjs | 1 - types/site-post/schema.json | 27 - types/site-public/index.mjs | 1 - types/site/index.mjs | 1 - types/site/schema.json | 207 - types/sites-query/index.mjs | 1 - types/sites-query/schema.json | 14 - types/sites-response-public/index.mjs | 1 - types/sites-response-public/schema.json | 20 - types/sites-response/index.mjs | 1 - types/sites-response/schema.json | 20 - ui/.gitignore | 26 + ui/dts/auto-imports.d.ts | 285 + ui/dts/components.d.ts | 41 + ui/dts/typed-router.d.ts | 36 + ui/eslint.config.mjs | 30 + ui/index.html | 16 + ui/package.json | 47 + {doc/static => ui/public}/favicon.ico | Bin .../XRXV3I6Li01BKofIMeaBXso-C3IBG1kp.woff2 | Bin 0 -> 20708 bytes .../fonts/XRXV3I6Li01BKofINeaB-BaTF6Vo7.woff2 | Bin 0 -> 39124 bytes .../XRXV3I6Li01BKofIO-aBXso-DcJfvmGA.woff2 | Bin 0 -> 34608 bytes .../XRXV3I6Li01BKofIOOaBXso-BWI5zH9R.woff2 | Bin 0 -> 28868 bytes .../XRXV3I6Li01BKofIOuaBXso-B55YuedR.woff2 | Bin 0 -> 12960 bytes .../XRXX3I6Li01BKofIMNaDRs4-BbMn9XSX.woff2 | Bin 0 -> 41800 bytes .../XRXX3I6Li01BKofIMNaHRs71cA-Cznx39fA.woff2 | Bin 0 -> 22872 bytes .../XRXX3I6Li01BKofIMNaMRs71cA-CuWrHpFO.woff2 | Bin 0 -> 14780 bytes .../XRXX3I6Li01BKofIMNaNRs71cA-D1eeM49Z.woff2 | Bin 0 -> 37912 bytes .../XRXX3I6Li01BKofIMNaORs71cA-Bm_i0Dk1.woff2 | Bin 0 -> 31444 bytes ui/src/App.vue | 119 + {public => ui/src}/assets/logo-150x150.png | Bin {public => ui/src}/assets/logo-300x300.png | Bin {public => ui/src}/assets/logo.svg | 0 ui/src/components/add-department-menu.vue | 100 + ui/src/components/add-member-menu.vue | 196 + .../src}/components/add-organization-menu.vue | 68 +- ui/src/components/add-partner-menu.vue | 127 + .../components/auth-providers-login-links.vue | 109 + ui/src/components/cancel-deletion.vue | 38 + ui/src/components/change-host.vue | 83 + ui/src/components/colors-preview.vue | 85 + .../src}/components/confirm-menu.vue | 78 +- ui/src/components/delete-department-menu.vue | 104 + .../src}/components/delete-member-menu.vue | 32 +- .../src}/components/delete-partner-menu.vue | 40 +- ui/src/components/edit-department-menu.vue | 104 + .../src}/components/edit-departments-menu.vue | 82 +- .../src}/components/edit-member-menu.vue | 63 +- ui/src/components/layout/layout-app-bar.vue | 118 + ui/src/components/load-avatar.vue | 137 + ui/src/components/logo.vue | 90 + ui/src/components/notify-menu.vue | 45 + .../components/organization-departments.vue | 185 + ui/src/components/organization-members.vue | 324 + ui/src/components/organization-partners.vue | 148 + ui/src/components/organization-storage.vue | 116 + ui/src/components/partner-invitation.vue | 187 + .../src}/components/resend-invitation.vue | 118 +- .../components/resend-partner-invitation.vue | 104 + ui/src/components/site-patch.vue | 125 + ui/src/components/site-post.vue | 85 + ui/src/composables/use-store.ts | 71 + ui/src/context.ts | 9 + ui/src/main.ts | 60 + ui/src/pages/admin/oauth-tokens.vue | 44 + ui/src/pages/admin/organizations.vue | 233 + ui/src/pages/admin/sites/[id].vue | 103 + ui/src/pages/admin/sites/index.vue | 162 + ui/src/pages/admin/users.vue | 406 + {public => ui/src}/pages/contact.vue | 57 +- .../src}/pages/create-organization.vue | 44 +- ui/src/pages/dev.vue | 41 + {public => ui/src}/pages/index.vue | 15 +- ui/src/pages/invitation.vue | 35 + ui/src/pages/login.vue | 1159 + ui/src/pages/me.vue | 429 + .../[id]/department/[departmentId].vue | 53 + ui/src/pages/organization/[id]/index.vue | 173 + ui/src/vite-env.d.ts | 2 + ui/src/vuetify-settings.scss | 11 + ui/tsconfig.json | 36 + ui/vite.config.ts | 126 + upgrade/7.12.2/sites.ts | 161 + upgrade/README.md | 14 - upgrade/index.js | 47 - 413 files changed, 25629 insertions(+), 39672 deletions(-) delete mode 100644 .eslintignore create mode 100644 .github/release.yaml delete mode 100644 .github/workflows/build.yml create mode 100644 .github/workflows/commits.yml create mode 100644 .github/workflows/conventional-label.yaml create mode 100644 .github/workflows/pull-requests.yml create mode 100644 .github/workflows/releases.yml create mode 100644 .github/workflows/reuse-build.yml create mode 100644 .github/workflows/reuse-quality.yml create mode 100644 FUNDING.yml create mode 100644 api/config/custom-environment-variables.cjs create mode 100644 api/config/default.cjs rename config/development.js => api/config/development.cjs (90%) rename config/production.js => api/config/production.cjs (100%) create mode 100644 api/config/test.cjs create mode 100644 api/config/type/index.ts create mode 100644 api/config/type/schema.json create mode 100644 api/contract/JWK.ts rename contract/api-docs.js => api/contract/api-docs.ts (96%) create mode 100644 api/contract/contact-mail.ts create mode 100644 api/contract/mail.ts create mode 100644 api/doc/auth/post-action-req/index.d.ts create mode 100644 api/doc/auth/post-action-req/index.ts create mode 100644 api/doc/auth/post-action-req/schema.js create mode 100644 api/doc/auth/post-password-req/index.ts create mode 100644 api/doc/auth/post-password-req/schema.js create mode 100644 api/doc/auth/post-passwordless-req/index.ts create mode 100644 api/doc/auth/post-passwordless-req/schema.js create mode 100644 api/doc/auth/post-token-callback-req/index.ts create mode 100644 api/doc/auth/post-token-callback-req/schema.js create mode 100644 api/doc/invitations/post-req/index.ts create mode 100644 api/doc/invitations/post-req/schema.json create mode 100644 api/doc/organizations/patch-member-req/index.ts create mode 100644 api/doc/organizations/patch-member-req/schema.js create mode 100644 api/doc/organizations/patch-req/index.ts create mode 100644 api/doc/organizations/patch-req/schema.js create mode 100644 api/doc/organizations/post-partner-accept-req/index.ts create mode 100644 api/doc/organizations/post-partner-accept-req/schema.js create mode 100644 api/doc/organizations/post-partner-req/index.ts create mode 100644 api/doc/organizations/post-partner-req/schema.js create mode 100644 api/doc/organizations/post-req/index.ts create mode 100644 api/doc/organizations/post-req/schema.js create mode 100644 api/doc/sites/list-req/index.ts create mode 100644 api/doc/sites/list-req/schema.json create mode 100644 api/doc/sites/patch-req-body/index.ts create mode 100644 api/doc/sites/patch-req-body/schema.js create mode 100644 api/doc/sites/post-req-body/index.ts create mode 100644 api/doc/sites/post-req-body/schema.js create mode 100644 api/doc/users/patch-req/index.ts create mode 100644 api/doc/users/patch-req/schema.js create mode 100644 api/doc/users/post-host-req/index.ts create mode 100644 api/doc/users/post-host-req/schema.js create mode 100644 api/doc/users/post-password-req/index.ts create mode 100644 api/doc/users/post-password-req/schema.js create mode 100644 api/doc/users/post-req/index.ts create mode 100644 api/doc/users/post-req/schema.js rename {i18n => api/i18n}/de.js (99%) rename {i18n => api/i18n}/en.js (95%) rename {i18n => api/i18n}/es.js (99%) rename {i18n => api/i18n}/fr.js (94%) create mode 100644 api/i18n/index.ts rename {i18n => api/i18n}/it.js (99%) create mode 100644 api/i18n/messages.ts rename {i18n => api/i18n}/pt.js (99%) create mode 100644 api/index.ts create mode 100644 api/package.json rename {server => api}/resources/nunito-ttf/Nunito-ExtraBold.ttf (100%) rename scripts/admin-credentials.js => api/scripts/admin-credentials.ts (50%) create mode 100644 api/scripts/trigger-webhooks.ts create mode 100644 api/src/2fa/router.ts create mode 100644 api/src/2fa/service.ts create mode 100644 api/src/accounts/router.ts create mode 100644 api/src/admin/router.ts create mode 100644 api/src/anonymous-action/router.ts create mode 100644 api/src/app.ts create mode 100644 api/src/auth/providers.ts create mode 100644 api/src/auth/router.ts create mode 100644 api/src/auth/service.ts create mode 100644 api/src/avatars/router.ts create mode 100644 api/src/avatars/service.ts create mode 100644 api/src/config.ts create mode 100644 api/src/events-queue.ts create mode 100644 api/src/invitations/router.ts create mode 100644 api/src/invitations/service.ts create mode 100644 api/src/limits/router.ts create mode 100644 api/src/limits/service.ts rename {server => api/src}/mails/mail-nobutton.mjml (100%) rename {server => api/src}/mails/mail.mjml (100%) rename server/routers/mails.js => api/src/mails/router.ts (53%) create mode 100644 api/src/mails/service.ts create mode 100644 api/src/mails/transport.ts create mode 100644 api/src/mongo.ts create mode 100644 api/src/oauth-tokens/router.ts create mode 100644 api/src/oauth-tokens/service.ts create mode 100644 api/src/oauth/oidc.ts create mode 100644 api/src/oauth/service.ts create mode 100644 api/src/oauth/standard-providers.ts create mode 100644 api/src/organizations/router.ts create mode 100644 api/src/saml2/service.ts create mode 100644 api/src/server.ts create mode 100644 api/src/services.ts create mode 100644 api/src/sites/router.ts create mode 100644 api/src/sites/service.ts create mode 100644 api/src/storages/file.ts create mode 100644 api/src/storages/index.ts create mode 100644 api/src/storages/interface.ts create mode 100644 api/src/storages/ldap.ts create mode 100644 api/src/storages/mongo.ts create mode 100644 api/src/tokens/jwk.d.ts create mode 100644 api/src/tokens/keys-manager.ts create mode 100644 api/src/tokens/router.ts create mode 100644 api/src/tokens/service.ts create mode 100644 api/src/ui-config.ts create mode 100644 api/src/users/router.ts create mode 100644 api/src/users/worker.ts create mode 100644 api/src/utils/cipher.ts create mode 100644 api/src/utils/color.ts create mode 100644 api/src/utils/limiter.ts rename server/routers/metrics.js => api/src/utils/metrics.ts (52%) create mode 100644 api/src/utils/partners.ts create mode 100644 api/src/utils/passwords.ts create mode 100644 api/src/utils/user-name.ts create mode 100644 api/src/webhooks/service.ts create mode 100644 api/types/index.ts create mode 100644 api/types/invitation/index.ts create mode 100644 api/types/invitation/schema.json create mode 100644 api/types/ldap-params/index.ts create mode 100644 api/types/ldap-params/schema.js create mode 100644 api/types/limits/index.ts create mode 100644 api/types/limits/schema.json create mode 100644 api/types/organization/index.ts create mode 100644 api/types/organization/schema.js create mode 100644 api/types/partial/index.ts create mode 100644 api/types/partial/schema.json create mode 100644 api/types/partner/index.ts create mode 100644 api/types/partner/schema.js create mode 100644 api/types/site-public/index.ts rename {types => api/types}/site-public/schema.json (78%) create mode 100644 api/types/site/index.ts create mode 100644 api/types/site/schema.js create mode 100644 api/types/user/index.ts create mode 100644 api/types/user/schema.js delete mode 100644 config/custom-environment-variables.js delete mode 100644 config/default.js delete mode 100644 config/test.js delete mode 100644 contract/JWK.json delete mode 100644 contract/contact-mail.json delete mode 100644 contract/mail.json delete mode 100644 contract/organization.json delete mode 100644 contract/user.json rename {test => dev}/resources/ldap-user.ldif (100%) create mode 100644 dev/resources/nginx.conf rename {test => dev}/resources/organizations.json (91%) rename {test => dev}/resources/users.json (87%) delete mode 100644 doc/layouts/default.vue delete mode 100644 doc/nuxt.config.js delete mode 100644 doc/pages/doc/_id.vue delete mode 100644 doc/pages/doc/about-en.md delete mode 100644 doc/pages/doc/about-fr.md delete mode 100644 doc/pages/doc/config-en.md delete mode 100644 doc/pages/doc/config-fr.md delete mode 100644 doc/pages/doc/install-en.md delete mode 100644 doc/pages/doc/install-fr.md delete mode 100644 doc/pages/doc/use-en.md delete mode 100644 doc/pages/doc/use-fr.md delete mode 100644 doc/pages/index.vue delete mode 100644 doc/plugins/vuetify.js create mode 100644 eslint.config.mjs delete mode 100644 i18n/index.js delete mode 100644 nodemon.json delete mode 100644 nuxt.config.js delete mode 100644 patches/@nuxt+server+2.18.1.patch delete mode 100644 patches/samlify+2.8.8.patch delete mode 100644 public/assets/variables.scss delete mode 100644 public/components/add-department-menu.vue delete mode 100644 public/components/add-member-menu.vue delete mode 100644 public/components/add-partner-menu.vue delete mode 100644 public/components/auth-providers-login-links.vue delete mode 100644 public/components/cancel-deletion.vue delete mode 100644 public/components/change-host.vue delete mode 100644 public/components/delete-department-menu.vue delete mode 100644 public/components/edit-department-menu.vue delete mode 100644 public/components/load-avatar.vue delete mode 100644 public/components/logo.vue delete mode 100644 public/components/notify-menu.vue delete mode 100644 public/components/organization-departments.vue delete mode 100644 public/components/organization-members.vue delete mode 100644 public/components/organization-partners.vue delete mode 100644 public/components/organization-storage.vue delete mode 100644 public/components/partner-invitation.vue delete mode 100644 public/components/resend-partner-invitation.vue delete mode 100644 public/components/site-patch.vue delete mode 100644 public/components/site-post.vue delete mode 100644 public/components/v-jsf.vue delete mode 100644 public/event-bus.js delete mode 100644 public/layouts/default.vue delete mode 100644 public/layouts/error.vue delete mode 100644 public/pages/admin/oauth-tokens.vue delete mode 100644 public/pages/admin/organizations.vue delete mode 100644 public/pages/admin/sites.vue delete mode 100644 public/pages/admin/users.vue delete mode 100644 public/pages/api-doc.vue delete mode 100644 public/pages/invitation.vue delete mode 100644 public/pages/login.vue delete mode 100644 public/pages/me.vue delete mode 100644 public/pages/organization/_id/department/_departmentId.vue delete mode 100644 public/pages/organization/_id/index.vue delete mode 100644 public/plugins/analytics.js delete mode 100644 public/plugins/axios.js delete mode 100644 public/plugins/iframe-resizer.js delete mode 100644 public/plugins/moment.js delete mode 100644 public/plugins/query-params.js delete mode 100644 public/plugins/session.js delete mode 100644 public/plugins/site-public.js delete mode 100644 public/plugins/vuetify.js delete mode 100644 public/static/favicon.ico delete mode 100644 public/store/index.js delete mode 100644 public/store/style.js delete mode 100644 scripts/trigger-webhooks.js delete mode 100644 server/app.js delete mode 100644 server/index.js delete mode 100644 server/mails/index.js delete mode 100644 server/nuxt.js delete mode 100644 server/resources/nunito-ttf/Nunito-Black.ttf delete mode 100644 server/resources/nunito-ttf/Nunito-BlackItalic.ttf delete mode 100644 server/resources/nunito-ttf/Nunito-Bold.ttf delete mode 100644 server/resources/nunito-ttf/Nunito-BoldItalic.ttf delete mode 100644 server/resources/nunito-ttf/Nunito-ExtraBoldItalic.ttf delete mode 100644 server/resources/nunito-ttf/Nunito-ExtraLight.ttf delete mode 100644 server/resources/nunito-ttf/Nunito-ExtraLightItalic.ttf delete mode 100644 server/resources/nunito-ttf/Nunito-Italic.ttf delete mode 100644 server/resources/nunito-ttf/Nunito-Light.ttf delete mode 100644 server/resources/nunito-ttf/Nunito-LightItalic.ttf delete mode 100644 server/resources/nunito-ttf/Nunito-Medium.ttf delete mode 100644 server/resources/nunito-ttf/Nunito-MediumItalic.ttf delete mode 100644 server/resources/nunito-ttf/Nunito-Regular.ttf delete mode 100644 server/resources/nunito-ttf/Nunito-SemiBold.ttf delete mode 100644 server/resources/nunito-ttf/Nunito-SemiBoldItalic.ttf delete mode 100644 server/routers/2fa.js delete mode 100644 server/routers/anonymous-action.js delete mode 100644 server/routers/auth.js delete mode 100644 server/routers/avatars.js delete mode 100644 server/routers/invitations.js delete mode 100644 server/routers/oauth-tokens.js delete mode 100644 server/routers/organizations.js delete mode 100644 server/routers/sites.js delete mode 100644 server/routers/users.js delete mode 100644 server/storages/file.js delete mode 100644 server/storages/index.js delete mode 100644 server/storages/ldap.js delete mode 100644 server/storages/mongo.js delete mode 100644 server/utils/async-wrap.js delete mode 100644 server/utils/axios.js delete mode 100644 server/utils/dayjs.js delete mode 100644 server/utils/find.js delete mode 100644 server/utils/invitations.js delete mode 100644 server/utils/limiter.js delete mode 100644 server/utils/limits.js delete mode 100644 server/utils/locks.js delete mode 100644 server/utils/metrics.js delete mode 100644 server/utils/mongo.js delete mode 100644 server/utils/notifications.js delete mode 100644 server/utils/oauth.js delete mode 100644 server/utils/partners.js delete mode 100644 server/utils/passwords.js delete mode 100644 server/utils/saml2.js delete mode 100644 server/utils/tokens.js delete mode 100644 server/utils/user-name.js delete mode 100644 server/webhooks.js create mode 100644 shared/package.json create mode 100644 shared/site.ts create mode 100644 test-it/file-storage.ts create mode 100644 test-it/i18n.ts rename test/mongo/invitations.js => test-it/invitations.ts (77%) create mode 100644 test-it/jwks.ts create mode 100644 test-it/ldap-api.ts create mode 100644 test-it/ldap-per-org-file.ts create mode 100644 test-it/ldap-per-org-mongo.ts create mode 100644 test-it/ldap-storage-single-org.ts create mode 100644 test-it/ldap-storage.ts rename test/file/mails.js => test-it/mails.ts (67%) create mode 100644 test-it/oidc-core-id.ts create mode 100644 test-it/oidc.ts rename test/mongo/members.js => test-it/organizations.ts (60%) create mode 100644 test-it/session.ts create mode 100644 test-it/sites.ts rename test/mongo/users.js => test-it/users.ts (64%) create mode 100644 test-it/utils/index.ts delete mode 100644 test/.eslintrc.js delete mode 100644 test/file/auth.js delete mode 100644 test/file/i18n.js delete mode 100644 test/file/organizations.js delete mode 100644 test/file/setup-teardown.js delete mode 100644 test/file/storage-ldap-per-org.js delete mode 100644 test/file/storage.js delete mode 100644 test/file/users.js delete mode 100644 test/ldap/setup-teardown.js delete mode 100644 test/ldap/storage-ldap-single-org.js delete mode 100644 test/ldap/storage-ldap.js delete mode 100644 test/mongo/oidc.js delete mode 100644 test/mongo/organizations.js delete mode 100644 test/mongo/partners.js delete mode 100644 test/mongo/setup-teardown.js delete mode 100644 test/mongo/sites.js delete mode 100644 test/resources/nginx.conf delete mode 100644 test/resources/test.key delete mode 100644 test/resources/test.key.pub delete mode 100644 test/utils.js create mode 100644 tsconfig.tests.json delete mode 100644 types/partner-accept/index.mjs delete mode 100644 types/partner-accept/schema.json delete mode 100644 types/partner-post/index.mjs delete mode 100644 types/partner-post/schema.json delete mode 100644 types/site-patch/index.mjs delete mode 100644 types/site-patch/schema.json delete mode 100644 types/site-post/index.mjs delete mode 100644 types/site-post/schema.json delete mode 100644 types/site-public/index.mjs delete mode 100644 types/site/index.mjs delete mode 100644 types/site/schema.json delete mode 100644 types/sites-query/index.mjs delete mode 100644 types/sites-query/schema.json delete mode 100644 types/sites-response-public/index.mjs delete mode 100644 types/sites-response-public/schema.json delete mode 100644 types/sites-response/index.mjs delete mode 100644 types/sites-response/schema.json create mode 100644 ui/.gitignore create mode 100644 ui/dts/auto-imports.d.ts create mode 100644 ui/dts/components.d.ts create mode 100644 ui/dts/typed-router.d.ts create mode 100644 ui/eslint.config.mjs create mode 100644 ui/index.html create mode 100644 ui/package.json rename {doc/static => ui/public}/favicon.ico (100%) create mode 100644 ui/public/fonts/XRXV3I6Li01BKofIMeaBXso-C3IBG1kp.woff2 create mode 100644 ui/public/fonts/XRXV3I6Li01BKofINeaB-BaTF6Vo7.woff2 create mode 100644 ui/public/fonts/XRXV3I6Li01BKofIO-aBXso-DcJfvmGA.woff2 create mode 100644 ui/public/fonts/XRXV3I6Li01BKofIOOaBXso-BWI5zH9R.woff2 create mode 100644 ui/public/fonts/XRXV3I6Li01BKofIOuaBXso-B55YuedR.woff2 create mode 100644 ui/public/fonts/XRXX3I6Li01BKofIMNaDRs4-BbMn9XSX.woff2 create mode 100644 ui/public/fonts/XRXX3I6Li01BKofIMNaHRs71cA-Cznx39fA.woff2 create mode 100644 ui/public/fonts/XRXX3I6Li01BKofIMNaMRs71cA-CuWrHpFO.woff2 create mode 100644 ui/public/fonts/XRXX3I6Li01BKofIMNaNRs71cA-D1eeM49Z.woff2 create mode 100644 ui/public/fonts/XRXX3I6Li01BKofIMNaORs71cA-Bm_i0Dk1.woff2 create mode 100644 ui/src/App.vue rename {public => ui/src}/assets/logo-150x150.png (100%) rename {public => ui/src}/assets/logo-300x300.png (100%) rename {public => ui/src}/assets/logo.svg (100%) create mode 100644 ui/src/components/add-department-menu.vue create mode 100644 ui/src/components/add-member-menu.vue rename {public => ui/src}/components/add-organization-menu.vue (56%) create mode 100644 ui/src/components/add-partner-menu.vue create mode 100644 ui/src/components/auth-providers-login-links.vue create mode 100644 ui/src/components/cancel-deletion.vue create mode 100644 ui/src/components/change-host.vue create mode 100644 ui/src/components/colors-preview.vue rename {public => ui/src}/components/confirm-menu.vue (65%) create mode 100644 ui/src/components/delete-department-menu.vue rename {public => ui/src}/components/delete-member-menu.vue (70%) rename {public => ui/src}/components/delete-partner-menu.vue (64%) create mode 100644 ui/src/components/edit-department-menu.vue rename {public => ui/src}/components/edit-departments-menu.vue (51%) rename {public => ui/src}/components/edit-member-menu.vue (60%) create mode 100644 ui/src/components/layout/layout-app-bar.vue create mode 100644 ui/src/components/load-avatar.vue create mode 100644 ui/src/components/logo.vue create mode 100644 ui/src/components/notify-menu.vue create mode 100644 ui/src/components/organization-departments.vue create mode 100644 ui/src/components/organization-members.vue create mode 100644 ui/src/components/organization-partners.vue create mode 100644 ui/src/components/organization-storage.vue create mode 100644 ui/src/components/partner-invitation.vue rename {public => ui/src}/components/resend-invitation.vue (51%) create mode 100644 ui/src/components/resend-partner-invitation.vue create mode 100644 ui/src/components/site-patch.vue create mode 100644 ui/src/components/site-post.vue create mode 100644 ui/src/composables/use-store.ts create mode 100644 ui/src/context.ts create mode 100644 ui/src/main.ts create mode 100644 ui/src/pages/admin/oauth-tokens.vue create mode 100644 ui/src/pages/admin/organizations.vue create mode 100644 ui/src/pages/admin/sites/[id].vue create mode 100644 ui/src/pages/admin/sites/index.vue create mode 100644 ui/src/pages/admin/users.vue rename {public => ui/src}/pages/contact.vue (53%) rename {public => ui/src}/pages/create-organization.vue (56%) create mode 100644 ui/src/pages/dev.vue rename {public => ui/src}/pages/index.vue (72%) create mode 100644 ui/src/pages/invitation.vue create mode 100644 ui/src/pages/login.vue create mode 100644 ui/src/pages/me.vue create mode 100644 ui/src/pages/organization/[id]/department/[departmentId].vue create mode 100644 ui/src/pages/organization/[id]/index.vue create mode 100644 ui/src/vite-env.d.ts create mode 100644 ui/src/vuetify-settings.scss create mode 100644 ui/tsconfig.json create mode 100644 ui/vite.config.ts create mode 100644 upgrade/7.12.2/sites.ts delete mode 100644 upgrade/README.md delete mode 100644 upgrade/index.js diff --git a/.dockerignore b/.dockerignore index 7f136508..c65e23f4 100644 --- a/.dockerignore +++ b/.dockerignore @@ -1,11 +1,5 @@ -/node_modules -/.nyc_output -/coverage -/.nuxt -/security -/data -/nuxt-dist +node_modules +/dev/data /dist /.git config/local* -/types/node_modules \ No newline at end of file diff --git a/.eslintignore b/.eslintignore deleted file mode 100644 index 9fe9a7fc..00000000 --- a/.eslintignore +++ /dev/null @@ -1,7 +0,0 @@ -/node_modules -/dist -/.nuxt -/doc-dist -/nuxt-dist -/data -/types \ No newline at end of file diff --git a/.github/release.yaml b/.github/release.yaml new file mode 100644 index 00000000..8b56f5ac --- /dev/null +++ b/.github/release.yaml @@ -0,0 +1,23 @@ +# configure github generated release notes +# https://docs.github.com/en/repositories/releasing-projects-on-github/automatically-generated-release-notes#configuring-automatically-generated-release-notes +# uses labels that can be affected implicitly based on PR titles, see workflow/conventional-label.yaml + +changelog: + exclude: + labels: + - ignore-for-release + authors: + - octocat + categories: + - title: Breaking Changes 🛠 + labels: + - breaking + - title: New Features 🎉 + labels: + - feature + - title: Fixes 🔧 + labels: + - fix + - title: Other Changes + labels: + - "*" \ No newline at end of file diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml deleted file mode 100644 index abdd8883..00000000 --- a/.github/workflows/build.yml +++ /dev/null @@ -1,76 +0,0 @@ -name: Build CI - -on: - push: - branches: [ '*' ] - tags: [ 'v*.*.*' ] - -jobs: - build: - runs-on: ubuntu-latest - steps: - - name: Checkout git repository - uses: actions/checkout@v3 - - # no need to work on a cache here, it is not faster than pulling - # instead work on moving to some images hosted on ghcr.io, it is the fastest - - name: Run test dependencies - run: | - docker compose pull --quiet - NO_UI=true docker compose --profile test up -d --wait - - - name: Prepare docker image tags - id: docker_meta - uses: docker/metadata-action@v4 - with: - images: ghcr.io/${{ github.repository }} - tags: | - type=ref,event=branch - type=ref,event=pr - type=semver,pattern={{version}} - type=semver,pattern={{major}}.{{minor}} - type=semver,pattern={{major}} - - - name: Set up Docker Buildx - uses: docker/setup-buildx-action@v2 - with: - driver-opts: network=host - - - name: Login to Github container registry - uses: docker/login-action@v2 - with: - registry: ghcr.io - username: ${{ github.actor }} - password: ${{ secrets.GITHUB_TOKEN }} - - - name: Prepare BUILD.json - run: | - echo '{"version": "${{github.ref_name}}", "repository": "${{github.server_url}}/${{github.repository}}", "commit": "${{github.sha}}"}' > BUILD.json - cat BUILD.json - - - name: Build and push docker images - id: docker_build - uses: docker/build-push-action@v3 - with: - context: . - push: ${{ github.event_name != 'pull_request' }} - tags: ${{ steps.docker_meta.outputs.tags }} - platforms: linux/amd64 - labels: ${{ steps.docker_meta.outputs.labels }} - cache-from: type=gha - cache-to: type=gha,mode=max - - - name: Stop test dependencies - run: docker compose stop - - - name: Image digest - run: echo ${{ steps.docker_build.outputs.digest }} - - - name: Send Keel notification to staging-koumoul.com - if: startsWith(github.ref, 'refs/heads/') - run: | - curl -s --fail --show-error -X POST https://keel.admin.staging-koumoul.com/v1/webhooks/native -u ${{ secrets.KEEL_STAGING_USER }}:${{ secrets.KEEL_STAGING_PASSWORD }} -d '{"name": "ghcr.io/${{ github.repository }}", "tag": "${{ steps.docker_meta.outputs.version }}"}' - - name: Send Keel notification to koumoul.com - if: startsWith(github.ref, 'refs/tags/v') - run: | - curl -s --fail --show-error -X POST https://keel.admin.koumoul.com/v1/webhooks/native -u ${{ secrets.KEEL_PROD_USER }}:${{ secrets.KEEL_PROD_PASSWORD }} -d '{"name": "ghcr.io/${{ github.repository }}", "tag": "${{ steps.docker_meta.outputs.version }}"}' \ No newline at end of file diff --git a/.github/workflows/commits.yml b/.github/workflows/commits.yml new file mode 100644 index 00000000..874bcbe5 --- /dev/null +++ b/.github/workflows/commits.yml @@ -0,0 +1,21 @@ +# no need to run quality checks on every small commit, husky already did it on the dev computer +# in this case we simply build the docker image + +name: Build simple commit + +on: + push: + branches: ['*'] + tags-ignore: [ 'v*.*.*' ] + +jobs: + build: + uses: ./.github/workflows/reuse-build.yml + + deploy: + needs: build + runs-on: ubuntu-latest + steps: + - name: Send Keel notifications to staging-koumoul.com + run: | + curl -s --fail --show-error -X POST https://keel.admin.staging-koumoul.com/v1/webhooks/native -u ${{ secrets.KEEL_STAGING_USER }}:${{ secrets.KEEL_STAGING_PASSWORD }} -d '{"name": "ghcr.io/${{ github.repository }}", "tag": "${{ github.ref_name }}"}' \ No newline at end of file diff --git a/.github/workflows/conventional-label.yaml b/.github/workflows/conventional-label.yaml new file mode 100644 index 00000000..4ffc5171 --- /dev/null +++ b/.github/workflows/conventional-label.yaml @@ -0,0 +1,12 @@ +# automatic labelling of pull request based on conventional commit names in the PR titles +# see https://github.com/marketplace/actions/conventional-release-labels + +on: + pull_request_target: + types: [ opened, edited ] +name: conventional-release-labels +jobs: + label: + runs-on: ubuntu-latest + steps: + - uses: bcoe/conventional-release-labels@v1 \ No newline at end of file diff --git a/.github/workflows/pull-requests.yml b/.github/workflows/pull-requests.yml new file mode 100644 index 00000000..39b50581 --- /dev/null +++ b/.github/workflows/pull-requests.yml @@ -0,0 +1,9 @@ +# for pull requests we do not build a docker image, we simply run quality checks + +name: Check pull requests + +on: pull_request + +jobs: + quality: + uses: ./.github/workflows/reuse-quality.yml \ No newline at end of file diff --git a/.github/workflows/releases.yml b/.github/workflows/releases.yml new file mode 100644 index 00000000..b70cf5c1 --- /dev/null +++ b/.github/workflows/releases.yml @@ -0,0 +1,27 @@ +# for releases we run in sequence the qualityt checks and the build + +name: Build release + +on: + push: + tags: [ 'v*.*.*' ] + +jobs: + quality: + uses: ./.github/workflows/reuse-quality.yml + + build: + needs: quality + uses: ./.github/workflows/reuse-build.yml + + deploy: + needs: build + runs-on: ubuntu-latest + steps: + - id: get_version + uses: battila7/get-version-action@v2 + + - name: Send Keel notifications to koumoul.com + run: | + curl -s --fail --show-error -X POST https://keel.admin.koumoul.com/v1/webhooks/native -u ${{ secrets.KEEL_PROD_USER }}:${{ secrets.KEEL_PROD_PASSWORD }} -d '{"name": "ghcr.io/${{ github.repository }}", "tag": "${{ steps.get_version.outputs.major }}"}' + \ No newline at end of file diff --git a/.github/workflows/reuse-build.yml b/.github/workflows/reuse-build.yml new file mode 100644 index 00000000..46a6aa9a --- /dev/null +++ b/.github/workflows/reuse-build.yml @@ -0,0 +1,51 @@ +name: Build + +on: + workflow_call: + +jobs: + build: + runs-on: ubuntu-latest + steps: + - name: Checkout git repository + uses: actions/checkout@v4 + + - name: Set up Docker Buildx + uses: docker/setup-buildx-action@v3 + + - name: Login to Github container registry + uses: docker/login-action@v3 + with: + registry: ghcr.io + username: ${{ github.actor }} + password: ${{ secrets.GITHUB_TOKEN }} + + - name: Prepare BUILD.json + run: | + echo '{"version": "${{github.ref_name}}", "repository": "${{github.server_url}}/${{github.repository}}", "commit": "${{github.sha}}"}' > BUILD.json + cat BUILD.json + + - name: Prepare docker tags for main image + id: docker_meta_main + uses: docker/metadata-action@v5 + with: + images: ghcr.io/${{ github.repository }} + tags: | + type=ref,event=branch + type=ref,event=pr + type=semver,pattern={{version}} + type=semver,pattern={{major}}.{{minor}} + type=semver,pattern={{major}} + + - name: Build and push main image + id: docker_build_main + uses: docker/build-push-action@v5 + with: + context: . + push: true + target: main + tags: ${{ steps.docker_meta_main.outputs.tags }} + platforms: linux/amd64 + labels: ${{ steps.docker_meta_main.outputs.labels }} + cache-from: type=registry,ref=ghcr.io/${{ github.repository }}/buildcache + cache-to: type=registry,ref=ghcr.io/${{ github.repository }}/buildcache,mode=max diff --git a/.github/workflows/reuse-quality.yml b/.github/workflows/reuse-quality.yml new file mode 100644 index 00000000..6290868d --- /dev/null +++ b/.github/workflows/reuse-quality.yml @@ -0,0 +1,22 @@ +name: Quality checks + +on: + workflow_call: + +jobs: + quality: + runs-on: ubuntu-latest + steps: + - name: Checkout git repository + uses: actions/checkout@v4 + + - uses: actions/setup-node@v3 + with: + node-version: 22 + cache: 'npm' + + - name: Install dependencies + run: npm ci + + - name: Run quality checks + run: npm run quality \ No newline at end of file diff --git a/.gitignore b/.gitignore index 27e0c9e9..7ebe72dc 100644 --- a/.gitignore +++ b/.gitignore @@ -1,17 +1,5 @@ -/node_modules -/.nyc_output -/coverage -/.nuxt -/doc-dist -/public/pages/doc -/security -*.swp -/nuxt-dist -/dist -config/local* -.idea -/data +/tmp .type - -public/assets/css/ -public/assets/fonts/ \ No newline at end of file +node_modules +dev/data +*.tsbuildinfo \ No newline at end of file diff --git a/.husky/commit-msg b/.husky/commit-msg index a8650bcf..dab272da 100755 --- a/.husky/commit-msg +++ b/.husky/commit-msg @@ -1,4 +1 @@ -#!/usr/bin/env sh -. "$(dirname -- "$0")/_/husky.sh" - npx --no-install commitlint --edit "" diff --git a/.husky/pre-commit b/.husky/pre-commit index 75fac8e1..3867a0fe 100755 --- a/.husky/pre-commit +++ b/.husky/pre-commit @@ -1,4 +1 @@ -#!/usr/bin/env sh -. "$(dirname -- "$0")/_/husky.sh" - npm run lint diff --git a/.husky/pre-push b/.husky/pre-push index 3019cb85..53e984fe 100755 --- a/.husky/pre-push +++ b/.husky/pre-push @@ -1,6 +1 @@ -#!/usr/bin/env sh -. "$(dirname -- "$0")/_/husky.sh" - -npm run test-deps -npm run build-types -npm run test +npm run quality diff --git a/.zellij.kdl b/.zellij.kdl index d1785854..052d7535 100644 --- a/.zellij.kdl +++ b/.zellij.kdl @@ -3,25 +3,26 @@ layout { split_direction "vertical" pane name="simple-directory" borderless=true { command "bash" - args "-ic" "nvm use && bash" + args "-ic" "nvm use > /dev/null 2>&1 && bash" } pane name="deps" { command "bash" - args "-ic" "dc --profile dev up" + args "-ic" "npm run dev-deps && watch -n 4 \"docker compose ps --all --format 'table {{.Name}}\t{{.Status}}'\"" } } pane { split_direction "vertical" - pane name="client" { + pane name="ui" { command "bash" - args "-ic" "nvm use && npm run dev-client" + args "-ic" "nvm use > /dev/null 2>&1 && npm -w ui run dev" } - pane name="server" { + pane name="api" { command "bash" - args "-ic" "nvm use && npm run dev-server" + args "-ic" "nvm use > /dev/null 2>&1 && npm -w api run dev" } } - pane size=2 borderless=true { - plugin location="zellij:status-bar" + pane size=1 borderless=true { + command "bash" + args "-ic" "echo -n -e \"Dev server available at \\e[1;96mhttp://localhost:5689\\033[0m\"" } } \ No newline at end of file diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index b69b1237..1f142c16 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -32,12 +32,6 @@ curl -H "Content-Type: application/json" -XPOST "http://localhost:5689/simple-di curl -H "Content-Type: application/json" -XPOST "http://localhost:5689/simple-directory/api/sites?key=secret-sites" -d ' {"_id":"devsite2","owner":{"type":"organization","id":"admins-org","name":"Admins organization"},"host":"localhost:5999","theme":{"primaryColor":"#FF4D40"}}' -Test built nuxt distributable in dev: - - # first set noUI to false in config/development.js - NODE_ENV=development npm run build - npm run dev-server - ## Docker image Test building the docker image: @@ -45,7 +39,7 @@ Test building the docker image: ``` docker compose stop npm run test-deps -docker build --progress=plain --network=host -t sd-dev . +docker build --progress=plain -t sd-dev . // don't expect the following line to work fully, it will be missing service dependencies, etc. docker run --network=host --env PORT=8081 sd-dev ``` @@ -95,5 +89,5 @@ Add a test user: ``` apt-get install ldap-utils -ldapadd -x -W -D "cn=admin,dc=example,dc=org" -f test/resources/ldap-user.ldif +ldapadd -x -W -D "cn=admin,dc=example,dc=org" -f dev/resources/ldap-user.ldif ``` \ No newline at end of file diff --git a/Dockerfile b/Dockerfile index 48b5e9df..297e545c 100644 --- a/Dockerfile +++ b/Dockerfile @@ -1,99 +1,84 @@ -############################################################################################################ -# Stage: prepare a base image with all native utils pre-installed, used both by builder and definitive image - -FROM node:22.11.0-alpine3.20 AS nativedeps +########################## +FROM node:22.11.0-alpine3.20 AS base RUN npm install -g npm@10.9.1 -RUN npm -version + +WORKDIR /app +ENV NODE_ENV=production + +########################## +FROM base AS native-deps + RUN apk add --no-cache openssl graphicsmagick -###################################### -# Stage: nodejs dependencies and build -FROM nativedeps AS builder - -# try to prevent ETIMEDOUT errors -RUN npm config set maxsockets=1 - -WORKDIR /webapp -ADD package.json . -ADD package-lock.json . -ADD patches patches -# use clean-modules on the same line as npm ci to be lighter in the cache -RUN npm ci && \ - ./node_modules/.bin/clean-modules --yes --exclude mocha/lib/test.js --exclude "**/*.mustache" - -# Adding UI files -ADD public public -ADD nuxt.config.js . -ADD config config -ADD contract contract -ADD i18n i18n - -# also install deps in types submodule -ADD types types -WORKDIR /webapp - -# Build UI -ENV NODE_ENV production +########################## +FROM base AS package-strip + +RUN apk add --no-cache jq moreutils +ADD package.json package-lock.json ./ +# remove version from manifest for better caching when building a release +RUN jq '.version="build"' package.json | sponge package.json +RUN jq '.version="build"' package-lock.json | sponge package-lock.json + +########################## +FROM base AS installer + +RUN apk add --no-cache python3 make g++ git jq moreutils +RUN npm i -g clean-modules@3.0.4 +COPY --from=package-strip /app/package.json package.json +COPY --from=package-strip /app/package-lock.json package-lock.json +ADD ui/package.json ui/package.json +ADD api/package.json api/package.json +ADD shared/package.json shared/package.json +# full deps install used for types and ui building +# also used to fill the npm cache for faster install of api deps +RUN npm ci --omit=dev --omit=optional --omit=peer --no-audit --no-fund + +########################## +FROM installer AS types + +ADD api/types api/types +ADD api/doc api/doc +ADD api/config api/config RUN npm run build-types -RUN npm run build - -# Adding server files -ADD server server -ADD scripts scripts - -# Check quality -ADD .eslintignore .eslintignore -RUN npm run lint -RUN npm audit --omit=dev --audit-level=critical -ADD test test -RUN npm run test - -# Cleanup /webapp/node_modules so it can be copied by next stage -RUN npm prune --production -RUN rm -rf node_modules/.cache - -################################## -# Stage: main nodejs service stage -FROM nativedeps -MAINTAINER "contact@koumoul.com" - -RUN apk add --no-cache dumb-init - -WORKDIR /webapp - -# We could copy /webapp whole, but this is better for layering / efficient cache use -COPY --from=builder /webapp/node_modules /webapp/node_modules -COPY --from=builder /webapp/package.json /webapp/package.json -COPY --from=builder /webapp/nuxt-dist /webapp/nuxt-dist -COPY --from=builder /webapp/types /webapp/types -ADD nuxt.config.js nuxt.config.js -ADD i18n i18n -ADD server server -ADD scripts scripts -ADD config/default.js config/ -ADD config/production.js config/ -ADD config/custom-environment-variables.js config/ -ADD contract contract - -# Adding licence, manifests, etc. -ADD README.md BUILD.json* ./ -ADD LICENSE . -ADD nodemon.json . - -# configure node webapp environment -ENV NODE_ENV production -ENV DEBUG db,upgrade* -# the following line would be a good practice -# unfortunately it is a problem to activate now that the service was already deployed -# with volumes belonging to root -#USER node -VOLUME /webapp/data -VOLUME /webapp/security - -RUN chmod -R 777 ./nuxt-dist +########################## +FROM installer AS ui + +RUN npm i --no-save @rollup/rollup-linux-x64-musl +COPY --from=types /app/api/config api/config +COPY --from=types /app/api/types api/types +COPY --from=types /app/api/doc api/doc +ADD /api/i18n api/i18n +ADD /shared shared +ADD /api/src/config.ts api/src/config.ts +ADD /api/src/ui-config.ts api/src/ui-config.ts +ADD /ui ui +RUN npm -w ui run build + +########################## +FROM installer AS api-installer + +# remove other workspaces and reinstall, otherwise we can get rig have some peer dependencies from other workspaces +RUN npm ci -w api --prefer-offline --omit=dev --omit=optional --omit=peer --no-audit --no-fund && \ + npx clean-modules --yes "!ramda/src/test.js" +RUN mkdir -p /app/api/node_modules + +########################## +FROM native-deps AS main + +COPY --from=api-installer /app/node_modules node_modules +ADD /api api +ADD /shared shared +ADD /upgrade upgrade +COPY --from=types /app/api/types api/types +COPY --from=types /app/api/doc api/doc +COPY --from=types /app/api/config api/config +COPY --from=api-installer /app/api/node_modules api/node_modules +COPY --from=ui /app/ui/dist ui/dist +ADD package.json README.md LICENSE BUILD.json* ./ EXPOSE 8080 - -CMD ["dumb-init", "node", "--max-http-header-size", "64000", "server"] - +EXPOSE 9090 +USER node +WORKDIR /app/api +CMD ["node", "--max-http-header-size", "65536", "--experimental-strip-types", "index.ts"] diff --git a/FUNDING.yml b/FUNDING.yml new file mode 100644 index 00000000..8b76fb67 --- /dev/null +++ b/FUNDING.yml @@ -0,0 +1 @@ +github: [koumoul-dev] diff --git a/api/config/custom-environment-variables.cjs b/api/config/custom-environment-variables.cjs new file mode 100644 index 00000000..3ba1bff7 --- /dev/null +++ b/api/config/custom-environment-variables.cjs @@ -0,0 +1,292 @@ +/** + * @param {string} key + */ +const jsonEnv = (key) => ({ __name: key, __format: 'json' }) + +module.exports = { + port: 'PORT', + mongo: { + url: 'MONGO_URL', + options: jsonEnv('MONGO_OPTIONS') + }, + publicUrl: 'PUBLIC_URL', + kid: 'JWT_KID', + jwtDurations: { + initialToken: 'JWT_DURATION_INITIAL', + idToken: 'JWT_DURATION_ID', + exchangeToken: 'JWT_DURATION_EXCHANGE', + invitationToken: 'JWT_DURATION_INVIT', + partnerInvitationToken: 'JWT_DURATION_PARTNER_INVIT', + '2FAToken': 'JWT_DURATION_2FA' + }, + admins: jsonEnv('ADMINS'), + adminsOrg: jsonEnv('ADMINS_ORG'), + admins2FA: 'ADMINS_2FA', + adminCredentials: jsonEnv('ADMIN_CREDENTIALS'), + roles: { + defaults: jsonEnv('ROLES_DEFAULTS') + }, + contact: 'CONTACT', + anonymousAction: { + expiresIn: 'ANONYMOUS_ACTION_EXPIRES_IN', + notBefore: 'ANONYMOUS_ACTION_NOT_BEFORE' + }, + homePage: 'HOME_PAGE', + secret: { + public: 'PUBLIC_KEY', + private: 'PRIVATE_KEY' + }, + storage: { + type: 'STORAGE_TYPE', + file: { + users: 'STORAGE_FILE_USERS', + organizations: 'STORAGE_FILE_ORGS' + }, + mongo: { + readonly: 'STORAGE_MONGO_READONLY', + url: 'STORAGE_MONGO_URL', + options: jsonEnv('STORAGE_MONGO_CLIENT_OPTIONS') + }, + ldap: { + url: 'STORAGE_LDAP_URL', + searchUserDN: 'STORAGE_LDAP_SEARCH_USER_DN', + searchUserPassword: 'STORAGE_LDAP_SEARCH_USER_PASS', + baseDN: 'STORAGE_LDAP_BASE_DN', + users: { + objectClass: 'STORAGE_LDAP_USERS_OBJECT_CLASS', + dnKey: 'STORAGE_LDAP_USERS_DN_KEY', + mapping: jsonEnv('STORAGE_LDAP_USERS_MAPPING'), + overwrite: jsonEnv('STORAGE_LDAP_USERS_OVERWRITE'), + extraFilters: jsonEnv('STORAGE_LDAP_USERS_EXTRA_FILTERS') + }, + organizations: { + staticSingleOrg: jsonEnv('STORAGE_LDAP_ORGS_STATIC_SINGLE_ORG'), + objectClass: 'STORAGE_LDAP_ORGS_OBJECT_CLASS', + dnKey: 'STORAGE_LDAP_ORGS_DN_KEY', + mapping: jsonEnv('STORAGE_LDAP_ORGS_MAPPING'), + overwrite: jsonEnv('STORAGE_LDAP_ORGS_OVERWRITE'), + extraFilters: jsonEnv('STORAGE_LDAP_ORGS_EXTRA_FILTERS') + }, + members: { + organizationAsDC: 'STORAGE_LDAP_MEMBERS_ORG_AS_DC', + onlyWithRole: 'STORAGE_LDAP_ONLY_WITH_ROLE', + role: { + attr: 'STORAGE_LDAP_MEMBERS_ROLE_ATTR', + values: jsonEnv('STORAGE_LDAP_MEMBERS_ROLE_VALUES'), + default: 'STORAGE_LDAP_MEMBERS_ROLE_DEFAULT' + }, + overwrite: jsonEnv('STORAGE_LDAP_MEMBERS_OVERWRITE') + } + } + }, + analytics: jsonEnv('ANALYTICS'), + webhooks: { + identities: jsonEnv('IDENTITIES_WEBHOOKS') + }, + theme: { + logo: 'THEME_LOGO', + favicon: 'THEME_FAVICON', + colors: { + background: 'THEME_BACKGROUND', + 'on-background': 'THEME_ON_BACKGROUND', + surface: 'THEME_SURFACE', + 'on-surface': 'THEME_ON_SURFACE', + primary: 'THEME_PRIMARY', + 'on-primary': 'THEME_ON_PRIMARY', + 'text-primary': 'THEME_TEXT_PRIMARY', + secondary: 'THEME_SECONDARY', + 'on-secondary': 'THEME_ON_SECONDARY', + 'text-secondary': 'THEME_TEXT_SECONDARY', + accent: 'THEME_ACCENT', + 'on-accent': 'THEME_ON_ACCENT', + 'text-accent': 'THEME_TEXT_ACCENT', + error: 'THEME_ERROR', + 'on-error': 'THEME_ON_ERROR', + 'text-error': 'THEME_TEXT_ERROR', + info: 'THEME_INFO', + 'on-info': 'THEME_ON_INFO', + 'text-info': 'THEME_TEXT_INFO', + success: 'THEME_SUCCESS', + 'on-success': 'THEME_ON_SUCCESS', + 'text-success': 'THEME_TEXT_SUCCESS', + warning: 'THEME_WARNING', + 'on-warning': 'THEME_ON_WARNING', + 'text-warning': 'THEME_TEXT_WARNING' + }, + dark: 'THEME_DARK', + darkColors: { + background: 'THEME_DARK_BACKGROUND', + 'on-background': 'THEME_DARK_ON_BACKGROUND', + surface: 'THEME_DARK_SURFACE', + 'on-surface': 'THEME_DARK_ON_SURFACE', + primary: 'THEME_DARK_PRIMARY', + 'on-primary': 'THEME_DARK_ON_PRIMARY', + 'text-primary': 'THEME_DARK_TEXT_PRIMARY', + secondary: 'THEME_DARK_SECONDARY', + 'on-secondary': 'THEME_DARK_ON_SECONDARY', + 'text-secondary': 'THEME_DARK_TEXT_SECONDARY', + accent: 'THEME_DARK_ACCENT', + 'on-accent': 'THEME_DARK_ON_ACCENT', + 'text-accent': 'THEME_DARK_TEXT_ACCENT', + error: 'THEME_DARK_ERROR', + 'on-error': 'THEME_DARK_ON_ERROR', + 'text-error': 'THEME_DARK_TEXT_ERROR', + info: 'THEME_DARK_INFO', + 'on-info': 'THEME_DARK_ON_INFO', + 'text-info': 'THEME_DARK_TEXT', + success: 'THEME_DARK_SUCCESS', + 'on-success': 'THEME_DARK_ON_SUCCESS', + 'text-success': 'THEME_DARK_TEXT_SUCCESS', + warning: 'THEME_DARK_WARNING', + 'on-warning': 'THEME_DARK_ON_WARNING', + 'text-warning': 'THEME_DARK_TEXT_WARNING' + }, + hc: 'THEME_HC', + hcColors: { + background: 'THEME_HC_BACKGROUND', + 'on-background': 'THEME_HC_ON_BACKGROUND', + surface: 'THEME_HC_SURFACE', + 'on-surface': 'THEME_HC_ON_SURFACE', + primary: 'THEME_HC_PRIMARY', + 'on-primary': 'THEME_HC_ON_PRIMARY', + 'text-primary': 'THEME_HC_TEXT_PRIMARY', + secondary: 'THEME_HC_SECONDARY', + 'on-secondary': 'THEME_HC_ON_SECONDARY', + 'text-secondary': 'THEME_HC_TEXT_SECONDARY', + accent: 'THEME_HC_ACCENT', + 'on-accent': 'THEME_HC_ON_ACCENT', + 'text-accent': 'THEME_HC_TEXT_ACCENT', + error: 'THEME_HC_ERROR', + 'on-error': 'THEME_HC_ON_ERROR', + 'text-error': 'THEME_HC_TEXT_ERROR', + info: 'THEME_HC_INFO', + 'on-info': 'THEME_HC_ON_INFO', + 'text-info': 'THEME_HC_TEXT_INFO', + success: 'THEME_HC_SUCCESS', + 'on-success': 'THEME_HC_ON_SUCCESS', + 'text-success': 'THEME_HC_TEXT_SUCCESS', + warning: 'THEME_HC_WARNING', + 'on-warning': 'THEME_HC_ON_WARNING', + 'text-warning': 'THEME_HC_TEXT' + }, + hcDark: 'THEME_HC_DARK', + hcDarkColors: { + background: 'THEME_HC_DARK_BACKGROUND', + 'on-background': 'THEME_HC_DARK_ON_BACKGROUND', + surface: 'THEME_HC_DARK_SURFACE', + 'on-surface': 'THEME_HC_DARK_ON_SURFACE', + primary: 'THEME_HC_DARK_PRIMARY', + 'on-primary': 'THEME_HC_DARK_ON_PRIMARY', + 'text-primary': 'THEME_HC_DARK_TEXT_PRIMARY', + secondary: 'THEME_HC_DARK_SECONDARY', + 'on-secondary': 'THEME_HC_DARK_ON_SECONDARY', + 'text-secondary': 'THEME_HC_DARK_TEXT_SECONDARY', + accent: 'THEME_HC_DARK_ACCENT', + 'on-accent': 'THEME_HC_DARK_ON_ACCENT', + 'text-accent': 'THEME_HC_DARK_TEXT_ACCENT', + error: 'THEME_HC_DARK_ERROR', + 'on-error': 'THEME_HC_DARK_ON_ERROR', + 'text-error': 'THEME_HC_DARK_TEXT_ERROR', + info: 'THEME_HC_DARK_INFO', + 'on-info': 'THEME_HC_DARK_ON_INFO', + 'text-info': 'THEME_HC_DARK_TEXT_INFO', + success: 'THEME_HC_DARK_SUCCESS', + 'on-success': 'THEME_HC_DARK_ON_SUCCESS', + 'text-success': 'THEME_HC_DARK_TEXT_SUCCESS', + warning: 'THEME_HC_DARK_WARNING', + 'on-warning': 'THEME_HC_DARK_ON_WARNING', + 'text-warning': 'THEME_HC_DARK_TEXT_WARNING' + } + }, + i18n: { + defaultLocale: 'I18N_DEFAULT_LOCALE', + locales: jsonEnv('I18N_LOCALES') + }, + mails: { + transport: jsonEnv('MAILS_TRANSPORT'), + from: 'MAILS_FROM', + extraParams: jsonEnv('MAILS_EXTRA_PARAMS') + }, + maildev: { + url: 'MAILDEV_URL', + active: 'MAILDEV_ACTIVE' + }, + quotas: { + defaultMaxCreatedOrgs: 'DEFAULT_MAX_CREATED_ORGS', + defaultMaxNbMembers: 'DEFAULT_MAX_NB_MEMBERS' + }, + listEntitiesMode: 'LIST_ENTITIES_MODE', + listUsersMode: 'LIST_USERS_MODE', + listOrganizationsMode: 'LIST_ORGANIZATIONS_MODE', + onlyCreateInvited: 'ONLY_CREATE_INVITED', + singleMembership: 'SINGLE_MEMBERSHIP', + userSelfDelete: 'USER_SELF_DELETE', + defaultLoginRedirect: 'DEFAULT_LOGIN_REDIRECT', + invitationRedirect: 'INVITATION_REDIRECT', + secretKeys: { + sendMails: 'SECRET_SENDMAILS', + limits: 'SECRET_LIMITS', + readAll: 'SECRET_READ_ALL', + metrics: 'SECRET_METRICS', + events: 'SECRET_EVENTS', + sites: 'SECRET_SITES' + }, + listenWhenReady: 'LISTEN_WHEN_READY', + tosUrl: 'TOS_URL', + manageDepartments: 'MANAGE_DEPARTMENTS', + manageDepartmentLabel: 'MANAGE_DEPARTMENT_LABEL', + passwordless: 'PASSWORDLESS', + authRateLimit: { + attempts: 'AUTHRATELIMIT_ATTEMPTS', + duration: 'AUTHRATELIMIT_DURATION' + }, + oauth: { + providers: jsonEnv('OAUTH_PROVIDERS'), + github: { + id: 'OAUTH_GITHUB_ID', + secret: 'OAUTH_GITHUB_SECRET' + }, + facebook: { + id: 'OAUTH_FACEBOOK_ID', + secret: 'OAUTH_FACEBOOK_SECRET' + }, + google: { + id: 'OAUTH_GOOGLE_ID', + secret: 'OAUTH_GOOGLE_SECRET' + }, + linkedin: { + id: 'OAUTH_LINKEDIN_ID', + secret: 'OAUTH_LINKEDIN_SECRET' + } + }, + saml2: { + sp: jsonEnv('SAML2_SP'), + providers: jsonEnv('SAML2_PROVIDERS') + }, + oidc: { + providers: jsonEnv('OIDC_PROVIDERS') + }, + noBirthday: 'NO_BIRTHDAY', + avatars: { + users: 'AVATARS_USERS', + orgs: 'AVATARS_ORGS' + }, + perOrgStorageTypes: jsonEnv('PER_ORG_STORAGE_TYPES'), + cipherPassword: 'CIPHER_PASSWORD', + privateEventsUrl: 'PRIVATE_EVENTS_URL', + plannedDeletionDelay: 'PLANNED_DELETION_DELAY', + cleanup: { + cron: 'CLEANUP_CRON', + deleteInactive: 'CLEANUP_DELETE_INACTIVE', + deleteInactiveDelay: jsonEnv('CLEANUP_DELETE_INACTIVE_DELAY') + }, + alwaysAcceptInvitation: 'ALWAYS_ACCEPT_INVITATION', + observer: { + active: 'OBSERVER_ACTIVE' + }, + depAdminIsOrgAdmin: 'DEP_ADMIN_IS_ORG_ADMIN', + manageSites: 'MANAGE_SITES', + managePartners: 'MANAGE_PARTNERS', + manageSessions: 'MANAGE_SESSIONS', + defaultOrg: 'DEFAULT_ORG' +} diff --git a/api/config/default.cjs b/api/config/default.cjs new file mode 100644 index 00000000..a7c8dba3 --- /dev/null +++ b/api/config/default.cjs @@ -0,0 +1,386 @@ +module.exports = { + port: 8080, + mongo: { + url: 'mongodb://mongo:27017/simple-directory-' + (process.env.NODE_ENV || 'development'), + options: {} + }, + publicUrl: 'http://localhost:8080', + kid: 'sd', + secret: { // DEPRECATED parameters, kept to transition to mongodb storage + public: '/webapp/security/simple-directory.key.pub', + private: '/webapp/security/simple-directory.key' + }, + jwtDurations: { + initialToken: '15m', + exchangeToken: '30d', + idToken: '15m', + invitationToken: '10d', + partnerInvitationToken: '10d', + '2FAToken': '30d' + }, + admins: ['admin@test.com'], + adminsOrg: undefined, + admins2FA: false, + // special case where a email/password is defined at config level for a superadmin + // useful when superadmins cannot be created in the storage (on-premise ldap with heavy constraints ?) + // or to test stuff while email sending is not working yet, etc + adminCredentials: undefined, + roles: { + defaults: ['admin', 'user'] + }, + contact: undefined, + anonymousContactForm: false, + anonymousAction: { + expiresIn: '1d', + notBefore: '8s' + }, + homePage: undefined, + storage: { + // One of 'file', 'mongo' and 'ldap' + type: 'mongo', + file: { + users: './data/users.json', + organizations: './data/organizations.json' + }, + mongo: { + readonly: false + }, + ldap: { + url: 'ldap://ldap:389', + searchUserDN: 'cn=admin,dc=example,dc=org', + searchUserPassword: '', + baseDN: 'dc=example,dc=org', + readonly: true, + // support storing overwritten properties in mongodb + overwrite: ['members', 'departments', 'partners'], + cacheMS: 1000 * 60 * 5, // 5 minutes + // map entities in ldap to SD users + users: { + objectClass: 'inetOrgPerson', + dnKey: 'cn', + mapping: { + id: 'cn', + name: 'cn', // TODO: better to use userName ? + email: 'mail', + firstName: 'givenName', + lastName: 'sn', + // birthday: '', + // avatarUrl: '' + }, + // an array of objects that can be used to overwrite any user properties based on matching "email" property + overwrite: [], + // an array of string filters to add to the filters generated by our ldap storage + extraFilters: [] + }, + // map entities in ldap to SD organizations + organizations: { + // a single static organization, all users are in it + // {id: ..., name: ...} + staticSingleOrg: undefined, + objectClass: 'organization', + dnKey: 'dc', + mapping: { + id: 'dc', + name: 'o' + }, + // an array of objects that can be used to overwrite any org properties based on matching "id" property + overwrite: [], + // an array of string filters to add to the filters generated dy our ldap storage + extraFilters: [] + }, + // manage the link between users and organizations + members: { + // organizations arr the parent DC of their users + organizationAsDC: true, + // only list users/members with a known role + onlyWithRole: false, + role: { + attr: 'employeeType', + /* values: { + admin: ['administrator'], + user: [] + }, */ + values: {}, + default: 'user' + }, + // an array of objects that can be used to overwrite member role based on matching "orgId" and "email" properties + // leave orgId empty to overwrite role for all organizations of the user + overwrite: [] + } + } + }, + info: { + termsOfService: 'https://koumoul.com/term-of-service', + contact: { + name: 'Koumoul', + url: 'https://koumoul.com', + email: 'support@koumoul.com' + } + }, + webhooks: { + identities: [] + }, + analytics: {}, // a "modules" definition for @koumoul/vue-multianalytics + theme: { + logo: undefined, + bodyFontFamilyCss: "@font-face{font-family:{FONT_FAMILY};font-style:italic;font-weight:200 1000;font-display:swap;src:url({SITE_PATH}/simple-directory/fonts/XRXX3I6Li01BKofIMNaORs71cA-Bm_i0Dk1.woff2) format('woff2');unicode-range:U+0460-052F,U+1C80-1C8A,U+20B4,U+2DE0-2DFF,U+A640-A69F,U+FE2E-FE2F}@font-face{font-family:{FONT_FAMILY};font-style:italic;font-weight:200 1000;font-display:swap;src:url({SITE_PATH}/simple-directory/fonts/XRXX3I6Li01BKofIMNaHRs71cA-Cznx39fA.woff2) format('woff2');unicode-range:U+0301,U+0400-045F,U+0490-0491,U+04B0-04B1,U+2116}@font-face{font-family:{FONT_FAMILY};font-style:italic;font-weight:200 1000;font-display:swap;src:url({SITE_PATH}/simple-directory/fonts/XRXX3I6Li01BKofIMNaMRs71cA-CuWrHpFO.woff2) format('woff2');unicode-range:U+0102-0103,U+0110-0111,U+0128-0129,U+0168-0169,U+01A0-01A1,U+01AF-01B0,U+0300-0301,U+0303-0304,U+0308-0309,U+0323,U+0329,U+1EA0-1EF9,U+20AB}@font-face{font-family:{FONT_FAMILY};font-style:italic;font-weight:200 1000;font-display:swap;src:url({SITE_PATH}/simple-directory/fonts/XRXX3I6Li01BKofIMNaNRs71cA-D1eeM49Z.woff2) format('woff2');unicode-range:U+0100-02BA,U+02BD-02C5,U+02C7-02CC,U+02CE-02D7,U+02DD-02FF,U+0304,U+0308,U+0329,U+1D00-1DBF,U+1E00-1E9F,U+1EF2-1EFF,U+2020,U+20A0-20AB,U+20AD-20C0,U+2113,U+2C60-2C7F,U+A720-A7FF}@font-face{font-family:{FONT_FAMILY};font-style:italic;font-weight:200 1000;font-display:swap;src:url({SITE_PATH}/simple-directory/fonts/XRXX3I6Li01BKofIMNaDRs4-BbMn9XSX.woff2) format('woff2');unicode-range:U+0000-00FF,U+0131,U+0152-0153,U+02BB-02BC,U+02C6,U+02DA,U+02DC,U+0304,U+0308,U+0329,U+2000-206F,U+20AC,U+2122,U+2191,U+2193,U+2212,U+2215,U+FEFF,U+FFFD}@font-face{font-family:{FONT_FAMILY};font-style:normal;font-weight:200 1000;font-display:swap;src:url({SITE_PATH}/simple-directory/fonts/XRXV3I6Li01BKofIOOaBXso-BWI5zH9R.woff2) format('woff2');unicode-range:U+0460-052F,U+1C80-1C8A,U+20B4,U+2DE0-2DFF,U+A640-A69F,U+FE2E-FE2F}@font-face{font-family:{FONT_FAMILY};font-style:normal;font-weight:200 1000;font-display:swap;src:url({SITE_PATH}/simple-directory/fonts/XRXV3I6Li01BKofIMeaBXso-C3IBG1kp.woff2) format('woff2');unicode-range:U+0301,U+0400-045F,U+0490-0491,U+04B0-04B1,U+2116}@font-face{font-family:{FONT_FAMILY};font-style:normal;font-weight:200 1000;font-display:swap;src:url({SITE_PATH}/simple-directory/fonts/XRXV3I6Li01BKofIOuaBXso-B55YuedR.woff2) format('woff2');unicode-range:U+0102-0103,U+0110-0111,U+0128-0129,U+0168-0169,U+01A0-01A1,U+01AF-01B0,U+0300-0301,U+0303-0304,U+0308-0309,U+0323,U+0329,U+1EA0-1EF9,U+20AB}@font-face{font-family:{FONT_FAMILY};font-style:normal;font-weight:200 1000;font-display:swap;src:url({SITE_PATH}/simple-directory/fonts/XRXV3I6Li01BKofIO-aBXso-DcJfvmGA.woff2) format('woff2');unicode-range:U+0100-02BA,U+02BD-02C5,U+02C7-02CC,U+02CE-02D7,U+02DD-02FF,U+0304,U+0308,U+0329,U+1D00-1DBF,U+1E00-1E9F,U+1EF2-1EFF,U+2020,U+20A0-20AB,U+20AD-20C0,U+2113,U+2C60-2C7F,U+A720-A7FF}@font-face{font-family:{FONT_FAMILY};font-style:normal;font-weight:200 1000;font-display:swap;src:url({SITE_PATH}/simple-directory/fonts/XRXV3I6Li01BKofINeaB-BaTF6Vo7.woff2) format('woff2');unicode-range:U+0000-00FF,U+0131,U+0152-0153,U+02BB-02BC,U+02C6,U+02DA,U+02DC,U+0304,U+0308,U+0329,U+2000-206F,U+20AC,U+2122,U+2191,U+2193,U+2212,U+2215,U+FEFF,U+FFFD}", + headingFontFamilyCss: undefined, + colors: { + // standard vuetify colors, see https://vuetifyjs.com/en/styles/colors/#material-colors + background: '#FAFAFA', // grey-lighten-5 + 'on-background': '#424242', // grey-darken-3 + surface: '#FFFFFF', + 'on-surface': '#424242', // grey-darken-3 + primary: '#1976D2', // blue-darken-2 + 'on-primary': '#FFFFFF', + 'text-primary': '#1565C0', + secondary: '#81D4FA', // light-blue-lighten-3 + 'on-secondary': '#000000', + 'text-secondary': '#0277BD', // light-blue-darken-3 + accent: '#2962FF', // blue-accent-4 + 'on-accent': '#FFFFFF', + 'text-accent': undefined, + info: '#FFE0B2', // orange-lighten-4 + 'on-info': '#000000', + 'text-info': '#BF4300', + success: '#B9F6CA', // green-accent-1 + 'on-success': '#000000', + 'text-success': '#2E7D32', // green-darken-3 + error: '#D50000', // red-accent-4 + 'on-error': '#FFFFFF', + 'text-error': undefined, + warning: '#D81B60', // pink-darken-1 + 'on-warning': '#FFFFFF', + 'text-warning': undefined, + admin: '#B71C1C', // red-darken-4 + 'on-admin': '#FFFFFF', + 'text-admin': undefined, + }, + dark: false, + darkColors: { + background: '#121212', + 'on-background': '#FFFFFF', // white + surface: '#212121', + 'on-surface': '#FFFFFF', // white + primary: '#1976D2', // blue-darken-2 + 'on-primary': '#FFFFFF', // white + 'text-primary': '#2196F3', // blue + secondary: '#BBDEFB', // blue-lighten-4 + 'on-secondary': '#000000', + 'text-secondary': undefined, + accent: '#2962FF', // blue-accent-1 + 'on-accent': '#FFFFFF', + 'text-accent': '#82B1FF', + error: '#D50000', // red-accent-4 + 'on-error': '#FFFFFF', + 'text-error': '#FF5252', // red-accent-2 + info: '#FFE0B2', + 'on-info': '#000000', + 'text-info': undefined, + success: '#B9F6CA', // green-accent-1 + 'on-success': '#000000', + 'text-success': undefined, + warning: '#D81B60', // pink-darken-1 + 'on-warning': '#FFFFFF', + 'text-warning': '#FF4081', // pink-accent-2 + admin: '#B71C1C', // red-darken-4 + 'on-admin': '#FFFFFF', + 'text-admin': '#FFCDD2' + }, + hc: false, + hcColors: { + // standard vuetify colors, see https://vuetifyjs.com/en/styles/colors/#material-colors + background: '#FFFFFF', + 'on-background': '#000000', + surface: '#FFFFFF', + 'on-surface': '#000000', + primary: '#0D47A1', // blue-darken-4 + 'on-primary': '#FFFFFF', + 'text-primary': undefined, + secondary: '#81D4FA', // light-blue-lighten-3 + 'on-secondary': '#000000', + 'text-secondary': '#01579B', // light-blue-darken-3 + accent: '#1d44b3', // blue-accent-4 + 'on-accent': '#FFFFFF', + 'text-accent': undefined, + info: '#FFE0B2', // orange-lighten-4 + 'on-info': '#000000', + 'text-info': '#993500', + success: '#B9F6CA', // green-accent-1 + 'on-success': '#000000', + 'text-success': '#1B5E20', // green-darken-4 + error: '#b30000', + 'on-error': '#FFFFFF', + 'text-error': undefined, + warning: '#880E4F', // pink-darken-4 + 'on-warning': '#FFFFFF', + 'text-warning': undefined, + admin: '#b30000', + 'on-admin': '#FFFFFF', + 'text-admin': undefined, + }, + hcDark: false, + hcDarkColors: { + background: '#121212', + 'on-background': '#FFFFFF', // white + surface: '#121212', + 'on-surface': '#FFFFFF', // white + primary: '#0D47A1', // blue-darken-4 + 'on-primary': '#FFFFFF', // white + 'text-primary': '#42A5F5', // blue-lighten-1 + secondary: '#BBDEFB', // blue-lighten-4 + 'on-secondary': '#000000', + 'text-secondary': undefined, + accent: '#1d44b3', // blue-accent-1 + 'on-accent': '#FFFFFF', + 'text-accent': '#82B1FF', + error: '#b30000', + 'on-error': '#FFFFFF', + 'text-error': '#FF8A80', // red-accent-1 + info: '#FFE0B2', + 'on-info': '#000000', + 'text-info': undefined, + success: '#B9F6CA', // green-accent-1 + 'on-success': '#000000', + 'text-success': undefined, + warning: '#880E4F', // pink-darken-4 + 'on-warning': '#FFFFFF', + 'text-warning': '#FF80AB', // pink-accent-1 + admin: '#b30000', + 'on-admin': '#FFFFFF', + 'text-admin': '#FFCDD2' + }, + }, + i18n: { + defaultLocale: 'fr', + locales: ['fr', 'en', 'es', 'pt', 'it', 'de'] + }, + mails: { + from: 'no-reply@test.com', + // transport is a full configuration object for createTransport of nodemailer + // cf https://nodemailer.com/smtp/ + transport: { + port: 1025, + ignoreTLS: true, + host: 'localhost' + }, + extraParams: {} + }, + maildev: { + url: 'http://localhost:1080', + active: false + }, + quotas: { + defaultMaxCreatedOrgs: -1, + defaultMaxNbMembers: 0 + }, + // Restricts who can use the find endpoints on users and organizations + // One of 'anonymous', 'authenticated' or 'admin' + listEntitiesMode: 'authenticated', + listUsersMode: undefined, // same as listEntitiesMode but only for users + listOrganizationsMode: undefined, // same as listEntitiesMode but only for users + // Users can not be created at first email sent. They must be invited in an organization. + // also they will not be able to log with personal account + // and if removed from their last organization they will be deleted + onlyCreateInvited: false, + // prevent inviting a user in multiple departments of the same organization + singleMembership: false, + // users cannot delete their own account by default + userSelfDelete: false, + // Default redirection after login. If not specified user will go to his profile page. + defaultLoginRedirect: undefined, + // Redirect after successful invitation to an organization. + // If not specified user will go to a dedicated page on simple-directory. + invitationRedirect: undefined, + // secrets that can be used to configure global webhooks for example to send emails to users + secretKeys: { + sendMails: undefined, + limits: undefined, + readAll: undefined, + metrics: undefined, + events: undefined, + sites: undefined + }, + // A link to the terms of services for the site + tosUrl: undefined, + manageDepartments: false, + manageDepartmentLabel: false, + passwordless: true, + authRateLimit: { + attempts: 5, + duration: 60 + }, + // Example of full oauth provider configuration + // oauth: {providers: [{ + // id: 'github', + // title: 'GitHub', + // icon: 'M12,2A10,10 0 0,0 2,12C2,16.42 4.87,20.17 8.84,21.5C9.34,21.58 9.5,21.27 9.5,21C9.5,20.77 9.5,20.14 9.5,19.31C6.73,19.91 6.14,17.97 6.14,17.97C5.68,16.81 5.03,16.5 5.03,16.5C4.12,15.88 5.1,15.9 5.1,15.9C6.1,15.97 6.63,16.93 6.63,16.93C7.5,18.45 8.97,18 9.54,17.76C9.63,17.11 9.89,16.67 10.17,16.42C7.95,16.17 5.62,15.31 5.62,11.5C5.62,10.39 6,9.5 6.65,8.79C6.55,8.54 6.2,7.5 6.75,6.15C6.75,6.15 7.59,5.88 9.5,7.17C10.29,6.95 11.15,6.84 12,6.84C12.85,6.84 13.71,6.95 14.5,7.17C16.41,5.88 17.25,6.15 17.25,6.15C17.8,7.5 17.45,8.54 17.35,8.79C18,9.5 18.38,10.39 18.38,11.5C18.38,15.32 16.04,16.16 13.81,16.41C14.17,16.72 14.5,17.33 14.5,18.26C14.5,19.6 14.5,20.68 14.5,21C14.5,21.27 14.66,21.59 15.17,21.5C19.14,20.16 22,16.42 22,12A10,10 0 0,0 12,2Z', + // color: '#4078c0', + // scope: 'user:email' + // client: { + // id: '...', + // secret: '...' + // }, + // auth: { + // tokenHost: 'https://github.com', + // tokenPath: '/login/oauth/access_token', + // authorizePath: '/login/oauth/authorize' + // } + // }]} + oauth: { + providers: [], + github: { + id: '', + secret: '' + }, + facebook: { + id: '', + secret: '' + }, + google: { + id: '', + secret: '' + }, + linkedin: { + id: '', + secret: '' + } + }, + saml2: { + // certsDirectory: './security/saml2', + // Accepts all samlify options for service providers https://samlify.js.org/#/sp-configuration + sp: {}, + // providers have the usual title/color/icon/img attributes and all extra options accepted by samlify + // for identify provider https://samlify.js.org/#/idp-configuration + providers: [] + }, + oidc: { + providers: [] + }, + noBirthday: false, + avatars: { + users: true, + orgs: true + }, + // allow configuring external storages per organization + perOrgStorageTypes: [], + cipherPassword: undefined, + privateEventsUrl: undefined, + plannedDeletionDelay: 14, + cleanup: { + cron: '0 5 * * *', + deleteInactive: false, + deleteInactiveDelay: [3, 'years'] + }, + alwaysAcceptInvitation: false, + observer: { + active: true + }, + // temporary option to prevent some regression + depAdminIsOrgAdmin: false, + manageSites: false, + managePartners: false, + manageSessions: true, + defaultOrg: undefined, + serveUi: true +} diff --git a/config/development.js b/api/config/development.cjs similarity index 90% rename from config/development.js rename to api/config/development.cjs index 504ddcf2..1e83773b 100644 --- a/config/development.js +++ b/api/config/development.cjs @@ -1,4 +1,7 @@ module.exports = { + mongo: { + url: 'mongodb://localhost:27017/simple-directory-' + (process.env.NODE_ENV || 'development') + }, port: 5690, publicUrl: 'http://localhost:5689/simple-directory', // use this host when debugging a data-fair inside a virtualbox vm @@ -18,37 +21,31 @@ module.exports = { } }, homePage: 'https://koumoul.com', + contact: 'contact@test.com', anonymousContactForm: true, jwtDurations: { initialToken: '5m', - // exchangedToken: '5m', + // idToken: '5m', + // exchangeToken: '5m', invitationToken: '5m' }, i18n: { - locales: ['fr', 'en', 'es', 'it', 'pt', 'de'] + // defaultLocale: 'en' }, maildev: { active: true }, - mails: { - from: 'no-reply@test.com' - }, - secret: { - public: './test/resources/test.key.pub', - private: './test/resources/test.key' - }, storage: { type: 'mongo', // type: 'ldap', file: { - users: './test/resources/users.json', - organizations: './test/resources/organizations.json' - }, - mongo: { - url: 'mongodb://localhost:27017/simple-directory-' + (process.env.NODE_ENV || 'development') + users: './dev/resources/users.json', + organizations: './dev/resources/organizations.json' }, ldap: { url: 'ldap://localhost:389', + searchUserDN: 'cn=admin,dc=example,dc=org', + searchUserPassword: 'admin', members: { role: { attr: 'employeeType', @@ -73,26 +70,20 @@ module.exports = { defaultMaxCreatedOrgs: 1 // defaultMaxNbMembers: 0 }, - passwordless: false, + passwordless: true, userSelfDelete: true, secretKeys: { sendMails: 'testkey', limits: 'testkey', readAll: 'testkey', metrics: 'testkey', - notifications: 'secret-notifications', + events: 'secret-events', sites: 'secret-sites' }, - noUI: true, perOrgStorageTypes: ['ldap'], cipherPassword: 'dev', - notifyUrl: 'http://localhost:5689/notify', - privateNotifyUrl: 'http://localhost:8088', + privateEventsUrl: 'http://localhost:8088', plannedDeletionDelay: 1, - locks: { - // in seconds - ttl: 20 - }, cleanup: { cron: '*/1 * * * *', deleteInactive: true, @@ -105,7 +96,7 @@ module.exports = { providers: [{ title: 'Test SAML IDP', color: '#444791', - icon: 'mdi-connection', + icon: 'M21.4 7.5C22.2 8.3 22.2 9.6 21.4 10.3L18.6 13.1L10.8 5.3L13.6 2.5C14.4 1.7 15.7 1.7 16.4 2.5L18.2 4.3L21.2 1.3L22.6 2.7L19.6 5.7L21.4 7.5M15.6 13.3L14.2 11.9L11.4 14.7L9.3 12.6L12.1 9.8L10.7 8.4L7.9 11.2L6.4 9.8L3.6 12.6C2.8 13.4 2.8 14.7 3.6 15.4L5.4 17.2L1.4 21.2L2.8 22.6L6.8 18.6L8.6 20.4C9.4 21.2 10.7 21.2 11.4 20.4L14.2 17.6L12.8 16.2L15.6 13.3Z', /* redirectMode: { type: 'always' }, */ @@ -142,7 +133,7 @@ module.exports = { // this provider tries to use a cookie with samesite=none option and this is not permitted without https providers: [{ title: 'Test OIDC IDP', - color: '#288E35', + color: '#D92929', img: 'https://cdn-icons-png.flaticon.com/512/25/25231.png', discovery: 'http://localhost:9009/.well-known/openid-configuration', client: { @@ -176,7 +167,7 @@ module.exports = { */ title: 'Test OIDC Keycloak', - color: '#62c4df', + color: '#D92929', img: 'https://upload.wikimedia.org/wikipedia/commons/2/29/Keycloak_Logo.png', discovery: 'http://localhost:8888/realms/master/.well-known/openid-configuration', client: { @@ -200,5 +191,6 @@ module.exports = { }, manageSites: true, managePartners: true, - defaultOrg: 'admins-org' + defaultOrg: 'admins-org', + serveUi: false } diff --git a/config/production.js b/api/config/production.cjs similarity index 100% rename from config/production.js rename to api/config/production.cjs diff --git a/api/config/test.cjs b/api/config/test.cjs new file mode 100644 index 00000000..ba9a040c --- /dev/null +++ b/api/config/test.cjs @@ -0,0 +1,46 @@ +module.exports = { + mongo: { + url: 'mongodb://localhost:27017/data-fair-' + (process.env.NODE_ENV || 'test') + }, + port: 5690, + publicUrl: 'http://localhost:5689/simple-directory', + admins: ['admin@test.com'], + contact: 'contact@test.com', + storage: { + type: 'file', + file: { + users: './dev/resources/users.json', + organizations: './dev/resources/organizations.json' + }, + mongo: {}, + ldap: { + url: 'ldap://localhost:389', + cacheMS: 0, + searchUserDN: 'cn=admin,dc=example,dc=org', + searchUserPassword: 'admin' + } + }, + secretKeys: { + sendMails: 'testkey', + limits: 'testkey', + readAll: 'testkey', + metrics: 'testkey', + events: 'testkey', + sites: 'testkey' + }, + authRateLimit: { + attempts: 100, + duration: 60 + }, + perOrgStorageTypes: ['ldap'], + maildev: { + active: true + }, + manageSites: true, + managePartners: true, + cipherPassword: 'test', + serveUi: false, + observer: { + active: false + } +} diff --git a/api/config/type/index.ts b/api/config/type/index.ts new file mode 100644 index 00000000..f5d615bd --- /dev/null +++ b/api/config/type/index.ts @@ -0,0 +1 @@ +export * from './.type/index.js' diff --git a/api/config/type/schema.json b/api/config/type/schema.json new file mode 100644 index 00000000..f84e8a0e --- /dev/null +++ b/api/config/type/schema.json @@ -0,0 +1,1007 @@ +{ + "$id": "https://github.com/data-fair/simple-directory/api/config", + "x-exports": [ + "types", + "validate" + ], + "x-ajv": { + "coerceTypes": "array" + }, + "x-jstt": { + "additionalProperties": false + }, + "type": "object", + "title": "Api config", + "required": [ + "info", + "publicUrl", + "secret", + "kid", + "contact", + "mongo", + "port", + "observer", + "secretKeys", + "theme", + "i18n", + "admins", + "storage", + "cipherPassword", + "anonymousAction", + "quotas", + "jwtDurations", + "perOrgStorageTypes", + "mails", + "maildev", + "roles", + "listEntitiesMode", + "oauth", + "oidc", + "saml2", + "webhooks", + "authRateLimit", + "plannedDeletionDelay", + "cleanup", + "avatars", + "noBirthday" + ], + "properties": { + "info": { + "type": "object" + }, + "port": { + "type": "number" + }, + "publicUrl": { + "type": "string" + }, + "homePage": { + "type": "string" + }, + "mongo": { + "type": "object", + "required": [ + "url", + "options" + ], + "properties": { + "url": { "type": "string" }, + "options": { + "type": "object" + } + } + }, + "secret": { + "type": "object", + "required": [ + "public", + "private" + ], + "properties": { + "public": { "type": "string" }, + "private": { "type": "string" } + } + }, + "kid": { + "type": "string" + }, + "secretKeys": { + "type": "object", + "properties": { + "identities": { "type": "string" }, + "events": { "type": "string" }, + "sendMails": { "type": "string" }, + "limits": { "type": "string" }, + "readAll": { "type": "string" }, + "sites": { "type": "string" } + } + }, + "observer": { + "type": "object", + "properties": { + "active": { + "type": "boolean" + }, + "port": { + "type": "number" + } + } + }, + "theme": { "$ref": "#/$defs/theme" }, + "i18n": { + "type": "object", + "required": [ + "defaultLocale", + "locales" + ], + "properties": { + "defaultLocale": { + "type": "string", + "default": "fr" + }, + "locales": { + "type": "array", + "items": { + "type": "string" + } + } + } + }, + "admins": { + "type": "array", + "items": { + "type": "string" + } + }, + "adminsOrg": { + "type": "object", + "required": [ + "id", + "name" + ], + "properties": { + "id": { "type": "string" }, + "name": { "type": "string" } + } + }, + "adminCredentials": { + "type": "object", + "properties": { + "email": { "type": "string" }, + "password": { + "type": "object" + } + } + }, + "cipherPassword": { + "type": "string" + }, + "storage": { + "type": "object", + "required": [ + "type", + "file", + "mongo", + "ldap" + ], + "properties": { + "type": { + "type": "string", + "enum": [ + "file", + "mongo", + "ldap" + ] + }, + "file": { + "$ref": "#/$defs/fileParams" + }, + "mongo": { + "type": "object", + "properties": { + "readonly": { + "type": "boolean" + }, + "url": { + "type": "string", + "deprecated": true + }, + "options": { + "type": "object", + "deprecated": true + } + } + }, + "ldap": { + "$ref": "https://github.com/data-fair/simple-directory/ldap-params" + } + } + }, + "onlyCreateInvited": { + "type": "boolean" + }, + "manageSites": { + "type": "boolean" + }, + "managePartners": { + "type": "boolean" + }, + "manageDepartments": { + "type": "boolean" + }, + "manageDepartmentLabel": { + "type": "boolean" + }, + "manageSessions": { + "type": "boolean" + }, + "contact": { + "type": "string", + "format": "email" + }, + "anonymousContactForm": { + "type": "boolean" + }, + "anonymousAction": { + "type": "object", + "required": [ + "expiresIn", + "notBefore" + ], + "properties": { + "expiresIn": { "type": "string" }, + "notBefore": { "type": "string" } + } + }, + "quotas": { + "type": "object", + "required": [ + "defaultMaxCreatedOrgs", + "defaultMaxNbMembers" + ], + "properties": { + "defaultMaxCreatedOrgs": { + "type": "number" + }, + "defaultMaxNbMembers": { + "type": "number" + } + } + }, + "depAdminIsOrgAdmin": { + "type": "boolean" + }, + "alwaysAcceptInvitation": { + "type": "boolean" + }, + "invitationRedirect": { + "type": "string" + }, + "jwtDurations": { + "type": "object", + "required": [ + "initialToken", + "idToken", + "exchangeToken", + "invitationToken", + "partnerInvitationToken", + "2FAToken" + ], + "properties": { + "initialToken": { "type": "string" }, + "idToken": { "type": "string" }, + "exchangeToken": { "type": "string" }, + "invitationToken": { "type": "string" }, + "partnerInvitationToken": { "type": "string" }, + "2FAToken": { "type": "string" } + } + }, + "passwordless": { + "type": "boolean" + }, + "perOrgStorageTypes": { + "type": "array", + "items": { + "type": "string" + } + }, + "defaultLoginRedirect": { + "type": "string" + }, + "mails": { + "type": "object", + "properties": { + "from": { "type": "string" }, + "transport": { + "type": "object" + }, + "extraParams": { + "type": "object" + } + } + }, + "maildev": { + "type": "object", + "required": [ + "url", + "active" + ], + "properties": { + "url": { + "type": "string" + }, + "active": { + "type": "boolean" + } + } + }, + "listEntitiesMode": { + "enum": [ + "anonymous", + "authenticated", + "admin" + ] + }, + "listUsersMode": { + "enum": [ + "anonymous", + "authenticated", + "admin" + ] + }, + "listOrganizationsMode": { + "enum": [ + "anonymous", + "authenticated", + "admin" + ] + }, + "roles": { + "type": "object", + "required": [ + "defaults" + ], + "properties": { + "defaults": { + "type": "array", + "items": { + "type": "string" + } + } + } + }, + "oauth": { + "type": "object", + "required": [ + "providers", + "github", + "facebook", + "google", + "linkedin" + ], + "properties": { + "providers": { + "type": "array", + "items": { + "enum": [ + "github", + "facebook", + "google", + "linkedin" + ] + } + }, + "github": { + "$ref": "#/$defs/oauthClient" + }, + "facebook": { + "$ref": "#/$defs/oauthClient" + }, + "google": { + "$ref": "#/$defs/oauthClient" + }, + "linkedin": { + "$ref": "#/$defs/oauthClient" + } + } + }, + "oidc": { + "type": "object", + "required": [ + "providers" + ], + "properties": { + "providers": { + "type": "array", + "items": { + "$ref": "#/$defs/oidcProvider" + } + } + } + }, + "saml2": { + "type": "object", + "required": [ + "sp", + "providers" + ], + "properties": { + "sp": { + "type": "object" + }, + "providers": { + "type": "array", + "items": { + "$ref": "#/$defs/saml2Provider" + } + } + } + }, + "webhooks": { + "type": "object", + "required": [ + "identities" + ], + "properties": { + "identities": { + "type": "array", + "items": { + "type": "object", + "required": [ + "key" + ], + "properties": { + "base": { + "type": "string" + }, + "key": { + "type": "string" + } + } + } + } + } + }, + "authRateLimit": { + "type": "object", + "required": [ + "attempts", + "duration" + ], + "properties": { + "attempts": { + "type": "integer" + }, + "duration": { + "type": "integer" + } + } + }, + "plannedDeletionDelay": { + "type": "integer" + }, + "cleanup": { + "type": "object", + "required": [ + "cron", + "deleteInactive", + "deleteInactiveDelay" + ], + "properties": { + "cron": { "type": "string" }, + "deleteInactive": { + "type": "boolean" + }, + "deleteInactiveDelay": { + "type": "array", + "minItems": 2, + "items": [ + { + "type": "integer" + }, + { + "type": "string", + "enum": [ + "days", + "weeks", + "months", + "years" + ] + } + ] + } + } + }, + "defaultOrg": { + "type": "string" + }, + "userSelfDelete": { + "type": "boolean" + }, + "admins2FA": { + "type": "boolean" + }, + "singleMembership": { + "type": "boolean" + }, + "serveUi": { + "type": "boolean" + }, + "tosUrl": { + "type": "string" + }, + "avatars": { + "type": "object", + "properties": { + "users": { + "type": "boolean" + }, + "orgs": { + "type": "boolean" + } + } + }, + "noBirthday": { + "type": "boolean" + }, + "privateEventsUrl": { + "type": "string" + } + }, + "$defs": { + "oauthClient": { + "type": "object", + "required": [ + "id", + "secret" + ], + "properties": { + "id": { "type": "string" }, + "secret": { "type": "string" } + } + }, + "oidcProvider": { + "type": "object", + "title": "OpenID Connect", + "required": [ + "title", + "discovery", + "client" + ], + "allOf": [ + { + "properties": { + "title": { + "type": "string" + } + } + }, + { + "$ref": "https://github.com/data-fair/simple-directory/site#/$defs/oidcProvider" + } + ] + }, + "saml2Provider": { + "type": "object", + "title": "Saml 2", + "required": [ + "title" + ], + "properties": { + "metadata": { "type": "string" }, + "title": { "type": "string" }, + "color": { "type": "string" }, + "icon": { "type": "string" }, + "img": { "type": "string" }, + "coreIdProvider": { + "type": "boolean" + }, + "redirectMode": { + "$ref": "#/$defs/redirectMode" + } + } + }, + "redirectMode": { + "type": "object", + "description": "Si vous utilisez un mode basé sur l'email alors la mire d'authentification demandera l'email de l'utilisateur en 1ère étape.", + "default": { + "type": "button" + }, + "oneOf": [ + { + "title": "bouton", + "properties": { + "type": { + "const": "button", + "title": "Controlez la manière dont les utilisateurs sont redirigés vers ce fournisseur" + } + } + }, + { + "title": "redirection auto quand l'email appartient à un nom de domaine", + "properties": { + "type": { + "const": "emailDomain" + }, + "emailDomain": { + "type": "string", + "title": "nom de domaine de l'email" + } + } + }, + { + "title": "toujours rediriger implicitement", + "properties": { + "type": { + "const": "always" + } + } + } + ] + }, + "fileParams": { + "type": "object", + "required": [ + "users", + "organizations" + ], + "properties": { + "users": { "type": "string" }, + "organizations": { "type": "string" } + } + }, + "theme": { + "type": "object", + "title": "Thème", + "required": ["colors"], + "layout": [ + "logo", + {"key": "bodyFontFamilyCss", "cols": 6}, + {"key": "headingFontFamilyCss", "cols": 6}, + "assistedMode", + { + "comp": "tabs", + "if": "data.assistedMode", + "children": [{ + "title": "Thème par défaut", + "children": [ + { "key": "assistedModeColors", "cols": {"sm": 7, "lg": 9} }, + { "name": "colors-preview", "cols": {"sm": 5, "lg": 3}, "props": { "colorsKey": "colors", "dark": false } } + ] + }, { + "title": "Thème sombre", + "children": [ + { "key": "dark", "cols": {"sm": 7, "lg": 9} }, + { "name": "colors-preview", "cols": {"sm": 5, "lg": 3}, "props": { "colorsKey": "darkColors", "dark": true } } + ] + }, { + "title": "Thème à fort contraste", + "children": [ + { "key": "hc", "cols": {"sm": 7, "lg": 9} }, + { "name": "colors-preview", "cols": {"sm": 5, "lg": 3}, "props": { "colorsKey": "hcColors", "dark": false } } + ] + }, { + "title": "Thème sombre à fort contraste", + "children": [ + { "key": "hcDark", "cols": {"sm": 7, "lg": 9} }, + { "name": "colors-preview", "cols": {"sm": 5, "lg": 3}, "props": { "colorsKey": "hcDarkColors", "dark": true } } + ] + }] + }, + { + "comp": "tabs", + "if": "!data.assistedMode", + "children": [{ + "title": "Thème par défaut", + "children": [ + { "key": "colors", "cols": {"sm": 7, "lg": 9} }, + { "name": "colors-preview", "cols": {"sm": 5, "lg": 3}, "props": { "colorsKey": "colors", "dark": false } } + ] + }, { + "title": "Thème sombre", + "children": [ + { "children": ["dark", "darkColors"], "cols": {"sm": 7, "lg": 9} }, + { "name": "colors-preview", "cols": {"sm": 5, "lg": 3}, "props": { "colorsKey": "darkColors", "dark": true } } + ] + }, { + "title": "Thème à fort contraste", + "children": [ + { "children": ["hc", "hcColors"], "cols": {"sm": 7, "lg": 9} }, + { "name": "colors-preview", "cols": {"sm": 5, "lg": 3}, "props": { "colorsKey": "hcColors", "dark": false } } + ] + }, { + "title": "Thème sombre à fort contraste", + "children": [ + { "children": ["hcDark", "hcDarkColors"], "cols": {"sm": 7, "lg": 9} }, + { "name": "colors-preview", "cols": {"sm": 5, "lg": 3}, "props": { "colorsKey": "hcDarkColors", "dark": true } } + ] + }] + } + ], + "properties": { + "logo": { + "title": "URL d'un logo", + "type": "string" + }, + "bodyFontFamilyCss": { + "title": "CSS police de caractères pour le corps du texte", + "layout": { + "comp": "textarea", + "rows": 3 + }, + "description": "Par défaut une police Nunito auto-hébergée est utilisée. Vous pouvez aussi copier le CSS proposé par une plateforme comme Google Fonts, dans ce cas il faut remplacer le nom de la police par '{FONT_FAMILY}'.", + "type": "string" + }, + "headingFontFamilyCss": { + "title": "CSS police de caractères pour les titres", + "layout": { + "comp": "textarea", + "rows": 3 + }, + "description": "Renseignez de la même manière que pour le corps de texte, ou laissez vide pour utiliser la police du corps du texte", + "type": "string" + }, + "assistedMode": { + "type": "boolean", + "title": "mode de gestion des couleurs simplifié", + "description": "Si activé vous ne devrez saisir que les couleurs principales du thème, d'autres couleurs seront affectées par défaut et les couleurs de texte seront automatiquement ajustées pour être lisibles sur les couleurs de fond.", + "default": true + }, + "assistedModeColors": { + "type": "object", + "properties": { + "primary": { + "type": "string", + "title": "Couleur principale", + "layout": { + "comp": "color-picker", + "cols": 4 + } + }, + "secondary": { + "type": "string", + "title": "Couleur secondaire", + "layout": { + "comp": "color-picker", + "cols": 4 + } + }, + "accent": { + "type": "string", + "title": "Couleur accentuée", + "layout": { + "comp": "color-picker", + "cols": 4 + } + } + } + }, + "colors": { "$ref": "#/$defs/colors" }, + "dark": { "type": "boolean", "title": "proposer ce thème aux utilisateurs" }, + "darkColors": { "$ref": "#/$defs/colors" }, + "hc": { "type": "boolean", "title": "proposer ce thème aux utilisateurs" }, + "hcColors": { "$ref": "#/$defs/colors" }, + "hcDark": { "type": "boolean", "title": "proposer ce thème aux utilisateurs" }, + "hcDarkColors": { "$ref": "#/$defs/colors" } + } + }, + "colors": { + "type": "object", + "additionalProperties": false, + "required": [ + "background", + "on-background", + "surface", + "on-surface", + "primary", + "on-primary", + "secondary", + "on-secondary", + "accent", + "on-accent", + "error", + "on-error", + "info", + "on-info", + "success", + "on-success", + "warning", + "on-warning", + "admin", + "on-admin" + ], + "properties": { + "background": { + "type": "string", + "title": "Couleur de fond", + "layout": { + "comp": "color-picker", + "cols": 3 + } + }, + "on-background": { + "type": "string", + "title": "Couleur de texte sur couleur de fond", + "layout": { + "comp": "color-picker", + "cols": 3 + } + }, + "surface": { + "type": "string", + "title": "Couleur des surfaces (vignettes, listes, etc)", + "layout": { + "comp": "color-picker", + "cols": 3 + } + }, + "on-surface": { + "type": "string", + "title": "Couleur de texte sur couleur des surfaces", + "layout": { + "comp": "color-picker", + "cols": 3 + } + }, + "primary": { + "type": "string", + "title": "Couleur principale", + "layout": { + "comp": "color-picker", + "cols": 4 + } + }, + "on-primary": { + "type": "string", + "title": "Couleur de texte sur couleur principale", + "layout": { + "comp": "color-picker", + "cols": 4 + } + }, + "text-primary": { + "type": "string", + "title": "Couleur de texte principal", + "layout": { + "comp": "color-picker", + "cols": 4, + "hint": "laissez vide pour utiliser la couleur principale" + } + }, + "secondary": { + "type": "string", + "title": "Couleur secondaire", + "layout": { + "comp": "color-picker", + "cols": 4 + } + }, + "on-secondary": { + "type": "string", + "title": "Couleur de texte sur couleur secondaire", + "layout": { + "comp": "color-picker", + "cols": 4 + } + }, + "text-secondary": { + "type": "string", + "title": "Couleur de texte secondaire", + "layout": { + "comp": "color-picker", + "cols": 4, + "hint": "laissez vide pour utiliser la couleur secondaire" + } + }, + "accent": { + "type": "string", + "title": "Couleur accentuée", + "layout": { + "comp": "color-picker", + "cols": 4 + } + }, + "on-accent": { + "type": "string", + "title": "Couleur de texte sur couleur accentuée", + "layout": { + "comp": "color-picker", + "cols": 4 + } + }, + "text-accent": { + "type": "string", + "title": "Couleur de texte accentué", + "layout": { + "comp": "color-picker", + "cols": 4, + "hint": "laissez vide pour utiliser la couleur accentuée" + } + }, + "info": { + "type": "string", + "title": "Couleur info", + "layout": { + "comp": "color-picker", + "cols": 4 + } + }, + "on-info": { + "type": "string", + "title": "Couleur de texte sur couleur info", + "layout": { + "comp": "color-picker", + "cols": 4 + } + }, + "text-info": { + "type": "string", + "title": "Couleur de texte info", + "layout": { + "comp": "color-picker", + "cols": 4, + "hint": "laissez vide pour utiliser la couleur info" + } + }, + "success": { + "type": "string", + "title": "Couleur succès", + "layout": { + "comp": "color-picker", + "cols": 4 + } + }, + "on-success": { + "type": "string", + "title": "Couleur succès", + "layout": { + "comp": "color-picker", + "cols": 4 + } + }, + "text-success": { + "type": "string", + "title": "Couleur de texte succès", + "layout": { + "comp": "color-picker", + "cols": 4, + "hint": "laissez vide pour utiliser la couleur succès" + } + }, + "error": { + "type": "string", + "title": "Couleur erreur", + "layout": { + "comp": "color-picker", + "cols": 4 + } + }, + "on-error": { + "type": "string", + "title": "Couleur de texte sur couleur erreur", + "layout": { + "comp": "color-picker", + "cols": 4 + } + }, + "text-error": { + "type": "string", + "title": "Couleur de texte erreur", + "layout": { + "comp": "color-picker", + "cols": 4, + "hint": "laissez vide pour utiliser la couleur erreur" + } + }, + "warning": { + "type": "string", + "title": "Couleur avertissement", + "layout": { + "comp": "color-picker", + "cols": 4 + } + }, + "on-warning": { + "type": "string", + "title": "Couleur de texte sur avertissement", + "layout": { + "comp": "color-picker", + "cols": 4 + } + }, + "text-warning": { + "type": "string", + "title": "Couleur de texte avertissement", + "layout": { + "comp": "color-picker", + "cols": 4, + "hint": "laissez vide pour utiliser la couleur avertissement" + } + }, + "admin": { "type": "string", "layout": "none" }, + "on-admin": { "type": "string", "layout": "none" }, + "text-admin": { "type": "string", "layout": "none" } + } + } + } +} \ No newline at end of file diff --git a/api/contract/JWK.ts b/api/contract/JWK.ts new file mode 100644 index 00000000..69b8171b --- /dev/null +++ b/api/contract/JWK.ts @@ -0,0 +1,19 @@ +export default { + id: 'https://lets-encrypt.org/schema/01/jwk#', + $schema: 'http://json-schema.org/draft-04/schema#', + description: 'Schema for a jwk (**kty RSA/e=65537 ONLY**)', + type: 'object', + required: ['kty', 'e', 'n'], + properties: { + kty: { + enum: ['RSA'] + }, + e: { + enum: ['AQAB'] + }, + n: { + type: 'string', + pattern: '^[-_=0-9A-Za-z]+$' + } + } +} diff --git a/contract/api-docs.js b/api/contract/api-docs.ts similarity index 96% rename from contract/api-docs.js rename to api/contract/api-docs.ts index e2071861..b21176a3 100644 --- a/contract/api-docs.js +++ b/api/contract/api-docs.ts @@ -1,9 +1,8 @@ -const config = require('config') -const JWK = require('./JWK.json') -const user = require('./user.json') -const organization = require('./organization.json') -const mail = require('./mail.json') -const version = require('../package.json').version +import config from '#config' +import JWK from './JWK.ts' +import user from '#types/user/schema.js' +import organization from '#types/organization/schema.js' +import mail from './mail.ts' const authenticationParams = [{ name: 'Authorization', @@ -23,11 +22,10 @@ const authenticationParams = [{ } }] -module.exports = { +export default { openapi: '3.0.0', info: Object.assign({ title: 'API documentation', - version: version }, config.info), servers: [{ url: config.publicUrl, diff --git a/api/contract/contact-mail.ts b/api/contract/contact-mail.ts new file mode 100644 index 00000000..4fad48ad --- /dev/null +++ b/api/contract/contact-mail.ts @@ -0,0 +1,17 @@ +export default { + type: 'object', + additionalProperties: false, + required: ['from', 'subject', 'text'], + properties: { + from: { + type: 'string', + format: 'email' + }, + subject: { + type: 'string' + }, + text: { + type: 'string' + } + } +} diff --git a/api/contract/mail.ts b/api/contract/mail.ts new file mode 100644 index 00000000..09419ecc --- /dev/null +++ b/api/contract/mail.ts @@ -0,0 +1,39 @@ +export default { + type: 'object', + additionalProperties: false, + required: ['to', 'subject', 'text'], + properties: { + to: { + description: 'Array of users / organizations recipient of the email', + type: 'array', + items: { + type: 'object', + additionalProperties: false, + required: ['type', 'id'], + properties: { + id: { + type: 'string', + description: 'Id of the user or organization' + }, + type: { + type: 'string', + enum: ['user', 'organization'] + }, + role: { + type: 'string', + description: 'If the recipient is an organization, you can restric to the members with a certain role' + } + } + } + }, + subject: { + type: 'string' + }, + text: { + type: 'string' + }, + html: { + type: 'string' + } + } +} diff --git a/api/doc/auth/post-action-req/index.d.ts b/api/doc/auth/post-action-req/index.d.ts new file mode 100644 index 00000000..f5d615bd --- /dev/null +++ b/api/doc/auth/post-action-req/index.d.ts @@ -0,0 +1 @@ +export * from './.type/index.js' diff --git a/api/doc/auth/post-action-req/index.ts b/api/doc/auth/post-action-req/index.ts new file mode 100644 index 00000000..f5d615bd --- /dev/null +++ b/api/doc/auth/post-action-req/index.ts @@ -0,0 +1 @@ +export * from './.type/index.js' diff --git a/api/doc/auth/post-action-req/schema.js b/api/doc/auth/post-action-req/schema.js new file mode 100644 index 00000000..3197cf23 --- /dev/null +++ b/api/doc/auth/post-action-req/schema.js @@ -0,0 +1,22 @@ +export default { + $id: 'https://github.com/data-fair/simple-directory/auth/post-action-req', + title: 'Post action auth req', + 'x-exports': ['validate', 'types'], + type: 'object', + required: ['body', 'query'], + properties: { + body: { + type: 'object', + additionalProperties: false, + required: ['email', 'action'], + properties: { + email: { type: 'string' }, + action: { + type: 'string', + enum: ['changePassword'] + }, + target: { type: 'string' } + } + } + } +} diff --git a/api/doc/auth/post-password-req/index.ts b/api/doc/auth/post-password-req/index.ts new file mode 100644 index 00000000..f5d615bd --- /dev/null +++ b/api/doc/auth/post-password-req/index.ts @@ -0,0 +1 @@ +export * from './.type/index.js' diff --git a/api/doc/auth/post-password-req/schema.js b/api/doc/auth/post-password-req/schema.js new file mode 100644 index 00000000..b9ef5117 --- /dev/null +++ b/api/doc/auth/post-password-req/schema.js @@ -0,0 +1,34 @@ +export default { + $id: 'https://github.com/data-fair/simple-directory/auth/post-password-req', + title: 'Post password auth req', + 'x-exports': ['validate', 'types'], + type: 'object', + required: ['body', 'query'], + properties: { + body: { + type: 'object', + additionalProperties: false, + required: ['email', 'password'], + properties: { + email: { type: 'string' }, + password: { type: 'string' }, + org: { type: 'string' }, + dep: { type: 'string' }, + '2fa': { type: 'string' }, + membersOnly: { type: 'boolean' }, + adminMode: { type: 'boolean' }, + rememberMe: { type: 'boolean' }, + orgStorage: { type: 'boolean' } + } + }, + query: { + type: 'object', + additionalProperties: false, + properties: { + redirect: { type: 'string' }, + org: { type: 'string' }, + dep: { type: 'string' } + } + } + } +} diff --git a/api/doc/auth/post-passwordless-req/index.ts b/api/doc/auth/post-passwordless-req/index.ts new file mode 100644 index 00000000..f5d615bd --- /dev/null +++ b/api/doc/auth/post-passwordless-req/index.ts @@ -0,0 +1 @@ +export * from './.type/index.js' diff --git a/api/doc/auth/post-passwordless-req/schema.js b/api/doc/auth/post-passwordless-req/schema.js new file mode 100644 index 00000000..c0de9354 --- /dev/null +++ b/api/doc/auth/post-passwordless-req/schema.js @@ -0,0 +1,33 @@ +export default { + $id: 'https://github.com/data-fair/simple-directory/auth/post-passwordless-req', + title: 'Post passwordless auth req', + 'x-exports': ['validate', 'types'], + type: 'object', + required: ['body', 'query'], + properties: { + body: { + type: 'object', + additionalProperties: false, + required: ['email'], + properties: { + email: { type: 'string' }, + org: { type: 'string' }, + dep: { type: 'string' }, + '2fa': { type: 'string' }, + membersOnly: { type: 'boolean' }, + adminMode: { type: 'boolean' }, + rememberMe: { type: 'boolean' }, + orgStorage: { type: 'boolean' } + } + }, + query: { + type: 'object', + additionalProperties: false, + properties: { + redirect: { type: 'string' }, + org: { type: 'string' }, + dep: { type: 'string' } + } + } + } +} diff --git a/api/doc/auth/post-token-callback-req/index.ts b/api/doc/auth/post-token-callback-req/index.ts new file mode 100644 index 00000000..f5d615bd --- /dev/null +++ b/api/doc/auth/post-token-callback-req/index.ts @@ -0,0 +1 @@ +export * from './.type/index.js' diff --git a/api/doc/auth/post-token-callback-req/schema.js b/api/doc/auth/post-token-callback-req/schema.js new file mode 100644 index 00000000..fa823cec --- /dev/null +++ b/api/doc/auth/post-token-callback-req/schema.js @@ -0,0 +1,21 @@ +export default { + $id: 'https://github.com/data-fair/simple-directory/auth/post-token-callback-req', + title: 'Post token callback req', + 'x-exports': ['validate', 'types'], + 'x-ajv': { coerceTypes: true }, + type: 'object', + required: ['query'], + properties: { + query: { + type: 'object', + additionalProperties: false, + properties: { + id_token: { type: 'string' }, + id_token_org: { type: 'string' }, + id_token_dep: { type: 'string' }, + redirect: { type: 'string' }, + org_storage: { type: 'boolean' } + } + } + } +} diff --git a/api/doc/invitations/post-req/index.ts b/api/doc/invitations/post-req/index.ts new file mode 100644 index 00000000..f5d615bd --- /dev/null +++ b/api/doc/invitations/post-req/index.ts @@ -0,0 +1 @@ +export * from './.type/index.js' diff --git a/api/doc/invitations/post-req/schema.json b/api/doc/invitations/post-req/schema.json new file mode 100644 index 00000000..8f23841a --- /dev/null +++ b/api/doc/invitations/post-req/schema.json @@ -0,0 +1,23 @@ +{ + "$id": "https://github.com/data-fair/simple-directory/invitations/post-req", + "x-ajv": { "coerceTypes": true }, + "x-exports": ["types", "validate"], + "title": "Post invitation req", + "type":"object", + "required": ["body", "query"], + "properties":{ + "query": { + "type": "object", + "additionalProperties": false, + "properties": { + "skip_mail": { + "type": "boolean" + }, + "force_mail": { + "type": "boolean" + } + } + }, + "body": { "$ref": "https://github.com/data-fair/simple-directory/invitation" } + } +} \ No newline at end of file diff --git a/api/doc/organizations/patch-member-req/index.ts b/api/doc/organizations/patch-member-req/index.ts new file mode 100644 index 00000000..f5d615bd --- /dev/null +++ b/api/doc/organizations/patch-member-req/index.ts @@ -0,0 +1 @@ +export * from './.type/index.js' diff --git a/api/doc/organizations/patch-member-req/schema.js b/api/doc/organizations/patch-member-req/schema.js new file mode 100644 index 00000000..7a67117f --- /dev/null +++ b/api/doc/organizations/patch-member-req/schema.js @@ -0,0 +1,32 @@ +export default { + $id: 'https://github.com/data-fair/simple-directory/organizations/patch-member-req', + title: 'Patch member req', + 'x-exports': ['validate', 'types'], + type: 'object', + required: ['query', 'body'], + properties: { + query: { + type: 'object', + additionalProperties: false, + properties: { + department: { + type: 'string' + } + } + }, + body: { + type: 'object', + title: 'Patch member body', + additionalProperties: false, + required: ['role'], + properties: { + role: { + type: 'string' + }, + department: { + type: 'string' + } + } + } + } +} diff --git a/api/doc/organizations/patch-req/index.ts b/api/doc/organizations/patch-req/index.ts new file mode 100644 index 00000000..f5d615bd --- /dev/null +++ b/api/doc/organizations/patch-req/index.ts @@ -0,0 +1 @@ +export * from './.type/index.js' diff --git a/api/doc/organizations/patch-req/schema.js b/api/doc/organizations/patch-req/schema.js new file mode 100644 index 00000000..723fd602 --- /dev/null +++ b/api/doc/organizations/patch-req/schema.js @@ -0,0 +1,19 @@ +import jsonSchema from '@data-fair/lib-utils/json-schema.js' +import OrganizationSchema from '#types/organization/schema.js' + +const body = jsonSchema(OrganizationSchema) + .removeReadonlyProperties() + .removeProperties(['created', 'updated']) + .removeId() + .appendTitle(' patch') + .schema +delete body.required + +export default { + $id: 'https://github.com/data-fair/simple-directory/organizations/patch-req', + title: 'Patch organization req', + 'x-exports': ['validate', 'types'], + type: 'object', + required: ['body'], + properties: { body } +} diff --git a/api/doc/organizations/post-partner-accept-req/index.ts b/api/doc/organizations/post-partner-accept-req/index.ts new file mode 100644 index 00000000..f5d615bd --- /dev/null +++ b/api/doc/organizations/post-partner-accept-req/index.ts @@ -0,0 +1 @@ +export * from './.type/index.js' diff --git a/api/doc/organizations/post-partner-accept-req/schema.js b/api/doc/organizations/post-partner-accept-req/schema.js new file mode 100644 index 00000000..49f06e4a --- /dev/null +++ b/api/doc/organizations/post-partner-accept-req/schema.js @@ -0,0 +1,30 @@ +export default { + $id: 'https://github.com/data-fair/simple-directory/organizations/post-partner-accept-req', + 'x-exports': [ + 'types', + 'validate' + ], + title: 'Post partner accept req', + type: 'object', + required: [ + 'body' + ], + properties: { + body: { + additionalProperties: false, + required: ['id', 'contactEmail', 'token'], + properties: { + id: { + type: 'string' + }, + contactEmail: { + type: 'string', + format: 'email' + }, + token: { + type: 'string' + } + } + } + } +} diff --git a/api/doc/organizations/post-partner-req/index.ts b/api/doc/organizations/post-partner-req/index.ts new file mode 100644 index 00000000..f5d615bd --- /dev/null +++ b/api/doc/organizations/post-partner-req/index.ts @@ -0,0 +1 @@ +export * from './.type/index.js' diff --git a/api/doc/organizations/post-partner-req/schema.js b/api/doc/organizations/post-partner-req/schema.js new file mode 100644 index 00000000..017ab8d9 --- /dev/null +++ b/api/doc/organizations/post-partner-req/schema.js @@ -0,0 +1,33 @@ +export default { + $id: 'https://github.com/data-fair/simple-directory/organizations/post-partner-req', + 'x-exports': [ + 'types', + 'validate' + ], + title: 'Post partner req', + type: 'object', + required: [ + 'body' + ], + properties: { + body: { + additionalProperties: false, + required: [ + 'name', + 'contactEmail' + ], + properties: { + name: { + type: 'string' + }, + redirect: { + type: 'string' + }, + contactEmail: { + type: 'string', + format: 'email' + } + } + } + } +} diff --git a/api/doc/organizations/post-req/index.ts b/api/doc/organizations/post-req/index.ts new file mode 100644 index 00000000..f5d615bd --- /dev/null +++ b/api/doc/organizations/post-req/index.ts @@ -0,0 +1 @@ +export * from './.type/index.js' diff --git a/api/doc/organizations/post-req/schema.js b/api/doc/organizations/post-req/schema.js new file mode 100644 index 00000000..3be2b0ea --- /dev/null +++ b/api/doc/organizations/post-req/schema.js @@ -0,0 +1,19 @@ +import jsonSchema from '@data-fair/lib-utils/json-schema.js' +import OrganizationSchema from '#types/organization/schema.js' + +const body = jsonSchema(OrganizationSchema) + .removeReadonlyProperties() + .removeProperties(['created', 'updated', 'orgStorage']) + .removeFromRequired('id') + .removeId() + .appendTitle(' post') + .schema + +export default { + $id: 'https://github.com/data-fair/simple-directory/organizations/post-req', + title: 'Post organization req', + 'x-exports': ['validate', 'types'], + type: 'object', + required: ['body'], + properties: { body } +} diff --git a/api/doc/sites/list-req/index.ts b/api/doc/sites/list-req/index.ts new file mode 100644 index 00000000..f5d615bd --- /dev/null +++ b/api/doc/sites/list-req/index.ts @@ -0,0 +1 @@ +export * from './.type/index.js' diff --git a/api/doc/sites/list-req/schema.json b/api/doc/sites/list-req/schema.json new file mode 100644 index 00000000..f4532b7f --- /dev/null +++ b/api/doc/sites/list-req/schema.json @@ -0,0 +1,25 @@ +{ + "$id": "https://github.com/data-fair/simple-directory/sites/list-req", + "x-exports": [ + "types", + "validate" + ], + "x-ajv": { + "coerceTypes": true + }, + "title": "List sites req", + "type": "object", + "required": ["query"], + "properties": { + "query": { + "type": "object", + "additionalProperties": false, + "required": [], + "properties": { + "showAll": { + "type": "boolean" + } + } + } + } +} \ No newline at end of file diff --git a/api/doc/sites/patch-req-body/index.ts b/api/doc/sites/patch-req-body/index.ts new file mode 100644 index 00000000..f5d615bd --- /dev/null +++ b/api/doc/sites/patch-req-body/index.ts @@ -0,0 +1 @@ +export * from './.type/index.js' diff --git a/api/doc/sites/patch-req-body/schema.js b/api/doc/sites/patch-req-body/schema.js new file mode 100644 index 00000000..c71c3252 --- /dev/null +++ b/api/doc/sites/patch-req-body/schema.js @@ -0,0 +1,24 @@ +import jsonSchema from '@data-fair/lib-utils/json-schema.js' +import SiteSchema from '#types/site/schema.js' + +const schema = jsonSchema(SiteSchema) + .removeReadonlyProperties() + .pickProperties(['theme', 'reducedPersonalInfoAtCreation', 'tosMessage', 'authMode', 'authOnlyOtherSite', 'authProviders']) + .appendTitle(' patch') + .schema + +schema.$id = 'https://github.com/data-fair/simple-directory/sites/patch-req-body' +schema['x-exports'] = ['validate', 'types', 'resolvedSchemaJson'] + +schema.layout = { + title: null, + children: [ + { key: 'theme' }, + { + title: 'Gestion des utilisateurs', + children: ['reducedPersonalInfoAtCreation', 'tosMessage', 'authMode', 'authOnlyOtherSite', 'authProviders'] + } + ] +} + +export default schema diff --git a/api/doc/sites/post-req-body/index.ts b/api/doc/sites/post-req-body/index.ts new file mode 100644 index 00000000..f5d615bd --- /dev/null +++ b/api/doc/sites/post-req-body/index.ts @@ -0,0 +1 @@ +export * from './.type/index.js' diff --git a/api/doc/sites/post-req-body/schema.js b/api/doc/sites/post-req-body/schema.js new file mode 100644 index 00000000..a8cff77c --- /dev/null +++ b/api/doc/sites/post-req-body/schema.js @@ -0,0 +1,15 @@ +import jsonSchema from '@data-fair/lib-utils/json-schema.js' +import SiteSchema from '#types/site/schema.js' + +const schema = jsonSchema(SiteSchema) + .removeReadonlyProperties() + .pickProperties(['_id', 'owner', 'host', 'path', 'theme']) + .removeFromRequired(['_id', 'theme']) + .appendTitle(' post') + .schema + +schema.properties.theme.layout = 'none' +schema.$id = 'https://github.com/data-fair/simple-directory/sites/post-req-body' +schema['x-exports'] = ['validate', 'types', 'resolvedSchemaJson'] + +export default schema diff --git a/api/doc/users/patch-req/index.ts b/api/doc/users/patch-req/index.ts new file mode 100644 index 00000000..f5d615bd --- /dev/null +++ b/api/doc/users/patch-req/index.ts @@ -0,0 +1 @@ +export * from './.type/index.js' diff --git a/api/doc/users/patch-req/schema.js b/api/doc/users/patch-req/schema.js new file mode 100644 index 00000000..f050a6ed --- /dev/null +++ b/api/doc/users/patch-req/schema.js @@ -0,0 +1,20 @@ +import jsonSchema from '@data-fair/lib-utils/json-schema.js' +import UserSchema from '#types/user/schema.js' + +const body = jsonSchema(UserSchema) + .removeReadonlyProperties() + .pickProperties(['firstName', 'lastName', 'birthday', 'ignorePersonalAccount', 'defaultOrg', 'defaultDep', 'plannedDeletion', 'maxCreatedOrgs', 'email', '2FA']) + .makeNullable(['firstName', 'lastName', 'birthday', 'ignorePersonalAccount', 'defaultOrg', 'defaultDep', 'plannedDeletion', 'maxCreatedOrgs', '2FA']) + .removeFromRequired(['email']) + .removeId() + .appendTitle(' patch') + .schema + +export default { + $id: 'https://github.com/data-fair/simple-directory/users/patch-req', + title: 'Patch user req', + 'x-exports': ['validate', 'types'], + type: 'object', + required: ['body'], + properties: { body } +} diff --git a/api/doc/users/post-host-req/index.ts b/api/doc/users/post-host-req/index.ts new file mode 100644 index 00000000..f5d615bd --- /dev/null +++ b/api/doc/users/post-host-req/index.ts @@ -0,0 +1 @@ +export * from './.type/index.js' diff --git a/api/doc/users/post-host-req/schema.js b/api/doc/users/post-host-req/schema.js new file mode 100644 index 00000000..c945d091 --- /dev/null +++ b/api/doc/users/post-host-req/schema.js @@ -0,0 +1,25 @@ +export default { + $id: 'https://github.com/data-fair/simple-directory/users/post-host-req', + title: 'Post user host req', + 'x-exports': ['validate', 'types'], + type: 'object', + required: ['body', 'query'], + properties: { + body: { + type: 'object', + additionalProperties: false, + required: ['host'], + properties: { + host: { type: 'string' } + } + }, + query: { + type: 'object', + additionalProperties: false, + required: ['action_token'], + properties: { + action_token: { type: 'string' } + } + } + } +} diff --git a/api/doc/users/post-password-req/index.ts b/api/doc/users/post-password-req/index.ts new file mode 100644 index 00000000..f5d615bd --- /dev/null +++ b/api/doc/users/post-password-req/index.ts @@ -0,0 +1 @@ +export * from './.type/index.js' diff --git a/api/doc/users/post-password-req/schema.js b/api/doc/users/post-password-req/schema.js new file mode 100644 index 00000000..cd64c908 --- /dev/null +++ b/api/doc/users/post-password-req/schema.js @@ -0,0 +1,25 @@ +export default { + $id: 'https://github.com/data-fair/simple-directory/users/post-password-req', + title: 'Post user password req', + 'x-exports': ['validate', 'types'], + type: 'object', + required: ['body', 'query'], + properties: { + body: { + type: 'object', + additionalProperties: false, + required: ['password'], + properties: { + password: { type: 'string' } + } + }, + query: { + type: 'object', + additionalProperties: false, + required: ['action_token'], + properties: { + action_token: { type: 'string' } + } + } + } +} diff --git a/api/doc/users/post-req/index.ts b/api/doc/users/post-req/index.ts new file mode 100644 index 00000000..f5d615bd --- /dev/null +++ b/api/doc/users/post-req/index.ts @@ -0,0 +1 @@ +export * from './.type/index.js' diff --git a/api/doc/users/post-req/schema.js b/api/doc/users/post-req/schema.js new file mode 100644 index 00000000..52ddd613 --- /dev/null +++ b/api/doc/users/post-req/schema.js @@ -0,0 +1,32 @@ +import jsonSchema from '@data-fair/lib-utils/json-schema.js' +import UserSchema from '#types/user/schema.js' + +const body = jsonSchema(UserSchema) + .removeReadonlyProperties() + .pickProperties(['firstName', 'lastName', 'email', 'password', 'birthday']) + .removeId() + .appendTitle(' post') + .schema + +body.properties.password = { type: 'string' } + +export default { + $id: 'https://github.com/data-fair/simple-directory/users/post-req', + title: 'Post user req', + 'x-exports': ['validate', 'types'], + type: 'object', + required: ['body', 'query'], + properties: { + body, + query: { + type: 'object', + additionalProperties: false, + properties: { + invit_token: { type: 'string' }, + redirect: { type: 'string' }, + org: { type: 'string' }, + dep: { type: 'string' } + } + } + } +} diff --git a/i18n/de.js b/api/i18n/de.js similarity index 99% rename from i18n/de.js rename to api/i18n/de.js index bd621a11..6c7b9c9b 100644 --- a/i18n/de.js +++ b/api/i18n/de.js @@ -1,7 +1,7 @@ // WARN: do not use underscore in keys, it is used as delimiter when reading // messages from environment variables -module.exports = { +export default { root: { title: 'Simple Directory', description: 'Vereinfachte Verwaltung Ihrer Benutzer und Organisationen in einer modernen weborientierten Architektur.' diff --git a/i18n/en.js b/api/i18n/en.js similarity index 95% rename from i18n/en.js rename to api/i18n/en.js index 0bede816..fcd60a6c 100644 --- a/i18n/en.js +++ b/api/i18n/en.js @@ -1,7 +1,7 @@ // WARN: do not use underscore in keys, it is used as delimiter when reading // messages from environment variables -module.exports = { +export default { root: { title: 'Simple Directory', description: 'Easy users and organizations management for modern Web-oriented architectures.' @@ -346,5 +346,34 @@ Feel free to contact us at {contact}. sentInvitation: 'An email was sent to {email} with an invitation to join the organization {orgName}.', acceptedInvitationTopic: 'an invitation is accepted', acceptedInvitation: 'The user {name} ({email}) has joined the organization {orgName}.' + }, + colors: { + theme: { + default: 'default', + dark: 'dark', + hc: 'high contrast' + }, + readableWarning: 'the {colorName} color ({colorCode}) of {themeName} theme is not sufficiently readable over the {bgColorName} color ({bgColorCode})', + authProvider: 'auth provider {title}', + white: 'white', + text: 'text', + background: 'background', + surface: 'surface', + primary: 'primary', + 'text-primary': 'primary text', + secondary: 'secondary', + 'text-secondary': 'secondary text', + accent: 'accent', + 'text-accent': 'accent text', + error: 'error', + 'text-error': 'error text', + warning: 'warning', + 'text-warning': 'warning text', + success: 'success', + 'text-success': 'success text', + info: 'info', + 'text-info': 'info text', + admin: 'admin', + 'text-admin': 'admin text' } } diff --git a/i18n/es.js b/api/i18n/es.js similarity index 99% rename from i18n/es.js rename to api/i18n/es.js index 32318c51..9e2f9b27 100644 --- a/i18n/es.js +++ b/api/i18n/es.js @@ -1,7 +1,7 @@ // WARN: do not use underscore in keys, it is used as delimiter when reading // messages from environment variables -module.exports = { +export default { root: { title: 'Simple Directory', description: 'Gestión simplificada de sus usuarios y organizaciones en una moderna arquitectura orientada a la web.' diff --git a/i18n/fr.js b/api/i18n/fr.js similarity index 94% rename from i18n/fr.js rename to api/i18n/fr.js index 651d8152..3bff5deb 100644 --- a/i18n/fr.js +++ b/api/i18n/fr.js @@ -1,7 +1,7 @@ // WARN: do not use underscore in keys, it is used as delimiter when reading // messages from environment variables -module.exports = { +export default { root: { title: 'Simple Directory', description: 'Gestion simplifiée de vos utilisateurs et vos organisations dans une architecture moderne orientée Web.' @@ -53,6 +53,7 @@ module.exports = { sites: 'Sites', updatedAt: 'Mis à jour le', maxCreatedOrgs: 'Nombre maximal d\'organisations à créer', + maxCreatedOrgsShort: 'Nb orga max', nbCreatedOrgs: 'Nombre d\'organisations créées :', back: 'Retour', next: 'Suivant', @@ -89,6 +90,7 @@ module.exports = { creationStep: 'Étape de création', oauthTokens: 'Jetons OAUTH', plannedDeletion: 'Suppression programmée', + plannedDeletionShort: 'Suppr prog', owner: 'Propriéraire' }, doc: { @@ -166,7 +168,8 @@ Peut valoir 'anonymous', 'authenticated' ou 'admin'.`, nbMembers: 'Nombre maximal de membres (0 pour aucune limite)' }, sites: { - createSite: 'Déclarer un nouveau site' + createSite: 'Déclarer un nouveau site', + colorWarnings: 'Avertissements de contraste', } }, login: { @@ -264,7 +267,11 @@ Peut valoir 'anonymous', 'authenticated' ou 'admin'.`, deleteMyselfCheck: 'cochez cette case et cliquez sur OK pour confirmer la suppression de l\'utilisateur {name} et toutes ses données.', accountChanges: 'Gestion des changements de compte', defaultOrg: 'Activer ce compte par défaut à chaque connexion', - ignorePersonalAccount: 'Cochez cette case si vous ne souhaitez jamais utiliser la plateforme en dehors d\'une organisation' + ignorePersonalAccount: 'Cochez cette case si vous ne souhaitez jamais utiliser la plateforme en dehors d\'une organisation', + sessions: 'Vos sessions', + deleteSession: 'Supprimer la session sur {deviceName} ?', + deleteSessionWarning: 'La suppression de session peut mettre un délai maximal de {duration} à être entièrement appliquée.', + settings: 'Vos paramètres' } }, errors: { @@ -423,5 +430,35 @@ N'hésitez pas à nous contacter à {contact}. acceptedPartnerInvitation: 'L\'organisation {partnerName} ({email}) a rejoint l\'organisation {orgName} en tant que partenaire.', addMemberTopic: 'un membre a été ajouté', addMember: 'L\'utilisateur {name} ({email}) a rejoint l\'organisation {orgName}.' + }, + colors: { + theme: { + default: 'par défaut', + dark: 'sombre', + hc: 'à contraste élevé', + hcDark: 'sombre à contraste élevé' + }, + readableWarning: 'la couleur {colorName} ({colorCode}) du thème {themeName} n\'est pas suffisamment lisible par dessus la couleur {bgColorName} ({bgColorCode})', + authProvider: 'du fournisseur d\'identité {title}', + white: 'blanche', + text: 'de texte', + background: 'd\'arrière plan', + surface: 'de surface', + primary: 'primaire', + 'text-primary': 'texte primaire', + secondary: 'secondaire', + 'text-secondary': 'texte secondaire', + accent: 'accentuée', + 'text-accent': 'texte accentué', + error: 'd\'erreur', + 'text-error': 'texte d\'erreur', + warning: 'd\'avertissement', + 'text-warning': 'texte d\'avertissement', + success: 'de succès', + 'text-success': 'texte de succès', + info: 'd\'information', + 'text-info': 'texte d\'information', + admin: 'd\'administration', + 'text-admin': 'texte d\'administration', } } diff --git a/api/i18n/index.ts b/api/i18n/index.ts new file mode 100644 index 00000000..7616cefd --- /dev/null +++ b/api/i18n/index.ts @@ -0,0 +1,63 @@ +import config from '../src/config.ts' +import { type Request } from 'express' +import microTemplate from '@data-fair/lib-utils/micro-template.js' +import acceptLangParser from 'accept-language-parser' +import dayjs from 'dayjs' +import 'dayjs/locale/fr.js' +import 'dayjs/locale/en.js' +import 'dayjs/locale/de.js' +import 'dayjs/locale/it.js' +import 'dayjs/locale/es.js' +import 'dayjs/locale/pt.js' +import localizedFormat from 'dayjs/plugin/localizedFormat.js' +import { messages, flatMessages } from './messages.ts' + +export { messages } from './messages.ts' + +dayjs.extend(localizedFormat) + +export const localizedDayjs = dayjs + +// cannot be changed at runtime for now, because it impacts the build +export const defaultLocale = config.i18n.defaultLocale + +const reqI18nKey = Symbol('reqI18n') + +const getReqI18n = (req: Request) => { + const locales = acceptLangParser.parse(req.get('Accept-Language')) + const localeCode = (req.cookies.i18n_lang || locales[0]?.code || defaultLocale) as string + return { localeCode, messages: messages[localeCode] ?? messages[defaultLocale] } +} + +export const reqI18n = (req: Request) => { + const reqAny = req as any + if (!reqAny[reqI18nKey]) reqAny[reqI18nKey] = getReqI18n(req) + return reqAny[reqI18nKey] as ReturnType +} + +export const getMessage = (localeCode: string, key: string, params: Record = {}) => { + const flatKey = key.replace(/\./g, '_') + return microTemplate(flatMessages[localeCode + '_' + flatKey] ?? flatMessages[defaultLocale + '_' + flatKey], params) +} + +export const __ = (req: Request, key: string, params: Record = {}) => { + const myI18n = reqI18n(req) + return getMessage(myI18n.localeCode, key, params) +} + +export const __all = (key: string, params: Record = {}) => { + const flatKey = key.replace(/\./g, '_') + const res: Record = {} + for (const locale of config.i18n.locales) { + const value = flatMessages[locale + '_' + flatKey] + if (value) { + res[locale] = microTemplate(value, params) + } + } + return res +} + +export const __date = (req: Request, date: string) => { + const myI18n = reqI18n(req) + return dayjs(date).locale(myI18n.localeCode) +} diff --git a/i18n/it.js b/api/i18n/it.js similarity index 99% rename from i18n/it.js rename to api/i18n/it.js index 29e9d56e..fcc98897 100644 --- a/i18n/it.js +++ b/api/i18n/it.js @@ -1,7 +1,7 @@ // WARN: do not use underscore in keys, it is used as delimiter when reading // messages from environment variables -module.exports = { +export default { root: { title: 'Simple Directory', description: "Gestione semplificata dei suoi utenti e delle sue organizzazioni in un'architettura moderna orientata al web." diff --git a/api/i18n/messages.ts b/api/i18n/messages.ts new file mode 100644 index 00000000..5de04626 --- /dev/null +++ b/api/i18n/messages.ts @@ -0,0 +1,27 @@ +import { flatten, unflatten } from 'flat' +import config from '../src/config.ts' +const flatOpts = { delimiter: '_' } + +// Build a map of messages of this form +// {fr: {msg1: 'libellé 1'}, en: {msg1: 'label 1'}} +const _messages: any = {} +for (const l of config.i18n.locales) { + _messages[l] = (await import ('./' + l + '.js')).default +} +export const flatMessages = flatten(_messages, flatOpts) as Record + +// Manage overriding by environment variables of this form +// 'I18N_en_msg1="another label"' +for (const [key, value] of Object.entries(process.env)) { + if (key.startsWith('I18N_') && typeof value === 'string') { + flatMessages[key.replace('I18N_', '')] = value + } +} +export const messages: any = unflatten(flatMessages, flatOpts) + +// A subset of messages for UI separated for performance. +const flatPublicMessages = { ...flatMessages } +for (const key of Object.keys(flatPublicMessages)) { + if (!['root', 'common', 'pages', 'errors', 'notifications'].includes(key.split('_')[1])) delete flatPublicMessages[key] +} +export const publicMessages = unflatten(flatPublicMessages, flatOpts) as any diff --git a/i18n/pt.js b/api/i18n/pt.js similarity index 99% rename from i18n/pt.js rename to api/i18n/pt.js index b78014cc..d79d5f73 100644 --- a/i18n/pt.js +++ b/api/i18n/pt.js @@ -1,7 +1,7 @@ // WARN: do not use underscore in keys, it is used as delimiter when reading // messages from environment variables -module.exports = { +export default { root: { title: 'Simple Directory', description: 'Uma gestão simplificada dos seus utilizadores e organizações numa arquitectura moderna orientada para a web.' diff --git a/api/index.ts b/api/index.ts new file mode 100644 index 00000000..f005ffae --- /dev/null +++ b/api/index.ts @@ -0,0 +1,17 @@ +import { start, stop } from './src/server.ts' + +start().then(() => {}, err => { + console.error('Failure while starting service', err) + process.exit(1) +}) + +process.on('SIGTERM', function onSigterm () { + console.info('Received SIGTERM signal, shutdown gracefully...') + stop().then(() => { + console.log('shutting down now') + process.exit() + }, err => { + console.error('Failure while stopping service', err) + process.exit(1) + }) +}) diff --git a/api/package.json b/api/package.json new file mode 100644 index 00000000..2cccf2d1 --- /dev/null +++ b/api/package.json @@ -0,0 +1,60 @@ +{ + "name": "@sd/api", + "main": "index.js", + "type": "module", + "scripts": { + "dev": "NODE_ENV=development DEBUG=upgrade* node --watch --experimental-strip-types index.ts" + }, + "imports": { + "#config": "./src/config.ts", + "#mongo": "./src/mongo.ts", + "#events-queue": "./src/events-queue.ts", + "#services": "./src/services.ts", + "#doc/*": "./doc/*", + "#types": "./types/index.ts", + "#types/*": "./types/*", + "#storages": "./src/storages/index.ts", + "#i18n": "./i18n/index.ts" + }, + "dependencies": { + "@data-fair/lib-express": "^1.10.1", + "@data-fair/lib-node": "^2.2.1", + "@data-fair/lib-utils": "^1.2.0", + "@sd/shared": "*", + "accept-language-parser": "^1.5.0", + "capitalize": "^2.0.4", + "config": "^3.3.11", + "cookie-parser": "^1.4.7", + "cookies": "^0.9.1", + "csv-stringify": "^6.5.1", + "dayjs": "^1.11.13", + "email-validator": "^2.0.4", + "express": "^5.0.0", + "flat": "^6.0.1", + "gm": "^1.25.0", + "http-terminator": "^3.2.0", + "i18n": "^0.15.1", + "initials": "^3.1.2", + "json-web-key": "^0.4.0", + "ldapjs": "^3.0.7", + "material-colors": "^1.2.6", + "memoizee": "^0.4.17", + "mjml": "^4.15.3", + "mongodb": "^6.8.0", + "ms": "^2.1.3", + "multer": "^1.4.5-lts.1", + "nanoid": "^5.0.7", + "node-cron": "^3.0.3", + "nodemailer": "^6.9.15", + "otplib": "^12.0.1", + "prom-client": "^15.1.2", + "qrcode": "^1.5.4", + "rate-limiter-flexible": "^5.0.3", + "samlify": "^2.8.11", + "seedrandom": "^3.0.5", + "simple-oauth2": "^5.1.0", + "slugify": "^1.6.6", + "tinycolor2": "^1.6.0", + "useragent": "^2.3.0" + } +} diff --git a/server/resources/nunito-ttf/Nunito-ExtraBold.ttf b/api/resources/nunito-ttf/Nunito-ExtraBold.ttf similarity index 100% rename from server/resources/nunito-ttf/Nunito-ExtraBold.ttf rename to api/resources/nunito-ttf/Nunito-ExtraBold.ttf diff --git a/scripts/admin-credentials.js b/api/scripts/admin-credentials.ts similarity index 50% rename from scripts/admin-credentials.js rename to api/scripts/admin-credentials.ts index 9e0944a7..bb598d78 100644 --- a/scripts/admin-credentials.js +++ b/api/scripts/admin-credentials.ts @@ -1,6 +1,6 @@ -const readline = require('node:readline') -const { Writable } = require('node:stream') -const passwordUtils = require('../server/utils/passwords') +import readline from 'node:readline' +import { Writable } from 'node:stream' +import { hashPassword, validatePassword } from '../src/utils/passwords.ts' async function main () { let muted = false @@ -15,12 +15,12 @@ async function main () { }), terminal: true }) - const email = await new Promise((resolve) => rl.question('email: ', resolve)) - const passwordPromise = new Promise((resolve) => rl.question('password: ', resolve)) + const email = await new Promise((resolve) => rl.question('email: ', resolve)) + const passwordPromise = new Promise((resolve) => rl.question('password: ', resolve)) muted = true const password = await passwordPromise - if (!passwordUtils.validate(password)) throw new Error('password does not respect complexity rules') - const hash = await passwordUtils.hashPassword(password) + if (!validatePassword(password)) throw new Error('password does not respect complexity rules') + const hash = await hashPassword(password) console.log(JSON.stringify({ email, password: hash })) rl.close() } diff --git a/api/scripts/trigger-webhooks.ts b/api/scripts/trigger-webhooks.ts new file mode 100644 index 00000000..abfac59c --- /dev/null +++ b/api/scripts/trigger-webhooks.ts @@ -0,0 +1,17 @@ +import * as webhooks from '../src/webhooks/service.ts' +import storages from '#storages' + +async function main () { + await storages.init() + const users = await storages.globalStorage.findUsers({ skip: 0, size: 100000 }) + for (const user of users.results) { + await webhooks.postUserIdentityWebhook(user) + } + + const organizations = await storages.globalStorage.findOrganizations({ skip: 0, size: 100000 }) + for (const organization of organizations.results) { + await webhooks.postOrganizationIdentityWebhook(organization) + } +} + +main() diff --git a/api/src/2fa/router.ts b/api/src/2fa/router.ts new file mode 100644 index 00000000..522c994a --- /dev/null +++ b/api/src/2fa/router.ts @@ -0,0 +1,65 @@ +import { authenticator } from 'otplib' +import qrcode from 'qrcode' +import { randomUUID } from 'node:crypto' +import { Router } from 'express' +import { reqIp, reqSiteUrl, httpError } from '@data-fair/lib-express' +import eventsLog from '@data-fair/lib-express/events-log.js' +import emailValidator from 'email-validator' +import storages from '#storages' +import { reqI18n } from '#i18n' +import limiter from '../utils/limiter.ts' +import { checkPassword, hashPassword, reqSite } from '#services' + +const router = Router() +export default router + +router.post('/', async (req, res, next) => { + if (!req.body || !req.body.email) return res.status(400).send(reqI18n(req).messages.errors.badEmail) + if (!emailValidator.validate(req.body.email)) return res.status(400).send(reqI18n(req).messages.errors.badEmail) + if (!req.body.password) return res.status(400).send(reqI18n(req).messages.errors.badCredentials) + + try { + await limiter(req).consume(reqIp(req), 1) + } catch (err) { + eventsLog.warn('sd.2fa.rate-limit', `rate limit error for /2fa route with email ${req.body.email}`, { req }) + return res.status(429).send(reqI18n(req).messages.errors.rateLimitAuth) + } + + const storage = storages.globalStorage + const user = await storage.getUserByEmail(req.body.email, await reqSite(req)) + if (!user || user.emailConfirmed === false) return res.status(400).send(reqI18n(req).messages.errors.badCredentials) + if (storage.getPassword) { + const storedPassword = await storage.getPassword(user.id) + const validPassword = await checkPassword(req.body.password, storedPassword) + if (!validPassword) return res.status(400).send(reqI18n(req).messages.errors.badCredentials) + } else if (storage.checkPassword) { + if (!await storage.checkPassword(user.id, req.body.password)) { + return res.status(400).send(reqI18n(req).messages.errors.badCredentials) + } + } else { + throw new Error('no password verification implemented') + } + + const user2FA = await storage.get2FA(user.id) + if (user2FA && user2FA.active) { + return res.status(400).send(reqI18n(req).messages.errors.conflict2FA) + } + + if (!req.body.token) { + // initialize secret + const secret = authenticator.generateSecret() + const otpauth = authenticator.keyuri(user.name, reqSiteUrl(req), secret) + await storage.set2FA(user.id, { secret, active: false }) + eventsLog.info('sd.2fa.init', `user initialized 2fa ${req.body.email}`, { req, user }) + res.send({ otpauth, qrcode: await qrcode.toDataURL(otpauth) }) + } else { + // validate secret with initial token + if (!user2FA) throw httpError(400) + const isValid = authenticator.check(req.body.token, user2FA.secret) + if (!isValid) return res.status(400).send(reqI18n(req).messages.errors.bad2FAToken) + const recovery = randomUUID() + await storage.set2FA(user.id, { ...user2FA, active: true, recovery: await hashPassword(recovery) }) + eventsLog.info('sf.2fa.recover', `user recovered 2fa with initial token ${req.body.email}`, { req, user }) + res.send({ recovery }) + } +}) diff --git a/api/src/2fa/service.ts b/api/src/2fa/service.ts new file mode 100644 index 00000000..c682a510 --- /dev/null +++ b/api/src/2fa/service.ts @@ -0,0 +1,27 @@ +import { type Request } from 'express' +import { authenticator } from 'otplib' +import { type Password } from '../utils/passwords.ts' +import { session } from '@data-fair/lib-express' + +export const is2FAValid = (secret: string | undefined, token: string) => { + if (!secret) return false + return authenticator.check(token, secret) +} + +export const cookie2FAName = (userId: string) => 'id_token_2fa_' + userId + +export type TwoFA = { active: boolean, secret: string, recovery?: Password } + +export const check2FASession = async (req: Request, userId: string) => { + const token = req.cookies[cookie2FAName(userId)] + if (!token) return false + let decoded + try { + decoded = await session.verifyToken(token) + } catch (err) { + console.error('invalid 2fa token', err) + return false + } + if (decoded.user !== userId) return false + return true +} diff --git a/api/src/accounts/router.ts b/api/src/accounts/router.ts new file mode 100644 index 00000000..2d565b97 --- /dev/null +++ b/api/src/accounts/router.ts @@ -0,0 +1,67 @@ +import config from '#config' +import { reqI18n } from '#i18n' +import storages from '#storages' +import { type Account, type EventLogContext, httpError, mongoPagination, mongoSort, reqSession } from '@data-fair/lib-express' +import eventsLog from '@data-fair/lib-express/events-log.js' +import { Router } from 'express' + +export type FindAccountsParams = { + q?: string, + size: number, + skip: number, + sort?: any +} + +const router = Router() + +// Get the list of users +router.get('', async (req, res, next) => { + const logContext: EventLogContext = { req } + const session = reqSession(req) + + const listMode = config.listUsersMode || config.listEntitiesMode + if (listMode === 'authenticated' && !session.user) return res.send({ results: [], count: 0 }) + if (listMode === 'admin' && !session.user?.adminMode) return res.send({ results: [], count: 0 }) + + const params: FindAccountsParams = { ...mongoPagination(req.query), sort: mongoSort(req.query.sort) } + if (typeof req.query.q === 'string') params.q = req.query.q + const types = (typeof req.query.type === 'string') ? req.query.type.split(',') : ['user', 'organization'] + + // Only service admins can request to see all field. Other users only see id/name + if (!session.user?.adminMode) throw httpError(403, reqI18n(req).messages.errors.permissionDenied) + + const results: Account[] = [] + let count = 0 + + if (types.includes('user')) { + const users = await storages.globalStorage.findUsers(params) + for (const user of users.results) { + results.push({ + type: 'user', + id: user.id, + name: user.name + }) + } + count += users.count + } + + if (types.includes('organization')) { + const organizations = await storages.globalStorage.findOrganizations(params) + results.length = Math.min(results.length, Math.max(params.size / 2, params.size - organizations.results.length)) + for (const org of organizations.results) { + if (results.length >= params.size) continue + results.push({ + type: 'organization', + id: org.id, + name: org.name + }) + } + count += organizations.count + } + + eventsLog.info('sd.list-accounts', 'list accounts', logContext) + + res.json({ count, results }) +}) + +export default router diff --git a/api/src/admin/router.ts b/api/src/admin/router.ts new file mode 100644 index 00000000..0689e31c --- /dev/null +++ b/api/src/admin/router.ts @@ -0,0 +1,19 @@ +import { resolve } from 'node:path' +import { readFile } from 'node:fs/promises' +import { Router } from 'express' +import { session } from '@data-fair/lib-express/index.js' + +const router = Router() +export default router + +// All routes in the router are only for the super admins of the service +router.use(async (req, res, next) => { + await session.reqAdminMode(req) + next() +}) + +let info = { version: process.env.NODE_ENV } +try { info = JSON.parse(await readFile(resolve(import.meta.dirname, '../../BUILD.json'), 'utf8')) } catch (err) {} +router.get('/info', (req, res) => { + res.send(info) +}) diff --git a/api/src/anonymous-action/router.ts b/api/src/anonymous-action/router.ts new file mode 100644 index 00000000..8f8aca23 --- /dev/null +++ b/api/src/anonymous-action/router.ts @@ -0,0 +1,23 @@ +import { type RequestHandler } from 'express' +import config from '#config' +import { reqIp } from '@data-fair/lib-express' +import eventsLog from '@data-fair/lib-express/events-log.js' + +import { reqI18n } from '#i18n' +import limiter from '../utils/limiter.ts' +import { signToken } from '#services' + +// simply get a token to perform an anonymous action in the close future +// useful to ensure that the user is human and waits for a little while before submitting a form +const route: RequestHandler = async (req, res, next) => { + try { + await limiter(req).consume(reqIp(req), 1) + } catch (err) { + eventsLog.warn('sd.anonym-action.rate-limit', 'rate limit error for /anonymous-action route', { req }) + return res.status(429).send(reqI18n(req).messages.errors.rateLimitAuth) + } + const payload = { anonymousAction: true, validation: 'wait' } + const token = await signToken(payload, config.anonymousAction.expiresIn, config.anonymousAction.notBefore) + res.send(token) +} +export default route diff --git a/api/src/app.ts b/api/src/app.ts new file mode 100644 index 00000000..4a300190 --- /dev/null +++ b/api/src/app.ts @@ -0,0 +1,81 @@ +import { resolve } from 'node:path' +import config from '#config' +import uiConfig from './ui-config.ts' +import apiDocs from '../contract/api-docs.ts' +import express, { type RequestHandler } from 'express' +import bodyParser from 'body-parser' +import cookieParser from 'cookie-parser' +import { session, errorHandler, createSiteMiddleware, createSpaMiddleware, setReqUser, httpError } from '@data-fair/lib-express' +import admin from './admin/router.ts' +import anonymousAction from './anonymous-action/router.ts' +import auth from './auth/router.ts' +import limits from './limits/router.ts' +import twoFA from './2fa/router.ts' +import mails from './mails/router.ts' +import users from './users/router.ts' +import organizations from './organizations/router.ts' +import invitations from './invitations/router.ts' +import avatars from './avatars/router.ts' +import oauthTokens from './oauth-tokens/router.ts' +import tokens from './tokens/router.ts' +import sites from './sites/router.ts' +import accounts from './accounts/router.ts' + +const app = express() +export default app + +// no fancy embedded arrays, just string and arrays of strings in req.query +app.set('query parser', 'simple') +app.set('json spaces', 2) + +app.use(cookieParser()) +app.use(bodyParser.json({ limit: '100kb' })) +app.use(createSiteMiddleware('simple-directory')) +app.use(session.middleware()) + +// minimalist api key management +const readApiKey: RequestHandler = async (req, res, next) => { + const apiKey = req.get('x-apiKey') || req.get('x-api-key') || req.query.apiKey + if (apiKey) { + if (apiKey !== config.secretKeys.readAll) { + return res.status(401).send('bad api key') + } else { + if (req.method !== 'GET') throw httpError(403, 'api key is only for read endpoints') + setReqUser(req, { + isAdmin: 1, + adminMode: 1, + id: 'readAll', + email: 'read-all@api-key', + name: 'Read all API key', + organizations: [] + }) + } + } + next() +} + +app.get('/api/api-docs.json', (req, res) => res.send(apiDocs)) +app.use('/api/admin', admin) +app.get('/api/auth/anonymous-action', anonymousAction) +app.use('/api/auth', auth) +app.use('/api/mails', mails) +app.use('/api/users', readApiKey, users) +app.use('/api/organizations', readApiKey, organizations) +app.use('/api/invitations', invitations) +app.use('/api/avatars', avatars) +app.use('/api/limits', auth, limits) +app.use('/api/2fa', twoFA) +app.use('/api/oauth-tokens', oauthTokens) +app.use('/api/accounts', accounts) +app.use('/api/sites', sites) + +app.use('/api/', (req, res) => { + res.status(404).send('unknown api endpoint') +}) +app.use(tokens) + +if (config.serveUi) { + app.use(await createSpaMiddleware(resolve(import.meta.dirname, '../../ui/dist'), uiConfig)) +} + +app.use(errorHandler) diff --git a/api/src/auth/providers.ts b/api/src/auth/providers.ts new file mode 100644 index 00000000..aa395ace --- /dev/null +++ b/api/src/auth/providers.ts @@ -0,0 +1,56 @@ +import { oauthGlobalProviders, getOidcProviderId, saml2GlobalProviders, getSiteByUrl } from '#services' +import type { Site, PublicAuthProvider } from '#types' +import _slug from 'slugify' + +const slug = _slug.default + +export const publicProviders = async (site?: Site) => { + const providers: PublicAuthProvider[] = [] + for (const p of saml2GlobalProviders()) { + providers.push({ + type: 'saml2', + id: p.id, + title: p.title, + color: p.color, + icon: p.icon, + img: p.img, + redirectMode: p.redirectMode + }) + } + for (const p of oauthGlobalProviders()) { + providers.push({ + type: 'oauth', + id: p.id, + title: p.title, + color: p.color, + icon: p.icon, + img: p.img, + redirectMode: p.redirectMode + }) + } + + if (site) { + const siteProviders = await site.authProviders || [] + for (const p of siteProviders) { + if (p.type === 'oidc') { + providers.push({ + type: p.type, + id: getOidcProviderId(p.discovery), + title: p.title as string, + color: p.color, + img: p.img, + redirectMode: p.redirectMode + }) + } + if (p.type === 'otherSite') { + const otherSiteUrl = (p.site.startsWith('http://') || p.site.startsWith('https://')) ? p.site : `https://${p.site}` + const otherSite = await getSiteByUrl(otherSiteUrl) + if (otherSite && otherSite.owner.type === site.owner.type && otherSite.owner.id === site.owner.id) { + providers.push({ type: 'otherSite', id: slug(otherSite.host + (otherSite.path ?? ''), { lower: true, strict: true }), title: p.title as string, color: site.theme.colors.primary, img: site.theme.logo, host: otherSite.host }) + } + } + } + } + + return providers +} diff --git a/api/src/auth/router.ts b/api/src/auth/router.ts new file mode 100644 index 00000000..bf498a48 --- /dev/null +++ b/api/src/auth/router.ts @@ -0,0 +1,1021 @@ +import config, { superadmin } from '#config' +import { Router, type RequestHandler } from 'express' +import { reqUser, reqIp, reqSiteUrl, reqUserAuthenticated, session, httpError } from '@data-fair/lib-express' +import eventsQueue from '#events-queue' +import bodyParser from 'body-parser' +import { nanoid } from 'nanoid' +import Cookies from 'cookies' +import Debug from 'debug' +import { sendMail, postUserIdentityWebhook, getOidcProviderId, oauthGlobalProviders, initOidcProvider, getOAuthProviderById, getOAuthProviderByState, reqSite, getSiteByUrl, check2FASession, is2FAValid, cookie2FAName, getTokenPayload, prepareCallbackUrl, signToken, decodeToken, setSessionCookies, getDefaultUserOrg, logout, keepalive, logoutOAuthToken, readOAuthToken, writeOAuthToken, authCoreProviderMemberInfo, patchCoreOAuthUser, unshortenInvit, getOrgLimits, setNbMembersLimit, getSamlProviderId, saml2GlobalProviders, saml2ServiceProvider, initServerSession, getRedirectSite } from '#services' +import type { SdStorage } from '../storages/interface.ts' +import type { ActionPayload, ServerSession, User, UserWritable } from '#types' +import eventsLog, { type EventLogContext } from '@data-fair/lib-express/events-log.js' +import emailValidator from 'email-validator' +import { reqI18n, __all } from '#i18n' +import limiter from '../utils/limiter.ts' +import storages from '#storages' +import { checkPassword, type Password } from '../utils/passwords.ts' +import { type OpenIDConnect } from '#types/site/index.ts' +import { publicProviders } from './providers.ts' + +const debug = Debug('auth') + +const router = Router() +export default router + +// these routes accept url encoded form data so that they can be used from basic +// html forms +router.use(bodyParser.urlencoded({ limit: '100kb' })) + +async function confirmLog (storage: SdStorage, user: User, serverSession: ServerSession) { + if (!storage.readonly) { + await storage.updateLogged(user.id, serverSession.id) + if (user.emailConfirmed === false) { + await storage.confirmEmail(user.id) + postUserIdentityWebhook(user) + } + } +} + +const rejectCoreIdUser: RequestHandler = (req, res, next) => { + if (reqUser(req)?.idp) throw httpError(403, 'This route is not available for users with a core identity provider') + next() +} + +// Authenticate a user based on his email address and password +router.post('/password', rejectCoreIdUser, async (req, res, next) => { + const logContext: EventLogContext = { req } + + if (!req.body || !req.body.email) return res.status(400).send(reqI18n(req).messages.errors.badEmail) + if (!emailValidator.validate(req.body.email)) return res.status(400).send(reqI18n(req).messages.errors.badEmail) + if (!req.body.password) return res.status(400).send(reqI18n(req).messages.errors.badCredentials) + + const { body, query } = (await import('#doc/auth/post-password-req/index.ts')).returnValid(req, { name: 'req' }) + + const returnError = async (error: string, errorCode: number) => { + // prevent attacker from analyzing response time + await new Promise(resolve => setTimeout(resolve, Math.round(Math.random() * 1000))) + const referer = req.headers.referer || req.headers.referrer + if (req.is('application/x-www-form-urlencoded') && typeof referer === 'string') { + const refererUrl = new URL(referer) + refererUrl.searchParams.set('error', error) + res.redirect(refererUrl.href) + } else { + res.status(errorCode).send(reqI18n(req).messages.errors[error] || error) + } + } + + try { + await limiter(req).consume(reqIp(req), 1) + await limiter(req).consume(body.email, 1) + } catch (err) { + console.error('Rate limit error for /password route', reqIp(req), body.email, err) + eventsLog.warn('sd.auth.password.rate-limit', `rate limit error for /auth/password route ${body.email}`, logContext) + return returnError('rateLimitAuth', 429) + } + + const orgId = body.org || query.org + const depId = body.dep || query.dep + let org, dep + if (orgId && typeof orgId === 'string') { + org = await storages.globalStorage.getOrganization(orgId) + if (!org) { + eventsLog.info('sd.auth.password.fail', `a user failed to authenticate due to unknown org ${orgId}`, logContext) + return returnError('badCredentials', 400) + } + if (depId) { + dep = org.departments?.find(d => d.id === depId) + if (!dep) { + eventsLog.info('sd.auth.password.fail', `a user failed to authenticate due to unknown dep ${orgId} / ${depId}`, logContext) + return returnError('badCredentials', 400) + } + } + } + + let storage = storages.globalStorage + if (body.orgStorage && org) { + storage = await storages.createOrgStorage(org) ?? storage + } + + if (config.adminCredentials?.password && config.adminCredentials.email === body.email) { + const validPassword = await checkPassword(body.password, config.adminCredentials.password as Password) + if (validPassword) { + const payload = getTokenPayload(superadmin) + payload.adminMode = 1 + const callbackUrl = (await prepareCallbackUrl(req, payload, query.redirect)).href + debug('Password based authentication of superadmin with password from config', callbackUrl) + eventsLog.info('sd.auth.admin-auth', 'a user authenticated using the /auth/password route with special admin account', logContext) + return res.send(callbackUrl) + } else { + eventsLog.alert('sd.auth.password.admin-fail', 'a user failed to authenticate using the /auth/password route with special admin account', logContext) + return returnError('badCredentials', 400) + } + } + + const site = await reqSite(req) + let user = await storage.getUserByEmail(body.email, site) + logContext.user = user + let userFromMainHost = false + if (!user || user.emailConfirmed === false) { + if (site) { + user = await storage.getUserByEmail(body.email) + userFromMainHost = true + } + if (!user) return returnError('badCredentials', 400) + } + if (storage.getPassword) { + const storedPassword = await storage.getPassword(user.id) + const validPassword = await checkPassword(body.password, storedPassword) + if (!validPassword) { + eventsLog.info('sd.auth.password.fail', `a user failed to authenticate with a wrong password email=${body.email}`, logContext) + return returnError('badCredentials', 400) + } + } else if (storage.checkPassword) { + if (!await storage.checkPassword(user.id, body.password)) { + eventsLog.info('sd.auth.password.fail', `a user failed to authenticate with a wrong password email=${body.email}`, logContext) + return returnError('badCredentials', 400) + } + } else { + throw new Error('missing password verification implementation') + } + if (org && body.membersOnly && !user.organizations.find(o => o.id === org.id)) { + eventsLog.info('sd.auth.password.fail', 'a user failed to authenticate as they are not a member of targeted org', logContext) + return returnError('badCredentials', 400) + } + + if (userFromMainHost && site) { + const payload: ActionPayload = { + id: user.id, + email: user.email, + action: 'changeHost' + } + const token = await signToken(payload, config.jwtDurations.initialToken) + const changeHostUrl = new URL((site.host.startsWith('localhost') ? 'http://' : 'https://') + site.host + '/simple-directory/login') + changeHostUrl.searchParams.set('action_token', token) + eventsLog.info('sd.auth.password.change-host', 'a user is suggested to switch to secondary host', logContext) + if (req.is('application/x-www-form-urlencoded')) { + return res.redirect(changeHostUrl.href) + } else { + return res.send(changeHostUrl.href) + } + } + + const payload = getTokenPayload(user) + if (body.adminMode) { + if (payload.isAdmin) payload.adminMode = 1 + else { + eventsLog.alert('sd.auth.password.not-admin', 'a unauthorized user tried to activate admin mode', logContext) + return returnError('adminModeOnly', 403) + } + } else if (body.rememberMe) { + payload.rememberMe = 1 + } + // 2FA management + const user2FA = await storage.get2FA(user.id) + if ((user2FA && user2FA.active) || await storage.required2FA(user)) { + if (await check2FASession(req, user.id)) { + // 2FA was already validated earlier and present in a cookie + } else if (body['2fa']) { + if (!await is2FAValid(user2FA?.secret, body['2fa'].trim())) { + // a token was sent but it is not an actual 2FA token, instead it is the special recovery token + if (user2FA?.recovery) { + const validRecovery = await checkPassword(body['2fa'].trim(), user2FA.recovery) + if (validRecovery) { + await storages.globalStorage.patchUser(user.id, { '2FA': { active: false } }) + eventsLog.info('sd.auth.password.fail', 'a user tried to use a recovery token as a normal token', logContext) + return returnError('2fa-missing', 403) + } + } + eventsLog.info('sd.auth.password.fail', 'a user tried to use a bad 2fa token', logContext) + return returnError('2fa-bad-token', 403) + } else { + // 2FA token sent alongside email/password + const cookies = new Cookies(req, res) + const token = await signToken({ user: user.id }, config.jwtDurations['2FAToken']) + const payload = decodeToken(token) + const cookieOpts: Cookies.SetOption = { sameSite: 'lax', httpOnly: true } + if (payload?.exp) cookieOpts.expires = new Date(payload.exp * 1000) + cookies.set(cookie2FAName(user.id), token, cookieOpts) + } + } else { + if (!user2FA || !user2FA.active) { + eventsLog.info('sd.auth.password.fail', 'a user tried to login without having configured 2fa', logContext) + return returnError('2fa-missing', 403) + } else { + eventsLog.info('sd.auth.password.fail', 'a user tried to login without 2fa', logContext) + return returnError('2fa-required', 403) + } + } + } + + eventsLog.info('sd.auth.password.ok', 'a user successfully authenticated using password', logContext) + // this is used by data-fair app integrated login + if (req.is('application/x-www-form-urlencoded')) { + const serverSession = initServerSession(req) + await storage.addUserSession(user.id, serverSession) + await confirmLog(storage, user, serverSession) + await setSessionCookies(req, res, payload, serverSession.id, getDefaultUserOrg(user, orgId, depId)) + debug(`Password based authentication of user ${user.name}, form mode`) + res.redirect(query.redirect || config.defaultLoginRedirect || reqSiteUrl(req) + '/simple-directory/me') + } else { + const callbackUrl = (await prepareCallbackUrl(req, payload, query.redirect, getDefaultUserOrg(user, orgId, depId), body.orgStorage)).href + debug(`Password based authentication of user ${user.name}, ajax mode`, callbackUrl) + res.send(callbackUrl) + } +}) + +// Either find or create an user based on an email address then send a mail with a link and a token +// to check that this address belongs to the user. +router.post('/passwordless', rejectCoreIdUser, async (req, res, next) => { + const logContext: EventLogContext = { req } + + if (!config.passwordless) return res.status(400).send(reqI18n(req).messages.errors.noPasswordless) + if (!req.body || !req.body.email) return res.status(400).send(reqI18n(req).messages.errors.badEmail) + if (!emailValidator.validate(req.body.email)) return res.status(400).send(reqI18n(req).messages.errors.badEmail) + + const { body, query } = (await import('#doc/auth/post-passwordless-req/index.ts')).returnValid(req, { name: 'req' }) + + try { + await limiter(req).consume(reqIp(req), 1) + } catch (err) { + eventsLog.warn('sd.auth.passwordless.rate-limit', `rate limit error for /auth/passwordless route ${body.email}`, logContext) + return res.status(429).send(reqI18n(req).messages.errors.rateLimitAuth) + } + + let org + if (body.org) { + org = await storages.globalStorage.getOrganization(body.org) + if (!org) { + eventsLog.info('sd.auth.passwordless.fail', `a passwordless authentication failed due to unknown org ${body.org}`, logContext) + return res.status(404).send(reqI18n(req).messages.errors.orgaUnknown) + } + } + + let storage = storages.globalStorage + if (body.orgStorage && org) { + storage = await storages.createOrgStorage(org) ?? storage + } + const user = await storage.getUserByEmail(body.email, await reqSite(req)) + logContext.user = user + + const redirect = query.redirect || config.defaultLoginRedirect || reqSiteUrl(req) + '/simple-directory' + const redirectUrl = new URL(redirect) + + // No 404 here so we don't disclose information about existence of the user + if (!user || user.emailConfirmed === false) { + await sendMail('noCreation', reqI18n(req).messages, body.email, { link: redirect, host: redirectUrl.host, origin: redirectUrl.origin }) + eventsLog.info('sd.auth.passwordless.no-user', `a passwordless authentication failed because of missing user and a warning mail was sent ${req.body.email}`, logContext) + return res.status(204).send() + } + + if (org && body.membersOnly && !user.organizations.find(o => o.id === org.id)) { + if (!org) { + eventsLog.info('sd.auth.passwordless.fail', `a passwordless authentication failed due to unknown org ${body.org}`, logContext) + return res.status(404).send(reqI18n(req).messages.errors.orgaUnknown) + } + } + + const payload = getTokenPayload(user) + if (req.body.rememberMe) payload.rememberMe = 1 + + // passwordless is not compatible with 2FA for now + if (await storage.get2FA(user.id) || await storage.required2FA(user)) { + eventsLog.info('sd.auth.passwordless.fail', 'a passwordless authentication failed due to incompatibility with 2fa', logContext) + return res.status(400).send(reqI18n(req).messages.errors.passwordless2FA) + } + + const linkUrl = await prepareCallbackUrl(req, payload, query.redirect, getDefaultUserOrg(user, body.org, body.dep), body.orgStorage) + debug(`Passwordless authentication of user ${user.name}`) + await sendMail('login', reqI18n(req).messages, user.email, { link: linkUrl.href, host: linkUrl.host, origin: linkUrl.origin }) + eventsLog.info('sd.auth.passwordless.ok', 'a user successfully sent a authentication email', logContext) + res.status(204).send() +}) + +// use current session and redirect to a secondary site +router.post('/site_redirect', async (req, res, next) => { + const logContext: EventLogContext = { req } + const loggedUser = reqUserAuthenticated(req) + const currentSite = await reqSite(req) + if (currentSite) return res.status(400).send() + const storage = storages.globalStorage + const user = await storage.getUserByEmail(loggedUser.email) + if (!user) return res.status(404).send('user not found') + if (!req.body.redirect) return res.status(400).send() + const site = await getSiteByUrl(req.body.redirect) + if (!site) return res.status(404).send('site not found') + const payload = getTokenPayload(user) + const callbackUrl = (await prepareCallbackUrl(req, payload, req.body.redirect, getDefaultUserOrg(user, req.body.org, req.body.dep))).href + debug(`Redirect auth of user ${user.name} to site ${site.host}`, callbackUrl) + + eventsLog.info('sd.auth.redirect-site', 'a authenticated user is redirected to secondary site with session', logContext) + res.send(callbackUrl) +}) + +router.get('/token_callback', async (req, res, next) => { + const logContext: EventLogContext = { req } + + const { query } = (await import('#doc/auth/post-token-callback-req/index.ts')).returnValid(req, { name: 'req' }) + + const redirectError = (error: string) => { + eventsLog.info('sd.auth.callback.fail', `a token callback failed with error ${error}`, logContext) + res.redirect(`${reqSiteUrl(req)}/simple-directory/login?error=${encodeURIComponent(error)}`) + } + + if (!query.id_token) return redirectError('missingToken') + let decoded + try { + decoded = await session.verifyToken(query.id_token) + } catch (err) { + return redirectError('invalidToken') + } + + let org + if (query.id_token_org) { + org = await storages.globalStorage.getOrganization(query.id_token_org) + if (!org) return redirectError('orgaUnknown') + } + let storage = storages.globalStorage + if (query.org_storage && org) { + storage = await storages.createOrgStorage(org) ?? storage + } + const user = decoded.id === '_superadmin' ? superadmin : await storage.getUser(decoded.id) + logContext.user = user + + if (!user || (decoded.emailConfirmed !== true && user.emailConfirmed === false)) { + return redirectError('badCredentials') + } + + const reboundRedirect = query.redirect || config.defaultLoginRedirect || reqSiteUrl(req) + '/simple-directory/me' + + const payload = getTokenPayload(user) + if (decoded.rememberMe) payload.rememberMe = 1 + if (decoded.adminMode && payload.isAdmin) payload.adminMode = 1 + + const serverSession = initServerSession(req) + await storage.addUserSession(user.id, serverSession) + + await confirmLog(storage, user, serverSession) + await setSessionCookies(req, res, payload, serverSession.id, getDefaultUserOrg(user, query.id_token_org, query.id_token_dep)) + + eventsLog.info('sd.auth.callback.ok', 'a session was initialized after successful auth', logContext) + + // we just confirmed the user email after creation, he might want to create an organization + if (decoded.emailConfirmed && config.quotas.defaultMaxCreatedOrgs !== 0 && !org && !reboundRedirect.startsWith(`${reqSiteUrl(req) + '/simple-directory'}/login`)) { + const redirectUrl = new URL(`${reqSiteUrl(req) + '/simple-directory'}/login`) + redirectUrl.searchParams.set('step', 'createOrga') + redirectUrl.searchParams.set('redirect', reboundRedirect) + debug('redirect to createOrga step', redirectUrl.href) + res.redirect(redirectUrl.href) + } else if (user.plannedDeletion) { + const redirectUrl = new URL(`${reqSiteUrl(req) + '/simple-directory'}/login`) + redirectUrl.searchParams.set('step', 'plannedDeletion') + redirectUrl.searchParams.set('redirect', reboundRedirect) + debug('redirect to plannedDeletion step', redirectUrl.href) + res.redirect(redirectUrl.href) + } else { + res.redirect(reboundRedirect) + } +}) + +// Used to extend an older but still valid token from a user +// TODO: deprecate this whole route, replaced by simpler /keepalive +/* router.post('/exchange', async (req, res, next) => { + const logContext: EventLogContext = { req } + + const idToken = ((req.cookies && req.cookies.id_token) || (req.headers && req.headers.authorization && req.headers.authorization.split(' ').pop()) || req.query.id_token) as string | undefined + if (!idToken) { + return res.status(401).send('No id_token cookie provided') + } + let decoded + try { + decoded = await session.verifyToken(idToken) + } catch (err) { + eventsLog.info('sd.auth.exchange.fail', 'a user tried to prolongate a session with invalid token', logContext) + return res.status(401).send('Invalid id_token') + } + + // User may have new organizations since last renew + const storage = storages.globalStorage + const user = decoded.id === '_superadmin' ? superadmin : await storage.getUser(decoded.id) + logContext.user = user + + if (!user) { + eventsLog.info('sd.auth.exchange.fail', 'a deleted user tried to prolongate a session', logContext) + return res.status(401).send('User does not exist anymore') + } + const payload = getTokenPayload(user) + if (decoded.adminMode && req.query.noAdmin !== 'true') payload.adminMode = 1 + if (decoded.asAdmin) { + payload.asAdmin = decoded.asAdmin + payload.name = decoded.name + delete payload.isAdmin + } else { + if (!storage.readonly) { + await storage.updateLogged(decoded.id) + if (user.emailConfirmed === false) { + eventsLog.info('sd.auth.exchange.fail', 'a email was confirmed for the first time', logContext) + await storage.confirmEmail(decoded.id) + postUserIdentityWebhook(user) + } + } + } + if (decoded.rememberMe) payload.rememberMe = 1 + const token = await signToken(payload, config.jwtDurations.exchangedToken) + + eventsLog.info('sd.auth.exchange.ok', 'a session token was successfully exchanged for a new one', logContext) + + debug(`Exchange session token for user ${user.name}`) + + // TODO: sending token in response is deprecated and will be removed ? + res.set('Deprecation', 'true') + res.send(token) +}) */ + +router.post('/keepalive', async (req, res, next) => { + const loggedUser = reqUserAuthenticated(req) + const storage = storages.globalStorage + let user = loggedUser.id === '_superadmin' ? superadmin : await storage.getUser(loggedUser.id) + if (!user) throw httpError(404) + + const coreIdProvider = user.coreIdProvider + if (coreIdProvider?.type === 'oauth' || coreIdProvider?.type === 'oidc') { + let provider + const site = await reqSite(req) + if (!site) { + provider = oauthGlobalProviders().find(p => p.id === coreIdProvider.id) + } else { + const providerInfo = site.authProviders?.find(p => p.type === 'oidc' && getOidcProviderId(p.discovery) === coreIdProvider.id) as OpenIDConnect + provider = await initOidcProvider(providerInfo, reqSiteUrl(req) + '/simple-directory') + } + if (!provider) { + await logout(req, res) + return res.status(401).send('Fournisseur d\'identité principal inconnu') + } + const oauthToken = (await readOAuthToken(user, provider)) + + if (!oauthToken) { + await logout(req, res) + return res.status(401).send('Pas de jeton de session sur le fournisseur d\'identité principal') + } + if (oauthToken.loggedOut) { + await logout(req, res) + return res.status(401).send('Utilisateur déconnecté depuis le fournisseur d\'identité principal') + } + const tokenJson = oauthToken.token + + try { + const refreshedToken = await provider.refreshToken(tokenJson, true) + + if (refreshedToken) { + const { newToken, offlineRefreshToken } = refreshedToken + const userInfo = await provider.userInfo(newToken.access_token) + const memberInfo = await authCoreProviderMemberInfo(await reqSite(req), provider, user.email, userInfo) + user = await patchCoreOAuthUser(provider, user, userInfo, memberInfo) + await writeOAuthToken(user, provider, newToken, offlineRefreshToken) + eventsLog.info('sd.auth.keepalive.oauth-refresh-ok', `a user refreshed their info from their core identity provider ${provider.id}`, { req }) + } + } catch (err: any) { + await logout(req, res) + eventsLog.info('sd.auth.keepalive.oauth-refresh-ko', `a user failed to refresh their info from their core identity provider ${provider.id} (${err.message})`, { req }) + // TODO: can we be confident enough in this to actually delete the user ? or maybe flag it as disabled so that it is removed from listings ? + return res.status(401).send('Échec de prolongation de la session avec le fournisseur d\'identité principal') + } + } + + debug(`Exchange session token for user ${loggedUser.name}`) + await keepalive(req, res, user) + + res.status(204).send() +}) + +router.delete('/', async (req, res) => { + const logContext: EventLogContext = { req } + await logout(req, res) + eventsLog.info('sd.auth.session-delete', 'a session was deleted', logContext) + res.status(204).send() +}) + +// Send an email to confirm user identity before authorizing an action +router.post('/action', async (req, res, next) => { + const logContext: EventLogContext = { req } + + if (!req.body || !req.body.email) return res.status(400).send(reqI18n(req).messages.errors.badEmail) + if (!emailValidator.validate(req.body.email)) return res.status(400).send(reqI18n(req).messages.errors.badEmail) + + const { body } = (await import('#doc/auth/post-action-req/index.ts')).returnValid(req, { name: 'req' }) + + try { + await limiter(req).consume(reqIp(req), 1) + } catch (err) { + console.error('Rate limit error for /action route', reqIp(req), req.body.email, err) + eventsLog.warn('sd.auth.action.rate-limit', 'rate limit error for /action route', logContext) + return res.status(429).send(reqI18n(req).messages.errors.rateLimitAuth) + } + + const storage = storages.globalStorage + let user = await storage.getUserByEmail(body.email, await reqSite(req)) + logContext.user = user + let action = body.action as ActionPayload['action'] + if (!user && await reqSite(req)) { + user = await storage.getUserByEmail(body.email) + action = 'changeHost' + } + const target = body.target || `${reqSiteUrl(req)}/simple-directory/login` + // No 404 here so we don't disclose information about existence of the user + if (!user || user.emailConfirmed === false) { + const linkUrl = new URL(target) + await sendMail('noCreation', reqI18n(req).messages, body.email, { link: target, host: linkUrl.host, origin: linkUrl.origin }) + eventsLog.info('sd.auth.action.fail', `an action ${action} failed because of missing user and a warning mail was sent ${body.email}`, logContext) + return res.status(204).send() + } + const payload: ActionPayload = { + id: user.id, + email: user.email, + action + } + const token = await signToken(payload, config.jwtDurations.initialToken) + const linkUrl = new URL(target) + linkUrl.searchParams.set('action_token', token) + + await sendMail('action', reqI18n(req).messages, user.email, { link: linkUrl.href, host: linkUrl.host, origin: linkUrl.origin }) + eventsLog.info('sd.auth.action.ok', `an action email ${action} was sent`, logContext) + res.status(204).send() +}) + +router.delete('/adminmode', async (req, res, next) => { + const user = reqUserAuthenticated(req) + if (!user.adminMode) throw httpError(403, 'This route is only available in admin mode') + await keepalive(req, res, undefined, true) + + res.status(204).send() +}) + +// create a session as a user but from a super admin session +router.post('/asadmin', async (req, res, next) => { + const logContext: EventLogContext = { req } + const loggedUser = reqUserAuthenticated(req) + if (!loggedUser.adminMode) throw httpError(403, 'This functionality is for admins only') + const storage = storages.globalStorage + const user = await storage.getUser(req.body.id) + if (!user) return res.status(404).send('User does not exist') + const payload = getTokenPayload(user) + payload.name += ' (administration)' + payload.asAdmin = { id: loggedUser.id, name: loggedUser.name } + delete payload.isAdmin + debug(`Exchange session token for user ${user.name} from an admin session`) + await setSessionCookies(req, res, payload, null, getDefaultUserOrg(user)) + + eventsLog.info('sd.auth.asadmin.ok', 'a session was created as a user from an admin session', logContext) + + res.status(204).send() +}) + +router.delete('/asadmin', async (req, res, next) => { + const logContext: EventLogContext = { req } + const loggedUser = reqUserAuthenticated(req) + if (!loggedUser.asAdmin) throw httpError(403, 'This functionality is for admins only') + const storage = storages.globalStorage + const user = loggedUser.asAdmin.id === '_superadmin' ? superadmin : await storage.getUser(loggedUser.asAdmin.id) + if (!user) return res.status(401).send('User does not exist anymore') + const payload = getTokenPayload(user) + payload.adminMode = 1 + debug(`Exchange session token for user ${user.name} from an asAdmin session`) + await setSessionCookies(req, res, payload, null, getDefaultUserOrg(user)) + + eventsLog.info('sd.auth.asadmin.done', 'a session as a user from an admin session was terminated', logContext) + + res.status(204).send() +}) + +router.get('/me', (req, res) => { + if (!reqUser(req)) return res.status(404).send() + else res.send(reqUser(req)) +}) + +router.get('/providers', async (req, res) => { + res.send(await publicProviders(await reqSite(req))) +}) + +// OAUTH +const debugOAuth = Debug('oauth') + +const oauthLogin: RequestHandler = async (req, res, next) => { + const logContext: EventLogContext = { req } + const provider = await getOAuthProviderById(req, req.params.oauthId) + if (!provider) { + eventsLog.info('sd.auth.oauth.fail', 'a user tried to login with an unknown oauth provider', logContext) + return res.redirect(`${reqSiteUrl(req) + '/simple-directory'}/login?error=unknownOAuthProvider`) + } + const relayState = [ + provider.state, + req.headers.referer, + (req.query.redirect as string || config.defaultLoginRedirect || reqSiteUrl(req) + '/simple-directory').replace('?id_token=', ''), + req.query.org || '', + req.query.dep || '', + req.query.invit_token || '', + req.query.adminMode || '' // TODO: force re-submit password in this case ? + ] + const authorizationUri = provider.authorizationUri(relayState, req.query.email as string, provider.coreIdProvider, req.query.adminMode === 'true') + debugOAuth('login authorizationUri', authorizationUri) + eventsLog.info('sd.auth.oauth.redirect', 'a user was redirected to a oauth provider', logContext) + res.redirect(authorizationUri) +} + +router.get('/oauth/:oauthId/login', oauthLogin) +router.get('/oidc/:oauthId/login', oauthLogin) + +const oauthCallback: RequestHandler = async (req, res, next) => { + const logContext: EventLogContext = { req } + const site = await reqSite(req) + + const storage = storages.globalStorage + debugOAuth('oauth login callback') + + if (!req.query.state) { + console.error('missing OAuth state') + throw new Error('Bad OAuth state') + } + const [providerState, loginReferer, redirect, org, dep, invitToken, adminMode] = JSON.parse(req.query.state as string) + + const returnError = (error: string, errorCode: number) => { + eventsLog.info('sd.auth.oauth.fail', `a user failed to authenticate with oauth due to ${error}`, logContext) + debugOAuth('login return error', error, errorCode) + if (loginReferer) { + const refererUrl = new URL(loginReferer) + refererUrl.searchParams.set('error', error) + res.redirect(refererUrl.href) + } else { + res.status(errorCode).send(reqI18n(req).messages.errors[error] || error) + } + } + + const provider = await getOAuthProviderByState(req, providerState) + if (!provider) return res.status(404).send('Unknown OAuth provider') + if (req.params.oauthId && req.params.oauthId !== provider.id) return res.status(404).send('Wrong OAuth provider id') + + if (req.query.error) { + console.log('Bad OAuth query', req.query) + return returnError('badIDPQuery', 500) + } + + const { token, offlineRefreshToken } = await provider.getToken(req.query.code as string, provider.coreIdProvider) + const accessToken = token.access_token + + const userInfo = await provider.userInfo(accessToken) + + if (!userInfo.user.email) { + console.error('Email attribute not fetched from OAuth', provider.id, userInfo) + throw new Error('Email manquant dans les attributs de l\'utilisateur.') + } + debugOAuth('Got user info from oauth', provider.id, userInfo) + + const oauthInfo = { ...userInfo, logged: new Date().toISOString() } + + // used to create a user and accept a member invitation at the same time + // if the invitation is not valid, better not to proceed with the user creation + let invit, invitOrga + if (invitToken) { + try { + invit = unshortenInvit(await session.verifyToken(invitToken)) + eventsLog.info('sd.auth.oauth.invit', `a user was invited to join an organization ${invit.id}`, logContext) + } catch (err: any) { + return returnError(err.name === 'TokenExpiredError' ? 'expiredInvitationToken' : 'invalidInvitationToken', 400) + } + invitOrga = await storage.getOrganization(invit.id) + if (!invitOrga) return returnError('orgaUnknown', 400) + if (invit.email !== userInfo.user.email) return returnError('badProviderInvitEmail', 400) + } + + // check for user with same email + let user = await storage.getUserByEmail(userInfo.user.email, site) + logContext.user = user + + if (!user && !invit && config.onlyCreateInvited && !provider.coreIdProvider) { + return returnError('onlyCreateInvited', 400) + } + if (!user && storage.readonly) { + return returnError('userUnknown', 403) + } + + // Re-create a user that was never validated.. first clean temporary user + if (user && user.emailConfirmed === false) { + if (user.organizations && invit) { + // This user was created empty from an invitation in 'alwaysAcceptInvitations' mode + } else { + eventsLog.info('sd.auth.oauth.del-temp-user', `a temporary user was deleted in oauth callback ${user.id}`, logContext) + await storage.deleteUser(user.id) + user = undefined + } + } + + const memberInfo = await authCoreProviderMemberInfo(site, provider, userInfo.user.email, oauthInfo) + + if (invit && memberInfo.create) throw new Error('Cannot create a member from a identity provider and accept an invitation at the same time') + + if (!user) { + const newUser: UserWritable = { + ...userInfo.user, + id: nanoid(), + emailConfirmed: true, + [provider.type || 'oauth']: { + [provider.id]: { ...oauthInfo, coreId: provider.coreIdProvider ? true : undefined } + }, + coreIdProvider: provider.coreIdProvider ? { type: provider.type || 'oauth', id: provider.id } : undefined, + organizations: [] + } + if (site) newUser.host = site.host + if (invit && invitOrga) { + newUser.defaultOrg = invitOrga.id + newUser.ignorePersonalAccount = true + } else if (memberInfo.create && memberInfo.org) { + newUser.defaultOrg = memberInfo.org.id + newUser.ignorePersonalAccount = true + } + debugOAuth('Create user authenticated through oauth', user) + logContext.user = user + eventsLog.info('sd.auth.oauth.create-user', `a user was created in oauth callback ${newUser.id}`, logContext) + const redirectSite = await getRedirectSite(req, redirect) + user = await storage.createUser(newUser, undefined, redirectSite) + + if (memberInfo.create && memberInfo.org) { + logContext.account = { type: 'organization', ...memberInfo.org } + eventsLog.info('sd.auth.oauth.create-member', `a user was added as a member in oauth callback ${user.id} / ${memberInfo.role}`, logContext) + await storage.addMember(memberInfo.org, user, memberInfo.role, null, memberInfo.readOnly) + } + } else { + if (user.coreIdProvider && (user.coreIdProvider.type !== (provider.type || 'oauth') || user.coreIdProvider.id !== provider.id)) { + return res.status(400).send('Utilisateur déjà lié à un autre fournisseur d\'identité principale') + } + debugOAuth('Existing user authenticated through oauth', user, userInfo) + await patchCoreOAuthUser(provider, user, oauthInfo, memberInfo) + } + + if (invit && invitOrga && !config.alwaysAcceptInvitation) { + const limits = await getOrgLimits(invitOrga) + if (limits.store_nb_members.limit > 0 && limits.store_nb_members.consumption >= limits.store_nb_members.limit) { + return res.status(400).send(reqI18n(req).messages.errors.maxNbMembers) + } + + await storage.addMember(invitOrga, user, invit.role, invit.department) + eventsLog.info('sd.auth.oauth.accept-invite', `a user accepted an invitation in oauth callback ${user.id}`, logContext) + eventsQueue?.pushEvent({ + sender: { type: 'organization', id: invitOrga.id, name: invitOrga.name, role: 'admin', department: invit.department }, + topic: { key: 'simple-directory:invitation-accepted' }, + title: __all('notifications.acceptedInvitation', { name: user.name, email: user.email, orgName: invitOrga.name + (invit.department ? ' / ' + invit.department : '') }) + }) + await setNbMembersLimit(invitOrga.id) + } + + if (provider.coreIdProvider) { + await writeOAuthToken(user, provider, token, offlineRefreshToken) + } + + const payload = getTokenPayload(user) + if (adminMode) { + // TODO: also check that the user actually inputted the password on this redirect + if (payload.isAdmin) payload.adminMode = 1 + else { + eventsLog.alert('sd.auth.oauth.not-admin', 'a unauthorized user tried to activate admin mode', logContext) + return returnError('adminModeOnly', 403) + } + } + const linkUrl = await prepareCallbackUrl(req, payload, redirect, (invit && invitOrga) + ? { id: invit.id, department: invit.department } + : { id: org as string, department: dep as string }) + debugOAuth(`OAuth based authentication of user ${user.name}`) + res.redirect(linkUrl.href) +} + +// kept for retro-compatibility +router.get('/oauth/:oauthId/callback', oauthCallback) +router.get('/oauth-callback', oauthCallback) + +const oauthLogoutCallback: RequestHandler = async (req, res, next) => { + if (!req.body.logout_token) return res.status(400).send('missing logout_token') + const decoded = decodeToken(req.body.logout_token) + if (!decoded) return res.status(400).send('invalid logout_token') + if (decoded.typ !== 'Logout') return res.status(400).send('invalid logout_token type') + if (!decoded.sid) return res.status(400).send('missing sid in logout_token') + await logoutOAuthToken(decoded.sid) + res.status(204).send() +} + +router.get('/oauth-logout', oauthLogoutCallback) +router.post('/oauth-logout', oauthLogoutCallback) + +// SAML 2 +const debugSAML = Debug('saml') + +// expose metadata to declare ourselves to identity provider +router.get('/saml2-metadata.xml', (req, res) => { + res.type('application/xml') + res.send(saml2ServiceProvider().getMetadata()) +}) + +// starts login +router.get('/saml2/:providerId/login', async (req, res) => { + const logContext: EventLogContext = { req } + + debugSAML('login request', req.params.providerId) + const provider = saml2GlobalProviders().find(p => p.id === req.params.providerId) + if (!provider) { + eventsLog.info('sd.auth.saml.fail', 'a user tried to login with an unknown saml provider', logContext) + return res.redirect(`${reqSiteUrl(req) + '/simple-directory'}/login?error=unknownSAMLProvider`) + } + + // relay_state is used to remember some information about the login attempt + const relayState = [ + req.headers.referer, + (req.query.redirect as string || config.defaultLoginRedirect || reqSiteUrl(req) + '/simple-directory').replace('?id_token=', ''), + req.query.org || '', + req.query.invit_token || '', + req.query.adminMode || '' // TODO: force re-submit password in this case ? + ] + // relay state should be a request level parameter but it is not in current version of samlify + // cf https://github.com/tngan/samlify/issues/163 + const sp = saml2ServiceProvider() + sp.entitySetting.relayState = JSON.stringify(relayState) + + // TODO: apply nameid parameter ? { nameid: req.query.email } + const { context: loginRequestURL } = sp.createLoginRequest(provider.idp, 'redirect') + + const parsedURL = new URL(loginRequestURL) + if (typeof req.query.email === 'string') parsedURL.searchParams.append('login_hint', req.query.email) + debugSAML('redirect', parsedURL.href) + eventsLog.info('sd.auth.saml.redirect', 'a user was redirected to a saml provider', logContext) + res.redirect(parsedURL.href) +}) + +// login confirm by IDP +router.post('/saml2-assert', async (req, res) => { + const logContext: EventLogContext = { req } + + const site = await reqSite(req) + const storage = storages.globalStorage + const providers = saml2GlobalProviders() + const sp = saml2ServiceProvider() + + let provider + const referer = (req.headers.referer || req.headers.referrer) as string | undefined + if (!referer && providers.length === 1) provider = providers[0] + else if (referer) { + const providerId = getSamlProviderId(referer) + provider = providers.find(p => p.id === providerId) + } + + if (!provider) return res.status(404).send('unknown saml2 provider') + + debugSAML('saml2 assert full body', req.body) + const samlResponse = await sp.parseLoginResponse(provider.idp, 'post', req) + debugSAML('login success', JSON.stringify(samlResponse.extract, null, 2)) + + const [loginReferer, redirect, org, invitToken, adminMode] = JSON.parse(req.body.RelayState) + + const returnError = (error: string, errorCode: number) => { + eventsLog.info('sd.auth.saml.fail', `a user failed to authenticate with saml due to ${error}`, logContext) + debugSAML('login return error', error, errorCode) + if (loginReferer) { + const refererUrl = new URL(loginReferer) + refererUrl.searchParams.set('error', error) + res.redirect(refererUrl.href) + } else { + res.status(errorCode).send(reqI18n(req).messages.errors[error] || error) + } + } + + const email = samlResponse.extract.attributes.email || samlResponse.extract.attributes['urn:oid:0.9.2342.19200300.100.1.3'] + if (!email) { + console.error('Email attribute not fetched from SAML', provider.id, samlResponse.extract.attributes) + eventsLog.info('sd.auth.saml.fail', 'a user failed to authenticate with saml due to missing email', logContext) + throw new Error('Email attribute not fetched from OAuth') + } + debugSAML('Got user info from saml', provider.id, samlResponse.extract.attributes) + + const samlInfo = { ...samlResponse.extract.attributes, logged: new Date().toISOString() } + + // used to create a user and accept a member invitation at the same time + // if the invitation is not valid, better not to proceed with the user creation + let invit, invitOrga + if (invitToken) { + try { + invit = unshortenInvit(await session.verifyToken(invitToken)) + } catch (err: any) { + return returnError(err.name === 'TokenExpiredError' ? 'expiredInvitationToken' : 'invalidInvitationToken', 400) + } + invitOrga = await storage.getOrganization(invit.id) + if (!invitOrga) return returnError('orgaUnknown', 400) + if (invit.email !== email) return returnError('badProviderInvitEmail', 400) + } + + // check for user with same email + let user = await storage.getUserByEmail(email, site) + + if (!user && !invit && config.onlyCreateInvited && !provider.coreIdProvider) { + return returnError('onlyCreateInvited', 400) + } + if (!user && storage.readonly) { + return returnError('userUnknown', 403) + } + + // Re-create a user that was never validated.. first clean temporary user + if (user && user.emailConfirmed === false) { + if (user.organizations && invit) { + // This user was created empty from an invitation in 'alwaysAcceptInvitations' mode + } else { + eventsLog.info('sd.auth.saml.del-temp-user', `a temporary user was deleted in saml callback ${user.id}`, logContext) + await storage.deleteUser(user.id) + user = undefined + } + } + + if (!user) { + const newUser: UserWritable = { + email, + id: nanoid(), + emailConfirmed: true, + saml2: { + [provider.id]: samlInfo + }, + organizations: [] + } + if (site) newUser.host = site.host + if (invit && invitOrga) { + newUser.defaultOrg = invitOrga.id + newUser.ignorePersonalAccount = true + } + // TODO: also a dynamic mapping + if (samlInfo.firstName) newUser.firstName = samlInfo.firstName + if (samlInfo.lastName) newUser.lastName = samlInfo.lastName + debugSAML('Create user', newUser) + const redirectSite = await getRedirectSite(req, redirect) + user = await storage.createUser(newUser, undefined, redirectSite) + logContext.user = user + eventsLog.info('sd.auth.saml.create-user', `a user was created in saml callback ${user.id}`, logContext) + } else { + if (user.coreIdProvider && (user.coreIdProvider.type !== 'saml' || user.coreIdProvider.id !== provider.id)) { + return res.status(400).send('Utilisateur déjà lié à un autre fournisseur d\'identité principale') + } + debugSAML('Existing user authenticated', provider.id, user) + const patch = { saml2: { ...user.saml2, [provider.id]: samlInfo }, emailConfirmed: true } + // TODO: map more attributes ? lastName, firstName ? + await storage.patchUser(user.id, patch) + eventsLog.info('sd.auth.saml.update-user', `a user was updated in saml callback ${user.id}`, logContext) + } + + if (invit && invitOrga && !config.alwaysAcceptInvitation) { + const limits = await getOrgLimits(invitOrga) + if (limits.store_nb_members.limit > 0 && limits.store_nb_members.consumption >= limits.store_nb_members.limit) { + return res.status(400).send(reqI18n(req).messages.errors.maxNbMembers) + } + await storage.addMember(invitOrga, user, invit.role, invit.department) + eventsLog.info('sd.auth.saml.accept-invite', `a user accepted an invitation in saml callback ${user.id}`, logContext) + eventsQueue?.pushEvent({ + sender: { type: 'organization', id: invitOrga.id, name: invitOrga.name, role: 'admin', department: invit.department }, + topic: { key: 'simple-directory:invitation-accepted' }, + title: __all('notifications.acceptedInvitation', { name: user.name, email: user.email, orgName: invitOrga.name + (invit.department ? ' / ' + invit.department : '') }) + }) + await setNbMembersLimit(invitOrga.id) + } + + const payload = getTokenPayload(user) + if (adminMode) { + // TODO: also check that the user actually inputted the password on this redirect + if (payload.isAdmin) payload.adminMode = 1 + else { + eventsLog.alert('sd.auth.saml.not-admin', 'a unauthorized user tried to activate admin mode', logContext) + return returnError('adminModeOnly', 403) + } + } + const linkUrl = await prepareCallbackUrl(req, payload, redirect, invitOrga ? invitOrga.id : org) + debugSAML(`SAML based authentication of user ${user.name}`) + res.redirect(linkUrl.href) + + // TODO: Save name_id and session_index for logout ? + // Note: In practice these should be saved in the user session, not globally. + // name_id = saml_response.user.name_id; + // session_index = saml_response.user.session_index; +}) + +// logout not implemented +router.get('/saml2-logout', (req, res) => { + console.warn('SAML GET logout not yet implemented', req.headers, req.query) + res.send() +}) +router.post('/saml2-logout', (req, res) => { + console.warn('SAML POST logout not yet implemented', req.headers, req.query, req.body) + res.send() +}) + +// starts logout +/* router.get('/saml2/:providerId/logout', () => { + var options = { + name_id: name_id, + session_index: session_index + }; + + sp.create_logout_request_url(idp, options, function(err, logout_url) { + if (err != null) + return res.send(500); + res.redirect(logout_url);async + }); +}) */ diff --git a/api/src/auth/service.ts b/api/src/auth/service.ts new file mode 100644 index 00000000..98ad4f6e --- /dev/null +++ b/api/src/auth/service.ts @@ -0,0 +1,84 @@ +import useragent from 'useragent' +import config from '#config' +import type { Request } from 'express' +import type { Site, User, Organization, ServerSession } from '#types' +import { type OAuthProvider } from '../oauth/service.ts' +import storages from '#storages' +import { nanoid } from 'nanoid' + +type OAuthMemberInfo = { create: boolean, org?: Organization, readOnly: boolean, role: string } + +export const authCoreProviderMemberInfo = async (site: Site | undefined, provider: OAuthProvider, email: string, oauthInfo: any): Promise => { + let create = false + if ((provider.createMember as unknown as boolean) === true) { + // retro-compatibility for when createMember was a boolean + create = true + } else if (provider.createMember && provider.createMember.type === 'always') { + create = true + } else if (provider.createMember && provider.createMember.type === 'emailDomain' && email.endsWith(`@${provider.createMember.emailDomain}`)) { + create = true + } + + let org + if (create) { + const orgId = site ? site.owner.id : config.defaultOrg + if (!orgId) throw new Error('createMember option on auth provider requires defaultOf to be defined') + org = await storages.globalStorage.getOrganization(orgId) + if (!org) throw new Error(`Organization not found ${orgId}`) + } + + let role = 'user' + let readOnly = false + if (provider.coreIdProvider && provider.memberRole && provider.memberRole?.type !== 'none') { + readOnly = true + } + if (provider.memberRole?.type === 'static') { + role = provider.memberRole.role + } + if (provider.memberRole?.type === 'attribute') { + role = oauthInfo.data[provider.memberRole.attribute] + } + + return { create, org, readOnly, role } +} + +export const patchCoreOAuthUser = async (provider: OAuthProvider, user: User, oauthInfo: any, memberInfo: OAuthMemberInfo) => { + const providerType = (provider.type || 'oauth') as 'oidc' | 'oauth' + if (provider.coreIdProvider) { + oauthInfo.coreId = true + oauthInfo.user.coreIdProvider = { type: providerType, id: provider.id } + } + const existingOAuthInfo = user[providerType]?.[provider.id] as any + const patch: Partial = { + [providerType]: { ...user[providerType] }, + emailConfirmed: true + } + const userProviders = patch[providerType] = patch[providerType as 'oidc' | 'oauth'] ?? {} + userProviders[provider.id] = { ...existingOAuthInfo, ...oauthInfo } + if (provider.coreIdProvider) { + Object.assign(patch, oauthInfo.user) + if (!memberInfo.readOnly && memberInfo.org) { + if (memberInfo.create) { + patch.defaultOrg = memberInfo.org.id + patch.ignorePersonalAccount = true + await storages.globalStorage.addMember(memberInfo.org, user, memberInfo.role, null, memberInfo.readOnly) + } else { + await storages.globalStorage.removeMember(memberInfo.org.id, user.id) + } + } + } else { + if (oauthInfo.user.firstName && !user.firstName) patch.firstName = oauthInfo.user.firstName + if (oauthInfo.user.lastName && !user.lastName) patch.lastName = oauthInfo.user.lastName + } + return await storages.globalStorage.patchUser(user.id, patch) +} + +export const initServerSession = (req: Request): ServerSession => { + const agentHeader = req.get('user-agent') + const deviceName = agentHeader ? useragent.parse(agentHeader).toString() : 'appareil inconnu' + return { + id: nanoid(), + createdAt: new Date().toISOString(), + deviceName + } +} diff --git a/api/src/avatars/router.ts b/api/src/avatars/router.ts new file mode 100644 index 00000000..7ddc05ab --- /dev/null +++ b/api/src/avatars/router.ts @@ -0,0 +1,116 @@ +import config from '#config' +import { Router, type RequestHandler } from 'express' +import { resolve } from 'node:path' +import { type Account, assertAccountRole, httpError, reqSession } from '@data-fair/lib-express' +import gm from 'gm' +import colors from 'material-colors' +import initialsModule from 'initials' +import capitalize from 'capitalize' +import multer from 'multer' +import { getAvatar, setAvatar } from './service.ts' +import storages from '#storages' + +const colorCodes = Object.values(colors).filter(c => (c as any)['600']).map(c => (c as any)['600']) as string[] + +const router = Router() +export default router + +const randomColor = () => { + return colorCodes[Math.floor(Math.random() * colorCodes.length)] +} + +const getInitials = (name: string) => { + return initialsModule(capitalize.words(name, true).replace('La ', 'la ').replace('Le ', 'le ').replace('De ', 'de ').replace('D\'', 'd\'').replace('L\'', 'l\'')).slice(0, 3) +} + +// inspired by https://github.com/thatisuday/npm-no-avatar/blob/master/lib/make.js +// const font = path.resolve('./node_modules/no-avatar/lib/font.ttf') +const font = resolve(import.meta.dirname, '../../resources/nunito-ttf/Nunito-ExtraBold.ttf') +const makeAvatar = async (text: string, color: string) => { + return new Promise((resolve, reject) => { + gm(100, 100, color) + .fill('#FFFFFF') + .font(font) + .drawText(0, 0, text, 'Center') + .fontSize(text.length === 3 ? 37 : 47) + .toBuffer('PNG', function (err, buffer) { + if (err) reject(err) + else resolve(buffer) + }) + }) +} + +const readAvatar: RequestHandler = async (req, res, next) => { + if (!['user', 'organization'].includes(req.params.type)) { + return res.status(400).send('Owner type must be "user" or "organization"') + } + const owner = req.params as unknown as Account + let avatar = await getAvatar(owner) + if (!avatar || avatar.initials) { + let name + if (req.params.type === 'organization') { + const org = await storages.globalStorage.getOrganization(req.params.id) + if (!org) throw httpError(404) + name = org.name + if (req.params.department) { + const dep = org.departments?.find(d => d.id === req.params.department) + if (!dep) throw httpError(404) + name = dep.name + } + } else { + if (req.params.id === '_superadmin') { + name = 'Super Admin' + } else { + const user = await storages.globalStorage.getUser(req.params.id) + if (!user) throw httpError(404) + name = user.name + if (user.oauth) { + const oauthWithAvatar = Object.values(user.oauth).find(oauth => !!(oauth as any).avatarUrl) + if (oauthWithAvatar) return res.redirect((oauthWithAvatar as any).avatarUrl) + } + if (user.oidc) { + const oidcWithAvatar = Object.values(user.oidc).find(oauth => !!(oauth as any).avatarUrl) + if (oidcWithAvatar) return res.redirect((oidcWithAvatar as any).avatarUrl) + } + } + } + + const initials = getInitials(name) + + if (!avatar) { + // create a initials based avatar + const color = randomColor() + const buffer = await makeAvatar(initials, color) + avatar = { initials, color, buffer, owner } + await setAvatar(avatar) + } else if (avatar.initials !== initials) { + // this initials based avatar needs to be updated + avatar.buffer = await makeAvatar(initials, avatar.color ?? randomColor()) + await setAvatar(avatar) + } + } + + res.set('Content-Type', 'image/png') + res.send(avatar.buffer) +} +router.get('/:type/:id/avatar.png', readAvatar) +router.get('/:type/:id/:department/avatar.png', readAvatar) + +const upload = multer({ + storage: multer.memoryStorage(), + limits: { fileSize: 200000, files: 1, fields: 0 } +}) + +const isAdmin: RequestHandler = (req, res, next) => { + assertAccountRole(reqSession(req), req.params as unknown as Account, 'admin', { acceptDepAsRoot: config.depAdminIsOrgAdmin }) + return next() +} + +const writeAvatar: RequestHandler = async (req, res, next) => { + if (!req.file) throw httpError(400) + await setAvatar({ owner: req.params as unknown as Account, buffer: req.file.buffer }) + res.status(201).send() +} + +router.post('/:type/:id/avatar.png', isAdmin, upload.single('avatar'), writeAvatar) +router.post('/:type/:id/:department/avatar.png', isAdmin, upload.single('avatar'), writeAvatar) diff --git a/api/src/avatars/service.ts b/api/src/avatars/service.ts new file mode 100644 index 00000000..33a20631 --- /dev/null +++ b/api/src/avatars/service.ts @@ -0,0 +1,18 @@ +import { type Account } from '@data-fair/lib-express' +import mongo from '#mongo' + +export type Avatar = { owner: Account, initials?: string, color?: string, buffer: BinaryData } + +export async function setAvatar (avatar: Avatar) { + const filter: any = { 'owner.type': avatar.owner.type, 'owner.id': avatar.owner.id } + if (avatar.owner.department) filter['owner.department'] = avatar.owner.department + await mongo.avatars.replaceOne(filter, avatar, { upsert: true }) +} + +export async function getAvatar (owner: Account) { + const filter: any = { 'owner.type': owner.type, 'owner.id': owner.id } + if (owner.department) filter['owner.department'] = owner.department + const avatar = await mongo.avatars.findOne(filter) + if (avatar && avatar.buffer) avatar.buffer = (avatar.buffer as any).buffer + return avatar as Avatar +} diff --git a/api/src/config.ts b/api/src/config.ts new file mode 100644 index 00000000..d277f7a5 --- /dev/null +++ b/api/src/config.ts @@ -0,0 +1,38 @@ +import { type User } from '#types' +import type { ApiConfig } from '../config/type/index.ts' +import { assertValid } from '../config/type/index.ts' +import config from 'config' +import ms from 'ms' + +export type { ApiConfig } from '../config/type/index.ts' + +// manage retro-compatibility with older env vars +const envAliases = [ + ['STORAGE_MONGO_URL', 'MONGO_URL'], + ['STORAGE_MONGO_CLIENT_OPTIONS', 'MONGO_OPTIONS'] +] +for (const envAlias of envAliases) { + if (process.env[envAlias[0]]) process.env[envAlias[1]] = process.env[envAlias[0]] +} + +// we reload the config instead of using the singleton from the config module for testing purposes +// @ts-ignore +const apiConfig = process.env.NODE_ENV === 'test' ? config.util.loadFileConfigs(process.env.NODE_CONFIG_DIR, { skipConfigSources: true }) : config + +assertValid(apiConfig, { lang: 'en', name: 'config', internal: true }) + +export default apiConfig as ApiConfig + +export const superadmin: User = { + created: { date: new Date().toISOString() }, + updated: { date: new Date().toISOString() }, + id: '_superadmin', + name: 'Super Admin', + email: apiConfig.adminCredentials?.email ?? '', + organizations: [] +} + +export const jwtDurations = { + idToken: ms(apiConfig.jwtDurations.idToken) / 1000, + exchangeToken: ms(apiConfig.jwtDurations.exchangeToken) / 1000 +} diff --git a/api/src/events-queue.ts b/api/src/events-queue.ts new file mode 100644 index 00000000..eb157d00 --- /dev/null +++ b/api/src/events-queue.ts @@ -0,0 +1,22 @@ +import { EventsQueue } from '@data-fair/lib-node/events-queue.js' +import config from '#config' +import Debug from 'debug' + +const debug = Debug('events-queue') + +const eventsQueue: EventsQueue | undefined = config.secretKeys.events && config.privateEventsUrl ? new EventsQueue() : undefined + +export default eventsQueue + +export async function start () { + if (eventsQueue && config.secretKeys.events && config.privateEventsUrl) { + debug('start events queue', config.privateEventsUrl) + await eventsQueue.start({ eventsUrl: config.privateEventsUrl, eventsSecret: config.secretKeys.events }) + } else { + debug('events queue not started because of missing config') + } +} + +export async function stop () { + eventsQueue?.stop() +} diff --git a/api/src/invitations/router.ts b/api/src/invitations/router.ts new file mode 100644 index 00000000..10c653b6 --- /dev/null +++ b/api/src/invitations/router.ts @@ -0,0 +1,280 @@ +import { type UserWritable, type Invitation, type ActionPayload, type ShortenedInvitation } from '#types' +import { Router } from 'express' +import config from '#config' +import { assertAccountRole, reqUser, reqSession, reqSiteUrl, session, httpError, reqUserAuthenticated } from '@data-fair/lib-express' +import eventsLog, { type EventLogContext } from '@data-fair/lib-express/events-log.js' +import eventsQueue from '#events-queue' +import { nanoid } from 'nanoid' +import dayjs from 'dayjs' +import { reqI18n, __all, __ } from '#i18n' +import storages from '#storages' +import { getOrgLimits, setNbMembersLimit, reqSite, getSiteByUrl, shortenInvit, unshortenInvit, sendMail, decodeToken, signToken, postUserIdentityWebhook } from '#services' +import emailValidator from 'email-validator' +import Debug from 'debug' + +const debug = Debug('invitations') + +const router = Router() +export default router + +// Invitation for a user to join an organization from an admin of this organization +router.post('', async (req, res, next) => { + const user = reqUserAuthenticated(req) + + const { query, body } = (await import('#doc/invitations/post-req/index.ts')).returnValid(req, { name: 'req' }) + + const logContext: EventLogContext = { req } + + if (!emailValidator.validate(body.email)) return res.status(400).send(reqI18n(req).messages.errors.badEmail) + debug('new invitation', body) + const storage = storages.globalStorage + const invitation = body + assertAccountRole(reqSession(req), { type: 'organization', id: invitation.id, department: invitation.department }, 'admin', { acceptDepAsRoot: config.depAdminIsOrgAdmin }) + + let invitSite = await reqSite(req) + let invitPublicBaseUrl = reqSiteUrl(req) + '/simple-directory' + if (invitation.redirect) { + const host = new URL(invitation.redirect).host + invitSite = (await getSiteByUrl(invitation.redirect)) ?? undefined + if (invitSite) { + const url = new URL(config.publicUrl) + url.host = host + invitPublicBaseUrl = url.protocol + '//' + invitSite.host + (invitSite.path ?? '') + '/simple-directory' + } + } + + const orga = await storage.getOrganization(invitation.id) + if (!orga) return res.status(404).send('unknown organization') + + const limits = await getOrgLimits(orga) + if (limits.store_nb_members.limit > 0 && limits.store_nb_members.consumption >= limits.store_nb_members.limit) { + eventsLog.info('sd.invite.limit', `limit error for /invitations route with org ${body.id}`, logContext) + return res.status(429).send('L\'organisation contient déjà le nombre maximal de membres autorisé par ses quotas.') + } + + let dep + if (invitation.department) { + dep = orga.departments && orga.departments.find(d => d.id === invitation.department) + if (!dep) return res.status(404).send('unknown department') + } + logContext.account = { type: 'organization', id: orga.id, name: orga.name, department: invitation.department, departmentName: dep?.name } + + const token = await signToken(shortenInvit(invitation), config.jwtDurations.invitationToken) + + if (config.alwaysAcceptInvitation) { + eventsLog.info('sd.invite.user-creation', `invitation sent in always accept mode immediately creates a user or adds it as member ${invitation.email}, ${orga.id} ${orga.name} ${invitation.role} ${invitation.department}`, logContext) + // in 'always accept invitation' mode the user is not sent an email to accept the invitation + // he is simple added to the list of members and created if needed + const existingUser = await storage.getUserByEmail(invitation.email, invitSite) + if (existingUser && existingUser.emailConfirmed) { + debug('in alwaysAcceptInvitation and the user already exists, immediately add it as member', invitation.email) + await storage.addMember(orga, existingUser, invitation.role, invitation.department) + await setNbMembersLimit(orga.id) + eventsQueue?.pushEvent({ + sender: { type: 'organization', id: orga.id, name: orga.name, role: 'admin', department: invitation.department }, + topic: { key: 'simple-directory:invitation-sent' }, + title: __all('notifications.sentInvitation', { email: body.email, orgName: orga.name + (dep ? ' / ' + (dep.name || dep.id) : '') }) + }) + } else { + const newUserDraft: UserWritable = { + email: invitation.email, + id: existingUser ? existingUser.id : nanoid(), + organizations: existingUser ? existingUser.organizations : [], + emailConfirmed: false, + defaultOrg: invitation.id, + ignorePersonalAccount: true + } + if (invitSite) newUserDraft.host = invitSite.host + if (invitation.department) newUserDraft.defaultDep = invitation.department + debug('in alwaysAcceptInvitation and the user does not exist, create it', newUserDraft) + const reboundRedirect = new URL(invitation.redirect || config.invitationRedirect || `${reqSiteUrl(req) + '/simple-directory'}/invitation`) + const newUser = await storage.createUser(newUserDraft, user) + await storage.addMember(orga, newUser, invitation.role, invitation.department) + await setNbMembersLimit(orga.id) + const linkUrl = new URL(`${reqSiteUrl(req) + '/simple-directory'}/login`) + linkUrl.searchParams.set('step', 'createUser') + linkUrl.searchParams.set('invit_token', token) + linkUrl.searchParams.set('redirect', reboundRedirect.href) + debug('send email with link to createUser step', linkUrl.href) + const params = { + link: linkUrl.href, + organization: orga.name + (dep ? ' / ' + (dep.name || dep.id) : '') + } + // send the mail either if the user does not exist or it was created more that 24 hours ago + if (!query.skip_mail && (!existingUser || query.force_mail || (existingUser.created && dayjs().diff(dayjs(existingUser.created.date), 'day', true) > 1))) { + await sendMail('invitation', reqI18n(req).messages, body.email, params) + eventsLog.info('sd.invite.sent', `invitation sent ${invitation.email}, ${orga.id} ${orga.name} ${invitation.role} ${invitation.department}`, logContext) + } + + const event = { + sender: { type: 'organization' as const, id: orga.id, name: orga.name, role: 'admin', department: invitation.department }, + topic: { key: 'simple-directory:add-member' }, + title: __all('notifications.addMember', { name: newUser.name, email: newUser.email, orgName: orga.name + (dep ? ' / ' + (dep.name || dep.id) : '') }) + } + // send notif to all admins subscribed to the topic + eventsQueue?.pushEvent(event) + // send same notif to user himself + eventsQueue?.pushNotification({ + sender: event.sender, + topic: event.topic, + title: __(req, 'notifications.addMember', { name: newUser.name, email: newUser.email, orgName: orga.name + (dep ? ' / ' + (dep.name || dep.id) : '') }), + recipient: { id: newUser.id, name: newUser.name } + }) + + if (user.adminMode || user.asAdmin) { + return res.send(params) + } + } + } else { + const linkUrl = new URL(invitPublicBaseUrl + '/api/invitations/_accept') + linkUrl.searchParams.set('invit_token', token) + const params = { + link: linkUrl.href, + organization: orga.name + (dep ? ' / ' + (dep.name || dep.id) : '') + } + if (!query.skip_mail) { + await sendMail('invitation', reqI18n(req).messages, body.email, params) + eventsLog.info('sd.invite.sent', `invitation sent ${invitation.email}, ${orga.id} ${orga.name} ${invitation.role} ${invitation.department}`, logContext) + } + + eventsQueue?.pushEvent({ + sender: { type: 'organization', id: orga.id, name: orga.name, role: 'admin', department: invitation.department }, + topic: { key: 'simple-directory:invitation-sent' }, + title: __all('notifications.sentInvitation', { email: body.email, orgName: orga.name + (dep ? ' / ' + (dep.name || dep.id) : '') }) + }) + + if (user.adminMode || user.asAdmin) { + return res.send(params) + } + } + + res.status(201).send() +}) + +router.get('/_accept', async (req, res, next) => { + const loggedUser = reqUser(req) + const logContext: EventLogContext = { req } + if (typeof req.query.invit_token !== 'string') throw httpError(400) + + let invit: Invitation + let verified + const errorUrl = new URL(`${reqSiteUrl(req) + '/simple-directory'}/login`) + try { + invit = unshortenInvit(await session.verifyToken(req.query.invit_token)) + verified = true + } catch (err: any) { + if (err.name !== 'TokenExpiredError') { + debug('invalid invitation', err) + errorUrl.searchParams.set('error', 'invalidInvitationToken') + return res.redirect(errorUrl.href) + } else { + debug('old invalid invitation accepted only to present good redirect to the user') + } + // if the token was once valid, but deprecated we accept it partially + // meaning that we will not perform writes based on it + // but we accept to check the user's existence and create the best redirect for him + invit = unshortenInvit(decodeToken(req.query.invit_token) as ShortenedInvitation) + verified = false + } + debug('accept invitation', invit, verified) + const storage = storages.globalStorage + + const existingUser = await storage.getUserByEmail(invit.email, await reqSite(req)) + logContext.user = existingUser + if (!existingUser && storage.readonly) { + errorUrl.searchParams.set('error', 'userUnknown') + return res.redirect(errorUrl.href) + } + + const orga = await storage.getOrganization(invit.id) + if (!orga) { + errorUrl.searchParams.set('error', 'orgaUnknown') + return res.redirect(errorUrl.href) + } + logContext.account = { type: 'organization', id: orga.id, name: orga.name, department: invit.department } + + let redirectUrl = new URL(invit.redirect || config.invitationRedirect || `${reqSiteUrl(req) + '/simple-directory'}/invitation`) + redirectUrl.searchParams.set('email', invit.email) + redirectUrl.searchParams.set('id_token_org', invit.id) + if (invit.department) redirectUrl.searchParams.set('id_token_dep', invit.department) + + // case where the invitation was already accepted, but we still want the user to proceed + if (existingUser && existingUser.organizations && existingUser.organizations.find(o => o.id === invit.id && (o.department || null) === (invit.department || null))) { + debug('invitation was already accepted, redirect', redirectUrl.href) + // missing password, invitation must have been accepted without completing account creation + if (!storage.getPassword) { + throw new Error('missing password verification implementation') + } else { + if (!await storage.getPassword(invit.email) && !config.passwordless) { + const payload: ActionPayload = { id: existingUser.id, email: existingUser.email, action: 'changePassword' } + const token = await signToken(payload, config.jwtDurations.initialToken) + const reboundRedirect = redirectUrl.href + redirectUrl = new URL(`${reqSiteUrl(req) + '/simple-directory'}/login`) + redirectUrl.searchParams.set('step', 'changePassword') + redirectUrl.searchParams.set('email', invit.email) + redirectUrl.searchParams.set('id_token_org', invit.id) + if (invit.department) redirectUrl.searchParams.set('id_token_dep', invit.department) + redirectUrl.searchParams.set('action_token', token) + redirectUrl.searchParams.set('redirect', reboundRedirect) + debug('redirect to changePassword step', redirectUrl.href) + return res.redirect(redirectUrl.href) + } + } + if (!loggedUser || loggedUser.email !== invit.email) { + const reboundRedirect = redirectUrl.href + redirectUrl = new URL(`${reqSiteUrl(req) + '/simple-directory'}/login`) + redirectUrl.searchParams.set('email', invit.email) + redirectUrl.searchParams.set('id_token_org', invit.id) + if (invit.department) redirectUrl.searchParams.set('id_token_dep', invit.department) + redirectUrl.searchParams.set('redirect', reboundRedirect) + debug('redirect to login', redirectUrl.href) + return res.redirect(redirectUrl.href) + } + return res.redirect(redirectUrl.href) + } + if (!verified) { + errorUrl.searchParams.set('error', 'expiredInvitationToken') + return res.redirect(errorUrl.href) + } + + const limits = await getOrgLimits(orga) + if (limits.store_nb_members.limit > 0 && limits.store_nb_members.consumption >= limits.store_nb_members.limit) { + errorUrl.searchParams.set('error', 'maxNbMembers') + return res.redirect(errorUrl.href) + } + + if (!existingUser) { + const reboundRedirect = redirectUrl.href + redirectUrl = new URL(`${reqSiteUrl(req) + '/simple-directory'}/login`) + redirectUrl.searchParams.set('step', 'createUser') + redirectUrl.searchParams.set('invit_token', req.query.invit_token) + redirectUrl.searchParams.set('redirect', reboundRedirect) + debug('redirect to createUser step', redirectUrl.href) + return res.redirect(redirectUrl.href) + } + + await storage.addMember(orga, existingUser, invit.role, invit.department) + + eventsLog.info('sd.invite.accepted', `invitation accepted ${invit.email}, ${orga.id} ${orga.name} ${invit.department} ${invit.role}`, logContext) + + const event = { + sender: { type: 'organization' as const, id: orga.id, name: orga.name, role: 'admin', department: invit.department }, + topic: { key: 'simple-directory:invitation-accepted' }, + title: __all('notifications.acceptedInvitation', { name: existingUser.name, email: existingUser.email, orgName: orga.name + (invit.department ? ' / ' + invit.department : '') }) + } + // send notif to all admins subscribed to the topic + eventsQueue?.pushEvent(event) + // send same notif to user himself + eventsQueue?.pushNotification({ + sender: event.sender, + topic: event.topic, + title: __(req, 'notifications.acceptedInvitation', { name: existingUser.name, email: existingUser.email, orgName: orga.name + (invit.department ? ' / ' + invit.department : '') }), + recipient: { id: existingUser.id, name: existingUser.name } + }) + + postUserIdentityWebhook(await storage.getUser(existingUser.id)) + + await setNbMembersLimit(orga.id) + + res.redirect(redirectUrl.href) +}) diff --git a/api/src/invitations/service.ts b/api/src/invitations/service.ts new file mode 100644 index 00000000..3b753e76 --- /dev/null +++ b/api/src/invitations/service.ts @@ -0,0 +1,36 @@ +import { type ShortenedInvitation, type Invitation } from '#types' + +const mapping = [ + ['n', 'name'], + ['e', 'email'], + ['r', 'role'], + ['d', 'department'], + ['dn', 'departmentName'], + ['rd', 'redirect'] +] + +// prepare a smaller version of the invitation object to minimize token size +export const shortenInvit = (invit: Invitation) => { + const shortInvit: any = { ...invit } + Object.entries(invit).forEach(([key, value]) => { + if (value === null) delete shortInvit[key] + }) + for (const [shortKey, longKey] of mapping) { + if (longKey in shortInvit) { + shortInvit[shortKey] = shortInvit[longKey] + delete shortInvit[longKey] + } + } + return shortInvit as ShortenedInvitation +} + +export const unshortenInvit = (shortInvit: ShortenedInvitation) => { + const invit: any = { ...shortInvit } + for (const [shortKey, longKey] of mapping) { + if (shortKey in invit) { + invit[longKey] = invit[shortKey] + delete invit[shortKey] + } + } + return invit as Invitation +} diff --git a/api/src/limits/router.ts b/api/src/limits/router.ts new file mode 100644 index 00000000..38fd3315 --- /dev/null +++ b/api/src/limits/router.ts @@ -0,0 +1,70 @@ +import config from '#config' +import { Router, type RequestHandler } from 'express' +import { reqUser, reqSessionAuthenticated, assertAccountRole, httpError } from '@data-fair/lib-express' +import * as limitsSchema from '#types/limits/index.ts' +import { getOrgLimits } from '#services' +import mongo from '#mongo' +import storages from '#storages' + +const router = Router() +export default router + +const isSuperAdmin: RequestHandler = (req, res, next) => { + if (reqUser(req)?.adminMode) return next() + if (req.query.key && req.query.key === config.secretKeys.limits) return next() + res.status(401).send() +} + +const isUser: RequestHandler = (req, res, next) => { + if (req.query.key && req.query.key === config.secretKeys.limits) return next() + const session = reqSessionAuthenticated(req) + assertAccountRole(session, { type: 'user', id: req.params.id }, 'admin') + next() +} + +const isAccountMember: RequestHandler = (req, res, next) => { + if (req.query.key && req.query.key === config.secretKeys.limits) return next() + const session = reqSessionAuthenticated(req) + assertAccountRole(session, { type: 'organization', id: req.params.id }, 'admin', { acceptDepAsRoot: true }) + next() +} + +// Endpoint for customers service to create/update limits +router.post('/:type/:id', isSuperAdmin, async (req, res, next) => { + req.body.type = req.params.type + req.body.id = req.params.id + const limits = limitsSchema.returnValid(req.body) + // TODO: only accept limits not consumption + await mongo.limits + .replaceOne({ type: req.params.type, id: req.params.id }, limits, { upsert: true }) + res.send(limits) +}) + +// A user can get limits information for his org +router.get('/organization/:id', isAccountMember, async (req, res, next) => { + const org = await storages.globalStorage.getOrganization(req.params.id) + if (!org) throw httpError(404) + res.send(await getOrgLimits(org)) +}) +router.get('/user/:id', isUser, async (req, res, next) => { + const user = await storages.globalStorage.getUser(req.params.id) + if (!user) throw httpError(404) + res.send({ + type: 'user', + id: user.id, + name: user.name, + lastUpdate: new Date().toISOString(), + store_nb_members: { limit: 1, consumption: 1 } + }) +}) + +router.get('/', isSuperAdmin, async (req, res, next) => { + const filter = { type: req.query.type, id: req.query.id } + const results = await mongo.limits + .find(filter) + .sort({ lastUpdate: -1 }) + .project({ _id: 0 }) + .limit(10000) + .toArray() + res.send({ results, count: results.length }) +}) diff --git a/api/src/limits/service.ts b/api/src/limits/service.ts new file mode 100644 index 00000000..3eac91ee --- /dev/null +++ b/api/src/limits/service.ts @@ -0,0 +1,33 @@ +import type { Organization, Limits } from '#types' +import config from '#config' +import mongo from '#mongo' + +export const getOrgLimits = async (org: Organization) => { + let limit: Limits | null = await mongo.limits.findOne({ type: 'organization', id: org.id }, { projection: { _id: 0 } }) + if (!limit || !limit.store_nb_members) { + limit = { + type: 'organization', + id: org.id, + name: org.name, + lastUpdate: new Date().toISOString(), + store_nb_members: { limit: config.quotas.defaultMaxNbMembers, consumption: await getNbMembers(org.id) } + } + await mongo.limits.replaceOne({ type: 'organization', id: org.id }, limit, { upsert: true }) + } + return limit +} + +const getNbMembers = async (orgId: string) => { + return mongo.users.countDocuments({ 'organizations.id': orgId, plannedDeletion: { $exists: false } }) +} + +export const setNbMembersLimit = async (orgId: string) => { + const nbMembers = await getNbMembers(orgId) + await mongo.limits + .updateOne({ type: 'organization', id: orgId }, { $set: { 'store_nb_members.consumption': nbMembers } }) +} + +/* export const updateName = async (identity: Account) => { + await mongo.limits + .updateMany({ type: identity.type, id: identity.id }, { $set: { name: identity.name } }) +} */ diff --git a/server/mails/mail-nobutton.mjml b/api/src/mails/mail-nobutton.mjml similarity index 100% rename from server/mails/mail-nobutton.mjml rename to api/src/mails/mail-nobutton.mjml diff --git a/server/mails/mail.mjml b/api/src/mails/mail.mjml similarity index 100% rename from server/mails/mail.mjml rename to api/src/mails/mail.mjml diff --git a/server/routers/mails.js b/api/src/mails/router.ts similarity index 53% rename from server/routers/mails.js rename to api/src/mails/router.ts index c2425044..663e613a 100644 --- a/server/routers/mails.js +++ b/api/src/mails/router.ts @@ -1,33 +1,36 @@ -const config = require('config') -const express = require('express') -const emailValidator = require('email-validator') -const { RateLimiterMongo, RateLimiterMemory } = require('rate-limiter-flexible') -const requestIp = require('request-ip') -const asyncWrap = require('../utils/async-wrap') -const tokens = require('../utils/tokens') +import config from '#config' +import { Router } from 'express' +import { reqSiteUrl, reqIp, reqUser, session, httpError } from '@data-fair/lib-express' +import { type SendMailOptions } from 'nodemailer' +import storages from '#storages' +import mongo from '#mongo' +import { RateLimiterMongo } from 'rate-limiter-flexible' +import emailValidator from 'email-validator' +import { reqI18n } from '#i18n' +import mailsTransport from './transport.ts' +import type { FindMembersParams } from '../storages/interface.ts' -const router = module.exports = express.Router() +const router = Router() +export default router -// Used by the users' directory to notify name updates -router.post('/', asyncWrap(async (req, res) => { +router.post('/', async (req, res) => { const key = req.query.key if (!config.secretKeys.sendMails || config.secretKeys.sendMails !== key) { - return res.status(403).send('Bad secret in "key" parameter') + throw httpError(403, 'Bad secret in "key" parameter') } - const storage = req.app.get('storage') - const transport = req.app.get('mailTransport') + const storage = storages.globalStorage const results = [] for (const t of req.body.to) { // separte mail per recipient, prevents showing email addresses from other users // but a single mail per orgs/members, showing emails is not a problem in this case - const to = new Set([]) + const to = new Set([]) if (t.type === 'user') { - const user = (await storage.getUser({ id: t.id })) + const user = (await storage.getUser(t.id)) if (user) to.add(user.email) else console.error('Trying to send an email to a user that doesn\'t exist anymore') } if (t.type === 'organization') { - const membersParams = { size: 10000, skip: 0 } + const membersParams: FindMembersParams = { size: 10000, skip: 0 } if (t.role) membersParams.roles = [t.role] if (t.department && t.department !== '*') membersParams.departments = [t.department] if (!t.department) membersParams.departments = ['-'] @@ -35,7 +38,7 @@ router.post('/', asyncWrap(async (req, res) => { members.results.forEach(member => to.add(member.email)) } - const mail = { + const mail: SendMailOptions = { from: config.mails.from, to: [...to].join(', '), subject: req.body.subject, @@ -45,48 +48,30 @@ router.post('/', asyncWrap(async (req, res) => { if (req.body.html) { mail.html = req.body.html } - results.push(await transport.sendMailAsync(mail)) + results.push(await mailsTransport.sendMail(mail)) } res.send(results) -})) +}) // protect contact route with rate limiting to prevent spam -let _limiter -const limiterOptions = { - keyPrefix: 'sd-rate-limiter-contact', - points: 1, - duration: 60 -} -const limiter = (req) => { - if (config.storage.type === 'mongo') { - _limiter = _limiter || new RateLimiterMongo({ - storeClient: req.app.get('storage').client, - dbName: req.app.get('storage').db.databaseName, - ...limiterOptions - }) - } else { - _limiter = _limiter || new RateLimiterMemory(limiterOptions) - } - return _limiter -} - -router.post('/contact', asyncWrap(async (req, res) => { - if (!req.user && !config.anonymousContactForm) return res.status(401).send() +let _contactLimiter: RateLimiterMongo | undefined +router.post('/contact', async (req, res) => { + if (!reqUser(req) && !config.anonymousContactForm) return res.status(401).send() - if (!emailValidator.validate(req.body.from)) return res.status(400).send(req.messages.errors.badEmail) + if (!emailValidator.validate(req.body.from)) return res.status(400).send(reqI18n(req).messages.errors.badEmail) - if (!req.user) { + if (!reqUser(req)) { if (!req.body.token) return res.status(401).send() // 1rst level of anti-spam prevention, no cross origin requests on this route - if (req.headers.origin && !req.publicBaseUrl.startsWith(req.headers.origin)) { + if (req.headers.origin && !reqSiteUrl(req).startsWith(req.headers.origin)) { return res.status(405).send('Appel depuis un domaine extérieur non supporté') } try { // 2nd level of anti-spam protection, validate that the user was present on the page for a few seconds before sending - await tokens.verify(req.app.get('keys'), req.body.token) - } catch (err) { + await session.verifyToken(req.body.token) + } catch (err: any) { if (err.name === 'NotBeforeError') { return res.status(429).send('Message refusé, l\'activité ressemble à celle d\'un robot spammeur.') } else { @@ -96,19 +81,31 @@ router.post('/contact', asyncWrap(async (req, res) => { } try { // 3rd level of anti-spam protection, simple rate limiting based on ip - await limiter(req).consume(requestIp.getClientIp(req), 1) + _contactLimiter = _contactLimiter ?? new RateLimiterMongo({ + storeClient: mongo.client, + dbName: mongo.db.databaseName, + keyPrefix: 'sd-rate-limiter-contact', + points: 1, + duration: 60 + }) + await _contactLimiter.consume(reqIp(req), 1) } catch (err) { - console.error('Rate limit error for /mails/contact route', requestIp.getClientIp(req), req.body.email, err) + console.error('Rate limit error for /mails/contact route', reqIp(req), req.body.email, err) return res.status(429).send('Trop de messages dans un bref interval. Veuillez patienter avant d\'essayer de nouveau.') } - const mail = { - from: req.body.from, + const text = `Message transmis par le formulaire de contact de ${reqSiteUrl(req)} + Adresse mail renseignée par l'utilisateur : ${req.body.from} + + ${req.body.text}` + + const mail: SendMailOptions = { + from: config.mails.from, to: config.contact, subject: req.body.subject, - text: req.body.text + text } - await req.app.get('mailTransport').sendMailAsync(mail) + await mailsTransport.sendMail(mail) res.send(req.body) -})) +}) diff --git a/api/src/mails/service.ts b/api/src/mails/service.ts new file mode 100644 index 00000000..380260ec --- /dev/null +++ b/api/src/mails/service.ts @@ -0,0 +1,58 @@ +import mjml2html from 'mjml' +import microTemplate from '@data-fair/lib-utils/micro-template.js' +import { join } from 'path' +import { readFileSync, existsSync } from 'node:fs' +import config from '#config' +import { flatten } from 'flat' +import EventEmitter from 'node:events' +import mailsTransport from './transport.ts' + +export const events = new EventEmitter() + +const newTplPath = join(import.meta.dirname, 'mail.mjml') +let mjmlTemplate = readFileSync(newTplPath, 'utf8') +const oldTplPath = '/webapp/server/mails/mail.mjml' +if (existsSync(oldTplPath)) { + console.error(`WARNING: found a mail template at deprecated path ${oldTplPath}, please use new path ${newTplPath}`) + mjmlTemplate = readFileSync(oldTplPath, 'utf8') +} + +const newNoButtonTplPath = join(import.meta.dirname, 'mail-nobutton.mjml') +let mjmlNoButtonTemplate = readFileSync(newNoButtonTplPath, 'utf8') +const oldNoButtonTplPath = '/webapp/server/mails/mail-nobutton.mjml' +if (existsSync(oldNoButtonTplPath)) { + console.error(`WARNING: found a mail template at deprecated path ${oldNoButtonTplPath}, please use new path ${newNoButtonTplPath}`) + mjmlNoButtonTemplate = readFileSync(oldNoButtonTplPath, 'utf8') +} + +export const sendMail = async (key: string, messages: any, to: string, params: Record) => { + params = { + ...params, + ...flatten({ theme: config.theme }), + contact: config.contact, + logo: config.theme.logo || 'https://cdn.rawgit.com/koumoul-dev/simple-directory/v0.12.3/public/assets/logo-150x150.png', + ...config.mails.extraParams // override with extra params from config, default to {} + } + if (params.link) { + const linkUrl = new URL(params.link) + params.host = linkUrl.host + params.origin = linkUrl.origin + } + Object.keys(messages.mails[key]).forEach(k => { + params[k] = microTemplate(messages.mails[key][k], params) + }) + events.emit('send', params) + const mjmlRes = mjml2html(microTemplate(params.htmlButton ? mjmlTemplate : mjmlNoButtonTemplate, params)) + if (mjmlRes.errors && mjmlRes.errors.length) { + console.error('Error while preparing mail body', mjmlRes.errors) + throw new Error('Error while preparing mail body') + } + + await mailsTransport.sendMail({ + from: config.mails.from, + to, + subject: microTemplate(messages.mails[key].subject, params), + text: microTemplate(messages.mails[key].text, params), + html: mjmlRes.html + }) +} diff --git a/api/src/mails/transport.ts b/api/src/mails/transport.ts new file mode 100644 index 00000000..d21dc1e2 --- /dev/null +++ b/api/src/mails/transport.ts @@ -0,0 +1,34 @@ +import { promisify } from 'node:util' +import nodemailer, { type SendMailOptions, type Transporter } from 'nodemailer' +import config from '#config' +import { internalError } from '@data-fair/lib-node/observer.js' + +class MailsTransport { + private transport: Transporter | undefined + private sendMailAsync: ((opts: SendMailOptions) => Promise) | undefined + + get sendMail () { + if (!this.sendMailAsync) throw new Error('mails transport was not initialized') + return this.sendMailAsync + } + + async start () { + this.transport = nodemailer.createTransport(config.mails.transport) + this.sendMailAsync = promisify(this.transport.sendMail).bind(this.transport) + // we check the connection but in a none blocking way, most of SD services can work even + // if the mails service is down + const verifyAsync = promisify(this.transport.verify).bind(this.transport) + try { + await verifyAsync() + } catch (err) { + internalError('mails-transport-verify', err) + } + } + + async stop () { + if (this.transport) this.transport.close() + } +} + +const mailsTransport = new MailsTransport() +export default mailsTransport diff --git a/api/src/mongo.ts b/api/src/mongo.ts new file mode 100644 index 00000000..64dcc619 --- /dev/null +++ b/api/src/mongo.ts @@ -0,0 +1,133 @@ +import type { Site, Limits, OAuthToken, MemberOverwrite, OrganizationOverwrite, ServerSession } from '#types' +import type { Avatar } from '#services' +import type { OrgInDb, UserInDb } from './storages/mongo.ts' + +import mongo from '@data-fair/lib-node/mongo.js' +import config from './config.ts' + +const collation = { locale: 'en', strength: 1 } + +export class SdMongo { + get client () { + return mongo.client + } + + get db () { + return mongo.db + } + + get users () { + return mongo.db.collection('users') + } + + get organizations () { + return mongo.db.collection('organizations') + } + + get sites () { + return mongo.db.collection('sites') + } + + get secrets () { + return mongo.db.collection<{ _id: string, data: any } >('secrets') + } + + get avatars () { + return mongo.db.collection('avatars') + } + + get limits () { + return mongo.db.collection('limits') + } + + get oauthTokens () { + return mongo.db.collection('oauth-tokens') + } + + get oidcDiscovery () { + return mongo.db.collection<{ _id: string, content: any }>('oidc-discovery') + } + + get ldapMembersOverwrite () { + return mongo.db.collection('ldap-members-overwrite') + } + + get ldapOrganizationsOverwrite () { + return mongo.db.collection('ldap-organizations-overwrite') + } + + get ldapUserSessions () { + return mongo.db.collection<{ _id: string, sessions: ServerSession[] }>('ldap-user-sessions') + } + + get fileUserSessions () { + return mongo.db.collection<{ _id: string, sessions: ServerSession[] }>('file-user-sessions') + } + + init = async () => { + // manage retro-compatibility with STORAGE_MONGO_URL and STORAGE_MONGO_CLIENT_OPTIONS + const url = config.storage.mongo.url ?? config.mongo.url + const options = config.storage.mongo.options ?? config.mongo.options + await mongo.connect(url, options) + await mongo.configure({ + users: { + email_1: [ + { email: 1, host: 1 }, + { unique: true, collation, name: 'email_1' } + ], + logged_1: [ // for metrics + { logged: 1 }, + { sparse: true } + ], + plannedDeletion_1: [ + { plannedDeletion: 1 }, + { sparse: true } + ], + 'organizations.id_1': [ + { 'organizations.id': 1 }, + { sparse: true } + ], + sessionsLastKeepalive: [ + { 'sessions.lastKeepalive': 1 }, + { sparse: true } + ] + }, + avatars: { + 'owner.type_1_owner.id_1': [ + { 'owner.type': 1, 'owner.id': 1, 'owner.department': 1 }, + { unique: true } + ] + }, + limits: { + fulltext: { id: 'text', name: 'text' }, + 'limits-find-current': [ + { type: 1, id: 1 }, + { unique: true } + ] + }, + sites: { + 'sites-host': [ + { host: 1, path: 1 }, + { unique: true } + ], + 'sites-owner': { 'owner.type': 1, 'owner.id': 1, 'owner.department': 1 } + }, + 'oauth-tokens': { + 'oauth-tokens-key': [{ 'user.id': 1, 'provider.id': 1 }, { unique: true }], + 'oauth-tokens-provider': { 'provider.id': 1 }, + 'oauth-tokens-offline': { offlineRefreshToken: 1 }, + 'oauth-tokens-sid': { 'token.session_state': 1 } + }, + 'ldap-members-overwrite': { + 'main-keys': [{ orgId: 1, userId: 1 }, { unique: true }], + }, + 'ldap-organizations-overwrite': { + 'main-keys': [{ id: 1 }, { unique: true }] + } + }) + } +} + +const sdMongo = new SdMongo() + +export default sdMongo diff --git a/api/src/oauth-tokens/router.ts b/api/src/oauth-tokens/router.ts new file mode 100644 index 00000000..248889f0 --- /dev/null +++ b/api/src/oauth-tokens/router.ts @@ -0,0 +1,12 @@ +import { Router } from 'express' +import { reqUser, httpError } from '@data-fair/lib-express' +import { readOAuthTokens } from '#services' + +const router = Router() +export default router + +router.get('', async (req, res, next) => { + if (!reqUser(req)) return res.status(401).send() + if (!reqUser(req)?.adminMode) throw httpError(403) + res.send(await readOAuthTokens()) +}) diff --git a/api/src/oauth-tokens/service.ts b/api/src/oauth-tokens/service.ts new file mode 100644 index 00000000..3575decf --- /dev/null +++ b/api/src/oauth-tokens/service.ts @@ -0,0 +1,46 @@ +import type { User, OAuthToken } from '#types' +import mongo from '#mongo' + +export async function writeOAuthToken (user: User, provider: any, token: any, offlineRefreshToken: boolean, loggedOut?: Date) { + const tokenInfo: OAuthToken = { + user: { id: user.id, email: user.email, name: user.name }, + provider: { id: provider.id, type: provider.type, title: provider.title }, + token + } + if (offlineRefreshToken) tokenInfo.offlineRefreshToken = true + if (loggedOut) tokenInfo.loggedOut = loggedOut + await mongo.oauthTokens + .replaceOne({ 'user.id': user.id, 'provider.id': provider.id }, tokenInfo, { upsert: true }) +} + +export async function readOAuthToken (user: User, provider: any) { + return mongo.oauthTokens.findOne({ 'user.id': user.id, 'provider.id': provider.id }) +} + +export async function deleteOAuthToken (user: User, provider: any) { + await mongo.oauthTokens.deleteOne({ 'user.id': user.id, 'provider.id': provider.id }) +} + +export async function readOAuthTokens () { + const tokens = await mongo.oauthTokens.find().limit(10000).project({ + user: 1, + 'token.expires_at': 1, + 'token.session_state': 1, + offlineRefreshToken: 1, + provider: 1, + loggedOut: 1 + }).toArray() + return { + count: tokens.length, + results: tokens + } +} + +export async function findOfflineOAuthTokens () { + const tokens = await mongo.oauthTokens.find({ offlineRefreshToken: true }).limit(10000).toArray() + return tokens +} + +export async function logoutOAuthToken (sid: string) { + await mongo.oauthTokens.updateOne({ 'token.session_state': sid }, { $set: { loggedOut: new Date() } }) +} diff --git a/api/src/oauth/oidc.ts b/api/src/oauth/oidc.ts new file mode 100644 index 00000000..d5052280 --- /dev/null +++ b/api/src/oauth/oidc.ts @@ -0,0 +1,75 @@ +import axios from '@data-fair/lib-node/axios.js' +import type { OpenIDConnect } from '../../config/type/index.ts' +import { type OAuthProvider, type OAuthUserInfo } from './service.ts' +import mongo from '#mongo' +import Debug from 'debug' +import _slug from 'slugify' + +const slug = _slug.default +const debug = Debug('oauth') + +export const getOidcProviderId = (url: string) => { + let host = url + try { + host = new URL(url).host + } catch (err) { + console.warn('invalide oauth provider url', url) + } + return slug(host, { lower: true, strict: true }) +} + +export async function completeOidcProvider (p: OpenIDConnect): Promise { + const id = getOidcProviderId(p.discovery) + let discoveryContent = (await mongo.oidcDiscovery.findOne({ _id: id }))?.content + if (discoveryContent) { + debug(`Read pre-fetched OIDC discovery info from db for provider ${id}`, discoveryContent) + } else { + discoveryContent = (await axios.get(p.discovery)).data + debug(`Fetched OIDC discovery info from ${p.discovery}`, discoveryContent) + await mongo.oidcDiscovery.insertOne({ _id: id, content: discoveryContent }) + } + const tokenURL = new URL(discoveryContent.token_endpoint) + const authURL = new URL(discoveryContent.authorization_endpoint) + const auth = { + tokenHost: tokenURL.origin, + tokenPath: tokenURL.pathname, + authorizeHost: authURL.origin, + authorizePath: authURL.pathname + } + const userInfo = async (accessToken: string) => { + const claims = (await axios.get(discoveryContent.userinfo_endpoint, { + headers: { Authorization: `Bearer ${accessToken}` } + })).data + debug('fetch userInfo claims from oidc provider', claims) + if (claims.email_verified === false && !p.ignoreEmailVerified) { + throw new Error('Authentification refusée depuis le fournisseur. L\'adresse mail est indiquée comme non validée.') + } + const userInfo: OAuthUserInfo = { + data: claims, + user: { + email: claims.email, + avatarUrl: claims.picture + }, + id: claims.sub + } + if (claims.given_name) { + userInfo.user.firstName = claims.given_name + } + if (claims.family_name) { + userInfo.user.lastName = claims.family_name + } + if (claims.name) { + userInfo.user.name = claims.name + } + return userInfo + } + + return { + ...p, + id, + oidc: true, + scope: 'openid email profile', + auth, + userInfo + } +} diff --git a/api/src/oauth/service.ts b/api/src/oauth/service.ts new file mode 100644 index 00000000..4d0caffc --- /dev/null +++ b/api/src/oauth/service.ts @@ -0,0 +1,167 @@ +import type { Request } from 'express' +import type { OpenIDConnect } from '../../config/type/index.ts' +import { reqSiteUrl } from '@data-fair/lib-express' +import oauth2 from 'simple-oauth2' +import { nanoid } from 'nanoid' +import config from '#config' +import mongo from '#mongo' +import standardProviders from './standard-providers.ts' +import { completeOidcProvider, getOidcProviderId } from './oidc.ts' +import { reqSite, decodeToken } from '#services' +import { type OpenIDConnect1 } from '../../config/type/index.ts' + +export { getOidcProviderId } from './oidc.ts' + +export type OAuthUserInfo = { + data: any, + user: { + email: string, + name?: string, + firstName?: string, + lastName?: string, + avatarUrl?: string + }, + id: string, + url?: string +} + +export type OAuthProvider = Omit & { + id: string, + oidc?: boolean, + title?: string, + icon?: string, + scope: string, + auth: { + tokenHost: string, + tokenPath: string, + authorizeHost?: string, + authorizePath: string + }, + userInfo: (accessToken: string) => Promise +} + +export type PreparedOAuthProvider = OAuthProvider & { + state: string + authorizationUri (relayState: any, email: string, offlineAccess?: boolean, forceLogin?: boolean): string + getToken (code: string, offlineAccess?: boolean): Promise + refreshToken (tokenObj: any, onlyIfExpired: boolean): Promise +} + +export const getOAuthProviderById = async (req: Request, id: string): Promise => { + const site = await reqSite(req) + if (!site) { + return oauthGlobalProviders().find(p => p.id === id) + } else { + const providerInfo = site.authProviders?.find(p => p.type === 'oidc' && getOidcProviderId(p.discovery) === id) as OpenIDConnect1 + return await initOidcProvider(providerInfo, reqSiteUrl(req) + '/simple-directory') + } +} + +export const getOAuthProviderByState = async (req: Request, state: string): Promise => { + const site = await reqSite(req) + if (!site) { + return oauthGlobalProviders().find(p => p.state === state) + } else { + for (const providerInfo of site.authProviders ?? []) { + if (providerInfo.type === 'oidc') { + const p = await initOidcProvider(providerInfo, reqSiteUrl(req) + '/simple-directory') + if (p.state === state) return p + } + } + } +} + +async function initOAuthProvider (p: OAuthProvider, publicUrl = config.publicUrl): Promise { + const oauthClient = new oauth2.AuthorizationCode({ + client: p.client, + auth: p.auth + }) + + let state = (await mongo.secrets.findOne({ _id: 'oauth-state-' + p.id }))?.data as string | undefined + if (!state) { + state = nanoid() + await mongo.secrets.insertOne({ _id: 'oauth-state-' + p.id, data: state }) + } + + // standard oauth providers use the old deprecated url callback for retro-compatibility + const callbackUri = p.oidc ? `${publicUrl}/api/auth/oauth-callback` : `${publicUrl}/api/auth/oauth/${p.id}/callback` + + // dynamically prepare authorization uris for login redirection + const authorizationUri = (relayState: any, email: string, offlineAccess = false, forceLogin = false) => { + let scope = p.scope + if (offlineAccess) { + scope += ' offline_access' + } + const params: Record = { + redirect_uri: callbackUri, + scope, + state: JSON.stringify(relayState), + display: 'page' + } + if (forceLogin) { + params.prompt = 'login' + } + if (email) { + // send email in login_hint + // see https://openid.net/specs/openid-connect-basic-1_0.html + params.login_hint = email + } + const url = oauthClient.authorizeURL(params) + return url + } + + // get an access token from code sent as callback to login redirect + const getToken = async (code: string, offlineAccess = false) => { + const scope = p.scope + /* if (offlineAccess) { + scope += ' offline_access' + } */ + const tokenWrap = await oauthClient.getToken({ + code, + redirect_uri: callbackUri, + scope + }) + const token = tokenWrap.token + const decodedRefreshToken = decodeToken(token.refresh_token as string) + const offlineRefreshToken = decodedRefreshToken?.typ === 'Offline' + return { token, offlineRefreshToken } + } + + const refreshToken = async (tokenObj: any, onlyIfExpired = false) => { + const token = oauthClient.createToken(tokenObj) + if (onlyIfExpired && !token.expired()) return null + const newToken = (await token.refresh({ scope: p.scope })).token + const decodedRefreshToken = decodeToken(newToken.refresh_token as string) + const offlineRefreshToken = decodedRefreshToken?.typ === 'Offline' + return { newToken, offlineRefreshToken } + } + + return { + state, + ...p, + authorizationUri, + getToken, + refreshToken + } +} + +export async function initOidcProvider (providerInfo: OpenIDConnect, publicUrl = config.publicUrl) { + return await initOAuthProvider(await completeOidcProvider(providerInfo), publicUrl) +} + +let initialized = false +const _globalProviders: PreparedOAuthProvider[] = [] +export const init = async () => { + for (const p of standardProviders) { + _globalProviders.push(await initOAuthProvider(p)) + } + for (const oidc of config.oidc.providers) { + _globalProviders.push(await initOAuthProvider(await completeOidcProvider(oidc))) + } + initialized = true +} + +export const oauthGlobalProviders = () => { + if (!initialized) throw new Error('Global OAuth providers ware not initialized') + return _globalProviders +} diff --git a/api/src/oauth/standard-providers.ts b/api/src/oauth/standard-providers.ts new file mode 100644 index 00000000..e2123f90 --- /dev/null +++ b/api/src/oauth/standard-providers.ts @@ -0,0 +1,198 @@ +import axios from '@data-fair/lib-node/axios.js' +import config from '#config' +import Debug from 'debug' +import { type OAuthProvider, type OAuthUserInfo } from './service.ts' + +const debug = Debug('oauth') + +// icons are copied from @mdi/js https://raw.githubusercontent.com/Templarian/MaterialDesign-JS/refs/heads/master/mdi.js +const standardProviders: OAuthProvider[] = [] + +for (const provider of config.oauth.providers) { + if (provider === 'github') { + standardProviders.push({ + id: 'github', + title: 'GitHub', + icon: 'M12,2A10,10 0 0,0 2,12C2,16.42 4.87,20.17 8.84,21.5C9.34,21.58 9.5,21.27 9.5,21C9.5,20.77 9.5,20.14 9.5,19.31C6.73,19.91 6.14,17.97 6.14,17.97C5.68,16.81 5.03,16.5 5.03,16.5C4.12,15.88 5.1,15.9 5.1,15.9C6.1,15.97 6.63,16.93 6.63,16.93C7.5,18.45 8.97,18 9.54,17.76C9.63,17.11 9.89,16.67 10.17,16.42C7.95,16.17 5.62,15.31 5.62,11.5C5.62,10.39 6,9.5 6.65,8.79C6.55,8.54 6.2,7.5 6.75,6.15C6.75,6.15 7.59,5.88 9.5,7.17C10.29,6.95 11.15,6.84 12,6.84C12.85,6.84 13.71,6.95 14.5,7.17C16.41,5.88 17.25,6.15 17.25,6.15C17.8,7.5 17.45,8.54 17.35,8.79C18,9.5 18.38,10.39 18.38,11.5C18.38,15.32 16.04,16.16 13.81,16.41C14.17,16.72 14.5,17.33 14.5,18.26C14.5,19.6 14.5,20.68 14.5,21C14.5,21.27 14.66,21.59 15.17,21.5C19.14,20.16 22,16.42 22,12A10,10 0 0,0 12,2Z', + color: '#6e5494', + scope: 'read:user user:email', + auth: { + tokenHost: 'https://github.com', + tokenPath: '/login/oauth/access_token', + authorizePath: '/login/oauth/authorize' + }, + userInfo: async (accessToken: string) => { + const res = await Promise.all([ + axios.get('https://api.github.com/user', { headers: { Authorization: `token ${accessToken}` } }), + axios.get('https://api.github.com/user/emails', { headers: { Authorization: `token ${accessToken}` } }) + ]) + debug('user info from github', res[0].data, res[1].data) + let email = res[1].data.find((e: any) => e.primary) + if (!email) email = res[1].data.find((e: any) => e.verified) + if (!email) email = res[1].data[0] + return { + data: res[0].data, + user: { + name: res[0].data.name, + avatarUrl: res[0].data.avatar_url, + email: email.email + }, + id: res[0].data.id, + url: res[0].data.html_url + } + }, + client: config.oauth.github + }) + } + + if (provider === 'facebook') { + standardProviders.push({ + id: 'facebook', + title: 'Facebook', + icon: 'M12 2.04C6.5 2.04 2 6.53 2 12.06C2 17.06 5.66 21.21 10.44 21.96V14.96H7.9V12.06H10.44V9.85C10.44 7.34 11.93 5.96 14.22 5.96C15.31 5.96 16.45 6.15 16.45 6.15V8.62H15.19C13.95 8.62 13.56 9.39 13.56 10.18V12.06H16.34L15.89 14.96H13.56V21.96A10 10 0 0 0 22 12.06C22 6.53 17.5 2.04 12 2.04Z', + color: '#3b5998', + scope: 'email', + auth: { + tokenHost: 'https://graph.facebook.com', + tokenPath: '/v6.0/oauth/access_token', + authorizeHost: 'https://www.facebook.com', + authorizePath: '/v6.0/dialog/oauth' + }, + userInfo: async (accessToken: string) => { + // TODO: fetch picture, but it is a temporary URL we should store the result if we want to use it + const res = await axios.get('https://graph.facebook.com/me', { params: { access_token: accessToken, fields: 'name,first_name,last_name,email' } }) + debug('user info from facebook', res.data) + const userInfo: OAuthUserInfo = { + data: res.data, + user: { + name: res.data.name, + firstName: res.data.first_name, + lastName: res.data.last_name, + email: res.data.email + }, + id: res.data.id, + url: 'https://www.facebook.com' + } + return userInfo + }, + client: config.oauth.facebook + }) + } + + if (provider === 'google') { + standardProviders.push({ + id: 'google', + title: 'Google', + icon: 'M21.35,11.1H12.18V13.83H18.69C18.36,17.64 15.19,19.27 12.19,19.27C8.36,19.27 5,16.25 5,12C5,7.9 8.2,4.73 12.2,4.73C15.29,4.73 17.1,6.7 17.1,6.7L19,4.72C19,4.72 16.56,2 12.1,2C6.42,2 2.03,6.8 2.03,12C2.03,17.05 6.16,22 12.25,22C17.6,22 21.5,18.33 21.5,12.91C21.5,11.76 21.35,11.1 21.35,11.1V11.1Z', + color: '#0F71F2', + scope: 'profile email', + auth: { + tokenHost: 'https://www.googleapis.com', + tokenPath: '/oauth2/v4/token', + authorizeHost: 'https://accounts.google.com', + authorizePath: '/o/oauth2/v2/auth' + }, + userInfo: async (accessToken: string) => { + const res = await axios.get('https://www.googleapis.com/oauth2/v1/userinfo', { params: { alt: 'json', access_token: accessToken } }) + debug('user info from google', res.data) + return { + data: res.data, + user: { + name: res.data.name, + firstName: res.data.given_name, + lastName: res.data.family_name, + email: res.data.email, + avatarUrl: res.data.picture // is this URL temporary ? + }, + id: res.data.id, + url: 'https://www.google.com' + } + }, + client: config.oauth.google + }) + } + if (provider === 'linkedin') { + standardProviders.push({ + id: 'linkedin', + title: 'LinkedIn', + icon: 'M19 3A2 2 0 0 1 21 5V19A2 2 0 0 1 19 21H5A2 2 0 0 1 3 19V5A2 2 0 0 1 5 3H19M18.5 18.5V13.2A3.26 3.26 0 0 0 15.24 9.94C14.39 9.94 13.4 10.46 12.92 11.24V10.13H10.13V18.5H12.92V13.57C12.92 12.8 13.54 12.17 14.31 12.17A1.4 1.4 0 0 1 15.71 13.57V18.5H18.5M6.88 8.56A1.68 1.68 0 0 0 8.56 6.88C8.56 5.95 7.81 5.19 6.88 5.19A1.69 1.69 0 0 0 5.19 6.88C5.19 7.81 5.95 8.56 6.88 8.56M8.27 18.5V10.13H5.5V18.5H8.27Z', + color: '#016097', + scope: 'r_liteprofile r_emailaddress', + auth: { + tokenHost: 'https://www.linkedin.com', + tokenPath: '/oauth/v2/accessToken', + authorizePath: '/oauth/v2/authorization' + }, + userInfo: async (accessToken) => { + const res = await Promise.all([ + axios.get('https://api.linkedin.com/v2/me', { + params: { + projection: '(id,localizedFirstName,localizedLastName,profilePicture(displayImage~digitalmediaAsset:playableStreams))' + }, + headers: { Authorization: `Bearer ${accessToken}` } + }), + axios.get('https://api.linkedin.com/v2/clientAwareMemberHandles', { + params: { + q: 'members', + projection: '(elements*(primary,type,handle~))' + }, + headers: { Authorization: `Bearer ${accessToken}` } + }) + ]) + + debug('user info from linkedin', res[0].data, res[1].data) + + const userInfo: OAuthUserInfo = { + data: res[0].data, + user: { + firstName: res[0].data.localizedFirstName, + lastName: res[0].data.localizedLastName, + email: res[1].data.elements[0]['handle~'].emailAddress + }, + id: res[0].data.id, + // building profile url would require the r_basicprofile authorization, but it is possible only after requesting special authorization by linkein + url: 'https://www.linkedin.com' + } + userInfo.user.name = userInfo.user.firstName + ' ' + userInfo.user.lastName + + if (res[0].data.profilePicture && res[0].data.profilePicture['displayImage~']) { + const displayImage = res[0].data.profilePicture['displayImage~'].elements + .find((e: any) => e.data['com.linkedin.digitalmedia.mediaartifact.StillImage'] && e.data['com.linkedin.digitalmedia.mediaartifact.StillImage'].displaySize.width === 100) + const displayImageIdentifier = displayImage && displayImage.identifiers.find((i: any) => i.identifierType === 'EXTERNAL_URL') + if (displayImageIdentifier) userInfo.user.avatarUrl = displayImageIdentifier.identifier // is this URL temporary ? + } + + return userInfo + }, + client: config.oauth.linkedin + }) + } +/* + Problem with instagram provider.. it does not return an email for the user + if (provider === 'instagram') { + standardProviders.push({ + title: 'Instagram', + icon: 'M7.8,2H16.2C19.4,2 22,4.6 22,7.8V16.2A5.8,5.8 0 0,1 16.2,22H7.8C4.6,22 2,19.4 2,16.2V7.8A5.8,5.8 0 0,1 7.8,2M7.6,4A3.6,3.6 0 0,0 4,7.6V16.4C4,18.39 5.61,20 7.6,20H16.4A3.6,3.6 0 0,0 20,16.4V7.6C20,5.61 18.39,4 16.4,4H7.6M17.25,5.5A1.25,1.25 0 0,1 18.5,6.75A1.25,1.25 0 0,1 17.25,8A1.25,1.25 0 0,1 16,6.75A1.25,1.25 0 0,1 17.25,5.5M12,7A5,5 0 0,1 17,12A5,5 0 0,1 12,17A5,5 0 0,1 7,12A5,5 0 0,1 12,7M12,9A3,3 0 0,0 9,12A3,3 0 0,0 12,15A3,3 0 0,0 15,12A3,3 0 0,0 12,9Z', + color: '#e1306c', + scope: 'basic', + auth: { + tokenHost: 'https://api.instagram.com', + tokenPath: '/oauth/access_token', + authorizePath: '/oauth/authorize' + }, + userInfo: async (accessToken) => { + const res = await axios.get('https://api.instagram.com/users/self', { params: { access_token: accessToken } }) + return { + login: res.data.username, + id: res.data.id, + name: res.data.full_name, + avatarUrl: res.data.profile_picture, // is this URL temporary ? + url: 'https://www.instagram.com' + } + } + }) + } + */ +} + +export default standardProviders diff --git a/api/src/organizations/router.ts b/api/src/organizations/router.ts new file mode 100644 index 00000000..699a3398 --- /dev/null +++ b/api/src/organizations/router.ts @@ -0,0 +1,462 @@ +import { type Member } from '#types' +import { Router, type Request } from 'express' +import { reqUser, getAccountRole, reqSession, reqSiteUrl, httpError, session, mongoPagination, mongoSort, type EventLogContext } from '@data-fair/lib-express' +import eventsLog from '@data-fair/lib-express/events-log.js' +import eventsQueue from '#events-queue' +import { nanoid } from 'nanoid' +import config from '#config' +import { reqI18n } from '#i18n' +import storages from '#storages' +import mongo from '#mongo' +import type { FindMembersParams, FindOrganizationsParams, SdStorage } from '../storages/interface.ts' +import { setNbMembersLimit, sendMail, postOrganizationIdentityWebhook, postUserIdentityWebhook, deleteIdentityWebhook, keepalive, signToken, shortenPartnerInvitation, unshortenPartnerInvitation } from '#services' +import { __all } from '#i18n' +import { stringify as csvStringify } from 'csv-stringify/sync' +import _slug from 'slugify' +import { cipher } from '../utils/cipher.ts' +import Debug from 'debug' + +const slug = _slug.default + +const router = Router() +export default router +/* +function getUserOrg (req, noDep = true) { + return (reqUser(req).organizations || []).find(o => o.id === req.params.organizationId && !(noDep && o.department)) +} +function getUserOrgDep (req) { + return (reqUser(req).organizations || []).find(o => o.id === req.params.organizationId && req.query.department && o.department === req.query.department) +} + +*/ + +// Either a super admin, or an admin of the current organization +function isOrgAdmin (req: Request) { + const role = getAccountRole(reqSession(req), { type: 'organization', id: req.params.organizationId }, { acceptDepAsRoot: config.depAdminIsOrgAdmin }) + return role === 'admin' +} + +// Either a super admin, or a member of the current organization +function isMember (req: Request, allAccounts?: boolean) { + return !!getAccountRole(reqSession(req), { type: 'organization', id: req.params.organizationId }, { acceptDepAsRoot: true, allAccounts }) +} + +// Get the list of organizations +router.get('', async (req, res, next) => { + const user = reqUser(req) + + const listMode = config.listOrganizationsMode || config.listEntitiesMode + if (listMode === 'authenticated' && !reqUser(req)) return res.send({ results: [], count: 0 }) + if (listMode === 'admin' && !(reqUser(req)?.adminMode)) return res.send({ results: [], count: 0 }) + + const params: FindOrganizationsParams = { ...mongoPagination(req.query), sort: mongoSort(req.query.sort) } + + // Only service admins can request to see all field. Other users only see id/name + const allFields = req.query.allFields === 'true' + if (allFields) { + if (!user?.adminMode) throw httpError(403, reqI18n(req).messages.errors.permissionDenied) + } else { + params.select = ['id', 'name'] + } + + if (typeof req.query.ids === 'string') params.ids = req.query.ids.split(',') + if (typeof req.query.q === 'string') params.q = req.query.q + if (typeof req.query.creator === 'string') params.creator = req.query.creator + + const organizations = await storages.globalStorage.findOrganizations(params) + if (allFields) { + organizations.results.forEach(orga => { + orga.roles = orga.roles || config.roles.defaults + }) + } + res.json(organizations) +}) + +// Get details of an organization +router.get('/:organizationId', async (req, res, next) => { + if (!reqUser(req)) return res.status(401).send() + // Only allowed for the organizations that the user belongs to + if (!isMember(req, true)) { + throw httpError(403, reqI18n(req).messages.errors.permissionDenied) + } + const orga = await storages.globalStorage.getOrganization(req.params.organizationId) + if (!orga) return res.status(404).send() + orga.roles = orga.roles || config.roles.defaults + if (!reqUser(req)?.adminMode && orga.orgStorage) delete orga.orgStorage.config + res.send(orga) +}) + +// Get the list of organization roles +// TODO: keep temporarily for compatibility.. but later a simpler GET on the orga will be enough +router.get('/:organizationId/roles', async (req, res, next) => { + if (!reqUser(req)) return res.status(401).send() + // Only search through the organizations that the user belongs to + if (!isMember(req)) { + throw httpError(403, reqI18n(req).messages.errors.permissionDenied) + } + const orga = await storages.globalStorage.getOrganization(req.params.organizationId) + if (!orga) return res.status(404).send() + res.send(orga.roles || config.roles.defaults) +}) + +// Create an organization +router.post('', async (req, res, next) => { + const user = reqUser(req) + const logContext: EventLogContext = { req } + + if (!user) return res.status(401).send() + const storage = storages.globalStorage + if (!user.adminMode) { + const createdOrgs = (await storage.findOrganizations({ size: 0, skip: 0, creator: user.id })).count + let maxCreatedOrgs = (await storage.getUser(user.id))?.maxCreatedOrgs + if (maxCreatedOrgs === undefined || maxCreatedOrgs === null) maxCreatedOrgs = config.quotas.defaultMaxCreatedOrgs + if (maxCreatedOrgs !== -1 && createdOrgs >= maxCreatedOrgs) return res.status(429).send(reqI18n(req).messages.errors.maxCreatedOrgs) + } + const { body: orga } = (await import('#doc/organizations/post-req/index.ts')).returnValid(req, { name: 'req' }) + + const createdOrga = await storage.createOrganization(orga, user) + logContext.account = { type: 'organization', id: createdOrga.id, name: createdOrga.name } + eventsLog.info('sd.org.create', `a user created an organization: ${orga.name} (${orga.id})`, logContext) + if (!reqUser(req)?.adminMode || req.query.autoAdmin !== 'false') await storage.addMember(createdOrga, user, 'admin') + postOrganizationIdentityWebhook(createdOrga) + + // update session info + await keepalive(req, res) + + res.status(201).send(createdOrga) +}) + +// Update some parts of an organization as admin of it +router.patch('/:organizationId', async (req, res, next) => { + const user = reqUser(req) + const logContext: EventLogContext = { req } + + if (!user) return res.status(401).send() + // Only allowed for the organizations that the user is admin of + if (!isOrgAdmin(req)) { + throw httpError(403, reqI18n(req).messages.errors.permissionDenied) + } + + const { body: patch } = (await import('#doc/organizations/patch-req/index.ts')).returnValid(req, { name: 'req' }) + if (patch.orgStorage && !user.adminMode) throw httpError(403) + if (patch.orgStorage?.config?.searchUserPassword && typeof patch.orgStorage.config.searchUserPassword === 'string') { + patch.orgStorage.config.searchUserPassword = cipher(patch.orgStorage.config.searchUserPassword) + } + if (patch.departments) { + for (const dep of patch.departments) { + if (!dep.id) { + if (patch.departments.find(d => d.id && d.name === dep.name)) { + return res.status(400).send(reqI18n(req).messages.errors.duplicateDep) + } + const baseId = slug(dep.name, { lower: true, strict: true }) + let id = baseId + let i = 1 + while (patch.departments.find(d => d.id === id)) { + i += 1 + id = baseId + '-' + i + } + dep.id = id + } + } + } + const patchedOrga = await storages.globalStorage.patchOrganization(req.params.organizationId, patch, user) + + logContext.account = { type: 'organization', id: patchedOrga.id, name: patchedOrga.name } + eventsLog.info('sd.org.patch', `a user patched the organization info ${Object.keys(patch).join(', ')} - ${patchedOrga.name} ${patchedOrga.id}`, logContext) + + await mongo.limits.updateOne({ type: 'organization', id: patchedOrga.id }, { $set: { name: patchedOrga.name } }) + postOrganizationIdentityWebhook(patchedOrga) + + // update session info + await keepalive(req, res) + + res.send(patchedOrga) +}) + +// Get the members of an organization. i.e. a partial user object (id, name, role). +router.get('/:organizationId/members', async (req, res, next) => { + const logContext: EventLogContext = { req } + + if (!reqUser(req)) return res.status(401).send() + // Only search through the organizations that the user belongs to + if (!isMember(req)) { + throw httpError(403, reqI18n(req).messages.errors.permissionDenied) + } + + const org = await storages.globalStorage.getOrganization(req.params.organizationId) + if (!org) return res.status(404).send('organization not found') + logContext.account = { type: 'organization', id: org.id, name: org.name } + + const orgStorages: (SdStorage & { orgStorage?: boolean })[] = [storages.globalStorage] + + // org_storage can be yes, no or both (both is default) + if (req.query.org_storage === 'false') { + // nothing todo + } else { + const secondaryStorage: undefined | (SdStorage & { orgStorage?: boolean }) = await storages.createOrgStorage(org) + if (secondaryStorage) { + secondaryStorage.orgStorage = true + if (req.query.org_storage === 'true') { + orgStorages[0] = secondaryStorage + } else { + orgStorages.push(secondaryStorage) + } + } + } + + const pagination = mongoPagination(req.query) + const params: FindMembersParams = { ...pagination, sort: mongoSort(req.query.sort) } + if (typeof req.query.q === 'string') params.q = req.query.q + if (typeof req.query.ids === 'string') params.ids = req.query.ids.split(',') + else if (typeof req.query.id === 'string') params.ids = req.query.id.split(',') + if (typeof req.query.role === 'string') params.roles = req.query.role.split(',') + if (typeof req.query.department === 'string') params.departments = req.query.department.split(',') + if (typeof req.query.email_confirmed === 'string') params.emailConfirmed = req.query.email_confirmed === 'true' + const members = { count: 0, results: [] as Member[] } + for (const storage of orgStorages) { + // do our best to mix results in "org_storage=both" mode + if (members.count <= (pagination.skip + pagination.size)) { + pagination.skip -= members.count + if (pagination.skip < 0) { + pagination.size += pagination.skip + params.skip = 0 + } + const storageMembers = await storage.findMembers(req.params.organizationId, params) + if (storageMembers && storageMembers.count) { + members.count += storageMembers.count + members.results = members.results.concat(storageMembers.results.map(r => ({ ...r, orgStorage: storage.orgStorage }))) + } + } + } + + eventsLog.info('sd.org.get-member', `a user read the list of members of an organization ${org.name}(${org.id})`, logContext) + + if (req.query.format === 'csv') { + res.setHeader('content-disposition', 'attachment; filename="members.csv"') + const csv = csvStringify(members.results, { header: true, columns: ['name', 'email', 'role', 'department', 'departmentName'] }) + res.send(csv) + } else { + res.send(members) + } +}) + +// Exclude a member of the organization +router.delete('/:organizationId/members/:userId', async (req, res, next) => { + const logContext: EventLogContext = { req } + + if (!reqUser(req)) return res.status(401).send() + const storage = storages.globalStorage + + const dep = typeof req.query.department === 'string' ? req.query.department : undefined + const filter: FindMembersParams = { ids: [req.params.userId], skip: 0, size: 1 } + if (dep) filter.departments = [dep] + const member = (await storage.findMembers(req.params.organizationId, filter)).results[0] + if (!member) return res.status(404).send('member not found') + + // Only allowed for the organizations that the user is admin of + + // Only allowed for the organizations that the user is admin of (or admin of the member's department) + const role = getAccountRole( + reqSession(req), + { type: 'organization', id: req.params.organizationId, department: dep }, + { acceptDepAsRoot: config.depAdminIsOrgAdmin } + ) + if (role !== 'admin') throw httpError(403, reqI18n(req).messages.errors.permissionDenied) + + eventsLog.info('sd.org.member.del', `a user removed a member from an organization ${member.name} (${member.id}), ${req.params.organizationId}`, logContext) + await storage.removeMember(req.params.organizationId, req.params.userId, dep) + await setNbMembersLimit(req.params.organizationId) + + const user = await storage.getUser(req.params.userId) + if (!user) return res.status(404).send('user not found') + if (config.onlyCreateInvited && !user.organizations.length) { + eventsLog.info('sd.org.member.del-user', `a user was removed after being excluded from last organization ${user.name} (${user.id})`, logContext) + await storage.deleteUser(req.params.userId) + deleteIdentityWebhook('user', user.id) + } else { + postUserIdentityWebhook(user) + } + + // update session info + await keepalive(req, res) + + res.status(204).send() +}) + +// Change the role of the user in the organization +router.patch('/:organizationId/members/:userId', async (req, res, next) => { + const logContext: EventLogContext = { req } + + if (!reqUser(req)) return res.status(401).send() + + const { query, body } = (await import('#doc/organizations/patch-member-req/index.ts')).returnValid(req, { name: 'req' }) + const storage = storages.globalStorage + const dep = query.department + const filter: FindMembersParams = { ids: [req.params.userId], skip: 0, size: 1 } + if (typeof dep === 'string') filter.departments = [dep] + const member = (await storage.findMembers(req.params.organizationId, filter)).results[0] + + // Only allowed for the organizations that the user is admin of (or admin of the member's department) + const role = getAccountRole( + reqSession(req), + { type: 'organization', id: req.params.organizationId, department: query.department }, + { acceptDepAsRoot: config.depAdminIsOrgAdmin } + ) + if (role !== 'admin') throw httpError(403, reqI18n(req).messages.errors.permissionDenied) + const orga = await storage.getOrganization(req.params.organizationId) + if (!orga) return res.status(404).send() + logContext.account = { type: 'organization', id: orga.id, name: orga.name } + const roles = orga.roles || config.roles.defaults + if (!roles.includes(body.role)) return res.status(400).send(reqI18n(req).messages.errors.unknownRole.replace('{role}', body.role)) + await storage.patchMember(req.params.organizationId, req.params.userId, query.department, body) + eventsLog.info('sd.org.member.patch', `a user changed the role of a member in an organization ${member.name} (${member.id}) ${body.role} ${body.department ?? ''}`, logContext) + postUserIdentityWebhook(await storage.getUser(req.params.userId)) + + // update session info + await keepalive(req, res) + + res.status(204).send() +}) + +// Super admin and orga admin can delete an organization for now +router.delete('/:organizationId', async (req, res, next) => { + /** @type {import('@data-fair/lib-express/events-log.js').EventLogContext} */ + const logContext = { req } + + if (!reqUser(req)) return res.status(401).send() + if (!isOrgAdmin(req)) throw httpError(403, reqI18n(req).messages.errors.permissionDenied) + const { count } = await storages.globalStorage.findMembers(req.params.organizationId, { size: 0, skip: 0 }) + if (count > 1) return res.status(400).send(reqI18n(req).messages.errors.nonEmptyOrganization) + await storages.globalStorage.deleteOrganization(req.params.organizationId) + eventsLog.info('sd.org.delete', `a user deleted an organization ${req.params.organizationId}`, logContext) + deleteIdentityWebhook('organization', req.params.organizationId) + + // update session info + await keepalive(req, res) + + res.status(204).send() +}) + +if (config.managePartners) { + // Invitation for an organization to join us as partners + const debugPartners = Debug('partners') + router.post('/:organizationId/partners', async (req, res, next) => { + const logContext: EventLogContext = { req } + + if (!reqUser(req)) return res.status(401).send() + if (!isOrgAdmin(req)) throw httpError(403, reqI18n(req).messages.errors.permissionDenied) + + const { body: partnerPost } = (await import('#doc/organizations/post-partner-req/index.ts')).returnValid(req) + + const storage = storages.globalStorage + + const orga = await storage.getOrganization(req.params.organizationId) + if (!orga) return res.status(404).send() + logContext.account = { type: 'organization', id: orga.id, name: orga.name } + + const partnerId = nanoid() + + const token = await signToken(shortenPartnerInvitation(partnerPost, orga, partnerId), config.jwtDurations.partnerInvitationToken) + + await storage.addPartner(orga.id, { name: partnerPost.name, contactEmail: partnerPost.contactEmail, partnerId, createdAt: new Date().toISOString() }) + eventsLog.info('sd.org.partner.invite', `a user invited an organization to be a partner ${partnerPost.name} ${partnerPost.contactEmail} ${orga.name} ${orga.id}`, logContext) + + const linkUrl = new URL(reqSiteUrl(req) + '/simple-directory/login') + linkUrl.searchParams.set('step', 'partnerInvitation') + linkUrl.searchParams.set('partner_invit_token', token) + linkUrl.searchParams.set('redirect', partnerPost.redirect || reqSiteUrl(req) + '/simple-directory') + const params = { + link: linkUrl.href, + organization: orga.name, + partner: partnerPost.name + } + await sendMail('partnerInvitation', reqI18n(req).messages, partnerPost.contactEmail, params) + + eventsQueue?.pushEvent({ + sender: { type: 'organization', id: orga.id, name: orga.name, role: 'admin' }, + topic: { key: 'simple-directory:partner-invitation-sent' }, + title: __all('notifications.sentPartnerInvitation', { partnerName: partnerPost.name, email: partnerPost.contactEmail, orgName: orga.name }) + }) + + res.status(201).send() + }) + + router.post('/:organizationId/partners/_accept', async (req, res, next) => { + const logContext: EventLogContext = { req } + const user = reqUser(req) + + if (!user) return res.status(401).send() + const { body: partnerAccept } = (await import('#doc/organizations/post-partner-accept-req/index.ts')).returnValid(req) + + // user must be owner of the new partner + const userOrga = user.organizations.find(o => o.id === partnerAccept.id && !o.department) + if (!userOrga || userOrga.role !== 'admin') throw httpError(403) + logContext.account = { type: 'organization', id: userOrga.id, name: userOrga.name } + + const storage = storages.globalStorage + const partnerOrga = await storage.getOrganization(partnerAccept.id) + if (!partnerOrga) return res.status(404).send('unknown organization') + + let tokenPayload + try { + tokenPayload = unshortenPartnerInvitation(await session.verifyToken(partnerAccept.token)) + } catch (err: any) { + return res.status(400).send(err.message) + } + + // user must have access to a token sent to the contact email + if (tokenPayload.contactEmail !== partnerAccept.contactEmail || tokenPayload.orgId !== req.params.organizationId) { + return res.status(400).send('requête incohérente avec l\'invitation envoyée') + } + const orga = await storage.getOrganization(req.params.organizationId) + if (!orga) return res.status(404).send('unknown organization') + debugPartners('accept partner invitation', tokenPayload, partnerOrga.name, partnerOrga.id) + + const conflictInvitation = (orga.partners || []).find(p => p.id === partnerOrga.id) + if (conflictInvitation) return res.status(400).send('cette organisation est déjà partenaire') + + const pendingInvitation = (orga.partners || []).find(p => p.partnerId === tokenPayload.partnerId && p.contactEmail === partnerAccept.contactEmail && !p.id) + if (!pendingInvitation) return res.status(400).send('pas d\'invitation en attente de validation') + + await storage.validatePartner(orga.id, tokenPayload.partnerId, partnerOrga) + + eventsLog.info('sd.org.partner.accept', `a user accepted an organization to be a partner ${partnerOrga.name} (${partnerOrga.id}) of ${orga.name} (${orga.id})`, logContext) + + const notif = { + sender: { type: 'organization', id: orga.id, name: orga.name, role: 'admin' }, + topic: { key: 'simple-directory:partner-invitation-accepted' }, + title: __all('notifications.acceptedPartnerInvitation', { email: partnerAccept.contactEmail, partnerName: partnerOrga.name, orgName: orga.name }) + } + // send notif to all admins subscribed to the topic + debugPartners(notif) + + res.status(201).send() + }) + + router.delete('/:organizationId/partners/:partnerId', async (req, res, next) => { + const logContext: EventLogContext = { req } + + if (!reqUser(req)) return res.status(401).send() + if (!isOrgAdmin(req)) throw httpError(403, reqI18n(req).messages.errors.permissionDenied) + const storage = storages.globalStorage + await storage.deletePartner(req.params.organizationId, req.params.partnerId) + + eventsLog.info('sd.org.partner.delete', `a user removed a partner from an organization ${req.params.partnerId} ${req.params.organizationId}`, logContext) + res.status(201).send() + }) + + router.get('/:organizationId/partners/_user-partners', async (req, res, next) => { + const user = reqUser(req) + if (!user) return res.status(401).send() + const storage = storages.globalStorage + const orga = await storage.getOrganization(req.params.organizationId) + if (!orga) return res.status(404).send('unknown organization') + const userPartners = [] + for (const partner of (orga.partners || [])) { + const userOrg = user.organizations?.find(o => o.id === partner.id) + if (!userOrg) continue + userPartners.push(userOrg) + } + res.send(userPartners) + }) +} diff --git a/api/src/saml2/service.ts b/api/src/saml2/service.ts new file mode 100644 index 00000000..dbc60e74 --- /dev/null +++ b/api/src/saml2/service.ts @@ -0,0 +1,137 @@ +// useful tutorial +// https://medium.com/disney-streaming/setup-a-single-sign-on-saml-test-environment-with-docker-and-nodejs-c53fc1a984c9 + +import { readFile, access, constants } from 'node:fs/promises' +import type { Saml2 } from '../../config/type/index.ts' +import config from '#config' +import _slug from 'slugify' +import samlify from 'samlify' +import Debug from 'debug' +import mongo from '#mongo' +import { decipher, cipher } from '../utils/cipher.ts' +import { exec } from 'node:child_process' +import { promisify } from 'node:util' + +const execAsync = promisify(exec) +const debug = Debug('saml') +const slug = _slug.default + +type Certificates = { signing: { privateKey: string, cert: string }, encrypt: { privateKey: string, cert: string } } + +type PreparedSaml2Provider = Saml2 & { id: string, idp: samlify.IdentityProviderInstance } + +// const validator = require('@authenio/samlify-xsd-schema-validator') +// samlify.setSchemaValidator(validator) +// TODO: apply an actual validator cf https://github.com/tngan/samlify#installation +samlify.setSchemaValidator({ + validate: (response) => { + return Promise.resolve('skipped') + } +}) + +export const getSamlProviderId = (url: string) => { + return slug(new URL(url).host, { lower: true, strict: true }) +} + +const readDeprecatedCertificates = async (): Promise => { + try { + await access('/webapp/security/saml2/signing.key', constants.R_OK) + await access('/webapp/security/saml2/signing.crt', constants.R_OK) + await access('/webapp/security/saml2/encrypt.key', constants.R_OK) + await access('/webapp/security/saml2/encrypt.crt', constants.R_OK) + } catch (err) { + // TODO: remove this log after a few months + console.log('No deprecated saml certificates found, this message is expected on a new deployment', err) + return undefined + } + return { + signing: { + privateKey: await readFile('/webapp/security/saml2/signing.key', 'utf8'), + cert: await readFile('/webapp/security/saml2/signing.crt', 'utf8') + }, + encrypt: { + privateKey: await readFile('/webapp/security/saml2/encrypt.key', 'utf8'), + cert: await readFile('/webapp/security/saml2/encrypt.crt', 'utf8') + } + } +} + +const readCertificates = async (): Promise => { + const secret = await mongo.secrets.findOne({ _id: 'saml-certificates' }) + if (secret) { + const certificates = secret.data + certificates.signing.privateKey = decipher(certificates.signing.privateKey) + certificates.encrypt.privateKey = decipher(certificates.encrypt.privateKey) + return certificates + } +} + +const writeCertificates = async (certificates: Certificates) => { + const storedCertificates = { signing: { ...certificates.signing }, encrypt: { ...certificates.encrypt } } as any + storedCertificates.signing.privateKey = cipher(certificates.signing.privateKey) + storedCertificates.encrypt.privateKey = cipher(certificates.encrypt.privateKey) + await mongo.secrets.insertOne({ _id: 'saml-certificates', data: storedCertificates }) +} + +const _globalProviders: PreparedSaml2Provider[] = [] +let _sp: samlify.ServiceProviderInstance | undefined +export const saml2ServiceProvider = () => { + if (!_sp) throw new Error('Global Saml 2 providers ware not initialized') + return _sp +} +export const saml2GlobalProviders = () => { + if (!_sp) throw new Error('Global Saml 2 providers ware not initialized') + return _globalProviders +} + +export const init = async () => { + let certificates = await readCertificates() + if (!certificates) { + console.log('Initializing SAML certificates') + certificates = await readDeprecatedCertificates() + if (certificates) { + console.log('Migrating SAML certificates from filesystem to database') + } else { + console.log('Generating new SAML certificates') + certificates = { signing: await createCert(), encrypt: await createCert() } + } + await writeCertificates(certificates) + } + + const assertionConsumerService = [{ + Binding: samlify.Constants.namespace.binding.post, + Location: `${config.publicUrl}/api/auth/saml2-assert` + }] + debug('config service provider') + _sp = samlify.ServiceProvider({ + entityID: `${config.publicUrl}/api/auth/saml2-metadata.xml`, + assertionConsumerService, + signingCert: certificates.signing.cert, + privateKey: certificates.signing.privateKey, + encryptCert: certificates.encrypt.cert, + encPrivateKey: certificates.encrypt.privateKey, + ...config.saml2.sp + }) + + debug('config identity providers') + for (const providerConfig of config.saml2.providers) { + const idp = samlify.IdentityProvider(providerConfig) + if (!idp.entityMeta.meta.entityID) throw new Error('missing entityID in saml IDP metadata') + const id = getSamlProviderId(idp.entityMeta.meta.entityID) + _globalProviders.push({ + id, + ...providerConfig, + idp + }) + } +} + +const createCert = async () => { + const subject = `/C=FR/CN=${new URL(config.publicUrl).hostname}` + const privateKey = (await execAsync('openssl genpkey -algorithm RSA -pkeyopt rsa_keygen_bits:2048')).stdout + const certPromise = execAsync(`echo "${privateKey}" | openssl req -key /dev/stdin -x509 -sha256 -nodes -days 1095 -subj "${subject}"`) + certPromise.child.stdin?.write(privateKey) + certPromise.child.stdin?.end() + const cert = (await certPromise).stdout + return { privateKey, cert } +} diff --git a/api/src/server.ts b/api/src/server.ts new file mode 100644 index 00000000..9bcb40f0 --- /dev/null +++ b/api/src/server.ts @@ -0,0 +1,74 @@ +import { resolve } from 'node:path' +import { createServer } from 'node:http' +import { session } from '@data-fair/lib-express/index.js' +import { startObserver, stopObserver } from '@data-fair/lib-node/observer.js' +import locks from '@data-fair/lib-node/locks.js' +import upgradeScripts from '@data-fair/lib-node/upgrade-scripts.js' +import mongo from '#mongo' +import * as usersWorker from './users/worker.ts' +import * as keysManager from './tokens/keys-manager.ts' +import * as oauth from './oauth/service.ts' +import * as metrics from './utils/metrics.ts' +import * as saml2 from './saml2/service.ts' +import mailsTransport from './mails/transport.ts' +import storages from '#storages' +import { createHttpTerminator } from 'http-terminator' +import app from './app.ts' +import config from '#config' +import * as eventsQueue from '#events-queue' +import { publicProviders } from './auth/providers.ts' +import { getSiteColorsWarnings } from './utils/color.ts' + +const server = createServer(app) +const httpTerminator = createHttpTerminator({ server }) + +// cf https://connectreport.com/blog/tuning-http-keep-alive-in-node-js/ +// timeout is often 60s on the reverse proxy, better to a have a longer one here +// so that interruption is managed downstream instead of here +server.keepAliveTimeout = (60 * 1000) + 1000 +server.headersTimeout = (60 * 1000) + 2000 + +export const start = async () => { + session.init('http://localhost:' + config.port, 'fr', (req) => { + // on keepalive route we accept a older token if it is accompanied by a valid exchange token + return req.method === 'POST' && req.url === '/api/auth/keepalive' + }) + await mongo.init() + await locks.start(mongo.db) + await Promise.all([ + eventsQueue.start(), + oauth.init(), + saml2.init(), + storages.init(), + config.observer.active && startObserver(config.observer.port), + usersWorker.start(), + mailsTransport.start(), + keysManager.start(), + metrics.init() + ]) + await upgradeScripts(mongo.db, locks, resolve(import.meta.dirname, '../..')) + + const colorWarnings = getSiteColorsWarnings(config.i18n.defaultLocale, config.theme, await publicProviders()) + if (colorWarnings.length) { + console.error('Configuration contains color warnings') + for (const cw of colorWarnings) console.error(' - ' + cw) + } + + server.listen(config.port) + await new Promise(resolve => server.once('listening', resolve)) + + console.log(`API server listening on port ${config.port}`) +} + +export const stop = async () => { + await httpTerminator.terminate() + await Promise.all([ + config.observer.active && stopObserver(), + usersWorker.stop(), + mailsTransport.stop(), + keysManager.start(), + eventsQueue.stop(), + ]) + await locks.stop() + await mongo.client.close() +} diff --git a/api/src/services.ts b/api/src/services.ts new file mode 100644 index 00000000..df822938 --- /dev/null +++ b/api/src/services.ts @@ -0,0 +1,14 @@ +export * from './2fa/service.ts' +export * from './auth/service.ts' +export * from './avatars/service.ts' +export * from './invitations/service.ts' +export * from './limits/service.ts' +export * from './mails/service.ts' +export { initOidcProvider, oauthGlobalProviders, getOidcProviderId, getOAuthProviderById, getOAuthProviderByState } from './oauth/service.ts' +export * from './oauth-tokens/service.ts' +export { saml2ServiceProvider, saml2GlobalProviders, getSamlProviderId } from './saml2/service.ts' +export { reqSite, getSiteByUrl, getRedirectSite } from './sites/service.ts' +export * from './tokens/service.ts' +export * from './utils/passwords.ts' +export * from './utils/partners.ts' +export * from './webhooks/service.ts' diff --git a/api/src/sites/router.ts b/api/src/sites/router.ts new file mode 100644 index 00000000..dab38995 --- /dev/null +++ b/api/src/sites/router.ts @@ -0,0 +1,216 @@ +import { type Site, type SitePublic } from '#types' +import { Router, type Request } from 'express' +import config from '#config' +import { reqUser, reqUserAuthenticated, reqSiteUrl, httpError, reqSessionAuthenticated, reqHost, reqSitePath } from '@data-fair/lib-express' +import { nanoid } from 'nanoid' +import { findAllSites, findOwnerSites, patchSite, deleteSite, getSite } from './service.ts' +import { reqSite } from '#services' +import { reqI18n } from '#i18n' +import { getOidcProviderId } from '../oauth/oidc.ts' +import { getSiteColorsWarnings } from '../utils/color.ts' +import microTemplate from '@data-fair/lib-utils/micro-template.js' +import { fillTheme, getTextColorsCss } from '@sd/shared/site.ts' +import clone from '@data-fair/lib-utils/clone.js' +import Debug from 'debug' + +const debugPostSite = Debug('post-site') + +const router = Router() +export default router + +const checkSecret = async (req: Request) => { + if (!reqUser(req)?.adminMode && (!req.query.key || req.query.key !== config.secretKeys.sites)) { + throw httpError(401, 'wrong sites secret key') + } +} + +const prepareFullSite = (req: Request, site: Site) => { + site.theme.logo = site.theme.logo || `${reqSiteUrl(req) + '/simple-directory'}/api/avatars/${site.owner.type}/${site.owner.id}/avatar.png` + if (site.authProviders) { + for (const p of site.authProviders) { + if (p.type === 'oidc') p.id = getOidcProviderId(p.discovery) + } + } + const resultWithColorWarnings: any = site as any + const { localeCode } = reqI18n(req) + resultWithColorWarnings.colorWarnings = getSiteColorsWarnings(localeCode, site.theme, site.authProviders as { title?: string, color?: string }[]) +} + +router.get('', async (req, res, next) => { + const sessionState = reqSessionAuthenticated(req) + const { query } = (await import('#doc/sites/list-req/index.ts')).returnValid(req, { name: 'req' }) + if (query.showAll && !reqUser(req)?.adminMode) throw httpError(403) + if (query.showAll) { + const response = await findAllSites() + for (const result of response.results) { + prepareFullSite(req, result) + } + res.send(response) + } else { + const response = await findOwnerSites(sessionState.account) + for (const result of response.results) { + result.theme.logo = result.theme.logo || `${reqSiteUrl(req) + '/simple-directory'}/api/avatars/${sessionState.account.type}/${sessionState.account.id}/avatar.png` + } + res.send(response) + } +}) + +router.post('', async (req, res, next) => { + await checkSecret(req) + const body = req.body + debugPostSite('received POST', body) + + let existingSite + if (body._id) existingSite = await getSite(req.body._id) + + // manage retro-compatibility with old portals manager + if (body.theme?.primaryColor) { + debugPostSite('manage retro-compatibility with old portals manager') + if (existingSite?.theme) { + debugPostSite('patching existing theme with new primary color') + const theme = clone(existingSite?.theme) + if (theme.assistedMode && theme.assistedModeColors) { + theme.assistedModeColors.primary = body.theme.primaryColor + } else { + theme.colors.primary = body.theme.primaryColor + } + body.theme = fillTheme(theme, config.theme) + } else { + debugPostSite('init a new theme from env level config') + const theme = clone(config.theme) + theme.dark = false + theme.hc = false + theme.hcDark = false + theme.colors.primary = body.theme.primaryColor + theme.assistedMode = true + theme.assistedModeColors = { + primary: body.theme.primaryColor + } + theme.colors.background = '#FFFFFF' + body.theme = fillTheme(theme, config.theme) + } + if (body.logo) { + body.theme.logo = body.logo + delete body.logo + } + debugPostSite('processed body for retro-compatibility', body) + } + + const postSite = (await import('#doc/sites/post-req-body/index.ts')).returnValid(body, { name: 'req.body' }) + if (!postSite.theme) { + const theme = clone(config.theme) + theme.dark = false + theme.hc = false + theme.hcDark = false + theme.assistedMode = true + theme.assistedModeColors = { + primary: theme.colors.primary, + secondary: theme.colors.secondary, + accent: theme.colors.accent, + } + postSite.theme = theme + } + if (postSite.path?.endsWith('/')) postSite.path = postSite.path.slice(0, -1) + if (postSite.path === '') delete postSite.path + const patchedSite = await patchSite({ ...postSite, _id: postSite._id ?? nanoid() }, true) + debugPostSite('patched site', patchedSite._id) + res.send(patchedSite) +}) + +router.patch('/:id', async (req, res, next) => { + if (!reqUserAuthenticated(req)?.adminMode) throw httpError(403) + const body = req.body + + const site = await getSite(req.params.id) + if (!site) throw httpError(404) + + if (body.theme.primaryColor || body.logo) { + // manage re-reo-compatibility with old portals manager + const theme = clone(site.theme) + if (body.theme.primaryColor) { + theme.colors.primary = body.theme.primaryColor + } + if (body.logo) { + theme.logo = body.logo + } + body.theme = theme + } + + const patch = (await import('#doc/sites/patch-req-body/index.ts')).returnValid(body, { name: 'req.body' }) + + if (patch.theme) { + patch.theme = fillTheme(patch.theme, config.theme) + } + + const patchedSite = await patchSite({ _id: req.params.id, ...patch }) + res.send(patchedSite) +}) + +router.delete('/:id', async (req, res, next) => { + await checkSecret(req) + await deleteSite(req.params.id) + res.status(204).send() +}) + +router.get('/_public', async (req, res, next) => { + res.setHeader('Cache-Control', 'public, max-age=60') + + const site = await reqSite(req) + const theme = { ...site?.theme ?? config.theme } + if (!theme.dark) delete theme.darkColors + if (!theme.hc) delete theme.hcColors + if (!site) { + const sitePublic: SitePublic = { + main: true, + host: reqHost(req), + theme, + authMode: 'onlyLocal', + } + res.send(sitePublic) + } else { + const sitePublic: SitePublic = { + host: site.host, + theme: { + ...theme, + logo: site.theme.logo || `${reqSiteUrl(req) + '/simple-directory'}/api/avatars/${site.owner.type}/${site.owner.id}/avatar.png` + }, + authMode: site.authMode ?? 'onlyBackOffice', + authOnlyOtherSite: site.authOnlyOtherSite + } + res.send(sitePublic) + } +}) + +router.get('/_default_theme', async (req, res, next) => { + res.send(config.theme) +}) + +router.get('/_theme.css', async (req, res, next) => { + res.setHeader('Cache-Control', 'public, max-age=60') + const site = await reqSite(req) + const sitePath = reqSitePath(req) + let css = '@media print { .v-application { background-color: transparent; } }' + const theme = site?.theme ?? config.theme + css += getTextColorsCss(theme.colors, 'default') + if (theme.dark && theme.darkColors) css += getTextColorsCss(theme.darkColors, 'dark') + if (theme.hc && theme.hcColors) css += getTextColorsCss(theme.hcColors, 'hc') + if (theme.hcDark && theme.hcDarkColors) css += getTextColorsCss(theme.hcDarkColors, 'hc-dark') + css += '\n' + microTemplate(site?.theme?.bodyFontFamilyCss ?? config.theme.bodyFontFamilyCss ?? '', { SITE_PATH: sitePath, FONT_FAMILY: 'BodyFontFamily' }) + css += '\n' + microTemplate(site?.theme?.headingFontFamilyCss ?? site?.theme?.bodyFontFamilyCss ?? config.theme.headingFontFamilyCss ?? config.theme.bodyFontFamilyCss ?? '', { SITE_PATH: sitePath, FONT_FAMILY: 'HeadingFontFamily' }) + res.contentType('css') + res.send(css) +}) + +router.get('/:id/_theme_warnings', async (req, res, next) => { + const site = await reqSite(req) + const { localeCode } = reqI18n(req) + res.send(getSiteColorsWarnings(localeCode, site?.theme ?? config.theme, site?.authProviders as { title?: string, color?: string }[])) +}) + +router.get('/:id', async (req, res, next) => { + if (!reqSessionAuthenticated(req)?.user.adminMode) throw httpError(403) + const site = await getSite(req.params.id) + if (!site) throw httpError(404) + prepareFullSite(req, site) + res.send(site) +}) diff --git a/api/src/sites/service.ts b/api/src/sites/service.ts new file mode 100644 index 00000000..84641951 --- /dev/null +++ b/api/src/sites/service.ts @@ -0,0 +1,99 @@ +import config from '#config' +import { type Site, type SitePublic } from '#types' +import { type Request } from 'express' +import { reqSiteUrl, httpError, type Account } from '@data-fair/lib-express' +import mongo from '#mongo' +import memoize from 'memoizee' +import Debug from 'debug' + +const debugRedirectSite = Debug('redirect-site') + +export const getSiteByUrl = memoize(async (url: string) => { + const urlObj = new URL(url) + const sites = await mongo.sites.find({ host: urlObj.host }).toArray() + return sites.find(s => urlObj.pathname.startsWith(s.path ?? '')) +}, { + promise: true, + maxAge: 2000 // 2s +}) + +export const getRedirectSite = async (req: Request, redirect: string) => { + const currentSiteUrl = reqSiteUrl(req) + const currentSite = await reqSite(req) + if (redirect.startsWith(currentSiteUrl)) return currentSite + const redirectSite = await getSiteByUrl(redirect) + debugRedirectSite('redirectSite', currentSiteUrl, currentSite, redirectSite) + if (!redirectSite) throw httpError(400, `impossible to redirect to ${redirect} from ${currentSiteUrl}, no matching site found`) + if (!currentSite && ['onlyBackOffice', 'ssoBackOffice', undefined].includes(redirectSite.authMode)) { + // redirect from back-office is accepted for this site + debugRedirectSite('redirect from back-affice is accepted', redirectSite.authMode) + return redirectSite + } + if (!currentSite && redirectSite.authMode === 'onlyOtherSite' && redirectSite.authOnlyOtherSite) { + // special case of double redirect from org site to another then to back-office + const otherSite = await getSiteByUrl('https://' + redirectSite.authOnlyOtherSite) + debugRedirectSite('intermediate site in onlyOtherSite mode', otherSite) + if ( + otherSite && + otherSite.owner.type === redirectSite.owner.type && otherSite.owner.id === redirectSite.owner.id && + ['onlyBackOffice', 'ssoBackOffice', undefined].includes(otherSite.authMode) + ) { + // redirect from this site is accepted + debugRedirectSite('accept redirect based on intermediate site') + return redirectSite + } + } + if ( + currentSite && + currentSite.owner.type === redirectSite.owner.type && currentSite.owner.id === redirectSite.owner.id && + redirectSite.authMode === 'onlyOtherSite' && redirectSite.authOnlyOtherSite === currentSite.host + (currentSite.path ?? '') + ) { + // redirect from this site is accepted + debugRedirectSite('accept redirect in onlyOtherSite mode') + return redirectSite + } + debugRedirectSite('reject redirect') + throw httpError(400, `impossible to redirect to ${redirect} from ${currentSiteUrl}`) +} + +export const reqSite = async (req: Request): Promise => { + const siteUrl = reqSiteUrl(req) + if (siteUrl && !config.publicUrl.startsWith(siteUrl) && siteUrl !== `http://simple-directory:${config.port}` && !(process.env.NODE_ENV === 'production' && siteUrl === `http://localhost:${config.port}`)) { + if (!config.manageSites) throw httpError(400, `multi-sites not supported by this install of simple-directory, url=${siteUrl}, declared url=${config.publicUrl}`) + const site = await getSiteByUrl(siteUrl) + if (!site) throw httpError(404, 'unknown site') + return site + } +} + +export async function findOwnerSites (owner: Account) { + const filter: any = { 'owner.type': owner.type, 'owner.id': owner.id } + if (owner.department) filter['owner.department'] = owner.department + const sites = await mongo.sites.find(filter).limit(10000) + .project({ host: 1, theme: 1, logo: 1, reducedPersonalInfoAtCreation: 1, tosMessage: 1, authMode: 1, authOnlyOtherSite: 1 }) + .toArray() + return { + count: sites.length, + results: sites as SitePublic[] + } +} + +export async function findAllSites () { + const sites = await mongo.sites.find().limit(10000).toArray() + return { + count: sites.length, + results: sites + } +} + +export async function getSite (siteId: string) { + return mongo.sites.findOne({ _id: siteId }) +} + +export async function patchSite (patch: Partial & Pick, createIfMissing = false) { + return (await mongo.sites.findOneAndUpdate({ _id: patch._id }, { $set: patch }, { upsert: createIfMissing, returnDocument: 'after' })) as Site +} + +export async function deleteSite (siteId: string) { + await mongo.sites.deleteOne({ _id: siteId }) +} diff --git a/api/src/storages/file.ts b/api/src/storages/file.ts new file mode 100644 index 00000000..6a3fd73b --- /dev/null +++ b/api/src/storages/file.ts @@ -0,0 +1,298 @@ +import { resolve } from 'node:path' +import type { FindMembersParams, FindOrganizationsParams, FindUsersParams, SdStorage } from './interface.ts' +import type { FileParams } from '../../config/type/index.ts' +import config from '#config' +import userName from '../utils/user-name.ts' +import type { Member, Organization, Partner, User, UserWritable, ServerSession, Site } from '#types' +import { readFileSync, existsSync } from 'node:fs' +import type { Password } from '../utils/passwords.ts' +import type { PatchMemberBody } from '#doc/organizations/patch-member-req/index.ts' +import type { OrganizationPost } from '#doc/organizations/post-req/index.ts' +import type { UserRef } from '@data-fair/lib-express' +import type { TwoFA } from '#services' +import mongo from '#mongo' + +type StoredOrganization = Omit & { members: { id: string, role: string, department?: string }[] } + +function applySelect (resources: Record, select?: string[]) { + if (!select || !select.length) return resources + return resources.map((resource: Record) => select.reduce((r, key) => { r[key] = resource[key]; return r }, {} as Record)) +} + +function getUserOrgas (organizations: StoredOrganization[], user: User) { + const userOrgas = [] + for (const orga of organizations) { + for (const member of orga.members) { + if (member.id === user.id) { + userOrgas.push({ + ...member, + id: orga.id, + name: orga.name + }) + } + } + } + return userOrgas +} + +function sortCompare (sort: Record) { + return function (a: Record, b: Record) { + for (const key of Object.keys(sort || {})) { + if (a[key] > b[key]) return sort[key] + if (a[key] < b[key]) return sort[key] * -1 + } + return 0 + } +} + +class FileStorage implements SdStorage { + private users: Omit[] + private organizations: StoredOrganization[] + + constructor (params: FileParams, org?: Organization) { + if (org) throw new Error('file storage is not compatible with per-org storage') + const newUsersPath = resolve(import.meta.dirname, '../../..', params.users) + const oldUsersPath = '/webapp/data/users.json' + if (existsSync(oldUsersPath)) { + console.error(`WARNING: found a users file at deprecated path ${oldUsersPath}, please use new path ${newUsersPath}`) + this.users = JSON.parse(readFileSync(oldUsersPath, 'utf-8')) + } else { + this.users = JSON.parse(readFileSync(newUsersPath, 'utf-8')) + } + for (const user of this.users) { + user.name = userName(user) + } + + const newOrgsPath = resolve(import.meta.dirname, '../../..', params.organizations) + const oldOrgsPath = '/webapp/data/organizations.json' + if (existsSync(oldOrgsPath)) { + console.error(`WARNING: found a organizations file at deprecated path ${oldOrgsPath}, please use new path ${newOrgsPath}`) + this.organizations = JSON.parse(readFileSync(oldOrgsPath, 'utf-8')) + } else { + this.organizations = JSON.parse(readFileSync(newOrgsPath, 'utf-8')) + } + for (const orga of this.organizations) { + orga.members = orga.members || [] + orga.departments = orga.departments || [] + } + } + + readonly = true + + async init () { + return this + } + + cleanUser (user: any): User { + const res = { ...user, organizations: getUserOrgas(this.organizations, user) } + delete res.password + res.isAdmin = config.admins.includes(res.email) + return res + } + + cleanOrga (org: StoredOrganization): Organization { + return { ...org, members: undefined } + } + + async getUser (id: string) { + // Find user by strict equality of properties passed in filter + const user = this.users.find(u => u.id === id) as User | undefined + if (!user) return + user.sessions = (await mongo.fileUserSessions.findOne({ _id: user.id }))?.sessions + return this.cleanUser(user) + } + + async getUserByEmail (email: string) { + // Case insensitive comparison + const user = this.users.find(u => u.email.toLowerCase() === email.toLowerCase()) as User | undefined + if (!user) return + user.sessions = (await mongo.fileUserSessions.findOne({ _id: user.id }))?.sessions + return this.cleanUser(user) + } + + async getPassword (userId: string) { + // Case insensitive comparison + const user = this.users.find(u => u.id === userId) + return user?.password as Password + } + + async addUserSession (userId: string, serverSession: ServerSession): Promise { + await mongo.fileUserSessions.updateOne({ _id: userId }, { $push: { sessions: serverSession } }, { upsert: true }) + } + + async deleteUserSession (userId: string, serverSessionId: string): Promise { + await mongo.fileUserSessions.updateOne({ _id: userId }, { $pull: { sessions: { id: serverSessionId } } }) + } + + async findUsers (params: FindUsersParams) { + let filteredUsers = this.users.map(user => this.cleanUser(user)) + const ids = params.ids + if (ids?.length) { + filteredUsers = filteredUsers.filter(user => ids.find(id => user.id === id)) + } + if (params.q) { + const lq = params.q.toLowerCase() + filteredUsers = filteredUsers.filter(user => user.name.toLowerCase().indexOf(lq) >= 0) + } + + filteredUsers = applySelect(filteredUsers, params.select) + + return { + count: filteredUsers.length, + results: filteredUsers.sort(sortCompare(params.sort)).slice(params.skip, params.skip + params.size) + } + } + + async findMembers (organizationId: string, params: FindMembersParams) { + const orga = this.organizations.find(o => o.id === organizationId) + if (!orga) throw Error('unknown organization ' + organizationId) + let members: Member[] = (orga.members ?? []).map(m => { + const user = this.users.find(u => u.id === m.id) + if (!user) throw Error('unknown user as member ' + m.id) + return { ...m, name: user.name, email: user.email, host: user.host, emailConfirmed: user.emailConfirmed, plannedDeletion: user.plannedDeletion } + }) + if (params.q) { + const lq = params.q.toLowerCase() + members = members.filter(member => member.name.toLowerCase().indexOf(lq) >= 0) + } + const ids = params.ids + if (ids?.length) { + members = members.filter(member => ids.includes(member.id)) + } + const roles = params.roles + if (roles?.length) { + members = members.filter(member => roles.includes(member.role)) + } + const departments = params.departments + if (departments?.length) { + members = members.filter(member => { + for (const dep of departments) { + if (dep === '-' && !member.department) return true + if (dep === member.department) return true + } + return false + }) + } + for (const member of members.filter(m => m.department)) { + const dep = orga.departments && orga.departments.find(d2 => d2.id === member.department) + if (dep) member.departmentName = dep.name + } + return { + count: members.length, + results: members.sort(sortCompare(params.sort)).slice(params.skip, params.skip + params.size) + } + } + + async getOrganization (id: string) { + const orga = this.organizations.find(o => o.id === id) + if (!orga) return null + const cloneOrga = JSON.parse(JSON.stringify(orga)) + delete cloneOrga.members + return cloneOrga + } + + async findOrganizations (params: FindOrganizationsParams) { + let filteredOrganizations = this.organizations.map(orga => this.cleanOrga(orga)) + // For convenience in the files the members are stored in the organizations + // But the actual model exposed is the contrary + const ids = params.ids + if (ids?.length) { + filteredOrganizations = filteredOrganizations.filter(organization => ids.find(id => organization.id === id)) + } + if (params.q) { + const lq = params.q.toLowerCase() + filteredOrganizations = filteredOrganizations.filter(organization => organization.name.toLowerCase().indexOf(lq) >= 0) + } + + filteredOrganizations = applySelect(filteredOrganizations, params.select) + + return { + count: filteredOrganizations.length, + results: filteredOrganizations.sort(sortCompare(params.sort)).slice(params.skip, params.skip + params.size) + } + } + + async required2FA (user: User) { + if (user.isAdmin && config.admins2FA) return true + return false + } + + async get2FA (userId: string) { + return undefined + } + + createUser (user: UserWritable, byUser?: { id: string; name: string }, site?: Site): Promise { + throw new Error('Method not implemented.') + } + + updateLogged (userId: string): Promise { + throw new Error('Method not implemented.') + } + + confirmEmail (userId: string): Promise { + throw new Error('Method not implemented.') + } + + deleteUser (userId: string): Promise { + throw new Error('Method not implemented.') + } + + patchUser (userId: string, patch: any, byUser?: { id: string; name: string }): Promise { + throw new Error('Method not implemented.') + } + + findInactiveUsers (): Promise { + throw new Error('Method not implemented.') + } + + findUsersToDelete (): Promise { + throw new Error('Method not implemented.') + } + + createOrganization (org: OrganizationPost, user: UserRef): Promise { + throw new Error('Method not implemented.') + } + + patchOrganization (orgId: string, patch: any, user: UserRef): Promise { + throw new Error('Method not implemented.') + } + + deleteOrganization (orgId: string): Promise { + throw new Error('Method not implemented.') + } + + checkPassword? (userId: string, password: string): Promise { + throw new Error('Method not implemented.') + } + + set2FA (userId: string, twoFA: TwoFA): Promise { + throw new Error('Method not implemented.') + } + + addMember (orga: Organization, user: UserRef, role: string, department?: string | null, readOnly?: boolean): Promise { + throw new Error('Method not implemented.') + } + + removeMember (orgId: string, userId: string, department?: string): Promise { + throw new Error('Method not implemented.') + } + + patchMember (orgId: string, userId: string, department: string | null | undefined, patch: PatchMemberBody): Promise { + throw new Error('Method not implemented.') + } + + addPartner (orgId: string, partner: Partner): Promise { + throw new Error('Method not implemented.') + } + + deletePartner (orgId: string, partnerId: string): Promise { + throw new Error('Method not implemented.') + } + + validatePartner (orgId: string, partnerId: string, partner: Organization): Promise { + throw new Error('Method not implemented.') + } +} + +export const init = async (params: FileParams, org?: Organization) => new FileStorage(params, org).init() +export const readonly = true diff --git a/api/src/storages/index.ts b/api/src/storages/index.ts new file mode 100644 index 00000000..59474e73 --- /dev/null +++ b/api/src/storages/index.ts @@ -0,0 +1,85 @@ +import type { Organization, UserWritable } from '#types' +import config from '#config' +import mongo from '#mongo' +import type { SdStorage, SdStorageFactory } from './interface.ts' +import { nanoid } from 'nanoid' +import defaultConfig from '../../config/default.cjs' +import type { SessionState } from '@data-fair/lib-express' + +class StorageManager { + private _globalStorage?: SdStorage + get globalStorage () { + if (!this._globalStorage) throw new Error('globalStorage was not initialized') + return this._globalStorage + } + + async init () { + const storage = await this.createStorage(config.storage.type, config.storage[config.storage.type]) + + // Create admins and their orga at startup + if (!storage.readonly) { + if (config.adminsOrg) { + const adminsOrg = await storage.getOrganization(config.adminsOrg.id) + if (!adminsOrg) { + await storage.createOrganization(config.adminsOrg, { id: 'init', name: 'init' }) + } + } + for (const adminEmail of config.admins) { + const admin = await storage.getUserByEmail(adminEmail) + if (!admin) { + const newAdmin: UserWritable = { + email: adminEmail, + id: nanoid(), + maxCreatedOrgs: -1, + organizations: [], + emailConfirmed: true, + ignorePersonalAccount: config.onlyCreateInvited + } + if (config.adminsOrg) { + newAdmin.organizations?.push({ ...config.adminsOrg, role: 'admin' }) + } + try { + await storage.createUser(newAdmin) + } catch (err) { + console.error('Failure to create initial admin user', err) + } + } + } + } + + this._globalStorage = storage + } + + async createStorage (type: string, conf: any, org?: Organization): Promise { + const factory = (await import('./' + type + '.ts')) as SdStorageFactory + const storage = await factory.init(conf, org) + storage.readonly = factory.readonly + return storage + } + + async createOrgStorage (org: Organization): Promise { + if (!org.orgStorage?.active || !config.perOrgStorageTypes.includes(org.orgStorage.type)) return + return this.createStorage(org.orgStorage.type, { ...defaultConfig.storage[org.orgStorage.type], ...org.orgStorage.config }, org) + } + + async getSessionStorage (sessionState: SessionState) { + let storage = this.globalStorage + if (sessionState.user?.os && sessionState.organization) { + const org = await this.globalStorage.getOrganization(sessionState.organization.id) + if (org) storage = await this.createOrgStorage(org) ?? storage + } + return storage + } + + async deleteSessionById (sessionId: string) { + await mongo.users.updateOne({ 'sessions.id': sessionId }, { $pull: { sessions: { id: sessionId } } }) + await mongo.ldapUserSessions.updateOne({ 'sessions.id': sessionId }, { $pull: { sessions: { id: sessionId } } }) + await mongo.fileUserSessions.updateOne({ 'sessions.id': sessionId }, { $pull: { sessions: { id: sessionId } } }) + } +} + +const storageManager = new StorageManager() +export default storageManager + +// export const readonly = () => require('./' + config.storage.type).readonly +// export const overwrite = () => require('./' + config.storage.type).overwrite || [] diff --git a/api/src/storages/interface.ts b/api/src/storages/interface.ts new file mode 100644 index 00000000..c9c3c1f2 --- /dev/null +++ b/api/src/storages/interface.ts @@ -0,0 +1,80 @@ +import type { User, UserWritable, Organization, Site, Member, Partner, ServerSession } from '#types' +import type { OrganizationPost } from '#doc/organizations/post-req/index.ts' +import type { PatchMemberBody } from '#doc/organizations/patch-member-req/index.ts' +import type { UserRef } from '@data-fair/lib-express' +import type { TwoFA, Password } from '#services' + +export type FindMembersParams = { + q?: string, + ids?: string[], + roles?: string[], + departments?: string[], + size: number, + skip: number, + sort?: any, + emailConfirmed?: boolean +} + +export type FindOrganizationsParams = { + q?: string, + ids?: string[], + size: number, + skip: number, + sort?: any, + creator?: string, + select?: string[] +} + +export type FindUsersParams = { + q?: string, + ids?: string[], + size: number, + skip: number, + sort?: any, + select?: string[] +} + +export interface SdStorageFactory { + init(conf: any, org?: Organization): Promise + readonly?: boolean +} + +export interface SdStorage { + init(conf: any, org?: Organization): Promise + + readonly?: boolean + + findUsers (params: FindUsersParams): Promise<{ count: number, results: User[] }> + getUser(userId: string): Promise + createUser(user: UserWritable, byUser?: { id: string, name: string }, site?: Site): Promise + getUserByEmail(email: string, site?: Site): Promise + updateLogged(userId: string, serverSessionId: string | null): Promise + confirmEmail(userId: string): Promise + deleteUser(userId: string): Promise + patchUser (userId: string, patch: any, byUser?: { id: string, name: string }): Promise + findInactiveUsers (): Promise + findUsersToDelete (): Promise + addUserSession (userId: string, serverSession: ServerSession): Promise + deleteUserSession (userId: string, serverSessionId: string): Promise + + getOrganization(ordId: string): Promise + createOrganization(org: OrganizationPost, user: UserRef): Promise + findOrganizations(params: FindOrganizationsParams): Promise<{ count: number, results: Organization[] }> + patchOrganization(orgId: string, patch: any, user: UserRef): Promise + deleteOrganization(orgId: string): Promise + + getPassword?(userId: string): Promise + checkPassword?(userId: string, password: string): Promise + required2FA(user: User): Promise + get2FA(userId: string): Promise + set2FA(userId: string, twoFA: TwoFA): Promise + + addMember (orga: Organization, user: UserRef, role: string, department?: string | null, readOnly?: boolean): Promise + findMembers (organizationId: string, params: FindMembersParams): Promise<{ count: number, results: Member[] }> + removeMember (orgId: string, userId: string, department?: string): Promise + patchMember(orgId: string, userId: string, department: string | null | undefined, patch: PatchMemberBody): Promise + + addPartner (orgId: string, partner: Partner): Promise + deletePartner (orgId: string, partnerId: string): Promise + validatePartner (orgId: string, partnerId: string, partner: Organization): Promise +} diff --git a/api/src/storages/ldap.ts b/api/src/storages/ldap.ts new file mode 100644 index 00000000..0d380293 --- /dev/null +++ b/api/src/storages/ldap.ts @@ -0,0 +1,655 @@ +import type { FindMembersParams, FindOrganizationsParams, FindUsersParams, SdStorage } from './interface.ts' +import config from '#config' +import type { LdapParams, ServerSession, Site } from '#types' +import type { Organization, Partner, User, UserWritable } from '#types' +import mongo from '#mongo' +import memoize from 'memoizee' +import { promisify } from 'util' +import ldap from 'ldapjs' +import Debug from 'debug' +import { decipher } from '../utils/cipher.ts' +import type { OrganizationPost } from '#doc/organizations/post-req/index.ts' +import type { UserRef } from '@data-fair/lib-express' +import type { TwoFA } from '#services' +import userName from '../utils/user-name.ts' + +const debug = Debug('ldap') + +function sortCompare (sort: Record, propKey?: string) { + return function (a: Record, b: Record) { + if (propKey) { + a = a[propKey] + b = b[propKey] + } + for (const key of Object.keys(sort || {})) { + if (a[key] > b[key]) return sort[key] + if (a[key] < b[key]) return sort[key] * -1 + } + return 0 + } +} + +type MappingFn = (from: Record) => Record + +function buildMappingFn ( + mapping: Record, + required: string[], + multiValued: string[], + objectClass: string, + secondaryObjectClass: string | undefined, + prefixes: Record +) { + return { + from (attrs: Record) { + const result: Record = {} + Object.keys(mapping).forEach(key => { + if (attrs[mapping[key]] && attrs[mapping[key]][0]) { + const values = attrs[mapping[key]].map((v: any) => { + return (prefixes[key] || '') + v + }) + if (multiValued.includes(key)) { + result[key] = values + } else { + result[key] = values[0] + } + } else if (required.includes(key)) { + throw new Error(`${key} attribute is required, ldap attr=${mapping[key]}`) + } + }) + return result + }, + to (obj: Record) { + const entry: Record = { objectClass: secondaryObjectClass ? [objectClass, secondaryObjectClass] : objectClass } + Object.keys(mapping).forEach(key => { + if (obj[key] && (!multiValued.includes(key) || obj[key].length) && !entry[mapping[key]]) { + entry[mapping[key]] = obj[key] && obj[key].replace(prefixes[key] || '', '') + } else if (required.includes(key)) { + throw new Error(`${key} attribute is required`) + } + }) + return entry + }, + filter (obj: Record, objectClass: string, extraFilters: any[] = []) { + const filters = [new ldap.EqualityFilter({ attribute: 'objectClass', value: objectClass })] + Object.keys(obj) + .filter(key => !!obj[key]) + .filter(key => !!mapping[key]) + .forEach(key => { + filters.push(new ldap.EqualityFilter({ attribute: mapping[key], value: obj[key].replace(prefixes[key] || '', '') })) + }) + for (const extraFilter of extraFilters) { + filters.push(typeof extraFilter === 'string' ? ldap.parseFilter(extraFilter) : extraFilter) + } + for (const key of required) { + filters.push(new ldap.PresenceFilter({ attribute: mapping[key] })) + } + if (filters.length === 1) return filters[0] + return new ldap.AndFilter({ filters }) + } + } +} + +export class LdapStorage implements SdStorage { + readonly?: boolean | undefined + + private ldapParams: LdapParams + private org: Organization | undefined + private userMapping: ReturnType + private _orgMapping: ReturnType | undefined + + private get orgMapping () { + if (!this._orgMapping) throw new Error('ldap not configured to run in multi-organizations mode') + return this._orgMapping + } + + constructor (params: LdapParams, org?: Organization) { + this.ldapParams = params + this.org = org + console.log('Connecting to ldap ' + params.url) + // check connexion at startup + + const prefixes: Record = org ? { id: `ldap_${org.id}_` } : {} + this.userMapping = buildMappingFn( + this.ldapParams.users.mapping, + ['email'], + [], + this.ldapParams.users.objectClass, + undefined, + prefixes + ) + if (!this.org) { + this._orgMapping = buildMappingFn( + this.ldapParams.organizations.mapping, + ['id'], + [], + this.ldapParams.organizations.objectClass, + this.ldapParams.members.organizationAsDC ? 'dcObject' : undefined, + {} + ) + } + } + + async init () { + await this.withClient(async () => {}) + return this + } + + private async withClient (fn: (client: ldap.Client) => Promise) { + const client = ldap.createClient({ url: this.ldapParams.url, timeout: 4000 }) + client.on('error', err => console.error(err.message)) + + const bind = promisify(client.bind).bind(client) + const unbind = promisify(client.unbind).bind(client) + + if (this.ldapParams.searchUserDN && this.ldapParams.searchUserPassword) { + debug('bind service account', this.ldapParams.url, this.ldapParams.searchUserDN) + await bind(this.ldapParams.searchUserDN, decipher(this.ldapParams.searchUserPassword as any)) + } else { + console.warn('No ldap search user credentials configured, proceed without binding a service account') + } + try { + return await fn(client) + } finally { + await unbind() + } + } + + _getAllUsers = memoize(async (client) => { + const attributes = Object.values(this.ldapParams.users.mapping) + const extraFilters: any[] = [...(this.ldapParams.users.extraFilters || [])] + if (this.ldapParams.members.role.attr) { + attributes.push(this.ldapParams.members.role.attr) + } + if (this.ldapParams.members.onlyWithRole) { + extraFilters.push(this._getRoleFilter(Object.keys(this.ldapParams.members.role.values ?? {}))) + } + const res = await this._search( + client, + this.ldapParams.baseDN, + this.userMapping.filter({}, this.ldapParams.users.objectClass, extraFilters), + attributes, + this.userMapping.from + ) + return res + }, { maxAge: config.storage.ldap.cacheMS }) // 5 minutes cache + + // promisified search + async _search (client: ldap.Client, base: string, filter: any, attributes: string[], mappingFn: MappingFn) { + const results = await new Promise((resolve, reject) => { + client.search(base, { + filter, + attributes: attributes.filter(key => !!key), + scope: 'sub', + paged: true + }, (err, res) => { + if (err) return reject(err) + const results: any[] = [] + res.on('searchEntry', (entry) => { + const attrs: Record = {} + entry.attributes.forEach(attr => { + const values = typeof attr.values === 'string' ? [attr.values] : attr.values + attrs[attr.type] = values.map(v => v.toString()) + }) + try { + results.push({ entry, attrs, item: mappingFn(attrs) }) + } catch (err: any) { + debug(err.message, entry) + } + }) + res.on('error', (err: any) => { + if (err.lde_message && err.lde_message === 'No Such Object') { + return resolve([]) + } + debug('reject search query', err) + reject(err) + }) + res.on('end', () => resolve(results)) + }) + }) + + debug(`search results + - base: ${base} + - filter: ${filter} + - attributes: ${JSON.stringify(attributes)} + - nb results: ${results.length} + - first result: `, results[0]) + return { + count: results.length, + fullResults: results as { entry: ldap.SearchEntry, attrs: Record, item: T }[], + results: results + .map(result => result.item) as T[] + } + } + + private userDN (user: Pick) { + const entry = this.userMapping.to(user) + const dnKey = this.ldapParams.users.dnKey + if (!entry[dnKey]) throw new Error(`La clé ${dnKey} est obligatoire`) + if (this.ldapParams.organizations.staticSingleOrg || this.org) { + return `${dnKey}=${entry[dnKey]}, ${this.ldapParams.baseDN}` + } else if (this.ldapParams.members.organizationAsDC) { + if (!user.organizations || !user.organizations.length) { + throw new Error('L\'utilisateur doit être associé à une organisation dès la création') + } + const orgEntry = this.orgMapping.to(user.organizations[0]) + const orgDNKey = this.ldapParams.organizations.dnKey + if (!orgEntry[orgDNKey]) throw new Error(`La clé ${orgDNKey} est obligatoire dans l'organisation`) + return `${dnKey}=${entry[dnKey]}, ${orgDNKey}=${orgEntry[orgDNKey]}, ${this.ldapParams.baseDN}` + } else { + return `${dnKey}=${entry[dnKey]}, ${this.ldapParams.baseDN}` + } + } + + private orgDN (org: { id: string }) { + const entry = this.orgMapping.to(org) + const dnKey = this.ldapParams.organizations.dnKey + if (!entry[dnKey]) throw new Error(`La clé ${dnKey} est obligatoire`) + return `${dnKey}=${entry[dnKey]},${this.ldapParams.baseDN}` + } + + async _setUserOrg (client: ldap.Client, user: User, entry: ldap.SearchEntry, attrs: Record, orgCache: Record = {}) { + let org: { id: string, name: string, department?: string } | undefined + if (this.ldapParams.organizations.staticSingleOrg) { + org = this.ldapParams.organizations.staticSingleOrg + } else if (this.org) { + org = { id: this.org.id, name: this.org.name } + } else if (this.ldapParams.members.organizationAsDC) { + const dn = ldap.parseDN(entry.dn.toString()) + dn.shift() + const orgDC = dn.shift().toString().replace('dc=', '') + orgCache[orgDC] = orgCache[orgDC] || await this._getOrganization(client, orgDC) + org = orgCache[orgDC] + } else { + // TODO + } + + if (org) { + let role + if (this.ldapParams.members.role.attr) { + const ldapRoles = attrs[this.ldapParams.members.role.attr] + if (ldapRoles) { + role = Object.keys(this.ldapParams.members.role.values ?? {}) + .find(role => !!ldapRoles.find((ldapRole: string) => this.ldapParams.members.role.values?.[role].includes(ldapRole))) + } + } + let overwrite + if ((this.ldapParams.overwrite || []).includes('members')) { + overwrite = await mongo.ldapMembersOverwrite.findOne({ orgId: org.id, userId: user.id }) + } + overwrite = overwrite || (this.ldapParams.members.overwrite || []) + .find(o => (o.orgId === org.id || !o.orgId) && o.email?.toLowerCase() === user.email?.toLowerCase()) + + role = (overwrite && overwrite.role) || role || this.ldapParams.members.role.default + const department = overwrite ? overwrite.department : org.department + user.organizations = [{ ...org, role, department }] + } + } + + async _getUser (filter: any, onlyItem = true) { + debug('search single user', filter) + const attributes = Object.values(this.ldapParams.users.mapping) + if (this.ldapParams.members.role.attr) attributes.push(this.ldapParams.members.role.attr) + return this.withClient<{ user: User, entry: ldap.SearchEntry } | undefined>(async (client) => { + const res = await this._search( + client, + this.ldapParams.baseDN, + this.userMapping.filter(filter, this.ldapParams.users.objectClass, this.ldapParams.users.extraFilters), + attributes, + this.userMapping.from + ) + if (!res.results[0]) return + const user = { ...res.results[0] } + await this._setUserOrg(client, user, res.fullResults[0].entry, res.fullResults[0].attrs) + const overwrite = (this.ldapParams.users.overwrite || []).find(o => o.email?.toLowerCase() === user.email?.toLowerCase()) + if (overwrite) Object.assign(user, overwrite) + if (this.org) user.orgStorage = true + if (onlyItem) { + user.sessions = (await mongo.ldapUserSessions.findOne({ _id: user.id }))?.sessions + } + user.isAdmin = config.admins.includes(user.email) + return { ...res.fullResults[0], user } + }) + } + + async getUser (id: string) { + return (await this._getUser({ id }))?.user + } + + async getUserByEmail (email: string) { + return (await this._getUser({ email }))?.user + } + + async checkPassword (id: string, password: string) { + const user = await this._getUser({ id }, false) + if (!user) return false + const dn = user.entry.dn.toString() + if (!dn) return false + + const client = ldap.createClient({ url: this.ldapParams.url, reconnect: false, timeout: 4000 }) + const bind = promisify(client.bind).bind(client) + try { + debug('try to bind user', dn) + await bind(dn, password) + return true + } catch (err) { + debug('auth failure', id, err) + return false + } finally { + client.unbind() + } + } + + async addUserSession (userId: string, serverSession: ServerSession): Promise { + await mongo.ldapUserSessions.updateOne({ _id: userId }, { $push: { sessions: serverSession } }, { upsert: true }) + } + + async deleteUserSession (userId: string, serverSessionId: string): Promise { + await mongo.ldapUserSessions.updateOne({ _id: userId }, { $pull: { sessions: { id: serverSessionId } } }) + } + + // ids, q, sort, select, skip, size + async findUsers (params: FindUsersParams) { + debug('find users', params) + return this.withClient(async (client) => { + let fullresults = (await this._getAllUsers(client)).fullResults + let results: User[] = [] + + const orgCache = {} + for (let i = 0; i < fullresults.length; i++) { + const user = fullresults[i].item + await this._setUserOrg(client, user, fullresults[i].entry, fullresults[i].attrs, orgCache) + const overwrite = (this.ldapParams.users.overwrite || []).find(o => o.email === user.email) + if (overwrite) Object.assign(user, overwrite) + // email is implicitly confirmed in ldap mode + user.emailConfirmed = true + results.push(user) + } + const ids = params.ids + if (ids) { + results = results.filter(user => ids.find(id => user.id === id)) + } + if (params.q) { + const lq = params.q.toLowerCase() + results = results.filter(user => user.name.toLowerCase().indexOf(lq) >= 0) + fullresults = fullresults.filter(result => result.item.name.toLowerCase().indexOf(lq) >= 0) + } + fullresults.sort(sortCompare(params.sort, 'item')) + results.sort(sortCompare(params.sort)) + const count = fullresults.length + const skip = params.skip || 0 + const size = params.size || 20 + results = results.slice(skip, skip + size) + return { count, results } + }) + } + + private _getRoleFilter (roles: string[]) { + let roleAttrValues: string[] = [] + roles.forEach(role => { + roleAttrValues = roleAttrValues.concat(this.ldapParams.members.role.values?.[role] || (role === this.ldapParams.members.role.default ? [] : [role])) + }) + if (roleAttrValues.length) { + const roleAttrFilters = roleAttrValues.map(value => new ldap.EqualityFilter({ attribute: this.ldapParams.members.role.attr as string, value })) + if (roleAttrFilters.length > 1) { + // roleFilter = `(|${roleAttrFilters.join('')})` + return new ldap.OrFilter({ filters: roleAttrFilters }) + } else { + return roleAttrFilters[0] + } + } + } + + async findMembers (organizationId: string, params: FindMembersParams) { + debug('find members', params) + const users = (await this.findUsers({ ...params, sort: null, skip: 0, size: 10000 })).results + let members = users + .filter(user => user.organizations.find(o => o.id === organizationId)) + .map(user => { + const userOrga = user.organizations.find(o => o.id === organizationId) + if (!userOrga) throw new Error('impossible error') + return { + id: user.id, + name: user.name, + email: user.email, + role: userOrga.role, + department: userOrga.department, + emailConfirmed: true + } + }) + const roles = params.roles + if (roles?.length) { + members = members.filter(member => roles.includes(member.role)) + } + const deps = params.departments + if (deps?.length) { + members = members.filter(member => member.department && deps.includes(member.department)) + } + members.sort(sortCompare(params.sort)) + const count = members.length + const skip = params.skip || 0 + const size = params.size || 20 + members = members.slice(skip, skip + size) + return { + count, + results: members + } + } + + async addMember (orga: Organization, user: User, role: string, department: string) { + if (!(this.ldapParams.overwrite || []).includes('members')) throw new Error('ldap members overwrite not supported') + await mongo.ldapMembersOverwrite.replaceOne( + { orgId: orga.id, userId: user.id }, + { orgId: orga.id, department, userId: user.id, role }, + { upsert: true } + ) + } + + async patchMember (orgId: string, userId: string, department = null, patch: any) { + if (!(this.ldapParams.overwrite || []).includes('members')) throw new Error('ldap members overwrite not supported') + await mongo.ldapMembersOverwrite.replaceOne( + { orgId, userId }, + { ...patch, orgId, userId }, + { upsert: true } + ) + } + + async removeMember (orgId: string, userId: string) { + if (!(this.ldapParams.overwrite || []).includes('members')) throw new Error('ldap members overwrite not supported') + await mongo.ldapMembersOverwrite + .deleteOne({ orgId, userId }) + } + + async _getOrganization (client: ldap.Client, id: string) { + let org: Organization | undefined + if (this.ldapParams.organizations.staticSingleOrg) { + if (this.ldapParams.organizations.staticSingleOrg.id === id) { + org = this.ldapParams.organizations.staticSingleOrg + } + } else { + const res = await this._search( + client, + this.ldapParams.baseDN, + this.orgMapping.filter({ id }, this.ldapParams.organizations.objectClass, this.ldapParams.organizations.extraFilters), + Object.values(this.ldapParams.organizations.mapping), + this.orgMapping.from + ) + org = res.results[0] + } + if (org) { + let overwrite + if ((this.ldapParams.overwrite || []).includes('organizations') || (this.ldapParams.overwrite || []).includes('departments')) { + overwrite = await mongo.ldapOrganizationsOverwrite.findOne({ id: org.id }) + } + overwrite = overwrite || (this.ldapParams.organizations.overwrite || []).find(o => (o.id === org.id)) + if (overwrite) Object.assign(org, overwrite) + org.departments = org.departments || [] + } + return org as Organization + } + + async getOrganization (id: string) { + return this.withClient(async (client) => { + return this._getOrganization(client, id) + }) + } + + async findOrganizations (params: FindOrganizationsParams) { + debug('find orgs', params) + if (this.ldapParams.organizations.staticSingleOrg) { + return { + count: 1, + results: [this.ldapParams.organizations.staticSingleOrg] + } + } + const extraFilters = [...(this.ldapParams.organizations.extraFilters || [])] + return this.withClient(async (client) => { + const res = await this._search( + client, + this.ldapParams.baseDN, + this.orgMapping.filter({ q: params.q }, this.ldapParams.organizations.objectClass, extraFilters), + Object.values(this.ldapParams.organizations.mapping), + this.orgMapping.from + ) + res.results.sort(sortCompare(params.sort)) + return { count: res.count, results: res.results } + }) + } + + async patchOrganization (id: string, patch: any, user: UserRef) { + if (!((this.ldapParams.overwrite || []).includes('organizations') || (this.ldapParams.overwrite || []).includes('departments'))) { + throw new Error('ldap organizations overwrite not supported') + } + patch.updated = { id: user.id, name: user.name, date: new Date() } + patch.id = id + await mongo.ldapOrganizationsOverwrite.findOneAndUpdate( + { id }, + { $set: patch }, + { upsert: true } + ) + return await this.getOrganization(id) + } + + async required2FA (user: User) { + if (user.isAdmin && config.admins2FA) return true + return false + } + + async get2FA (userId: string) { + return undefined + } + + // WARNING: the following is used only in tests as ldap storage is always readonly + // except for the overwritten properties stored in mongo + + async _createUser (user: Omit & { password?: string }) { + const entry = this.userMapping.to({ ...user, lastName: user.lastName || 'missing', name: userName(user) }) + if (user.password) entry.userPassword = user.password + const dn = this.userDN(user) + if (user.organizations.length && this.ldapParams.members.role.attr) { + const roleValues = this.ldapParams.members.role.values?.[user.organizations[0].role] + const roleValue = roleValues?.[0] + entry[this.ldapParams.members.role.attr] = roleValue || this.ldapParams.members.role.default + } + + debug('add user to ldap', dn, entry) + await this.withClient(async (client) => { + const add = promisify(client.add).bind(client) + await add(dn, entry) + }) + return user + } + + async _deleteUser (id: string) { + const user = await this._getUser({ id }, false) + if (!user) { + debug('delete user not found') + return + } + const dn = user.entry.objectName as string + debug('delete user from ldap', dn) + await this.withClient(async (client) => { + const del = promisify(client.del).bind(client) + await del(dn) + }) + } + + async _createOrganization (org: Organization) { + const entry = this.orgMapping.to(org) + const dn = this.orgDN(org) + + // dc is in the dn string, not as an attribute + delete entry.dc + + debug('add org to ldap', dn, entry) + await this.withClient(async (client) => { + const add = promisify(client.add).bind(client) + await add(dn, entry) + }) + return org + } + + async _deleteOrganization (id: string) { + const dn = this.orgDN({ id }) + debug('delete org from ldap', dn) + await this.withClient(async (client) => { + const del = promisify(client.del).bind(client) + await del(dn) + }) + } + + createUser (user: UserWritable, byUser?: { id: string; name: string }, site?: Site): Promise { + throw new Error('Method not implemented.') + } + + updateLogged (userId: string): Promise { + throw new Error('Method not implemented.') + } + + confirmEmail (userId: string): Promise { + throw new Error('Method not implemented.') + } + + deleteUser (userId: string): Promise { + throw new Error('Method not implemented.') + } + + patchUser (userId: string, patch: any, byUser?: { id: string; name: string }): Promise { + throw new Error('Method not implemented.') + } + + findInactiveUsers (): Promise { + throw new Error('Method not implemented.') + } + + findUsersToDelete (): Promise { + throw new Error('Method not implemented.') + } + + createOrganization (org: OrganizationPost, user: UserRef): Promise { + throw new Error('Method not implemented.') + } + + deleteOrganization (orgId: string): Promise { + throw new Error('Method not implemented.') + } + + set2FA (userId: string, twoFA: TwoFA): Promise { + throw new Error('Method not implemented.') + } + + addPartner (orgId: string, partner: Partner): Promise { + throw new Error('Method not implemented.') + } + + deletePartner (orgId: string, partnerId: string): Promise { + throw new Error('Method not implemented.') + } + + validatePartner (orgId: string, partnerId: string, partner: Organization): Promise { + throw new Error('Method not implemented.') + } +} + +export const init = async (params: LdapParams, org?: Organization) => new LdapStorage(params, org).init() +export const readonly = true +export const overwrite = config.storage.ldap.overwrite diff --git a/api/src/storages/mongo.ts b/api/src/storages/mongo.ts new file mode 100644 index 00000000..18e7f4ca --- /dev/null +++ b/api/src/storages/mongo.ts @@ -0,0 +1,479 @@ +import type { UserWritable, User, Organization, Member, Partner, Site, ServerSession } from '#types' +import type { SdStorage, FindMembersParams, FindOrganizationsParams, FindUsersParams } from './interface.ts' +import type { PatchMemberBody } from '#doc/organizations/patch-member-req/index.ts' +import userName from '../utils/user-name.ts' +import config from '#config' +import type { TwoFA } from '#services' +import { httpError, type UserRef } from '@data-fair/lib-express' +import { escapeRegExp } from '@data-fair/lib-utils/micro-template.js' +import mongo from '#mongo' +import type { Password } from '../utils/passwords.ts' +import dayjs from 'dayjs' +import { nanoid } from 'nanoid' +import type { OrganizationPost } from '#doc/organizations/post-req/index.ts' +import type { MatchKeysAndValues, UpdateOptions } from 'mongodb' + +const collation = { locale: 'en', strength: 1 } + +export type UserInDb = Omit & { _id: string } +export type OrgInDb = Omit & { _id: string } + +function cleanUser (resource: any): User { + resource.id = resource._id + delete resource._id + delete resource.password + if (resource['2FA']) { + delete resource['2FA'].secret + delete resource['2FA'].recovery + } + resource.isAdmin = config.admins.includes(resource.email) + return resource +} + +function cleanOrganization (resource: any): Organization { + if (resource._id) { + resource.id = resource._id + delete resource._id + } + return resource +} + +function cloneWithId (resource: T): Omit & { _id: string } { + return { ...resource, _id: resource.id, id: undefined } +} + +function prepareSelect (select?: string[]) { + if (!select) return {} + return select.reduce((a, key) => { a[key] = true; return a }, {} as Record) +} + +class MongodbStorage implements SdStorage { + readonly?: boolean | undefined + async init (params: any, org?: Organization) { + if (org) throw new Error('mongo storage is not compatible with per-org storage') + return this + } + + async getUser (userId: string) { + const user = await mongo.users.findOne({ _id: userId }) + if (!user) return + return cleanUser(user) + } + + async getUserByEmail (email: string, site?: Site) { + const filter: any = { email } + if (site) { + filter.host = site.host + filter.path = site.path + } else { + filter.host = { $exists: false } + } + const user = (await mongo.users.find(filter).collation(collation).toArray())[0] + if (!user) return + return cleanUser(user) + } + + async getPassword (userId: string) { + const user = await mongo.users.findOne({ _id: userId }) + if (user?.password) return user.password as Password + } + + async createUser (user: UserWritable, byUser: { id: string, name: string }, site?: Site) { + const name = userName(user) + byUser = byUser || { ...user, name } + const date = new Date().toISOString() + const fullUser: UserInDb = { + ...cloneWithId(user), + organizations: user.organizations ?? [], + // TODO: replace host by siteUrl ? + created: { id: byUser.id, name: byUser.name, date, host: site?.host, path: site?.path }, + updated: { id: byUser.id, name: byUser.name, date }, + name + } + + await mongo.users.replaceOne({ _id: user.id }, fullUser, { upsert: true }) + return cleanUser(fullUser) + } + + async patchUser (id: string, patch: any, byUser?: { id: string, name: string }) { + if (byUser) patch.updated = { id: byUser.id, name: byUser.name, date: new Date().toISOString() } + const unset: Record = {} + const set: any = {} + Object.entries(patch).forEach(([key, value]) => { + if (value === null) { + unset[key] = '' + } else { + set[key] = value + } + }) + const operation: any = {} + if (Object.keys(set).length) operation.$set = set + if (Object.keys(unset).length) operation.$unset = unset + const mongoRes = await mongo.users.findOneAndUpdate( + { _id: id }, + operation, + { returnDocument: 'after' } + ) + const user = cleanUser(mongoRes) + const name = userName(user) + if (name !== user.name) { + await mongo.users.findOneAndUpdate( + { _id: id }, + { $set: { name } } + ) + user.name = name + } + return user + } + + async updateLogged (id: string, serverSessionId: string | null) { + const logged = new Date().toISOString() + const mongoSet: MatchKeysAndValues = { logged } + const updateOptions: UpdateOptions = {} + if (serverSessionId) { + mongoSet['sessions.$[currentSession].lastKeepalive'] = logged + updateOptions.arrayFilters = [{ 'currentSession.id': serverSessionId }] + } + await mongo.users.updateOne( + { _id: id }, + { $set: mongoSet }, + updateOptions) + } + + async confirmEmail (id: string) { + await mongo.users.updateOne({ _id: id }, { $set: { emailConfirmed: true } }) + } + + async deleteUser (userId: string) { + await mongo.users.deleteOne({ _id: userId }) + await mongo.oauthTokens.deleteMany({ 'user.id': userId }) + } + + async addUserSession (userId: string, serverSession: ServerSession) { + await mongo.users.updateOne({ _id: userId }, { $push: { sessions: serverSession } }) + } + + async deleteUserSession (userId: string, serverSessionId: string) { + await mongo.users.updateOne({ _id: userId }, { $pull: { sessions: { id: serverSessionId } } }) + } + + async findUsers (params: FindUsersParams) { + const filter: any = {} + if (params.ids) { + filter._id = { $in: params.ids } + } + if (params.q) { + filter.$or = [ + { name: { $regex: escapeRegExp(params.q), $options: 'i' } }, + { email: { $regex: escapeRegExp(params.q), $options: 'i' } }, + { _id: params.q } + ] + } + + const [count, users] = await Promise.all([ + mongo.users.countDocuments(filter), + mongo.users + .find(filter) + .project(prepareSelect(params.select)) + .sort(params.sort) + .skip(params.skip) + .limit(params.size) + .toArray() + ]) + return { count, results: users.map(cleanUser) } + } + + async findUsersToDelete () { + return (await mongo.users + .find({ plannedDeletion: { $lt: dayjs().format('YYYY-MM-DD') } }) + .limit(10000) + .toArray()).map(cleanUser) + } + + async findInactiveUsers () { + const inactiveDelayDate = dayjs().subtract(config.cleanup.deleteInactiveDelay[0], config.cleanup.deleteInactiveDelay[1]).toDate().toISOString() + return (await mongo.users + .find({ + plannedDeletion: { $exists: false }, + $or: [ + { logged: { $lt: inactiveDelayDate } }, + { logged: { $exists: false }, 'created.date': { $lt: inactiveDelayDate } } + ] + }) + .limit(10000) + .toArray()).map(cleanUser) + } + + async findMembers (organizationId: string, params: FindMembersParams) { + const filter: any = { organizations: { $elemMatch: { id: organizationId } } } + if (params.ids && params.ids.length) { + filter._id = { $in: params.ids } + } + if (params.q) { + filter.$or = [ + { name: { $regex: escapeRegExp(params.q), $options: 'i' } }, + { email: { $regex: escapeRegExp(params.q), $options: 'i' } } + ] + } + if (params.roles && params.roles.length) { + filter.organizations.$elemMatch.role = { $in: params.roles } + } + if (params.departments && params.departments.length) { + const depOr = [] + for (const dep of params.departments) { + if (dep === '-') depOr.push({ department: { $exists: false } }) + else depOr.push({ department: dep }) + } + filter.organizations.$elemMatch.$or = depOr + } + if ('emailConfirmed' in params) { + filter.emailConfirmed = params.emailConfirmed + } + const [count, users] = await Promise.all([ + mongo.users.countDocuments(filter), + params.size === 0 + ? [] + : (await mongo.users + .find(filter) + .sort(params.sort) + .skip(params.skip || 0) + .limit(params.size || 12) + .toArray()) + ]) + const results = [] + for (const user of users) { + for (const userOrga of user.organizations) { + if (userOrga.id !== organizationId) continue + if (params.departments && params.departments.length) { + if (!params.departments.includes(userOrga.department || '-')) continue + } + const member: Member = { + id: user._id, + name: user.name, + email: user.email, + emailConfirmed: user.emailConfirmed, + host: user.host, + plannedDeletion: user.plannedDeletion, + role: userOrga.role, + department: userOrga.department, + departmentName: userOrga.departmentName, + createdAt: userOrga.createdAt, + readOnly: userOrga.readOnly + } + results.push(member) + } + } + return { count, results } + } + + async getOrganization (id: string) { + const organization = await mongo.organizations.findOne({ _id: id }) + if (!organization) return + return cleanOrganization(organization) + } + + async createOrganization (orga: OrganizationPost, user: UserRef) { + const date = new Date().toISOString() + const newOrga = { + id: orga.id || nanoid(), + created: { id: user.id, name: user.name, date }, + updated: { id: user.id, name: user.name, date }, + ...orga, + } + + await mongo.organizations.insertOne(cloneWithId(newOrga)) + return cleanOrganization(newOrga) + } + + async patchOrganization (id: string, patch: any, user: UserRef) { + patch.updated = { id: user.id, name: user.name, date: new Date().toISOString() } + const mongoRes = await mongo.organizations.findOneAndUpdate( + { _id: id }, + { $set: patch }, + { returnDocument: 'after' } + ) + const orga = cleanOrganization(mongoRes) + // also update all organizations references in users + if (patch.name || patch.departments) { + for await (const user of mongo.users.find({ organizations: { $elemMatch: { id } } })) { + for (const org of user.organizations) { + if (org.id !== id) continue + if (patch.name) org.name = patch.name + if (org.department && patch.departments) { + const department = patch.departments.find((d: any) => d.id === org.department) + // TODO: if !department means that the department was deleted. + // What to do in this case, remove the membershp entirely ? + if (department) org.departmentName = department.name + } + } + await mongo.users.updateOne({ _id: user._id }, { $set: { organizations: user.organizations } }) + } + } + return orga + } + + async deleteOrganization (organizationId: string) { + await mongo.users + .updateMany({}, { $pull: { organizations: { id: organizationId } } }) + await mongo.organizations.deleteOne({ _id: organizationId }) + } + + async findOrganizations (params: FindOrganizationsParams) { + const filter: any = {} + if (params.ids) { + filter._id = { $in: params.ids } + } + if (params.q) { + filter.$or = [ + { name: { $regex: escapeRegExp(params.q), $options: 'i' } }, + { _id: params.q } + ] + } + if (params.creator) { + filter['created.id'] = params.creator + } + + const [count, organizations] = await Promise.all([ + mongo.organizations.countDocuments(filter), + await mongo.organizations + .find(filter) + .sort(params.sort) + .project(prepareSelect(params.select)) + .skip(params.skip) + .limit(params.size) + .toArray() + ]) + return { count, results: organizations.map(cleanOrganization) } + } + + async addMember (orga: Organization, user: User, role: string, department: string | null = null, readOnly = false) { + user.organizations = user.organizations || [] + + let userOrga = user.organizations.find(o => o.id === orga.id && (o.department || null) === department) + + if (config.singleMembership && !userOrga && user.organizations.find(o => o.id === orga.id)) { + throw httpError(400, 'cet utilisateur est déjà membre de cette organisation.') + } + + if (!userOrga) { + if (department && user.organizations.find(o => o.id === orga.id && !o.department)) { + throw httpError(400, 'cet utilisateur est membre de l\'organisation parente, il ne peut pas être ajouté dans un département.') + } + if (!department && user.organizations.find(o => o.id === orga.id && o.department)) { + throw httpError(400, 'cet utilisateur est membre d\'un département, il ne peut pas être ajouté dans l\'organisation parente.') + } + userOrga = { id: orga.id, name: orga.name, role } + if (department) { + const fullDepartment = orga.departments?.find(d => d.id === department) + if (!fullDepartment) throw httpError(404, 'department not found') + userOrga.department = department + userOrga.departmentName = fullDepartment.name + } + user.organizations.push(userOrga) + } + userOrga.role = role + if (readOnly) userOrga.readOnly = readOnly + await mongo.users.updateOne( + { _id: user.id }, + { $set: { organizations: user.organizations } } + ) + } + + async countMembers (organizationId: string) { + return mongo.users.countDocuments({ 'organizations.id': organizationId }) + } + + async patchMember (organizationId: string, userId: string, department = null, patch: PatchMemberBody) { + // department is the optional department of the membership we are trying to change + // patch.department is the optional new department of the membership + + const org = await mongo.organizations.findOne({ _id: organizationId }) + if (!org) throw httpError(404, 'organisation inconnue.') + let patchDepartmentObject + if (patch.department) { + patchDepartmentObject = org.departments?.find(d => d.id === patch.department) + if (!patchDepartmentObject) throw httpError(404, 'département inconnu.') + } + const user = await mongo.users.findOne({ _id: userId }) + if (!user) throw httpError(404, 'utilisateur inconnu.') + const userOrg = user.organizations.find(o => o.id === organizationId && (o.department || null) === (department || null)) + if (!userOrg) throw httpError(404, 'information de membre inconnue.') + + // if we are switching department remove potential conflict + if ((patch.department || null) !== (department || null)) { + user.organizations = user.organizations.filter(o => { + const isConflict = o.id === organizationId && (o.department || null) === (patch.department || null) + return !isConflict + }) + } + + // apply patch + userOrg.role = patch.role + if (patchDepartmentObject) { + userOrg.department = patchDepartmentObject.id + userOrg.departmentName = patchDepartmentObject.name + } else { + delete userOrg.department + delete userOrg.departmentName + } + + if (patch.department && user.organizations.find(o => o.id === organizationId && !o.department)) { + throw httpError(400, 'cet utilisateur est membre de l\'organisation parente, il ne peut pas être ajouté dans un département.') + } + if (!patch.department && user.organizations.find(o => o.id === organizationId && o.department)) { + throw httpError(400, 'cet utilisateur est membre d\'un département, il ne peut pas être ajouté dans l\'organisation parente.') + } + + await mongo.users.updateOne( + { _id: userId }, + { $set: { organizations: user.organizations } } + ) + } + + async removeMember (organizationId: string, userId: string, department?: string) { + await mongo.users + .updateOne({ _id: userId }, { $pull: { organizations: { id: organizationId, department } } }) + } + + async required2FA (user: User) { + if (user.isAdmin && config.admins2FA) return true + for (const org of user.organizations) { + if (await mongo.organizations.findOne({ _id: org.id, '2FA.roles': org.role })) { + return true + } + } + return false + } + + async get2FA (userId: string) { + const user = await mongo.users.findOne({ _id: userId }) + if (user?.['2FA']) return user?.['2FA'] as TwoFA + } + + async set2FA (userId: string, twoFA: TwoFA) { + await mongo.users.updateOne({ _id: userId }, { $set: { '2FA': twoFA } }) + } + + async addPartner (orgId: string, partner: Partner) { + await mongo.organizations.updateOne({ _id: orgId }, { + $pull: { partners: { contactEmail: { $eq: partner.contactEmail }, id: { $exists: false } } } + }) + await mongo.organizations.updateOne({ _id: orgId }, { + $push: { partners: partner } + }) + } + + async deletePartner (orgId: string, partnerId: string) { + await mongo.organizations.updateOne({ _id: orgId }, { $pull: { partners: { partnerId } } }) + } + + async validatePartner (orgId: string, partnerId: string, partner: Organization) { + await mongo.organizations.updateOne( + { _id: orgId, 'partners.partnerId': partnerId }, + { $set: { 'partners.$.name': partner.name, 'partners.$.id': partner.id } } + ) + } +} + +export const init = async (params: any, org?: Organization) => new MongodbStorage().init(params, org) +export const readonly = config.storage.mongo.readonly diff --git a/api/src/tokens/jwk.d.ts b/api/src/tokens/jwk.d.ts new file mode 100644 index 00000000..f9afc8fc --- /dev/null +++ b/api/src/tokens/jwk.d.ts @@ -0,0 +1 @@ +declare module 'json-web-key'; diff --git a/api/src/tokens/keys-manager.ts b/api/src/tokens/keys-manager.ts new file mode 100644 index 00000000..d3c1bc06 --- /dev/null +++ b/api/src/tokens/keys-manager.ts @@ -0,0 +1,131 @@ +import config from '#config' +import mongo from '#mongo' +import { exec } from 'node:child_process' +import { promisify } from 'node:util' +import { resolve } from 'node:path' +import { readFile, access, constants } from 'node:fs/promises' +import memoize from 'memoizee' +import JSONWebKey from 'json-web-key' +import { randomUUID } from 'node:crypto' +import dayjs from 'dayjs' +import locks from '@data-fair/lib-node/locks.js' +import { cipher, decipher } from '../utils/cipher.ts' +import { internalError } from '@data-fair/lib-node/observer.js' + +type WebKey = { alg: 'RS256', kid: string, use: 'sig' } +type SignatureKeys = { privateKey: string, publicKey: string, webKeys: [WebKey, WebKey?], lastUpdate: Date } + +const execAsync = promisify(exec) + +let stopped = false +let rotatePromise: Promise | undefined + +export const start = async () => { + const existingKeys = await readSignatureKeys() + if (!existingKeys) { + console.log('Initializing signature keys') + // manage transition with old FS based persistence of keys + const existingFSKeys = await readDeprecatedSignatureKeys() + if (existingFSKeys) { + console.log('Migrating signature keys from filesystem to database') + const signatureKeys: SignatureKeys = { ...existingFSKeys, webKeys: [createWekKey(existingFSKeys.publicKey, 'simple-directory')], lastUpdate: new Date() } + await writeSignatureKeys(signatureKeys) + } else { + console.log('Generating new signature keys') + const newKeys = await createKeys() + const signatureKeys: SignatureKeys = { ...newKeys, webKeys: [createWekKey(newKeys.publicKey)], lastUpdate: new Date() } + await writeSignatureKeys(signatureKeys) + } + } + + rotateLoop() +} + +const rotateLoop = async () => { + // eslint-disable-next-line no-unmodified-loop-condition + while (!stopped) { + try { + if (await locks.acquire('signature-keys-rotation')) { + const signatureKeys = await getSignatureKeys() + if (dayjs().diff(dayjs(signatureKeys.lastUpdate), 'day') > 30) { + rotatePromise = rotateKeys() + await rotatePromise + } + await locks.release('signature-keys-rotation') + } + } catch (err) { + internalError('sign-keys-rotation', err) + } + await new Promise(resolve => setTimeout(resolve, 10 * 60 * 1000)) + } +} + +export const stop = async () => { + stopped = true + if (rotatePromise) await rotatePromise +} + +export const getSignatureKeys = memoize(async () => { + const signatureKeys = await readSignatureKeys() + if (!signatureKeys) throw new Error('signature keys were not initialized') + return signatureKeys +}, { promise: true, maxAge: 10000 }) + +const readSignatureKeys = async () => { + const secret = await mongo.secrets.findOne({ _id: 'signature-keys' }) + if (secret) { + const signatureKeys = secret.data + signatureKeys.privateKey = decipher(signatureKeys.privateKey) + return signatureKeys as SignatureKeys + } +} + +const writeSignatureKeys = async (signatureKeys: SignatureKeys) => { + const storedSignatureKeys = { ...signatureKeys } as any + storedSignatureKeys.privateKey = cipher(signatureKeys.privateKey) + await mongo.secrets.replaceOne({ _id: 'signature-keys' }, { data: storedSignatureKeys }, { upsert: true }) +} + +const readDeprecatedSignatureKeys = async () => { + const privateKeyPath = resolve(config.secret.private) + const publicKeyPath = resolve(config.secret.public) + try { + await access(privateKeyPath, constants.R_OK) + await access(publicKeyPath, constants.R_OK) + } catch (err) { + // TODO: remove this log after a few months + console.log('No deprecated signature keys found, this message is expected on a new deployment', err) + return null + } + return { + privateKey: await readFile(privateKeyPath, 'utf8'), + publicKey: await readFile(publicKeyPath, 'utf8') + } +} + +const createWekKey = (publicKey: string, kid?: string) => { + const webKey = JSONWebKey.fromPEM(publicKey) + webKey.kid = kid ?? (config.kid + '-' + randomUUID()) + webKey.alg = 'RS256' + webKey.use = 'sig' + return webKey.toJSON() as WebKey +} + +// TODO: a script to force key rotation for testing ? +export const rotateKeys = async () => { + console.log('Rotating signature keys') + const existingKeys = await readSignatureKeys() + const newKeys = await createKeys() + const webKeys: [WebKey, WebKey?] = [createWekKey(newKeys.publicKey)] + if (existingKeys) webKeys.push(existingKeys.webKeys[0]) + await writeSignatureKeys({ ...newKeys, webKeys, lastUpdate: new Date() }) +} + +const createKeys = async () => { + const privateKey = (await execAsync('openssl genpkey -algorithm RSA -pkeyopt rsa_keygen_bits:2048')).stdout + const publicPromise = execAsync('openssl rsa -outform PEM -pubout') + publicPromise.child.stdin?.write(privateKey) + publicPromise.child.stdin?.end() + const publicKey = (await publicPromise).stdout + return { privateKey, publicKey } +} diff --git a/api/src/tokens/router.ts b/api/src/tokens/router.ts new file mode 100644 index 00000000..28dde5e4 --- /dev/null +++ b/api/src/tokens/router.ts @@ -0,0 +1,10 @@ +import { Router } from 'express' +import { getSignatureKeys } from './keys-manager.ts' + +const router = Router() +export default router + +router.get('/.well-known/jwks.json', async (req, res) => { + const keys = await getSignatureKeys() + res.json({ keys: keys.webKeys }) +}) diff --git a/api/src/tokens/service.ts b/api/src/tokens/service.ts new file mode 100644 index 00000000..c71db19a --- /dev/null +++ b/api/src/tokens/service.ts @@ -0,0 +1,250 @@ +import type { SessionInfoPayload, User } from '#types' +import type { Request, Response } from 'express' +import type { OrganizationMembership, SessionState, User as SessionUser } from '@data-fair/lib-express' +import { reqSession, reqSiteUrl, session, reqSitePath, reqSessionAuthenticated, httpError } from '@data-fair/lib-express' +import eventsLog, { type EventLogContext } from '@data-fair/lib-express/events-log.js' +import { internalError } from '@data-fair/lib-node/observer.js' +import config, { jwtDurations } from '#config' +import jwt, { type SignOptions, type JwtPayload } from 'jsonwebtoken' +import Cookies from 'cookies' +import storages from '#storages' +import { getSignatureKeys } from './keys-manager.ts' +import { getRedirectSite, reqSite } from '#services' + +export const signToken = async (payload: any, exp: string | number, notBefore?: string) => { + const signatureKeys = await getSignatureKeys() + const webKey = signatureKeys.webKeys[0] + const params: SignOptions = { + algorithm: webKey.alg, + keyid: webKey.kid, + } + if (typeof exp === 'string') params.expiresIn = exp + else payload.exp = exp + if (notBefore) params.notBefore = notBefore + return jwt.sign(payload, signatureKeys.privateKey, params) +} + +export const decodeToken = (token: string) => jwt.decode(token) as JwtPayload + +export const getTokenPayload = (user: Omit) => { + const payload: SessionState['user'] = { + id: user.id, + email: user.email, + name: user.name, + organizations: (user.organizations || []).map(o => ({ ...o })) + } + if (config.admins.includes(user.email) || (config.adminCredentials?.password && config.adminCredentials?.email === user.email)) { + payload.isAdmin = 1 + } + if (user.defaultOrg) { + let defaultOrg = payload.organizations.find(o => o.id === user.defaultOrg) + if (user.defaultDep) defaultOrg = payload.organizations.find(o => o.id === user.defaultOrg && o.department === user.defaultDep) + if (defaultOrg) defaultOrg.dflt = 1 + } + if (user.ignorePersonalAccount) payload.ipa = 1 + if (user.plannedDeletion) payload.pd = user.plannedDeletion + if (user.orgStorage) payload.os = 1 + // if (user.readonly) payload.readonly = user.readonly + if (user.coreIdProvider) payload.idp = 1 + return payload +} + +export const getDefaultUserOrg = (user: User, reqOrgId?: string, reqDepId?: string) => { + if (!user.organizations || !user.organizations.length) return + if (reqOrgId) { + let reqOrg + if (reqDepId) { + reqOrg = user.organizations.find(o => o.id === reqOrgId && o.department === reqDepId) + } else { + reqOrg = user.organizations.find(o => o.id === reqOrgId && !o.department) || user.organizations.find(o => o.id === reqOrgId) + } + if (reqOrg) return reqOrg + } + if (user.defaultOrg) { + const defaultOrg = user.organizations.find(o => o.id === user.defaultOrg && (o.department || null) === (user.defaultDep || null)) + if (defaultOrg) return defaultOrg + } + if (user.ignorePersonalAccount) return user.organizations[0] +} + +const secure = config.publicUrl.startsWith('https://') + +export const logout = async (req: Request, res: Response) => { + const cookies = new Cookies(req, res, { secure }) + const sitePath = reqSitePath(req) + const opts: Cookies.SetOption = { path: sitePath + '/', expires: new Date(0) } + // use '' instead of null because instant cookie expiration is not properly applied on all safari versions + cookies.set('id_token', '', opts) + cookies.set('id_token_sign', '', { ...opts, httpOnly: true }) + cookies.set('id_token_org', '', opts) + cookies.set('id_token_dep', '', opts) + cookies.set('id_token_ex', '', { ...opts, path: sitePath + '/simple-directory/', httpOnly: true }) + + const exchangeToken = cookies.get('id_token_ex') + const sessionState = reqSession(req) + if (sessionState.user && exchangeToken) { + const storage = await storages.getSessionStorage(sessionState) + const serverSessionInfo = decodeToken(exchangeToken) as SessionInfoPayload | undefined + if (serverSessionInfo?.session) await storage.deleteUserSession(sessionState.user.id, serverSessionInfo.session) + } +} + +// Split JWT strategy, the signature is in a httpOnly cookie for XSS prevention +// the header and payload are not httpOnly to be readable by client +// all cookies use sameSite for CSRF prevention +export const setSessionCookies = async (req: Request, res: Response, payload: SessionUser, serverSessionId: string | null, userOrg?: OrganizationMembership) => { + const cookies = new Cookies(req, res, { secure }) + // cf https://www.npmjs.com/package/jsonwebtoken#token-expiration-exp-claim + const date = Date.now() + const exp = Math.floor(date / 1000) + jwtDurations.idToken + const exchangeExp = Math.floor(date / 1000) + jwtDurations.exchangeToken + const token = await signToken(payload, exp) + const parts = token.split('.') + const sitePath = reqSitePath(req) + const opts: Cookies.SetOption = { sameSite: 'lax', path: sitePath + '/' } + if (payload.rememberMe) opts.expires = new Date(exchangeExp * 1000) + cookies.set('id_token', parts[0] + '.' + parts[1], { ...opts, httpOnly: false }) + cookies.set('id_token_sign', parts[2], { ...opts, expires: new Date(exp * 1000), httpOnly: true }) + // set the same params to id_token_org cookie so that it doesn't expire before the rest + if (userOrg) { + cookies.set('id_token_org', userOrg.id, { ...opts, httpOnly: false }) + if (userOrg.department) cookies.set('id_token_dep', userOrg.department, { ...opts, httpOnly: false }) + } + + const exchangeCookieOpts = { ...opts, expires: new Date(exchangeExp * 1000), path: sitePath + '/simple-directory/', httpOnly: true } + if (serverSessionId !== null) { + const existingExchangeToken = cookies.get('id_token_ex') + const existingServerSessionInfo = existingExchangeToken && ((await session.verifyToken(existingExchangeToken)) as SessionInfoPayload | undefined) + if (existingServerSessionInfo && existingServerSessionInfo.session !== serverSessionId) { + // case of a session where id_token was cleared but id_token_ex persisted, this server sessions is deprecated and can be cleared + await storages.deleteSessionById(existingServerSessionInfo.session) + } + // const exchangeCookieOpts = { ...opts, httpOnly: true } + const exchangeExp = Math.floor(date / 1000) + jwtDurations.exchangeToken + const sessionInfo: SessionInfoPayload = { user: payload.id, session: serverSessionId, adminMode: payload.adminMode } + // case of asAdmin + if (existingServerSessionInfo && existingServerSessionInfo.adminMode && payload.id !== existingServerSessionInfo.user) { + sessionInfo.adminMode = 1 + sessionInfo.user = existingServerSessionInfo.user + } + const exchangeToken = await signToken(sessionInfo, exchangeExp) + cookies.set('id_token_ex', exchangeToken, exchangeCookieOpts) + } +} + +export const keepalive = async (req: Request, res: Response, _user?: User, removeAdminMode?: boolean) => { + const sessionState = reqSessionAuthenticated(req) + const logContext: EventLogContext = { req, account: (await reqSite(req))?.owner } + + // User may have new organizations since last renew + let org + if (sessionState.organization) { + org = await storages.globalStorage.getOrganization(sessionState.organization.id) + if (!org) { + await logout(req, res) + eventsLog.info('sd.auth.keepalive.fail', 'a user tried to prolongate a session in invalid org', logContext) + throw httpError(401, 'Organisation inexistante') + } + logContext.account = { type: 'organization', id: org.id, name: org.name, department: sessionState.organization.department, departmentName: sessionState.organization.departmentName } + } + const storage = await storages.getSessionStorage(sessionState) + const user = _user || await storage.getUser(sessionState.user.id) + if (!user) { + await logout(req, res) + eventsLog.info('sd.auth.keepalive.fail', 'a deleted user tried to prolongate a session', logContext) + throw httpError(401, 'Utilisateur inexistant') + } + + const cookies = new Cookies(req, res, { secure }) + const idTokenOrg = cookies.get('id_token_org') + const idTokenDep = cookies.get('id_token_dep') + + const exchangeToken = cookies.get('id_token_ex') + const serverSessionInfo = exchangeToken ? ((await session.verifyToken(exchangeToken)) as SessionInfoPayload | undefined) : null + if (!serverSessionInfo) { + // accept tokens signed by a key before the introduction of the exchange token (kid=simple-directory) + // const payload = decodeToken(cookies.get('id_token')) + const completeTokenInfo = jwt.decode(cookies.get('id_token') + '.' + cookies.get('id_token_sign'), { complete: true }) + if (completeTokenInfo?.header.kid === 'simple-directory') { + console.log('accept tokens signed by a key before the introduction of the exchange token') + } else { + await logout(req, res) + eventsLog.info('sd.auth.keepalive.fail', 'a user without a valid echange token tried to prolongate a session', logContext) + throw httpError(401, 'Informations de session manquantes') + } + } + if (sessionState.user.asAdmin) { + const adminUser = await storage.getUser(sessionState.user.asAdmin.id) + if (!adminUser) throw httpError(401, 'Utilisateur inexistant') + if (serverSessionInfo) { + if (serverSessionInfo.user !== adminUser.id) { + await logout(req, res) + eventsLog.info('sd.auth.keepalive.fail', 'a user in asAdmin mode with another user\'s exchange token tried to prolongate a session', logContext) + throw httpError(401, 'Informations de session manquantes') + } + const serverSession = adminUser.sessions?.find(s => s.id === serverSessionInfo.session) + if (!serverSession) { + await logout(req, res) + eventsLog.info('sd.auth.keepalive.fail', 'a user in asAdmin mode with a deleted session reference tried to prolongate a session', logContext) + throw httpError(401, 'Session interrompue') + } + } + } else { + if (serverSessionInfo) { + if (serverSessionInfo.user !== user.id) { + await logout(req, res) + eventsLog.info('sd.auth.keepalive.fail', 'a user with another user\'s exchange token tried to prolongate a session', logContext) + throw httpError(401, 'Informations de session manquantes') + } + const serverSession = user.sessions?.find(s => s.id === serverSessionInfo.session) + if (!serverSession) { + await logout(req, res) + eventsLog.info('sd.auth.keepalive.fail', 'a user with a deleted session reference tried to prolongate a session', logContext) + throw httpError(401, 'Session interrompue') + } + } + } + const serverSessionId = serverSessionInfo ? serverSessionInfo.session : null + + const payload = getTokenPayload(user) + if (sessionState.user.isAdmin && sessionState.user.adminMode && !removeAdminMode) payload.adminMode = 1 + if (sessionState.user.rememberMe) payload.rememberMe = 1 + if (sessionState.user.asAdmin) { + payload.asAdmin = sessionState.user.asAdmin + payload.name = sessionState.user.name + delete payload.isAdmin + } else { + if (!storage.readonly) { + storage.updateLogged(sessionState.user.id, serverSessionId).catch(async (err: any) => { + internalError('update-logged', 'error while updating logged date', err) + }) + } + } + let userOrg + if (idTokenOrg) { + userOrg = user.organizations.find(o => o.id === idTokenOrg && (o.department || null) === (idTokenDep ? decodeURIComponent(idTokenDep) : null)) + } + await setSessionCookies(req, res, payload, serverSessionId, userOrg) + + eventsLog.info('sd.auth.keepalive.ok', 'a session was successfully prolongated', logContext) +} + +// after validating auth (password, passwordless or oaut), we prepare a redirect to /token_callback +// this redirect is potentially on another domain, and it will do the actual set cookies with session tokens +export const prepareCallbackUrl = async (req: Request, payload: any, redirect?: string, userOrg?:Pick, orgStorage?: boolean) => { + redirect = redirect || config.defaultLoginRedirect || reqSiteUrl(req) + '/simple-directory/me' + const redirectUrl = new URL(redirect) + const redirectSite = await getRedirectSite(req, redirect) + const token = await signToken({ ...payload, temporary: true }, config.jwtDurations.initialToken) + const redirectBase = redirectSite ? (redirectUrl.protocol + redirectSite.host + (redirectSite.path ?? '') + '/simple-directory') : config.publicUrl + const tokenCallback = redirectBase + '/api/auth/token_callback' + const tokenCallbackUrl = new URL(tokenCallback) + tokenCallbackUrl.searchParams.set('id_token', token) + if (redirect) tokenCallbackUrl.searchParams.set('redirect', redirect) + if (userOrg) { + tokenCallbackUrl.searchParams.set('id_token_org', userOrg.id) + if (userOrg.department) tokenCallbackUrl.searchParams.set('id_token_dep', userOrg.department) + } + if (orgStorage) tokenCallbackUrl.searchParams.set('org_storage', 'true') + return tokenCallbackUrl +} diff --git a/api/src/ui-config.ts b/api/src/ui-config.ts new file mode 100644 index 00000000..e486f8b2 --- /dev/null +++ b/api/src/ui-config.ts @@ -0,0 +1,34 @@ +import config, { jwtDurations } from './config.ts' +import { publicMessages } from '../i18n/messages.ts' + +export const uiConfig = { + publicMessages, + jwtDurations, + readonly: config.storage.type !== 'mongo', + publicUrl: config.publicUrl, + theme: config.theme, + manageSites: config.manageSites, + i18n: config.i18n, + tosUrl: config.tosUrl, + passwordless: config.passwordless, + onlyCreateInvited: config.onlyCreateInvited, + maildev: config.maildev, + depAdminIsOrgAdmin: config.depAdminIsOrgAdmin, + anonymousContactForm: config.anonymousContactForm, + homePage: config.homePage, + alwaysAcceptInvitation: config.alwaysAcceptInvitation, + avatars: config.avatars, + manageDepartments: config.manageDepartments, + manageDepartmentLabel: config.manageDepartmentLabel, + managePartners: config.managePartners, + manageSessions: config.manageSessions, + quotas: config.quotas, + perOrgStorageTypes: config.perOrgStorageTypes, + plannedDeletionDelay: config.plannedDeletionDelay, + noBirthday: config.noBirthday, + userSelfDelete: config.userSelfDelete, + orgStorageOverwrite: config.storage.ldap.overwrite, + useEvents: Boolean(config.secretKeys.events && config.privateEventsUrl) +} +export type UiConfig = typeof uiConfig +export default uiConfig diff --git a/api/src/users/router.ts b/api/src/users/router.ts new file mode 100644 index 00000000..62010ef0 --- /dev/null +++ b/api/src/users/router.ts @@ -0,0 +1,335 @@ +import { type Organization, type UserWritable } from '#types' +import { Router, type RequestHandler } from 'express' +import config, { superadmin } from '#config' +import { reqSessionAuthenticated, mongoPagination, mongoSort, session, reqSiteUrl, reqSession, httpError } from '@data-fair/lib-express' +import eventsLog, { type EventLogContext } from '@data-fair/lib-express/events-log.js' +import { nanoid } from 'nanoid' +import eventsQueue from '#events-queue' +import { reqI18n, __all, __date } from '#i18n' +import storages from '#storages' +import mongo from '#mongo' +import emailValidator from 'email-validator' +import type { FindUsersParams } from '../storages/interface.ts' +import { validatePassword, hashPassword, unshortenInvit, reqSite, deleteIdentityWebhook, sendMail, getOrgLimits, setNbMembersLimit, getTokenPayload, getDefaultUserOrg, prepareCallbackUrl, postUserIdentityWebhook, keepalive, signToken, getRedirectSite } from '#services' + +const router = Router() + +const rejectCoreIdUser: RequestHandler = (req, res, next) => { + const session = reqSession(req) + if (session.user?.idp) throw httpError(403, 'This route is not available for users with a core identity provider') + next() +} + +// Get the list of users +router.get('', async (req, res, next) => { + const logContext: EventLogContext = { req } + const session = reqSession(req) + + const listMode = config.listUsersMode || config.listEntitiesMode + if (listMode === 'authenticated' && !session.user) return res.send({ results: [], count: 0 }) + if (listMode === 'admin' && !session.user?.adminMode) return res.send({ results: [], count: 0 }) + + const params: FindUsersParams = { ...mongoPagination(req.query), sort: mongoSort(req.query.sort) } + + // Only service admins can request to see all field. Other users only see id/name + const allFields = req.query.allFields === 'true' + if (allFields) { + if (!session.user?.adminMode) throw httpError(403, reqI18n(req).messages.errors.permissionDenied) + } else { + params.select = ['id', 'name'] + } + + if (req.query) { + if (typeof req.query.ids === 'string') params.ids = req.query.ids.split(',') + if (typeof req.query.q === 'string') params.q = req.query.q + } + const users = await storages.globalStorage.findUsers(params) + + eventsLog.info('sd.list-users', 'list users', logContext) + + res.json(users) +}) + +// TODO: block when onlyCreateInvited is true ? +router.post('', async (req, res, next) => { + const logContext: EventLogContext = { req } + + if (!req.body || !req.body.email) return res.status(400).send(reqI18n(req).messages.errors.badEmail) + if (!emailValidator.validate(req.body.email)) return res.status(400).send(reqI18n(req).messages.errors.badEmail) + + const { body, query } = (await import('#doc/users/post-req/index.ts')).returnValid(req, { name: 'req' }) + + const storage = storages.globalStorage + + // used to create a user and accept a member invitation at the same time + // if the invitation is not valid, better not to proceed with the user creation + let invit + let orga: Organization | undefined + if (query.invit_token) { + try { + invit = unshortenInvit(await session.verifyToken(query.invit_token)) + } catch (err: any) { + return res.status(400).send(err.name === 'TokenExpiredError' ? reqI18n(req).messages.errors.expiredInvitationToken : reqI18n(req).messages.errors.invalidInvitationToken) + } + orga = await storage.getOrganization(invit.id) + if (!orga) return res.status(400).send(reqI18n(req).messages.errors.orgaUnknown) + logContext.account = { type: 'organization', id: orga.id, name: orga.name, department: invit.department, departmentName: invit.departmentName } + if (invit.email !== body.email) return res.status(400).send(reqI18n(req).messages.errors.badEmail) + } else if (config.onlyCreateInvited) { + return res.status(400).send('users can only be created from an invitation') + } + + // create user + const newUser: UserWritable = { + email: body.email, + id: nanoid(), + firstName: body.firstName, + lastName: body.lastName, + emailConfirmed: false, + organizations: [] + } + const site = await reqSite(req) + if (site) newUser.host = site.host + + if (invit) { + newUser.emailConfirmed = true + newUser.defaultOrg = invit.id + if (invit.department) newUser.defaultDep = invit.department + newUser.ignorePersonalAccount = true + } + + // password is optional as we support passwordless auth + if (body.password) { + if (!validatePassword(req.body.password)) { + return res.status(400).send(reqI18n(req).messages.errors.malformedPassword) + } + newUser.password = await hashPassword(body.password) + } + + const user = await storages.globalStorage.getUserByEmail(body.email, await reqSite(req)) + + // email is already taken, send a conflict email + const link = query.redirect || config.defaultLoginRedirect || reqSiteUrl(req) + '/simple-directory' + if (user && user.emailConfirmed !== false) { + const linkUrl = new URL(link) + await sendMail('conflict', reqI18n(req).messages, body.email, { host: linkUrl.host, origin: linkUrl.origin }) + return res.status(204).send() + } + + // the user was invited in alwaysAcceptInvitations mode, but the membership was revoked + if (invit && config.alwaysAcceptInvitation && (!user || !user.organizations.find(o => o.id === orga?.id))) { + return res.status(400).send(reqI18n(req).messages.errors.invalidInvitationToken) + } + + // Re-create a user that was never validated.. first clean temporary user + if (user && user.emailConfirmed === false) { + logContext.user = user + if (user.organizations && invit) { + // This user was created empty from an invitation in 'alwaysAcceptInvitations' mode + newUser.id = user.id + newUser.organizations = user.organizations + } else { + eventsLog.info('sd.user.del-temp-user', 'temp user was deleted/recreated', logContext) + await storage.deleteUser(user.id) + } + } + + const linkSite = await getRedirectSite(req, link) + const createdUser = await storage.createUser(newUser, undefined, linkSite) + eventsLog.info('sd.user.create', 'user was created', logContext) + + if (invit && !config.alwaysAcceptInvitation && orga) { + const limits = await getOrgLimits(orga) + if (limits.store_nb_members.limit > 0 && limits.store_nb_members.consumption >= limits.store_nb_members.limit) { + return res.status(400).send(reqI18n(req).messages.errors.maxNbMembers) + } + eventsLog.info('sd.user.accept-invite', 'user accepted an invitation', logContext) + await storage.addMember(orga, createdUser, invit.role, invit.department) + eventsQueue?.pushEvent({ + sender: { type: 'organization', id: orga.id, name: orga.name, role: 'admin', department: invit.department }, + topic: { key: 'simple-directory:invitation-accepted' }, + title: __all('notifications.acceptedInvitation', { name: createdUser.name, email: createdUser.email, orgName: orga.name + (invit.department ? ' / ' + invit.department : '') }) + }) + await setNbMembersLimit(orga.id) + } + + if (invit) { + // no need to confirm email if the user already comes from an invitation link + // we already created the user with emailConfirmed=true + const payload = getTokenPayload(createdUser) + const linkUrl = await prepareCallbackUrl(req, payload, query.redirect, getDefaultUserOrg(createdUser, invit && invit.id, invit && invit.department)) + return res.send(linkUrl) + } else { + // prepare same link and payload as for a passwordless authentication + // the user will be validated and authenticated at the same time by the token_callback route + const payload = { ...getTokenPayload(createdUser), emailConfirmed: true } + const linkUrl = await prepareCallbackUrl(req, payload, query.redirect, getDefaultUserOrg(createdUser, query.org, query.dep)) + await sendMail('creation', reqI18n(req).messages, body.email, { link: linkUrl.href }) + // this route doesn't return any info to its caller to prevent giving any indication of existing accounts, etc + return res.status(204).send() + } +}) + +router.get('/:userId', async (req, res, next) => { + const session = reqSessionAuthenticated(req) + if (!session.user?.adminMode && session.user.id !== req.params.userId) throw httpError(403, reqI18n(req).messages.errors.permissionDenied) + if (session.user.id === '_superadmin') return res.send(superadmin) + let storage = storages.globalStorage + if (session.user.id === req.params.userId) { + storage = await storages.getSessionStorage(session) + } + const user = await storage.getUser(req.params.userId) + if (!user) return res.status(404).send() + res.json(user) +}) + +// Update some parts of a user as himself +const adminKeys = ['maxCreatedOrgs', 'email', '2FA'] +router.patch('/:userId', rejectCoreIdUser, async (req, res, next) => { + const logContext: EventLogContext = { req } + + const session = reqSessionAuthenticated(req) + if (!session.user?.adminMode && session.user.id !== req.params.userId) throw httpError(403, reqI18n(req).messages.errors.permissionDenied) + + const { body: patch } = (await import('#doc/users/patch-req/index.ts')).returnValid(req, { name: 'req' }) + + const adminKey = Object.keys(req.body).find(key => adminKeys.includes(key)) + if (adminKey && !session.user?.adminMode) throw httpError(403, reqI18n(req).messages.errors.permissionDenied) + + if (patch.plannedDeletion) { + if (config.userSelfDelete) { + if (!session.user?.adminMode && session.user.id !== req.params.userId) throw httpError(403, reqI18n(req).messages.errors.permissionDenied) + } else { + if (!session.user?.adminMode) throw httpError(403, reqI18n(req).messages.errors.permissionDenied) + } + } + + const patchedUser = await storages.globalStorage.patchUser(req.params.userId, patch, session.user) + + if (patchedUser.name !== session.user.name) { + postUserIdentityWebhook(patchedUser) + } + + eventsLog.info('sd.user.patch', `user was patched ${patchedUser.name} (${patchedUser.id})`, logContext) + + const link = reqSiteUrl(req) + '/simple-directory/login?email=' + encodeURIComponent(session.user.email) + if (patch.plannedDeletion) { + await sendMail('plannedDeletion', reqI18n(req).messages, session.user.email, { + link, + user: session.user.name, + plannedDeletion: __date(req, patch.plannedDeletion).format('L'), + cause: '' + }) + } + + await mongo.limits.updateOne({ type: 'user', id: patchedUser.id }, { $set: { name: patchedUser.name } }) + + // update session info + await keepalive(req, res) + + res.send(patchedUser) +}) + +router.delete('/:userId/plannedDeletion', async (req, res, next) => { + const logContext: EventLogContext = { req } + const session = reqSessionAuthenticated(req) + + if (!session.user?.adminMode && session.user.id !== req.params.userId) throw httpError(403, reqI18n(req).messages.errors.permissionDenied) + const patch = { plannedDeletion: null } + + await storages.globalStorage.patchUser(req.params.userId, patch, session.user) + + // update session info + await keepalive(req, res) + + eventsLog.info('sd.user.cancelDeletion', 'user cancelled their planned deletion', logContext) + + res.status(204).send() +}) + +router.delete('/:userId', async (req, res, next) => { + const logContext: EventLogContext = { req } + const session = reqSessionAuthenticated(req) + + if (config.userSelfDelete) { + if (!session.user?.adminMode && session.user.id !== req.params.userId) throw httpError(403, reqI18n(req).messages.errors.permissionDenied) + } else { + if (!session.user?.adminMode) throw httpError(403, reqI18n(req).messages.errors.permissionDenied) + } + + await storages.globalStorage.deleteUser(req.params.userId) + + eventsLog.info('sd.user.del', `user was deleted ${req.params.userId}`, logContext) + + deleteIdentityWebhook('user', req.params.userId) + res.status(204).send() +}) + +// Change password of a user using an action token sent in a mail +router.post('/:userId/password', rejectCoreIdUser, async (req, res, next) => { + const logContext: EventLogContext = { req } + const { body, query } = (await import('#doc/users/post-password-req/index.ts')).returnValid(req, { name: 'req' }) + + let decoded + try { + decoded = await session.verifyToken(query.action_token) + } catch (err) { + return res.status(401).send(reqI18n(req).messages.errors.invalidToken) + } + if (decoded.id !== req.params.userId) return res.status(401).send('wrong user id in token') + if (decoded.action !== 'changePassword') return res.status(401).send('wrong action for this token') + if (!validatePassword(body.password)) return res.status(400).send(reqI18n(req).messages.errors.malformedPassword) + const storedPassword = await hashPassword(body.password) + await storages.globalStorage.patchUser(req.params.userId, { password: storedPassword }) + + eventsLog.info('sd.user.change-password', `user changed password ${req.params.userId}`, logContext) + + res.status(204).send() +}) + +// Change host of a user using an action token sent in a mail +router.post('/:userId/host', rejectCoreIdUser, async (req, res, next) => { + const logContext: EventLogContext = { req } + const { body, query } = (await import('#doc/users/post-host-req/index.ts')).returnValid(req, { name: 'req' }) + + const storage = storages.globalStorage + let decoded + try { + decoded = await session.verifyToken(query.action_token) + } catch (err) { + return res.status(401).send(reqI18n(req).messages.errors.invalidToken) + } + if (decoded.id !== req.params.userId) return res.status(401).send('wrong user id in token') + if (decoded.action !== 'changeHost') return res.status(401).send('wrong action for this token') + await storage.patchUser(req.params.userId, { host: body.host, oauth: null, oidc: null, saml: null }) + + eventsLog.info('sd.user.change-host', `user changed host ${req.params.userId}`, logContext) + + if (storage.getPassword) { + const storedPassword = await storage.getPassword(decoded.id) + if (!storedPassword) { + const payload = { + id: decoded.id, + email: decoded.email, + action: 'changePassword' + } + const token = await signToken(payload, config.jwtDurations.initialToken) + res.send(token) + } + } + + res.status(204).send() +}) + +router.delete('/:userId/sessions/:sessionId', async (req, res, next) => { + const logContext: EventLogContext = { req } + const session = reqSessionAuthenticated(req) + + if (!session.user?.adminMode && session.user.id !== req.params.userId) throw httpError(403, reqI18n(req).messages.errors.permissionDenied) + await storages.globalStorage.deleteUserSession(req.params.userId, req.params.sessionId) + eventsLog.info('sd.user.cancelDeleteSession', 'user cancelled a session', logContext) + await keepalive(req, res) + res.status(204).send() +}) + +export default router diff --git a/api/src/users/worker.ts b/api/src/users/worker.ts new file mode 100644 index 00000000..14c94999 --- /dev/null +++ b/api/src/users/worker.ts @@ -0,0 +1,110 @@ +import { type User } from '#types' +import config, { jwtDurations } from '#config' +import cron from 'node-cron' +import { deleteOAuthToken, writeOAuthToken, oauthGlobalProviders, findOfflineOAuthTokens, authCoreProviderMemberInfo, patchCoreOAuthUser, deleteIdentityWebhook } from '#services' +import { internalError } from '@data-fair/lib-node/observer.js' +import eventsLog from '@data-fair/lib-express/events-log.js' +import { defaultLocale, localizedDayjs, messages } from '#i18n' +import { sendMail } from '#services' +import locks from '@data-fair/lib-node/locks.js' +import storages from '#storages' +import mongo from '#mongo' + +// this single small worker loop doesn't really justify running in separate processes +// we simply run it as part of the api server + +let stopped = false +let taskPromise: Promise | undefined + +const planDeletion = async (user: User) => { + const plannedDeletion = localizedDayjs().add(config.plannedDeletionDelay, 'days').format('YYYY-MM-DD') + await storages.globalStorage.patchUser(user.id, { plannedDeletion }) + eventsLog.warn('sd.cleanup-cron.plan-deletion', 'planned deletion of inactive user', { user }) + const link = config.publicUrl + '/login?email=' + encodeURIComponent(user.email) + if (user.emailConfirmed || user.logged) { + // TODO: use a locale stored on the user ? + await sendMail('plannedDeletion', messages[defaultLocale], user.email, { + link, + user: user.name, + plannedDeletion: localizedDayjs(plannedDeletion).locale(defaultLocale).format('L'), + cause: messages[defaultLocale].mails.plannedDeletion.causeInactivity.replace('{date}', localizedDayjs(user.logged || user.created?.date).locale(defaultLocale).format('L')) + }) + eventsLog.warn('sd.cleanup-cron.inactive.email', `sent an email of planned deletion to inactive user ${user.email}`, { user }) + } +} + +const task = async () => { + if (stopped) return + try { + console.info('run user cleanup cron task') + await locks.acquire('user-deletion-task') + if (config.cleanup.deleteInactive) { + for (const user of await storages.globalStorage.findInactiveUsers()) { + await planDeletion(user) + } + } + + const oldSessionsDate = new Date(Date.now() - (jwtDurations.exchangeToken * 1000)).toISOString() + const oldSessionsFilter = { 'sessions.lastKeepalive': { $lt: oldSessionsDate } } + const oldSessionsOperator = { $pull: { sessions: { lastKeepalive: { $lt: oldSessionsDate } } } } + await mongo.users.updateMany(oldSessionsFilter, oldSessionsOperator) + await mongo.ldapUserSessions.updateMany(oldSessionsFilter, oldSessionsOperator) + await mongo.fileUserSessions.updateMany(oldSessionsFilter, oldSessionsOperator) + + for (const token of await findOfflineOAuthTokens()) { + // TODO manage offline tokens from site level providers + const provider = oauthGlobalProviders().find(p => p.id === token.provider.id) + const user = await storages.globalStorage.getUser(token.user.id) + if (!provider) { + console.error('offline token for unknown provider', token) + } else if (!user) { + console.error('offline token for unknown user', token) + } else { + try { + const refreshedToken = await provider.refreshToken(token.token, false) + const { newToken, offlineRefreshToken } = refreshedToken + const userInfo = await provider.userInfo(newToken.access_token) + const memberInfo = await authCoreProviderMemberInfo(undefined, provider, user.email, userInfo) + await patchCoreOAuthUser(provider, user, userInfo, memberInfo) + await writeOAuthToken(user, provider, newToken, offlineRefreshToken, token.loggedOut) + eventsLog.info('sd.cleanup-cron.offline-token.refresh-ok', `a user refreshed their info from their core identity provider ${provider.id}`, { user }) + } catch (err: any) { + if (err?.data?.payload?.error === 'invalid_grant') { + await deleteOAuthToken(user, provider) + eventsLog.warn('sd.cleanup-cron.offline-token.delete', `deleted invalid offline token for user ${user.id} and provider ${provider.id}`, { user }) + await planDeletion(user) + } else { + internalError('cleanup-refresh-token', err) + } + } + } + } + + for (const user of await storages.globalStorage.findUsersToDelete()) { + console.log('execute planned deletion of user', user) + await storages.globalStorage.deleteUser(user.id) + eventsLog.warn('sd.cleanup-cron.delete', 'deleted user', { user }) + deleteIdentityWebhook('user', user.id) + } + await locks.release('user-deletion-task') + console.info('user cleanup cron task done\n\n') + } catch (err) { + internalError('cleanup-cron', err) + } +} + +export const start = () => { + cron.schedule(config.cleanup.cron, async () => { + if (taskPromise) { + console.warn('cleanup task already running') + } else { + taskPromise = task() + taskPromise.then(() => { taskPromise = undefined }) + } + }) +} + +export const stop = async () => { + stopped = true + if (taskPromise) await taskPromise +} diff --git a/api/src/utils/cipher.ts b/api/src/utils/cipher.ts new file mode 100644 index 00000000..4d01b7e0 --- /dev/null +++ b/api/src/utils/cipher.ts @@ -0,0 +1,34 @@ +// contrary to a hash password sometimes we must be able to read again a sensitive information +// but still not store it as clear text +// in this case we use this simple cipher/decipher mechanism based on a secret in an env var + +import config from '#config' +import { createHash, randomBytes, createCipheriv, createDecipheriv } from 'node:crypto' + +type CipheredContent = { iv: string, alg: 'aes256', data: string } + +// the secret key for cipher/decipher is a simple hash of config.cipherPassword +const hash = createHash('sha256') +hash.update(config.cipherPassword) +const securityKey = hash.digest() + +export const cipher = (content: string): CipheredContent => { + const initVector = randomBytes(16) + const algo = 'aes256' + const cipher = createCipheriv(algo, securityKey, initVector) + let encryptedData = cipher.update(content, 'utf-8', 'hex') + encryptedData += cipher.final('hex') + return { + iv: initVector.toString('hex'), + alg: algo, + data: encryptedData + } +} + +export const decipher = (cipheredContent: CipheredContent | string): string => { + if (typeof cipheredContent === 'string') return cipheredContent + const decipher = createDecipheriv(cipheredContent.alg, securityKey, Buffer.from(cipheredContent.iv, 'hex')) + let content = decipher.update(cipheredContent.data, 'hex', 'utf-8') + content += decipher.final('utf8') + return content +} diff --git a/api/src/utils/color.ts b/api/src/utils/color.ts new file mode 100644 index 00000000..8cc0208d --- /dev/null +++ b/api/src/utils/color.ts @@ -0,0 +1,44 @@ +import type { Colors, Theme } from '#types/site-public/index.ts' +import tinycolor from 'tinycolor2' +import { getMessage } from '#i18n' + +// export const isDark = (color) => tinycolor(color).getLuminance() < 0.4 + +const readableOptions = { level: 'AA' as const, size: 'small' as const } + +function readableWarning (readableOptions: tinycolor.WCAG2Options, locale: string, colorCode?: string, colorName?: string, bgColorCode?: string, bgColorName?: string, themeName?: string) { + if (!colorCode || !bgColorCode) return + if (!tinycolor.isReadable(colorCode, bgColorCode, readableOptions)) { + return getMessage(locale, 'colors.readableWarning', { colorCode, colorName: getMessage(locale, `colors.${colorName}`), bgColorCode, bgColorName: getMessage(locale, `colors.${bgColorName}`), themeName: getMessage(locale, `colors.theme.${themeName}`) }) + } +} + +function getColorsWarnings (locale: string, colors: Colors, themeName: string, readableOptions: tinycolor.WCAG2Options = { level: 'AA', size: 'small' }): string[] { + const warnings: (string | undefined)[] = [] + for (const color of ['primary', 'secondary', 'accent', 'info', 'success', 'error', 'warning', 'admin']) { + const textColor = colors[`text-${color}` as keyof Colors] ?? colors[color as keyof Colors] + warnings.push(readableWarning(readableOptions, locale, textColor, `text-${color}`, colors.background, 'background', themeName)) + warnings.push(readableWarning(readableOptions, locale, textColor, `text-${color}`, colors.surface, 'surface', themeName)) + } + for (const color of ['background', 'surface', 'primary', 'secondary', 'accent', 'info', 'success', 'error', 'warning', 'admin']) { + warnings.push(readableWarning(readableOptions, locale, colors[`on-${color}` as keyof Colors], 'text', colors[color as keyof Colors], color, themeName)) + } + return warnings.filter(w => w !== undefined) +} + +export function getSiteColorsWarnings (locale: string, theme: Theme, authProviders?: { title?: string, color?: string }[]): string[] { + let warnings: (string | undefined)[] = getColorsWarnings(locale, theme.colors, 'default') + if (theme.dark && theme.darkColors) warnings = warnings.concat(getColorsWarnings(locale, theme.darkColors, 'dark')) + if (theme.hc && theme.hcColors) warnings = warnings.concat(getColorsWarnings(locale, theme.hcColors, 'hc', { level: 'AAA', size: 'small' })) + if (theme.hcDark && theme.hcDarkColors) warnings = warnings.concat(getColorsWarnings(locale, theme.hcDarkColors, 'hcDark', { level: 'AAA', size: 'small' })) + if (authProviders) { + for (const p of authProviders) { + if (p.color && p.title) { + if (!tinycolor.isReadable('#FFFFFF', p.color, readableOptions)) { + warnings.push(getMessage(locale, 'colors.readableWarning', { colorCode: '#FFFFFF', colorName: getMessage(locale, 'colors.white'), bgColorCode: p.color, bgColorName: getMessage(locale, 'colors.authProvider', { title: p.title }) })) + } + } + } + } + return warnings.filter(w => w !== undefined) +} diff --git a/api/src/utils/limiter.ts b/api/src/utils/limiter.ts new file mode 100644 index 00000000..e37928f4 --- /dev/null +++ b/api/src/utils/limiter.ts @@ -0,0 +1,20 @@ +import { RateLimiterMongo } from 'rate-limiter-flexible' +import { type Request } from 'express' +import config from '#config' +import mongo from '#mongo' + +// protect authentication routes with rate limiting to prevent brute force attacks +let _limiter: RateLimiterMongo | undefined +const limiterOptions = { + keyPrefix: 'sd-rate-limiter-auth', + points: config.authRateLimit.attempts, + duration: config.authRateLimit.duration +} +export default (req: Request) => { + _limiter = _limiter || new RateLimiterMongo({ + storeClient: mongo.client, + dbName: mongo.db.databaseName, + ...limiterOptions + }) + return _limiter +} diff --git a/server/routers/metrics.js b/api/src/utils/metrics.ts similarity index 52% rename from server/routers/metrics.js rename to api/src/utils/metrics.ts index 3b840c23..5bb50090 100644 --- a/server/routers/metrics.js +++ b/api/src/utils/metrics.ts @@ -1,34 +1,62 @@ +import mongo from '#mongo' +import { Gauge } from 'prom-client' +import { servicePromRegistry } from '@data-fair/lib-node/observer.js' + +export const init = async () => { + // global metrics based on db connection + // eslint-disable-next-line no-new + new Gauge({ + name: 'df_sd_users_total', + help: 'Total number of users', + registers: [servicePromRegistry], + async collect () { + this.set(await mongo.users.estimatedDocumentCount()) + } + }) + + // eslint-disable-next-line no-new + new Gauge({ + name: 'df_sd_orgs_total', + help: 'Total number of organizations', + registers: [servicePromRegistry], + async collect () { + this.set(await mongo.organizations.estimatedDocumentCount()) + } + }) +} + +/* // produces OpenMetrics, compatible with our stats service but also prometheus, etc -const config = require('config') -const promClient = require('prom-client') -const dayjs = require('dayjs') -const asyncWrap = require('../utils/async-wrap') +import type { Request, Response, NextFunction } from 'express' +import config from '#config' +import {Gauge} from 'prom-client' +import dayjs from 'dayjs' -const orgsGauge = new promClient.Gauge({ +const orgsGauge = new Gauge({ name: 'sd_organizations', help: 'Nombre d\'organisations' }) -const usersGauge = new promClient.Gauge({ +const usersGauge = new Gauge({ name: 'sd_users', help: 'Nombre d\'utilisateurs' }) -const loggedUsers24HGauge = new promClient.Gauge({ +const loggedUsers24HGauge = new Gauge({ name: 'sd_logged_users_24h', help: 'Nombre d\'utilisateurs connectés dans les dernières 24 heures' }) -const membersGauge = new promClient.Gauge({ +const membersGauge = new Gauge({ name: 'sd_members', help: 'Nombre de membres par organisation', labelNames: ['org', 'role'] }) -module.exports = asyncWrap(async (req, res, next) => { +export default async (req: Request, res: Response, next: NextFunction) => { if (!config.secretKeys.metrics || req.query.apiKey !== config.secretKeys.metrics) return res.status(401).send() - const storage = req.app.get('storage') + const storage = storages.globalStorage if (!storage.db) return res.status(404).send('no metrics for this storage mode') const db = storage.db @@ -47,14 +75,10 @@ module.exports = asyncWrap(async (req, res, next) => { for (const role of config.roles.defaults) { membersGauge.set( { org: org._id, role }, - await db.collection('users').countDocuments({ organizations: { $elemMatch: { id: org._id, role: role } } }) + await db.collection('users').countDocuments({ organizations: { $elemMatch: { id: org._id, role } } }) ) } } - - res.set('Content-Type', promClient.register.contentType) - let result = await promClient.register.metrics() - result = result.replace('# HELP resource_info', '# HELP resource') - result = result.replace('# TYPE resource_info gauge', '# TYPE resource info') - res.send(result) }) + +*/ diff --git a/api/src/utils/partners.ts b/api/src/utils/partners.ts new file mode 100644 index 00000000..41d445ae --- /dev/null +++ b/api/src/utils/partners.ts @@ -0,0 +1,20 @@ +import { type Organization, type Partner, type ShortenedPartnerInvitation } from '#types' + +export const shortenPartnerInvitation = (partner: Pick, org: Organization, partnerId: string): ShortenedPartnerInvitation => { + return { + o: org.id, + on: org.name, + p: partnerId, + n: partner.name, + e: partner.contactEmail + } +} + +export const unshortenPartnerInvitation = (partnerPayload: ShortenedPartnerInvitation) => { + return { + orgId: partnerPayload.o, + partnerId: partnerPayload.p, + name: partnerPayload.n, + contactEmail: partnerPayload.e + } +} diff --git a/api/src/utils/passwords.ts b/api/src/utils/passwords.ts new file mode 100644 index 00000000..31bc0bb8 --- /dev/null +++ b/api/src/utils/passwords.ts @@ -0,0 +1,43 @@ +import { pbkdf2 as pbkdf2Async, randomBytes as randomBytesAsync } from 'node:crypto' +import { promisify } from 'node:util' + +const randomBytes = promisify(randomBytesAsync) +const pbkdf2 = promisify(pbkdf2Async) + +const params = { iterations: 100000, size: 64, alg: 'sha512' as const } + +type ClearPassword = { clear: string } +type HashedPassword = { hash: string, salt: string, iterations: number, size: number, alg: 'sha512' } +export type Password = ClearPassword | HashedPassword + +function isClearPassword (password: Password): password is ClearPassword { + return 'clear' in password +} + +export const validatePassword = (password: string) => { + if (password.length < 8) return false + if (!/[a-z]/.exec(password)) return false + if (!/[A-Z]/.exec(password)) return false + if (!/[0-9]/.exec(password)) return false + return true +} + +// Derive a hashed key from a password, and return the key and all associated params +// so that we can verify keys even if hashing params are changed +export const hashPassword = async (password: string): Promise => { + const salt = await randomBytes(16) + const hash = await pbkdf2(password, salt, params.iterations, params.size, params.alg) + return { hash: hash.toString('hex'), salt: salt.toString('hex'), ...params } +} + +// Use the same salt and params as used to derive the original key +export const checkPassword = async (password: string, storedPassword: Password | undefined) => { + if (!password || !storedPassword) return false + // minimalist storage engines can store password in clear text + if (isClearPassword(storedPassword)) { + return storedPassword.clear === password + } else { + const newHash = await pbkdf2(password, Buffer.from(storedPassword.salt, 'hex'), storedPassword.iterations, storedPassword.size, storedPassword.alg) + return newHash.toString('hex') === storedPassword.hash + } +} diff --git a/api/src/utils/user-name.ts b/api/src/utils/user-name.ts new file mode 100644 index 00000000..36114d15 --- /dev/null +++ b/api/src/utils/user-name.ts @@ -0,0 +1,9 @@ +import type { User } from '#types' + +export default (user: Pick, ignoreExisting = true): string => { + const lastName = user.lastName !== user.email ? user.lastName : '' + if (user.firstName || lastName) return ((user.firstName || '') + ' ' + (lastName || '')).trim() + // const oauthWithName = Object.keys(user.oauth || {}).find(p => !!user.oauth[p].name) + // if (oauthWithName) return user.oauth[oauthWithName].name + return (user.email.split('@').shift() as string).split('.').map(str => str[0].toUpperCase() + str.slice(1)).join(' ') +} diff --git a/api/src/webhooks/service.ts b/api/src/webhooks/service.ts new file mode 100644 index 00000000..9b22b54b --- /dev/null +++ b/api/src/webhooks/service.ts @@ -0,0 +1,44 @@ +import type { User } from '#types/user/index.ts' +import type { Organization } from '#types/organization/index.ts' +import type { PostIdentityReq } from '@data-fair/lib-express/identities/types/post-req/index.js' +import axios from '@data-fair/lib-node/axios.js' +import { internalError } from '@data-fair/lib-node/observer.js' +import config from '#config' +import Debug from 'debug' + +const debug = Debug('webhooks') + +export async function postUserIdentityWebhook (user?: Pick) { + if (!user) return + await postIdentityWebhook({ type: 'user', id: user.id, name: user.name, organizations: user.organizations }) +} +export async function postOrganizationIdentityWebhook (org: Pick) { + await postIdentityWebhook({ type: 'organization', id: org.id, name: org.name, departments: org.departments }) +} + +const postIdentityWebhook = async (identity: PostIdentityReq['body'] & PostIdentityReq['params']) => { + for (const webhook of config.webhooks.identities) { + for (const org of identity.organizations || []) { + if (org.department === null || org.department === '') delete org.department + } + const url = `${webhook.base}/${identity.type}/${identity.id}` + debug(`Send identity name webhook to ${url} : `, identity) + try { + await axios.post(url, identity, { params: { key: webhook.key } }) + } catch (err: any) { + internalError('webhook-identity-post', err) + } + } +} + +export const deleteIdentityWebhook = async (type: string, id: string) => { + for (const webhook of config.webhooks.identities) { + const url = `${webhook.base}/${type}/${id}` + debug(`Send identity delete webhook to ${url}`) + try { + await axios.delete(url, { params: { key: webhook.key } }) + } catch (err: any) { + internalError('webhook-identity-delete', err) + } + } +} diff --git a/api/types/index.ts b/api/types/index.ts new file mode 100644 index 00000000..03b9047c --- /dev/null +++ b/api/types/index.ts @@ -0,0 +1,65 @@ +import { type User, type FullOrganizationMembership } from './user/index.ts' +import type { RedirectMode } from '../config/type/index.ts' +import type { Invitation } from './invitation/index.ts' + +export type { User, FullOrganizationMembership, ServerSession } from './user/index.ts' +export type { Organization } from './organization/index.ts' +export type { Site } from './site/index.ts' +export type { SitePublic } from './site-public/index.ts' +export type { Limits } from './limits/index.ts' +export type { Invitation } from './invitation/index.ts' +export type { Partner } from './partner/index.ts' +export type { LdapParams, MemberOverwrite, OrganizationOverwrite } from './ldap-params/index.ts' + +export type UserWritable = Omit + +export type Member = Pick & Pick + +export type OAuthToken = { + token: any, + provider: { type: string, id: string, title: string }, + user: { id: string, name: string, email: string }, + offlineRefreshToken?: boolean, + loggedOut?: Date +} + +export type PublicAuthProvider = { + type: string, + id: string, + title?: string, + color?: string, + img?: string, + icon?: string, + redirectMode?: RedirectMode, + host?: string +} + +export type ShortenedInvitation = { + id: Invitation['id'], + n: Invitation['name'], + e: Invitation['email'], + r: Invitation['role'], + d: Invitation['department'], + dn: Invitation['departmentName'], + rd: Invitation['redirect'], +} + +export type ActionPayload = { + id: string, + email: string, + action: 'changePassword' | 'changeHost' +} + +export type ShortenedPartnerInvitation = { + o: string, + on: string, + p: string, + n: string, + e: string +} + +export type SessionInfoPayload = { + session: string + user: string + adminMode?: 1 +} diff --git a/api/types/invitation/index.ts b/api/types/invitation/index.ts new file mode 100644 index 00000000..f5d615bd --- /dev/null +++ b/api/types/invitation/index.ts @@ -0,0 +1 @@ +export * from './.type/index.js' diff --git a/api/types/invitation/schema.json b/api/types/invitation/schema.json new file mode 100644 index 00000000..6871b3c7 --- /dev/null +++ b/api/types/invitation/schema.json @@ -0,0 +1,33 @@ +{ + "$id": "https://github.com/data-fair/simple-directory/invitation", + "x-exports": ["types"], + "title": "Invitation", + "type": "object", + "additionalProperties": false, + "required": ["id", "name", "email", "role"], + "properties": { + "id": { + "description": "The unique id of the organization", + "type": "string" + }, + "name": { + "description": "Name of the organization", + "type": "string" + }, + "department": { + "type": "string" + }, + "departmentName": { + "type": "string" + }, + "redirect": { + "type": "string" + }, + "email": { + "type": "string" + }, + "role": { + "type": "string" + } + } +} diff --git a/api/types/ldap-params/index.ts b/api/types/ldap-params/index.ts new file mode 100644 index 00000000..f5d615bd --- /dev/null +++ b/api/types/ldap-params/index.ts @@ -0,0 +1 @@ +export * from './.type/index.js' diff --git a/api/types/ldap-params/schema.js b/api/types/ldap-params/schema.js new file mode 100644 index 00000000..bfd78abc --- /dev/null +++ b/api/types/ldap-params/schema.js @@ -0,0 +1,150 @@ +export default { + $id: 'https://github.com/data-fair/simple-directory/ldap-params', + 'x-exports': ['types'], + type: 'object', + title: 'ldap params', + additionalProperties: false, + required: ['url', 'baseDN', 'users', 'organizations', 'members'], + properties: { + url: { type: 'string' }, + searchUserDN: { type: 'string' }, + searchUserPassword: { type: ['string', 'object'] }, + baseDN: { type: 'string' }, + readonly: { type: 'boolean' }, + overwrite: { + type: 'array', + items: { + type: 'string', + enum: ['members', 'departments', 'organizations', 'partners'] + } + }, + cacheMS: { + type: 'number' + }, + users: { + type: 'object', + additionalProperties: false, + required: ['objectClass', 'dnKey', 'mapping'], + properties: { + objectClass: { type: 'string' }, + dnKey: { type: 'string' }, + mapping: { + type: 'object', + patternProperties: { + '.*': { + type: 'string' + } + } + }, + overwrite: { + type: 'array', + items: { $ref: '#/$defs/userOverwrite' } + }, + extraFilters: { + type: 'array', + items: { + type: 'string' + } + } + } + }, + organizations: { + type: 'object', + additionalProperties: false, + required: ['objectClass', 'dnKey', 'mapping'], + properties: { + staticSingleOrg: { + type: 'object', + additionalProperties: false, + required: ['id', 'name'], + properties: { + id: { type: 'string' }, + name: { type: 'string' } + } + }, + objectClass: { type: 'string' }, + dnKey: { type: 'string' }, + mapping: { + type: 'object', + patternProperties: { + '.*': { + type: 'string' + } + } + }, + overwrite: { + type: 'array', + items: { $ref: '#/$defs/organizationOverwrite' } + }, + extraFilters: { + type: 'array', + items: { + type: 'string' + } + } + } + }, + members: { + type: 'object', + additionalProperties: false, + required: ['role'], + properties: { + organizationAsDC: { type: 'boolean' }, + onlyWithRole: { type: 'boolean' }, + role: { + type: 'object', + additionalProperties: false, + required: ['default'], + properties: { + attr: { type: 'string' }, + default: { type: 'string' }, + values: { + type: 'object', + patternProperties: { + '.*': { + type: 'array', + items: { + type: 'string' + } + } + } + } + } + }, + overwrite: { + type: 'array', + items: { $ref: '#/$defs/memberOverwrite' } + } + } + } + }, + $defs: { + memberOverwrite: { + type: 'object', + required: ['orgId'], + title: 'member overwrite', + properties: { + orgId: { type: 'string' }, + department: { type: 'string' }, + role: { type: 'string' }, + email: { type: 'string' } + } + }, + userOverwrite: { + type: 'object', + required: ['email'], + title: 'user overwrite', + properties: { + email: { type: 'string' } + } + }, + organizationOverwrite: { + type: 'object', + required: ['id'], + title: 'organization overwrite', + properties: { + id: { type: 'string' } + } + } + } +} diff --git a/api/types/limits/index.ts b/api/types/limits/index.ts new file mode 100644 index 00000000..f5d615bd --- /dev/null +++ b/api/types/limits/index.ts @@ -0,0 +1 @@ +export * from './.type/index.js' diff --git a/api/types/limits/schema.json b/api/types/limits/schema.json new file mode 100644 index 00000000..9afe0f1e --- /dev/null +++ b/api/types/limits/schema.json @@ -0,0 +1,36 @@ +{ + "type": "object", + "required": [ + "id", + "type", + "lastUpdate", + "store_nb_members" + ], + "properties": { + "type": { + "type": "string" + }, + "id": { + "type": "string" + }, + "name": { + "type": "string" + }, + "lastUpdate": { + "type": "string", + "format": "date-time" + }, + "store_nb_members": { + "type": "object", + "required": ["limit", "consumption"], + "properties": { + "limit": { + "type": "number" + }, + "consumption": { + "type": "number" + } + } + } + } +} \ No newline at end of file diff --git a/api/types/organization/index.ts b/api/types/organization/index.ts new file mode 100644 index 00000000..f5d615bd --- /dev/null +++ b/api/types/organization/index.ts @@ -0,0 +1 @@ +export * from './.type/index.js' diff --git a/api/types/organization/schema.js b/api/types/organization/schema.js new file mode 100644 index 00000000..9c1072df --- /dev/null +++ b/api/types/organization/schema.js @@ -0,0 +1,135 @@ +const ldapParamsSchema = import('../ldap-params/schema.js') + +const partialLdapParamsSchema = { ...ldapParamsSchema, required: ['url', 'baseDN'] } + +export default { + $id: 'https://github.com/data-fair/simple-directory/organization', + 'x-exports': ['types'], + title: 'Organization', + type: 'object', + additionalProperties: false, + required: ['id', 'name'], + properties: { + created: { $ref: 'https://github.com/data-fair/simple-directory/partial#/$defs/modifier' }, + updated: { $ref: 'https://github.com/data-fair/simple-directory/partial#/$defs/modifier' }, + id: { + description: 'The unique id of the organization', + type: 'string' + }, + name: { + description: 'Name of the organization', + type: 'string', + maxLength: 150 + }, + description: { + description: 'Description of the organization', + type: 'string' + }, + roles: { + description: 'The list or roles used inside this organization', + type: 'array', + items: { + type: 'string' + } + }, + '2FA': { + properties: { + roles: { + description: 'The list of roles that require 2FA inside this organization', + type: 'array', + items: { + type: 'string' + } + } + } + }, + departmentLabel: { + description: 'How the department concept is named in the context of this organization', + type: 'string' + }, + departments: { + description: 'The list of departments inside the organization', + type: 'array', + items: { + type: 'object', + additionalProperties: false, + required: ['id', 'name'], + properties: { + id: { + type: 'string' + }, + name: { + type: 'string' + } + } + } + }, + members: { + description: 'The members of the organization', + type: 'array', + readOnly: true, + items: { + type: 'object', + additionalProperties: false, + required: ['id', 'role'], + properties: { + id: { + type: 'string', + description: 'Identifier of the account for this member' + }, + role: { + type: 'string', + enum: ['admin', 'user'], + description: 'Role for this member in this organization' + }, + createdAt: { + type: 'string', + format: 'date-time' + }, + departments: { + type: 'array', + items: { + type: 'object', + properties: { + id: { + type: 'string', + description: 'Identifier of the department' + }, + role: { + type: 'string', + enum: ['admin', 'user'], + description: 'Role for this member in this department' + } + } + } + } + } + } + }, + avatarUrl: { + description: "URL of this organization's avatar", + type: 'string', + readOnly: true + }, + orgStorage: { + type: 'object', + description: 'Manage a secondary user storage per-organization (super admin only)', + additionalProperties: false, + required: ['type'], + properties: { + active: { type: 'boolean' }, + type: { + type: 'string', + enum: ['ldap'] + }, + readonly: { type: 'boolean' }, + config: partialLdapParamsSchema + } + }, + partners: { + type: 'array', + readOnly: true, + items: { $ref: 'https://github.com/data-fair/simple-directory/partner' } + } + } +} diff --git a/api/types/partial/index.ts b/api/types/partial/index.ts new file mode 100644 index 00000000..f5d615bd --- /dev/null +++ b/api/types/partial/index.ts @@ -0,0 +1 @@ +export * from './.type/index.js' diff --git a/api/types/partial/schema.json b/api/types/partial/schema.json new file mode 100644 index 00000000..d32828fa --- /dev/null +++ b/api/types/partial/schema.json @@ -0,0 +1,29 @@ +{ + "$id": "https://github.com/data-fair/simple-directory/partial", + "x-exports": [], + "$defs": { + "modifier": { + "type": "object", + "additionalProperties": false, + "required": [ + "date" + ], + "readOnly": true, + "properties": { + "id": { + "type": "string", + "description": "Id of the user that created this issue" + }, + "name": { + "type": "string", + "description": "Name of the user that created this issue" + }, + "date": { + "type": "string", + "description": "Creation date of this issue", + "format": "date-time" + } + } + } + } +} \ No newline at end of file diff --git a/api/types/partner/index.ts b/api/types/partner/index.ts new file mode 100644 index 00000000..f5d615bd --- /dev/null +++ b/api/types/partner/index.ts @@ -0,0 +1 @@ +export * from './.type/index.js' diff --git a/api/types/partner/schema.js b/api/types/partner/schema.js new file mode 100644 index 00000000..491deb55 --- /dev/null +++ b/api/types/partner/schema.js @@ -0,0 +1,15 @@ +export default { + $id: 'https://github.com/data-fair/simple-directory/partner', + 'x-exports': ['types'], + title: 'Partner', + type: 'object', + additionalProperties: false, + required: ['name', 'contactEmail', 'partnerId', 'createdAt'], + properties: { + id: { type: 'string' }, + name: { type: 'string' }, + contactEmail: { type: 'string' }, + partnerId: { type: 'string' }, + createdAt: { type: 'string', format: 'date-time' } + } +} diff --git a/api/types/site-public/index.ts b/api/types/site-public/index.ts new file mode 100644 index 00000000..f5d615bd --- /dev/null +++ b/api/types/site-public/index.ts @@ -0,0 +1 @@ +export * from './.type/index.js' diff --git a/types/site-public/schema.json b/api/types/site-public/schema.json similarity index 78% rename from types/site-public/schema.json rename to api/types/site-public/schema.json index 33d906d5..4bca96f9 100644 --- a/types/site-public/schema.json +++ b/api/types/site-public/schema.json @@ -1,23 +1,23 @@ { "$id": "https://github.com/data-fair/simple-directory/site-public", - "x-exports": ["types", "stringify"], + "x-exports": ["types"], "title": "site-public", "type":"object", "additionalProperties":false, "required":[ + "host", "theme", - "logo", "authMode" ], "properties":{ + "main": { + "type": "boolean" + }, "host": { "$ref": "https://github.com/data-fair/simple-directory/site#/properties/host" }, "theme": { - "$ref": "https://github.com/data-fair/simple-directory/site#/properties/theme" - }, - "logo": { - "$ref": "https://github.com/data-fair/simple-directory/site#/properties/logo" + "$ref": "https://github.com/data-fair/simple-directory/api/config#/$defs/theme" }, "reducedPersonalInfoAtCreation": { "$ref": "https://github.com/data-fair/simple-directory/site#/properties/reducedPersonalInfoAtCreation" diff --git a/api/types/site/index.ts b/api/types/site/index.ts new file mode 100644 index 00000000..f5d615bd --- /dev/null +++ b/api/types/site/index.ts @@ -0,0 +1 @@ +export * from './.type/index.js' diff --git a/api/types/site/schema.js b/api/types/site/schema.js new file mode 100644 index 00000000..8ba7fb49 --- /dev/null +++ b/api/types/site/schema.js @@ -0,0 +1,371 @@ +/* eslint-disable no-template-curly-in-string */ +export default { + type: 'object', + $id: 'https://github.com/data-fair/simple-directory/site', + title: 'Site', + layout: { + title: '' + }, + 'x-exports': [ + 'types', + 'resolvedSchema' + ], + required: [ + '_id', + 'owner', + 'host', + 'theme', + 'authMode' + ], + additionalProperties: false, + properties: { + _id: { + type: 'string', + layout: 'none' + }, + owner: { + $ref: 'https://github.com/data-fair/lib/session-state#/$defs/account', + layout: { + label: 'Propriétaire', + getItems: { + url: '${context.sdUrl}/api/accounts?type=organization&q={q}', + itemsResults: 'data.results', + itemKey: { + type: 'js-tpl', + expr: '${item.type}:${item.id}' + }, + itemTitle: { + type: 'js-tpl', + expr: '${item.name} (${item.id})' + } + } + } + }, + host: { + type: 'string', + title: 'Nom de domaine' + }, + path: { + type: 'string', + title: 'Préfixe de chemin' + }, + theme: { $ref: 'https://github.com/data-fair/simple-directory/api/config#/$defs/theme' }, + authMode: { + default: 'onlyBackOffice', + title: "Mode d'authentification", + type: 'string', + oneOf: [ + { + const: 'onlyLocal', + title: 'uniquement sur le site lui même' + }, + { + const: 'onlyBackOffice', + title: 'uniquement sur le back-office' + }, + { + const: 'ssoBackOffice', + title: 'sur le site et sur le back-office par SSO' + }, + { + const: 'onlyOtherSite', + title: 'uniquement sur un autre de vos sites' + } + ] + }, + authOnlyOtherSite: { + layout: { + if: 'parent.data.authMode === "onlyOtherSite"', + getItems: 'context.otherSites' + }, + type: 'string', + title: "Autre site pour l'authentification" + }, + reducedPersonalInfoAtCreation: { + type: 'boolean', + title: 'Réduire les informations personnelles à la création de compte', + description: "Si cette option est activée, les informations personnelles demandées à la création d'un compte seront réduites à l'email." + }, + tosMessage: { + type: 'string', + layout: 'textarea', + title: "Message des conditions d'utilisation", + description: "Vous pouvez remplacer le message des conditions d'utilisation par défaut." + }, + authProviders: { + layout: { + if: "parent.data.authMode !== 'onlyOtherSite' && parent.data.authMode !== 'onlyBackOffice'" + }, + type: 'array', + title: "Fournisseurs d'identité (SSO)", + items: { + type: 'object', + layout: { + switch: [{ + if: 'summary', + children: ['title'] + }] + }, + required: [ + 'title', + 'type' + ], + properties: { + id: { + type: 'string', + title: 'Identifiant', + readOnly: true + }, + title: { + type: 'string', + title: 'Nom' + } + }, + oneOfLayout: { + label: 'Type de fournisseur', + }, + oneOf: [ + { + $ref: '#/$defs/oidcProvider' + }, + { + type: 'object', + title: 'Un autre de vos sites', + required: [ + 'site' + ], + properties: { + type: { + type: 'string', + const: 'otherSite' + }, + site: { + type: 'string', + title: 'Site', + layout: { + getItems: 'context.otherSites' + } + } + } + }, + { + type: 'object', + title: "Un fournisseur d'identité configuré sur autre de vos sites", + required: [ + 'provider' + ], + properties: { + type: { + type: 'string', + const: 'otherSiteProvider' + }, + site: { + type: 'string', + title: 'Site', + layout: { + getItems: 'context.otherSites' + } + }, + provider: { + type: 'string', + title: 'Fournisseur', + layout: { + if: 'parent.data.site', + getItems: 'context.otherSitesProviders[parent.data.site]' + } + } + } + } + ] + } + } + }, + $defs: { + oidcProvider: { + type: 'object', + title: 'OpenID Connect', + required: [ + 'discovery', + 'client' + ], + properties: { + type: { + type: 'string', + const: 'oidc' + }, + color: { + type: 'string', + title: 'Couleur', + layout: 'color-picker' + }, + img: { + type: 'string', + title: 'URL du logo (petite taille)' + }, + discovery: { + type: 'string', + title: 'URL de découverte', + description: 'probablement de la forme http://mon-fournisseur/.well-known/openid-configuration' + }, + client: { + type: 'object', + required: [ + 'id', + 'secret' + ], + properties: { + id: { + type: 'string', + title: 'Identifiant du client', + layout: { cols: 6 } + }, + secret: { + type: 'string', + title: 'Secret', + writeOnly: true, + layout: { cols: 6 } + } + } + }, + createMember: { + type: 'object', + default: { + type: 'never' + }, + layout: { cols: 6 }, + oneOfLayout: { + label: 'Créer les utilisateurs en tant que membres', + help: "Si cette option est activée tous les utilisateurs créés au travers de ce fournisseur d'identité seront automatiquement membres de l'organisation propriétaire du site.", + }, + oneOf: [ + { + title: 'jamais', + properties: { + type: { + const: 'never' + } + } + }, + { + title: 'toujours', + properties: { + type: { + const: 'always' + } + } + }, + { + title: "quand l'email appartient à un nom de domaine", + properties: { + type: { + const: 'emailDomain' + }, + emailDomain: { + type: 'string', + title: "nom de domaine de l'email" + } + } + } + ] + }, + memberRole: { + type: 'object', + layout: { cols: 6 }, + oneOfLayout: { + label: 'Attribution du rôle des membres', + help: "Le rôle des membres créés automatiquement par ce fournisseur d'identité.", + }, + default: { + type: 'none' + }, + oneOf: [ + { + title: 'Aucun rôle par défaut (simple utilisateur)', + properties: { + type: { + const: 'none' + } + } + }, + { + title: 'Tout le temps ce rôle : ', + required: ['role'], + properties: { + type: { + const: 'static' + }, + role: { + type: 'string', + title: 'Rôle des membres' + } + } + }, + { + title: "Rôle lu dans un attribut de l'identité", + required: ['attribute'], + properties: { + type: { + const: 'attribute' + }, + attribute: { + type: 'string', + title: "Nom de l'attribut" + } + } + } + ] + }, + ignoreEmailVerified: { + type: 'boolean', + title: 'Accepter les utilisateurs aux emails non vérifiés', + description: "Par défaut si le fournisseur d'identité retourne email_verified=false l'authentification est refusée. Cochez cette option pour changer ce comportement." + }, + coreIdProvider: { + type: 'boolean', + title: "Traiter ce fournisseur comme une source principale d'identité", + description: "Cette option a plusieurs effets :\n - un compte associé à ce fournisseur ne peut pas avoir d'autre moyen d'authentification (mot de posse ou autre fournisseur rattaché au même compte)\n - les informations du compte seront en lecture seule et synchronisées automatiquement depuis le fournisseur quand l'utilisateur a une session active\n - cette synchronisation inclue la destruction de la session et la désactivation du compte si celui-ci n'existe plus dans le fournisseur d'identité\n - si l'option \"Rôle des membres\" est utilisée le rôle sera lui aussi synchronisé et ne sera pas éditable dans le back-office" + }, + redirectMode: { + type: 'object', + default: { + type: 'button' + }, + oneOfLayout: { + label: 'Controlez la manière dont les utilisateurs sont redirigés vers ce fournisseur', + help: "Si vous utilisez un mode basé sur l'email alors la mire d'authentification demandera l'email de l'utilisateur en 1ère étape.", + }, + oneOf: [ + { + title: 'bouton', + properties: { + type: { + const: 'button' + } + } + }, + { + title: "redirection auto quand l'email appartient à un nom de domaine", + properties: { + type: { + const: 'emailDomain' + }, + emailDomain: { + type: 'string', + title: "nom de domaine de l'email" + } + } + }, + { + title: 'toujours rediriger implicitement', + properties: { + type: { + const: 'always' + } + } + } + ] + } + } + } + } +} diff --git a/api/types/user/index.ts b/api/types/user/index.ts new file mode 100644 index 00000000..f5d615bd --- /dev/null +++ b/api/types/user/index.ts @@ -0,0 +1 @@ +export * from './.type/index.js' diff --git a/api/types/user/schema.js b/api/types/user/schema.js new file mode 100644 index 00000000..12be1d48 --- /dev/null +++ b/api/types/user/schema.js @@ -0,0 +1,218 @@ +export default { + $id: 'https://github.com/data-fair/simple-directory/user', + 'x-exports': [ + 'types' + ], + title: 'User', + type: 'object', + additionalProperties: false, + required: [ + 'id', + 'email', + 'name', + 'organizations' + ], + properties: { + created: { + allOf: [ + { $ref: 'https://github.com/data-fair/simple-directory/partial#/$defs/modifier' }, + { + properties: { + host: { + type: 'string' + }, + path: { + type: 'string' + } + } + } + ] + }, + updated: { $ref: 'https://github.com/data-fair/simple-directory/partial#/$defs/modifier' }, + id: { + description: 'The unique id of the user', + type: 'string' + }, + email: { + description: 'The main email of the user', + type: 'string' + }, + emailConfirmed: { + type: 'boolean' + }, + host: { + description: 'Site where the user created his account (leave empty if it is the main public site)', + type: 'string' + }, + path: { + type: 'string', + title: 'Path prefix of the site where the user was created' + }, + firstName: { + description: 'First name of the user', + type: 'string', + maxLength: 100 + }, + lastName: { + description: 'Family name of the user', + type: 'string', + maxLength: 100 + }, + name: { + type: 'string', + readOnly: true + }, + isAdmin: { + description: 'Is this user a global admin (independant of organizations)', + type: 'boolean', + readOnly: true + }, + maxCreatedOrgs: { + description: 'The maximum number of organizations this user can create. -1 means indeterminate number. Fallback to a global default value if not defined.', + type: 'number' + }, + birthday: { + description: 'Birth date of the user', + type: 'string', + format: 'date' + }, + avatarUrl: { + description: "URL of this user's avatar", + type: 'string', + readOnly: true + }, + oauth: { + description: 'Identity rattached to oauth providers', + type: 'object', + readOnly: true + }, + oidc: { + description: 'Identity rattached to OIDC providers', + type: 'object', + readOnly: true + }, + saml2: { + description: 'Identity rattached to SAML 2 providers', + type: 'object', + readOnly: true + }, + defaultOrg: { + type: 'string' + }, + defaultDep: { + type: 'string' + }, + ignorePersonalAccount: { + type: 'boolean', + default: false + }, + plannedDeletion: { + type: 'string', + format: 'date' + }, + organizations: { + type: 'array', + items: { $ref: '#/$defs/fullOrganizationMembership' } + }, + coreIdProvider: { + type: 'object', + title: 'Is the user coming from a core ID provider ?', + additionalProperties: false, + required: ['type', 'id'], + properties: { + type: { + type: 'string' + }, + id: { + type: 'string' + } + } + }, + orgStorage: { + type: 'boolean' + }, + password: { + type: 'object' + }, + '2FA': { + type: 'object', + additionalProperties: false, + required: ['active'], + properties: { + active: { + type: 'boolean' + }, + secret: { + type: 'string' + }, + recovery: { + type: 'object' + } + } + }, + logged: { + type: 'string', + format: 'date-time' + }, + sessions: { + type: 'array', + items: { $ref: '#/$defs/serverSession' } + } + }, + $defs: { + fullOrganizationMembership: { + type: 'object', + additionalProperties: false, + required: [ + 'id', + 'name', + 'role' + ], + properties: { + id: { + type: 'string' + }, + name: { + type: 'string' + }, + role: { + type: 'string' + }, + department: { + type: 'string' + }, + departmentName: { + type: 'string' + }, + readOnly: { + type: 'boolean' + }, + createdAt: { + type: 'string', + format: 'date-time' + } + } + }, + serverSession: { + type: 'object', + additionalProperties: false, + required: ['deviceName', 'id', 'createdAt'], + properties: { + deviceName: { + type: 'string' + }, + id: { + type: 'string' + }, + createdAt: { + type: 'string', + format: 'date-time' + }, + lastKeepalive: { + type: 'string', + format: 'date-time' + } + } + } + } +} diff --git a/commitlint.config.js b/commitlint.config.js index 4fedde6d..7c4ff4d9 100644 --- a/commitlint.config.js +++ b/commitlint.config.js @@ -1 +1 @@ -module.exports = { extends: ['@commitlint/config-conventional'] } +export default { extends: ['@commitlint/config-conventional'] } diff --git a/config/custom-environment-variables.js b/config/custom-environment-variables.js deleted file mode 100644 index bba5718a..00000000 --- a/config/custom-environment-variables.js +++ /dev/null @@ -1,353 +0,0 @@ -module.exports = { - port: 'PORT', - publicUrl: 'PUBLIC_URL', - kid: 'JWT_KID', - oldSessionDomain: 'OLD_SESSION_DOMAIN', - jwtDurations: { - initialToken: 'JWT_DURATION_INITIAL', - exchangedToken: 'JWT_DURATION_EXCHANGED', - invitationToken: 'JWT_DURATION_INVIT', - partnerInvitationToken: 'JWT_DURATION_PARTNER_INVIT', - '2FAToken': 'JWT_DURATION_2FA' - }, - admins: { - __name: 'ADMINS', - __format: 'json' - }, - adminsOrg: { - __name: 'ADMINS_ORG', - __format: 'json' - }, - admins2FA: { - __name: 'ADMINS_2FA', - __format: 'json' - }, - adminCredentials: { - __name: 'ADMIN_CREDENTIALS', - __format: 'json' - }, - roles: { - defaults: { - __name: 'ROLES_DEFAULTS', - __format: 'json' - }, - editable: 'ROLES_EDITABLE' - }, - contact: 'CONTACT', - anonymousAction: { - expiresIn: 'ANONYMOUS_ACTION_EXPIRES_IN', - notBefore: 'ANONYMOUS_ACTION_NOT_BEFORE' - }, - homePage: 'HOME_PAGE', - secret: { - public: 'PUBLIC_KEY', - private: 'PRIVATE_KEY' - }, - storage: { - type: 'STORAGE_TYPE', - file: { - users: 'STORAGE_FILE_USERS', - organizations: 'STORAGE_FILE_ORGS' - }, - mongo: { - url: 'STORAGE_MONGO_URL', - readonly: { - __name: 'STORAGE_MONGO_READONLY', - __format: 'json' - }, - clientOptions: { - __name: 'STORAGE_MONGO_CLIENT_OPTIONS', - __format: 'json' - } - }, - ldap: { - url: 'STORAGE_LDAP_URL', - searchUserDN: 'STORAGE_LDAP_SEARCH_USER_DN', - searchUserPassword: 'STORAGE_LDAP_SEARCH_USER_PASS', - baseDN: 'STORAGE_LDAP_BASE_DN', - users: { - objectClass: 'STORAGE_LDAP_USERS_OBJECT_CLASS', - dnKey: 'STORAGE_LDAP_USERS_DN_KEY', - mapping: { - __name: 'STORAGE_LDAP_USERS_MAPPING', - __format: 'json' - }, - overwrite: { - __name: 'STORAGE_LDAP_USERS_OVERWRITE', - __format: 'json' - }, - extraFilters: { - __name: 'STORAGE_LDAP_USERS_EXTRA_FILTERS', - __format: 'json' - } - }, - organizations: { - staticSingleOrg: { - __name: 'STORAGE_LDAP_ORGS_STATIC_SINGLE_ORG', - __format: 'json' - }, - objectClass: 'STORAGE_LDAP_ORGS_OBJECT_CLASS', - dnKey: 'STORAGE_LDAP_ORGS_DN_KEY', - mapping: { - __name: 'STORAGE_LDAP_ORGS_MAPPING', - __format: 'json' - }, - overwrite: { - __name: 'STORAGE_LDAP_ORGS_OVERWRITE', - __format: 'json' - }, - extraFilters: { - __name: 'STORAGE_LDAP_ORGS_EXTRA_FILTERS', - __format: 'json' - } - }, - members: { - organizationAsDC: { - __name: 'STORAGE_LDAP_MEMBERS_ORG_AS_DC', - __format: 'json' - }, - onlyWithRole: { - __name: 'STORAGE_LDAP_ONLY_WITH_ROLE', - __format: 'json' - }, - role: { - attr: 'STORAGE_LDAP_MEMBERS_ROLE_ATTR', - values: { - __name: 'STORAGE_LDAP_MEMBERS_ROLE_VALUES', - __format: 'json' - }, - default: 'STORAGE_LDAP_MEMBERS_ROLE_DEFAULT' - }, - overwrite: { - __name: 'STORAGE_LDAP_MEMBERS_OVERWRITE', - __format: 'json' - } - } - } - }, - analytics: { - __name: 'ANALYTICS', - __format: 'json' - }, - webhooks: { - identities: { - __name: 'IDENTITIES_WEBHOOKS', - __format: 'json' - } - }, - theme: { - logo: 'THEME_LOGO', - favicon: 'THEME_FAVICON', - dark: { - __name: 'THEME_DARK', - __format: 'json' - }, - colors: { - primary: 'THEME_PRIMARY', - secondary: 'THEME_SECONDARY', - accent: 'THEME_ACCENT', - error: 'THEME_ERROR', - info: 'THEME_INFO', - success: 'THEME_SUCCESS', - warning: 'THEME_WARNING' - }, - darkColors: { - primary: 'THEME_DARK_PRIMARY', - secondary: 'THEME_DARK_SECONDARY', - accent: 'THEME_DARK_ACCENT', - error: 'THEME_DARK_ERROR', - info: 'THEME_DARK_INFO', - success: 'THEME_DARK_SUCCESS', - warning: 'THEME_DARK_WARNING' - }, - cssUrl: 'THEME_CSS_URL', - cssText: 'THEME_CSS_TEXT' - }, - i18n: { - locales: { - __name: 'I18N_LOCALES', - __format: 'json' - } - }, - mails: { - transport: { - __name: 'MAILS_TRANSPORT', - __format: 'json' - }, - from: 'MAILS_FROM', - extraParams: { - __name: 'MAILS_EXTRA_PARAMS', - __format: 'json' - } - }, - maildev: { - url: 'MAILDEV_URL', - active: { - __name: 'MAILDEV_ACTIVE', - __format: 'json' - } - }, - quotas: { - defaultMaxCreatedOrgs: { - __name: 'DEFAULT_MAX_CREATED_ORGS', - __format: 'json' - }, - defaultMaxNbMembers: { - __name: 'DEFAULT_MAX_NB_MEMBERS', - __format: 'json' - } - }, - listEntitiesMode: 'LIST_ENTITIES_MODE', - listUsersMode: 'LIST_USERS_MODE', - listOrganizationsMode: 'LIST_ORGANIZATIONS_MODE', - onlyCreateInvited: { - __name: 'ONLY_CREATE_INVITED', - __format: 'json' - }, - singleMembership: { - __name: 'SINGLE_MEMBERSHIP', - __format: 'json' - }, - userSelfDelete: { - __name: 'USER_SELF_DELETE', - __format: 'json' - }, - defaultLoginRedirect: 'DEFAULT_LOGIN_REDIRECT', - invitationRedirect: 'INVITATION_REDIRECT', - secretKeys: { - sendMails: 'SECRET_SENDMAILS', - limits: 'SECRET_LIMITS', - readAll: 'SECRET_READ_ALL', - metrics: 'SECRET_METRICS', - notifications: 'SECRET_NOTIFICATIONS', - sites: 'SECRET_SITES' - }, - listenWhenReady: { - __name: 'LISTEN_WHEN_READY', - __format: 'json' - }, - noUI: { - __name: 'NO_UI', - __format: 'json' - }, - tosUrl: 'TOS_URL', - manageDepartments: { - __name: 'MANAGE_DEPARTMENTS', - __format: 'json' - }, - manageDepartmentLabel: { - __name: 'MANAGE_DEPARTMENT_LABEL', - __format: 'json' - }, - passwordless: { - __name: 'PASSWORDLESS', - __format: 'json' - }, - authRateLimit: { - attempts: { - __name: 'AUTHRATELIMIT_ATTEMPTS', - __format: 'json' - }, - duration: { - __name: 'AUTHRATELIMIT_DURATION', - __format: 'json' - } - }, - oauth: { - providers: { - __name: 'OAUTH_PROVIDERS', - __format: 'json' - }, - github: { - id: 'OAUTH_GITHUB_ID', - secret: 'OAUTH_GITHUB_SECRET' - }, - facebook: { - id: 'OAUTH_FACEBOOK_ID', - secret: 'OAUTH_FACEBOOK_SECRET' - }, - google: { - id: 'OAUTH_GOOGLE_ID', - secret: 'OAUTH_GOOGLE_SECRET' - }, - linkedin: { - id: 'OAUTH_LINKEDIN_ID', - secret: 'OAUTH_LINKEDIN_SECRET' - } - }, - saml2: { - sp: { - __name: 'SAML2_SP', - __format: 'json' - }, - providers: { - __name: 'SAML2_PROVIDERS', - __format: 'json' - } - }, - oidc: { - providers: { - __name: 'OIDC_PROVIDERS', - __format: 'json' - } - }, - noBirthday: { - __name: 'NO_BIRTHDAY', - __format: 'json' - }, - avatars: { - users: { - __name: 'AVATARS_USERS', - __format: 'json' - }, - orgs: { - __name: 'AVATARS_ORGS', - __format: 'json' - } - }, - perOrgStorageTypes: { - __name: 'PER_ORG_STORAGE_TYPES', - __format: 'json' - }, - cipherPassword: 'CIPHER_PASSWORD', - notifyUrl: 'NOTIFY_URL', - privateNotifyUrl: 'PRIVATE_NOTIFY_URL', - plannedDeletionDelay: { - __name: 'PLANNED_DELETION_DELAY', - __format: 'json' - }, - cleanup: { - cron: 'CLEANUP_CRON', - deleteInactive: { - __name: 'CLEANUP_DELETE_INACTIVE', - __format: 'json' - }, - deleteInactiveDelay: { - __name: 'CLEANUP_DELETE_INACTIVE_DELAY', - __format: 'json' - } - }, - alwaysAcceptInvitation: { - __name: 'ALWAYS_ACCEPT_INVITATION', - __format: 'json' - }, - observer: { - active: { - __name: 'OBSERVER_ACTIVE', - __format: 'json' - } - }, - depAdminIsOrgAdmin: { - __name: 'DEP_ADMIN_IS_ORG_ADMIN', - __format: 'json' - }, - manageSites: { - __name: 'MANAGE_SITES', - __format: 'json' - }, - managePartners: { - __name: 'MANAGE_PARTNERS', - __format: 'json' - }, - defaultOrg: 'DEFAULT_ORG' -} diff --git a/config/default.js b/config/default.js deleted file mode 100644 index b6bebac8..00000000 --- a/config/default.js +++ /dev/null @@ -1,281 +0,0 @@ -module.exports = { - port: 8080, - noUI: false, - publicUrl: 'http://localhost:8080', - kid: 'simple-directory', - secret: { - public: './security/simple-directory.key.pub', - private: './security/simple-directory.key' - }, - oldSessionDomain: null, // used to cleanup cookies from older domain - jwtDurations: { - initialToken: '15m', - exchangedToken: '30d', - invitationToken: '10d', - partnerInvitationToken: '10d', - '2FAToken': '30d' - }, - admins: ['admin@test.com'], - adminsOrg: null, - admins2FA: false, - // special case where a email/password is defined at config level for a superadmin - // useful when superadmins cannot be created in the storage (on-premise ldap with heavy constraints ?) - // or to test stuff while email sending is not working yet, etc - adminCredentials: null, - roles: { - defaults: ['admin', 'user'], - editable: false - }, - contact: 'contact@test.com', - anonymousContactForm: false, - anonymousAction: { - expiresIn: '1d', - notBefore: '8s' - }, - homePage: null, - storage: { - // One of 'file', 'mongo' and 'ldap' - type: 'mongo', - file: { - users: './data/users.json', - organizations: './data/organizations.json' - }, - mongo: { - url: 'mongodb://mongo:27017/simple-directory-' + (process.env.NODE_ENV || 'development'), - readonly: false, - clientOptions: {} - }, - ldap: { - url: 'ldap://ldap:389', - searchUserDN: 'cn=admin,dc=example,dc=org', - searchUserPassword: '', - baseDN: 'dc=example,dc=org', - readonly: true, - // support storing overwritten properties in mongodb - overwrite: ['members', 'departments'], - cacheMS: 1000 * 60 * 5, // 5 minutes - // map entities in ldap to SD users - users: { - objectClass: 'inetOrgPerson', - dnKey: 'cn', - mapping: { - id: 'cn', - name: 'cn', - email: 'mail', - firstName: 'givenName', - lastName: 'sn', - birthday: null, - avatarUrl: null - }, - // an array of objects that can be used to overwrite any user properties based on matching "email" property - overwrite: [], - // an array of string filters to add to the filters generated by our ldap storage - extraFilters: [] - }, - // map entities in ldap to SD organizations - organizations: { - // a single static organization, all users are in it - // {id: ..., name: ...} - staticSingleOrg: null, - objectClass: 'organization', - dnKey: 'dc', - mapping: { - id: 'dc', - name: 'o' - }, - // an array of objects that can be used to overwrite any org properties based on matching "id" property - overwrite: [], - // an array of string filters to add to the filters generated dy our ldap storage - extraFilters: [] - }, - // manage the link between users and organizations - members: { - // organizations arr the parent DC of their users - organizationAsDC: true, - // only list users/members with a known role - onlyWithRole: false, - role: { - attr: 'employeeType', - /* values: { - admin: ['administrator'], - user: [] - }, */ - values: {}, - default: 'user' - }, - // an array of objects that can be used to overwrite member role based on matching "orgId" and "email" properties - // leave orgId empty to overwrite role for all organizations of the user - overwrite: [] - } - } - }, - info: { - termsOfService: 'https://koumoul.com/term-of-service', - contact: { - name: 'Koumoul', - url: 'https://koumoul.com', - email: 'support@koumoul.com' - } - }, - webhooks: { - identities: [] - }, - analytics: {}, // a "modules" definition for @koumoul/vue-multianalytics - theme: { - logo: null, - favicon: null, - dark: false, - colors: { - // standard vuetify colors - primary: '#1E88E5', // blue.darken1 - secondary: '#42A5F5', // blue.lighten1, - accent: '#FF9800', // orange.base - error: 'FF5252', // red.accent2 - info: '#2196F3', // blue.base - success: '#4CAF50', // green.base - warning: '#E91E63', // pink.base - admin: '#E53935' // red.darken1 - }, - darkColors: { - primary: '#2196F3', // blue.base - success: '#00E676' // green.accent3 - }, - cssUrl: null, - cssText: '' - }, - i18n: { - locales: ['fr', 'en', 'es', 'pt', 'it', 'de'] - }, - mails: { - from: 'no-reply@test.com', - // transport is a full configuration object for createTransport of nodemailer - // cf https://nodemailer.com/smtp/ - transport: { - port: 1025, - ignoreTLS: true, - host: '127.0.0.1' - }, - extraParams: {} - }, - maildev: { - url: 'http://127.0.0.1:1080', - active: false - }, - quotas: { - defaultMaxCreatedOrgs: -1, - defaultMaxNbMembers: 0 - }, - // Restricts who can use the find endpoints on users and organizations - // One of 'anonymous', 'authenticated' or 'admin' - listEntitiesMode: 'authenticated', - listUsersMode: null, // same as listEntitiesMode but only for users - listOrganizationsMode: null, // same as listEntitiesMode but only for users - // Users can not be created at first email sent. They must be invited in an organization. - // also they will not be able to log with personal account - // and if removed from their last organization they will be deleted - onlyCreateInvited: false, - // prevent inviting a user in multiple departments of the same organization - singleMembership: false, - // users cannot delete their own account by default - userSelfDelete: false, - // Default redirection after login. If not specified user will go to his profile page. - defaultLoginRedirect: null, - // Redirect after successful invitation to an organization. - // If not specified user will go to a dedicated page on simple-directory. - invitationRedirect: null, - // secrets that can be used to configure global webhooks for example to send emails to users - secretKeys: { - sendMails: null, - limits: null, - readAll: null, - metrics: null, - notifications: null, - sites: null - }, - // A link to the terms of services for the site - tosUrl: null, - manageDepartments: false, - manageDepartmentLabel: false, - passwordless: true, - authRateLimit: { - attempts: 5, - duration: 60 - }, - // Example of full oauth provider configuration - // oauth: {providers: [{ - // id: 'github', - // icon: 'mdi-github', - // title: 'GitHub', - // color: '#4078c0', - // scope: 'user:email' - // client: { - // id: '...', - // secret: '...' - // }, - // auth: { - // tokenHost: 'https://github.com', - // tokenPath: '/login/oauth/access_token', - // authorizePath: '/login/oauth/authorize' - // } - // }]} - oauth: { - providers: [], - statesDir: './security', - github: { - id: '', - secret: '' - }, - facebook: { - id: '', - secret: '' - }, - google: { - id: '', - secret: '' - }, - linkedin: { - id: '', - secret: '' - } - }, - saml2: { - certsDirectory: './security/saml2', - // Accepts all samlify options for service providers https://samlify.js.org/#/sp-configuration - sp: {}, - // providers have the usual title/color/icon/img attributes and all extra options accepted by samlify - // for identify provider https://samlify.js.org/#/idp-configuration - providers: [] - }, - oidc: { - providers: [] - }, - noBirthday: false, - avatars: { - users: true, - orgs: true - }, - // allow configuring external storages per organization - perOrgStorageTypes: [], - cipherPassword: null, - notifyUrl: null, - privateNotifyUrl: null, - locks: { - // in seconds - ttl: 600 - }, - plannedDeletionDelay: 14, - cleanup: { - cron: '0 5 * * *', - deleteInactive: false, - deleteInactiveDelay: [3, 'years'] - }, - alwaysAcceptInvitation: false, - observer: { - active: true - }, - // temporary option to prevent some regression - depAdminIsOrgAdmin: false, - manageSites: false, - managePartners: false, - defaultOrg: null -} diff --git a/config/test.js b/config/test.js deleted file mode 100644 index 1d8436b9..00000000 --- a/config/test.js +++ /dev/null @@ -1,55 +0,0 @@ -module.exports = { - port: 5690, - publicUrl: 'http://127.0.0.1:5689/simple-directory', - secret: { - public: './test/resources/test.key.pub', - private: './test/resources/test.key' - }, - admins: ['admin@test.com', 'alban.mouton@koumoul.com'], - storage: { - type: 'file', - file: { - users: './test/resources/users.json', - organizations: './test/resources/organizations.json' - }, - mongo: { - url: 'mongodb://localhost:27017/data-fair-' + (process.env.NODE_ENV || 'test') - }, - ldap: { - url: 'ldap://localhost:389', - cacheMS: 0, - searchUserDN: 'cn=admin,dc=example,dc=org', - searchUserPassword: 'admin' - } - }, - secretKeys: { - sendMails: 'testkey', - limits: 'testkey', - readAll: 'testkey', - metrics: 'testkey', - sites: 'testkey' - }, - authRateLimit: { - attempts: 100, - duration: 60 - }, - perOrgStorageTypes: ['ldap'], - maildev: { - active: true - }, - noUI: false, - manageSites: true, - oidc: { - providers: [{ - title: 'Test OIDC IDP', - color: '#288E35', - img: 'https://cdn-icons-png.flaticon.com/512/25/25231.png', - discovery: 'http://localhost:9009/.well-known/openid-configuration', - client: { - id: 'foo', - secret: 'bar' - } - }] - }, - managePartners: true -} diff --git a/contract/JWK.json b/contract/JWK.json deleted file mode 100644 index 536585e7..00000000 --- a/contract/JWK.json +++ /dev/null @@ -1,19 +0,0 @@ -{ - "id": "https://lets-encrypt.org/schema/01/jwk#", - "$schema": "http://json-schema.org/draft-04/schema#", - "description": "Schema for a jwk (**kty RSA/e=65537 ONLY**)", - "type": "object", - "required": ["kty", "e", "n"], - "properties": { - "kty": { - "enum" : [ "RSA" ] - }, - "e": { - "enum" : [ "AQAB" ] - }, - "n": { - "type": "string", - "pattern": "^[-_=0-9A-Za-z]+$" - } - } -} diff --git a/contract/contact-mail.json b/contract/contact-mail.json deleted file mode 100644 index d77cb301..00000000 --- a/contract/contact-mail.json +++ /dev/null @@ -1,17 +0,0 @@ -{ - "type": "object", - "additionalProperties": false, - "required": ["from", "subject", "text"], - "properties": { - "from": { - "type": "string", - "format": "email" - }, - "subject": { - "type": "string" - }, - "text": { - "type": "string" - } - } -} diff --git a/contract/mail.json b/contract/mail.json deleted file mode 100644 index 1884f593..00000000 --- a/contract/mail.json +++ /dev/null @@ -1,39 +0,0 @@ -{ - "type": "object", - "additionalProperties": false, - "required": ["to", "subject", "text"], - "properties": { - "to": { - "description": "Array of users / organizations recipient of the email", - "type": "array", - "items": { - "type": "object", - "additionalProperties": false, - "required": ["type", "id"], - "properties": { - "id": { - "type": "string", - "description": "Id of the user or organization" - }, - "type": { - "type": "string", - "enum": ["user", "organization"] - }, - "role": { - "type": "string", - "description": "If the recipient is an organization, you can restric to the members with a certain role" - } - } - } - }, - "subject": { - "type": "string" - }, - "text": { - "type": "string" - }, - "html": { - "type": "string" - } - } -} diff --git a/contract/organization.json b/contract/organization.json deleted file mode 100644 index 0463f580..00000000 --- a/contract/organization.json +++ /dev/null @@ -1,116 +0,0 @@ -{ - "type": "object", - "additionalProperties": false, - "required": ["id", "name"], - "properties": { - "id": { - "description": "The unique id of the organization", - "type": "string" - }, - "name": { - "description": "Name of the organization", - "type": "string", - "maxLength": "150" - }, - "description": { - "description": "Description of the organization", - "type": "string" - }, - "roles": { - "description": "The list or roles used inside this organization", - "type": "array", - "items": { - "type": "string" - } - }, - "2FA": { - "properties": { - "roles": { - "description": "The list of roles that require 2FA inside this organization", - "type": "array", - "items": { - "type": "string" - } - } - } - }, - "departmentLabel": { - "description": "How the department concept is named in the context of this organization", - "type": "string" - }, - "departments": { - "description": "The list of departments inside the organization", - "type": "array", - "items": { - "type": "object", - "properties": { - "id": { - "type": "string" - }, - "name": { - "type": "string" - } - } - } - }, - "members": { - "description": "The members of the organization", - "type": "array", - "items": { - "type": "object", - "additionalProperties": false, - "required": ["id", "role"], - "properties": { - "id": { - "type": "string", - "description": "Identifier of the account for this member" - }, - "role": { - "type": "string", - "enum": ["admin", "user"], - "description": "Role for this member in this organization" - }, - "createdAt": { - "type": "string", - "format": "date-time" - }, - "departments": { - "type": "array", - "items": { - "type": "object", - "properties": { - "id": { - "type": "string", - "description": "Identifier of the department" - }, - "role": { - "type": "string", - "enum": ["admin", "user"], - "description": "Role for this member in this department" - } - } - } - } - } - } - }, - "avatarUrl": { - "description": "URL of this organization's avatar", - "type": "string", - "readOnly": true - }, - "orgStorage": { - "type": "object", - "description": "Manage a secondary user storage per-organization (super admin only)", - "properties": { - "active": {"type": "boolean"}, - "type": { - "type": "string", - "enum": ["ldap"] - }, - "readonly": {"type": "boolean"}, - "config": {"type": "object"} - } - } - } -} diff --git a/contract/user.json b/contract/user.json deleted file mode 100644 index 37684ac9..00000000 --- a/contract/user.json +++ /dev/null @@ -1,66 +0,0 @@ -{ - "type": "object", - "additionalProperties": false, - "required": ["id", "email"], - "properties": { - "id": { - "description": "The unique id of the user", - "type": "string" - }, - "email": { - "description": "The main email of the user", - "type": "string" - }, - "host": { - "description": "Site where the user created his account (leave empty if it is the main public site)", - "type": "string" - }, - "firstName": { - "description": "First name of the user", - "type": "string", - "maxLength": "100" - }, - "lastName": { - "description": "Family name of the user", - "type": "string", - "maxLength": "100" - }, - "isAdmin": { - "description": "Is this user a global admin (independant of organizations)", - "type": "boolean" - }, - "maxCreatedOrgs": { - "description": "The maximum number of organizations this user can create. -1 means indeterminate number. Fallback to a global default value if not defined.", - "type": "number" - }, - "birthday": { - "description": "Birth date of the user", - "type": "string", - "format": "date-time" - }, - "avatarUrl": { - "description": "URL of this user's avatar", - "type": "string", - "readOnly": true - }, - "oauth": { - "description": "Identity rattached to oauth providers", - "type": "object", - "readOnly": true - }, - "defaultOrg": { - "type": "string" - }, - "defaultDep": { - "type": "string" - }, - "ignorePersonalAccount": { - "type": "boolean", - "default": false - }, - "plannedDeletion": { - "type": "string", - "format": "date" - } - } -} diff --git a/test/resources/ldap-user.ldif b/dev/resources/ldap-user.ldif similarity index 100% rename from test/resources/ldap-user.ldif rename to dev/resources/ldap-user.ldif diff --git a/dev/resources/nginx.conf b/dev/resources/nginx.conf new file mode 100644 index 00000000..0abb1e58 --- /dev/null +++ b/dev/resources/nginx.conf @@ -0,0 +1,191 @@ +# nginx configuration file for Data Fair development and test environment + +user nginx; +worker_processes auto; + +error_log /var/log/nginx/error.log notice; +pid /var/run/nginx.pid; + +events { + worker_connections 1024; +} + +http { + include /etc/nginx/mime.types; + default_type application/octet-stream; + + # use header origin if referer is empty + map $http_referer $reqref { + default $http_referer; + "" $http_origin; + } + + sendfile on; + #tcp_nopush on; + + keepalive_timeout 65; + + map $http_upgrade $connection_upgrade { + default upgrade; + '' close; + } + + # first origin http://localhost:5689 + server { + listen 5689; + server_name _; + + # Transmit host, protocol and user ip, we use it for routing, rate limiting, etc. + proxy_set_header Host $http_host; + proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; + proxy_set_header X-Forwarded-Proto $scheme; + proxy_set_header X-Forwarded-Host $http_host; + proxy_set_header X-Real-IP $remote_addr; + proxy_set_header X-Client-IP $remote_addr; + # web socket support + proxy_set_header Upgrade $http_upgrade; + proxy_set_header Connection "Upgrade"; + + # redirect root to /simple-directory/ + location = / { + return 302 /simple-directory/; + } + + location /simple-directory/api { + proxy_pass http://localhost:5690; + } + location /simple-directory/.well-known { + proxy_pass http://localhost:5690; + } + location /simple-directory { + proxy_pass http://localhost:6220; + } + location /mails { + rewrite ^/mails/(.*) /$1 break; + proxy_pass http://localhost:1080/; + } + location /events { + proxy_pass http://localhost:8088; + } + } + + # another one to simulate multi-site usage + server { + listen 5989; + server_name _; + + # Transmit host, protocol and user ip, we use it for routing, rate limiting, etc. + proxy_set_header Host $http_host; + proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; + proxy_set_header X-Forwarded-Proto $scheme; + proxy_set_header X-Forwarded-Host $http_host; + proxy_set_header X-Real-IP $remote_addr; + proxy_set_header X-Client-IP $remote_addr; + # web socket support + proxy_set_header Upgrade $http_upgrade; + proxy_set_header Connection "Upgrade"; + + # redirect root to /simple-directory/ + location = / { + return 302 /simple-directory/; + } + + location /simple-directory/api { + proxy_pass http://localhost:5690; + } + location /simple-directory/.well-known { + proxy_pass http://localhost:5690; + } + location /simple-directory { + proxy_pass http://localhost:6220; + } + location /mails { + rewrite ^/mails/(.*) /$1 break; + proxy_pass http://localhost:1080/; + } + location /events { + proxy_pass http://localhost:8088/; + } + } + + # another one to simulate multi-site usage + server { + listen 5999; + server_name _; + + # Transmit host, protocol and user ip, we use it for routing, rate limiting, etc. + proxy_set_header Host $http_host; + proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; + proxy_set_header X-Forwarded-Proto $scheme; + proxy_set_header X-Forwarded-Host $http_host; + proxy_set_header X-Real-IP $remote_addr; + proxy_set_header X-Client-IP $remote_addr; + # web socket support + proxy_set_header Upgrade $http_upgrade; + proxy_set_header Connection "Upgrade"; + + # redirect root to /simple-directory/ + location = / { + return 302 /simple-directory/; + } + + location /simple-directory/api { + proxy_pass http://localhost:5690; + } + location /simple-directory/.well-known { + proxy_pass http://localhost:5690; + } + location /simple-directory { + proxy_pass http://localhost:6220; + } + location /mails { + rewrite ^/mails/(.*) /$1 break; + proxy_pass http://localhost:1080/; + } + location /events { + proxy_pass http://localhost:8088/; + } + } + + # another one to simulate multi-site with a path prefix + server { + listen 6099; + server_name _; + + # Transmit host, protocol and user ip, we use it for routing, rate limiting, etc. + proxy_set_header Host $http_host; + proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; + proxy_set_header X-Forwarded-Proto $scheme; + proxy_set_header X-Forwarded-Host $http_host; + proxy_set_header X-Real-IP $remote_addr; + proxy_set_header X-Client-IP $remote_addr; + # web socket support + proxy_set_header Upgrade $http_upgrade; + proxy_set_header Connection "Upgrade"; + + # redirect root to /simple-directory/ + location = / { + return 302 /site-prefix/simple-directory/; + } + location = /site-prefix { + return 302 /site-prefix/simple-directory/; + } + + location /site-prefix/simple-directory/api { + proxy_pass http://localhost:5690; + } + location /site-prefix/simple-directory/.well-known { + proxy_pass http://localhost:5690; + } + location /site-prefix/simple-directory { + proxy_pass http://localhost:6220; + } + location /site-prefix/mails { + rewrite ^/mails/(.*) /$1 break; + proxy_pass http://localhost:1080/; + } + location /site-prefix/events { + proxy_pass http://localhost:8088/; + } + } +} \ No newline at end of file diff --git a/test/resources/organizations.json b/dev/resources/organizations.json similarity index 91% rename from test/resources/organizations.json rename to dev/resources/organizations.json index 8e0de453..0fc545bd 100644 --- a/test/resources/organizations.json +++ b/dev/resources/organizations.json @@ -41,6 +41,14 @@ }, { "id": "dmeadus0", "role": "user" + }, { + "id": "dhannan8", + "role": "admin", + "department": "dep1" + }], + "departments": [{ + "id": "dep1", + "name": "Dep 1" }] }, { @@ -93,6 +101,7 @@ "active": true, "config": { "url": "ldap://localhost:389", + "baseDN": "dc=example,dc=org", "searchUserDN": "cn=admin,dc=example,dc=org", "searchUserPassword": "admin", "users": { diff --git a/test/resources/users.json b/dev/resources/users.json similarity index 87% rename from test/resources/users.json rename to dev/resources/users.json index a7e342f1..7796c748 100644 --- a/test/resources/users.json +++ b/dev/resources/users.json @@ -4,7 +4,7 @@ "lastName": "Meadus", "email": "dmeadus0@answers.com", "password": { - "clear": "testpasswd" + "clear": "TestPasswd01" } }, { @@ -53,7 +53,10 @@ "id": "dhannan8", "firstName": "Danielle", "lastName": "Hannan", - "email": "dhannan8@4shared.com" + "email": "dhannan8@4shared.com", + "password": { + "clear": "TestPasswd01" + } }, { "id": "icarlens9", @@ -68,15 +71,15 @@ "email": "alban.mouton@koumoul.com", "isAdmin": true, "password": { - "clear": "testpasswd" + "clear": "TestPasswd01" } }, { "id": "superadmin", - "email": "superadmin@test.com", + "email": "admin@test.com", "isAdmin": true, "password": { - "clear": "superpasswd" + "clear": "TestPasswd01" } } ] diff --git a/doc/layouts/default.vue b/doc/layouts/default.vue deleted file mode 100644 index 909597a3..00000000 --- a/doc/layouts/default.vue +++ /dev/null @@ -1,117 +0,0 @@ - - - - - diff --git a/doc/nuxt.config.js b/doc/nuxt.config.js deleted file mode 100644 index 217bbd7a..00000000 --- a/doc/nuxt.config.js +++ /dev/null @@ -1,49 +0,0 @@ -const fs = require('fs') -const config = require('config') -const messages = require('../i18n').messages - -// Additional dynamic routes for generate -const routes = fs.readdirSync('doc/pages/doc/') - .filter(f => f.endsWith('.md')) - .map(f => { - const [key, lang] = f.replace('.md', '').split('-') - if (lang === 'fr') return `/doc/${key}` - else return `/${lang}/doc/${key}` - }) - -module.exports = { - srcDir: 'doc/', - build: { extractCSS: true }, - generate: { - dir: 'doc-dist', - routes - }, - loading: { color: '#1e88e5' }, // Customize the progress bar color - plugins: [{ src: '~plugins/vuetify' }], - router: { base: '/simple-directory/' }, - env: { theme: config.theme }, - modules: ['@nuxtjs/markdownit', ['@nuxtjs/i18n', { - locales: [ - { code: 'fr' }, - { code: 'en' } - ], - defaultLocale: 'fr', - vueI18n: { - fallbackLocale: 'fr', - messages - } - }]], - head: { - title: 'Simple Directory', - meta: [ - { charset: 'utf-8' }, - { name: 'viewport', content: 'width=device-width, initial-scale=1' }, - { hid: 'application', name: 'application-name', content: 'Simple Directory' }, - { hid: 'description', name: 'description', content: 'Simple Directory - Documentation' } - ], - link: [ - { rel: 'stylesheet', href: 'https://fonts.googleapis.com/css?family=Nunito:300,400,500,700,400italic|Material+Icons' }, - { rel: 'icon', type: 'image/x-icon', href: 'favicon.ico' } - ] - } -} diff --git a/doc/pages/doc/_id.vue b/doc/pages/doc/_id.vue deleted file mode 100644 index f7d5bfa0..00000000 --- a/doc/pages/doc/_id.vue +++ /dev/null @@ -1,90 +0,0 @@ - - - - - diff --git a/doc/pages/doc/about-en.md b/doc/pages/doc/about-en.md deleted file mode 100644 index 9f9f6f72..00000000 --- a/doc/pages/doc/about-en.md +++ /dev/null @@ -1,3 +0,0 @@ -# Simple Directory - -TODO diff --git a/doc/pages/doc/about-fr.md b/doc/pages/doc/about-fr.md deleted file mode 100644 index 72fbf23d..00000000 --- a/doc/pages/doc/about-fr.md +++ /dev/null @@ -1,31 +0,0 @@ -## Simple Directory - -*Gestion simplifiée de vos utilisateurs et vos organisations dans une architecture moderne orientée Web.* - -*Simple Directory* est initialement développé par [Koumoul](https://koumoul.com) pour satisfaire nos besoins en terme de gestion des utilisateurs et des organisations dans une plateforme Web constituée de services autonomes. Nous cherchons un compromis entre des fonctionnalités puissantes dans le domaine très dense qu'est la gestion d'identité sur le Web et une simplicité maximale pour fluidifier l'expérience de maintenance, d'administration, d'intégration et d'utilisation. - -Le projet est [publié en Open Source](https://github.com/koumoul-dev/simple-directory) pour instaurer la confiance par la transparence et dans l'espoir de trouver une place dans l'écosystème du logiciel libre et de développer une communauté. - -### Fonctionnalités principales - - - Gestion d'une base d'utilisateurs - - Gestion d'organisations - - Gestion de rôles associés aux utilisateurs dans des organisations - - Scénario d'authentification et de maintien de session robuste - - Aide au respect des obligations liées au [RGPD](https://www.cnil.fr/fr/principes-cles/rgpd-se-preparer-en-6-etapes) - -### Des bases solides - -*Simple Directory* agit comme fournisseur d'identité selon le protocole [OpenID Connect](http://openid.net/connect/) tout comme les fournisseurs d'identité de [France Connect](https://franceconnect.gouv.fr/). Derrière ce protocole mature se trouve le retour d'expérience de nombreux acteurs du Web depuis de nombreuses années. - -*OpenID Connect* est lui même basé sur d'autres protocoles comme [OAuth](https://oauth.net/), [JWT](https://jwt.io/) et [JWKS](https://auth0.com/docs/jwks). - -La preuve d'identité basique du point de vue de *Simple Directory* n'est pas le mot de passe, mais l'accès à une boite mail. Cette approche est généralement appelée *passwordless* et nous la décrivons dans [cet article](https://koumoul.com/blog/passwordless). - -En complément de l'authentification sans mot de passe basée sur les emails, le service propose également d'être client d'autres fournisseurs d'identité reconnus comme *France Connect*, *Google*, *Github*, etc. - -### Adaptable et extensible - -Le titre, le logo, les couleurs du thème, le contenu des emails, la langue par défaut, etc. *Simple Directory* est largement configurable pour être intégré de manière élégante dans votre système. - -Le service est construit de manière à supporter l'ajout de nouveaux supports de persistance des bases d'utilisateurs et d'organisations. Nous prévoyons également d'implémenter l'intéropérabilité avec d'autres bases comme LDAP, dans ce contexte *Simple Directory* est un moyen de moderniser votre système sans le bouleverser. diff --git a/doc/pages/doc/config-en.md b/doc/pages/doc/config-en.md deleted file mode 100644 index 3667f609..00000000 --- a/doc/pages/doc/config-en.md +++ /dev/null @@ -1,19 +0,0 @@ -## Configuration - -### Variables - -*Simple Directory* supports quite a large number of parameters that are documented below. We try as much as possible to define sensible default values, still some parameters will almost always need to be overridden, these parameters have **IMPORTANT** in their descriptions. - -Parameters can be overridden by directly modifying the files, but the recommanded way is to use environment variables. - -{{CONFIG_VARS}} - -### Internationalization - -All messages in *Simple Directory* are externalized and internationalized. - -To add a language you can add a file in [this directory ]((https://github.com/koumoul-dev/simple-directory/tree/master/i18n)) either by overwriting the Docker image or submitting a pull request. - -To change some values you can set environment variables when running the service. The table below contains the supported keys. **Warning:** we try to keep the keys as stables as possible, but still some modification may occur between 2 versions of *Simple Directory*. If you overwrite some values, you should check it again after each upgrade. - -{{I18N_VARS}} diff --git a/doc/pages/doc/config-fr.md b/doc/pages/doc/config-fr.md deleted file mode 100644 index 43d89529..00000000 --- a/doc/pages/doc/config-fr.md +++ /dev/null @@ -1,21 +0,0 @@ -## Configuration - -### Variables - -*Simple Directory* supporte un nombre assez important de paramètres qui sont documentés ci-dessous. Autant que possible nous définissons des valeurs par défaut sensées, mais certains paramètres seront presque toujours à définir pour un nouveau déploiement, ces paramètres contiennent **IMPORTANT** dans leurs descriptions. - -Les paramètres peuvent être surchargés directement en modifiant les fichiers, mais la manière recommandée est de définir des variables d'environnement. - -{{CONFIG_VARS}} - -### Internationalisation - -Tous les libellés de *Simple Directory* sont externalisés et internationalisés. - -Pour ajouter une langue vous pouvez ajouter un fichier dans [ce répertoire](https://github.com/koumoul-dev/simple-directory/tree/master/i18n) soit par surcharge de l'image docker soit en soumettant une *pull request*. - -Pour modifier des valeurs de libellés vous pouvez passer des variables d'environnements au démarrage du service. La table ci-dessous contient la liste des clés supportées. - -**Attention :** nous essayons de maintenir ces clés aussi stables que possibles, mais il est toujours possible que quelques modifications surviennent entre 2 versions de *Simple Directory*. Si vous surchargez des valeurs, vous devez vérifier que cette surcharge reste effective au moment d'une montée en version. - -{{I18N_VARS}} diff --git a/doc/pages/doc/install-en.md b/doc/pages/doc/install-en.md deleted file mode 100644 index eeb66fcb..00000000 --- a/doc/pages/doc/install-en.md +++ /dev/null @@ -1,3 +0,0 @@ -## Install - -**TODO** diff --git a/doc/pages/doc/install-fr.md b/doc/pages/doc/install-fr.md deleted file mode 100644 index cf4cb9ff..00000000 --- a/doc/pages/doc/install-fr.md +++ /dev/null @@ -1,3 +0,0 @@ -## Installation - -**TODO** diff --git a/doc/pages/doc/use-en.md b/doc/pages/doc/use-en.md deleted file mode 100644 index 3762eb65..00000000 --- a/doc/pages/doc/use-en.md +++ /dev/null @@ -1,3 +0,0 @@ -## User documentation - -**TODO** diff --git a/doc/pages/doc/use-fr.md b/doc/pages/doc/use-fr.md deleted file mode 100644 index b701174f..00000000 --- a/doc/pages/doc/use-fr.md +++ /dev/null @@ -1,3 +0,0 @@ -## Documentation utilisateur - -**TODO** diff --git a/doc/pages/index.vue b/doc/pages/index.vue deleted file mode 100644 index 4d3d7d8e..00000000 --- a/doc/pages/index.vue +++ /dev/null @@ -1,31 +0,0 @@ - - - diff --git a/doc/plugins/vuetify.js b/doc/plugins/vuetify.js deleted file mode 100644 index 7051194c..00000000 --- a/doc/plugins/vuetify.js +++ /dev/null @@ -1,7 +0,0 @@ -import Vue from 'vue' -import Vuetify from 'vuetify' -import 'vuetify/dist/vuetify.min.css' - -Vue.use(Vuetify, { - theme: process.env.theme.colors -}) diff --git a/docker-compose.yml b/docker-compose.yml index 6abaac55..6a4688d7 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -1,5 +1,8 @@ -version: '3' services: + ##### + # reverse proxy for the whole environment + ##### + nginx: image: nginx:1.23.1-alpine profiles: @@ -7,17 +10,11 @@ services: - test network_mode: host volumes: - - ./test/resources/nginx.conf:/etc/nginx/conf.d/default.conf:ro + - ./dev/resources/nginx.conf:/etc/nginx/nginx.conf:ro - mongo: - profiles: - - dev - - test - image: mongo:4.2 - ports: - - 27017:27017 - volumes: - - mongo-data4:/data/db + ##### + # mail server mock + ##### maildev: profiles: @@ -31,16 +28,19 @@ services: healthcheck: test: 'wget -O - http://127.0.0.1:$${MAILDEV_WEB_PORT}$${MAILDEV_BASE_PATHNAME}/healthz || exit 1' - # LDAP mock + ##### + # auth providers + ##### + ldap: profiles: - dev - test image: osixia/openldap:1.4.0 volumes: - - ./data/ldap:/var/lib/ldap - - ./data/slapd.d:/etc/ldap/slapd.d - - ./test/resources:/test-resources + - ./dev/data/ldap:/var/lib/ldap + - ./dev/data/slapd.d:/etc/ldap/slapd.d + - ./dev/resources:/test-resources ports: - 389:389 - 636:636 @@ -49,6 +49,8 @@ services: - dev image: osixia/phpldapadmin:0.9.0 ports: + # open over HTTPS https://localhost:6443/ + # log with cn=admin,dc=example,dc=org / admin - 6443:443 environment: - PHPLDAPADMIN_LDAP_HOSTS=ldap @@ -67,7 +69,7 @@ services: - SIMPLESAMLPHP_SP_ENTITY_ID=http://localhost:5689/simple-directory/api/auth/saml2-metadata.xml - SIMPLESAMLPHP_SP_ASSERTION_CONSUMER_SERVICE=http://localhost:5689/simple-directory/api/auth/saml2-assert - SIMPLESAMLPHP_SP_SINGLE_LOGOUT_SERVICE=http://localhost:5689/simple-directory/api/auth/saml2-logout - + # WARNING: does not work on a recent chrome, this provider tries to use a cookie with samesite=none option and this is not permitted without https # list of users : harley@qlik.example # harley@qlik.example Password1! @@ -76,7 +78,6 @@ services: - dev - test image: qlik/simple-oidc-provider:0.2.5 - platform: linux/amd64 network_mode: host environment: - REDIRECTS=http://localhost:5689/simple-directory/api/auth/oauth-callback @@ -94,23 +95,41 @@ services: - KEYCLOAK_ADMIN_PASSWORD=admin network_mode: host volumes: - - ./data/keycloak:/opt/keycloak/data/ + - ./dev/data/keycloak:/opt/keycloak/data/ command: ["start-dev", "--http-port=8888"] + + ##### + # related services from the data-fair stack + ##### - notify: + events: profiles: - dev - image: ghcr.io/data-fair/notify:master + image: ghcr.io/data-fair/events:main network_mode: host environment: - PORT=8088 - PUBLIC_URL=http://localhost:5689/notify - WS_PUBLIC_URL=ws://localhost:5689/notify - - DIRECTORY_URL=http://localhost:5689 - - SECRET_NOTIFICATIONS=secret-notifications + - PRIVATE_DIRECTORY_URL=http://localhost:5689/simple-directory + - SECRET_EVENTS=secret-events + - SECRET_IDENTITIES=secret-identities - SECRET_SENDMAILS=secret-sendmails - - PROMETHEUS_ACTIVE=false + - OBSERVER_ACTIVE=false + + ##### + # db + ##### + + mongo: + profiles: + - dev + - test + image: mongo:4.2 + ports: + - 27017:27017 + volumes: + - mongo-data:/data/db volumes: - mongo-data4: - mongo-data7: + mongo-data: diff --git a/eslint.config.mjs b/eslint.config.mjs new file mode 100644 index 00000000..19b0e4fb --- /dev/null +++ b/eslint.config.mjs @@ -0,0 +1,8 @@ +import neostandard from 'neostandard' +import dfLibRecommended from '@data-fair/lib-utils/eslint/recommended.js' + +export default [ + { ignores: ['ui/*', '**/.type/', 'dev/*', 'node_modules/*'] }, + ...dfLibRecommended, + ...neostandard({ ts: true }) +] diff --git a/i18n/index.js b/i18n/index.js deleted file mode 100644 index 436fb733..00000000 --- a/i18n/index.js +++ /dev/null @@ -1,76 +0,0 @@ -const flatten = require('flat') -const unflatten = flatten.unflatten -const acceptLangParser = require('accept-language-parser') -const flatOpts = { delimiter: '_' } - -// cannot be changed at runtime for now, because it impacts the build -exports.defaultLocale = 'fr' -// this the full list of available langs, the proposed list is overwritten in config.i18n.locales -exports.locales = [ - { code: 'fr' }, - { code: 'en' }, - { code: 'de' }, - { code: 'it' }, - { code: 'es' }, - { code: 'pt' } -] - -// Build a map of messages of this form -// {fr: {msg1: 'libellé 1'}, en: {msg1: 'label 1'}} -const messages = {} -exports.locales.forEach(l => { - messages[l.code] = { ...require('./' + exports.defaultLocale), ...require('./' + l.code) } -}) - -const flatMessages = flatten(messages, flatOpts) - -// Manage overriding by environment variables of this form -// 'I18N_en_msg1="another label"' -Object.keys(process.env).forEach(k => { - if (k.startsWith('I18N_')) { - flatMessages[k.replace('I18N_', '')] = process.env[k] - } -}) - -exports.messages = unflatten(flatMessages, flatOpts) - -// A subset of messages for UI separated for performance. -exports.publicMessages = unflatten( - Object.keys(flatMessages) - .filter(k => ['common', 'pages', 'doc'].includes(k.split('_')[1])) - .reduce((a, k) => { a[k] = flatMessages[k]; return a }, {}) - , flatOpts) - -exports.middleware = (req, res, next) => { - const locales = acceptLangParser.parse(req.get('Accept-Language')) - const localeCode = req.cookies.i18n_lang || (locales && locales[0] && locales[0].code) || exports.defaultLocale - req.locale = localeCode - req.messages = exports.messages[localeCode] || exports.messages[exports.defaultLocale] - - // TODO: memoize ? use standard i18n module ? - - req.__ = (key, params = {}) => { - key = key.replace(/\./g, '_') - let value = flatMessages[localeCode + '_' + key] || flatMessages[exports.defaultLocale + '_' + key] || '' - Object.keys(params).forEach(key => { value = value.replace(`{${key}}`, params[key]) }) - return value - } - req.__all = (key, params = {}) => { - key = key.replace(/\./g, '_') - const res = {} - for (const locale of exports.locales) { - let value = flatMessages[locale.code + '_' + key] - if (value) { - Object.keys(params).forEach(key => { value = value.replace(`{${key}}`, params[key]) }) - res[locale.code] = value - } - } - return res - } - - req.localeDate = (date) => { - const dayjs = require('../server/utils/dayjs') - return dayjs(date).locale(localeCode) - } - next() -} diff --git a/nodemon.json b/nodemon.json deleted file mode 100644 index 523df07e..00000000 --- a/nodemon.json +++ /dev/null @@ -1,5 +0,0 @@ -{ - "verbose": true, - "ext": "js json mjml", - "watch": ["server/", "config/", "package.json", "contract/", "i18n/", "upgrade/", "types/"] -} diff --git a/nuxt.config.js b/nuxt.config.js deleted file mode 100644 index a6176520..00000000 --- a/nuxt.config.js +++ /dev/null @@ -1,153 +0,0 @@ -const i18n = require('./i18n') -let config = require('config') -config.basePath = '/simple-directory' -config.i18nMessages = i18n.messages -config.i18nLocales = config.i18n.locales.join(',') -config.readonly = config.storage.type !== 'mongo' -config.overwrite = (config.storage.type === 'ldap' && config.storage.ldap.overwrite) || [] - -const isBuilding = process.argv[2] === 'build' - -if (process.env.NODE_ENV === 'production') { - const nuxtConfigInject = require('@koumoul/nuxt-config-inject') - if (isBuilding) config = nuxtConfigInject.prepare(config) - else nuxtConfigInject.replace(config, ['nuxt-dist/**/*', 'public/static/**/*']) -} - -let vuetifyOptions = {} - -if (process.env.NODE_ENV !== 'production' || isBuilding) { - const fr = require('vuetify/es5/locale/fr').default - const en = require('vuetify/es5/locale/en').default - vuetifyOptions = { - customVariables: ['~assets/variables.scss'], - theme: { - dark: config.theme.dark, - themes: { - light: config.theme.colors, - dark: { ...config.theme.colors, ...config.theme.darkColors } - } - }, - treeShake: true, - defaultAssets: false, - lang: { - locales: { fr, en }, - current: i18n.defaultLocale - } - } -} - -module.exports = { - telemetry: false, - ssr: false, - components: true, - srcDir: 'public/', - buildDir: 'nuxt-dist', - build: { - transpile: [/@koumoul/, /@data-fair/], - babel: { - sourceType: 'unambiguous' - }, - publicPath: '_nuxt/', - extend (webpackConfig, { isServer, isDev, isClient }) { - const webpack = require('webpack') - // webpackConfig.optimization.minimize = false - // Ignore all locale files of moment.js, those we want are loaded in plugins/moment.js - webpackConfig.plugins.push(new webpack.IgnorePlugin(/^\.\/locale$/, /moment$/)) - // source-map to debug in production - webpackConfig.devtool = webpackConfig.devtool || 'source-map' - } - }, - loading: { color: '#1e88e5' }, // Customize the progress bar color - plugins: [ - { src: '~plugins/session', ssr: false }, - { src: '~plugins/query-params', ssr: false }, - { src: '~plugins/site-public', ssr: false }, - { src: '~plugins/vuetify' }, - { src: '~plugins/moment' }, - { src: '~plugins/axios' }, - { src: '~plugins/analytics', ssr: false }, - { src: '~plugins/iframe-resizer', ssr: false } - ], - router: { - base: config.basePath - }, - modules: ['@nuxtjs/markdownit', '@nuxtjs/axios', 'cookie-universal-nuxt', ['@nuxtjs/i18n', { - seo: false, - // cannot come from config as it must be defined at build time (routes are impacted - // we will override some of it at runtime using env.i18n - locales: i18n.locales, - defaultLocale: i18n.defaultLocale, - vueI18nLoader: true, - vueI18n: { - fallbackLocale: i18n.defaultLocale, - messages: config.i18nMessages - }, - strategy: 'no_prefix', - detectBrowserLanguage: { - useCookie: true, - cookieKey: 'i18n_lang' - } - }]], - axios: { - browserBaseURL: config.basePath - }, - buildModules: [ - '@nuxtjs/vuetify', - ['@nuxtjs/google-fonts', { download: true, display: 'swap', families: { Nunito: [100, 300, 400, 500, 700, 900] } }] - ], - vuetify: vuetifyOptions, - env: { - mainPublicUrl: config.publicUrl, - basePath: config.basePath, - theme: config.theme, - homePage: config.homePage, - maildev: config.maildev, - defaultMaxCreatedOrgs: config.quotas.defaultMaxCreatedOrgs, - readonly: config.readonly, - overwrite: config.overwrite, - analytics: config.analytics, - onlyCreateInvited: config.onlyCreateInvited, - userSelfDelete: config.userSelfDelete, - tosUrl: config.tosUrl, - manageDepartments: config.manageDepartments, - manageDepartmentLabel: config.manageDepartmentLabel, - passwordless: config.passwordless, - i18nLocales: config.i18nLocales, - anonymousContactForm: config.anonymousContactForm, - noBirthday: config.noBirthday, - avatars: config.avatars, - perOrgStorageTypes: config.perOrgStorageTypes, - notifyUrl: config.notifyUrl, - plannedDeletionDelay: config.plannedDeletionDelay, - alwaysAcceptInvitation: config.alwaysAcceptInvitation, - depAdminIsOrgAdmin: config.depAdminIsOrgAdmin, - manageSites: config.manageSites, - managePartners: config.managePartners - }, - head: { - title: config.i18nMessages[i18n.defaultLocale].root.title, - meta: [ - { charset: 'utf-8' }, - { name: 'viewport', content: 'width=device-width, initial-scale=1' }, - { hid: 'application', name: 'application-name', content: i18n.messages[i18n.defaultLocale].root.title }, - { hid: 'description', name: 'description', content: i18n.messages[i18n.defaultLocale].root.description } - ], - link: [ - // /favicon.ico is not put un config/default.js to prevent a nuxt-config-inject bug - { rel: 'icon', type: 'image/x-icon', href: config.theme.favicon || '/favicon.ico' } - ], - style: [] - }, - css: [ - '@mdi/font/css/materialdesignicons.min.css' - ] -} - -if (config.theme.cssUrl) { - module.exports.head.link.push({ rel: 'stylesheet', href: config.theme.cssUrl }) -} - -if (config.theme.cssText) { - module.exports.head.style.push({ type: 'text/css', cssText: config.theme.cssText }) -} diff --git a/package-lock.json b/package-lock.json index 5d626cb2..7943ed00 100644 --- a/package-lock.json +++ b/package-lock.json @@ -7,124 +7,120 @@ "": { "name": "simple-directory", "version": "7.13.1", - "hasInstallScript": true, "license": "AGPL-3.0-only", + "workspaces": [ + "ui", + "api", + "shared" + ], "dependencies": { - "@data-fair/lib": "^0.49.1", - "@data-fair/sd-express": "^1.4.0", - "@koumoul/nuxt-config-inject": "^0.4.10", - "@nuxtjs/axios": "^5.13.6", - "@nuxtjs/i18n": "^7.3.1", + "@data-fair/lib-types-builder": "^1.6.0", + "@koumoul/vjsf-compiler": "^0.2.2", + "@types/debug": "^4.1.12", + "@types/vue-cropperjs": "^4.1.6" + }, + "devDependencies": { + "@commitlint/config-conventional": "^19.2.2", + "@data-fair/lib-express": "^1.10.0", + "@data-fair/lib-node": "^2.2.1", + "@reporters/bail": "^1.2.1", + "@types/accept-language-parser": "^1.5.6", + "@types/capitalize": "^2.0.2", + "@types/config": "^3.3.3", + "@types/cookie-parser": "^1.4.7", + "@types/cookies": "^0.9.0", + "@types/gm": "^1.25.4", + "@types/ldapjs": "^3.0.6", + "@types/material-colors": "^1.2.3", + "@types/memoizee": "^0.4.11", + "@types/mjml": "^4.7.4", + "@types/multer": "^1.4.12", + "@types/node-cron": "^3.0.11", + "@types/nodemailer": "^6.4.16", + "@types/qrcode": "^1.5.5", + "@types/seedrandom": "^3.0.8", + "@types/simple-oauth2": "^5.0.7", + "@types/tinycolor2": "^1.4.6", + "@types/useragent": "^2.3.4", + "commitlint": "^19.2.2", + "eslint": "^9.10.0", + "eslint-plugin-vue": "^9.29.0", + "eslint-plugin-vuetify": "^2.5.1", + "husky": "^9.1.6", + "neostandard": "^0.11.5", + "oauth2-mock-server": "^7.1.2", + "tough-cookie": "^5.0.0", + "typescript": "~5.6.3" + } + }, + "api": { + "name": "@sd/api", + "dependencies": { + "@data-fair/lib-express": "^1.10.1", + "@data-fair/lib-node": "^2.2.1", + "@data-fair/lib-utils": "^1.2.0", + "@sd/shared": "*", "accept-language-parser": "^1.5.0", - "ajv-i18n": "^4.2.0", - "axios": "^1.3.4", - "body-parser": "^1.18.3", - "cacheable-lookup": "^6.0.4", "capitalize": "^2.0.4", - "config": "^1.31.0", - "cookie-parser": "^1.4.3", - "cookie-universal-nuxt": "^2.1.5", - "cookies": "^0.7.3", - "cors": "^2.8.5", - "csv-stringify": "^6.2.4", - "dayjs": "^1.10.7", - "debug": "^4.3.4", + "config": "^3.3.11", + "cookie-parser": "^1.4.7", + "cookies": "^0.9.1", + "csv-stringify": "^6.5.1", + "dayjs": "^1.11.13", "email-validator": "^2.0.4", - "escape-string-regexp": "^4.0.0", - "event-to-promise": "^0.8.0", - "express": "^4.18.2", - "fast-json-stringify": "^5.12.0", - "flat": "^5.0.2", - "flatstr": "^1.0.12", - "fs-extra": "^8.1.0", + "express": "^5.0.0", + "flat": "^6.0.1", "gm": "^1.25.0", - "http-errors": "^2.0.0", "http-terminator": "^3.2.0", + "i18n": "^0.15.1", "initials": "^3.1.2", - "json-schema-to-typescript": "^11.0.5", - "json-web-key": "^0.3.0", - "jsonwebtoken": "^9.0.0", - "jwks-rsa": "^3.0.1", - "ldapjs": "^2.2.3", + "json-web-key": "^0.4.0", + "ldapjs": "^3.0.7", "material-colors": "^1.2.6", - "memoizee": "^0.4.15", - "mjml": "^4.8.1", - "moment": "^2.29.4", - "mongodb": "^5.8.1", - "multer": "^1.4.4-lts.1", - "nanoid": "^5.0.8", - "node-cron": "^3.0.0", - "nodemailer": "^6.9.1", - "nuxt-start": "^2.16.3", + "memoizee": "^0.4.17", + "mjml": "^4.15.3", + "mongodb": "^6.8.0", + "ms": "^2.1.3", + "multer": "^1.4.5-lts.1", + "nanoid": "^5.0.7", + "node-cron": "^3.0.3", + "nodemailer": "^6.9.15", "otplib": "^12.0.1", - "prom-client": "^14.0.0", - "qrcode": "^1.4.4", - "rate-limiter-flexible": "^2.0.0", - "request-ip": "^2.1.3", - "samlify": "2.8.8", + "prom-client": "^15.1.2", + "qrcode": "^1.5.4", + "rate-limiter-flexible": "^5.0.3", + "samlify": "^2.8.11", "seedrandom": "^3.0.5", - "shortid": "^2.2.13", - "simple-oauth2": "^5.0.0", - "slugify": "^1.6.5", - "uuid": "^8.3.2", - "vuex": "^3.6.2" - }, - "devDependencies": { - "@commitlint/cli": "^17.5.0", - "@commitlint/config-conventional": "^17.4.4", - "@data-fair/sd-vue": "^2.6.1", - "@koumoul/v-iframe": "^0.20.3", - "@koumoul/vjsf": "^2.21.3", - "@koumoul/vue-multianalytics": "^1.10.1", - "@mdi/font": "^7.0.96", - "@nuxtjs/google-fonts": "^1.3.0", - "@nuxtjs/markdownit": "^2.0.0", - "@nuxtjs/vuetify": "^1.12.3", - "clean-modules": "^2.0.4", - "eslint": "^7.32.0", - "eslint-config-standard": "^16.0.3", - "eslint-plugin-import": "^2.25.4", - "eslint-plugin-no-only-tests": "^2.6.0", - "eslint-plugin-node": "^11.1.0", - "eslint-plugin-promise": "^5.1.1", - "eslint-plugin-vue": "^8.5.0", - "husky": "^8.0.3", - "iframe-resizer": "^4.0.1", - "jwt-decode": "^4.0.0", - "mocha": "^9.2.1", - "nodemon": "^2.0.22", - "nuxt": "^2.17.3", - "nyc": "^15.1.0", - "patch-package": "^6.5.1", - "semver-extract": "^1.1.1", - "tinycolor2": "^1.4.2", - "typescript": "^5.3.3", - "vue": "^2.7.16", - "vue-cropperjs": "^4.1.0", - "vue-i18n": "^8.28.2", - "vue-moment": "^4.1.0", - "vue-router": "^3.6.5", - "vuetify": "2.6.14" - } - }, - "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", + "simple-oauth2": "^5.1.0", + "slugify": "^1.6.6", + "tinycolor2": "^1.6.0", + "useragent": "^2.3.0" + } + }, + "node_modules/@antfu/utils": { + "version": "0.7.10", + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/antfu" + } + }, + "node_modules/@apidevtools/json-schema-ref-parser": { + "version": "11.7.2", + "license": "MIT", "dependencies": { - "@jridgewell/gen-mapping": "^0.3.5", - "@jridgewell/trace-mapping": "^0.3.24" + "@jsdevtools/ono": "^7.1.3", + "@types/json-schema": "^7.0.15", + "js-yaml": "^4.1.0" }, "engines": { - "node": ">=6.0.0" + "node": ">= 16" + }, + "funding": { + "url": "https://github.com/sponsors/philsturgeon" } }, "node_modules/@authenio/xml-encryption": { "version": "2.0.2", - "resolved": "https://registry.npmjs.org/@authenio/xml-encryption/-/xml-encryption-2.0.2.tgz", - "integrity": "sha512-cTlrKttbrRHEw3W+0/I609A2Matj5JQaRvfLtEIGZvlN0RaPi+3ANsMeqAyCAVlH/lUIW2tmtBlSMni74lcXeg==", "license": "MIT", "dependencies": { "@xmldom/xmldom": "^0.8.6", @@ -136,18235 +132,2834 @@ } }, "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.25.7", + "dev": true, "license": "MIT", "dependencies": { - "@babel/helper-validator-identifier": "^7.25.9", - "js-tokens": "^4.0.0", + "@babel/highlight": "^7.25.7", "picocolors": "^1.0.0" }, "engines": { "node": ">=6.9.0" } }, - "node_modules/@babel/compat-data": { - "version": "7.26.2", - "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.26.2.tgz", - "integrity": "sha512-Z0WgzSEa+aUcdiJuCIqgujCshpMWgUpgOxXotrYPSA53hA3qopNaqcJpyr0hVb1FeWdnqFA35/fUtXgBK8srQg==", - "dev": true, + "node_modules/@babel/helper-string-parser": { + "version": "7.25.7", "license": "MIT", "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==", - "dev": true, + "node_modules/@babel/helper-validator-identifier": { + "version": "7.25.7", "license": "MIT", - "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", - "convert-source-map": "^2.0.0", - "debug": "^4.1.0", - "gensync": "^1.0.0-beta.2", - "json5": "^2.2.3", - "semver": "^6.3.1" - }, "engines": { "node": ">=6.9.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/babel" } }, - "node_modules/@babel/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==", + "node_modules/@babel/highlight": { + "version": "7.25.7", "dev": true, - "license": "ISC", - "bin": { - "semver": "bin/semver.js" - } - }, - "node_modules/@babel/generator": { - "version": "7.26.2", - "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.26.2.tgz", - "integrity": "sha512-zevQbhbau95nkoxSq3f/DC/SC+EEOUZd3DYqfSkMhY2/wfSeaHV1Ew4vk8e+x8lja31IbyuUa2uQ3JONqKbysw==", "license": "MIT", "dependencies": { - "@babel/parser": "^7.26.2", - "@babel/types": "^7.26.0", - "@jridgewell/gen-mapping": "^0.3.5", - "@jridgewell/trace-mapping": "^0.3.25", - "jsesc": "^3.0.2" + "@babel/helper-validator-identifier": "^7.25.7", + "chalk": "^2.4.2", + "js-tokens": "^4.0.0", + "picocolors": "^1.0.0" }, "engines": { "node": ">=6.9.0" } }, - "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==", + "node_modules/@babel/highlight/node_modules/ansi-styles": { + "version": "3.2.1", "dev": true, "license": "MIT", "dependencies": { - "@babel/types": "^7.25.9" + "color-convert": "^1.9.0" }, "engines": { - "node": ">=6.9.0" + "node": ">=4" } }, - "node_modules/@babel/helper-builder-binary-assignment-operator-visitor": { - "version": "7.25.9", - "resolved": "https://registry.npmjs.org/@babel/helper-builder-binary-assignment-operator-visitor/-/helper-builder-binary-assignment-operator-visitor-7.25.9.tgz", - "integrity": "sha512-C47lC7LIDCnz0h4vai/tpNOI95tCd5ZT3iBt/DBH5lXKHZsyNQv18yf1wIIg2ntiQNgmAvA+DgZ82iW8Qdym8g==", + "node_modules/@babel/highlight/node_modules/chalk": { + "version": "2.4.2", "dev": true, "license": "MIT", "dependencies": { - "@babel/traverse": "^7.25.9", - "@babel/types": "^7.25.9" + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" }, "engines": { - "node": ">=6.9.0" + "node": ">=4" } }, - "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==", + "node_modules/@babel/highlight/node_modules/color-convert": { + "version": "1.9.3", "dev": true, "license": "MIT", "dependencies": { - "@babel/compat-data": "^7.25.9", - "@babel/helper-validator-option": "^7.25.9", - "browserslist": "^4.24.0", - "lru-cache": "^5.1.1", - "semver": "^6.3.1" - }, - "engines": { - "node": ">=6.9.0" + "color-name": "1.1.3" } }, - "node_modules/@babel/helper-compilation-targets/node_modules/lru-cache": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-5.1.1.tgz", - "integrity": "sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==", + "node_modules/@babel/highlight/node_modules/color-name": { + "version": "1.1.3", "dev": true, - "license": "ISC", - "dependencies": { - "yallist": "^3.0.2" + "license": "MIT" + }, + "node_modules/@babel/highlight/node_modules/escape-string-regexp": { + "version": "1.0.5", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.8.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==", + "node_modules/@babel/highlight/node_modules/has-flag": { + "version": "3.0.0", "dev": true, - "license": "ISC", - "bin": { - "semver": "bin/semver.js" + "license": "MIT", + "engines": { + "node": ">=4" } }, - "node_modules/@babel/helper-compilation-targets/node_modules/yallist": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz", - "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==", + "node_modules/@babel/highlight/node_modules/js-tokens": { + "version": "4.0.0", "dev": true, - "license": "ISC" + "license": "MIT" }, - "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==", + "node_modules/@babel/highlight/node_modules/supports-color": { + "version": "5.5.0", "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", - "semver": "^6.3.1" + "has-flag": "^3.0.0" }, "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0" + "node": ">=4" } }, - "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", + "node_modules/@babel/parser": { + "version": "7.25.8", + "license": "MIT", + "dependencies": { + "@babel/types": "^7.25.8" + }, "bin": { - "semver": "bin/semver.js" + "parser": "bin/babel-parser.js" + }, + "engines": { + "node": ">=6.0.0" } }, - "node_modules/@babel/helper-create-regexp-features-plugin": { - "version": "7.25.9", - "resolved": "https://registry.npmjs.org/@babel/helper-create-regexp-features-plugin/-/helper-create-regexp-features-plugin-7.25.9.tgz", - "integrity": "sha512-ORPNZ3h6ZRkOyAa/SaHU+XsLZr0UQzRwuDQ0cczIA17nAzZ+85G5cVkOJIj7QavLZGSe8QXUmNFxSZzjcZF9bw==", - "dev": true, + "node_modules/@babel/runtime": { + "version": "7.25.7", "license": "MIT", "dependencies": { - "@babel/helper-annotate-as-pure": "^7.25.9", - "regexpu-core": "^6.1.1", - "semver": "^6.3.1" + "regenerator-runtime": "^0.14.0" }, "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/types": { + "version": "7.25.8", + "license": "MIT", + "dependencies": { + "@babel/helper-string-parser": "^7.25.7", + "@babel/helper-validator-identifier": "^7.25.7", + "to-fast-properties": "^2.0.0" + }, + "engines": { + "node": ">=6.9.0" } }, - "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, + "node_modules/@bcherny/json-schema-ref-parser": { + "version": "10.0.5-fork", "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" + "@jsdevtools/ono": "^7.1.3", + "@types/json-schema": "^7.0.6", + "call-me-maybe": "^1.0.1", + "js-yaml": "^4.1.0" }, - "peerDependencies": { - "@babel/core": "^7.4.0 || ^8.0.0-0 <8.0.0" + "engines": { + "node": ">= 16" + }, + "funding": { + "url": "https://github.com/sponsors/philsturgeon" } }, - "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==", + "node_modules/@bufbuild/protobuf": { + "version": "2.2.0", + "license": "(Apache-2.0 AND BSD-3-Clause)" + }, + "node_modules/@commitlint/cli": { + "version": "19.5.0", "dev": true, "license": "MIT", "dependencies": { - "@babel/traverse": "^7.25.9", - "@babel/types": "^7.25.9" + "@commitlint/format": "^19.5.0", + "@commitlint/lint": "^19.5.0", + "@commitlint/load": "^19.5.0", + "@commitlint/read": "^19.5.0", + "@commitlint/types": "^19.5.0", + "tinyexec": "^0.3.0", + "yargs": "^17.0.0" + }, + "bin": { + "commitlint": "cli.js" }, "engines": { - "node": ">=6.9.0" + "node": ">=v18" } }, - "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==", + "node_modules/@commitlint/config-conventional": { + "version": "19.5.0", "dev": true, "license": "MIT", "dependencies": { - "@babel/traverse": "^7.25.9", - "@babel/types": "^7.25.9" + "@commitlint/types": "^19.5.0", + "conventional-changelog-conventionalcommits": "^7.0.2" }, "engines": { - "node": ">=6.9.0" + "node": ">=v18" } }, - "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==", + "node_modules/@commitlint/config-validator": { + "version": "19.5.0", "dev": true, "license": "MIT", "dependencies": { - "@babel/helper-module-imports": "^7.25.9", - "@babel/helper-validator-identifier": "^7.25.9", - "@babel/traverse": "^7.25.9" + "@commitlint/types": "^19.5.0", + "ajv": "^8.11.0" }, "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0" + "node": ">=v18" } }, - "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==", + "node_modules/@commitlint/ensure": { + "version": "19.5.0", "dev": true, "license": "MIT", "dependencies": { - "@babel/types": "^7.25.9" + "@commitlint/types": "^19.5.0", + "lodash.camelcase": "^4.3.0", + "lodash.kebabcase": "^4.1.1", + "lodash.snakecase": "^4.1.1", + "lodash.startcase": "^4.4.0", + "lodash.upperfirst": "^4.3.1" }, "engines": { - "node": ">=6.9.0" + "node": ">=v18" } }, - "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==", + "node_modules/@commitlint/execute-rule": { + "version": "19.5.0", "dev": true, "license": "MIT", "engines": { - "node": ">=6.9.0" + "node": ">=v18" } }, - "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==", + "node_modules/@commitlint/format": { + "version": "19.5.0", "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" + "@commitlint/types": "^19.5.0", + "chalk": "^5.3.0" }, "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0" + "node": ">=v18" } }, - "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==", + "node_modules/@commitlint/format/node_modules/chalk": { + "version": "5.3.0", "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" - }, "engines": { - "node": ">=6.9.0" + "node": "^12.17.0 || ^14.13 || >=16.0.0" }, - "peerDependencies": { - "@babel/core": "^7.0.0" + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" } }, - "node_modules/@babel/helper-simple-access": { - "version": "7.25.9", - "resolved": "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.25.9.tgz", - "integrity": "sha512-c6WHXuiaRsJTyHYLJV75t9IqsmTbItYfdj99PnzYGQZkYKvan5/2jKJ7gu31J3/BJ/A18grImSPModuyG/Eo0Q==", + "node_modules/@commitlint/is-ignored": { + "version": "19.5.0", "dev": true, "license": "MIT", "dependencies": { - "@babel/traverse": "^7.25.9", - "@babel/types": "^7.25.9" + "@commitlint/types": "^19.5.0", + "semver": "^7.6.0" }, "engines": { - "node": ">=6.9.0" + "node": ">=v18" } }, - "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==", + "node_modules/@commitlint/lint": { + "version": "19.5.0", "dev": true, "license": "MIT", "dependencies": { - "@babel/traverse": "^7.25.9", - "@babel/types": "^7.25.9" + "@commitlint/is-ignored": "^19.5.0", + "@commitlint/parse": "^19.5.0", + "@commitlint/rules": "^19.5.0", + "@commitlint/types": "^19.5.0" }, "engines": { - "node": ">=6.9.0" + "node": ">=v18" } }, - "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==", + "node_modules/@commitlint/load": { + "version": "19.5.0", + "dev": true, "license": "MIT", + "dependencies": { + "@commitlint/config-validator": "^19.5.0", + "@commitlint/execute-rule": "^19.5.0", + "@commitlint/resolve-extends": "^19.5.0", + "@commitlint/types": "^19.5.0", + "chalk": "^5.3.0", + "cosmiconfig": "^9.0.0", + "cosmiconfig-typescript-loader": "^5.0.0", + "lodash.isplainobject": "^4.0.6", + "lodash.merge": "^4.6.2", + "lodash.uniq": "^4.5.0" + }, "engines": { - "node": ">=6.9.0" + "node": ">=v18" } }, - "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==", + "node_modules/@commitlint/load/node_modules/chalk": { + "version": "5.3.0", + "dev": true, "license": "MIT", "engines": { - "node": ">=6.9.0" + "node": "^12.17.0 || ^14.13 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" } }, - "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==", + "node_modules/@commitlint/message": { + "version": "19.5.0", "dev": true, "license": "MIT", "engines": { - "node": ">=6.9.0" + "node": ">=v18" } }, - "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==", + "node_modules/@commitlint/parse": { + "version": "19.5.0", "dev": true, "license": "MIT", "dependencies": { - "@babel/template": "^7.25.9", - "@babel/traverse": "^7.25.9", - "@babel/types": "^7.25.9" + "@commitlint/types": "^19.5.0", + "conventional-changelog-angular": "^7.0.0", + "conventional-commits-parser": "^5.0.0" }, "engines": { - "node": ">=6.9.0" + "node": ">=v18" } }, - "node_modules/@babel/helpers": { - "version": "7.26.0", - "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.26.0.tgz", - "integrity": "sha512-tbhNuIxNcVb21pInl3ZSjksLCvgdZy9KwJ8brv993QtIVKJBBkYXz4q4ZbAv31GdnC+R90np23L5FbEBlthAEw==", + "node_modules/@commitlint/read": { + "version": "19.5.0", "dev": true, "license": "MIT", "dependencies": { - "@babel/template": "^7.25.9", - "@babel/types": "^7.26.0" + "@commitlint/top-level": "^19.5.0", + "@commitlint/types": "^19.5.0", + "git-raw-commits": "^4.0.0", + "minimist": "^1.2.8", + "tinyexec": "^0.3.0" }, "engines": { - "node": ">=6.9.0" + "node": ">=v18" } }, - "node_modules/@babel/highlight": { - "version": "7.25.9", - "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.25.9.tgz", - "integrity": "sha512-llL88JShoCsth8fF8R4SJnIn+WLvR6ccFxu1H3FlMhDontdcmZWf2HgIZ7AIqV3Xcck1idlohrN4EUBQz6klbw==", + "node_modules/@commitlint/resolve-extends": { + "version": "19.5.0", "dev": true, "license": "MIT", "dependencies": { - "@babel/helper-validator-identifier": "^7.25.9", - "chalk": "^2.4.2", - "js-tokens": "^4.0.0", - "picocolors": "^1.0.0" + "@commitlint/config-validator": "^19.5.0", + "@commitlint/types": "^19.5.0", + "global-directory": "^4.0.1", + "import-meta-resolve": "^4.0.0", + "lodash.mergewith": "^4.6.2", + "resolve-from": "^5.0.0" }, "engines": { - "node": ">=6.9.0" + "node": ">=v18" } }, - "node_modules/@babel/highlight/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==", + "node_modules/@commitlint/resolve-extends/node_modules/resolve-from": { + "version": "5.0.0", "dev": true, "license": "MIT", - "dependencies": { - "color-convert": "^1.9.0" - }, "engines": { - "node": ">=4" + "node": ">=8" } }, - "node_modules/@babel/highlight/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==", + "node_modules/@commitlint/rules": { + "version": "19.5.0", "dev": true, "license": "MIT", "dependencies": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" + "@commitlint/ensure": "^19.5.0", + "@commitlint/message": "^19.5.0", + "@commitlint/to-lines": "^19.5.0", + "@commitlint/types": "^19.5.0" }, "engines": { - "node": ">=4" + "node": ">=v18" } }, - "node_modules/@babel/highlight/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==", + "node_modules/@commitlint/to-lines": { + "version": "19.5.0", "dev": true, "license": "MIT", - "dependencies": { - "color-name": "1.1.3" + "engines": { + "node": ">=v18" } }, - "node_modules/@babel/highlight/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, - "license": "MIT" - }, - "node_modules/@babel/highlight/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==", + "node_modules/@commitlint/top-level": { + "version": "19.5.0", "dev": true, "license": "MIT", + "dependencies": { + "find-up": "^7.0.0" + }, "engines": { - "node": ">=0.8.0" + "node": ">=v18" } }, - "node_modules/@babel/highlight/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_modules/@babel/highlight/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==", + "node_modules/@commitlint/top-level/node_modules/find-up": { + "version": "7.0.0", "dev": true, "license": "MIT", "dependencies": { - "has-flag": "^3.0.0" + "locate-path": "^7.2.0", + "path-exists": "^5.0.0", + "unicorn-magic": "^0.1.0" }, "engines": { - "node": ">=4" - } - }, - "node_modules/@babel/parser": { - "version": "7.26.2", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.26.2.tgz", - "integrity": "sha512-DWMCZH9WA4Maitz2q21SRKHo9QXZxkDsbNZoVD62gusNtNBBqDg9i7uOhASfTfIGNzW+O+r7+jAlM8dwphcJKQ==", - "license": "MIT", - "dependencies": { - "@babel/types": "^7.26.0" - }, - "bin": { - "parser": "bin/babel-parser.js" + "node": ">=18" }, - "engines": { - "node": ">=6.0.0" + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "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==", + "node_modules/@commitlint/top-level/node_modules/locate-path": { + "version": "7.2.0", "dev": true, "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.25.9", - "@babel/traverse": "^7.25.9" + "p-locate": "^6.0.0" }, "engines": { - "node": ">=6.9.0" + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" }, - "peerDependencies": { - "@babel/core": "^7.0.0" + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "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==", + "node_modules/@commitlint/top-level/node_modules/p-limit": { + "version": "4.0.0", "dev": true, "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.25.9" + "yocto-queue": "^1.0.0" }, "engines": { - "node": ">=6.9.0" + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" }, - "peerDependencies": { - "@babel/core": "^7.0.0" + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "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==", + "node_modules/@commitlint/top-level/node_modules/p-locate": { + "version": "6.0.0", "dev": true, "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.25.9" + "p-limit": "^4.0.0" }, "engines": { - "node": ">=6.9.0" + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" }, - "peerDependencies": { - "@babel/core": "^7.0.0" + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "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==", + "node_modules/@commitlint/top-level/node_modules/path-exists": { + "version": "5.0.0", "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": "^12.20.0 || ^14.13.1 || >=16.0.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==", + "node_modules/@commitlint/top-level/node_modules/yocto-queue": { + "version": "1.1.1", "dev": true, "license": "MIT", - "dependencies": { - "@babel/helper-plugin-utils": "^7.25.9", - "@babel/traverse": "^7.25.9" - }, "engines": { - "node": ">=6.9.0" + "node": ">=12.20" }, - "peerDependencies": { - "@babel/core": "^7.0.0" + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "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.", + "node_modules/@commitlint/types": { + "version": "19.5.0", "dev": true, "license": "MIT", "dependencies": { - "@babel/helper-create-class-features-plugin": "^7.18.6", - "@babel/helper-plugin-utils": "^7.18.6" + "@types/conventional-commits-parser": "^5.0.0", + "chalk": "^5.3.0" }, "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" + "node": ">=v18" } }, - "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==", + "node_modules/@commitlint/types/node_modules/chalk": { + "version": "5.3.0", "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" + "node": "^12.17.0 || ^14.13 || >=16.0.0" }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" } }, - "node_modules/@babel/plugin-proposal-nullish-coalescing-operator": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-nullish-coalescing-operator/-/plugin-proposal-nullish-coalescing-operator-7.18.6.tgz", - "integrity": "sha512-wQxQzxYeJqHcfppzBDnm1yAY0jSRkUXR2z8RePZYrKwMKgMlE8+Z6LUno+bd6LvbGh8Gltvy74+9pIYkr+XkKA==", - "deprecated": "This proposal has been merged to the ECMAScript standard and thus this plugin is no longer maintained. Please use @babel/plugin-transform-nullish-coalescing-operator instead.", - "dev": true, + "node_modules/@data-fair/frame": { + "version": "0.2.1", + "license": "MIT" + }, + "node_modules/@data-fair/lib-common-types": { + "version": "1.5.3", + "license": "MIT" + }, + "node_modules/@data-fair/lib-express": { + "version": "1.10.1", "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.18.6", - "@babel/plugin-syntax-nullish-coalescing-operator": "^7.8.3" - }, - "engines": { - "node": ">=6.9.0" + "@data-fair/lib-common-types": "^1.1.0", + "cookie": "^0.7.2", + "jsonwebtoken": "^9.0.2", + "jwks-rsa": "^3.1.0", + "nanoid": "^5.0.7" }, "peerDependencies": { - "@babel/core": "^7.0.0-0" + "@data-fair/lib-node": "2", + "express": "5", + "ws": "8" + }, + "peerDependenciesMeta": { + "ws": { + "optional": true + } } }, - "node_modules/@babel/plugin-proposal-optional-chaining": { - "version": "7.21.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-optional-chaining/-/plugin-proposal-optional-chaining-7.21.0.tgz", - "integrity": "sha512-p4zeefM72gpmEe2fkUr/OnOXpWEf8nAgk7ZYVqqfFiyIG7oFfVZcCrU64hWn5xp4tQ9LkV4bTIa5rD0KANpKNA==", - "deprecated": "This proposal has been merged to the ECMAScript standard and thus this plugin is no longer maintained. Please use @babel/plugin-transform-optional-chaining instead.", - "dev": true, + "node_modules/@data-fair/lib-node": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/@data-fair/lib-node/-/lib-node-2.2.1.tgz", + "integrity": "sha512-7StQApVbsFPLGlmzFImzM9de8uKBsrlTnz4pJmfd1uUg/F8fmRzaIjbDUmc1NPdAl05Xd14umG4/Ns5oV14ldw==", "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.20.2", - "@babel/helper-skip-transparent-expression-wrappers": "^7.20.0", - "@babel/plugin-syntax-optional-chaining": "^7.8.3" - }, - "engines": { - "node": ">=6.9.0" + "@data-fair/lib-common-types": "^1.5.0", + "@data-fair/lib-utils": "^1.1.0", + "agentkeepalive": "^4.5.0", + "ajv-formats": "^3.0.1", + "ajv-i18n": "^4.2.0", + "axios": "^1.7.7", + "cacheable-lookup": "^7.0.0", + "semver": "^7.6.3" }, "peerDependencies": { - "@babel/core": "^7.0.0-0" + "mongodb": "6", + "prom-client": "15", + "tough-cookie": "5", + "ws": "8" + }, + "peerDependenciesMeta": { + "mongodb": { + "optional": true + }, + "prom-client": { + "optional": true + }, + "tough-cookie": { + "optional": true + }, + "ws": { + "optional": true + } } }, - "node_modules/@babel/plugin-proposal-private-methods": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-private-methods/-/plugin-proposal-private-methods-7.18.6.tgz", - "integrity": "sha512-nutsvktDItsNn4rpGItSNV2sz1XwS+nfU0Rg8aCx3W3NOKVzdMjJRu0O5OkgDp3ZGICSTbgRpxZoWsxoKRvbeA==", - "deprecated": "This proposal has been merged to the ECMAScript standard and thus this plugin is no longer maintained. Please use @babel/plugin-transform-private-methods instead.", - "dev": true, + "node_modules/@data-fair/lib-types-builder": { + "version": "1.6.0", "license": "MIT", "dependencies": { - "@babel/helper-create-class-features-plugin": "^7.18.6", - "@babel/helper-plugin-utils": "^7.18.6" + "@bcherny/json-schema-ref-parser": "^10.0.5-fork", + "@data-fair/lib-common-types": "^1.1.0", + "@data-fair/lib-utils": "^1.0.0", + "ajv": "^8.17.1", + "ajv-errors": "^3.0.0", + "ajv-formats": "^3.0.1", + "ajv-i18n": "^4.2.0", + "change-case": "^5.4.4", + "commander": "^12.1.0", + "fdir": "^6.4.2", + "json-schema-to-typescript": "^15.0.2" }, - "engines": { - "node": ">=6.9.0" + "bin": { + "df-build-types": "build.js" }, "peerDependencies": { - "@babel/core": "^7.0.0-0" + "@koumoul/vjsf-compiler": "^0.2.1" + }, + "peerDependenciesMeta": { + "@koumoul/vjsf-compiler": { + "optional": true + } } }, - "node_modules/@babel/plugin-proposal-private-property-in-object": { - "version": "7.21.11", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-private-property-in-object/-/plugin-proposal-private-property-in-object-7.21.11.tgz", - "integrity": "sha512-0QZ8qP/3RLDVBwBFoWAwCtgcDZJVwA5LUJRZU8x2YFfKNuFq161wK3cuGrALu5yiPu+vzwTAg/sMWVNeWeNyaw==", - "deprecated": "This proposal has been merged to the ECMAScript standard and thus this plugin is no longer maintained. Please use @babel/plugin-transform-private-property-in-object instead.", - "dev": true, + "node_modules/@data-fair/lib-types-builder/node_modules/fdir": { + "version": "6.4.2", "license": "MIT", - "dependencies": { - "@babel/helper-annotate-as-pure": "^7.18.6", - "@babel/helper-create-class-features-plugin": "^7.21.0", - "@babel/helper-plugin-utils": "^7.20.2", - "@babel/plugin-syntax-private-property-in-object": "^7.14.5" + "peerDependencies": { + "picomatch": "^3 || ^4" }, + "peerDependenciesMeta": { + "picomatch": { + "optional": true + } + } + }, + "node_modules/@data-fair/lib-types-builder/node_modules/picomatch": { + "version": "4.0.2", + "license": "MIT", + "optional": true, + "peer": true, "engines": { - "node": ">=6.9.0" + "node": ">=12" }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" } }, - "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, + "node_modules/@data-fair/lib-utils": { + "version": "1.2.0", + "license": "MIT" + }, + "node_modules/@data-fair/lib-vue": { + "version": "1.15.5", + "resolved": "https://registry.npmjs.org/@data-fair/lib-vue/-/lib-vue-1.15.5.tgz", + "integrity": "sha512-2cy332Xaf8qTSWS7/wPBK9ofzH/D905UL0vTezQbMbaqhgytkk/2/0ccanBbf5+E449ubq5hS7HjiWPGMBumfQ==", "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.25.9" - }, - "engines": { - "node": ">=6.9.0" + "@data-fair/lib-common-types": "^1.5.3", + "@data-fair/lib-utils": "^1.0.0", + "jwt-decode": "^4.0.0", + "universal-cookie": "^7.2.0" }, "peerDependencies": { - "@babel/core": "^7.0.0-0" + "dayjs": "1", + "ofetch": "1", + "reconnecting-websocket": "4", + "vue": "3" + }, + "peerDependenciesMeta": { + "dayjs": { + "optional": true + }, + "reconnecting-websocket": { + "optional": true + } } }, - "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, + "node_modules/@data-fair/lib-vuetify": { + "version": "1.8.0", "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.25.9" - }, - "engines": { - "node": ">=6.9.0" + "@data-fair/lib-common-types": "^1.1.0", + "@mdi/js": "^7.4.47" }, "peerDependencies": { - "@babel/core": "^7.0.0-0" + "@data-fair/lib-vue": "^1.15.0", + "ofetch": "1", + "vue-i18n": "10", + "vuetify": "3" } }, - "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, + "node_modules/@esbuild/linux-x64": { + "version": "0.21.5", + "cpu": [ + "x64" + ], "license": "MIT", - "dependencies": { - "@babel/helper-plugin-utils": "^7.25.9" - }, + "optional": true, + "os": [ + "linux" + ], "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" + "node": ">=12" } }, - "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==", - "dev": true, + "node_modules/@eslint-community/eslint-utils": { + "version": "4.4.0", "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.25.9" + "eslint-visitor-keys": "^3.3.0" }, "engines": { - "node": ">=6.9.0" + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" }, "peerDependencies": { - "@babel/core": "^7.0.0-0" + "eslint": "^6.0.0 || ^7.0.0 || >=8.0.0" } }, - "node_modules/@babel/plugin-syntax-nullish-coalescing-operator": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-nullish-coalescing-operator/-/plugin-syntax-nullish-coalescing-operator-7.8.3.tgz", - "integrity": "sha512-aSff4zPII1u2QD7y+F8oDsz19ew4IGEJg9SVW+bqwpwtfFleiQDMdzA/R+UlWDzfnHFCxxleFT0PMIrR36XLNQ==", - "dev": true, + "node_modules/@eslint-community/regexpp": { + "version": "4.11.1", "license": "MIT", + "engines": { + "node": "^12.0.0 || ^14.0.0 || >=16.0.0" + } + }, + "node_modules/@eslint/config-array": { + "version": "0.18.0", + "license": "Apache-2.0", "dependencies": { - "@babel/helper-plugin-utils": "^7.8.0" + "@eslint/object-schema": "^2.1.4", + "debug": "^4.3.1", + "minimatch": "^3.1.2" }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" } }, - "node_modules/@babel/plugin-syntax-optional-chaining": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-optional-chaining/-/plugin-syntax-optional-chaining-7.8.3.tgz", - "integrity": "sha512-KoK9ErH1MBlCPxV0VANkXW2/dw4vlbGDrFgz8bmUsBGYkFRcbRwMh6cIJubdPrkxRwuGdtCk0v/wPTKbQgBjkg==", - "dev": true, + "node_modules/@eslint/config-array/node_modules/brace-expansion": { + "version": "1.1.11", "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.8.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" } }, - "node_modules/@babel/plugin-syntax-private-property-in-object": { - "version": "7.14.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-private-property-in-object/-/plugin-syntax-private-property-in-object-7.14.5.tgz", - "integrity": "sha512-0wVnp9dxJ72ZUJDV27ZfbSj6iHLoytYZmh3rFcxNnvsJF3ktkzLDZPy/mA17HGsaQT3/DQsWYX1f1QGWkCoVUg==", - "dev": true, - "license": "MIT", + "node_modules/@eslint/config-array/node_modules/minimatch": { + "version": "3.1.2", + "license": "ISC", "dependencies": { - "@babel/helper-plugin-utils": "^7.14.5" + "brace-expansion": "^1.1.7" }, "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" + "node": "*" } }, - "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" - }, + "node_modules/@eslint/core": { + "version": "0.6.0", + "license": "Apache-2.0", "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0" + "node": "^18.18.0 || ^20.9.0 || >=21.1.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, + "node_modules/@eslint/eslintrc": { + "version": "3.1.0", "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.25.9" + "ajv": "^6.12.4", + "debug": "^4.3.2", + "espree": "^10.0.1", + "globals": "^14.0.0", + "ignore": "^5.2.0", + "import-fresh": "^3.2.1", + "js-yaml": "^4.1.0", + "minimatch": "^3.1.2", + "strip-json-comments": "^3.1.1" }, "engines": { - "node": ">=6.9.0" + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" + "funding": { + "url": "https://opencollective.com/eslint" } }, - "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, + "node_modules/@eslint/eslintrc/node_modules/ajv": { + "version": "6.12.6", "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" + "fast-deep-equal": "^3.1.1", + "fast-json-stable-stringify": "^2.0.0", + "json-schema-traverse": "^0.4.1", + "uri-js": "^4.2.2" }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" + "funding": { + "type": "github", + "url": "https://github.com/sponsors/epoberezkin" } }, - "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, + "node_modules/@eslint/eslintrc/node_modules/brace-expansion": { + "version": "1.1.11", "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" + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" } }, - "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", + "node_modules/@eslint/eslintrc/node_modules/json-schema-traverse": { + "version": "0.4.1", + "license": "MIT" + }, + "node_modules/@eslint/eslintrc/node_modules/minimatch": { + "version": "3.1.2", + "license": "ISC", "dependencies": { - "@babel/helper-plugin-utils": "^7.25.9" + "brace-expansion": "^1.1.7" }, "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" + "node": "*" } }, - "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, + "node_modules/@eslint/js": { + "version": "9.12.0", "license": "MIT", - "dependencies": { - "@babel/helper-plugin-utils": "^7.25.9" - }, "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" + "node": "^18.18.0 || ^20.9.0 || >=21.1.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" - }, + "node_modules/@eslint/object-schema": { + "version": "2.1.4", + "license": "Apache-2.0", "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" + "node": "^18.18.0 || ^20.9.0 || >=21.1.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", + "node_modules/@eslint/plugin-kit": { + "version": "0.2.0", + "license": "Apache-2.0", "dependencies": { - "@babel/helper-create-class-features-plugin": "^7.25.9", - "@babel/helper-plugin-utils": "^7.25.9" + "levn": "^0.4.1" }, "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.12.0" + "node": "^18.18.0 || ^20.9.0 || >=21.1.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", + "node_modules/@hapi/boom": { + "version": "10.0.1", + "license": "BSD-3-Clause", "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" + "@hapi/hoek": "^11.0.2" } }, - "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", + "node_modules/@hapi/bourne": { + "version": "3.0.0", + "license": "BSD-3-Clause" + }, + "node_modules/@hapi/hoek": { + "version": "11.0.4", + "license": "BSD-3-Clause" + }, + "node_modules/@hapi/topo": { + "version": "5.1.0", + "license": "BSD-3-Clause", "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" + "@hapi/hoek": "^9.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", + "node_modules/@hapi/topo/node_modules/@hapi/hoek": { + "version": "9.3.0", + "license": "BSD-3-Clause" + }, + "node_modules/@hapi/wreck": { + "version": "18.1.0", + "license": "BSD-3-Clause", "dependencies": { - "@babel/helper-plugin-utils": "^7.25.9" - }, + "@hapi/boom": "^10.0.1", + "@hapi/bourne": "^3.0.0", + "@hapi/hoek": "^11.0.2" + } + }, + "node_modules/@humanfs/core": { + "version": "0.19.0", + "license": "Apache-2.0", "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" + "node": ">=18.18.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", + "node_modules/@humanfs/node": { + "version": "0.16.5", + "license": "Apache-2.0", "dependencies": { - "@babel/helper-create-regexp-features-plugin": "^7.25.9", - "@babel/helper-plugin-utils": "^7.25.9" + "@humanfs/core": "^0.19.0", + "@humanwhocodes/retry": "^0.3.0" }, "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" + "node": ">=18.18.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==", + "node_modules/@humanwhocodes/gitignore-to-minimatch": { + "version": "1.0.2", "dev": true, - "license": "MIT", - "dependencies": { - "@babel/helper-plugin-utils": "^7.25.9" - }, + "license": "Apache-2.0", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/nzakas" + } + }, + "node_modules/@humanwhocodes/module-importer": { + "version": "1.0.1", + "license": "Apache-2.0", "engines": { - "node": ">=6.9.0" + "node": ">=12.22" }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" + "funding": { + "type": "github", + "url": "https://github.com/sponsors/nzakas" } }, - "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" - }, + "node_modules/@humanwhocodes/retry": { + "version": "0.3.1", + "license": "Apache-2.0", "engines": { - "node": ">=6.9.0" + "node": ">=18.18" }, - "peerDependencies": { - "@babel/core": "^7.0.0" + "funding": { + "type": "github", + "url": "https://github.com/sponsors/nzakas" } }, - "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, + "node_modules/@intlify/bundle-utils": { + "version": "9.0.0-beta.0", "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.25.9" + "@intlify/message-compiler": "next", + "@intlify/shared": "next", + "acorn": "^8.8.2", + "escodegen": "^2.1.0", + "estree-walker": "^2.0.2", + "jsonc-eslint-parser": "^2.3.0", + "mlly": "^1.2.0", + "source-map-js": "^1.0.1", + "yaml-eslint-parser": "^1.2.2" }, "engines": { - "node": ">=6.9.0" + "node": ">= 18" }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" + "peerDependenciesMeta": { + "petite-vue-i18n": { + "optional": true + }, + "vue-i18n": { + "optional": true + } } }, - "node_modules/@babel/plugin-transform-exponentiation-operator": { - "version": "7.25.9", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-exponentiation-operator/-/plugin-transform-exponentiation-operator-7.25.9.tgz", - "integrity": "sha512-KRhdhlVk2nObA5AYa7QMgTMTVJdfHprfpAk4DjZVtllqRg9qarilstTKEhpVjyt+Npi8ThRyiV8176Am3CodPA==", - "dev": true, + "node_modules/@intlify/core-base": { + "version": "10.0.4", "license": "MIT", "dependencies": { - "@babel/helper-builder-binary-assignment-operator-visitor": "^7.25.9", - "@babel/helper-plugin-utils": "^7.25.9" + "@intlify/message-compiler": "10.0.4", + "@intlify/shared": "10.0.4" }, "engines": { - "node": ">=6.9.0" + "node": ">= 16" }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" + "funding": { + "url": "https://github.com/sponsors/kazupon" } }, - "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, + "node_modules/@intlify/message-compiler": { + "version": "10.0.4", "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.25.9" + "@intlify/shared": "10.0.4", + "source-map-js": "^1.0.2" }, "engines": { - "node": ">=6.9.0" + "node": ">= 16" }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" + "funding": { + "url": "https://github.com/sponsors/kazupon" } }, - "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, + "node_modules/@intlify/shared": { + "version": "10.0.4", "license": "MIT", - "dependencies": { - "@babel/helper-plugin-utils": "^7.25.9", - "@babel/helper-skip-transparent-expression-wrappers": "^7.25.9" - }, "engines": { - "node": ">=6.9.0" + "node": ">= 16" }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" + "funding": { + "url": "https://github.com/sponsors/kazupon" } }, - "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, + "node_modules/@intlify/unplugin-vue-i18n": { + "version": "5.2.0", "license": "MIT", "dependencies": { - "@babel/helper-compilation-targets": "^7.25.9", - "@babel/helper-plugin-utils": "^7.25.9", - "@babel/traverse": "^7.25.9" + "@eslint-community/eslint-utils": "^4.4.0", + "@intlify/bundle-utils": "^9.0.0-beta.0", + "@intlify/shared": "next", + "@intlify/vue-i18n-extensions": "^7.0.0", + "@rollup/pluginutils": "^5.1.0", + "@typescript-eslint/scope-manager": "^7.13.0", + "@typescript-eslint/typescript-estree": "^7.13.0", + "debug": "^4.3.3", + "fast-glob": "^3.2.12", + "js-yaml": "^4.1.0", + "json5": "^2.2.3", + "pathe": "^1.0.0", + "picocolors": "^1.0.0", + "source-map-js": "^1.0.2", + "unplugin": "^1.1.0", + "vue": "^3.4" }, "engines": { - "node": ">=6.9.0" + "node": ">= 18" }, "peerDependencies": { - "@babel/core": "^7.0.0-0" + "petite-vue-i18n": "*", + "vue": "^3.2.25", + "vue-i18n": "*" + }, + "peerDependenciesMeta": { + "petite-vue-i18n": { + "optional": true + }, + "vue-i18n": { + "optional": true + } } }, - "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, + "node_modules/@intlify/vue-i18n-extensions": { + "version": "7.0.0", "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.25.9" + "@babel/parser": "^7.24.6", + "@intlify/shared": "^10.0.0", + "@vue/compiler-dom": "^3.2.45", + "vue-i18n": "^10.0.0" }, "engines": { - "node": ">=6.9.0" + "node": ">= 18" }, "peerDependencies": { - "@babel/core": "^7.0.0-0" + "@intlify/shared": "^9.0.0 || ^10.0.0", + "@vue/compiler-dom": "^3.0.0", + "vue": "^3.0.0", + "vue-i18n": "^9.0.0 || ^10.0.0" + }, + "peerDependenciesMeta": { + "@intlify/shared": { + "optional": true + }, + "@vue/compiler-dom": { + "optional": true + }, + "vue": { + "optional": true + }, + "vue-i18n": { + "optional": true + } } }, - "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", + "node_modules/@isaacs/cliui": { + "version": "8.0.2", + "license": "ISC", "dependencies": { - "@babel/helper-plugin-utils": "^7.25.9" + "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": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" + "node": ">=12" } }, - "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, + "node_modules/@isaacs/cliui/node_modules/ansi-regex": { + "version": "6.1.0", "license": "MIT", - "dependencies": { - "@babel/helper-plugin-utils": "^7.25.9" - }, "engines": { - "node": ">=6.9.0" + "node": ">=12" }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" + "funding": { + "url": "https://github.com/chalk/ansi-regex?sponsor=1" } }, - "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, + "node_modules/@isaacs/cliui/node_modules/ansi-styles": { + "version": "6.2.1", "license": "MIT", - "dependencies": { - "@babel/helper-plugin-utils": "^7.25.9" - }, "engines": { - "node": ">=6.9.0" + "node": ">=12" }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" } }, - "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, + "node_modules/@isaacs/cliui/node_modules/emoji-regex": { + "version": "9.2.2", + "license": "MIT" + }, + "node_modules/@isaacs/cliui/node_modules/string-width": { + "version": "5.1.2", "license": "MIT", "dependencies": { - "@babel/helper-module-transforms": "^7.25.9", - "@babel/helper-plugin-utils": "^7.25.9" + "eastasianwidth": "^0.2.0", + "emoji-regex": "^9.2.2", + "strip-ansi": "^7.0.1" }, "engines": { - "node": ">=6.9.0" + "node": ">=12" }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/@babel/plugin-transform-modules-commonjs": { - "version": "7.25.9", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.25.9.tgz", - "integrity": "sha512-dwh2Ol1jWwL2MgkCzUSOvfmKElqQcuswAZypBSUsScMXvgdT8Ekq5YA6TtqpTVWH+4903NmboMuH1o9i8Rxlyg==", - "dev": true, + "node_modules/@isaacs/cliui/node_modules/strip-ansi": { + "version": "7.1.0", "license": "MIT", "dependencies": { - "@babel/helper-module-transforms": "^7.25.9", - "@babel/helper-plugin-utils": "^7.25.9", - "@babel/helper-simple-access": "^7.25.9" + "ansi-regex": "^6.0.1" }, "engines": { - "node": ">=6.9.0" + "node": ">=12" }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" + "funding": { + "url": "https://github.com/chalk/strip-ansi?sponsor=1" } }, - "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, + "node_modules/@isaacs/cliui/node_modules/wrap-ansi": { + "version": "8.1.0", "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" + "ansi-styles": "^6.1.0", + "string-width": "^5.0.1", + "strip-ansi": "^7.0.1" }, "engines": { - "node": ">=6.9.0" + "node": ">=12" }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" + "funding": { + "url": "https://github.com/chalk/wrap-ansi?sponsor=1" } }, - "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, + "node_modules/@jridgewell/sourcemap-codec": { + "version": "1.5.0", + "license": "MIT" + }, + "node_modules/@jsdevtools/ono": { + "version": "7.1.3", + "license": "MIT" + }, + "node_modules/@json-layout/core": { + "version": "1.4.1", "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" + "@json-layout/vocabulary": "~1.4.1", + "ajv": "^8.12.0", + "ajv-errors": "^3.0.0", + "ajv-formats": "^2.1.1", + "ajv-i18n": "^4.2.0", + "debug": "^4.3.4", + "immer": "^10.0.3", + "magicast": "^0.3.3", + "marked": "^14.1.3" } }, - "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, + "node_modules/@json-layout/core/node_modules/ajv-formats": { + "version": "2.1.1", "license": "MIT", "dependencies": { - "@babel/helper-create-regexp-features-plugin": "^7.25.9", - "@babel/helper-plugin-utils": "^7.25.9" - }, - "engines": { - "node": ">=6.9.0" + "ajv": "^8.0.0" }, "peerDependencies": { - "@babel/core": "^7.0.0" + "ajv": "^8.0.0" + }, + "peerDependenciesMeta": { + "ajv": { + "optional": true + } } }, - "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, + "node_modules/@json-layout/vocabulary": { + "version": "1.4.1", "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.25.9" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" + "ajv": "^8.12.0", + "ajv-errors": "^3.0.0", + "ajv-formats": "^2.1.1", + "debug": "^4.3.4" } }, - "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, + "node_modules/@json-layout/vocabulary/node_modules/ajv-formats": { + "version": "2.1.1", "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.25.9" - }, - "engines": { - "node": ">=6.9.0" + "ajv": "^8.0.0" }, "peerDependencies": { - "@babel/core": "^7.0.0-0" + "ajv": "^8.0.0" + }, + "peerDependenciesMeta": { + "ajv": { + "optional": true + } } }, - "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, + "node_modules/@koumoul/v-iframe": { + "version": "2.4.4", "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.25.9" - }, - "engines": { - "node": ">=6.9.0" + "debug": "^4.3.2" }, "peerDependencies": { - "@babel/core": "^7.0.0-0" + "iframe-resizer": "4", + "vuetify": "3" } }, - "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, + "node_modules/@koumoul/vjsf": { + "version": "3.8.0", + "resolved": "https://registry.npmjs.org/@koumoul/vjsf/-/vjsf-3.8.0.tgz", + "integrity": "sha512-eBM4nmojTJ7YTVFJKcnUU3e14V3jsrXOVpHea+mR1l4Qc8Hg3TAi4bWOalTEuCIMhWUc6R81Ze8sZHCpOTfR2g==", "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" + "@json-layout/core": "~1.4.1", + "@vueuse/core": "^10.5.0", + "debug": "^4.3.4" }, "peerDependencies": { - "@babel/core": "^7.0.0-0" + "vue": "^3.4.3", + "vuetify": "^3.6.13" } }, - "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, + "node_modules/@koumoul/vjsf-compiler": { + "version": "0.2.2", "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" + "@json-layout/core": "0.33.3", + "debug": "^4.3.4", + "ejs": "^3.1.9" } }, - "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, + "node_modules/@koumoul/vjsf-compiler/node_modules/@json-layout/core": { + "version": "0.33.3", "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.25.9" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" + "@json-layout/vocabulary": "^0.23.2", + "ajv": "^8.12.0", + "ajv-errors": "^3.0.0", + "ajv-formats": "^2.1.1", + "ajv-i18n": "^4.2.0", + "debug": "^4.3.4", + "immer": "^10.0.3", + "magicast": "^0.3.3", + "marked": "^14.1.3" } }, - "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, + "node_modules/@koumoul/vjsf-compiler/node_modules/@json-layout/vocabulary": { + "version": "0.23.3", "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" + "ajv": "^8.12.0", + "ajv-errors": "^3.0.0", + "ajv-formats": "^2.1.1", + "debug": "^4.3.4" } }, - "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, + "node_modules/@koumoul/vjsf-compiler/node_modules/ajv-formats": { + "version": "2.1.1", "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.25.9" - }, - "engines": { - "node": ">=6.9.0" + "ajv": "^8.0.0" }, "peerDependencies": { - "@babel/core": "^7.0.0-0" + "ajv": "^8.0.0" + }, + "peerDependenciesMeta": { + "ajv": { + "optional": true + } } }, - "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, + "node_modules/@koumoul/vjsf/node_modules/@vueuse/core": { + "version": "10.11.1", "license": "MIT", "dependencies": { - "@babel/helper-create-class-features-plugin": "^7.25.9", - "@babel/helper-plugin-utils": "^7.25.9" - }, - "engines": { - "node": ">=6.9.0" + "@types/web-bluetooth": "^0.0.20", + "@vueuse/metadata": "10.11.1", + "@vueuse/shared": "10.11.1", + "vue-demi": ">=0.14.8" }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" + "funding": { + "url": "https://github.com/sponsors/antfu" } }, - "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, + "node_modules/@koumoul/vjsf/node_modules/@vueuse/core/node_modules/vue-demi": { + "version": "0.14.10", + "hasInstallScript": 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" + "bin": { + "vue-demi-fix": "bin/vue-demi-fix.js", + "vue-demi-switch": "bin/vue-demi-switch.js" }, "engines": { - "node": ">=6.9.0" + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/antfu" }, "peerDependencies": { - "@babel/core": "^7.0.0-0" + "@vue/composition-api": "^1.0.0-rc.1", + "vue": "^3.0.0-0 || ^2.6.0" + }, + "peerDependenciesMeta": { + "@vue/composition-api": { + "optional": true + } } }, - "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, + "node_modules/@koumoul/vjsf/node_modules/@vueuse/metadata": { + "version": "10.11.1", "license": "MIT", - "dependencies": { - "@babel/helper-plugin-utils": "^7.25.9" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" + "funding": { + "url": "https://github.com/sponsors/antfu" } }, - "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, + "node_modules/@koumoul/vjsf/node_modules/@vueuse/shared": { + "version": "10.11.1", "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.25.9", - "regenerator-transform": "^0.15.2" - }, - "engines": { - "node": ">=6.9.0" + "vue-demi": ">=0.14.8" }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" + "funding": { + "url": "https://github.com/sponsors/antfu" } }, - "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, + "node_modules/@koumoul/vjsf/node_modules/@vueuse/shared/node_modules/vue-demi": { + "version": "0.14.10", + "hasInstallScript": true, "license": "MIT", - "dependencies": { - "@babel/helper-create-regexp-features-plugin": "^7.25.9", - "@babel/helper-plugin-utils": "^7.25.9" + "bin": { + "vue-demi-fix": "bin/vue-demi-fix.js", + "vue-demi-switch": "bin/vue-demi-switch.js" }, "engines": { - "node": ">=6.9.0" + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/antfu" }, "peerDependencies": { - "@babel/core": "^7.0.0" + "@vue/composition-api": "^1.0.0-rc.1", + "vue": "^3.0.0-0 || ^2.6.0" + }, + "peerDependenciesMeta": { + "@vue/composition-api": { + "optional": true + } } }, - "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, + "node_modules/@ldapjs/asn1": { + "version": "2.0.0", + "license": "MIT" + }, + "node_modules/@ldapjs/attribute": { + "version": "1.0.0", "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.25.9" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" + "@ldapjs/asn1": "2.0.0", + "@ldapjs/protocol": "^1.2.1", + "process-warning": "^2.1.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, + "node_modules/@ldapjs/change": { + "version": "1.0.0", "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" + "@ldapjs/asn1": "2.0.0", + "@ldapjs/attribute": "1.0.0" } }, - "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, + "node_modules/@ldapjs/controls": { + "version": "2.1.0", "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.25.9" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" + "@ldapjs/asn1": "^1.2.0", + "@ldapjs/protocol": "^1.2.1" } }, - "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, + "node_modules/@ldapjs/controls/node_modules/@ldapjs/asn1": { + "version": "1.2.0", + "license": "MIT" + }, + "node_modules/@ldapjs/dn": { + "version": "1.1.0", "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" + "@ldapjs/asn1": "2.0.0", + "process-warning": "^2.1.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, + "node_modules/@ldapjs/filter": { + "version": "2.1.1", "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.25.9" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" + "@ldapjs/asn1": "2.0.0", + "@ldapjs/protocol": "^1.2.1", + "process-warning": "^2.1.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, + "node_modules/@ldapjs/messages": { + "version": "1.3.0", "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.25.9" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" + "@ldapjs/asn1": "^2.0.0", + "@ldapjs/attribute": "^1.0.0", + "@ldapjs/change": "^1.0.0", + "@ldapjs/controls": "^2.1.0", + "@ldapjs/dn": "^1.1.0", + "@ldapjs/filter": "^2.1.1", + "@ldapjs/protocol": "^1.2.1", + "process-warning": "^2.2.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, + "node_modules/@ldapjs/protocol": { + "version": "1.2.1", + "license": "MIT" + }, + "node_modules/@mdi/js": { + "version": "7.4.47", + "license": "Apache-2.0" + }, + "node_modules/@messageformat/core": { + "version": "3.4.0", "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.25.9" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" + "@messageformat/date-skeleton": "^1.0.0", + "@messageformat/number-skeleton": "^1.0.0", + "@messageformat/parser": "^5.1.0", + "@messageformat/runtime": "^3.0.1", + "make-plural": "^7.0.0", + "safe-identifier": "^0.4.1" } }, - "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, + "node_modules/@messageformat/date-skeleton": { + "version": "1.1.0", + "license": "MIT" + }, + "node_modules/@messageformat/number-skeleton": { + "version": "1.2.0", + "license": "MIT" + }, + "node_modules/@messageformat/parser": { + "version": "5.1.0", "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.25.9" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" + "moo": "^0.5.1" } }, - "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, + "node_modules/@messageformat/runtime": { + "version": "3.0.1", "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" + "make-plural": "^7.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, + "node_modules/@mongodb-js/saslprep": { + "version": "1.1.9", "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" + "sparse-bitfield": "^3.0.3" } }, - "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, + "node_modules/@nodelib/fs.scandir": { + "version": "2.1.5", "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" + "@nodelib/fs.stat": "2.0.5", + "run-parallel": "^1.1.9" }, "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" + "node": ">= 8" } }, - "node_modules/@babel/preset-env/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, + "node_modules/@nodelib/fs.stat": { + "version": "2.0.5", "license": "MIT", "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": ">= 8" } }, - "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, + "node_modules/@nodelib/fs.walk": { + "version": "1.2.8", "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.0.0", - "@babel/types": "^7.4.4", - "esutils": "^2.0.2" + "@nodelib/fs.scandir": "2.1.5", + "fastq": "^1.6.0" }, - "peerDependencies": { - "@babel/core": "^7.0.0-0 || ^8.0.0-0 <8.0.0" + "engines": { + "node": ">= 8" } }, - "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==", - "license": "MIT", - "dependencies": { - "regenerator-runtime": "^0.14.0" - }, - "engines": { - "node": ">=6.9.0" - } + "node_modules/@one-ini/wasm": { + "version": "0.1.1", + "license": "MIT" }, - "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==", - "license": "MIT", - "dependencies": { - "@babel/code-frame": "^7.25.9", - "@babel/parser": "^7.25.9", - "@babel/types": "^7.25.9" - }, + "node_modules/@opentelemetry/api": { + "version": "1.9.0", + "license": "Apache-2.0", "engines": { - "node": ">=6.9.0" + "node": ">=8.0.0" } }, - "node_modules/@babel/traverse": { - "version": "7.25.9", - "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.25.9.tgz", - "integrity": "sha512-ZCuvfwOwlz/bawvAuvcj8rrithP2/N55Tzz342AkTvq4qaWbGfmCk/tKhNaV2cthijKrPAA8SRJV5WWe7IBMJw==", + "node_modules/@otplib/core": { + "version": "12.0.1", + "license": "MIT" + }, + "node_modules/@otplib/plugin-crypto": { + "version": "12.0.1", "license": "MIT", "dependencies": { - "@babel/code-frame": "^7.25.9", - "@babel/generator": "^7.25.9", - "@babel/parser": "^7.25.9", - "@babel/template": "^7.25.9", - "@babel/types": "^7.25.9", - "debug": "^4.3.1", - "globals": "^11.1.0" - }, - "engines": { - "node": ">=6.9.0" + "@otplib/core": "^12.0.1" } }, - "node_modules/@babel/types": { - "version": "7.26.0", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.26.0.tgz", - "integrity": "sha512-Z/yiTPj+lDVnF7lWeKCIJzaIkI0vYO87dMpZ4bg4TDrFe4XXLFWL1TbXU27gBP3QccxV9mZICCrnjnYlJjXHOA==", + "node_modules/@otplib/plugin-thirty-two": { + "version": "12.0.1", "license": "MIT", "dependencies": { - "@babel/helper-string-parser": "^7.25.9", - "@babel/helper-validator-identifier": "^7.25.9" - }, - "engines": { - "node": ">=6.9.0" + "@otplib/core": "^12.0.1", + "thirty-two": "^1.0.2" } }, - "node_modules/@bcherny/json-schema-ref-parser": { - "version": "10.0.5-fork", - "resolved": "https://registry.npmjs.org/@bcherny/json-schema-ref-parser/-/json-schema-ref-parser-10.0.5-fork.tgz", - "integrity": "sha512-E/jKbPoca1tfUPj3iSbitDZTGnq6FUFjkH6L8U2oDwSuwK1WhnnVtCG7oFOTg/DDnyoXbQYUiUiGOibHqaGVnw==", + "node_modules/@otplib/preset-default": { + "version": "12.0.1", "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" - }, - "engines": { - "node": ">= 16" - }, - "funding": { - "url": "https://github.com/sponsors/philsturgeon" + "@otplib/core": "^12.0.1", + "@otplib/plugin-crypto": "^12.0.1", + "@otplib/plugin-thirty-two": "^12.0.1" } }, - "node_modules/@bcherny/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==", - "license": "Python-2.0" - }, - "node_modules/@bcherny/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==", + "node_modules/@otplib/preset-v11": { + "version": "12.0.1", "license": "MIT", "dependencies": { - "argparse": "^2.0.1" - }, - "bin": { - "js-yaml": "bin/js-yaml.js" + "@otplib/core": "^12.0.1", + "@otplib/plugin-crypto": "^12.0.1", + "@otplib/plugin-thirty-two": "^12.0.1" } }, - "node_modules/@commitlint/cli": { - "version": "17.8.1", - "resolved": "https://registry.npmjs.org/@commitlint/cli/-/cli-17.8.1.tgz", - "integrity": "sha512-ay+WbzQesE0Rv4EQKfNbSMiJJ12KdKTDzIt0tcK4k11FdsWmtwP0Kp1NWMOUswfIWo6Eb7p7Ln721Nx9FLNBjg==", - "dev": true, + "node_modules/@pkgjs/parseargs": { + "version": "0.11.0", "license": "MIT", - "dependencies": { - "@commitlint/format": "^17.8.1", - "@commitlint/lint": "^17.8.1", - "@commitlint/load": "^17.8.1", - "@commitlint/read": "^17.8.1", - "@commitlint/types": "^17.8.1", - "execa": "^5.0.0", - "lodash.isfunction": "^3.0.9", - "resolve-from": "5.0.0", - "resolve-global": "1.0.0", - "yargs": "^17.0.0" - }, - "bin": { - "commitlint": "cli.js" - }, + "optional": true, "engines": { - "node": ">=v14" + "node": ">=14" } }, - "node_modules/@commitlint/config-conventional": { - "version": "17.8.1", - "resolved": "https://registry.npmjs.org/@commitlint/config-conventional/-/config-conventional-17.8.1.tgz", - "integrity": "sha512-NxCOHx1kgneig3VLauWJcDWS40DVjg7nKOpBEEK9E5fjJpQqLCilcnKkIIjdBH98kEO1q3NpE5NSrZ2kl/QGJg==", + "node_modules/@reporters/bail": { + "version": "1.2.1", "dev": true, + "license": "MIT" + }, + "node_modules/@rollup/pluginutils": { + "version": "5.1.2", "license": "MIT", "dependencies": { - "conventional-changelog-conventionalcommits": "^6.1.0" + "@types/estree": "^1.0.0", + "estree-walker": "^2.0.2", + "picomatch": "^2.3.1" }, "engines": { - "node": ">=v14" + "node": ">=14.0.0" + }, + "peerDependencies": { + "rollup": "^1.20.0||^2.0.0||^3.0.0||^4.0.0" + }, + "peerDependenciesMeta": { + "rollup": { + "optional": true + } } }, - "node_modules/@commitlint/config-validator": { - "version": "17.8.1", - "resolved": "https://registry.npmjs.org/@commitlint/config-validator/-/config-validator-17.8.1.tgz", - "integrity": "sha512-UUgUC+sNiiMwkyiuIFR7JG2cfd9t/7MV8VB4TZ+q02ZFkHoduUS4tJGsCBWvBOGD9Btev6IecPMvlWUfJorkEA==", - "dev": true, + "node_modules/@rollup/rollup-linux-x64-gnu": { + "version": "4.24.0", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-x64-musl": { + "version": "4.24.0", + "cpu": [ + "x64" + ], "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@sd/api": { + "resolved": "api", + "link": true + }, + "node_modules/@sd/shared": { + "resolved": "shared", + "link": true + }, + "node_modules/@sd/ui": { + "resolved": "ui", + "link": true + }, + "node_modules/@sideway/address": { + "version": "4.1.5", + "license": "BSD-3-Clause", "dependencies": { - "@commitlint/types": "^17.8.1", - "ajv": "^8.11.0" - }, - "engines": { - "node": ">=v14" + "@hapi/hoek": "^9.0.0" } }, - "node_modules/@commitlint/ensure": { - "version": "17.8.1", - "resolved": "https://registry.npmjs.org/@commitlint/ensure/-/ensure-17.8.1.tgz", - "integrity": "sha512-xjafwKxid8s1K23NFpL8JNo6JnY/ysetKo8kegVM7c8vs+kWLP8VrQq+NbhgVlmCojhEDbzQKp4eRXSjVOGsow==", + "node_modules/@sideway/address/node_modules/@hapi/hoek": { + "version": "9.3.0", + "license": "BSD-3-Clause" + }, + "node_modules/@sideway/formula": { + "version": "3.0.1", + "license": "BSD-3-Clause" + }, + "node_modules/@sideway/pinpoint": { + "version": "2.0.0", + "license": "BSD-3-Clause" + }, + "node_modules/@stylistic/eslint-plugin": { + "version": "2.9.0", "dev": true, "license": "MIT", "dependencies": { - "@commitlint/types": "^17.8.1", - "lodash.camelcase": "^4.3.0", - "lodash.kebabcase": "^4.1.1", - "lodash.snakecase": "^4.1.1", - "lodash.startcase": "^4.4.0", - "lodash.upperfirst": "^4.3.1" + "@typescript-eslint/utils": "^8.8.0", + "eslint-visitor-keys": "^4.1.0", + "espree": "^10.2.0", + "estraverse": "^5.3.0", + "picomatch": "^4.0.2" }, "engines": { - "node": ">=v14" + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "peerDependencies": { + "eslint": ">=8.40.0" } }, - "node_modules/@commitlint/execute-rule": { - "version": "17.8.1", - "resolved": "https://registry.npmjs.org/@commitlint/execute-rule/-/execute-rule-17.8.1.tgz", - "integrity": "sha512-JHVupQeSdNI6xzA9SqMF+p/JjrHTcrJdI02PwesQIDCIGUrv04hicJgCcws5nzaoZbROapPs0s6zeVHoxpMwFQ==", + "node_modules/@stylistic/eslint-plugin/node_modules/eslint-visitor-keys": { + "version": "4.1.0", "dev": true, - "license": "MIT", + "license": "Apache-2.0", "engines": { - "node": ">=v14" - } - }, - "node_modules/@commitlint/format": { - "version": "17.8.1", - "resolved": "https://registry.npmjs.org/@commitlint/format/-/format-17.8.1.tgz", - "integrity": "sha512-f3oMTyZ84M9ht7fb93wbCKmWxO5/kKSbwuYvS867duVomoOsgrgljkGGIztmT/srZnaiGbaK8+Wf8Ik2tSr5eg==", - "dev": true, - "license": "MIT", - "dependencies": { - "@commitlint/types": "^17.8.1", - "chalk": "^4.1.0" + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" }, - "engines": { - "node": ">=v14" + "funding": { + "url": "https://opencollective.com/eslint" } }, - "node_modules/@commitlint/format/node_modules/chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "node_modules/@stylistic/eslint-plugin/node_modules/picomatch": { + "version": "4.0.2", "dev": true, "license": "MIT", - "dependencies": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - }, "engines": { - "node": ">=10" + "node": ">=12" }, "funding": { - "url": "https://github.com/chalk/chalk?sponsor=1" + "url": "https://github.com/sponsors/jonschlinkert" } }, - "node_modules/@commitlint/format/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==", + "node_modules/@types/accept-language-parser": { + "version": "1.5.6", "dev": true, + "license": "MIT" + }, + "node_modules/@types/body-parser": { + "version": "1.19.5", "license": "MIT", "dependencies": { - "has-flag": "^4.0.0" - }, - "engines": { - "node": ">=8" + "@types/connect": "*", + "@types/node": "*" } }, - "node_modules/@commitlint/is-ignored": { - "version": "17.8.1", - "resolved": "https://registry.npmjs.org/@commitlint/is-ignored/-/is-ignored-17.8.1.tgz", - "integrity": "sha512-UshMi4Ltb4ZlNn4F7WtSEugFDZmctzFpmbqvpyxD3la510J+PLcnyhf9chs7EryaRFJMdAKwsEKfNK0jL/QM4g==", + "node_modules/@types/capitalize": { + "version": "2.0.2", "dev": true, + "license": "MIT" + }, + "node_modules/@types/config": { + "version": "3.3.5", + "license": "MIT" + }, + "node_modules/@types/connect": { + "version": "3.4.38", "license": "MIT", "dependencies": { - "@commitlint/types": "^17.8.1", - "semver": "7.5.4" - }, - "engines": { - "node": ">=v14" + "@types/node": "*" } }, - "node_modules/@commitlint/lint": { - "version": "17.8.1", - "resolved": "https://registry.npmjs.org/@commitlint/lint/-/lint-17.8.1.tgz", - "integrity": "sha512-aQUlwIR1/VMv2D4GXSk7PfL5hIaFSfy6hSHV94O8Y27T5q+DlDEgd/cZ4KmVI+MWKzFfCTiTuWqjfRSfdRllCA==", + "node_modules/@types/conventional-commits-parser": { + "version": "5.0.0", "dev": true, "license": "MIT", "dependencies": { - "@commitlint/is-ignored": "^17.8.1", - "@commitlint/parse": "^17.8.1", - "@commitlint/rules": "^17.8.1", - "@commitlint/types": "^17.8.1" - }, - "engines": { - "node": ">=v14" + "@types/node": "*" } }, - "node_modules/@commitlint/load": { - "version": "17.8.1", - "resolved": "https://registry.npmjs.org/@commitlint/load/-/load-17.8.1.tgz", - "integrity": "sha512-iF4CL7KDFstP1kpVUkT8K2Wl17h2yx9VaR1ztTc8vzByWWcbO/WaKwxsnCOqow9tVAlzPfo1ywk9m2oJ9ucMqA==", + "node_modules/@types/cookie": { + "version": "0.6.0", + "license": "MIT" + }, + "node_modules/@types/cookie-parser": { + "version": "1.4.7", "dev": true, "license": "MIT", "dependencies": { - "@commitlint/config-validator": "^17.8.1", - "@commitlint/execute-rule": "^17.8.1", - "@commitlint/resolve-extends": "^17.8.1", - "@commitlint/types": "^17.8.1", - "@types/node": "20.5.1", - "chalk": "^4.1.0", - "cosmiconfig": "^8.0.0", - "cosmiconfig-typescript-loader": "^4.0.0", - "lodash.isplainobject": "^4.0.6", - "lodash.merge": "^4.6.2", - "lodash.uniq": "^4.5.0", - "resolve-from": "^5.0.0", - "ts-node": "^10.8.1", - "typescript": "^4.6.4 || ^5.2.2" - }, - "engines": { - "node": ">=v14" + "@types/express": "*" } }, - "node_modules/@commitlint/load/node_modules/chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "node_modules/@types/cookies": { + "version": "0.9.0", "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" + "@types/connect": "*", + "@types/express": "*", + "@types/keygrip": "*", + "@types/node": "*" } }, - "node_modules/@commitlint/load/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, + "node_modules/@types/debug": { + "version": "4.1.12", "license": "MIT", "dependencies": { - "has-flag": "^4.0.0" - }, - "engines": { - "node": ">=8" + "@types/ms": "*" } }, - "node_modules/@commitlint/message": { - "version": "17.8.1", - "resolved": "https://registry.npmjs.org/@commitlint/message/-/message-17.8.1.tgz", - "integrity": "sha512-6bYL1GUQsD6bLhTH3QQty8pVFoETfFQlMn2Nzmz3AOLqRVfNNtXBaSY0dhZ0dM6A2MEq4+2d7L/2LP8TjqGRkA==", - "dev": true, + "node_modules/@types/estree": { + "version": "1.0.6", + "license": "MIT" + }, + "node_modules/@types/express": { + "version": "4.17.21", "license": "MIT", - "engines": { - "node": ">=v14" + "dependencies": { + "@types/body-parser": "*", + "@types/express-serve-static-core": "^4.17.33", + "@types/qs": "*", + "@types/serve-static": "*" } }, - "node_modules/@commitlint/parse": { - "version": "17.8.1", - "resolved": "https://registry.npmjs.org/@commitlint/parse/-/parse-17.8.1.tgz", - "integrity": "sha512-/wLUickTo0rNpQgWwLPavTm7WbwkZoBy3X8PpkUmlSmQJyWQTj0m6bDjiykMaDt41qcUbfeFfaCvXfiR4EGnfw==", - "dev": true, + "node_modules/@types/express-serve-static-core": { + "version": "4.19.6", "license": "MIT", "dependencies": { - "@commitlint/types": "^17.8.1", - "conventional-changelog-angular": "^6.0.0", - "conventional-commits-parser": "^4.0.0" - }, - "engines": { - "node": ">=v14" + "@types/node": "*", + "@types/qs": "*", + "@types/range-parser": "*", + "@types/send": "*" } }, - "node_modules/@commitlint/read": { - "version": "17.8.1", - "resolved": "https://registry.npmjs.org/@commitlint/read/-/read-17.8.1.tgz", - "integrity": "sha512-Fd55Oaz9irzBESPCdMd8vWWgxsW3OWR99wOntBDHgf9h7Y6OOHjWEdS9Xzen1GFndqgyoaFplQS5y7KZe0kO2w==", + "node_modules/@types/gm": { + "version": "1.25.4", "dev": true, "license": "MIT", "dependencies": { - "@commitlint/top-level": "^17.8.1", - "@commitlint/types": "^17.8.1", - "fs-extra": "^11.0.0", - "git-raw-commits": "^2.0.11", - "minimist": "^1.2.6" - }, - "engines": { - "node": ">=v14" + "@types/node": "*" } }, - "node_modules/@commitlint/read/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==", - "dev": true, + "node_modules/@types/http-errors": { + "version": "2.0.4", + "license": "MIT" + }, + "node_modules/@types/json-schema": { + "version": "7.0.15", + "license": "MIT" + }, + "node_modules/@types/jsonwebtoken": { + "version": "9.0.7", "license": "MIT", "dependencies": { - "graceful-fs": "^4.2.0", - "jsonfile": "^6.0.1", - "universalify": "^2.0.0" - }, - "engines": { - "node": ">=14.14" + "@types/node": "*" } }, - "node_modules/@commitlint/read/node_modules/jsonfile": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.1.0.tgz", - "integrity": "sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==", + "node_modules/@types/keygrip": { + "version": "1.0.6", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/ldapjs": { + "version": "3.0.6", "dev": true, "license": "MIT", "dependencies": { - "universalify": "^2.0.0" - }, - "optionalDependencies": { - "graceful-fs": "^4.1.6" + "@types/node": "*" } }, - "node_modules/@commitlint/read/node_modules/universalify": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.1.tgz", - "integrity": "sha512-gptHNQghINnc/vTGIk0SOFGFNXw7JVrlRUtConJRlvaw6DuX0wO5Jeko9sWrMBhh+PsYAZ7oXAiOnf/UKogyiw==", + "node_modules/@types/lodash": { + "version": "4.17.10", + "license": "MIT" + }, + "node_modules/@types/material-colors": { + "version": "1.2.3", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/memoizee": { + "version": "0.4.11", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/mime": { + "version": "1.3.5", + "license": "MIT" + }, + "node_modules/@types/mjml": { + "version": "4.7.4", "dev": true, "license": "MIT", - "engines": { - "node": ">= 10.0.0" + "dependencies": { + "@types/mjml-core": "*" } }, - "node_modules/@commitlint/resolve-extends": { - "version": "17.8.1", - "resolved": "https://registry.npmjs.org/@commitlint/resolve-extends/-/resolve-extends-17.8.1.tgz", - "integrity": "sha512-W/ryRoQ0TSVXqJrx5SGkaYuAaE/BUontL1j1HsKckvM6e5ZaG0M9126zcwL6peKSuIetJi7E87PRQF8O86EW0Q==", + "node_modules/@types/mjml-core": { + "version": "4.15.0", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/ms": { + "version": "0.7.34", + "license": "MIT" + }, + "node_modules/@types/multer": { + "version": "1.4.12", "dev": true, "license": "MIT", "dependencies": { - "@commitlint/config-validator": "^17.8.1", - "@commitlint/types": "^17.8.1", - "import-fresh": "^3.0.0", - "lodash.mergewith": "^4.6.2", - "resolve-from": "^5.0.0", - "resolve-global": "^1.0.0" - }, - "engines": { - "node": ">=v14" + "@types/express": "*" } }, - "node_modules/@commitlint/rules": { - "version": "17.8.1", - "resolved": "https://registry.npmjs.org/@commitlint/rules/-/rules-17.8.1.tgz", - "integrity": "sha512-2b7OdVbN7MTAt9U0vKOYKCDsOvESVXxQmrvuVUZ0rGFMCrCPJWWP1GJ7f0lAypbDAhaGb8zqtdOr47192LBrIA==", - "dev": true, + "node_modules/@types/node": { + "version": "22.7.5", "license": "MIT", "dependencies": { - "@commitlint/ensure": "^17.8.1", - "@commitlint/message": "^17.8.1", - "@commitlint/to-lines": "^17.8.1", - "@commitlint/types": "^17.8.1", - "execa": "^5.0.0" - }, - "engines": { - "node": ">=v14" + "undici-types": "~6.19.2" } }, - "node_modules/@commitlint/to-lines": { - "version": "17.8.1", - "resolved": "https://registry.npmjs.org/@commitlint/to-lines/-/to-lines-17.8.1.tgz", - "integrity": "sha512-LE0jb8CuR/mj6xJyrIk8VLz03OEzXFgLdivBytoooKO5xLt5yalc8Ma5guTWobw998sbR3ogDd+2jed03CFmJA==", + "node_modules/@types/node-cron": { + "version": "3.0.11", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/nodemailer": { + "version": "6.4.16", "dev": true, "license": "MIT", - "engines": { - "node": ">=v14" + "dependencies": { + "@types/node": "*" } }, - "node_modules/@commitlint/top-level": { - "version": "17.8.1", - "resolved": "https://registry.npmjs.org/@commitlint/top-level/-/top-level-17.8.1.tgz", - "integrity": "sha512-l6+Z6rrNf5p333SHfEte6r+WkOxGlWK4bLuZKbtf/2TXRN+qhrvn1XE63VhD8Oe9oIHQ7F7W1nG2k/TJFhx2yA==", + "node_modules/@types/qrcode": { + "version": "1.5.5", "dev": true, "license": "MIT", "dependencies": { - "find-up": "^5.0.0" - }, - "engines": { - "node": ">=v14" + "@types/node": "*" } }, - "node_modules/@commitlint/types": { - "version": "17.8.1", - "resolved": "https://registry.npmjs.org/@commitlint/types/-/types-17.8.1.tgz", - "integrity": "sha512-PXDQXkAmiMEG162Bqdh9ChML/GJZo6vU+7F03ALKDK8zYc6SuAr47LjG7hGYRqUOz+WK0dU7bQ0xzuqFMdxzeQ==", + "node_modules/@types/qs": { + "version": "6.9.16", + "license": "MIT" + }, + "node_modules/@types/range-parser": { + "version": "1.2.7", + "license": "MIT" + }, + "node_modules/@types/seedrandom": { + "version": "3.0.8", "dev": true, + "license": "MIT" + }, + "node_modules/@types/send": { + "version": "0.17.4", "license": "MIT", "dependencies": { - "chalk": "^4.1.0" - }, - "engines": { - "node": ">=v14" + "@types/mime": "^1", + "@types/node": "*" } }, - "node_modules/@commitlint/types/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, + "node_modules/@types/serve-static": { + "version": "1.15.7", "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" + "@types/http-errors": "*", + "@types/node": "*", + "@types/send": "*" } }, - "node_modules/@commitlint/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==", + "node_modules/@types/simple-oauth2": { + "version": "5.0.7", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/tinycolor2": { + "version": "1.4.6", + "resolved": "https://registry.npmjs.org/@types/tinycolor2/-/tinycolor2-1.4.6.tgz", + "integrity": "sha512-iEN8J0BoMnsWBqjVbWH/c0G0Hh7O21lpR2/+PrvAVgWdzL7eexIFm4JN/Wn10PTcmNdtS6U67r499mlWMXOxNw==", + "license": "MIT" + }, + "node_modules/@types/useragent": { + "version": "2.3.4", "dev": true, + "license": "MIT" + }, + "node_modules/@types/vue-cropperjs": { + "version": "4.1.6", "license": "MIT", "dependencies": { - "has-flag": "^4.0.0" + "vue": "^2.0.0" + } + }, + "node_modules/@types/vue-cropperjs/node_modules/@vue/compiler-sfc": { + "version": "2.7.16", + "dependencies": { + "@babel/parser": "^7.23.5", + "postcss": "^8.4.14", + "source-map": "^0.6.1" }, - "engines": { - "node": ">=8" + "optionalDependencies": { + "prettier": "^1.18.2 || ^2.0.0" } }, - "node_modules/@cspotcode/source-map-support": { - "version": "0.8.1", - "resolved": "https://registry.npmjs.org/@cspotcode/source-map-support/-/source-map-support-0.8.1.tgz", - "integrity": "sha512-IchNf6dN4tHoMFIn/7OE8LWZ19Y6q/67Bmf6vnGREv8RSbBVb9LPJxEcnwrcwX6ixSvaiGoomAUvu4YSxXrVgw==", - "dev": true, + "node_modules/@types/vue-cropperjs/node_modules/prettier": { + "version": "2.8.8", "license": "MIT", - "dependencies": { - "@jridgewell/trace-mapping": "0.3.9" + "optional": true, + "bin": { + "prettier": "bin-prettier.js" }, "engines": { - "node": ">=12" + "node": ">=10.13.0" + }, + "funding": { + "url": "https://github.com/prettier/prettier?sponsor=1" } }, - "node_modules/@cspotcode/source-map-support/node_modules/@jridgewell/trace-mapping": { - "version": "0.3.9", - "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.9.tgz", - "integrity": "sha512-3Belt6tdc8bPgAtbcmdtNJlirVoTmEb5e2gC94PnkwEW9jI6CAHUeoG85tjWP5WquqfavoMtMwiG4P926ZKKuQ==", - "dev": true, + "node_modules/@types/vue-cropperjs/node_modules/vue": { + "version": "2.7.16", + "license": "MIT", + "dependencies": { + "@vue/compiler-sfc": "2.7.16", + "csstype": "^3.1.0" + } + }, + "node_modules/@types/web-bluetooth": { + "version": "0.0.20", + "license": "MIT" + }, + "node_modules/@types/webidl-conversions": { + "version": "7.0.3", + "license": "MIT" + }, + "node_modules/@types/whatwg-url": { + "version": "11.0.5", "license": "MIT", "dependencies": { - "@jridgewell/resolve-uri": "^3.0.3", - "@jridgewell/sourcemap-codec": "^1.4.10" + "@types/webidl-conversions": "*" } }, - "node_modules/@csstools/cascade-layer-name-parser": { - "version": "1.0.13", - "resolved": "https://registry.npmjs.org/@csstools/cascade-layer-name-parser/-/cascade-layer-name-parser-1.0.13.tgz", - "integrity": "sha512-MX0yLTwtZzr82sQ0zOjqimpZbzjMaK/h2pmlrLK7DCzlmiZLYFpoO94WmN1akRVo6ll/TdpHb53vihHLUMyvng==", + "node_modules/@typescript-eslint/eslint-plugin": { + "version": "8.9.0", "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/csstools" - }, - { - "type": "opencollective", - "url": "https://opencollective.com/csstools" - } - ], "license": "MIT", + "dependencies": { + "@eslint-community/regexpp": "^4.10.0", + "@typescript-eslint/scope-manager": "8.9.0", + "@typescript-eslint/type-utils": "8.9.0", + "@typescript-eslint/utils": "8.9.0", + "@typescript-eslint/visitor-keys": "8.9.0", + "graphemer": "^1.4.0", + "ignore": "^5.3.1", + "natural-compare": "^1.4.0", + "ts-api-utils": "^1.3.0" + }, "engines": { - "node": "^14 || ^16 || >=18" + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" }, "peerDependencies": { - "@csstools/css-parser-algorithms": "^2.7.1", - "@csstools/css-tokenizer": "^2.4.1" + "@typescript-eslint/parser": "^8.0.0 || ^8.0.0-alpha.0", + "eslint": "^8.57.0 || ^9.0.0" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } } }, - "node_modules/@csstools/color-helpers": { - "version": "4.2.1", - "resolved": "https://registry.npmjs.org/@csstools/color-helpers/-/color-helpers-4.2.1.tgz", - "integrity": "sha512-CEypeeykO9AN7JWkr1OEOQb0HRzZlPWGwV0Ya6DuVgFdDi6g3ma/cPZ5ZPZM4AWQikDpq/0llnGGlIL+j8afzw==", + "node_modules/@typescript-eslint/eslint-plugin/node_modules/@typescript-eslint/scope-manager": { + "version": "8.9.0", "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/csstools" - }, - { - "type": "opencollective", - "url": "https://opencollective.com/csstools" - } - ], - "license": "MIT-0", + "license": "MIT", + "dependencies": { + "@typescript-eslint/types": "8.9.0", + "@typescript-eslint/visitor-keys": "8.9.0" + }, "engines": { - "node": "^14 || ^16 || >=18" + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" } }, - "node_modules/@csstools/css-calc": { - "version": "1.2.4", - "resolved": "https://registry.npmjs.org/@csstools/css-calc/-/css-calc-1.2.4.tgz", - "integrity": "sha512-tfOuvUQeo7Hz+FcuOd3LfXVp+342pnWUJ7D2y8NUpu1Ww6xnTbHLpz018/y6rtbHifJ3iIEf9ttxXd8KG7nL0Q==", + "node_modules/@typescript-eslint/eslint-plugin/node_modules/@typescript-eslint/types": { + "version": "8.9.0", "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/csstools" - }, - { - "type": "opencollective", - "url": "https://opencollective.com/csstools" - } - ], "license": "MIT", "engines": { - "node": "^14 || ^16 || >=18" + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" }, - "peerDependencies": { - "@csstools/css-parser-algorithms": "^2.7.1", - "@csstools/css-tokenizer": "^2.4.1" + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" } }, - "node_modules/@csstools/css-color-parser": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/@csstools/css-color-parser/-/css-color-parser-2.0.5.tgz", - "integrity": "sha512-lRZSmtl+DSjok3u9hTWpmkxFZnz7stkbZxzKc08aDUsdrWwhSgWo8yq9rq9DaFUtbAyAq2xnH92fj01S+pwIww==", + "node_modules/@typescript-eslint/eslint-plugin/node_modules/@typescript-eslint/visitor-keys": { + "version": "8.9.0", "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/csstools" - }, - { - "type": "opencollective", - "url": "https://opencollective.com/csstools" - } - ], "license": "MIT", "dependencies": { - "@csstools/color-helpers": "^4.2.1", - "@csstools/css-calc": "^1.2.4" + "@typescript-eslint/types": "8.9.0", + "eslint-visitor-keys": "^3.4.3" }, "engines": { - "node": "^14 || ^16 || >=18" + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" }, - "peerDependencies": { - "@csstools/css-parser-algorithms": "^2.7.1", - "@csstools/css-tokenizer": "^2.4.1" + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" } }, - "node_modules/@csstools/css-parser-algorithms": { - "version": "2.7.1", - "resolved": "https://registry.npmjs.org/@csstools/css-parser-algorithms/-/css-parser-algorithms-2.7.1.tgz", - "integrity": "sha512-2SJS42gxmACHgikc1WGesXLIT8d/q2l0UFM7TaEeIzdFCE/FPMtTiizcPGGJtlPo2xuQzY09OhrLTzRxqJqwGw==", + "node_modules/@typescript-eslint/parser": { + "version": "8.9.0", "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/csstools" - }, - { - "type": "opencollective", - "url": "https://opencollective.com/csstools" - } - ], - "license": "MIT", + "license": "BSD-2-Clause", + "dependencies": { + "@typescript-eslint/scope-manager": "8.9.0", + "@typescript-eslint/types": "8.9.0", + "@typescript-eslint/typescript-estree": "8.9.0", + "@typescript-eslint/visitor-keys": "8.9.0", + "debug": "^4.3.4" + }, "engines": { - "node": "^14 || ^16 || >=18" + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" }, "peerDependencies": { - "@csstools/css-tokenizer": "^2.4.1" + "eslint": "^8.57.0 || ^9.0.0" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } } }, - "node_modules/@csstools/css-tokenizer": { - "version": "2.4.1", - "resolved": "https://registry.npmjs.org/@csstools/css-tokenizer/-/css-tokenizer-2.4.1.tgz", - "integrity": "sha512-eQ9DIktFJBhGjioABJRtUucoWR2mwllurfnM8LuNGAqX3ViZXaUchqk+1s7jjtkFiT9ySdACsFEA3etErkALUg==", + "node_modules/@typescript-eslint/parser/node_modules/@typescript-eslint/scope-manager": { + "version": "8.9.0", "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/csstools" - }, - { - "type": "opencollective", - "url": "https://opencollective.com/csstools" - } - ], "license": "MIT", + "dependencies": { + "@typescript-eslint/types": "8.9.0", + "@typescript-eslint/visitor-keys": "8.9.0" + }, "engines": { - "node": "^14 || ^16 || >=18" + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" } }, - "node_modules/@csstools/media-query-list-parser": { - "version": "2.1.13", - "resolved": "https://registry.npmjs.org/@csstools/media-query-list-parser/-/media-query-list-parser-2.1.13.tgz", - "integrity": "sha512-XaHr+16KRU9Gf8XLi3q8kDlI18d5vzKSKCY510Vrtc9iNR0NJzbY9hhTmwhzYZj/ZwGL4VmB3TA9hJW0Um2qFA==", + "node_modules/@typescript-eslint/parser/node_modules/@typescript-eslint/types": { + "version": "8.9.0", "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/csstools" - }, - { - "type": "opencollective", - "url": "https://opencollective.com/csstools" - } - ], "license": "MIT", "engines": { - "node": "^14 || ^16 || >=18" + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" }, - "peerDependencies": { - "@csstools/css-parser-algorithms": "^2.7.1", - "@csstools/css-tokenizer": "^2.4.1" + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" } }, - "node_modules/@csstools/postcss-cascade-layers": { - "version": "4.0.6", - "resolved": "https://registry.npmjs.org/@csstools/postcss-cascade-layers/-/postcss-cascade-layers-4.0.6.tgz", - "integrity": "sha512-Xt00qGAQyqAODFiFEJNkTpSUz5VfYqnDLECdlA/Vv17nl/OIV5QfTRHGAXrBGG5YcJyHpJ+GF9gF/RZvOQz4oA==", + "node_modules/@typescript-eslint/parser/node_modules/@typescript-eslint/typescript-estree": { + "version": "8.9.0", "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/csstools" - }, - { - "type": "opencollective", - "url": "https://opencollective.com/csstools" - } - ], - "license": "MIT-0", + "license": "BSD-2-Clause", "dependencies": { - "@csstools/selector-specificity": "^3.1.1", - "postcss-selector-parser": "^6.0.13" + "@typescript-eslint/types": "8.9.0", + "@typescript-eslint/visitor-keys": "8.9.0", + "debug": "^4.3.4", + "fast-glob": "^3.3.2", + "is-glob": "^4.0.3", + "minimatch": "^9.0.4", + "semver": "^7.6.0", + "ts-api-utils": "^1.3.0" }, "engines": { - "node": "^14 || ^16 || >=18" + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" }, - "peerDependencies": { - "postcss": "^8.4" + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } } }, - "node_modules/@csstools/postcss-color-function": { - "version": "3.0.19", - "resolved": "https://registry.npmjs.org/@csstools/postcss-color-function/-/postcss-color-function-3.0.19.tgz", - "integrity": "sha512-d1OHEXyYGe21G3q88LezWWx31ImEDdmINNDy0LyLNN9ChgN2bPxoubUPiHf9KmwypBMaHmNcMuA/WZOKdZk/Lg==", + "node_modules/@typescript-eslint/parser/node_modules/@typescript-eslint/visitor-keys": { + "version": "8.9.0", "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/csstools" - }, - { - "type": "opencollective", - "url": "https://opencollective.com/csstools" - } - ], - "license": "MIT-0", + "license": "MIT", "dependencies": { - "@csstools/css-color-parser": "^2.0.4", - "@csstools/css-parser-algorithms": "^2.7.1", - "@csstools/css-tokenizer": "^2.4.1", - "@csstools/postcss-progressive-custom-properties": "^3.3.0", - "@csstools/utilities": "^1.0.0" + "@typescript-eslint/types": "8.9.0", + "eslint-visitor-keys": "^3.4.3" }, "engines": { - "node": "^14 || ^16 || >=18" + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" }, - "peerDependencies": { - "postcss": "^8.4" + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" } }, - "node_modules/@csstools/postcss-color-mix-function": { - "version": "2.0.19", - "resolved": "https://registry.npmjs.org/@csstools/postcss-color-mix-function/-/postcss-color-mix-function-2.0.19.tgz", - "integrity": "sha512-mLvQlMX+keRYr16AuvuV8WYKUwF+D0DiCqlBdvhQ0KYEtcQl9/is9Ssg7RcIys8x0jIn2h1zstS4izckdZj9wg==", - "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/csstools" - }, - { - "type": "opencollective", - "url": "https://opencollective.com/csstools" - } - ], - "license": "MIT-0", + "node_modules/@typescript-eslint/scope-manager": { + "version": "7.18.0", + "license": "MIT", "dependencies": { - "@csstools/css-color-parser": "^2.0.4", - "@csstools/css-parser-algorithms": "^2.7.1", - "@csstools/css-tokenizer": "^2.4.1", - "@csstools/postcss-progressive-custom-properties": "^3.3.0", - "@csstools/utilities": "^1.0.0" + "@typescript-eslint/types": "7.18.0", + "@typescript-eslint/visitor-keys": "7.18.0" }, "engines": { - "node": "^14 || ^16 || >=18" + "node": "^18.18.0 || >=20.0.0" }, - "peerDependencies": { - "postcss": "^8.4" + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" } }, - "node_modules/@csstools/postcss-content-alt-text": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/@csstools/postcss-content-alt-text/-/postcss-content-alt-text-1.0.0.tgz", - "integrity": "sha512-SkHdj7EMM/57GVvSxSELpUg7zb5eAndBeuvGwFzYtU06/QXJ/h9fuK7wO5suteJzGhm3GDF/EWPCdWV2h1IGHQ==", + "node_modules/@typescript-eslint/type-utils": { + "version": "8.9.0", "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/csstools" - }, - { - "type": "opencollective", - "url": "https://opencollective.com/csstools" - } - ], - "license": "MIT-0", + "license": "MIT", "dependencies": { - "@csstools/css-parser-algorithms": "^2.7.1", - "@csstools/css-tokenizer": "^2.4.1", - "@csstools/postcss-progressive-custom-properties": "^3.3.0", - "@csstools/utilities": "^1.0.0" + "@typescript-eslint/typescript-estree": "8.9.0", + "@typescript-eslint/utils": "8.9.0", + "debug": "^4.3.4", + "ts-api-utils": "^1.3.0" }, "engines": { - "node": "^14 || ^16 || >=18" + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" }, - "peerDependencies": { - "postcss": "^8.4" + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } } }, - "node_modules/@csstools/postcss-exponential-functions": { - "version": "1.0.9", - "resolved": "https://registry.npmjs.org/@csstools/postcss-exponential-functions/-/postcss-exponential-functions-1.0.9.tgz", - "integrity": "sha512-x1Avr15mMeuX7Z5RJUl7DmjhUtg+Amn5DZRD0fQ2TlTFTcJS8U1oxXQ9e5mA62S2RJgUU6db20CRoJyDvae2EQ==", + "node_modules/@typescript-eslint/type-utils/node_modules/@typescript-eslint/types": { + "version": "8.9.0", "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/csstools" - }, - { - "type": "opencollective", - "url": "https://opencollective.com/csstools" - } - ], - "license": "MIT-0", - "dependencies": { - "@csstools/css-calc": "^1.2.4", - "@csstools/css-parser-algorithms": "^2.7.1", - "@csstools/css-tokenizer": "^2.4.1" - }, + "license": "MIT", "engines": { - "node": "^14 || ^16 || >=18" + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" }, - "peerDependencies": { - "postcss": "^8.4" + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" } }, - "node_modules/@csstools/postcss-font-format-keywords": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/@csstools/postcss-font-format-keywords/-/postcss-font-format-keywords-3.0.2.tgz", - "integrity": "sha512-E0xz2sjm4AMCkXLCFvI/lyl4XO6aN1NCSMMVEOngFDJ+k2rDwfr6NDjWljk1li42jiLNChVX+YFnmfGCigZKXw==", + "node_modules/@typescript-eslint/type-utils/node_modules/@typescript-eslint/typescript-estree": { + "version": "8.9.0", "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/csstools" - }, - { - "type": "opencollective", - "url": "https://opencollective.com/csstools" - } - ], - "license": "MIT-0", + "license": "BSD-2-Clause", "dependencies": { - "@csstools/utilities": "^1.0.0", - "postcss-value-parser": "^4.2.0" + "@typescript-eslint/types": "8.9.0", + "@typescript-eslint/visitor-keys": "8.9.0", + "debug": "^4.3.4", + "fast-glob": "^3.3.2", + "is-glob": "^4.0.3", + "minimatch": "^9.0.4", + "semver": "^7.6.0", + "ts-api-utils": "^1.3.0" }, "engines": { - "node": "^14 || ^16 || >=18" + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" }, - "peerDependencies": { - "postcss": "^8.4" + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } } }, - "node_modules/@csstools/postcss-gamut-mapping": { - "version": "1.0.11", - "resolved": "https://registry.npmjs.org/@csstools/postcss-gamut-mapping/-/postcss-gamut-mapping-1.0.11.tgz", - "integrity": "sha512-KrHGsUPXRYxboXmJ9wiU/RzDM7y/5uIefLWKFSc36Pok7fxiPyvkSHO51kh+RLZS1W5hbqw9qaa6+tKpTSxa5g==", + "node_modules/@typescript-eslint/type-utils/node_modules/@typescript-eslint/visitor-keys": { + "version": "8.9.0", "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/csstools" - }, - { - "type": "opencollective", - "url": "https://opencollective.com/csstools" - } - ], - "license": "MIT-0", + "license": "MIT", "dependencies": { - "@csstools/css-color-parser": "^2.0.4", - "@csstools/css-parser-algorithms": "^2.7.1", - "@csstools/css-tokenizer": "^2.4.1" + "@typescript-eslint/types": "8.9.0", + "eslint-visitor-keys": "^3.4.3" }, "engines": { - "node": "^14 || ^16 || >=18" + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" }, - "peerDependencies": { - "postcss": "^8.4" + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" } }, - "node_modules/@csstools/postcss-gradients-interpolation-method": { - "version": "4.0.20", - "resolved": "https://registry.npmjs.org/@csstools/postcss-gradients-interpolation-method/-/postcss-gradients-interpolation-method-4.0.20.tgz", - "integrity": "sha512-ZFl2JBHano6R20KB5ZrB8KdPM2pVK0u+/3cGQ2T8VubJq982I2LSOvQ4/VtxkAXjkPkk1rXt4AD1ni7UjTZ1Og==", - "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/csstools" - }, - { - "type": "opencollective", - "url": "https://opencollective.com/csstools" - } - ], - "license": "MIT-0", + "node_modules/@typescript-eslint/types": { + "version": "7.18.0", + "license": "MIT", + "engines": { + "node": "^18.18.0 || >=20.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "node_modules/@typescript-eslint/typescript-estree": { + "version": "7.18.0", + "license": "BSD-2-Clause", "dependencies": { - "@csstools/css-color-parser": "^2.0.4", - "@csstools/css-parser-algorithms": "^2.7.1", - "@csstools/css-tokenizer": "^2.4.1", - "@csstools/postcss-progressive-custom-properties": "^3.3.0", - "@csstools/utilities": "^1.0.0" + "@typescript-eslint/types": "7.18.0", + "@typescript-eslint/visitor-keys": "7.18.0", + "debug": "^4.3.4", + "globby": "^11.1.0", + "is-glob": "^4.0.3", + "minimatch": "^9.0.4", + "semver": "^7.6.0", + "ts-api-utils": "^1.3.0" }, "engines": { - "node": "^14 || ^16 || >=18" + "node": "^18.18.0 || >=20.0.0" }, - "peerDependencies": { - "postcss": "^8.4" + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } } }, - "node_modules/@csstools/postcss-hwb-function": { - "version": "3.0.18", - "resolved": "https://registry.npmjs.org/@csstools/postcss-hwb-function/-/postcss-hwb-function-3.0.18.tgz", - "integrity": "sha512-3ifnLltR5C7zrJ+g18caxkvSRnu9jBBXCYgnBznRjxm6gQJGnnCO9H6toHfywNdNr/qkiVf2dymERPQLDnjLRQ==", + "node_modules/@typescript-eslint/utils": { + "version": "8.9.0", "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/csstools" - }, - { - "type": "opencollective", - "url": "https://opencollective.com/csstools" - } - ], - "license": "MIT-0", + "license": "MIT", "dependencies": { - "@csstools/css-color-parser": "^2.0.4", - "@csstools/css-parser-algorithms": "^2.7.1", - "@csstools/css-tokenizer": "^2.4.1", - "@csstools/postcss-progressive-custom-properties": "^3.3.0", - "@csstools/utilities": "^1.0.0" + "@eslint-community/eslint-utils": "^4.4.0", + "@typescript-eslint/scope-manager": "8.9.0", + "@typescript-eslint/types": "8.9.0", + "@typescript-eslint/typescript-estree": "8.9.0" }, "engines": { - "node": "^14 || ^16 || >=18" + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" }, "peerDependencies": { - "postcss": "^8.4" + "eslint": "^8.57.0 || ^9.0.0" } }, - "node_modules/@csstools/postcss-ic-unit": { - "version": "3.0.7", - "resolved": "https://registry.npmjs.org/@csstools/postcss-ic-unit/-/postcss-ic-unit-3.0.7.tgz", - "integrity": "sha512-YoaNHH2wNZD+c+rHV02l4xQuDpfR8MaL7hD45iJyr+USwvr0LOheeytJ6rq8FN6hXBmEeoJBeXXgGmM8fkhH4g==", + "node_modules/@typescript-eslint/utils/node_modules/@typescript-eslint/scope-manager": { + "version": "8.9.0", "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/csstools" - }, - { - "type": "opencollective", - "url": "https://opencollective.com/csstools" - } - ], - "license": "MIT-0", + "license": "MIT", "dependencies": { - "@csstools/postcss-progressive-custom-properties": "^3.3.0", - "@csstools/utilities": "^1.0.0", - "postcss-value-parser": "^4.2.0" + "@typescript-eslint/types": "8.9.0", + "@typescript-eslint/visitor-keys": "8.9.0" }, "engines": { - "node": "^14 || ^16 || >=18" + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" }, - "peerDependencies": { - "postcss": "^8.4" + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" } }, - "node_modules/@csstools/postcss-initial": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/@csstools/postcss-initial/-/postcss-initial-1.0.1.tgz", - "integrity": "sha512-wtb+IbUIrIf8CrN6MLQuFR7nlU5C7PwuebfeEXfjthUha1+XZj2RVi+5k/lukToA24sZkYAiSJfHM8uG/UZIdg==", + "node_modules/@typescript-eslint/utils/node_modules/@typescript-eslint/types": { + "version": "8.9.0", "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/csstools" - }, - { - "type": "opencollective", - "url": "https://opencollective.com/csstools" - } - ], - "license": "MIT-0", + "license": "MIT", "engines": { - "node": "^14 || ^16 || >=18" + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" }, - "peerDependencies": { - "postcss": "^8.4" + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" } }, - "node_modules/@csstools/postcss-is-pseudo-class": { - "version": "4.0.8", - "resolved": "https://registry.npmjs.org/@csstools/postcss-is-pseudo-class/-/postcss-is-pseudo-class-4.0.8.tgz", - "integrity": "sha512-0aj591yGlq5Qac+plaWCbn5cpjs5Sh0daovYUKJUOMjIp70prGH/XPLp7QjxtbFXz3CTvb0H9a35dpEuIuUi3Q==", + "node_modules/@typescript-eslint/utils/node_modules/@typescript-eslint/typescript-estree": { + "version": "8.9.0", "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/csstools" - }, - { - "type": "opencollective", - "url": "https://opencollective.com/csstools" - } - ], - "license": "MIT-0", + "license": "BSD-2-Clause", "dependencies": { - "@csstools/selector-specificity": "^3.1.1", - "postcss-selector-parser": "^6.0.13" + "@typescript-eslint/types": "8.9.0", + "@typescript-eslint/visitor-keys": "8.9.0", + "debug": "^4.3.4", + "fast-glob": "^3.3.2", + "is-glob": "^4.0.3", + "minimatch": "^9.0.4", + "semver": "^7.6.0", + "ts-api-utils": "^1.3.0" }, "engines": { - "node": "^14 || ^16 || >=18" + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" }, - "peerDependencies": { - "postcss": "^8.4" + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } } }, - "node_modules/@csstools/postcss-light-dark-function": { - "version": "1.0.8", - "resolved": "https://registry.npmjs.org/@csstools/postcss-light-dark-function/-/postcss-light-dark-function-1.0.8.tgz", - "integrity": "sha512-x0UtpCyVnERsplUeoaY6nEtp1HxTf4lJjoK/ULEm40DraqFfUdUSt76yoOyX5rGY6eeOUOkurHyYlFHVKv/pew==", + "node_modules/@typescript-eslint/utils/node_modules/@typescript-eslint/visitor-keys": { + "version": "8.9.0", "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/csstools" - }, - { - "type": "opencollective", - "url": "https://opencollective.com/csstools" - } - ], - "license": "MIT-0", + "license": "MIT", "dependencies": { - "@csstools/css-parser-algorithms": "^2.7.1", - "@csstools/css-tokenizer": "^2.4.1", - "@csstools/postcss-progressive-custom-properties": "^3.3.0", - "@csstools/utilities": "^1.0.0" + "@typescript-eslint/types": "8.9.0", + "eslint-visitor-keys": "^3.4.3" }, "engines": { - "node": "^14 || ^16 || >=18" + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" }, - "peerDependencies": { - "postcss": "^8.4" + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" } }, - "node_modules/@csstools/postcss-logical-float-and-clear": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/@csstools/postcss-logical-float-and-clear/-/postcss-logical-float-and-clear-2.0.1.tgz", - "integrity": "sha512-SsrWUNaXKr+e/Uo4R/uIsqJYt3DaggIh/jyZdhy/q8fECoJSKsSMr7nObSLdvoULB69Zb6Bs+sefEIoMG/YfOA==", - "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/csstools" - }, - { - "type": "opencollective", - "url": "https://opencollective.com/csstools" - } - ], - "license": "MIT-0", + "node_modules/@typescript-eslint/visitor-keys": { + "version": "7.18.0", + "license": "MIT", + "dependencies": { + "@typescript-eslint/types": "7.18.0", + "eslint-visitor-keys": "^3.4.3" + }, "engines": { - "node": "^14 || ^16 || >=18" + "node": "^18.18.0 || >=20.0.0" }, - "peerDependencies": { - "postcss": "^8.4" + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" } }, - "node_modules/@csstools/postcss-logical-overflow": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/@csstools/postcss-logical-overflow/-/postcss-logical-overflow-1.0.1.tgz", - "integrity": "sha512-Kl4lAbMg0iyztEzDhZuQw8Sj9r2uqFDcU1IPl+AAt2nue8K/f1i7ElvKtXkjhIAmKiy5h2EY8Gt/Cqg0pYFDCw==", - "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/csstools" - }, - { - "type": "opencollective", - "url": "https://opencollective.com/csstools" - } - ], - "license": "MIT-0", - "engines": { - "node": "^14 || ^16 || >=18" + "node_modules/@unhead/dom": { + "version": "1.11.10", + "license": "MIT", + "dependencies": { + "@unhead/schema": "1.11.10", + "@unhead/shared": "1.11.10" }, - "peerDependencies": { - "postcss": "^8.4" + "funding": { + "url": "https://github.com/sponsors/harlan-zw" } }, - "node_modules/@csstools/postcss-logical-overscroll-behavior": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/@csstools/postcss-logical-overscroll-behavior/-/postcss-logical-overscroll-behavior-1.0.1.tgz", - "integrity": "sha512-+kHamNxAnX8ojPCtV8WPcUP3XcqMFBSDuBuvT6MHgq7oX4IQxLIXKx64t7g9LiuJzE7vd06Q9qUYR6bh4YnGpQ==", - "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/csstools" - }, - { - "type": "opencollective", - "url": "https://opencollective.com/csstools" - } - ], - "license": "MIT-0", - "engines": { - "node": "^14 || ^16 || >=18" + "node_modules/@unhead/schema": { + "version": "1.11.10", + "license": "MIT", + "dependencies": { + "hookable": "^5.5.3", + "zhead": "^2.2.4" }, - "peerDependencies": { - "postcss": "^8.4" + "funding": { + "url": "https://github.com/sponsors/harlan-zw" } }, - "node_modules/@csstools/postcss-logical-resize": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/@csstools/postcss-logical-resize/-/postcss-logical-resize-2.0.1.tgz", - "integrity": "sha512-W5Gtwz7oIuFcKa5SmBjQ2uxr8ZoL7M2bkoIf0T1WeNqljMkBrfw1DDA8/J83k57NQ1kcweJEjkJ04pUkmyee3A==", - "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/csstools" - }, - { - "type": "opencollective", - "url": "https://opencollective.com/csstools" - } - ], - "license": "MIT-0", + "node_modules/@unhead/shared": { + "version": "1.11.10", + "license": "MIT", "dependencies": { - "postcss-value-parser": "^4.2.0" + "@unhead/schema": "1.11.10" }, - "engines": { - "node": "^14 || ^16 || >=18" - }, - "peerDependencies": { - "postcss": "^8.4" + "funding": { + "url": "https://github.com/sponsors/harlan-zw" } }, - "node_modules/@csstools/postcss-logical-viewport-units": { - "version": "2.0.11", - "resolved": "https://registry.npmjs.org/@csstools/postcss-logical-viewport-units/-/postcss-logical-viewport-units-2.0.11.tgz", - "integrity": "sha512-ElITMOGcjQtvouxjd90WmJRIw1J7KMP+M+O87HaVtlgOOlDt1uEPeTeii8qKGe2AiedEp0XOGIo9lidbiU2Ogg==", - "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/csstools" - }, - { - "type": "opencollective", - "url": "https://opencollective.com/csstools" - } - ], - "license": "MIT-0", + "node_modules/@unhead/vue": { + "version": "1.11.10", + "license": "MIT", "dependencies": { - "@csstools/css-tokenizer": "^2.4.1", - "@csstools/utilities": "^1.0.0" + "@unhead/schema": "1.11.10", + "@unhead/shared": "1.11.10", + "defu": "^6.1.4", + "hookable": "^5.5.3", + "unhead": "1.11.10" }, - "engines": { - "node": "^14 || ^16 || >=18" + "funding": { + "url": "https://github.com/sponsors/harlan-zw" }, "peerDependencies": { - "postcss": "^8.4" + "vue": ">=2.7 || >=3" } }, - "node_modules/@csstools/postcss-media-minmax": { - "version": "1.1.8", - "resolved": "https://registry.npmjs.org/@csstools/postcss-media-minmax/-/postcss-media-minmax-1.1.8.tgz", - "integrity": "sha512-KYQCal2i7XPNtHAUxCECdrC7tuxIWQCW+s8eMYs5r5PaAiVTeKwlrkRS096PFgojdNCmHeG0Cb7njtuNswNf+w==", - "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/csstools" - }, - { - "type": "opencollective", - "url": "https://opencollective.com/csstools" - } - ], + "node_modules/@vitejs/plugin-vue": { + "version": "5.1.4", "license": "MIT", - "dependencies": { - "@csstools/css-calc": "^1.2.4", - "@csstools/css-parser-algorithms": "^2.7.1", - "@csstools/css-tokenizer": "^2.4.1", - "@csstools/media-query-list-parser": "^2.1.13" - }, "engines": { - "node": "^14 || ^16 || >=18" + "node": "^18.0.0 || >=20.0.0" }, "peerDependencies": { - "postcss": "^8.4" + "vite": "^5.0.0", + "vue": "^3.2.25" } }, - "node_modules/@csstools/postcss-media-queries-aspect-ratio-number-values": { - "version": "2.0.11", - "resolved": "https://registry.npmjs.org/@csstools/postcss-media-queries-aspect-ratio-number-values/-/postcss-media-queries-aspect-ratio-number-values-2.0.11.tgz", - "integrity": "sha512-YD6jrib20GRGQcnOu49VJjoAnQ/4249liuz7vTpy/JfgqQ1Dlc5eD4HPUMNLOw9CWey9E6Etxwf/xc/ZF8fECA==", - "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/csstools" - }, - { - "type": "opencollective", - "url": "https://opencollective.com/csstools" - } - ], - "license": "MIT-0", + "node_modules/@volar/language-core": { + "version": "2.4.10", + "license": "MIT", "dependencies": { - "@csstools/css-parser-algorithms": "^2.7.1", - "@csstools/css-tokenizer": "^2.4.1", - "@csstools/media-query-list-parser": "^2.1.13" - }, - "engines": { - "node": "^14 || ^16 || >=18" - }, - "peerDependencies": { - "postcss": "^8.4" + "@volar/source-map": "2.4.10" } }, - "node_modules/@csstools/postcss-nested-calc": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/@csstools/postcss-nested-calc/-/postcss-nested-calc-3.0.2.tgz", - "integrity": "sha512-ySUmPyawiHSmBW/VI44+IObcKH0v88LqFe0d09Sb3w4B1qjkaROc6d5IA3ll9kjD46IIX/dbO5bwFN/swyoyZA==", - "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/csstools" - }, - { - "type": "opencollective", - "url": "https://opencollective.com/csstools" - } - ], - "license": "MIT-0", + "node_modules/@volar/source-map": { + "version": "2.4.10", + "license": "MIT" + }, + "node_modules/@volar/typescript": { + "version": "2.4.10", + "license": "MIT", "dependencies": { - "@csstools/utilities": "^1.0.0", - "postcss-value-parser": "^4.2.0" - }, - "engines": { - "node": "^14 || ^16 || >=18" - }, - "peerDependencies": { - "postcss": "^8.4" + "@volar/language-core": "2.4.10", + "path-browserify": "^1.0.1", + "vscode-uri": "^3.0.8" } }, - "node_modules/@csstools/postcss-normalize-display-values": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/@csstools/postcss-normalize-display-values/-/postcss-normalize-display-values-3.0.2.tgz", - "integrity": "sha512-fCapyyT/dUdyPtrelQSIV+d5HqtTgnNP/BEG9IuhgXHt93Wc4CfC1bQ55GzKAjWrZbgakMQ7MLfCXEf3rlZJOw==", - "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/csstools" - }, - { - "type": "opencollective", - "url": "https://opencollective.com/csstools" - } - ], - "license": "MIT-0", + "node_modules/@vue-macros/common": { + "version": "1.14.0", + "license": "MIT", "dependencies": { - "postcss-value-parser": "^4.2.0" + "@babel/types": "^7.25.6", + "@rollup/pluginutils": "^5.1.0", + "@vue/compiler-sfc": "^3.5.4", + "ast-kit": "^1.1.0", + "local-pkg": "^0.5.0", + "magic-string-ast": "^0.6.2" }, "engines": { - "node": "^14 || ^16 || >=18" + "node": ">=16.14.0" }, "peerDependencies": { - "postcss": "^8.4" + "vue": "^2.7.0 || ^3.2.25" + }, + "peerDependenciesMeta": { + "vue": { + "optional": true + } } }, - "node_modules/@csstools/postcss-oklab-function": { - "version": "3.0.19", - "resolved": "https://registry.npmjs.org/@csstools/postcss-oklab-function/-/postcss-oklab-function-3.0.19.tgz", - "integrity": "sha512-e3JxXmxjU3jpU7TzZrsNqSX4OHByRC3XjItV3Ieo/JEQmLg5rdOL4lkv/1vp27gXemzfNt44F42k/pn0FpE21Q==", - "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/csstools" - }, - { - "type": "opencollective", - "url": "https://opencollective.com/csstools" - } - ], - "license": "MIT-0", + "node_modules/@vue/compiler-core": { + "version": "3.5.12", + "license": "MIT", "dependencies": { - "@csstools/css-color-parser": "^2.0.4", - "@csstools/css-parser-algorithms": "^2.7.1", - "@csstools/css-tokenizer": "^2.4.1", - "@csstools/postcss-progressive-custom-properties": "^3.3.0", - "@csstools/utilities": "^1.0.0" - }, - "engines": { - "node": "^14 || ^16 || >=18" - }, - "peerDependencies": { - "postcss": "^8.4" + "@babel/parser": "^7.25.3", + "@vue/shared": "3.5.12", + "entities": "^4.5.0", + "estree-walker": "^2.0.2", + "source-map-js": "^1.2.0" } }, - "node_modules/@csstools/postcss-progressive-custom-properties": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/@csstools/postcss-progressive-custom-properties/-/postcss-progressive-custom-properties-3.3.0.tgz", - "integrity": "sha512-W2oV01phnILaRGYPmGFlL2MT/OgYjQDrL9sFlbdikMFi6oQkFki9B86XqEWR7HCsTZFVq7dbzr/o71B75TKkGg==", - "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/csstools" - }, - { - "type": "opencollective", - "url": "https://opencollective.com/csstools" - } - ], - "license": "MIT-0", + "node_modules/@vue/compiler-dom": { + "version": "3.5.12", + "license": "MIT", "dependencies": { - "postcss-value-parser": "^4.2.0" - }, - "engines": { - "node": "^14 || ^16 || >=18" - }, - "peerDependencies": { - "postcss": "^8.4" + "@vue/compiler-core": "3.5.12", + "@vue/shared": "3.5.12" } }, - "node_modules/@csstools/postcss-relative-color-syntax": { - "version": "2.0.19", - "resolved": "https://registry.npmjs.org/@csstools/postcss-relative-color-syntax/-/postcss-relative-color-syntax-2.0.19.tgz", - "integrity": "sha512-MxUMSNvio1WwuS6WRLlQuv6nNPXwIWUFzBBAvL/tBdWfiKjiJnAa6eSSN5gtaacSqUkQ/Ce5Z1OzLRfeaWhADA==", - "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/csstools" - }, - { - "type": "opencollective", - "url": "https://opencollective.com/csstools" - } - ], - "license": "MIT-0", + "node_modules/@vue/compiler-sfc": { + "version": "3.5.12", + "license": "MIT", "dependencies": { - "@csstools/css-color-parser": "^2.0.4", - "@csstools/css-parser-algorithms": "^2.7.1", - "@csstools/css-tokenizer": "^2.4.1", - "@csstools/postcss-progressive-custom-properties": "^3.3.0", - "@csstools/utilities": "^1.0.0" - }, - "engines": { - "node": "^14 || ^16 || >=18" + "@babel/parser": "^7.25.3", + "@vue/compiler-core": "3.5.12", + "@vue/compiler-dom": "3.5.12", + "@vue/compiler-ssr": "3.5.12", + "@vue/shared": "3.5.12", + "estree-walker": "^2.0.2", + "magic-string": "^0.30.11", + "postcss": "^8.4.47", + "source-map-js": "^1.2.0" + } + }, + "node_modules/@vue/compiler-ssr": { + "version": "3.5.12", + "license": "MIT", + "dependencies": { + "@vue/compiler-dom": "3.5.12", + "@vue/shared": "3.5.12" + } + }, + "node_modules/@vue/compiler-vue2": { + "version": "2.7.16", + "license": "MIT", + "dependencies": { + "de-indent": "^1.0.2", + "he": "^1.2.0" + } + }, + "node_modules/@vue/devtools-api": { + "version": "6.6.4", + "license": "MIT" + }, + "node_modules/@vue/language-core": { + "version": "2.1.10", + "license": "MIT", + "dependencies": { + "@volar/language-core": "~2.4.8", + "@vue/compiler-dom": "^3.5.0", + "@vue/compiler-vue2": "^2.7.16", + "@vue/shared": "^3.5.0", + "alien-signals": "^0.2.0", + "minimatch": "^9.0.3", + "muggle-string": "^0.4.1", + "path-browserify": "^1.0.1" }, "peerDependencies": { - "postcss": "^8.4" + "typescript": "*" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } } }, - "node_modules/@csstools/postcss-scope-pseudo-class": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/@csstools/postcss-scope-pseudo-class/-/postcss-scope-pseudo-class-3.0.1.tgz", - "integrity": "sha512-3ZFonK2gfgqg29gUJ2w7xVw2wFJ1eNWVDONjbzGkm73gJHVCYK5fnCqlLr+N+KbEfv2XbWAO0AaOJCFB6Fer6A==", - "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/csstools" - }, - { - "type": "opencollective", - "url": "https://opencollective.com/csstools" - } - ], - "license": "MIT-0", + "node_modules/@vue/reactivity": { + "version": "3.5.12", + "license": "MIT", "dependencies": { - "postcss-selector-parser": "^6.0.13" - }, - "engines": { - "node": "^14 || ^16 || >=18" + "@vue/shared": "3.5.12" + } + }, + "node_modules/@vue/runtime-core": { + "version": "3.5.12", + "license": "MIT", + "dependencies": { + "@vue/reactivity": "3.5.12", + "@vue/shared": "3.5.12" + } + }, + "node_modules/@vue/runtime-dom": { + "version": "3.5.12", + "license": "MIT", + "dependencies": { + "@vue/reactivity": "3.5.12", + "@vue/runtime-core": "3.5.12", + "@vue/shared": "3.5.12", + "csstype": "^3.1.3" + } + }, + "node_modules/@vue/server-renderer": { + "version": "3.5.12", + "license": "MIT", + "dependencies": { + "@vue/compiler-ssr": "3.5.12", + "@vue/shared": "3.5.12" }, "peerDependencies": { - "postcss": "^8.4" + "vue": "3.5.12" } }, - "node_modules/@csstools/postcss-stepped-value-functions": { - "version": "3.0.10", - "resolved": "https://registry.npmjs.org/@csstools/postcss-stepped-value-functions/-/postcss-stepped-value-functions-3.0.10.tgz", - "integrity": "sha512-MZwo0D0TYrQhT5FQzMqfy/nGZ28D1iFtpN7Su1ck5BPHS95+/Y5O9S4kEvo76f2YOsqwYcT8ZGehSI1TnzuX2g==", - "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/csstools" - }, - { - "type": "opencollective", - "url": "https://opencollective.com/csstools" - } - ], - "license": "MIT-0", + "node_modules/@vue/shared": { + "version": "3.5.12", + "license": "MIT" + }, + "node_modules/@vuetify/loader-shared": { + "version": "2.0.3", + "license": "MIT", "dependencies": { - "@csstools/css-calc": "^1.2.4", - "@csstools/css-parser-algorithms": "^2.7.1", - "@csstools/css-tokenizer": "^2.4.1" - }, - "engines": { - "node": "^14 || ^16 || >=18" + "upath": "^2.0.1" }, "peerDependencies": { - "postcss": "^8.4" + "vue": "^3.0.0", + "vuetify": "^3.0.0" } }, - "node_modules/@csstools/postcss-text-decoration-shorthand": { - "version": "3.0.7", - "resolved": "https://registry.npmjs.org/@csstools/postcss-text-decoration-shorthand/-/postcss-text-decoration-shorthand-3.0.7.tgz", - "integrity": "sha512-+cptcsM5r45jntU6VjotnkC9GteFR7BQBfZ5oW7inLCxj7AfLGAzMbZ60hKTP13AULVZBdxky0P8um0IBfLHVA==", - "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/csstools" - }, - { - "type": "opencollective", - "url": "https://opencollective.com/csstools" - } - ], - "license": "MIT-0", + "node_modules/@vueuse/core": { + "version": "11.2.0", + "license": "MIT", "dependencies": { - "@csstools/color-helpers": "^4.2.1", - "postcss-value-parser": "^4.2.0" + "@types/web-bluetooth": "^0.0.20", + "@vueuse/metadata": "11.2.0", + "@vueuse/shared": "11.2.0", + "vue-demi": ">=0.14.10" + }, + "funding": { + "url": "https://github.com/sponsors/antfu" + } + }, + "node_modules/@vueuse/core/node_modules/vue-demi": { + "version": "0.14.10", + "hasInstallScript": true, + "license": "MIT", + "bin": { + "vue-demi-fix": "bin/vue-demi-fix.js", + "vue-demi-switch": "bin/vue-demi-switch.js" }, "engines": { - "node": "^14 || ^16 || >=18" + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/antfu" }, "peerDependencies": { - "postcss": "^8.4" + "@vue/composition-api": "^1.0.0-rc.1", + "vue": "^3.0.0-0 || ^2.6.0" + }, + "peerDependenciesMeta": { + "@vue/composition-api": { + "optional": true + } } }, - "node_modules/@csstools/postcss-trigonometric-functions": { - "version": "3.0.10", - "resolved": "https://registry.npmjs.org/@csstools/postcss-trigonometric-functions/-/postcss-trigonometric-functions-3.0.10.tgz", - "integrity": "sha512-G9G8moTc2wiad61nY5HfvxLiM/myX0aYK4s1x8MQlPH29WDPxHQM7ghGgvv2qf2xH+rrXhztOmjGHJj4jsEqXw==", - "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/csstools" - }, - { - "type": "opencollective", - "url": "https://opencollective.com/csstools" - } - ], - "license": "MIT-0", + "node_modules/@vueuse/metadata": { + "version": "11.2.0", + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/antfu" + } + }, + "node_modules/@vueuse/shared": { + "version": "11.2.0", + "license": "MIT", "dependencies": { - "@csstools/css-calc": "^1.2.4", - "@csstools/css-parser-algorithms": "^2.7.1", - "@csstools/css-tokenizer": "^2.4.1" + "vue-demi": ">=0.14.10" }, - "engines": { - "node": "^14 || ^16 || >=18" - }, - "peerDependencies": { - "postcss": "^8.4" + "funding": { + "url": "https://github.com/sponsors/antfu" } }, - "node_modules/@csstools/postcss-unset-value": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/@csstools/postcss-unset-value/-/postcss-unset-value-3.0.1.tgz", - "integrity": "sha512-dbDnZ2ja2U8mbPP0Hvmt2RMEGBiF1H7oY6HYSpjteXJGihYwgxgTr6KRbbJ/V6c+4wd51M+9980qG4gKVn5ttg==", - "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/csstools" - }, - { - "type": "opencollective", - "url": "https://opencollective.com/csstools" - } - ], - "license": "MIT-0", - "engines": { - "node": "^14 || ^16 || >=18" - }, - "peerDependencies": { - "postcss": "^8.4" - } - }, - "node_modules/@csstools/selector-resolve-nested": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/@csstools/selector-resolve-nested/-/selector-resolve-nested-1.1.0.tgz", - "integrity": "sha512-uWvSaeRcHyeNenKg8tp17EVDRkpflmdyvbE0DHo6D/GdBb6PDnCYYU6gRpXhtICMGMcahQmj2zGxwFM/WC8hCg==", - "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/csstools" - }, - { - "type": "opencollective", - "url": "https://opencollective.com/csstools" - } - ], - "license": "MIT-0", - "engines": { - "node": "^14 || ^16 || >=18" - }, - "peerDependencies": { - "postcss-selector-parser": "^6.0.13" - } - }, - "node_modules/@csstools/selector-specificity": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/@csstools/selector-specificity/-/selector-specificity-3.1.1.tgz", - "integrity": "sha512-a7cxGcJ2wIlMFLlh8z2ONm+715QkPHiyJcxwQlKOz/03GPw1COpfhcmC9wm4xlZfp//jWHNNMwzjtqHXVWU9KA==", - "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/csstools" - }, - { - "type": "opencollective", - "url": "https://opencollective.com/csstools" - } - ], - "license": "MIT-0", - "engines": { - "node": "^14 || ^16 || >=18" - }, - "peerDependencies": { - "postcss-selector-parser": "^6.0.13" - } - }, - "node_modules/@csstools/utilities": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/@csstools/utilities/-/utilities-1.0.0.tgz", - "integrity": "sha512-tAgvZQe/t2mlvpNosA4+CkMiZ2azISW5WPAcdSalZlEjQvUfghHxfQcrCiK/7/CrfAWVxyM88kGFYO82heIGDg==", - "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/csstools" - }, - { - "type": "opencollective", - "url": "https://opencollective.com/csstools" - } - ], - "license": "MIT-0", - "engines": { - "node": "^14 || ^16 || >=18" - }, - "peerDependencies": { - "postcss": "^8.4" - } - }, - "node_modules/@data-fair/lib": { - "version": "0.49.1", - "resolved": "https://registry.npmjs.org/@data-fair/lib/-/lib-0.49.1.tgz", - "integrity": "sha512-0KWUCrH/OIpqA/PGHjkuFWUclfZqYlbU6r1RyDAFA4vuQUq82hLcdKKcXkxKkvoyn8xJweYdum5AncHagqZYHw==", + "node_modules/@vueuse/shared/node_modules/vue-demi": { + "version": "0.14.10", + "hasInstallScript": true, "license": "MIT", - "dependencies": { - "change-case": "^5.4.4", - "commander": "^12.1.0" - }, "bin": { - "df-build-types": "src/types/build.js" - }, - "engines": { - "node": ">=20.0.0" - }, - "peerDependencies": { - "@bcherny/json-schema-ref-parser": "^10.0.5-fork", - "agentkeepalive": "4", - "ajv": "8", - "ajv-errors": "3", - "ajv-formats": "3", - "ajv-i18n": "4", - "axios": "1", - "cacheable-lookup": "6", - "chalk": "5", - "chroma-js": "^2.4.2", - "cookie": "0.6", - "dayjs": "1", - "debug": "4", - "draftlog": "1", - "express": ">= 4", - "fast-json-stringify": "5.12.0", - "flatstr": "1", - "json-schema-to-typescript": "11", - "jsonwebtoken": "9", - "jwks-rsa": "3", - "jwt-decode": "4", - "mongodb": "6", - "nanoid": "5", - "ofetch": "1", - "prom-client": "15", - "reconnecting-websocket": "4", - "semver": "7", - "universal-cookie": "7", - "vue": "3", - "vue-i18n": "10", - "vuetify": "3", - "ws": "8" - }, - "peerDependenciesMeta": { - "@bcherny/json-schema-ref-parser": { - "optional": true - }, - "agentkeepalive": { - "optional": true - }, - "ajv": { - "optional": true - }, - "ajv-errors": { - "optional": true - }, - "ajv-formats": { - "optional": true - }, - "ajv-i18n": { - "optional": true - }, - "axios": { - "optional": true - }, - "cacheable-lookup": { - "optional": true - }, - "chalk": { - "optional": true - }, - "chroma-js": { - "optional": true - }, - "cookue": { - "optional": true - }, - "dayjs": { - "optional": true - }, - "draftlog": { - "optional": true - }, - "express": { - "optional": true - }, - "fast-json-stringify": { - "optional": true - }, - "flatstr": { - "optional": true - }, - "json-schema-to-typescript": { - "optional": true - }, - "jsonwebtoken": { - "optional": true - }, - "jwks-rsa": { - "optional": true - }, - "jwt-decode": { - "optional": true - }, - "mongodb": { - "optional": true - }, - "nanoid": { - "optional": true - }, - "ofetch": { - "optional": true - }, - "prom-client": { - "optional": true - }, - "reconnecting-websocket": { - "optional": true - }, - "semver": { - "optional": true - }, - "universal-cookie": { - "optional": true - }, - "vue": { - "optional": true - }, - "vue-i18n": { - "optional": true - }, - "vuetify": { - "optional": true - }, - "ws": { - "optional": true - } - } - }, - "node_modules/@data-fair/sd-express": { - "version": "1.4.3", - "resolved": "https://registry.npmjs.org/@data-fair/sd-express/-/sd-express-1.4.3.tgz", - "integrity": "sha512-2QNoJgNpn+U4INv4s7z/HSTlqOHhgF52s5zi/AuiaTpcHMl9j05E8HvFXTZcE36d7NBkdTk3TVkD1iCbPQZmzw==", - "license": "MIT", - "dependencies": { - "axios": "^1.3.4", - "cookies": "^0.8.0", - "debug": "^3.2.6", - "jsonwebtoken": "^9.0.0", - "jwks-rsa": "^2.1.2" - } - }, - "node_modules/@data-fair/sd-express/node_modules/@types/jsonwebtoken": { - "version": "8.5.9", - "resolved": "https://registry.npmjs.org/@types/jsonwebtoken/-/jsonwebtoken-8.5.9.tgz", - "integrity": "sha512-272FMnFGzAVMGtu9tkr29hRL6bZj4Zs1KZNeHLnKqAvp06tAIcarTMwOh8/8bz4FmKRcMxZhZNeUAQsNLoiPhg==", - "license": "MIT", - "dependencies": { - "@types/node": "*" - } - }, - "node_modules/@data-fair/sd-express/node_modules/cookies": { - "version": "0.8.0", - "resolved": "https://registry.npmjs.org/cookies/-/cookies-0.8.0.tgz", - "integrity": "sha512-8aPsApQfebXnuI+537McwYsDtjVxGm8gTIzQI3FDW6t5t/DAhERxtnbEPN/8RX+uZthoz4eCOgloXaE5cYyNow==", - "license": "MIT", - "dependencies": { - "depd": "~2.0.0", - "keygrip": "~1.1.0" - }, - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/@data-fair/sd-express/node_modules/debug": { - "version": "3.2.7", - "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", - "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", - "license": "MIT", - "dependencies": { - "ms": "^2.1.1" - } - }, - "node_modules/@data-fair/sd-express/node_modules/jose": { - "version": "2.0.7", - "resolved": "https://registry.npmjs.org/jose/-/jose-2.0.7.tgz", - "integrity": "sha512-5hFWIigKqC+e/lRyQhfnirrAqUdIPMB7SJRqflJaO29dW7q5DFvH1XCSTmv6PQ6pb++0k6MJlLRoS0Wv4s38Wg==", - "license": "MIT", - "dependencies": { - "@panva/asn1.js": "^1.0.0" + "vue-demi-fix": "bin/vue-demi-fix.js", + "vue-demi-switch": "bin/vue-demi-switch.js" }, "engines": { - "node": ">=10.13.0 < 13 || >=13.7.0" + "node": ">=12" }, "funding": { - "url": "https://github.com/sponsors/panva" - } - }, - "node_modules/@data-fair/sd-express/node_modules/jwks-rsa": { - "version": "2.1.5", - "resolved": "https://registry.npmjs.org/jwks-rsa/-/jwks-rsa-2.1.5.tgz", - "integrity": "sha512-IODtn1SwEm7n6GQZnQLY0oxKDrMh7n/jRH1MzE8mlxWMrh2NnMyOsXTebu8vJ1qCpmuTJcL4DdiE0E4h8jnwsA==", - "license": "MIT", - "dependencies": { - "@types/express": "^4.17.14", - "@types/jsonwebtoken": "^8.5.9", - "debug": "^4.3.4", - "jose": "^2.0.6", - "limiter": "^1.1.5", - "lru-memoizer": "^2.1.4" - }, - "engines": { - "node": ">=10 < 13 || >=14" - } - }, - "node_modules/@data-fair/sd-express/node_modules/jwks-rsa/node_modules/debug": { - "version": "4.3.7", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.7.tgz", - "integrity": "sha512-Er2nc/H7RrMXZBFCEim6TCmMk02Z8vLC2Rbi1KEBggpo0fS6l0S1nnapwmIi3yW/+GOJap1Krg4w0Hg80oCqgQ==", - "license": "MIT", - "dependencies": { - "ms": "^2.1.3" + "url": "https://github.com/sponsors/antfu" }, - "engines": { - "node": ">=6.0" + "peerDependencies": { + "@vue/composition-api": "^1.0.0-rc.1", + "vue": "^3.0.0-0 || ^2.6.0" }, "peerDependenciesMeta": { - "supports-color": { + "@vue/composition-api": { "optional": true } } }, - "node_modules/@data-fair/sd-express/node_modules/keygrip": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/keygrip/-/keygrip-1.1.0.tgz", - "integrity": "sha512-iYSchDJ+liQ8iwbSI2QqsQOvqv58eJCEanyJPJi+Khyu8smkcKSFUCbPwzFcL7YVtZ6eONjqRX/38caJ7QjRAQ==", + "node_modules/@xmldom/xmldom": { + "version": "0.8.10", "license": "MIT", - "dependencies": { - "tsscmp": "1.0.6" - }, "engines": { - "node": ">= 0.6" + "node": ">=10.0.0" } }, - "node_modules/@data-fair/sd-vue": { - "version": "2.7.0", - "resolved": "https://registry.npmjs.org/@data-fair/sd-vue/-/sd-vue-2.7.0.tgz", - "integrity": "sha512-J0pMNHLWNUOuFG2iSLGk2nu5NvKiKPlo4iLLS4pTEHppfNf3xEsO+2HVgxWEVPMXeHi+5q0YRUa4OZwGYGmtJg==", - "dev": true, - "license": "MIT", - "dependencies": { - "jwt-decode": "^3.1.2" + "node_modules/abbrev": { + "version": "2.0.0", + "license": "ISC", + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" } }, - "node_modules/@data-fair/sd-vue/node_modules/jwt-decode": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/jwt-decode/-/jwt-decode-3.1.2.tgz", - "integrity": "sha512-UfpWE/VZn0iP50d8cz9NrZLM9lSWhcJ+0Gt/nm4by88UL+J1SiKN8/5dkjMmbEzwL2CAe+67GsegCbIKtbp75A==", - "dev": true, + "node_modules/abstract-logging": { + "version": "2.0.1", "license": "MIT" }, - "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", - "engines": { - "node": ">=10.0.0" - } + "node_modules/accept-language-parser": { + "version": "1.5.0", + "license": "MIT" }, - "node_modules/@eslint/eslintrc": { - "version": "0.4.3", - "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-0.4.3.tgz", - "integrity": "sha512-J6KFFz5QCYUJq3pf0mjEcCJVERbzv71PUIDczuh9JkwGEzced6CO5ADLHB1rbf/+oPBtoPfMYNOpGDzCANlbXw==", - "dev": true, + "node_modules/accepts": { + "version": "2.0.0", "license": "MIT", "dependencies": { - "ajv": "^6.12.4", - "debug": "^4.1.1", - "espree": "^7.3.0", - "globals": "^13.9.0", - "ignore": "^4.0.6", - "import-fresh": "^3.2.1", - "js-yaml": "^3.13.1", - "minimatch": "^3.0.4", - "strip-json-comments": "^3.1.1" + "mime-types": "^3.0.0", + "negotiator": "^1.0.0" }, "engines": { - "node": "^10.12.0 || >=12.0.0" - } - }, - "node_modules/@eslint/eslintrc/node_modules/ajv": { - "version": "6.12.6", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", - "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", - "dev": true, - "license": "MIT", - "dependencies": { - "fast-deep-equal": "^3.1.1", - "fast-json-stable-stringify": "^2.0.0", - "json-schema-traverse": "^0.4.1", - "uri-js": "^4.2.2" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/epoberezkin" + "node": ">= 0.6" } - }, - "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/json-schema-traverse": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", - "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", - "dev": true, - "license": "MIT" - }, - "node_modules/@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/@fastify/merge-json-schemas": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/@fastify/merge-json-schemas/-/merge-json-schemas-0.1.1.tgz", - "integrity": "sha512-fERDVz7topgNjtXsJTTW1JKLy0rhuLRcquYqNR9rF7OcVpCa2OVW49ZPDIhaRRCaUuvVxI+N416xUoF76HNSXA==", - "license": "MIT", - "dependencies": { - "fast-deep-equal": "^3.1.3" - } - }, - "node_modules/@gar/promisify": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/@gar/promisify/-/promisify-1.1.3.tgz", - "integrity": "sha512-k2Ty1JcVojjJFwrg/ThKi2ujJ7XNLYaFGNB/bWT9wGR+oSMJHMa5w+CUq6p/pVrKeNNgA7pCqEcjSnHVoqJQFw==", - "dev": true, - "license": "MIT" - }, - "node_modules/@hapi/boom": { - "version": "10.0.1", - "resolved": "https://registry.npmjs.org/@hapi/boom/-/boom-10.0.1.tgz", - "integrity": "sha512-ERcCZaEjdH3OgSJlyjVk8pHIFeus91CjKP3v+MpgBNp5IvGzP2l/bRiD78nqYcKPaZdbKkK5vDBVPd2ohHBlsA==", - "license": "BSD-3-Clause", - "dependencies": { - "@hapi/hoek": "^11.0.2" - } - }, - "node_modules/@hapi/bourne": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/@hapi/bourne/-/bourne-3.0.0.tgz", - "integrity": "sha512-Waj1cwPXJDucOib4a3bAISsKJVb15MKi9IvmTI/7ssVEm6sywXGjVJDhl6/umt1pK1ZS7PacXU3A1PmFKHEZ2w==", - "license": "BSD-3-Clause" - }, - "node_modules/@hapi/hoek": { - "version": "11.0.7", - "resolved": "https://registry.npmjs.org/@hapi/hoek/-/hoek-11.0.7.tgz", - "integrity": "sha512-HV5undWkKzcB4RZUusqOpcgxOaq6VOAH7zhhIr2g3G8NF/MlFO75SjOr2NfuSx0Mh40+1FqCkagKLJRykUWoFQ==", - "license": "BSD-3-Clause" - }, - "node_modules/@hapi/topo": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/@hapi/topo/-/topo-5.1.0.tgz", - "integrity": "sha512-foQZKJig7Ob0BMAYBfcJk8d77QtOe7Wo4ox7ff1lQYoNNAb6jwcY1ncdoy2e9wQZzvNy7ODZCYJkK8kzmcAnAg==", - "license": "BSD-3-Clause", - "dependencies": { - "@hapi/hoek": "^9.0.0" - } - }, - "node_modules/@hapi/topo/node_modules/@hapi/hoek": { - "version": "9.3.0", - "resolved": "https://registry.npmjs.org/@hapi/hoek/-/hoek-9.3.0.tgz", - "integrity": "sha512-/c6rf4UJlmHlC9b5BaNvzAcFv7HZ2QHaV0D4/HNlBdvFnvQq8RI4kYdhyPCl7Xj+oWvTWQ8ujhqS53LIgAe6KQ==", - "license": "BSD-3-Clause" - }, - "node_modules/@hapi/wreck": { - "version": "18.1.0", - "resolved": "https://registry.npmjs.org/@hapi/wreck/-/wreck-18.1.0.tgz", - "integrity": "sha512-0z6ZRCmFEfV/MQqkQomJ7sl/hyxvcZM7LtuVqN3vdAO4vM9eBbowl0kaqQj9EJJQab+3Uuh1GxbGIBFy4NfJ4w==", - "license": "BSD-3-Clause", - "dependencies": { - "@hapi/boom": "^10.0.1", - "@hapi/bourne": "^3.0.0", - "@hapi/hoek": "^11.0.2" - } - }, - "node_modules/@humanwhocodes/config-array": { - "version": "0.5.0", - "resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.5.0.tgz", - "integrity": "sha512-FagtKFz74XrTl7y6HCzQpwDfXP0yhxe9lHLD1UZxjvZIcbyRz8zTFF/yYNfSfzU414eDwZ1SrO0Qvtyf+wFMQg==", - "deprecated": "Use @eslint/config-array instead", - "dev": true, - "license": "Apache-2.0", - "dependencies": { - "@humanwhocodes/object-schema": "^1.2.0", - "debug": "^4.1.1", - "minimatch": "^3.0.4" - }, - "engines": { - "node": ">=10.10.0" - } - }, - "node_modules/@humanwhocodes/object-schema": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/@humanwhocodes/object-schema/-/object-schema-1.2.1.tgz", - "integrity": "sha512-ZnQMnLV4e7hDlUvw8H+U8ASL02SS2Gn6+9Ac3wGGLIe7+je2AeAOxPY+izIPJDfFDb7eDjev0Us8MO1iFRN8hA==", - "deprecated": "Use @eslint/object-schema instead", - "dev": true, - "license": "BSD-3-Clause" - }, - "node_modules/@intlify/shared": { - "version": "9.14.1", - "resolved": "https://registry.npmjs.org/@intlify/shared/-/shared-9.14.1.tgz", - "integrity": "sha512-XjHu6PEQup9MnP1x0W9y0nXXfq9jFftAYSfV11hryjtH4XqXP8HrzMvXI+ZVifF+jZLszaTzIhvukllplxTQTg==", - "license": "MIT", - "engines": { - "node": ">= 16" - }, - "funding": { - "url": "https://github.com/sponsors/kazupon" - } - }, - "node_modules/@intlify/vue-i18n-extensions": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/@intlify/vue-i18n-extensions/-/vue-i18n-extensions-1.0.2.tgz", - "integrity": "sha512-rnfA0ScyBXyp9xsSD4EAMGeOh1yv/AE7fhqdAdSOr5X8N39azz257umfRtzNT9sHXAKSSzpCVhIbMAkp5c/gjQ==", - "license": "MIT", - "dependencies": { - "@babel/parser": "^7.9.6" - }, - "engines": { - "node": ">= 10.0" - } - }, - "node_modules/@intlify/vue-i18n-loader": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/@intlify/vue-i18n-loader/-/vue-i18n-loader-1.1.0.tgz", - "integrity": "sha512-9LXiztMtYKTE8t/hRwwGUp+ofrwU0sxLQLzFEOZ38zvn0DonUIQmZUj1cfz5p1Lu8BllxKbCrn6HnsRJ+LYA6g==", - "license": "MIT", - "dependencies": { - "@intlify/shared": "^9.0.0", - "js-yaml": "^3.13.1", - "json5": "^2.1.1" - }, - "engines": { - "node": ">= 10" - } - }, - "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==", - "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==", - "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==", - "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==", - "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==", - "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==", - "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==", - "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/@istanbuljs/load-nyc-config": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/@istanbuljs/load-nyc-config/-/load-nyc-config-1.1.0.tgz", - "integrity": "sha512-VjeHSlIzpv/NyD3N0YuHfXOPDIixcA1q2ZV98wsMqcYlPmv2n3Yb2lYP9XMElnaFVXg5A7YLTeLu6V84uQDjmQ==", - "dev": true, - "license": "ISC", - "dependencies": { - "camelcase": "^5.3.1", - "find-up": "^4.1.0", - "get-package-type": "^0.1.0", - "js-yaml": "^3.13.1", - "resolve-from": "^5.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/@istanbuljs/load-nyc-config/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", - "dependencies": { - "locate-path": "^5.0.0", - "path-exists": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/@istanbuljs/load-nyc-config/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", - "dependencies": { - "p-locate": "^4.1.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/@istanbuljs/load-nyc-config/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", - "dependencies": { - "p-try": "^2.0.0" - }, - "engines": { - "node": ">=6" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/@istanbuljs/load-nyc-config/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", - "dependencies": { - "p-limit": "^2.2.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/@istanbuljs/schema": { - "version": "0.1.3", - "resolved": "https://registry.npmjs.org/@istanbuljs/schema/-/schema-0.1.3.tgz", - "integrity": "sha512-ZXRY4jNvVgSVQ8DL3LTcakaAtXwTVUxE81hslsyD2AtoXW/wVob10HkOJ1X/pAlcI7D+2YoZKg5do8G/w6RYgA==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/@jridgewell/gen-mapping": { - "version": "0.3.5", - "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.5.tgz", - "integrity": "sha512-IzL8ZoEDIBRWEzlCcRhOaCupYyN5gdIK+Q6fbFdPDg6HqX6jpkItn7DFIpW9LQzXG6Df9sA7+OKnq0qlz/GaQg==", - "license": "MIT", - "dependencies": { - "@jridgewell/set-array": "^1.2.1", - "@jridgewell/sourcemap-codec": "^1.4.10", - "@jridgewell/trace-mapping": "^0.3.24" - }, - "engines": { - "node": ">=6.0.0" - } - }, - "node_modules/@jridgewell/resolve-uri": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.2.tgz", - "integrity": "sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==", - "license": "MIT", - "engines": { - "node": ">=6.0.0" - } - }, - "node_modules/@jridgewell/set-array": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/@jridgewell/set-array/-/set-array-1.2.1.tgz", - "integrity": "sha512-R8gLRTZeyp03ymzP/6Lil/28tGeGEzhx1q2k703KGWRAI1VdvPIXdG70VJc2pAMw3NA6JKL5hhFu1sJX0Mnn/A==", - "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==", - "dev": true, - "license": "MIT", - "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==", - "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==", - "license": "MIT", - "dependencies": { - "@jridgewell/resolve-uri": "^3.1.0", - "@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==", - "license": "MIT" - }, - "node_modules/@jsonjoy.com/base64": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/@jsonjoy.com/base64/-/base64-1.1.2.tgz", - "integrity": "sha512-q6XAnWQDIMA3+FTiOYajoYqySkO+JSat0ytXGSuRdq9uXE7o92gzuQwQM14xaCRlBLGq3v5miDGC4vkVTn54xA==", - "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-pack": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/@jsonjoy.com/json-pack/-/json-pack-1.1.0.tgz", - "integrity": "sha512-zlQONA+msXPPwHWZMKFVS78ewFczIll5lXiVPwFPCZUsrOKdxc2AvxU1HoNBmMRhqDZUR9HkC3UOm+6pME6Xsg==", - "dev": true, - "license": "Apache-2.0", - "dependencies": { - "@jsonjoy.com/base64": "^1.1.1", - "@jsonjoy.com/util": "^1.1.2", - "hyperdyperid": "^1.2.0", - "thingies": "^1.20.0" - }, - "engines": { - "node": ">=10.0" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/streamich" - }, - "peerDependencies": { - "tslib": "2" - } - }, - "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==", - "dev": true, - "license": "Apache-2.0", - "engines": { - "node": ">=10.0" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/streamich" - }, - "peerDependencies": { - "tslib": "2" - } - }, - "node_modules/@koumoul/nuxt-config-inject": { - "version": "0.4.12", - "resolved": "https://registry.npmjs.org/@koumoul/nuxt-config-inject/-/nuxt-config-inject-0.4.12.tgz", - "integrity": "sha512-jPL9+2XSqg07oWUqBG4JzzjfvfrfHYPmnwDjCsRFKbQl2AwVA7OH/Qawh2pT046CjZigZgHU65paqoINHHMgXA==", - "license": "MIT", - "dependencies": { - "debug": "^4.1.1", - "flat": "^5.0.0", - "object-hash": "^2.0.1", - "replace-in-file": "^5.0.2" - } - }, - "node_modules/@koumoul/v-iframe": { - "version": "0.20.3", - "resolved": "https://registry.npmjs.org/@koumoul/v-iframe/-/v-iframe-0.20.3.tgz", - "integrity": "sha512-CFLlREUhT8NGYKdcAH4D+bXlmSgwcdbEt7w42vHL2ELzPBdaRhITRQOmgTYNjuZnzT9XS2Vr4tqC29sibreagA==", - "dev": true, - "license": "MIT", - "dependencies": { - "debug": "^4.3.2" - }, - "peerDependencies": { - "iframe-resizer": "4", - "vuetify": "2" - } - }, - "node_modules/@koumoul/vjsf": { - "version": "2.23.3", - "resolved": "https://registry.npmjs.org/@koumoul/vjsf/-/vjsf-2.23.3.tgz", - "integrity": "sha512-glSxVYlMdLW712CiDBBbaIrbtMhc/dCCaz2/HkHK2m2S84seqXshqST4UUfblZXffbC02n9se1cOPfHpwOaxtQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "debounce": "^1.2.1", - "debounce-promise": "^3.1.2", - "debug": "^4.3.3", - "fast-copy": "^2.1.1", - "fast-equals": "^2.0.4", - "match-all": "^1.2.6" - }, - "optionalDependencies": { - "@mdi/font": "^6.5.95", - "@mdi/js": "^6.5.95", - "ajv": "^8.11.0", - "ajv-formats": "^2.1.1", - "ajv-i18n": "^4.2.0", - "expr-eval": "^2.0.2", - "markdown-it": "^12.3.2", - "property-expr": "^2.0.5", - "vuedraggable": "^2.24.3" - }, - "peerDependencies": { - "vuetify": "^2.0.0" - } - }, - "node_modules/@koumoul/vjsf/node_modules/@mdi/font": { - "version": "6.9.96", - "resolved": "https://registry.npmjs.org/@mdi/font/-/font-6.9.96.tgz", - "integrity": "sha512-z3QVZStyHVwkDsFR7A7F2PIvZJPWgdSFw4BEEy2Gc9HUN5NfK9mGbjgaYClRcbMWiYEV45srmiYtczmBtCqR8w==", - "dev": true, - "license": "Apache-2.0", - "optional": true - }, - "node_modules/@koumoul/vjsf/node_modules/ajv-formats": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/ajv-formats/-/ajv-formats-2.1.1.tgz", - "integrity": "sha512-Wx0Kx52hxE7C18hkMEggYlEifqWZtYaRgouJor+WMdPnQyEK13vgEWyVNup7SoeeoLMsr4kf5h6dOW11I15MUA==", - "dev": true, - "license": "MIT", - "optional": true, - "dependencies": { - "ajv": "^8.0.0" - }, - "peerDependencies": { - "ajv": "^8.0.0" - }, - "peerDependenciesMeta": { - "ajv": { - "optional": true - } - } - }, - "node_modules/@koumoul/vue-multianalytics": { - "version": "1.11.4", - "resolved": "https://registry.npmjs.org/@koumoul/vue-multianalytics/-/vue-multianalytics-1.11.4.tgz", - "integrity": "sha512-6D41mv287c8P94O9AKhETsYfmt3EwTSzo9RQmVL09k18/tATITlDVPQ3htoBeip1UbHLUJULBQybbQdANsaDPw==", - "dev": true, - "license": "MIT" - }, - "node_modules/@mdi/font": { - "version": "7.4.47", - "resolved": "https://registry.npmjs.org/@mdi/font/-/font-7.4.47.tgz", - "integrity": "sha512-43MtGpd585SNzHZPcYowu/84Vz2a2g31TvPMTm9uTiCSWzaheQySUcSyUH/46fPnuPQWof2yd0pGBtzee/IQWw==", - "dev": true, - "license": "Apache-2.0" - }, - "node_modules/@mdi/js": { - "version": "6.9.96", - "resolved": "https://registry.npmjs.org/@mdi/js/-/js-6.9.96.tgz", - "integrity": "sha512-rK0/vLFaiItYS2W7uVmaKPKnhNQE4XVkylpk5njtVwENnp8elwY5uRL6qvdj2esuvUHG7DwygE4Qu3eKxxuJiQ==", - "dev": true, - "license": "Apache-2.0", - "optional": true - }, - "node_modules/@mongodb-js/saslprep": { - "version": "1.1.9", - "resolved": "https://registry.npmjs.org/@mongodb-js/saslprep/-/saslprep-1.1.9.tgz", - "integrity": "sha512-tVkljjeEaAhCqTzajSdgbQ6gE6f3oneVwa3iXR6csiEwXXOFsiC6Uh9iAjAhXPtqa/XMDHWjjeNH/77m/Yq2dw==", - "license": "MIT", - "optional": true, - "dependencies": { - "sparse-bitfield": "^3.0.3" - } - }, - "node_modules/@nodelib/fs.scandir": { - "version": "2.1.5", - "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz", - "integrity": "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==", - "license": "MIT", - "dependencies": { - "@nodelib/fs.stat": "2.0.5", - "run-parallel": "^1.1.9" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/@nodelib/fs.stat": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz", - "integrity": "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==", - "license": "MIT", - "engines": { - "node": ">= 8" - } - }, - "node_modules/@nodelib/fs.walk": { - "version": "1.2.8", - "resolved": "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz", - "integrity": "sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==", - "license": "MIT", - "dependencies": { - "@nodelib/fs.scandir": "2.1.5", - "fastq": "^1.6.0" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/@npmcli/fs": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/@npmcli/fs/-/fs-1.1.1.tgz", - "integrity": "sha512-8KG5RD0GVP4ydEzRn/I4BNDuxDtqVbOdm8675T49OIG/NGhaK0pjPX7ZcDlvKYbA+ulvVK3ztfcF4uBdOxuJbQ==", - "dev": true, - "license": "ISC", - "dependencies": { - "@gar/promisify": "^1.0.1", - "semver": "^7.3.5" - } - }, - "node_modules/@npmcli/move-file": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/@npmcli/move-file/-/move-file-1.1.2.tgz", - "integrity": "sha512-1SUf/Cg2GzGDyaf15aR9St9TWlb+XvbZXWpDx8YKs7MLzMH/BCeopv+y9vzrzgkfykCGuWOlSu3mZhj2+FQcrg==", - "deprecated": "This functionality has been moved to @npmcli/fs", - "dev": true, - "license": "MIT", - "dependencies": { - "mkdirp": "^1.0.4", - "rimraf": "^3.0.2" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/@nuxt/babel-preset-app": { - "version": "2.18.1", - "resolved": "https://registry.npmjs.org/@nuxt/babel-preset-app/-/babel-preset-app-2.18.1.tgz", - "integrity": "sha512-7AYAGVjykrvta7k+koMGbt6y6PTMwl74PX2i9Ubyc1VC9ewy9U/b6cW0gVJOR/ZJWPzaABAgVZC7N58PprUDfA==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/compat-data": "^7.24.7", - "@babel/core": "^7.24.7", - "@babel/helper-compilation-targets": "^7.24.7", - "@babel/helper-module-imports": "^7.24.7", - "@babel/plugin-proposal-class-properties": "^7.18.6", - "@babel/plugin-proposal-decorators": "^7.24.7", - "@babel/plugin-proposal-nullish-coalescing-operator": "^7.18.6", - "@babel/plugin-proposal-optional-chaining": "^7.21.0", - "@babel/plugin-proposal-private-methods": "^7.18.6", - "@babel/plugin-proposal-private-property-in-object": "^7.21.11", - "@babel/plugin-transform-runtime": "^7.24.7", - "@babel/preset-env": "^7.24.7", - "@babel/runtime": "^7.24.7", - "@vue/babel-preset-jsx": "^1.4.0", - "core-js": "^3.37.1", - "core-js-compat": "^3.37.1", - "regenerator-runtime": "^0.14.1" - }, - "engines": { - "node": "^14.18.0 || >=16.10.0" - } - }, - "node_modules/@nuxt/builder": { - "version": "2.18.1", - "resolved": "https://registry.npmjs.org/@nuxt/builder/-/builder-2.18.1.tgz", - "integrity": "sha512-hc4AUP3Nvov7jL0BEP7jFXt8zOfa6gt+y1kyoVvU1WHEVNcWnrGtRKvJuCwi1IwCVlx7Weh+luvHI4nzQwEeKg==", - "dev": true, - "license": "MIT", - "dependencies": { - "@nuxt/devalue": "^2.0.2", - "@nuxt/utils": "2.18.1", - "@nuxt/vue-app": "2.18.1", - "@nuxt/webpack": "2.18.1", - "chalk": "^4.1.2", - "chokidar": "^3.6.0", - "consola": "^3.2.3", - "fs-extra": "^11.2.0", - "glob": "^8.1.0", - "hash-sum": "^2.0.0", - "ignore": "^5.3.1", - "lodash": "^4.17.21", - "pify": "^5.0.0", - "serialize-javascript": "^6.0.2", - "upath": "^2.0.1" - }, - "engines": { - "node": "^14.18.0 || >=16.10.0" - } - }, - "node_modules/@nuxt/builder/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/@nuxt/builder/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/@nuxt/builder/node_modules/consola": { - "version": "3.2.3", - "resolved": "https://registry.npmjs.org/consola/-/consola-3.2.3.tgz", - "integrity": "sha512-I5qxpzLv+sJhTVEoLYNcTW+bThDCPsit0vLNKShZx6rLtpilNpmmeTPaeqJb9ZE9dV3DGaeby6Vuhrw38WjeyQ==", - "dev": true, - "license": "MIT", - "engines": { - "node": "^14.18.0 || >=16.10.0" - } - }, - "node_modules/@nuxt/builder/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==", - "dev": true, - "license": "MIT", - "dependencies": { - "graceful-fs": "^4.2.0", - "jsonfile": "^6.0.1", - "universalify": "^2.0.0" - }, - "engines": { - "node": ">=14.14" - } - }, - "node_modules/@nuxt/builder/node_modules/glob": { - "version": "8.1.0", - "resolved": "https://registry.npmjs.org/glob/-/glob-8.1.0.tgz", - "integrity": "sha512-r8hpEjiQEYlF2QU0df3dS+nxxSIreXQS1qRhMJM0Q5NDdR386C7jb7Hwwod8Fgiuex+k0GFjgft18yvxm5XoCQ==", - "deprecated": "Glob versions prior to v9 are no longer supported", - "dev": true, - "license": "ISC", - "dependencies": { - "fs.realpath": "^1.0.0", - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "^5.0.1", - "once": "^1.3.0" - }, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/@nuxt/builder/node_modules/ignore": { - "version": "5.3.2", - "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.3.2.tgz", - "integrity": "sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 4" - } - }, - "node_modules/@nuxt/builder/node_modules/jsonfile": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.1.0.tgz", - "integrity": "sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "universalify": "^2.0.0" - }, - "optionalDependencies": { - "graceful-fs": "^4.1.6" - } - }, - "node_modules/@nuxt/builder/node_modules/minimatch": { - "version": "5.1.6", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-5.1.6.tgz", - "integrity": "sha512-lKwV/1brpG6mBUFHtb7NUmtABCb2WZZmm2wNiOA5hAb8VdCS4B3dtMWyvcoViccwAW/COERjXLt0zP1zXUN26g==", - "dev": true, - "license": "ISC", - "dependencies": { - "brace-expansion": "^2.0.1" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/@nuxt/builder/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/@nuxt/builder/node_modules/universalify": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.1.tgz", - "integrity": "sha512-gptHNQghINnc/vTGIk0SOFGFNXw7JVrlRUtConJRlvaw6DuX0wO5Jeko9sWrMBhh+PsYAZ7oXAiOnf/UKogyiw==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 10.0.0" - } - }, - "node_modules/@nuxt/cli": { - "version": "2.18.1", - "resolved": "https://registry.npmjs.org/@nuxt/cli/-/cli-2.18.1.tgz", - "integrity": "sha512-ZOoDlE4Fw1Cum6oG8DVnb7B4ivovXySxdDI8vnIt49Ypx22pBGt5y2ErF7g+5TAxGMIHpyh7peJWJwYp88PqPA==", - "license": "MIT", - "dependencies": { - "@nuxt/config": "2.18.1", - "@nuxt/utils": "2.18.1", - "boxen": "^5.1.2", - "chalk": "^4.1.2", - "compression": "^1.7.4", - "connect": "^3.7.0", - "consola": "^3.2.3", - "crc": "^4.3.2", - "defu": "^6.1.4", - "destr": "^2.0.3", - "execa": "^5.1.1", - "exit": "^0.1.2", - "fs-extra": "^11.2.0", - "globby": "^11.0.4", - "hookable": "^4.4.1", - "lodash": "^4.17.21", - "minimist": "^1.2.8", - "opener": "1.5.2", - "pretty-bytes": "^5.6.0", - "semver": "^7.6.2", - "serve-static": "^1.15.0", - "std-env": "^3.7.0", - "upath": "^2.0.1", - "wrap-ansi": "^7.0.0" - }, - "bin": { - "nuxt-cli": "bin/nuxt-cli.js" - }, - "engines": { - "node": "^14.18.0 || >=16.10.0" - } - }, - "node_modules/@nuxt/cli/node_modules/chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", - "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/@nuxt/cli/node_modules/consola": { - "version": "3.2.3", - "resolved": "https://registry.npmjs.org/consola/-/consola-3.2.3.tgz", - "integrity": "sha512-I5qxpzLv+sJhTVEoLYNcTW+bThDCPsit0vLNKShZx6rLtpilNpmmeTPaeqJb9ZE9dV3DGaeby6Vuhrw38WjeyQ==", - "license": "MIT", - "engines": { - "node": "^14.18.0 || >=16.10.0" - } - }, - "node_modules/@nuxt/cli/node_modules/defu": { - "version": "6.1.4", - "resolved": "https://registry.npmjs.org/defu/-/defu-6.1.4.tgz", - "integrity": "sha512-mEQCMmwJu317oSz8CwdIOdwf3xMif1ttiM8LTufzc3g6kR+9Pe236twL8j3IYT1F7GfRgGcW6MWxzZjLIkuHIg==", - "license": "MIT" - }, - "node_modules/@nuxt/cli/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==", - "license": "MIT", - "dependencies": { - "graceful-fs": "^4.2.0", - "jsonfile": "^6.0.1", - "universalify": "^2.0.0" - }, - "engines": { - "node": ">=14.14" - } - }, - "node_modules/@nuxt/cli/node_modules/jsonfile": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.1.0.tgz", - "integrity": "sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==", - "license": "MIT", - "dependencies": { - "universalify": "^2.0.0" - }, - "optionalDependencies": { - "graceful-fs": "^4.1.6" - } - }, - "node_modules/@nuxt/cli/node_modules/semver": { - "version": "7.6.3", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.3.tgz", - "integrity": "sha512-oVekP1cKtI+CTDvHWYFUcMtsK/00wmAEfyqKfNdARm8u1wNVhSgaX7A8d4UuIlUI5e84iEwOhs7ZPYRmzU9U6A==", - "license": "ISC", - "bin": { - "semver": "bin/semver.js" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/@nuxt/cli/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==", - "license": "MIT", - "dependencies": { - "has-flag": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/@nuxt/cli/node_modules/universalify": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.1.tgz", - "integrity": "sha512-gptHNQghINnc/vTGIk0SOFGFNXw7JVrlRUtConJRlvaw6DuX0wO5Jeko9sWrMBhh+PsYAZ7oXAiOnf/UKogyiw==", - "license": "MIT", - "engines": { - "node": ">= 10.0.0" - } - }, - "node_modules/@nuxt/components": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/@nuxt/components/-/components-2.2.1.tgz", - "integrity": "sha512-r1LHUzifvheTnJtYrMuA+apgsrEJbxcgFKIimeXKb+jl8TnPWdV3egmrxBCaDJchrtY/wmHyP47tunsft7AWwg==", - "dev": true, - "license": "MIT", - "dependencies": { - "chalk": "^4.1.2", - "chokidar": "^3.5.2", - "glob": "^7.1.7", - "globby": "^11.0.4", - "scule": "^0.2.1", - "semver": "^7.3.5", - "upath": "^2.0.1", - "vue-template-compiler": "^2.6.14" - }, - "peerDependencies": { - "consola": "*" - } - }, - "node_modules/@nuxt/components/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/@nuxt/components/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/@nuxt/config": { - "version": "2.18.1", - "resolved": "https://registry.npmjs.org/@nuxt/config/-/config-2.18.1.tgz", - "integrity": "sha512-CTsUMFtNCJ6+7AkgMRz53zM9vxmsMYVJWBQOnikVzwFxm/jsWzjyXkp3pQb5/fNZuqR7qXmpUKIRtrdeUeN4JQ==", - "license": "MIT", - "dependencies": { - "@nuxt/utils": "2.18.1", - "consola": "^3.2.3", - "defu": "^6.1.4", - "destr": "^2.0.3", - "dotenv": "^16.4.5", - "lodash": "^4.17.21", - "rc9": "^2.1.2", - "std-env": "^3.7.0", - "ufo": "^1.5.3" - }, - "engines": { - "node": "^14.18.0 || >=16.10.0" - } - }, - "node_modules/@nuxt/config/node_modules/consola": { - "version": "3.2.3", - "resolved": "https://registry.npmjs.org/consola/-/consola-3.2.3.tgz", - "integrity": "sha512-I5qxpzLv+sJhTVEoLYNcTW+bThDCPsit0vLNKShZx6rLtpilNpmmeTPaeqJb9ZE9dV3DGaeby6Vuhrw38WjeyQ==", - "license": "MIT", - "engines": { - "node": "^14.18.0 || >=16.10.0" - } - }, - "node_modules/@nuxt/config/node_modules/defu": { - "version": "6.1.4", - "resolved": "https://registry.npmjs.org/defu/-/defu-6.1.4.tgz", - "integrity": "sha512-mEQCMmwJu317oSz8CwdIOdwf3xMif1ttiM8LTufzc3g6kR+9Pe236twL8j3IYT1F7GfRgGcW6MWxzZjLIkuHIg==", - "license": "MIT" - }, - "node_modules/@nuxt/config/node_modules/ufo": { - "version": "1.5.4", - "resolved": "https://registry.npmjs.org/ufo/-/ufo-1.5.4.tgz", - "integrity": "sha512-UsUk3byDzKd04EyoZ7U4DOlxQaD14JUKQl6/P7wiX4FNvUfm3XL246n9W5AmqwW5RSFJ27NAuM0iLscAOYUiGQ==", - "license": "MIT" - }, - "node_modules/@nuxt/core": { - "version": "2.18.1", - "resolved": "https://registry.npmjs.org/@nuxt/core/-/core-2.18.1.tgz", - "integrity": "sha512-BFnKVH7caEdDrK04qQ2U9F4Rf4hV/BqqXBJiIeHp7vM9CLKjTL5/yhiognDw3SBefmSJkpOATx1HJl3XM8c4fg==", - "license": "MIT", - "dependencies": { - "@nuxt/config": "2.18.1", - "@nuxt/server": "2.18.1", - "@nuxt/utils": "2.18.1", - "consola": "^3.2.3", - "fs-extra": "^11.2.0", - "hash-sum": "^2.0.0", - "hookable": "^4.4.1", - "lodash": "^4.17.21" - }, - "engines": { - "node": "^14.18.0 || >=16.10.0" - } - }, - "node_modules/@nuxt/core/node_modules/consola": { - "version": "3.2.3", - "resolved": "https://registry.npmjs.org/consola/-/consola-3.2.3.tgz", - "integrity": "sha512-I5qxpzLv+sJhTVEoLYNcTW+bThDCPsit0vLNKShZx6rLtpilNpmmeTPaeqJb9ZE9dV3DGaeby6Vuhrw38WjeyQ==", - "license": "MIT", - "engines": { - "node": "^14.18.0 || >=16.10.0" - } - }, - "node_modules/@nuxt/core/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==", - "license": "MIT", - "dependencies": { - "graceful-fs": "^4.2.0", - "jsonfile": "^6.0.1", - "universalify": "^2.0.0" - }, - "engines": { - "node": ">=14.14" - } - }, - "node_modules/@nuxt/core/node_modules/jsonfile": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.1.0.tgz", - "integrity": "sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==", - "license": "MIT", - "dependencies": { - "universalify": "^2.0.0" - }, - "optionalDependencies": { - "graceful-fs": "^4.1.6" - } - }, - "node_modules/@nuxt/core/node_modules/universalify": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.1.tgz", - "integrity": "sha512-gptHNQghINnc/vTGIk0SOFGFNXw7JVrlRUtConJRlvaw6DuX0wO5Jeko9sWrMBhh+PsYAZ7oXAiOnf/UKogyiw==", - "license": "MIT", - "engines": { - "node": ">= 10.0.0" - } - }, - "node_modules/@nuxt/devalue": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/@nuxt/devalue/-/devalue-2.0.2.tgz", - "integrity": "sha512-GBzP8zOc7CGWyFQS6dv1lQz8VVpz5C2yRszbXufwG/9zhStTIH50EtD87NmWbTMwXDvZLNg8GIpb1UFdH93JCA==", - "license": "MIT" - }, - "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/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, - "license": "MIT", - "dependencies": { - "color-convert": "^1.9.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/@nuxt/friendly-errors-webpack-plugin/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, - "license": "MIT", - "dependencies": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/@nuxt/friendly-errors-webpack-plugin/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, - "license": "MIT", - "dependencies": { - "color-name": "1.1.3" - } - }, - "node_modules/@nuxt/friendly-errors-webpack-plugin/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, - "license": "MIT" - }, - "node_modules/@nuxt/friendly-errors-webpack-plugin/node_modules/consola": { - "version": "3.2.3", - "resolved": "https://registry.npmjs.org/consola/-/consola-3.2.3.tgz", - "integrity": "sha512-I5qxpzLv+sJhTVEoLYNcTW+bThDCPsit0vLNKShZx6rLtpilNpmmeTPaeqJb9ZE9dV3DGaeby6Vuhrw38WjeyQ==", - "dev": true, - "license": "MIT", - "engines": { - "node": "^14.18.0 || >=16.10.0" - } - }, - "node_modules/@nuxt/friendly-errors-webpack-plugin/node_modules/escape-string-regexp": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", - "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=0.8.0" - } - }, - "node_modules/@nuxt/friendly-errors-webpack-plugin/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_modules/@nuxt/friendly-errors-webpack-plugin/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, - "license": "MIT", - "dependencies": { - "has-flag": "^3.0.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/@nuxt/generator": { - "version": "2.18.1", - "resolved": "https://registry.npmjs.org/@nuxt/generator/-/generator-2.18.1.tgz", - "integrity": "sha512-kZMfB5Ymvd/5ek+xfk2svQiMJWEAjZf5XNFTG+2WiNsitHb01Bo3W2QGidy+dwfuLtHoiOJkMovRlyAKWxTohg==", - "dev": true, - "license": "MIT", - "dependencies": { - "@nuxt/utils": "2.18.1", - "chalk": "^4.1.2", - "consola": "^3.2.3", - "defu": "^6.1.4", - "devalue": "^2.0.1", - "fs-extra": "^11.2.0", - "html-minifier-terser": "^7.2.0", - "node-html-parser": "^6.1.13", - "ufo": "^1.5.3" - }, - "engines": { - "node": "^14.18.0 || >=16.10.0" - } - }, - "node_modules/@nuxt/generator/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/@nuxt/generator/node_modules/consola": { - "version": "3.2.3", - "resolved": "https://registry.npmjs.org/consola/-/consola-3.2.3.tgz", - "integrity": "sha512-I5qxpzLv+sJhTVEoLYNcTW+bThDCPsit0vLNKShZx6rLtpilNpmmeTPaeqJb9ZE9dV3DGaeby6Vuhrw38WjeyQ==", - "dev": true, - "license": "MIT", - "engines": { - "node": "^14.18.0 || >=16.10.0" - } - }, - "node_modules/@nuxt/generator/node_modules/defu": { - "version": "6.1.4", - "resolved": "https://registry.npmjs.org/defu/-/defu-6.1.4.tgz", - "integrity": "sha512-mEQCMmwJu317oSz8CwdIOdwf3xMif1ttiM8LTufzc3g6kR+9Pe236twL8j3IYT1F7GfRgGcW6MWxzZjLIkuHIg==", - "dev": true, - "license": "MIT" - }, - "node_modules/@nuxt/generator/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==", - "dev": true, - "license": "MIT", - "dependencies": { - "graceful-fs": "^4.2.0", - "jsonfile": "^6.0.1", - "universalify": "^2.0.0" - }, - "engines": { - "node": ">=14.14" - } - }, - "node_modules/@nuxt/generator/node_modules/jsonfile": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.1.0.tgz", - "integrity": "sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "universalify": "^2.0.0" - }, - "optionalDependencies": { - "graceful-fs": "^4.1.6" - } - }, - "node_modules/@nuxt/generator/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/@nuxt/generator/node_modules/ufo": { - "version": "1.5.4", - "resolved": "https://registry.npmjs.org/ufo/-/ufo-1.5.4.tgz", - "integrity": "sha512-UsUk3byDzKd04EyoZ7U4DOlxQaD14JUKQl6/P7wiX4FNvUfm3XL246n9W5AmqwW5RSFJ27NAuM0iLscAOYUiGQ==", - "dev": true, - "license": "MIT" - }, - "node_modules/@nuxt/generator/node_modules/universalify": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.1.tgz", - "integrity": "sha512-gptHNQghINnc/vTGIk0SOFGFNXw7JVrlRUtConJRlvaw6DuX0wO5Jeko9sWrMBhh+PsYAZ7oXAiOnf/UKogyiw==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 10.0.0" - } - }, - "node_modules/@nuxt/loading-screen": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/@nuxt/loading-screen/-/loading-screen-2.0.4.tgz", - "integrity": "sha512-xpEDAoRu75tLUYCkUJCIvJkWJSuwr8pqomvQ+fkXpSrkxZ/9OzlBFjAbVdOAWTMj4aV/LVQso4vcEdircKeFIQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "connect": "^3.7.0", - "defu": "^5.0.0", - "get-port-please": "^2.2.0", - "node-res": "^5.0.1", - "serve-static": "^1.14.1" - } - }, - "node_modules/@nuxt/opencollective": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/@nuxt/opencollective/-/opencollective-0.4.0.tgz", - "integrity": "sha512-uUsxOcO2lFeotV+BGOwNLeau+U17mhpaCRhE7v8nJLdWJ2iErQXadl28HaHe6btuT8RD0LDSpvwCiKrHznDxUA==", - "dev": true, - "license": "MIT", - "dependencies": { - "chalk": "^4.1.2", - "consola": "^3.2.3", - "node-fetch-native": "^1.4.1" - }, - "bin": { - "opencollective": "bin/opencollective.js" - }, - "engines": { - "node": ">=8.0.0", - "npm": ">=5.0.0" - } - }, - "node_modules/@nuxt/opencollective/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/@nuxt/opencollective/node_modules/consola": { - "version": "3.2.3", - "resolved": "https://registry.npmjs.org/consola/-/consola-3.2.3.tgz", - "integrity": "sha512-I5qxpzLv+sJhTVEoLYNcTW+bThDCPsit0vLNKShZx6rLtpilNpmmeTPaeqJb9ZE9dV3DGaeby6Vuhrw38WjeyQ==", - "dev": true, - "license": "MIT", - "engines": { - "node": "^14.18.0 || >=16.10.0" - } - }, - "node_modules/@nuxt/opencollective/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/@nuxt/server": { - "version": "2.18.1", - "resolved": "https://registry.npmjs.org/@nuxt/server/-/server-2.18.1.tgz", - "integrity": "sha512-4GHmgi1NS6uCL+3QzlxmHmEoKkejQKTDrKPtA16w8iw/8EBgCrAkvXukcIMxF7Of+IYi1I/duVmCyferxo7jyw==", - "license": "MIT", - "dependencies": { - "@nuxt/utils": "2.18.1", - "@nuxt/vue-renderer": "2.18.1", - "@nuxtjs/youch": "^4.2.3", - "compression": "^1.7.4", - "connect": "^3.7.0", - "consola": "^3.2.3", - "etag": "^1.8.1", - "fresh": "^0.5.2", - "fs-extra": "^11.2.0", - "launch-editor-middleware": "^2.8.0", - "neoip": "^2", - "on-headers": "^1.0.2", - "pify": "^5.0.0", - "serve-placeholder": "^2.0.2", - "serve-static": "^1.15.0", - "server-destroy": "^1.0.1", - "ufo": "^1.5.3" - }, - "engines": { - "node": "^14.18.0 || >=16.10.0" - } - }, - "node_modules/@nuxt/server/node_modules/consola": { - "version": "3.2.3", - "resolved": "https://registry.npmjs.org/consola/-/consola-3.2.3.tgz", - "integrity": "sha512-I5qxpzLv+sJhTVEoLYNcTW+bThDCPsit0vLNKShZx6rLtpilNpmmeTPaeqJb9ZE9dV3DGaeby6Vuhrw38WjeyQ==", - "license": "MIT", - "engines": { - "node": "^14.18.0 || >=16.10.0" - } - }, - "node_modules/@nuxt/server/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==", - "license": "MIT", - "dependencies": { - "graceful-fs": "^4.2.0", - "jsonfile": "^6.0.1", - "universalify": "^2.0.0" - }, - "engines": { - "node": ">=14.14" - } - }, - "node_modules/@nuxt/server/node_modules/jsonfile": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.1.0.tgz", - "integrity": "sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==", - "license": "MIT", - "dependencies": { - "universalify": "^2.0.0" - }, - "optionalDependencies": { - "graceful-fs": "^4.1.6" - } - }, - "node_modules/@nuxt/server/node_modules/ufo": { - "version": "1.5.4", - "resolved": "https://registry.npmjs.org/ufo/-/ufo-1.5.4.tgz", - "integrity": "sha512-UsUk3byDzKd04EyoZ7U4DOlxQaD14JUKQl6/P7wiX4FNvUfm3XL246n9W5AmqwW5RSFJ27NAuM0iLscAOYUiGQ==", - "license": "MIT" - }, - "node_modules/@nuxt/server/node_modules/universalify": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.1.tgz", - "integrity": "sha512-gptHNQghINnc/vTGIk0SOFGFNXw7JVrlRUtConJRlvaw6DuX0wO5Jeko9sWrMBhh+PsYAZ7oXAiOnf/UKogyiw==", - "license": "MIT", - "engines": { - "node": ">= 10.0.0" - } - }, - "node_modules/@nuxt/telemetry": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/@nuxt/telemetry/-/telemetry-1.5.0.tgz", - "integrity": "sha512-MhxiiYCFe0MayN2TvmpcsCV66zBePtrSVkFLJHwTFuneQ5Qma5x0NmCwdov7O4NSuTfgSZels9qPJh0zy0Kc4g==", - "license": "MIT", - "dependencies": { - "arg": "^5.0.2", - "chalk": "^4.1.1", - "ci-info": "^3.7.1", - "consola": "^3.2.3", - "create-require": "^1.1.1", - "defu": "^6.1.3", - "destr": "^2.0.2", - "dotenv": "^9.0.2", - "fs-extra": "^8.1.0", - "git-url-parse": "^13.1.1", - "inquirer": "^7.3.3", - "jiti": "^1.21.0", - "nanoid": "^3.1.23", - "node-fetch": "^2.6.1", - "parse-git-config": "^3.0.0", - "rc9": "^2.1.1", - "std-env": "^3.5.0" - }, - "bin": { - "nuxt-telemetry": "bin/nuxt-telemetry.js" - } - }, - "node_modules/@nuxt/telemetry/node_modules/chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", - "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/@nuxt/telemetry/node_modules/consola": { - "version": "3.2.3", - "resolved": "https://registry.npmjs.org/consola/-/consola-3.2.3.tgz", - "integrity": "sha512-I5qxpzLv+sJhTVEoLYNcTW+bThDCPsit0vLNKShZx6rLtpilNpmmeTPaeqJb9ZE9dV3DGaeby6Vuhrw38WjeyQ==", - "license": "MIT", - "engines": { - "node": "^14.18.0 || >=16.10.0" - } - }, - "node_modules/@nuxt/telemetry/node_modules/defu": { - "version": "6.1.4", - "resolved": "https://registry.npmjs.org/defu/-/defu-6.1.4.tgz", - "integrity": "sha512-mEQCMmwJu317oSz8CwdIOdwf3xMif1ttiM8LTufzc3g6kR+9Pe236twL8j3IYT1F7GfRgGcW6MWxzZjLIkuHIg==", - "license": "MIT" - }, - "node_modules/@nuxt/telemetry/node_modules/dotenv": { - "version": "9.0.2", - "resolved": "https://registry.npmjs.org/dotenv/-/dotenv-9.0.2.tgz", - "integrity": "sha512-I9OvvrHp4pIARv4+x9iuewrWycX6CcZtoAu1XrzPxc5UygMJXJZYmBsynku8IkrJwgypE5DGNjDPmPRhDCptUg==", - "license": "BSD-2-Clause", - "engines": { - "node": ">=10" - } - }, - "node_modules/@nuxt/telemetry/node_modules/nanoid": { - "version": "3.3.7", - "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.7.tgz", - "integrity": "sha512-eSRppjcPIatRIMC1U6UngP8XFcz8MQWGQdt1MTBQ7NaAmvXDfvNxbvWV3x2y6CdEUciCSsDHDQZbhYaB8QEo2g==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/ai" - } - ], - "license": "MIT", - "bin": { - "nanoid": "bin/nanoid.cjs" - }, - "engines": { - "node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1" - } - }, - "node_modules/@nuxt/telemetry/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==", - "license": "MIT", - "dependencies": { - "has-flag": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/@nuxt/utils": { - "version": "2.18.1", - "resolved": "https://registry.npmjs.org/@nuxt/utils/-/utils-2.18.1.tgz", - "integrity": "sha512-aWeB8VMhtymo5zXUiQaohCu8IqJqENF9iCag3wyJpdhpNDVoghGUJAl0F6mQvNTJgQzseFtf4XKqTfvcgVzyGg==", - "license": "MIT", - "dependencies": { - "consola": "^3.2.3", - "create-require": "^1.1.1", - "fs-extra": "^11.2.0", - "hash-sum": "^2.0.0", - "jiti": "^1.21.6", - "lodash": "^4.17.21", - "proper-lockfile": "^4.1.2", - "semver": "^7.6.2", - "serialize-javascript": "^6.0.2", - "signal-exit": "^4.1.0", - "ua-parser-js": "^1.0.38", - "ufo": "^1.5.3" - }, - "engines": { - "node": "^14.18.0 || >=16.10.0" - } - }, - "node_modules/@nuxt/utils/node_modules/consola": { - "version": "3.2.3", - "resolved": "https://registry.npmjs.org/consola/-/consola-3.2.3.tgz", - "integrity": "sha512-I5qxpzLv+sJhTVEoLYNcTW+bThDCPsit0vLNKShZx6rLtpilNpmmeTPaeqJb9ZE9dV3DGaeby6Vuhrw38WjeyQ==", - "license": "MIT", - "engines": { - "node": "^14.18.0 || >=16.10.0" - } - }, - "node_modules/@nuxt/utils/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==", - "license": "MIT", - "dependencies": { - "graceful-fs": "^4.2.0", - "jsonfile": "^6.0.1", - "universalify": "^2.0.0" - }, - "engines": { - "node": ">=14.14" - } - }, - "node_modules/@nuxt/utils/node_modules/jsonfile": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.1.0.tgz", - "integrity": "sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==", - "license": "MIT", - "dependencies": { - "universalify": "^2.0.0" - }, - "optionalDependencies": { - "graceful-fs": "^4.1.6" - } - }, - "node_modules/@nuxt/utils/node_modules/semver": { - "version": "7.6.3", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.3.tgz", - "integrity": "sha512-oVekP1cKtI+CTDvHWYFUcMtsK/00wmAEfyqKfNdARm8u1wNVhSgaX7A8d4UuIlUI5e84iEwOhs7ZPYRmzU9U6A==", - "license": "ISC", - "bin": { - "semver": "bin/semver.js" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/@nuxt/utils/node_modules/ufo": { - "version": "1.5.4", - "resolved": "https://registry.npmjs.org/ufo/-/ufo-1.5.4.tgz", - "integrity": "sha512-UsUk3byDzKd04EyoZ7U4DOlxQaD14JUKQl6/P7wiX4FNvUfm3XL246n9W5AmqwW5RSFJ27NAuM0iLscAOYUiGQ==", - "license": "MIT" - }, - "node_modules/@nuxt/utils/node_modules/universalify": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.1.tgz", - "integrity": "sha512-gptHNQghINnc/vTGIk0SOFGFNXw7JVrlRUtConJRlvaw6DuX0wO5Jeko9sWrMBhh+PsYAZ7oXAiOnf/UKogyiw==", - "license": "MIT", - "engines": { - "node": ">= 10.0.0" - } - }, - "node_modules/@nuxt/vue-app": { - "version": "2.18.1", - "resolved": "https://registry.npmjs.org/@nuxt/vue-app/-/vue-app-2.18.1.tgz", - "integrity": "sha512-yxkunoTv6EVa42xM7qES0N1DNMo4UbP/s89L7HjqngQ4KzVWyyzK0qqJ9u3Gu4CabXhHFSquu11gtn+dylKyTA==", - "dev": true, - "license": "MIT", - "dependencies": { - "node-fetch-native": "^1.6.4", - "ufo": "^1.5.3", - "unfetch": "^5.0.0", - "vue": "^2.7.16", - "vue-client-only": "^2.1.0", - "vue-meta": "^2.4.0", - "vue-no-ssr": "^1.1.1", - "vue-router": "^3.6.5", - "vue-template-compiler": "^2.7.16", - "vuex": "^3.6.2" - }, - "engines": { - "node": "^14.18.0 || >=16.10.0" - } - }, - "node_modules/@nuxt/vue-app/node_modules/ufo": { - "version": "1.5.4", - "resolved": "https://registry.npmjs.org/ufo/-/ufo-1.5.4.tgz", - "integrity": "sha512-UsUk3byDzKd04EyoZ7U4DOlxQaD14JUKQl6/P7wiX4FNvUfm3XL246n9W5AmqwW5RSFJ27NAuM0iLscAOYUiGQ==", - "dev": true, - "license": "MIT" - }, - "node_modules/@nuxt/vue-renderer": { - "version": "2.18.1", - "resolved": "https://registry.npmjs.org/@nuxt/vue-renderer/-/vue-renderer-2.18.1.tgz", - "integrity": "sha512-Nl8/IbV+sTEWCczHKcjLbZrFO6y5fCcFxZwd6Opatcbr2z380abwpDf3a9UjnVW3wPEM+/xoy1/MBCLY3VmWcw==", - "license": "MIT", - "dependencies": { - "@nuxt/devalue": "^2.0.2", - "@nuxt/utils": "2.18.1", - "consola": "^3.2.3", - "defu": "^6.1.4", - "fs-extra": "^11.2.0", - "lodash": "^4.17.21", - "lru-cache": "^5.1.1", - "ufo": "^1.5.3", - "vue": "^2.7.16", - "vue-meta": "^2.4.0", - "vue-server-renderer": "^2.7.16" - }, - "engines": { - "node": "^14.18.0 || >=16.10.0" - } - }, - "node_modules/@nuxt/vue-renderer/node_modules/consola": { - "version": "3.2.3", - "resolved": "https://registry.npmjs.org/consola/-/consola-3.2.3.tgz", - "integrity": "sha512-I5qxpzLv+sJhTVEoLYNcTW+bThDCPsit0vLNKShZx6rLtpilNpmmeTPaeqJb9ZE9dV3DGaeby6Vuhrw38WjeyQ==", - "license": "MIT", - "engines": { - "node": "^14.18.0 || >=16.10.0" - } - }, - "node_modules/@nuxt/vue-renderer/node_modules/defu": { - "version": "6.1.4", - "resolved": "https://registry.npmjs.org/defu/-/defu-6.1.4.tgz", - "integrity": "sha512-mEQCMmwJu317oSz8CwdIOdwf3xMif1ttiM8LTufzc3g6kR+9Pe236twL8j3IYT1F7GfRgGcW6MWxzZjLIkuHIg==", - "license": "MIT" - }, - "node_modules/@nuxt/vue-renderer/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==", - "license": "MIT", - "dependencies": { - "graceful-fs": "^4.2.0", - "jsonfile": "^6.0.1", - "universalify": "^2.0.0" - }, - "engines": { - "node": ">=14.14" - } - }, - "node_modules/@nuxt/vue-renderer/node_modules/jsonfile": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.1.0.tgz", - "integrity": "sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==", - "license": "MIT", - "dependencies": { - "universalify": "^2.0.0" - }, - "optionalDependencies": { - "graceful-fs": "^4.1.6" - } - }, - "node_modules/@nuxt/vue-renderer/node_modules/lru-cache": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-5.1.1.tgz", - "integrity": "sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==", - "license": "ISC", - "dependencies": { - "yallist": "^3.0.2" - } - }, - "node_modules/@nuxt/vue-renderer/node_modules/ufo": { - "version": "1.5.4", - "resolved": "https://registry.npmjs.org/ufo/-/ufo-1.5.4.tgz", - "integrity": "sha512-UsUk3byDzKd04EyoZ7U4DOlxQaD14JUKQl6/P7wiX4FNvUfm3XL246n9W5AmqwW5RSFJ27NAuM0iLscAOYUiGQ==", - "license": "MIT" - }, - "node_modules/@nuxt/vue-renderer/node_modules/universalify": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.1.tgz", - "integrity": "sha512-gptHNQghINnc/vTGIk0SOFGFNXw7JVrlRUtConJRlvaw6DuX0wO5Jeko9sWrMBhh+PsYAZ7oXAiOnf/UKogyiw==", - "license": "MIT", - "engines": { - "node": ">= 10.0.0" - } - }, - "node_modules/@nuxt/vue-renderer/node_modules/yallist": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz", - "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==", - "license": "ISC" - }, - "node_modules/@nuxt/webpack": { - "version": "2.18.1", - "resolved": "https://registry.npmjs.org/@nuxt/webpack/-/webpack-2.18.1.tgz", - "integrity": "sha512-6EqbIoheLAJ0E7dfQB5ftOKL4d74N98dFMY3q89QTaoS9VXBFB5D1MLd27WuyfhChmzuHRwHfjaBW8QFdhjwew==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/core": "^7.24.7", - "@nuxt/babel-preset-app": "2.18.1", - "@nuxt/friendly-errors-webpack-plugin": "^2.6.0", - "@nuxt/utils": "2.18.1", - "babel-loader": "^8.3.0", - "cache-loader": "^4.1.0", - "caniuse-lite": "^1.0.30001638", - "consola": "^3.2.3", - "css-loader": "^5.2.7", - "cssnano": "^7.0.3", - "eventsource-polyfill": "^0.9.6", - "extract-css-chunks-webpack-plugin": "^4.10.0", - "file-loader": "^6.2.0", - "glob": "^8.1.0", - "hard-source-webpack-plugin": "^0.13.1", - "hash-sum": "^2.0.0", - "html-webpack-plugin": "^4.5.1", - "lodash": "^4.17.21", - "memfs": "^4.9.3", - "mkdirp": "^0.5.6", - "optimize-css-assets-webpack-plugin": "^6.0.1", - "pify": "^5.0.0", - "pnp-webpack-plugin": "^1.7.0", - "postcss": "^8.4.38", - "postcss-import": "^15.1.0", - "postcss-import-resolver": "^2.0.0", - "postcss-loader": "^4.3.0", - "postcss-preset-env": "^9.5.14", - "postcss-url": "^10.1.3", - "semver": "^7.6.2", - "std-env": "^3.7.0", - "style-resources-loader": "^1.5.0", - "terser-webpack-plugin": "^4.2.3", - "thread-loader": "^3.0.4", - "time-fix-plugin": "^2.0.7", - "ufo": "^1.5.3", - "upath": "^2.0.1", - "url-loader": "^4.1.1", - "vue-loader": "^15.11.1", - "vue-style-loader": "^4.1.3", - "vue-template-compiler": "^2.7.16", - "watchpack": "^2.4.1", - "webpack": "^4.47.0", - "webpack-bundle-analyzer": "^4.10.2", - "webpack-dev-middleware": "^5.3.4", - "webpack-hot-middleware": "^2.26.1", - "webpack-node-externals": "^3.0.0", - "webpackbar": "^6.0.1" - }, - "engines": { - "node": "^14.18.0 || >=16.10.0" - } - }, - "node_modules/@nuxt/webpack/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/@nuxt/webpack/node_modules/consola": { - "version": "3.2.3", - "resolved": "https://registry.npmjs.org/consola/-/consola-3.2.3.tgz", - "integrity": "sha512-I5qxpzLv+sJhTVEoLYNcTW+bThDCPsit0vLNKShZx6rLtpilNpmmeTPaeqJb9ZE9dV3DGaeby6Vuhrw38WjeyQ==", - "dev": true, - "license": "MIT", - "engines": { - "node": "^14.18.0 || >=16.10.0" - } - }, - "node_modules/@nuxt/webpack/node_modules/glob": { - "version": "8.1.0", - "resolved": "https://registry.npmjs.org/glob/-/glob-8.1.0.tgz", - "integrity": "sha512-r8hpEjiQEYlF2QU0df3dS+nxxSIreXQS1qRhMJM0Q5NDdR386C7jb7Hwwod8Fgiuex+k0GFjgft18yvxm5XoCQ==", - "deprecated": "Glob versions prior to v9 are no longer supported", - "dev": true, - "license": "ISC", - "dependencies": { - "fs.realpath": "^1.0.0", - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "^5.0.1", - "once": "^1.3.0" - }, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/@nuxt/webpack/node_modules/minimatch": { - "version": "5.1.6", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-5.1.6.tgz", - "integrity": "sha512-lKwV/1brpG6mBUFHtb7NUmtABCb2WZZmm2wNiOA5hAb8VdCS4B3dtMWyvcoViccwAW/COERjXLt0zP1zXUN26g==", - "dev": true, - "license": "ISC", - "dependencies": { - "brace-expansion": "^2.0.1" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/@nuxt/webpack/node_modules/mkdirp": { - "version": "0.5.6", - "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.6.tgz", - "integrity": "sha512-FP+p8RB8OWpF3YZBCrP5gtADmtXApB5AMLn+vdyA+PyxCjrCs00mjyUozssO33cwDeT3wNGdLxJ5M//YqtHAJw==", - "dev": true, - "license": "MIT", - "dependencies": { - "minimist": "^1.2.6" - }, - "bin": { - "mkdirp": "bin/cmd.js" - } - }, - "node_modules/@nuxt/webpack/node_modules/semver": { - "version": "7.6.3", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.3.tgz", - "integrity": "sha512-oVekP1cKtI+CTDvHWYFUcMtsK/00wmAEfyqKfNdARm8u1wNVhSgaX7A8d4UuIlUI5e84iEwOhs7ZPYRmzU9U6A==", - "dev": true, - "license": "ISC", - "bin": { - "semver": "bin/semver.js" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/@nuxt/webpack/node_modules/ufo": { - "version": "1.5.4", - "resolved": "https://registry.npmjs.org/ufo/-/ufo-1.5.4.tgz", - "integrity": "sha512-UsUk3byDzKd04EyoZ7U4DOlxQaD14JUKQl6/P7wiX4FNvUfm3XL246n9W5AmqwW5RSFJ27NAuM0iLscAOYUiGQ==", - "dev": true, - "license": "MIT" - }, - "node_modules/@nuxtjs/axios": { - "version": "5.13.6", - "resolved": "https://registry.npmjs.org/@nuxtjs/axios/-/axios-5.13.6.tgz", - "integrity": "sha512-XS+pOE0xsDODs1zAIbo95A0LKlilvJi8YW0NoXYuq3/jjxGgWDxizZ6Yx0AIIjZOoGsXJOPc0/BcnSEUQ2mFBA==", - "license": "MIT", - "dependencies": { - "@nuxtjs/proxy": "^2.1.0", - "axios": "^0.21.1", - "axios-retry": "^3.1.9", - "consola": "^2.15.3", - "defu": "^5.0.0" - } - }, - "node_modules/@nuxtjs/axios/node_modules/axios": { - "version": "0.28.1", - "resolved": "https://registry.npmjs.org/axios/-/axios-0.28.1.tgz", - "integrity": "sha512-iUcGA5a7p0mVb4Gm/sy+FSECNkPFT4y7wt6OM/CDpO/OnNCvSs3PoMG8ibrC9jRoGYU0gUK5pXVC4NPXq6lHRQ==", - "license": "MIT", - "dependencies": { - "follow-redirects": "^1.15.0", - "form-data": "^4.0.0", - "proxy-from-env": "^1.1.0" - } - }, - "node_modules/@nuxtjs/google-fonts": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/@nuxtjs/google-fonts/-/google-fonts-1.3.0.tgz", - "integrity": "sha512-xIleOl4nASOzFpJ/+g08ENlYZPdxqGEw6Yx7catNEKft5ZtFtTX8RUTj7y7ctQKpUgJgvujVL/phnP1lMtHg2A==", - "dev": true, - "license": "MIT", - "dependencies": { - "consola": "^2.15.3", - "google-fonts-helper": "^1.2.0" - } - }, - "node_modules/@nuxtjs/i18n": { - "version": "7.3.1", - "resolved": "https://registry.npmjs.org/@nuxtjs/i18n/-/i18n-7.3.1.tgz", - "integrity": "sha512-DZP6xR8zZA1ApcNjLnukH3BhMRCfi3r236epuXVuPWWOObPf5vkp+VamewnPiSU+zs0Age+PbaaIUryFv/6pDA==", - "license": "MIT", - "dependencies": { - "@babel/parser": "^7.18.10", - "@babel/traverse": "^7.18.10", - "@intlify/vue-i18n-extensions": "^1.0.2", - "@intlify/vue-i18n-loader": "^1.1.0", - "@nuxt/utils": "2.x", - "cookie": "^0.5.0", - "devalue": "^2.0.1", - "is-https": "^4.0.0", - "js-cookie": "^3.0.1", - "klona": "^2.0.5", - "lodash.merge": "^4.6.2", - "ufo": "^0.8.5", - "vue-i18n": "^8.27.2" - }, - "engines": { - "node": ">=14.16" - } - }, - "node_modules/@nuxtjs/i18n/node_modules/cookie": { - "version": "0.5.0", - "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.5.0.tgz", - "integrity": "sha512-YZ3GUyn/o8gfKJlnlX7g7xq4gyO6OSuhGPKaaGssGB2qgDUS0gPgtTvoyZLTt9Ab6dC4hfc9dV5arkvc/OCmrw==", - "license": "MIT", - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/@nuxtjs/markdownit": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/@nuxtjs/markdownit/-/markdownit-2.0.0.tgz", - "integrity": "sha512-YAEK/s0IzdWK1L74WKTQSMcvNhGgOW0xIWdu5VMxDo1NkNpm/0CbJZgSPt1JYAnT8r8r6wVQ5SY1v/1MZanPlQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "@nuxtjs/markdownit-loader": "^1.1.1", - "defu": "^3.2.2", - "raw-loader": "^4.0.2" - } - }, - "node_modules/@nuxtjs/markdownit-loader": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/@nuxtjs/markdownit-loader/-/markdownit-loader-1.2.0.tgz", - "integrity": "sha512-D6m4578NavamwD03nOU3H3NkS2zYfFJSMChUczlCGDx05DgAoenY4GdCmML1CnAEH/Cv6Bf230RIwDnD926oyQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "highlight.js": "^10.5.0", - "loader-utils": "^1.1.0", - "markdown-it": "^8.3.1" - } - }, - "node_modules/@nuxtjs/markdownit-loader/node_modules/entities": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/entities/-/entities-1.1.2.tgz", - "integrity": "sha512-f2LZMYl1Fzu7YSBKg+RoROelpOaNrcGmE9AZubeDfrCEia483oW4MI4VyFd5VNHIgQ/7qm1I0wUHK1eJnn2y2w==", - "dev": true, - "license": "BSD-2-Clause" - }, - "node_modules/@nuxtjs/markdownit-loader/node_modules/linkify-it": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/linkify-it/-/linkify-it-2.2.0.tgz", - "integrity": "sha512-GnAl/knGn+i1U/wjBz3akz2stz+HrHLsxMwHQGofCDfPvlf+gDKN58UtfmUquTY4/MXeE2x7k19KQmeoZi94Iw==", - "dev": true, - "license": "MIT", - "dependencies": { - "uc.micro": "^1.0.1" - } - }, - "node_modules/@nuxtjs/markdownit-loader/node_modules/markdown-it": { - "version": "8.4.2", - "resolved": "https://registry.npmjs.org/markdown-it/-/markdown-it-8.4.2.tgz", - "integrity": "sha512-GcRz3AWTqSUphY3vsUqQSFMbgR38a4Lh3GWlHRh/7MRwz8mcu9n2IO7HOh+bXHrR9kOPDl5RNCaEsrneb+xhHQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "argparse": "^1.0.7", - "entities": "~1.1.1", - "linkify-it": "^2.0.0", - "mdurl": "^1.0.1", - "uc.micro": "^1.0.5" - }, - "bin": { - "markdown-it": "bin/markdown-it.js" - } - }, - "node_modules/@nuxtjs/markdownit/node_modules/defu": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/defu/-/defu-3.2.2.tgz", - "integrity": "sha512-8UWj5lNv7HD+kB0e9w77Z7TdQlbUYDVWqITLHNqFIn6khrNHv5WQo38Dcm1f6HeNyZf0U7UbPf6WeZDSdCzGDQ==", - "dev": true, - "license": "MIT" - }, - "node_modules/@nuxtjs/proxy": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/@nuxtjs/proxy/-/proxy-2.1.0.tgz", - "integrity": "sha512-/qtoeqXgZ4Mg6LRg/gDUZQrFpOlOdHrol/vQYMnKu3aN3bP90UfOUB3QSDghUUK7OISAJ0xp8Ld78aHyCTcKCQ==", - "license": "MIT", - "dependencies": { - "http-proxy-middleware": "^1.0.6" - } - }, - "node_modules/@nuxtjs/vuetify": { - "version": "1.12.3", - "resolved": "https://registry.npmjs.org/@nuxtjs/vuetify/-/vuetify-1.12.3.tgz", - "integrity": "sha512-6uVL3cfESMB00eVjJTNkyU4jvuPTGPn1yteo7lQTH6v+fxHcPaOgvzVYHIKSHIz1DecuOiB5c9b+YjsRP5+C8A==", - "dev": true, - "license": "MIT", - "dependencies": { - "deepmerge": "^4.2.2", - "sass": "~1.32.13", - "sass-loader": "^10.2.0", - "vuetify": "^2.6", - "vuetify-loader": "^1.7.3" - } - }, - "node_modules/@nuxtjs/youch": { - "version": "4.2.3", - "resolved": "https://registry.npmjs.org/@nuxtjs/youch/-/youch-4.2.3.tgz", - "integrity": "sha512-XiTWdadTwtmL/IGkNqbVe+dOlT+IMvcBu7TvKI7plWhVQeBCQ9iKhk3jgvVWFyiwL2yHJDlEwOM5v9oVES5Xmw==", - "license": "MIT", - "dependencies": { - "cookie": "^0.3.1", - "mustache": "^2.3.0", - "stack-trace": "0.0.10" - } - }, - "node_modules/@nuxtjs/youch/node_modules/cookie": { - "version": "0.3.1", - "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.3.1.tgz", - "integrity": "sha512-+IJOX0OqlHCszo2mBUq+SrEbCj6w7Kpffqx60zYbPTFaO4+yYgRjHwcZNpWvaTylDHaV7PPmBHzSecZiMhtPgw==", - "license": "MIT", - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/@one-ini/wasm": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/@one-ini/wasm/-/wasm-0.1.1.tgz", - "integrity": "sha512-XuySG1E38YScSJoMlqovLru4KTUNSjgVTIjyh7qMX6aNN5HY5Ct5LhRJdxO79JtTzKfzV/bnWpz+zquYrISsvw==", - "license": "MIT" - }, - "node_modules/@otplib/core": { - "version": "12.0.1", - "resolved": "https://registry.npmjs.org/@otplib/core/-/core-12.0.1.tgz", - "integrity": "sha512-4sGntwbA/AC+SbPhbsziRiD+jNDdIzsZ3JUyfZwjtKyc/wufl1pnSIaG4Uqx8ymPagujub0o92kgBnB89cuAMA==", - "license": "MIT" - }, - "node_modules/@otplib/plugin-crypto": { - "version": "12.0.1", - "resolved": "https://registry.npmjs.org/@otplib/plugin-crypto/-/plugin-crypto-12.0.1.tgz", - "integrity": "sha512-qPuhN3QrT7ZZLcLCyKOSNhuijUi9G5guMRVrxq63r9YNOxxQjPm59gVxLM+7xGnHnM6cimY57tuKsjK7y9LM1g==", - "license": "MIT", - "dependencies": { - "@otplib/core": "^12.0.1" - } - }, - "node_modules/@otplib/plugin-thirty-two": { - "version": "12.0.1", - "resolved": "https://registry.npmjs.org/@otplib/plugin-thirty-two/-/plugin-thirty-two-12.0.1.tgz", - "integrity": "sha512-MtT+uqRso909UkbrrYpJ6XFjj9D+x2Py7KjTO9JDPhL0bJUYVu5kFP4TFZW4NFAywrAtFRxOVY261u0qwb93gA==", - "license": "MIT", - "dependencies": { - "@otplib/core": "^12.0.1", - "thirty-two": "^1.0.2" - } - }, - "node_modules/@otplib/preset-default": { - "version": "12.0.1", - "resolved": "https://registry.npmjs.org/@otplib/preset-default/-/preset-default-12.0.1.tgz", - "integrity": "sha512-xf1v9oOJRyXfluBhMdpOkr+bsE+Irt+0D5uHtvg6x1eosfmHCsCC6ej/m7FXiWqdo0+ZUI6xSKDhJwc8yfiOPQ==", - "license": "MIT", - "dependencies": { - "@otplib/core": "^12.0.1", - "@otplib/plugin-crypto": "^12.0.1", - "@otplib/plugin-thirty-two": "^12.0.1" - } - }, - "node_modules/@otplib/preset-v11": { - "version": "12.0.1", - "resolved": "https://registry.npmjs.org/@otplib/preset-v11/-/preset-v11-12.0.1.tgz", - "integrity": "sha512-9hSetMI7ECqbFiKICrNa4w70deTUfArtwXykPUvSHWOdzOlfa9ajglu7mNCntlvxycTiOAXkQGwjQCzzDEMRMg==", - "license": "MIT", - "dependencies": { - "@otplib/core": "^12.0.1", - "@otplib/plugin-crypto": "^12.0.1", - "@otplib/plugin-thirty-two": "^12.0.1" - } - }, - "node_modules/@panva/asn1.js": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/@panva/asn1.js/-/asn1.js-1.0.0.tgz", - "integrity": "sha512-UdkG3mLEqXgnlKsWanWcgb6dOjUzJ+XC5f+aWw30qrtjxeNUSfKX1cd5FBzOaXQumoe9nIqeZUvrRJS03HCCtw==", - "license": "MIT", - "engines": { - "node": ">=10.13.0" - } - }, - "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==", - "license": "MIT", - "optional": true, - "engines": { - "node": ">=14" - } - }, - "node_modules/@polka/url": { - "version": "1.0.0-next.28", - "resolved": "https://registry.npmjs.org/@polka/url/-/url-1.0.0-next.28.tgz", - "integrity": "sha512-8LduaNlMZGwdZ6qWrKlfa+2M4gahzFkprZiAt2TF8uS0qQgBizKXpXURqvTJ4WtmupWxaLqjRb2UCTe72mu+Aw==", - "dev": true, - "license": "MIT" - }, - "node_modules/@rtsao/scc": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/@rtsao/scc/-/scc-1.1.0.tgz", - "integrity": "sha512-zt6OdqaDoOnJ1ZYsCYGt9YmWzDXl4vQdKTyJev62gFhRGKdx7mcT54V9KIjg+d2wi9EXsPvAPKe7i7WjfVWB8g==", - "dev": true, - "license": "MIT" - }, - "node_modules/@sideway/address": { - "version": "4.1.5", - "resolved": "https://registry.npmjs.org/@sideway/address/-/address-4.1.5.tgz", - "integrity": "sha512-IqO/DUQHUkPeixNQ8n0JA6102hT9CmaljNTPmQ1u8MEhBo/R4Q8eKLN/vGZxuebwOroDB4cbpjheD4+/sKFK4Q==", - "license": "BSD-3-Clause", - "dependencies": { - "@hapi/hoek": "^9.0.0" - } - }, - "node_modules/@sideway/address/node_modules/@hapi/hoek": { - "version": "9.3.0", - "resolved": "https://registry.npmjs.org/@hapi/hoek/-/hoek-9.3.0.tgz", - "integrity": "sha512-/c6rf4UJlmHlC9b5BaNvzAcFv7HZ2QHaV0D4/HNlBdvFnvQq8RI4kYdhyPCl7Xj+oWvTWQ8ujhqS53LIgAe6KQ==", - "license": "BSD-3-Clause" - }, - "node_modules/@sideway/formula": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/@sideway/formula/-/formula-3.0.1.tgz", - "integrity": "sha512-/poHZJJVjx3L+zVD6g9KgHfYnb443oi7wLu/XKojDviHy6HOEOA6z1Trk5aR1dGcmPenJEgb2sK2I80LeS3MIg==", - "license": "BSD-3-Clause" - }, - "node_modules/@sideway/pinpoint": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/@sideway/pinpoint/-/pinpoint-2.0.0.tgz", - "integrity": "sha512-RNiOoTPkptFtSVzQevY/yWtZwf/RxyVnPy/OcA9HBM3MlGDnBEYL5B41H0MTn0Uec8Hi+2qUtTfG2WWZBmMejQ==", - "license": "BSD-3-Clause" - }, - "node_modules/@sindresorhus/is": { - "version": "4.6.0", - "resolved": "https://registry.npmjs.org/@sindresorhus/is/-/is-4.6.0.tgz", - "integrity": "sha512-t09vSN3MdfsyCHoFcTRCH/iUtG7OJ0CsjzB8cjAmKc/va/kIgeDI/TxsigdncE/4be734m0cvIYwNaV4i2XqAw==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sindresorhus/is?sponsor=1" - } - }, - "node_modules/@szmarczak/http-timer": { - "version": "4.0.6", - "resolved": "https://registry.npmjs.org/@szmarczak/http-timer/-/http-timer-4.0.6.tgz", - "integrity": "sha512-4BAffykYOgO+5nzBWYwE3W90sBgLJoUPRWWcL8wlyiM8IB8ipJz3UMJ9KXQd1RKQXpKp8Tutn80HZtWsu2u76w==", - "dev": true, - "license": "MIT", - "dependencies": { - "defer-to-connect": "^2.0.0" - }, - "engines": { - "node": ">=10" - } - }, - "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/@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==", - "dev": true, - "license": "MIT" - }, - "node_modules/@tsconfig/node12": { - "version": "1.0.11", - "resolved": "https://registry.npmjs.org/@tsconfig/node12/-/node12-1.0.11.tgz", - "integrity": "sha512-cqefuRsh12pWyGsIoBKJA9luFu3mRxCA+ORZvA4ktLSzIuCUtWVxGIuXigEwO5/ywWFMZ2QEGKWvkZG1zDMTag==", - "dev": true, - "license": "MIT" - }, - "node_modules/@tsconfig/node14": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/@tsconfig/node14/-/node14-1.0.3.tgz", - "integrity": "sha512-ysT8mhdixWK6Hw3i1V2AeRqZ5WfXg1G43mqoYlM2nc6388Fq5jcXyr5mRsqViLx/GJYdoL0bfXD8nmF+Zn/Iow==", - "dev": true, - "license": "MIT" - }, - "node_modules/@tsconfig/node16": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/@tsconfig/node16/-/node16-1.0.4.tgz", - "integrity": "sha512-vxhUy4J8lyeyinH7Azl1pdd43GJhZH/tP2weN8TntQblOY+A0XbT8DJk1/oCPuOOyg/Ja757rG0CgHcWC8OfMA==", - "dev": true, - "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==", - "license": "MIT", - "dependencies": { - "@types/connect": "*", - "@types/node": "*" - } - }, - "node_modules/@types/cacheable-request": { - "version": "6.0.3", - "resolved": "https://registry.npmjs.org/@types/cacheable-request/-/cacheable-request-6.0.3.tgz", - "integrity": "sha512-IQ3EbTzGxIigb1I3qPZc1rWJnH0BmSKv5QYTalEwweFvyBDLSAe24zP0le/hyi7ecGfZVlIVAg4BZqb8WBwKqw==", - "dev": true, - "license": "MIT", - "dependencies": { - "@types/http-cache-semantics": "*", - "@types/keyv": "^3.1.4", - "@types/node": "*", - "@types/responselike": "^1.0.0" - } - }, - "node_modules/@types/connect": { - "version": "3.4.38", - "resolved": "https://registry.npmjs.org/@types/connect/-/connect-3.4.38.tgz", - "integrity": "sha512-K6uROf1LD88uDQqJCktA4yzL1YYAK6NgfsI0v/mTgyPKWsX1CnJ0XPSDhViejru1GcRkLWb8RlzFYJRqGUbaug==", - "license": "MIT", - "dependencies": { - "@types/node": "*" - } - }, - "node_modules/@types/cookie": { - "version": "0.3.3", - "resolved": "https://registry.npmjs.org/@types/cookie/-/cookie-0.3.3.tgz", - "integrity": "sha512-LKVP3cgXBT9RYj+t+9FDKwS5tdI+rPBXaNSkma7hvqy35lc7mAokC2zsqWJH0LaqIt3B962nuYI77hsJoT1gow==", - "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==", - "license": "MIT", - "dependencies": { - "@types/body-parser": "*", - "@types/express-serve-static-core": "^4.17.33", - "@types/qs": "*", - "@types/serve-static": "*" - } - }, - "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==", - "license": "MIT", - "dependencies": { - "@types/node": "*", - "@types/qs": "*", - "@types/range-parser": "*", - "@types/send": "*" - } - }, - "node_modules/@types/glob": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/@types/glob/-/glob-7.2.0.tgz", - "integrity": "sha512-ZUxbzKl0IfJILTS6t7ip5fQQM/J3TJYubDm3nMbgubNNYS62eXeUpoLUC8/7fJNiFYHTrGPQn7hspDUzIHX3UA==", - "license": "MIT", - "dependencies": { - "@types/minimatch": "*", - "@types/node": "*" - } - }, - "node_modules/@types/html-minifier-terser": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/@types/html-minifier-terser/-/html-minifier-terser-5.1.2.tgz", - "integrity": "sha512-h4lTMgMJctJybDp8CQrxTUiiYmedihHWkjnF/8Pxseu2S6Nlfcy8kwboQ8yejh456rP2yWoEVm1sS/FVsfM48w==", - "dev": true, - "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==", - "dev": true, - "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==", - "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==", - "license": "MIT", - "dependencies": { - "@types/node": "*" - } - }, - "node_modules/@types/json-schema": { - "version": "7.0.15", - "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.15.tgz", - "integrity": "sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA==", - "license": "MIT" - }, - "node_modules/@types/json5": { - "version": "0.0.29", - "resolved": "https://registry.npmjs.org/@types/json5/-/json5-0.0.29.tgz", - "integrity": "sha512-dRLjCWHYg4oaA77cxO64oO+7JwCwnIzkZPdrrC71jQmQtlhM556pwKo5bUzqvZndkVbeFLIIi+9TC40JNF5hNQ==", - "dev": true, - "license": "MIT" - }, - "node_modules/@types/jsonwebtoken": { - "version": "9.0.7", - "resolved": "https://registry.npmjs.org/@types/jsonwebtoken/-/jsonwebtoken-9.0.7.tgz", - "integrity": "sha512-ugo316mmTYBl2g81zDFnZ7cfxlut3o+/EQdaP7J8QN2kY6lJ22hmQYCK5EHcJHbrW+dkCGSCPgbG8JtYj6qSrg==", - "license": "MIT", - "dependencies": { - "@types/node": "*" - } - }, - "node_modules/@types/keyv": { - "version": "3.1.4", - "resolved": "https://registry.npmjs.org/@types/keyv/-/keyv-3.1.4.tgz", - "integrity": "sha512-BQ5aZNSCpj7D6K2ksrRCTmKRLEpnPvWDiLPfoGyhZ++8YtiK9d/3DBKPJgry359X/P1PfruyYwvnvwFjuEiEIg==", - "dev": true, - "license": "MIT", - "dependencies": { - "@types/node": "*" - } - }, - "node_modules/@types/lodash": { - "version": "4.17.13", - "resolved": "https://registry.npmjs.org/@types/lodash/-/lodash-4.17.13.tgz", - "integrity": "sha512-lfx+dftrEZcdBPczf9d0Qv0x+j/rfNCMuC6OcfXmO8gkfeNAY88PgKUbvG56whcN23gc27yenwF6oJZXGFpYxg==", - "license": "MIT" - }, - "node_modules/@types/mime": { - "version": "1.3.5", - "resolved": "https://registry.npmjs.org/@types/mime/-/mime-1.3.5.tgz", - "integrity": "sha512-/pyBZWSLD2n0dcHE3hq8s8ZvcETHtEuF+3E7XVt0Ig2nvsVQXdghHVcEkIWjy9A0wKfTn97a/PSDYohKIlnP/w==", - "license": "MIT" - }, - "node_modules/@types/minimatch": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/@types/minimatch/-/minimatch-5.1.2.tgz", - "integrity": "sha512-K0VQKziLUWkVKiRVrx4a40iPaxTUefQmjtkQofBkYRcoaaL/8rhwDWww9qWbrgicNOgnpIsMxyNIUM4+n6dUIA==", - "license": "MIT" - }, - "node_modules/@types/minimist": { - "version": "1.2.5", - "resolved": "https://registry.npmjs.org/@types/minimist/-/minimist-1.2.5.tgz", - "integrity": "sha512-hov8bUuiLiyFPGyFPE1lwWhmzYbirOXQNNo40+y3zow8aFVTeyn3VWL0VFFfdNddA8S4Vf0Tc062rzyNr7Paag==", - "dev": true, - "license": "MIT" - }, - "node_modules/@types/node": { - "version": "20.5.1", - "resolved": "https://registry.npmjs.org/@types/node/-/node-20.5.1.tgz", - "integrity": "sha512-4tT2UrL5LBqDwoed9wZ6N3umC4Yhz3W3FloMmiiG4JwmUJWpie0c7lcnUNd4gtMKuDEO4wRVS8B6Xa0uMRsMKg==", - "license": "MIT" - }, - "node_modules/@types/normalize-package-data": { - "version": "2.4.4", - "resolved": "https://registry.npmjs.org/@types/normalize-package-data/-/normalize-package-data-2.4.4.tgz", - "integrity": "sha512-37i+OaWTh9qeK4LSHPsyRC7NahnGotNuZvjLSgcPzblpHB3rrCJxAOgI5gCdKm7coonsaX1Of0ILiTcnZjbfxA==", - "dev": true, - "license": "MIT" - }, - "node_modules/@types/parse-json": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/@types/parse-json/-/parse-json-4.0.2.tgz", - "integrity": "sha512-dISoDXWWQwUquiKsyZ4Ng+HX2KsPL7LyHKHQwgGFEA3IaKac4Obd+h2a/a6waisAoepJlBcx9paWqjA8/HVjCw==", - "dev": true, - "license": "MIT" - }, - "node_modules/@types/prettier": { - "version": "2.7.3", - "resolved": "https://registry.npmjs.org/@types/prettier/-/prettier-2.7.3.tgz", - "integrity": "sha512-+68kP9yzs4LMp7VNh8gdzMSPZFL44MLGqiHWvttYJe+6qnuVr4Ek9wSBQoveqY/r+LwjCcU29kNVkidwim+kYA==", - "license": "MIT" - }, - "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==", - "license": "MIT" - }, - "node_modules/@types/range-parser": { - "version": "1.2.7", - "resolved": "https://registry.npmjs.org/@types/range-parser/-/range-parser-1.2.7.tgz", - "integrity": "sha512-hKormJbkJqzQGhziax5PItDUTMAM9uE2XXQmM37dyd4hVM+5aVl7oVxMVUiVQn2oCQFN/LKCZdvSM0pFRqbSmQ==", - "license": "MIT" - }, - "node_modules/@types/responselike": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/@types/responselike/-/responselike-1.0.3.tgz", - "integrity": "sha512-H/+L+UkTV33uf49PH5pCAUBVPNj2nDBXTN+qS1dOwyyg24l3CcicicCA7ca+HMvJBZcFgl5r8e+RR6elsb4Lyw==", - "dev": true, - "license": "MIT", - "dependencies": { - "@types/node": "*" - } - }, - "node_modules/@types/send": { - "version": "0.17.4", - "resolved": "https://registry.npmjs.org/@types/send/-/send-0.17.4.tgz", - "integrity": "sha512-x2EM6TJOybec7c52BX0ZspPodMsQUd5L6PRwOunVyVUhXiBSKf3AezDL8Dgvgt5o0UfKNfuA0eMLr2wLT4AiBA==", - "license": "MIT", - "dependencies": { - "@types/mime": "^1", - "@types/node": "*" - } - }, - "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==", - "license": "MIT", - "dependencies": { - "@types/http-errors": "*", - "@types/node": "*", - "@types/send": "*" - } - }, - "node_modules/@types/source-list-map": { - "version": "0.1.6", - "resolved": "https://registry.npmjs.org/@types/source-list-map/-/source-list-map-0.1.6.tgz", - "integrity": "sha512-5JcVt1u5HDmlXkwOD2nslZVllBBc7HDuOICfiZah2Z0is8M8g+ddAEawbmd3VjedfDHBzxCaXLs07QEmb7y54g==", - "dev": true, - "license": "MIT" - }, - "node_modules/@types/tapable": { - "version": "1.0.12", - "resolved": "https://registry.npmjs.org/@types/tapable/-/tapable-1.0.12.tgz", - "integrity": "sha512-bTHG8fcxEqv1M9+TD14P8ok8hjxoOCkfKc8XXLaaD05kI7ohpeI956jtDOD3XHKBQrlyPughUtzm1jtVhHpA5Q==", - "dev": true, - "license": "MIT" - }, - "node_modules/@types/uglify-js": { - "version": "3.17.5", - "resolved": "https://registry.npmjs.org/@types/uglify-js/-/uglify-js-3.17.5.tgz", - "integrity": "sha512-TU+fZFBTBcXj/GpDpDaBmgWk/gn96kMZ+uocaFUlV2f8a6WdMzzI44QBCmGcCiYR0Y6ZlNRiyUyKKt5nl/lbzQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "source-map": "^0.6.1" - } - }, - "node_modules/@types/webidl-conversions": { - "version": "7.0.3", - "resolved": "https://registry.npmjs.org/@types/webidl-conversions/-/webidl-conversions-7.0.3.tgz", - "integrity": "sha512-CiJJvcRtIgzadHCYXw7dqEnMNRjhGZlYK05Mj9OyktqV8uVT8fD2BFOB7S1uwBE3Kj2Z+4UyPmFw/Ixgw/LAlA==", - "license": "MIT" - }, - "node_modules/@types/webpack": { - "version": "4.41.40", - "resolved": "https://registry.npmjs.org/@types/webpack/-/webpack-4.41.40.tgz", - "integrity": "sha512-u6kMFSBM9HcoTpUXnL6mt2HSzftqb3JgYV6oxIgL2dl6sX6aCa5k6SOkzv5DuZjBTPUE/dJltKtwwuqrkZHpfw==", - "dev": true, - "license": "MIT", - "dependencies": { - "@types/node": "*", - "@types/tapable": "^1", - "@types/uglify-js": "*", - "@types/webpack-sources": "*", - "anymatch": "^3.0.0", - "source-map": "^0.6.0" - } - }, - "node_modules/@types/webpack-sources": { - "version": "3.2.3", - "resolved": "https://registry.npmjs.org/@types/webpack-sources/-/webpack-sources-3.2.3.tgz", - "integrity": "sha512-4nZOdMwSPHZ4pTEZzSp0AsTM4K7Qmu40UKW4tJDiOVs20UzYF9l+qUe4s0ftfN0pin06n+5cWWDJXH+sbhAiDw==", - "dev": true, - "license": "MIT", - "dependencies": { - "@types/node": "*", - "@types/source-list-map": "*", - "source-map": "^0.7.3" - } - }, - "node_modules/@types/webpack-sources/node_modules/source-map": { - "version": "0.7.4", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.7.4.tgz", - "integrity": "sha512-l3BikUxvPOcn5E74dZiq5BGsTb5yEwhaTSzccU6t4sDOH8NWJCstKO5QT2CvtFoK6F0saL7p9xHAqHOlCPJygA==", - "dev": true, - "license": "BSD-3-Clause", - "engines": { - "node": ">= 8" - } - }, - "node_modules/@types/whatwg-url": { - "version": "8.2.2", - "resolved": "https://registry.npmjs.org/@types/whatwg-url/-/whatwg-url-8.2.2.tgz", - "integrity": "sha512-FtQu10RWgn3D9U4aazdwIE2yzphmTJREDqNdODHrbrZmmMqI0vMheC/6NE/J1Yveaj8H+ela+YwWTjq5PGmuhA==", - "license": "MIT", - "dependencies": { - "@types/node": "*", - "@types/webidl-conversions": "*" - } - }, - "node_modules/@ungap/promise-all-settled": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/@ungap/promise-all-settled/-/promise-all-settled-1.1.2.tgz", - "integrity": "sha512-sL/cEvJWAnClXw0wHk85/2L0G6Sj8UB0Ctc1TEMbKSsmpRosqhwj9gWgFRZSrBr2f9tiXISwNhCPmlfqUqyb9Q==", - "dev": true, - "license": "ISC" - }, - "node_modules/@vue/babel-helper-vue-jsx-merge-props": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/@vue/babel-helper-vue-jsx-merge-props/-/babel-helper-vue-jsx-merge-props-1.4.0.tgz", - "integrity": "sha512-JkqXfCkUDp4PIlFdDQ0TdXoIejMtTHP67/pvxlgeY+u5k3LEdKuWZ3LK6xkxo52uDoABIVyRwqVkfLQJhk7VBA==", - "dev": true, - "license": "MIT" - }, - "node_modules/@vue/babel-plugin-transform-vue-jsx": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/@vue/babel-plugin-transform-vue-jsx/-/babel-plugin-transform-vue-jsx-1.4.0.tgz", - "integrity": "sha512-Fmastxw4MMx0vlgLS4XBX0XiBbUFzoMGeVXuMV08wyOfXdikAFqBTuYPR0tlk+XskL19EzHc39SgjrPGY23JnA==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/helper-module-imports": "^7.0.0", - "@babel/plugin-syntax-jsx": "^7.2.0", - "@vue/babel-helper-vue-jsx-merge-props": "^1.4.0", - "html-tags": "^2.0.0", - "lodash.kebabcase": "^4.1.1", - "svg-tags": "^1.0.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@vue/babel-preset-jsx": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/@vue/babel-preset-jsx/-/babel-preset-jsx-1.4.0.tgz", - "integrity": "sha512-QmfRpssBOPZWL5xw7fOuHNifCQcNQC1PrOo/4fu6xlhlKJJKSA3HqX92Nvgyx8fqHZTUGMPHmFA+IDqwXlqkSA==", - "dev": true, - "license": "MIT", - "dependencies": { - "@vue/babel-helper-vue-jsx-merge-props": "^1.4.0", - "@vue/babel-plugin-transform-vue-jsx": "^1.4.0", - "@vue/babel-sugar-composition-api-inject-h": "^1.4.0", - "@vue/babel-sugar-composition-api-render-instance": "^1.4.0", - "@vue/babel-sugar-functional-vue": "^1.4.0", - "@vue/babel-sugar-inject-h": "^1.4.0", - "@vue/babel-sugar-v-model": "^1.4.0", - "@vue/babel-sugar-v-on": "^1.4.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0", - "vue": "*" - }, - "peerDependenciesMeta": { - "vue": { - "optional": true - } - } - }, - "node_modules/@vue/babel-sugar-composition-api-inject-h": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/@vue/babel-sugar-composition-api-inject-h/-/babel-sugar-composition-api-inject-h-1.4.0.tgz", - "integrity": "sha512-VQq6zEddJHctnG4w3TfmlVp5FzDavUSut/DwR0xVoe/mJKXyMcsIibL42wPntozITEoY90aBV0/1d2KjxHU52g==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/plugin-syntax-jsx": "^7.2.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@vue/babel-sugar-composition-api-render-instance": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/@vue/babel-sugar-composition-api-render-instance/-/babel-sugar-composition-api-render-instance-1.4.0.tgz", - "integrity": "sha512-6ZDAzcxvy7VcnCjNdHJ59mwK02ZFuP5CnucloidqlZwVQv5CQLijc3lGpR7MD3TWFi78J7+a8J56YxbCtHgT9Q==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/plugin-syntax-jsx": "^7.2.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@vue/babel-sugar-functional-vue": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/@vue/babel-sugar-functional-vue/-/babel-sugar-functional-vue-1.4.0.tgz", - "integrity": "sha512-lTEB4WUFNzYt2In6JsoF9sAYVTo84wC4e+PoZWSgM6FUtqRJz7wMylaEhSRgG71YF+wfLD6cc9nqVeXN2rwBvw==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/plugin-syntax-jsx": "^7.2.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@vue/babel-sugar-inject-h": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/@vue/babel-sugar-inject-h/-/babel-sugar-inject-h-1.4.0.tgz", - "integrity": "sha512-muwWrPKli77uO2fFM7eA3G1lAGnERuSz2NgAxuOLzrsTlQl8W4G+wwbM4nB6iewlKbwKRae3nL03UaF5ffAPMA==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/plugin-syntax-jsx": "^7.2.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@vue/babel-sugar-v-model": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/@vue/babel-sugar-v-model/-/babel-sugar-v-model-1.4.0.tgz", - "integrity": "sha512-0t4HGgXb7WHYLBciZzN5s0Hzqan4Ue+p/3FdQdcaHAb7s5D9WZFGoSxEZHrR1TFVZlAPu1bejTKGeAzaaG3NCQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/plugin-syntax-jsx": "^7.2.0", - "@vue/babel-helper-vue-jsx-merge-props": "^1.4.0", - "@vue/babel-plugin-transform-vue-jsx": "^1.4.0", - "camelcase": "^5.0.0", - "html-tags": "^2.0.0", - "svg-tags": "^1.0.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@vue/babel-sugar-v-on": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/@vue/babel-sugar-v-on/-/babel-sugar-v-on-1.4.0.tgz", - "integrity": "sha512-m+zud4wKLzSKgQrWwhqRObWzmTuyzl6vOP7024lrpeJM4x2UhQtRDLgYjXAw9xBXjCwS0pP9kXjg91F9ZNo9JA==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/plugin-syntax-jsx": "^7.2.0", - "@vue/babel-plugin-transform-vue-jsx": "^1.4.0", - "camelcase": "^5.0.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@vue/compiler-sfc": { - "version": "2.7.16", - "resolved": "https://registry.npmjs.org/@vue/compiler-sfc/-/compiler-sfc-2.7.16.tgz", - "integrity": "sha512-KWhJ9k5nXuNtygPU7+t1rX6baZeqOYLEforUPjgNDBnLicfHCoi48H87Q8XyLZOrNNsmhuwKqtpDQWjEFe6Ekg==", - "dependencies": { - "@babel/parser": "^7.23.5", - "postcss": "^8.4.14", - "source-map": "^0.6.1" - }, - "optionalDependencies": { - "prettier": "^1.18.2 || ^2.0.0" - } - }, - "node_modules/@vue/component-compiler-utils": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/@vue/component-compiler-utils/-/component-compiler-utils-3.3.0.tgz", - "integrity": "sha512-97sfH2mYNU+2PzGrmK2haqffDpVASuib9/w2/noxiFi31Z54hW+q3izKQXXQZSNhtiUpAI36uSuYepeBe4wpHQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "consolidate": "^0.15.1", - "hash-sum": "^1.0.2", - "lru-cache": "^4.1.2", - "merge-source-map": "^1.1.0", - "postcss": "^7.0.36", - "postcss-selector-parser": "^6.0.2", - "source-map": "~0.6.1", - "vue-template-es2015-compiler": "^1.9.0" - }, - "optionalDependencies": { - "prettier": "^1.18.2 || ^2.0.0" - } - }, - "node_modules/@vue/component-compiler-utils/node_modules/hash-sum": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/hash-sum/-/hash-sum-1.0.2.tgz", - "integrity": "sha512-fUs4B4L+mlt8/XAtSOGMUO1TXmAelItBPtJG7CyHJfYTdDjwisntGO2JQz7oUsatOY9o68+57eziUVNw/mRHmA==", - "dev": true, - "license": "MIT" - }, - "node_modules/@vue/component-compiler-utils/node_modules/lru-cache": { - "version": "4.1.5", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-4.1.5.tgz", - "integrity": "sha512-sWZlbEP2OsHNkXrMl5GYk/jKk70MBng6UU4YI/qGDYbgf6YbP4EvmqISbXCoJiRKs+1bSpFHVgQxvJ17F2li5g==", - "dev": true, - "license": "ISC", - "dependencies": { - "pseudomap": "^1.0.2", - "yallist": "^2.1.2" - } - }, - "node_modules/@vue/component-compiler-utils/node_modules/picocolors": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-0.2.1.tgz", - "integrity": "sha512-cMlDqaLEqfSaW8Z7N5Jw+lyIW869EzT73/F5lhtY9cLGoVxSXznfgfXMO0Z5K0o0Q2TkTXq+0KFsdnSe3jDViA==", - "dev": true, - "license": "ISC" - }, - "node_modules/@vue/component-compiler-utils/node_modules/postcss": { - "version": "7.0.39", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.39.tgz", - "integrity": "sha512-yioayjNbHn6z1/Bywyb2Y4s3yvDAeXGOyxqD+LnVOinq6Mdmd++SW2wUNVzavyyHxd6+DxzWGIuosg6P1Rj8uA==", - "dev": true, - "license": "MIT", - "dependencies": { - "picocolors": "^0.2.1", - "source-map": "^0.6.1" - }, - "engines": { - "node": ">=6.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/postcss/" - } - }, - "node_modules/@vue/component-compiler-utils/node_modules/yallist": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-2.1.2.tgz", - "integrity": "sha512-ncTzHV7NvsQZkYe1DW7cbDLm0YpzHmZF5r/iyP3ZnQtMiJ+pjzisCiMNI+Sj+xQF5pXhSHxSB3uDbsBTzY/c2A==", - "dev": true, - "license": "ISC" - }, - "node_modules/@webassemblyjs/ast": { - "version": "1.9.0", - "resolved": "https://registry.npmjs.org/@webassemblyjs/ast/-/ast-1.9.0.tgz", - "integrity": "sha512-C6wW5L+b7ogSDVqymbkkvuW9kruN//YisMED04xzeBBqjHa2FYnmvOlS6Xj68xWQRgWvI9cIglsjFowH/RJyEA==", - "dev": true, - "license": "MIT", - "dependencies": { - "@webassemblyjs/helper-module-context": "1.9.0", - "@webassemblyjs/helper-wasm-bytecode": "1.9.0", - "@webassemblyjs/wast-parser": "1.9.0" - } - }, - "node_modules/@webassemblyjs/floating-point-hex-parser": { - "version": "1.9.0", - "resolved": "https://registry.npmjs.org/@webassemblyjs/floating-point-hex-parser/-/floating-point-hex-parser-1.9.0.tgz", - "integrity": "sha512-TG5qcFsS8QB4g4MhrxK5TqfdNe7Ey/7YL/xN+36rRjl/BlGE/NcBvJcqsRgCP6Z92mRE+7N50pRIi8SmKUbcQA==", - "dev": true, - "license": "MIT" - }, - "node_modules/@webassemblyjs/helper-api-error": { - "version": "1.9.0", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-api-error/-/helper-api-error-1.9.0.tgz", - "integrity": "sha512-NcMLjoFMXpsASZFxJ5h2HZRcEhDkvnNFOAKneP5RbKRzaWJN36NC4jqQHKwStIhGXu5mUWlUUk7ygdtrO8lbmw==", - "dev": true, - "license": "MIT" - }, - "node_modules/@webassemblyjs/helper-buffer": { - "version": "1.9.0", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-buffer/-/helper-buffer-1.9.0.tgz", - "integrity": "sha512-qZol43oqhq6yBPx7YM3m9Bv7WMV9Eevj6kMi6InKOuZxhw+q9hOkvq5e/PpKSiLfyetpaBnogSbNCfBwyB00CA==", - "dev": true, - "license": "MIT" - }, - "node_modules/@webassemblyjs/helper-code-frame": { - "version": "1.9.0", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-code-frame/-/helper-code-frame-1.9.0.tgz", - "integrity": "sha512-ERCYdJBkD9Vu4vtjUYe8LZruWuNIToYq/ME22igL+2vj2dQ2OOujIZr3MEFvfEaqKoVqpsFKAGsRdBSBjrIvZA==", - "dev": true, - "license": "MIT", - "dependencies": { - "@webassemblyjs/wast-printer": "1.9.0" - } - }, - "node_modules/@webassemblyjs/helper-fsm": { - "version": "1.9.0", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-fsm/-/helper-fsm-1.9.0.tgz", - "integrity": "sha512-OPRowhGbshCb5PxJ8LocpdX9Kl0uB4XsAjl6jH/dWKlk/mzsANvhwbiULsaiqT5GZGT9qinTICdj6PLuM5gslw==", - "dev": true, - "license": "ISC" - }, - "node_modules/@webassemblyjs/helper-module-context": { - "version": "1.9.0", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-module-context/-/helper-module-context-1.9.0.tgz", - "integrity": "sha512-MJCW8iGC08tMk2enck1aPW+BE5Cw8/7ph/VGZxwyvGbJwjktKkDK7vy7gAmMDx88D7mhDTCNKAW5tED+gZ0W8g==", - "dev": true, - "license": "MIT", - "dependencies": { - "@webassemblyjs/ast": "1.9.0" - } - }, - "node_modules/@webassemblyjs/helper-wasm-bytecode": { - "version": "1.9.0", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-bytecode/-/helper-wasm-bytecode-1.9.0.tgz", - "integrity": "sha512-R7FStIzyNcd7xKxCZH5lE0Bqy+hGTwS3LJjuv1ZVxd9O7eHCedSdrId/hMOd20I+v8wDXEn+bjfKDLzTepoaUw==", - "dev": true, - "license": "MIT" - }, - "node_modules/@webassemblyjs/helper-wasm-section": { - "version": "1.9.0", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-section/-/helper-wasm-section-1.9.0.tgz", - "integrity": "sha512-XnMB8l3ek4tvrKUUku+IVaXNHz2YsJyOOmz+MMkZvh8h1uSJpSen6vYnw3IoQ7WwEuAhL8Efjms1ZWjqh2agvw==", - "dev": true, - "license": "MIT", - "dependencies": { - "@webassemblyjs/ast": "1.9.0", - "@webassemblyjs/helper-buffer": "1.9.0", - "@webassemblyjs/helper-wasm-bytecode": "1.9.0", - "@webassemblyjs/wasm-gen": "1.9.0" - } - }, - "node_modules/@webassemblyjs/ieee754": { - "version": "1.9.0", - "resolved": "https://registry.npmjs.org/@webassemblyjs/ieee754/-/ieee754-1.9.0.tgz", - "integrity": "sha512-dcX8JuYU/gvymzIHc9DgxTzUUTLexWwt8uCTWP3otys596io0L5aW02Gb1RjYpx2+0Jus1h4ZFqjla7umFniTg==", - "dev": true, - "license": "MIT", - "dependencies": { - "@xtuc/ieee754": "^1.2.0" - } - }, - "node_modules/@webassemblyjs/leb128": { - "version": "1.9.0", - "resolved": "https://registry.npmjs.org/@webassemblyjs/leb128/-/leb128-1.9.0.tgz", - "integrity": "sha512-ENVzM5VwV1ojs9jam6vPys97B/S65YQtv/aanqnU7D8aSoHFX8GyhGg0CMfyKNIHBuAVjy3tlzd5QMMINa7wpw==", - "dev": true, - "license": "MIT", - "dependencies": { - "@xtuc/long": "4.2.2" - } - }, - "node_modules/@webassemblyjs/utf8": { - "version": "1.9.0", - "resolved": "https://registry.npmjs.org/@webassemblyjs/utf8/-/utf8-1.9.0.tgz", - "integrity": "sha512-GZbQlWtopBTP0u7cHrEx+73yZKrQoBMpwkGEIqlacljhXCkVM1kMQge/Mf+csMJAjEdSwhOyLAS0AoR3AG5P8w==", - "dev": true, - "license": "MIT" - }, - "node_modules/@webassemblyjs/wasm-edit": { - "version": "1.9.0", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-edit/-/wasm-edit-1.9.0.tgz", - "integrity": "sha512-FgHzBm80uwz5M8WKnMTn6j/sVbqilPdQXTWraSjBwFXSYGirpkSWE2R9Qvz9tNiTKQvoKILpCuTjBKzOIm0nxw==", - "dev": true, - "license": "MIT", - "dependencies": { - "@webassemblyjs/ast": "1.9.0", - "@webassemblyjs/helper-buffer": "1.9.0", - "@webassemblyjs/helper-wasm-bytecode": "1.9.0", - "@webassemblyjs/helper-wasm-section": "1.9.0", - "@webassemblyjs/wasm-gen": "1.9.0", - "@webassemblyjs/wasm-opt": "1.9.0", - "@webassemblyjs/wasm-parser": "1.9.0", - "@webassemblyjs/wast-printer": "1.9.0" - } - }, - "node_modules/@webassemblyjs/wasm-gen": { - "version": "1.9.0", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-gen/-/wasm-gen-1.9.0.tgz", - "integrity": "sha512-cPE3o44YzOOHvlsb4+E9qSqjc9Qf9Na1OO/BHFy4OI91XDE14MjFN4lTMezzaIWdPqHnsTodGGNP+iRSYfGkjA==", - "dev": true, - "license": "MIT", - "dependencies": { - "@webassemblyjs/ast": "1.9.0", - "@webassemblyjs/helper-wasm-bytecode": "1.9.0", - "@webassemblyjs/ieee754": "1.9.0", - "@webassemblyjs/leb128": "1.9.0", - "@webassemblyjs/utf8": "1.9.0" - } - }, - "node_modules/@webassemblyjs/wasm-opt": { - "version": "1.9.0", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-opt/-/wasm-opt-1.9.0.tgz", - "integrity": "sha512-Qkjgm6Anhm+OMbIL0iokO7meajkzQD71ioelnfPEj6r4eOFuqm4YC3VBPqXjFyyNwowzbMD+hizmprP/Fwkl2A==", - "dev": true, - "license": "MIT", - "dependencies": { - "@webassemblyjs/ast": "1.9.0", - "@webassemblyjs/helper-buffer": "1.9.0", - "@webassemblyjs/wasm-gen": "1.9.0", - "@webassemblyjs/wasm-parser": "1.9.0" - } - }, - "node_modules/@webassemblyjs/wasm-parser": { - "version": "1.9.0", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-parser/-/wasm-parser-1.9.0.tgz", - "integrity": "sha512-9+wkMowR2AmdSWQzsPEjFU7njh8HTO5MqO8vjwEHuM+AMHioNqSBONRdr0NQQ3dVQrzp0s8lTcYqzUdb7YgELA==", - "dev": true, - "license": "MIT", - "dependencies": { - "@webassemblyjs/ast": "1.9.0", - "@webassemblyjs/helper-api-error": "1.9.0", - "@webassemblyjs/helper-wasm-bytecode": "1.9.0", - "@webassemblyjs/ieee754": "1.9.0", - "@webassemblyjs/leb128": "1.9.0", - "@webassemblyjs/utf8": "1.9.0" - } - }, - "node_modules/@webassemblyjs/wast-parser": { - "version": "1.9.0", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wast-parser/-/wast-parser-1.9.0.tgz", - "integrity": "sha512-qsqSAP3QQ3LyZjNC/0jBJ/ToSxfYJ8kYyuiGvtn/8MK89VrNEfwj7BPQzJVHi0jGTRK2dGdJ5PRqhtjzoww+bw==", - "dev": true, - "license": "MIT", - "dependencies": { - "@webassemblyjs/ast": "1.9.0", - "@webassemblyjs/floating-point-hex-parser": "1.9.0", - "@webassemblyjs/helper-api-error": "1.9.0", - "@webassemblyjs/helper-code-frame": "1.9.0", - "@webassemblyjs/helper-fsm": "1.9.0", - "@xtuc/long": "4.2.2" - } - }, - "node_modules/@webassemblyjs/wast-printer": { - "version": "1.9.0", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wast-printer/-/wast-printer-1.9.0.tgz", - "integrity": "sha512-2J0nE95rHXHyQ24cWjMKJ1tqB/ds8z/cyeOZxJhcb+rW+SQASVjuznUSmdz5GpVJTzU8JkhYut0D3siFDD6wsA==", - "dev": true, - "license": "MIT", - "dependencies": { - "@webassemblyjs/ast": "1.9.0", - "@webassemblyjs/wast-parser": "1.9.0", - "@xtuc/long": "4.2.2" - } - }, - "node_modules/@xmldom/xmldom": { - "version": "0.8.10", - "resolved": "https://registry.npmjs.org/@xmldom/xmldom/-/xmldom-0.8.10.tgz", - "integrity": "sha512-2WALfTl4xo2SkGCYRt6rDTFfk9R1czmBvUQy12gK2KuRKIpWEhcbbzy8EZXtz/jkRqHX8bFEc6FC1HjX4TUWYw==", - "license": "MIT", - "engines": { - "node": ">=10.0.0" - } - }, - "node_modules/@xtuc/ieee754": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/@xtuc/ieee754/-/ieee754-1.2.0.tgz", - "integrity": "sha512-DX8nKgqcGwsc0eJSqYt5lwP4DH5FlHnmuWWBRy7X0NcaGR0ZtuyeESgMwTYVEtxmsNGY+qit4QYT/MIYTOTPeA==", - "dev": true, - "license": "BSD-3-Clause" - }, - "node_modules/@xtuc/long": { - "version": "4.2.2", - "resolved": "https://registry.npmjs.org/@xtuc/long/-/long-4.2.2.tgz", - "integrity": "sha512-NuHqBY1PB/D8xU6s/thBgOAiAP7HOYDQ32+BFZILJ8ivkUkAHQnWfn6WhL79Owj1qmUnoN/YPhktdIoucipkAQ==", - "dev": true, - "license": "Apache-2.0" - }, - "node_modules/@yarnpkg/lockfile": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/@yarnpkg/lockfile/-/lockfile-1.1.0.tgz", - "integrity": "sha512-GpSwvyXOcOOlV70vbnzjj4fW5xW/FdUF6nQEt1ENy7m4ZCczi1+/buVUPAqmGfqznsORNFzUMjctTIp8a9tuCQ==", - "dev": true, - "license": "BSD-2-Clause" - }, - "node_modules/abbrev": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/abbrev/-/abbrev-2.0.0.tgz", - "integrity": "sha512-6/mh1E2u2YgEsCHdY0Yx5oW+61gZU+1vXaoiHHrpKeuRNNgFvS+/jrwHiQhB5apAf5oB7UB7E19ol2R2LKH8hQ==", - "license": "ISC", - "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" - } - }, - "node_modules/abstract-logging": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/abstract-logging/-/abstract-logging-2.0.1.tgz", - "integrity": "sha512-2BjRTZxTPvheOvGbBslFSYOUkr+SjPtOnrLP33f+VIWLzezQpZcqVg7ja3L4dBXmzzgwT+a029jRx5PCi3JuiA==", - "license": "MIT" - }, - "node_modules/accept-language-parser": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/accept-language-parser/-/accept-language-parser-1.5.0.tgz", - "integrity": "sha512-QhyTbMLYo0BBGg1aWbeMG4ekWtds/31BrEU+DONOg/7ax23vxpL03Pb7/zBmha2v7vdD3AyzZVWBVGEZxKOXWw==", - "license": "MIT" - }, - "node_modules/accepts": { - "version": "1.3.8", - "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.8.tgz", - "integrity": "sha512-PYAthTa2m2VKxuvSD3DPC/Gy+U+sOA1LAuT8mkmRuvw+NACSaeXEQ+NHcVF7rONl6qcaxV3Uuemwawk+7+SJLw==", - "license": "MIT", - "dependencies": { - "mime-types": "~2.1.34", - "negotiator": "0.6.3" - }, - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/acorn": { - "version": "7.4.1", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-7.4.1.tgz", - "integrity": "sha512-nQyp0o1/mNdbTO1PO6kHkwSrmgZ0MT/jCCpNiwbUjGoRN4dlBhqJtoQuCnEOKzgTVwg0ZWiCoQy6SxMebQVh8A==", - "dev": true, - "license": "MIT", - "bin": { - "acorn": "bin/acorn" - }, - "engines": { - "node": ">=0.4.0" - } - }, - "node_modules/acorn-jsx": { - "version": "5.3.2", - "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.2.tgz", - "integrity": "sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==", - "dev": true, - "license": "MIT", - "peerDependencies": { - "acorn": "^6.0.0 || ^7.0.0 || ^8.0.0" - } - }, - "node_modules/acorn-walk": { - "version": "8.3.4", - "resolved": "https://registry.npmjs.org/acorn-walk/-/acorn-walk-8.3.4.tgz", - "integrity": "sha512-ueEepnujpqee2o5aIYnvHU6C0A42MNdsIDeqy5BydrkuC5R1ZuUFnm27EeFJGoEHJQgn3uleRvmTXaJgfXbt4g==", - "dev": true, - "license": "MIT", - "dependencies": { - "acorn": "^8.11.0" - }, - "engines": { - "node": ">=0.4.0" - } - }, - "node_modules/acorn-walk/node_modules/acorn": { - "version": "8.14.0", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.14.0.tgz", - "integrity": "sha512-cl669nCJTZBsL97OF4kUQm5g5hC2uihk0NxY3WENAC0TYdILVkAyHymAntgxGkl7K+t0cXIrH5siy5S4XkFycA==", - "dev": true, - "license": "MIT", - "bin": { - "acorn": "bin/acorn" - }, - "engines": { - "node": ">=0.4.0" - } - }, - "node_modules/aggregate-error": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/aggregate-error/-/aggregate-error-3.1.0.tgz", - "integrity": "sha512-4I7Td01quW/RpocfNayFdFVk1qSuoh0E7JrbRJ16nH01HhKFQ88INq9Sd+nd72zqRySlr9BmDA8xlEJ6vJMrYA==", - "dev": true, - "license": "MIT", - "dependencies": { - "clean-stack": "^2.0.0", - "indent-string": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "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==", - "license": "MIT", - "dependencies": { - "fast-deep-equal": "^3.1.3", - "fast-uri": "^3.0.1", - "json-schema-traverse": "^1.0.0", - "require-from-string": "^2.0.2" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/epoberezkin" - } - }, - "node_modules/ajv-errors": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/ajv-errors/-/ajv-errors-3.0.0.tgz", - "integrity": "sha512-V3wD15YHfHz6y0KdhYFjyy9vWtEVALT9UrxfN3zqlI6dMioHnJrqOYfyPKol3oqrnCM9uwkcdCwkJ0WUcbLMTQ==", - "license": "MIT", - "optional": true, - "peer": true, - "peerDependencies": { - "ajv": "^8.0.1" - } - }, - "node_modules/ajv-formats": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/ajv-formats/-/ajv-formats-3.0.1.tgz", - "integrity": "sha512-8iUql50EUR+uUcdRQ3HDqa6EVyo3docL8g5WJ3FNcWmu62IbkGUue/pEyLBW8VGKKucTPgqeks4fIU1DA4yowQ==", - "license": "MIT", - "optional": true, - "peer": true, - "dependencies": { - "ajv": "^8.0.0" - }, - "peerDependencies": { - "ajv": "^8.0.0" - }, - "peerDependenciesMeta": { - "ajv": { - "optional": true - } - } - }, - "node_modules/ajv-i18n": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/ajv-i18n/-/ajv-i18n-4.2.0.tgz", - "integrity": "sha512-v/ei2UkCEeuKNXh8RToiFsUclmU+G57LO1Oo22OagNMENIw+Yb8eMwvHu7Vn9fmkjJyv6XclhJ8TbuigSglPkg==", - "license": "MIT", - "peerDependencies": { - "ajv": "^8.0.0-beta.0" - } - }, - "node_modules/ajv-keywords": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-5.1.0.tgz", - "integrity": "sha512-YCS/JNFAUyr5vAuhk1DWm1CBxRHW9LbJ2ozWeemrIqpbsqKjHVxYPyi5GC0rjZIT5JxJ3virVTS8wk4i/Z+krw==", - "dev": true, - "license": "MIT", - "dependencies": { - "fast-deep-equal": "^3.1.3" - }, - "peerDependencies": { - "ajv": "^8.8.2" - } - }, - "node_modules/ansi-align": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/ansi-align/-/ansi-align-3.0.1.tgz", - "integrity": "sha512-IOfwwBF5iczOjp/WeY4YxyjqAFMQoZufdQWDd19SEExbVLNXqvpzSJ/M7Za4/sCPmQ0+GRquoA7bGcINcxew6w==", - "license": "ISC", - "dependencies": { - "string-width": "^4.1.0" - } - }, - "node_modules/ansi-colors": { - "version": "4.1.3", - "resolved": "https://registry.npmjs.org/ansi-colors/-/ansi-colors-4.1.3.tgz", - "integrity": "sha512-/6w/C21Pm1A7aZitlI5Ni/2J6FFQN8i1Cvz3kHABAAbw93v/NlvKdVOqz7CCWz/3iv/JplRSEEZ83XION15ovw==", - "license": "MIT", - "engines": { - "node": ">=6" - } - }, - "node_modules/ansi-escapes": { - "version": "4.3.2", - "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-4.3.2.tgz", - "integrity": "sha512-gKXj5ALrKWQLsYG9jlTRmR/xKluxHV+Z9QEwNIgCfM1/uwPMCuzVVnh5mwTd+OuBZcwSIMbqssNWRm1lE51QaQ==", - "license": "MIT", - "dependencies": { - "type-fest": "^0.21.3" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/ansi-escapes/node_modules/type-fest": { - "version": "0.21.3", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.21.3.tgz", - "integrity": "sha512-t0rzBq87m3fVcduHDUFhKmyyX+9eo6WQjZvf51Ea/M0Q7+T374Jp1aUiyUl0GKxp8M/OETVHSDvmkyPgvX+X2w==", - "license": "(MIT OR CC0-1.0)", - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/ansi-html-community": { - "version": "0.0.8", - "resolved": "https://registry.npmjs.org/ansi-html-community/-/ansi-html-community-0.0.8.tgz", - "integrity": "sha512-1APHAyr3+PCamwNw3bXCPp4HFLONZt/yIH0sZp0/469KWNTEy+qN5jQ3GVX6DMZ1UXAi34yVwtTeaG/HpBuuzw==", - "dev": true, - "engines": [ - "node >= 0.8.0" - ], - "license": "Apache-2.0", - "bin": { - "ansi-html": "bin/ansi-html" - } - }, - "node_modules/ansi-regex": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", - "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "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/any-promise": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/any-promise/-/any-promise-1.3.0.tgz", - "integrity": "sha512-7UvmKalWRt1wgjL1RrGxoSJW/0QZFIegpeGvZG9kjp8vrRu55XTHbwnqq2GpXm9uLbcuhxm3IqX9OB4MZR1b2A==", - "license": "MIT" - }, - "node_modules/anymatch": { - "version": "3.1.3", - "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.3.tgz", - "integrity": "sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==", - "license": "ISC", - "dependencies": { - "normalize-path": "^3.0.0", - "picomatch": "^2.0.4" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/append-field": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/append-field/-/append-field-1.0.0.tgz", - "integrity": "sha512-klpgFSWLW1ZEs8svjfb7g4qWY0YS5imI82dTg+QahUvJ8YqAY0P10Uk8tTyh9ZGuYEZEMaeJYCF5BFuX552hsw==", - "license": "MIT" - }, - "node_modules/append-transform": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/append-transform/-/append-transform-2.0.0.tgz", - "integrity": "sha512-7yeyCEurROLQJFv5Xj4lEGTy0borxepjFv1g22oAdqFu//SrAlDl1O1Nxx15SH1RoliUml6p8dwJW9jvZughhg==", - "dev": true, - "license": "MIT", - "dependencies": { - "default-require-extensions": "^3.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/aproba": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/aproba/-/aproba-1.2.0.tgz", - "integrity": "sha512-Y9J6ZjXtoYh8RnXVCMOU/ttDmk1aBjunq9vO0ta5x85WDQiQfUF9sIPBITdbiiIVcBo03Hi3jMxigBtsddlXRw==", - "dev": true, - "license": "ISC" - }, - "node_modules/archy": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/archy/-/archy-1.0.0.tgz", - "integrity": "sha512-Xg+9RwCg/0p32teKdGMPTPnVXKD0w3DfHnFTficozsAgsvq2XenPJq/MYpzzQ/v8zrOyJn6Ds39VA4JIDwFfqw==", - "dev": true, - "license": "MIT" - }, - "node_modules/arg": { - "version": "5.0.2", - "resolved": "https://registry.npmjs.org/arg/-/arg-5.0.2.tgz", - "integrity": "sha512-PYjyFOLKQ9y57JvQ6QLo8dAgNqswh8M1RMJYdQduT6xbWSgK36P/Z/v+p888pM69jMMfS8Xd8F6I1kQ/I9HUGg==", - "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==", - "license": "MIT", - "dependencies": { - "sprintf-js": "~1.0.2" - } - }, - "node_modules/arr-diff": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/arr-diff/-/arr-diff-4.0.0.tgz", - "integrity": "sha512-YVIQ82gZPGBebQV/a8dar4AitzCQs0jjXwMPZllpXMaGjXPYVUawSxQrRsjhjupyVxEvbHgUmIhKVlND+j02kA==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/arr-flatten": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/arr-flatten/-/arr-flatten-1.1.0.tgz", - "integrity": "sha512-L3hKV5R/p5o81R7O02IGnwpDmkp6E982XhtbuwSe3O4qOtMMMtodicASA1Cny2U+aCXcNpml+m4dPsvsJ3jatg==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/arr-union": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/arr-union/-/arr-union-3.1.0.tgz", - "integrity": "sha512-sKpyeERZ02v1FeCZT8lrfJq5u6goHCtpTAzPwJYe7c8SPFOboNjNg1vz2L4VTn9T4PQxEx13TbXLmYUcS6Ug7Q==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/array-buffer-byte-length": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/array-buffer-byte-length/-/array-buffer-byte-length-1.0.1.tgz", - "integrity": "sha512-ahC5W1xgou+KTXix4sAO8Ki12Q+jf4i0+tmk3sC+zgcynshkHxzpXdImBehiUYKKKDwvfFiJl1tZt6ewscS1Mg==", - "dev": true, - "license": "MIT", - "dependencies": { - "call-bind": "^1.0.5", - "is-array-buffer": "^3.0.4" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/array-flatten": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-1.1.1.tgz", - "integrity": "sha512-PCVAQswWemu6UdxsDFFX/+gVeYqKAod3D3UVm91jHwynguOwAvYPhx8nNlM++NqRcK6CxxpUafjmhIdKiHibqg==", - "license": "MIT" - }, - "node_modules/array-ify": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/array-ify/-/array-ify-1.0.0.tgz", - "integrity": "sha512-c5AMf34bKdvPhQ7tBGhqkgKNUzMr4WUs+WDtC2ZUGOUncbxKMTvqxYctiseW3+L4bA8ec+GcZ6/A/FW4m8ukng==", - "dev": true, - "license": "MIT" - }, - "node_modules/array-includes": { - "version": "3.1.8", - "resolved": "https://registry.npmjs.org/array-includes/-/array-includes-3.1.8.tgz", - "integrity": "sha512-itaWrbYbqpGXkGhZPGUulwnhVf5Hpy1xiCFsGqyIGglbBxmG5vSjxQen3/WGOjPpNEv1RtBLKxbmVXm8HpJStQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "call-bind": "^1.0.7", - "define-properties": "^1.2.1", - "es-abstract": "^1.23.2", - "es-object-atoms": "^1.0.0", - "get-intrinsic": "^1.2.4", - "is-string": "^1.0.7" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/array-parallel": { - "version": "0.1.3", - "resolved": "https://registry.npmjs.org/array-parallel/-/array-parallel-0.1.3.tgz", - "integrity": "sha512-TDPTwSWW5E4oiFiKmz6RGJ/a80Y91GuLgUYuLd49+XBS75tYo8PNgaT2K/OxuQYqkoI852MDGBorg9OcUSTQ8w==", - "license": "MIT" - }, - "node_modules/array-series": { - "version": "0.1.5", - "resolved": "https://registry.npmjs.org/array-series/-/array-series-0.1.5.tgz", - "integrity": "sha512-L0XlBwfx9QetHOsbLDrE/vh2t018w9462HM3iaFfxRiK83aJjAt/Ja3NMkOW7FICwWTlQBa3ZbL5FKhuQWkDrg==", - "license": "MIT" - }, - "node_modules/array-union": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/array-union/-/array-union-2.1.0.tgz", - "integrity": "sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==", - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/array-unique": { - "version": "0.3.2", - "resolved": "https://registry.npmjs.org/array-unique/-/array-unique-0.3.2.tgz", - "integrity": "sha512-SleRWjh9JUud2wH1hPs9rZBZ33H6T9HOiL0uwGnGx9FpE6wKGyfWugmbkEOIs6qWrZhg0LWeLziLrEwQJhs5mQ==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/array.prototype.findlastindex": { - "version": "1.2.5", - "resolved": "https://registry.npmjs.org/array.prototype.findlastindex/-/array.prototype.findlastindex-1.2.5.tgz", - "integrity": "sha512-zfETvRFA8o7EiNn++N5f/kaCw221hrpGsDmcpndVupkPzEc1Wuf3VgC0qby1BbHs7f5DVYjgtEU2LLh5bqeGfQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "call-bind": "^1.0.7", - "define-properties": "^1.2.1", - "es-abstract": "^1.23.2", - "es-errors": "^1.3.0", - "es-object-atoms": "^1.0.0", - "es-shim-unscopables": "^1.0.2" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/array.prototype.flat": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/array.prototype.flat/-/array.prototype.flat-1.3.2.tgz", - "integrity": "sha512-djYB+Zx2vLewY8RWlNCUdHjDXs2XOgm602S9E7P/UpHgfeHL00cRiIF+IN/G/aUJ7kGPb6yO/ErDI5V2s8iycA==", - "dev": true, - "license": "MIT", - "dependencies": { - "call-bind": "^1.0.2", - "define-properties": "^1.2.0", - "es-abstract": "^1.22.1", - "es-shim-unscopables": "^1.0.0" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/array.prototype.flatmap": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/array.prototype.flatmap/-/array.prototype.flatmap-1.3.2.tgz", - "integrity": "sha512-Ewyx0c9PmpcsByhSW4r+9zDU7sGjFc86qf/kKtuSCRdhfbk0SNLLkaT5qvcHnRGgc5NP/ly/y+qkXkqONX54CQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "call-bind": "^1.0.2", - "define-properties": "^1.2.0", - "es-abstract": "^1.22.1", - "es-shim-unscopables": "^1.0.0" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/array.prototype.reduce": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/array.prototype.reduce/-/array.prototype.reduce-1.0.7.tgz", - "integrity": "sha512-mzmiUCVwtiD4lgxYP8g7IYy8El8p2CSMePvIbTS7gchKir/L1fgJrk0yDKmAX6mnRQFKNADYIk8nNlTris5H1Q==", - "dev": true, - "license": "MIT", - "dependencies": { - "call-bind": "^1.0.7", - "define-properties": "^1.2.1", - "es-abstract": "^1.23.2", - "es-array-method-boxes-properly": "^1.0.0", - "es-errors": "^1.3.0", - "es-object-atoms": "^1.0.0", - "is-string": "^1.0.7" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/arraybuffer.prototype.slice": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/arraybuffer.prototype.slice/-/arraybuffer.prototype.slice-1.0.3.tgz", - "integrity": "sha512-bMxMKAjg13EBSVscxTaYA4mRc5t1UAXa2kXiGTNfZ079HIWXEkKmkgFrh/nJqamaLSrXO5H4WFFkPEaLJWbs3A==", - "dev": true, - "license": "MIT", - "dependencies": { - "array-buffer-byte-length": "^1.0.1", - "call-bind": "^1.0.5", - "define-properties": "^1.2.1", - "es-abstract": "^1.22.3", - "es-errors": "^1.2.1", - "get-intrinsic": "^1.2.3", - "is-array-buffer": "^3.0.4", - "is-shared-array-buffer": "^1.0.2" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/arrify": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/arrify/-/arrify-1.0.1.tgz", - "integrity": "sha512-3CYzex9M9FGQjCGMGyi6/31c8GJbgb0qGyrx5HWxPd0aCwh4cB2YjMb2Xf9UuoogrMrlO9cTqnB5rI5GHZTcUA==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/asn1": { - "version": "0.2.6", - "resolved": "https://registry.npmjs.org/asn1/-/asn1-0.2.6.tgz", - "integrity": "sha512-ix/FxPn0MDjeyJ7i/yoHGFt/EX6LyNbxSEhPPXODPL+KB0VPk86UYfL0lMdy+KCnv+fmvIzySwaK5COwqVbWTQ==", - "license": "MIT", - "dependencies": { - "safer-buffer": "~2.1.0" - } - }, - "node_modules/asn1.js": { - "version": "4.6.2", - "resolved": "https://registry.npmjs.org/asn1.js/-/asn1.js-4.6.2.tgz", - "integrity": "sha512-z04Hcq0EmaDNyQ6P7eFyJcG3gfTd9DpANmz0xLdFhSD8TQ/0jnn1k/V7ohN1jsrap5UAgrRNTYrt6ZFiUhNlJw==", - "license": "MIT", - "dependencies": { - "bn.js": "^4.0.0", - "inherits": "^2.0.1", - "minimalistic-assert": "^1.0.0" - } - }, - "node_modules/assert": { - "version": "1.5.1", - "resolved": "https://registry.npmjs.org/assert/-/assert-1.5.1.tgz", - "integrity": "sha512-zzw1uCAgLbsKwBfFc8CX78DDg+xZeBksSO3vwVIDDN5i94eOrPsSSyiVhmsSABFDM/OcpE2aagCat9dnWQLG1A==", - "dev": true, - "license": "MIT", - "dependencies": { - "object.assign": "^4.1.4", - "util": "^0.10.4" - } - }, - "node_modules/assert-plus": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz", - "integrity": "sha512-NfJ4UzBCcQGLDlQq7nHxH+tv3kyZ0hHQqF5BO6J7tNJeP5do1llPr8dZ8zHonfhAu0PHAdMkSo+8o0wxg9lZWw==", - "license": "MIT", - "engines": { - "node": ">=0.8" - } - }, - "node_modules/assert/node_modules/inherits": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", - "integrity": "sha512-x00IRNXNy63jwGkJmzPigoySHbaqpNuzKbBOmzK+g2OdZpQ9w+sxCN+VSB3ja7IAge2OP2qpfxTjeNcyjmW1uw==", - "dev": true, - "license": "ISC" - }, - "node_modules/assert/node_modules/util": { - "version": "0.10.4", - "resolved": "https://registry.npmjs.org/util/-/util-0.10.4.tgz", - "integrity": "sha512-0Pm9hTQ3se5ll1XihRic3FDIku70C+iHUdT/W926rSgHV5QgXsYbKZN8MSC3tJtSkhuROzvsQjAaFENRXr+19A==", - "dev": true, - "license": "MIT", - "dependencies": { - "inherits": "2.0.3" - } - }, - "node_modules/assign-symbols": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/assign-symbols/-/assign-symbols-1.0.0.tgz", - "integrity": "sha512-Q+JC7Whu8HhmTdBph/Tq59IoRtoy6KAm5zzPv00WdujX82lbAL8K7WVjne7vdCsAmbF4AYaDOPyO3k0kl8qIrw==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/astral-regex": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/astral-regex/-/astral-regex-2.0.0.tgz", - "integrity": "sha512-Z7tMw1ytTXt5jqMcOP+OQteU1VuNK9Y02uuJtKQ1Sv69jXQKKg5cibLwGJow8yzZP+eAc18EmLGPal0bp36rvQ==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/async-each": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/async-each/-/async-each-1.0.6.tgz", - "integrity": "sha512-c646jH1avxr+aVpndVMeAfYw7wAa6idufrlN3LPA4PmKS0QEGp6PIC9nwz0WQkkvBGAMEki3pFdtxaF39J9vvg==", - "dev": true, - "funding": [ - { - "type": "individual", - "url": "https://paulmillr.com/funding/" - } - ], - "license": "MIT", - "optional": true - }, - "node_modules/asynckit": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", - "integrity": "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==", - "license": "MIT" - }, - "node_modules/at-least-node": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/at-least-node/-/at-least-node-1.0.0.tgz", - "integrity": "sha512-+q/t7Ekv1EDY2l6Gda6LLiX14rU9TV20Wa3ofeQmwPFZbOMo9DXrLbOjFaaclkXKWidIaopwAObQDqwWtGUjqg==", - "dev": true, - "license": "ISC", - "engines": { - "node": ">= 4.0.0" - } - }, - "node_modules/atob": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/atob/-/atob-2.1.2.tgz", - "integrity": "sha512-Wm6ukoaOGJi/73p/cl2GvLjTI5JM1k/O14isD73YML8StrH/7/lRFgmg8nICZgD3bZZvjwCGxtMOD3wWNAu8cg==", - "dev": true, - "license": "(MIT OR Apache-2.0)", - "bin": { - "atob": "bin/atob.js" - }, - "engines": { - "node": ">= 4.5.0" - } - }, - "node_modules/autoprefixer": { - "version": "10.4.20", - "resolved": "https://registry.npmjs.org/autoprefixer/-/autoprefixer-10.4.20.tgz", - "integrity": "sha512-XY25y5xSv/wEoqzDyXXME4AFfkZI0P23z6Fs3YgymDnKJkCGOnkL0iTxCa85UTqaSgfcqyf3UA6+c7wUvx/16g==", - "dev": true, - "funding": [ - { - "type": "opencollective", - "url": "https://opencollective.com/postcss/" - }, - { - "type": "tidelift", - "url": "https://tidelift.com/funding/github/npm/autoprefixer" - }, - { - "type": "github", - "url": "https://github.com/sponsors/ai" - } - ], - "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", - "postcss-value-parser": "^4.2.0" - }, - "bin": { - "autoprefixer": "bin/autoprefixer" - }, - "engines": { - "node": "^10 || ^12 || >=14" - }, - "peerDependencies": { - "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/axios": { - "version": "1.7.7", - "resolved": "https://registry.npmjs.org/axios/-/axios-1.7.7.tgz", - "integrity": "sha512-S4kL7XrjgBmvdGut0sN3yJxqYzrDOnivkBiN0OFs6hLiUam3UPvswUo0kqGyhqUZGEOytHyumEdXsAkgCOUf3Q==", - "license": "MIT", - "dependencies": { - "follow-redirects": "^1.15.6", - "form-data": "^4.0.0", - "proxy-from-env": "^1.1.0" - } - }, - "node_modules/axios-retry": { - "version": "3.9.1", - "resolved": "https://registry.npmjs.org/axios-retry/-/axios-retry-3.9.1.tgz", - "integrity": "sha512-8PJDLJv7qTTMMwdnbMvrLYuvB47M81wRtxQmEdV5w4rgbTXTt+vtPkXwajOfOdSyv/wZICJOC+/UhXH4aQ/R+w==", - "license": "Apache-2.0", - "dependencies": { - "@babel/runtime": "^7.15.4", - "is-retry-allowed": "^2.2.0" - } - }, - "node_modules/babel-loader": { - "version": "8.4.1", - "resolved": "https://registry.npmjs.org/babel-loader/-/babel-loader-8.4.1.tgz", - "integrity": "sha512-nXzRChX+Z1GoE6yWavBQg6jDslyFF3SDjl2paADuoQtQW10JqShJt62R6eJQ5m/pjJFDT8xgKIWSP85OY8eXeA==", - "dev": true, - "license": "MIT", - "dependencies": { - "find-cache-dir": "^3.3.1", - "loader-utils": "^2.0.4", - "make-dir": "^3.1.0", - "schema-utils": "^2.6.5" - }, - "engines": { - "node": ">= 8.9" - }, - "peerDependencies": { - "@babel/core": "^7.0.0", - "webpack": ">=2" - } - }, - "node_modules/babel-loader/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" - } - }, - "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" - } - }, - "node_modules/backoff": { - "version": "2.5.0", - "resolved": "https://registry.npmjs.org/backoff/-/backoff-2.5.0.tgz", - "integrity": "sha512-wC5ihrnUXmR2douXmXLCe5O3zg3GKIyvRi/hi58a/XyRxVI+3/yM0PYueQOZXPXQ9pxBislYkw+sF9b7C/RuMA==", - "license": "MIT", - "dependencies": { - "precond": "0.2" - }, - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/balanced-match": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", - "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", - "license": "MIT" - }, - "node_modules/base": { - "version": "0.11.2", - "resolved": "https://registry.npmjs.org/base/-/base-0.11.2.tgz", - "integrity": "sha512-5T6P4xPgpp0YDFvSWwEZ4NoE3aM4QBQXDzmVbraCkFj8zHM+mba8SyqB5DbZWyR7mYHo6Y7BdQo3MoA4m0TeQg==", - "dev": true, - "license": "MIT", - "dependencies": { - "cache-base": "^1.0.1", - "class-utils": "^0.3.5", - "component-emitter": "^1.2.1", - "define-property": "^1.0.0", - "isobject": "^3.0.1", - "mixin-deep": "^1.2.0", - "pascalcase": "^0.1.1" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/base/node_modules/define-property": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz", - "integrity": "sha512-cZTYKFWspt9jZsMscWo8sc/5lbPC9Q0N5nBLgb+Yd915iL3udB1uFgS3B8YCx66UVHq018DAVFoee7x+gxggeA==", - "dev": true, - "license": "MIT", - "dependencies": { - "is-descriptor": "^1.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "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==", - "devOptional": 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/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", - "integrity": "sha512-Ceh+7ox5qe7LJuLHoY0feh3pHuUDHAcRUeyL2VYghZwfpkNIy/+8Ocg0a3UuSoYzavmylwuLWQOf3hl0jjMMIw==", - "license": "MIT", - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/bindings": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/bindings/-/bindings-1.5.0.tgz", - "integrity": "sha512-p2q/t/mhvuOj/UeLlV6566GD/guowlr0hHxClI0W9m7MWYkL1F0hLo+0Aexs9HSPCtR1SXQ0TD3MMKrXZajbiQ==", - "dev": true, - "license": "MIT", - "optional": true, - "dependencies": { - "file-uri-to-path": "1.0.0" - } - }, - "node_modules/bintrees": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/bintrees/-/bintrees-1.0.2.tgz", - "integrity": "sha512-VOMgTMwjAaUG580SXn3LacVgjurrbMme7ZZNYGSSV7mmtY6QQRh0Eg3pwIcntQ77DErK1L0NxkbetjcoXzVwKw==", - "license": "MIT" - }, - "node_modules/bluebird": { - "version": "3.7.2", - "resolved": "https://registry.npmjs.org/bluebird/-/bluebird-3.7.2.tgz", - "integrity": "sha512-XpNj6GDQzdfW+r2Wnn7xiSAd7TM3jzkxGXBGTtWKuSXv1xUV+azxAm8jdWZN06QTQk+2N2XB9jRDkvbmQmcRtg==", - "dev": true, - "license": "MIT" - }, - "node_modules/bn.js": { - "version": "4.12.1", - "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.12.1.tgz", - "integrity": "sha512-k8TVBiPkPJT9uHLdOKfFpqcfprwBFOAAXXozRubr7R7PfIuKvQlzcI4M0pALeqXN09vdaMbUdUj+pass+uULAg==", - "license": "MIT" - }, - "node_modules/body-parser": { - "version": "1.20.3", - "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.20.3.tgz", - "integrity": "sha512-7rAxByjUMqQ3/bHJy7D6OGXvx/MMc4IqBn/X0fcM1QUcAItpZrBEYhWGem+tzXH90c+G01ypMcYJBO9Y30203g==", - "license": "MIT", - "dependencies": { - "bytes": "3.1.2", - "content-type": "~1.0.5", - "debug": "2.6.9", - "depd": "2.0.0", - "destroy": "1.2.0", - "http-errors": "2.0.0", - "iconv-lite": "0.4.24", - "on-finished": "2.4.1", - "qs": "6.13.0", - "raw-body": "2.5.2", - "type-is": "~1.6.18", - "unpipe": "1.0.0" - }, - "engines": { - "node": ">= 0.8", - "npm": "1.2.8000 || >= 1.4.16" - } - }, - "node_modules/body-parser/node_modules/debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", - "license": "MIT", - "dependencies": { - "ms": "2.0.0" - } - }, - "node_modules/body-parser/node_modules/ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", - "license": "MIT" - }, - "node_modules/boolbase": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/boolbase/-/boolbase-1.0.0.tgz", - "integrity": "sha512-JZOSA7Mo9sNGB8+UjSgzdLtokWAky1zbztM3WRLCbZ70/3cTANmQmOdR7y2g+J0e2WXywy1yS468tY+IruqEww==", - "license": "ISC" - }, - "node_modules/boolean": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/boolean/-/boolean-3.2.0.tgz", - "integrity": "sha512-d0II/GO9uf9lfUHH2BQsjxzRJZBdsjgsBiW4BvhWk/3qoKwQFjIDVN19PfX8F2D/r9PCMTtLWjYVCFrpeYUzsw==", - "deprecated": "Package no longer supported. Contact Support at https://www.npmjs.com/support for more info.", - "license": "MIT" - }, - "node_modules/boxen": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/boxen/-/boxen-5.1.2.tgz", - "integrity": "sha512-9gYgQKXx+1nP8mP7CzFyaUARhg7D3n1dF/FnErWmu9l6JvGpNUN278h0aSb+QjoiKSWG+iZ3uHrcqk0qrY9RQQ==", - "license": "MIT", - "dependencies": { - "ansi-align": "^3.0.0", - "camelcase": "^6.2.0", - "chalk": "^4.1.0", - "cli-boxes": "^2.2.1", - "string-width": "^4.2.2", - "type-fest": "^0.20.2", - "widest-line": "^3.1.0", - "wrap-ansi": "^7.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/boxen/node_modules/camelcase": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-6.3.0.tgz", - "integrity": "sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA==", - "license": "MIT", - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/boxen/node_modules/chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", - "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/boxen/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==", - "license": "MIT", - "dependencies": { - "has-flag": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/boxen/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==", - "license": "(MIT OR CC0-1.0)", - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "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==", - "license": "MIT", - "dependencies": { - "balanced-match": "^1.0.0", - "concat-map": "0.0.1" - } - }, - "node_modules/braces": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.3.tgz", - "integrity": "sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==", - "license": "MIT", - "dependencies": { - "fill-range": "^7.1.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/brorand": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/brorand/-/brorand-1.1.0.tgz", - "integrity": "sha512-cKV8tMCEpQs4hK/ik71d6LrPOnpkpGBR0wzxqr68g2m/LB2GxVYQroAjMJZRVM1Y4BCjCKc3vAamxSzOY2RP+w==", - "dev": true, - "license": "MIT" - }, - "node_modules/browser-stdout": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/browser-stdout/-/browser-stdout-1.3.1.tgz", - "integrity": "sha512-qhAVI1+Av2X7qelOfAIYwXONood6XlZE/fXaBSmW/T5SzLAmCgzi+eiWE7fUvbHaeNBQH13UftjpXxsfLkMpgw==", - "dev": true, - "license": "ISC" - }, - "node_modules/browserify-aes": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/browserify-aes/-/browserify-aes-1.2.0.tgz", - "integrity": "sha512-+7CHXqGuspUn/Sl5aO7Ea0xWGAtETPXNSAjHo48JfLdPWcMng33Xe4znFvQweqc/uzk5zSOI3H52CYnjCfb5hA==", - "dev": true, - "license": "MIT", - "dependencies": { - "buffer-xor": "^1.0.3", - "cipher-base": "^1.0.0", - "create-hash": "^1.1.0", - "evp_bytestokey": "^1.0.3", - "inherits": "^2.0.1", - "safe-buffer": "^5.0.1" - } - }, - "node_modules/browserify-cipher": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/browserify-cipher/-/browserify-cipher-1.0.1.tgz", - "integrity": "sha512-sPhkz0ARKbf4rRQt2hTpAHqn47X3llLkUGn+xEJzLjwY8LRs2p0v7ljvI5EyoRO/mexrNunNECisZs+gw2zz1w==", - "dev": true, - "license": "MIT", - "dependencies": { - "browserify-aes": "^1.0.4", - "browserify-des": "^1.0.0", - "evp_bytestokey": "^1.0.0" - } - }, - "node_modules/browserify-des": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/browserify-des/-/browserify-des-1.0.2.tgz", - "integrity": "sha512-BioO1xf3hFwz4kc6iBhI3ieDFompMhrMlnDFC4/0/vd5MokpuAc3R+LYbwTA9A5Yc9pq9UYPqffKpW2ObuwX5A==", - "dev": true, - "license": "MIT", - "dependencies": { - "cipher-base": "^1.0.1", - "des.js": "^1.0.0", - "inherits": "^2.0.1", - "safe-buffer": "^5.1.2" - } - }, - "node_modules/browserify-rsa": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/browserify-rsa/-/browserify-rsa-4.1.1.tgz", - "integrity": "sha512-YBjSAiTqM04ZVei6sXighu679a3SqWORA3qZTEqZImnlkDIFtKc6pNutpjyZ8RJTjQtuYfeetkxM11GwoYXMIQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "bn.js": "^5.2.1", - "randombytes": "^2.1.0", - "safe-buffer": "^5.2.1" - }, - "engines": { - "node": ">= 0.10" - } - }, - "node_modules/browserify-rsa/node_modules/bn.js": { - "version": "5.2.1", - "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-5.2.1.tgz", - "integrity": "sha512-eXRvHzWyYPBuB4NBy0cmYQjGitUrtqwbvlzP3G6VFnNRbsZQIxQ10PbKKHt8gZ/HW/D/747aDl+QkDqg3KQLMQ==", - "dev": true, - "license": "MIT" - }, - "node_modules/browserify-sign": { - "version": "4.2.3", - "resolved": "https://registry.npmjs.org/browserify-sign/-/browserify-sign-4.2.3.tgz", - "integrity": "sha512-JWCZW6SKhfhjJxO8Tyiiy+XYB7cqd2S5/+WeYHsKdNKFlCBhKbblba1A/HN/90YwtxKc8tCErjffZl++UNmGiw==", - "dev": true, - "license": "ISC", - "dependencies": { - "bn.js": "^5.2.1", - "browserify-rsa": "^4.1.0", - "create-hash": "^1.2.0", - "create-hmac": "^1.1.7", - "elliptic": "^6.5.5", - "hash-base": "~3.0", - "inherits": "^2.0.4", - "parse-asn1": "^5.1.7", - "readable-stream": "^2.3.8", - "safe-buffer": "^5.2.1" - }, - "engines": { - "node": ">= 0.12" - } - }, - "node_modules/browserify-sign/node_modules/bn.js": { - "version": "5.2.1", - "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-5.2.1.tgz", - "integrity": "sha512-eXRvHzWyYPBuB4NBy0cmYQjGitUrtqwbvlzP3G6VFnNRbsZQIxQ10PbKKHt8gZ/HW/D/747aDl+QkDqg3KQLMQ==", - "dev": true, - "license": "MIT" - }, - "node_modules/browserify-zlib": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/browserify-zlib/-/browserify-zlib-0.2.0.tgz", - "integrity": "sha512-Z942RysHXmJrhqk88FmKBVq/v5tqmSkDz7p54G/MGyjMnCFFnC79XWNbg+Vta8W6Wb2qtSZTSxIGkJrRpCFEiA==", - "dev": true, - "license": "MIT", - "dependencies": { - "pako": "~1.0.5" - } - }, - "node_modules/browserslist": { - "version": "4.24.2", - "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.24.2.tgz", - "integrity": "sha512-ZIc+Q62revdMcqC6aChtW4jz3My3klmCO1fEmINZY/8J3EpBg5/A/D0AKmBveUh6pgoeycoMkVMko84tuYS+Gg==", - "dev": true, - "funding": [ - { - "type": "opencollective", - "url": "https://opencollective.com/browserslist" - }, - { - "type": "tidelift", - "url": "https://tidelift.com/funding/github/npm/browserslist" - }, - { - "type": "github", - "url": "https://github.com/sponsors/ai" - } - ], - "license": "MIT", - "dependencies": { - "caniuse-lite": "^1.0.30001669", - "electron-to-chromium": "^1.5.41", - "node-releases": "^2.0.18", - "update-browserslist-db": "^1.1.1" - }, - "bin": { - "browserslist": "cli.js" - }, - "engines": { - "node": "^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7" - } - }, - "node_modules/bson": { - "version": "5.5.1", - "resolved": "https://registry.npmjs.org/bson/-/bson-5.5.1.tgz", - "integrity": "sha512-ix0EwukN2EpC0SRWIj/7B5+A6uQMQy6KMREI9qQqvgpkV2frH63T0UDVd1SYedL6dNCmDBYB3QtXi4ISk9YT+g==", - "license": "Apache-2.0", - "engines": { - "node": ">=14.20.1" - } - }, - "node_modules/buffer": { - "version": "6.0.3", - "resolved": "https://registry.npmjs.org/buffer/-/buffer-6.0.3.tgz", - "integrity": "sha512-FTiCpNxtwiZZHEZbcbTIcZjERVICn9yq/pDFkTl95/AxzD1naBctN7YO68riM/gLSDY7sdrMby8hofADYuuqOA==", - "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", - "optional": true, - "peer": true, - "dependencies": { - "base64-js": "^1.3.1", - "ieee754": "^1.2.1" - } - }, - "node_modules/buffer-equal-constant-time": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/buffer-equal-constant-time/-/buffer-equal-constant-time-1.0.1.tgz", - "integrity": "sha512-zRpUiDwd/xk6ADqPMATG8vc9VPrkck7T07OIx0gnjmJAnHnTVXNQG3vfvWNuiZIkwu9KrKdA1iJKfsfTVxE6NA==", - "license": "BSD-3-Clause" - }, - "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==", - "license": "MIT" - }, - "node_modules/buffer-json": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/buffer-json/-/buffer-json-2.0.0.tgz", - "integrity": "sha512-+jjPFVqyfF1esi9fvfUs3NqM0pH1ziZ36VP4hmA/y/Ssfo/5w5xHKfTw9BwQjoJ1w/oVtpLomqwUHKdefGyuHw==", - "dev": true, - "license": "MIT" - }, - "node_modules/buffer-xor": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/buffer-xor/-/buffer-xor-1.0.3.tgz", - "integrity": "sha512-571s0T7nZWK6vB67HI5dyUF7wXiNcfaPPPTl6zYCNApANjIvYJTg7hlud/+cJpdAhS7dVzqMLmfhfHR3rAcOjQ==", - "dev": true, - "license": "MIT" - }, - "node_modules/builtin-status-codes": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/builtin-status-codes/-/builtin-status-codes-3.0.0.tgz", - "integrity": "sha512-HpGFw18DgFWlncDfjTa2rcQ4W88O1mC8e8yZ2AvQY5KDaktSTwo+KRf6nHK6FRI5FyRyb/5T6+TSxfP7QyGsmQ==", - "dev": true, - "license": "MIT" - }, - "node_modules/busboy": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/busboy/-/busboy-1.6.0.tgz", - "integrity": "sha512-8SFQbg/0hQ9xy3UNTB0YEnsNBbWfhf7RtnzpL7TkBiTBRfrQ9Fxcnz7VJsleJpyp6rVLvXiuORqjlHi5q+PYuA==", - "dependencies": { - "streamsearch": "^1.1.0" - }, - "engines": { - "node": ">=10.16.0" - } - }, - "node_modules/bytes": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.2.tgz", - "integrity": "sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==", - "license": "MIT", - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/cacache": { - "version": "15.3.0", - "resolved": "https://registry.npmjs.org/cacache/-/cacache-15.3.0.tgz", - "integrity": "sha512-VVdYzXEn+cnbXpFgWs5hTT7OScegHVmLhJIR8Ufqk3iFD6A6j5iSX1KuBTfNEv4tdJWE2PzA6IVFtcLC7fN9wQ==", - "dev": true, - "license": "ISC", - "dependencies": { - "@npmcli/fs": "^1.0.0", - "@npmcli/move-file": "^1.0.1", - "chownr": "^2.0.0", - "fs-minipass": "^2.0.0", - "glob": "^7.1.4", - "infer-owner": "^1.0.4", - "lru-cache": "^6.0.0", - "minipass": "^3.1.1", - "minipass-collect": "^1.0.2", - "minipass-flush": "^1.0.5", - "minipass-pipeline": "^1.2.2", - "mkdirp": "^1.0.3", - "p-map": "^4.0.0", - "promise-inflight": "^1.0.1", - "rimraf": "^3.0.2", - "ssri": "^8.0.1", - "tar": "^6.0.2", - "unique-filename": "^1.1.1" - }, - "engines": { - "node": ">= 10" - } - }, - "node_modules/cacache/node_modules/p-map": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/p-map/-/p-map-4.0.0.tgz", - "integrity": "sha512-/bjOqmgETBYB5BoEeGVea8dmvHb2m9GLy1E9W43yeyfP6QQCZGFNa+XRceJEuDB6zqr+gKpIAmlLebMpykw/MQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "aggregate-error": "^3.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/cache-base": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/cache-base/-/cache-base-1.0.1.tgz", - "integrity": "sha512-AKcdTnFSWATd5/GCPRxr2ChwIJ85CeyrEyjRHlKxQ56d4XJMGym0uAiKn0xbLOGOl3+yRpOTi484dVCEc5AUzQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "collection-visit": "^1.0.0", - "component-emitter": "^1.2.1", - "get-value": "^2.0.6", - "has-value": "^1.0.0", - "isobject": "^3.0.1", - "set-value": "^2.0.0", - "to-object-path": "^0.3.0", - "union-value": "^1.0.0", - "unset-value": "^1.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/cache-loader": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/cache-loader/-/cache-loader-4.1.0.tgz", - "integrity": "sha512-ftOayxve0PwKzBF/GLsZNC9fJBXl8lkZE3TOsjkboHfVHVkL39iUEs1FO07A33mizmci5Dudt38UZrrYXDtbhw==", - "dev": true, - "license": "MIT", - "dependencies": { - "buffer-json": "^2.0.0", - "find-cache-dir": "^3.0.0", - "loader-utils": "^1.2.3", - "mkdirp": "^0.5.1", - "neo-async": "^2.6.1", - "schema-utils": "^2.0.0" - }, - "engines": { - "node": ">= 8.9.0" - }, - "peerDependencies": { - "webpack": "^4.0.0" - } - }, - "node_modules/cache-loader/node_modules/mkdirp": { - "version": "0.5.6", - "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.6.tgz", - "integrity": "sha512-FP+p8RB8OWpF3YZBCrP5gtADmtXApB5AMLn+vdyA+PyxCjrCs00mjyUozssO33cwDeT3wNGdLxJ5M//YqtHAJw==", - "dev": true, - "license": "MIT", - "dependencies": { - "minimist": "^1.2.6" - }, - "bin": { - "mkdirp": "bin/cmd.js" - } - }, - "node_modules/cacheable-lookup": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/cacheable-lookup/-/cacheable-lookup-6.1.0.tgz", - "integrity": "sha512-KJ/Dmo1lDDhmW2XDPMo+9oiy/CeqosPguPCrgcVzKyZrL6pM1gU2GmPY/xo6OQPTUaA/c0kwHuywB4E6nmT9ww==", - "license": "MIT", - "engines": { - "node": ">=10.6.0" - } - }, - "node_modules/cacheable-request": { - "version": "7.0.4", - "resolved": "https://registry.npmjs.org/cacheable-request/-/cacheable-request-7.0.4.tgz", - "integrity": "sha512-v+p6ongsrp0yTGbJXjgxPow2+DL93DASP4kXCDKb8/bwRtt9OEF3whggkkDkGNzgcWy2XaF4a8nZglC7uElscg==", - "dev": true, - "license": "MIT", - "dependencies": { - "clone-response": "^1.0.2", - "get-stream": "^5.1.0", - "http-cache-semantics": "^4.0.0", - "keyv": "^4.0.0", - "lowercase-keys": "^2.0.0", - "normalize-url": "^6.0.1", - "responselike": "^2.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/cacheable-request/node_modules/get-stream": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-5.2.0.tgz", - "integrity": "sha512-nBF+F1rAZVCu/p7rjzgA+Yb4lfYXrpl7a6VmJrU8wF9I1CKvP/QwPNZHnOlwbTkY6dvtFIzFMSyQXbLoTQPRpA==", - "dev": true, - "license": "MIT", - "dependencies": { - "pump": "^3.0.0" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/caching-transform": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/caching-transform/-/caching-transform-4.0.0.tgz", - "integrity": "sha512-kpqOvwXnjjN44D89K5ccQC+RUrsy7jB/XLlRrx0D7/2HNcTPqzsb6XgYoErwko6QsV184CA2YgS1fxDiiDZMWA==", - "dev": true, - "license": "MIT", - "dependencies": { - "hasha": "^5.0.0", - "make-dir": "^3.0.0", - "package-hash": "^4.0.0", - "write-file-atomic": "^3.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/call-bind": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.7.tgz", - "integrity": "sha512-GHTSNSYICQ7scH7sZ+M2rFopRoLh8t2bLSW6BbgrtLsahOIB5iyAVJf9GjWK3cYTDaMj4XdBpM1cA6pIS0Kv2w==", - "license": "MIT", - "dependencies": { - "es-define-property": "^1.0.0", - "es-errors": "^1.3.0", - "function-bind": "^1.1.2", - "get-intrinsic": "^1.2.4", - "set-function-length": "^1.2.1" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/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==", - "license": "MIT" - }, - "node_modules/callsite": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/callsite/-/callsite-1.0.0.tgz", - "integrity": "sha512-0vdNRFXn5q+dtOqjfFtmtlI9N2eVZ7LMyEV2iKC5mEEFvSg/69Ml6b/WU2qF8W1nLRa0wiSrDT3Y5jOHZCwKPQ==", - "dev": true, - "engines": { - "node": "*" - } - }, - "node_modules/callsites": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", - "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=6" - } - }, - "node_modules/camel-case": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/camel-case/-/camel-case-3.0.0.tgz", - "integrity": "sha512-+MbKztAYHXPr1jNTSKQF52VpcFjwY5RkR7fxksV8Doo4KAYc5Fl4UJRgthBbTmEx8C54DqahhbLJkDwjI3PI/w==", - "license": "MIT", - "dependencies": { - "no-case": "^2.2.0", - "upper-case": "^1.1.1" - } - }, - "node_modules/camelcase": { - "version": "5.3.1", - "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz", - "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==", - "license": "MIT", - "engines": { - "node": ">=6" - } - }, - "node_modules/camelcase-keys": { - "version": "6.2.2", - "resolved": "https://registry.npmjs.org/camelcase-keys/-/camelcase-keys-6.2.2.tgz", - "integrity": "sha512-YrwaA0vEKazPBkn0ipTiMpSajYDSe+KjQfrjhcBMxJt/znbvlHd8Pw/Vamaz5EB4Wfhs3SUR3Z9mwRu/P3s3Yg==", - "dev": true, - "license": "MIT", - "dependencies": { - "camelcase": "^5.3.1", - "map-obj": "^4.0.0", - "quick-lru": "^4.0.1" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/camelcase-keys/node_modules/quick-lru": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/quick-lru/-/quick-lru-4.0.1.tgz", - "integrity": "sha512-ARhCpm70fzdcvNQfPoy49IaanKkTlRWF2JMzqhcJbhSFRZv7nPTvZJdcY7301IPmvW+/p0RgIWnQDLJxifsQ7g==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "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.30001683", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001683.tgz", - "integrity": "sha512-iqmNnThZ0n70mNwvxpEC2nBJ037ZHZUoBI5Gorh1Mw6IlEAZujEoU1tXA628iZfzm7R9FvFzxbfdgml82a3k8Q==", - "dev": true, - "funding": [ - { - "type": "opencollective", - "url": "https://opencollective.com/browserslist" - }, - { - "type": "tidelift", - "url": "https://tidelift.com/funding/github/npm/caniuse-lite" - }, - { - "type": "github", - "url": "https://github.com/sponsors/ai" - } - ], - "license": "CC-BY-4.0" - }, - "node_modules/capitalize": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/capitalize/-/capitalize-2.0.4.tgz", - "integrity": "sha512-wcSyiFqXRYyCoqu0o0ekXzJAKCLMkqWS5QWGlgTJFJKwRmI6pzcN2hBl5VPq9RzLW5Uf4FF/V/lcFfjCtVak2w==", - "license": "MIT" - }, - "node_modules/chalk": { - "version": "5.3.0", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-5.3.0.tgz", - "integrity": "sha512-dLitG79d+GV1Nb/VYcCDFivJeK1hiukt9QjRNVOsUtTy1rR1YJsmpGGTZ3qJos+uw7WmWF4wUwBd9jxjocFC2w==", - "license": "MIT", - "optional": true, - "peer": true, - "engines": { - "node": "^12.17.0 || ^14.13 || >=16.0.0" - }, - "funding": { - "url": "https://github.com/chalk/chalk?sponsor=1" - } - }, - "node_modules/change-case": { - "version": "5.4.4", - "resolved": "https://registry.npmjs.org/change-case/-/change-case-5.4.4.tgz", - "integrity": "sha512-HRQyTk2/YPEkt9TnUPbOpr64Uw3KOicFWPVBb+xiHvd6eBx/qPr9xqfBFDT8P2vWsvvz4jbEkfDe71W3VyNu2w==", - "license": "MIT" - }, - "node_modules/chardet": { - "version": "0.7.0", - "resolved": "https://registry.npmjs.org/chardet/-/chardet-0.7.0.tgz", - "integrity": "sha512-mT8iDcrh03qDGRRmoA2hmBJnxpllMR+0/0qlzjqZES6NdiWDcZkCNAk4rPFZ9Q85r27unkiNNg8ZOiwZXBHwcA==", - "license": "MIT" - }, - "node_modules/cheerio": { - "version": "1.0.0-rc.12", - "resolved": "https://registry.npmjs.org/cheerio/-/cheerio-1.0.0-rc.12.tgz", - "integrity": "sha512-VqR8m68vM46BNnuZ5NtnGBKIE/DfN0cRIzg9n40EIq9NOv90ayxLBXA8fXC5gquFRGJSTRqBq25Jt2ECLR431Q==", - "license": "MIT", - "dependencies": { - "cheerio-select": "^2.1.0", - "dom-serializer": "^2.0.0", - "domhandler": "^5.0.3", - "domutils": "^3.0.1", - "htmlparser2": "^8.0.1", - "parse5": "^7.0.0", - "parse5-htmlparser2-tree-adapter": "^7.0.0" - }, - "engines": { - "node": ">= 6" - }, - "funding": { - "url": "https://github.com/cheeriojs/cheerio?sponsor=1" - } - }, - "node_modules/cheerio-select": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/cheerio-select/-/cheerio-select-2.1.0.tgz", - "integrity": "sha512-9v9kG0LvzrlcungtnJtpGNxY+fzECQKhK4EGJX2vByejiMX84MFNQw4UxPJl3bFbTMw+Dfs37XaIkCwTZfLh4g==", - "license": "BSD-2-Clause", - "dependencies": { - "boolbase": "^1.0.0", - "css-select": "^5.1.0", - "css-what": "^6.1.0", - "domelementtype": "^2.3.0", - "domhandler": "^5.0.3", - "domutils": "^3.0.1" - }, - "funding": { - "url": "https://github.com/sponsors/fb55" - } - }, - "node_modules/chokidar": { - "version": "3.6.0", - "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.6.0.tgz", - "integrity": "sha512-7VT13fmjotKpGipCW9JEQAusEPE+Ei8nl6/g4FBAmIm0GOOLMua9NDDo/DWp0ZAxCr3cPq5ZpBqmPAQgDda2Pw==", - "license": "MIT", - "dependencies": { - "anymatch": "~3.1.2", - "braces": "~3.0.2", - "glob-parent": "~5.1.2", - "is-binary-path": "~2.1.0", - "is-glob": "~4.0.1", - "normalize-path": "~3.0.0", - "readdirp": "~3.6.0" - }, - "engines": { - "node": ">= 8.10.0" - }, - "funding": { - "url": "https://paulmillr.com/funding/" - }, - "optionalDependencies": { - "fsevents": "~2.3.2" - } - }, - "node_modules/chownr": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/chownr/-/chownr-2.0.0.tgz", - "integrity": "sha512-bIomtDF5KGpdogkLd9VspvFzk9KfpyyGlS8YFVZl7TGPBHL5snIOnxeshwVgPteQ9b4Eydl+pVbIyE1DcvCWgQ==", - "dev": true, - "license": "ISC", - "engines": { - "node": ">=10" - } - }, - "node_modules/chrome-trace-event": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/chrome-trace-event/-/chrome-trace-event-1.0.4.tgz", - "integrity": "sha512-rNjApaLzuwaOTjCiT8lSDdGN1APCiqkChLMJxJPWLunPAt5fy8xgU9/jNOchV84wfIxrA0lRQB7oCT8jrn/wrQ==", - "dev": true, - "license": "MIT", - "engines": { - "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==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/sibiraj-s" - } - ], - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/cipher-base": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/cipher-base/-/cipher-base-1.0.5.tgz", - "integrity": "sha512-xq7ICKB4TMHUx7Tz1L9O2SGKOhYMOTR32oir45Bq28/AQTpHogKgHcoYFSdRbMtddl+ozNXfXY9jWcgYKmde0w==", - "dev": true, - "license": "MIT", - "dependencies": { - "inherits": "^2.0.4", - "safe-buffer": "^5.2.1" - }, - "engines": { - "node": ">= 0.10" - } - }, - "node_modules/class-utils": { - "version": "0.3.6", - "resolved": "https://registry.npmjs.org/class-utils/-/class-utils-0.3.6.tgz", - "integrity": "sha512-qOhPa/Fj7s6TY8H8esGu5QNpMMQxz79h+urzrNYN6mn+9BnxlDGf5QZ+XeCDsxSjPqsSR56XOZOJmpeurnLMeg==", - "dev": true, - "license": "MIT", - "dependencies": { - "arr-union": "^3.1.0", - "define-property": "^0.2.5", - "isobject": "^3.0.0", - "static-extend": "^0.1.1" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/class-utils/node_modules/define-property": { - "version": "0.2.5", - "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", - "integrity": "sha512-Rr7ADjQZenceVOAKop6ALkkRAmH1A4Gx9hV/7ZujPUN2rkATqFO0JZLZInbAjpZYoJ1gUx8MRMQVkYemcbMSTA==", - "dev": true, - "license": "MIT", - "dependencies": { - "is-descriptor": "^0.1.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/class-utils/node_modules/is-descriptor": { - "version": "0.1.7", - "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-0.1.7.tgz", - "integrity": "sha512-C3grZTvObeN1xud4cRWl366OMXZTj0+HGyk4hvfpx4ZHt1Pb60ANSXqCK7pdOTeUQpRzECBSTphqvD7U+l22Eg==", - "dev": true, - "license": "MIT", - "dependencies": { - "is-accessor-descriptor": "^1.0.1", - "is-data-descriptor": "^1.0.1" - }, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/clean-css": { - "version": "4.2.4", - "resolved": "https://registry.npmjs.org/clean-css/-/clean-css-4.2.4.tgz", - "integrity": "sha512-EJUDT7nDVFDvaQgAo2G/PJvxmp1o/c6iXLbswsBbUFXi1Nr+AjA2cKmfbKDMjMvzEe75g3P6JkaDDAKk96A85A==", - "license": "MIT", - "dependencies": { - "source-map": "~0.6.0" - }, - "engines": { - "node": ">= 4.0" - } - }, - "node_modules/clean-modules": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/clean-modules/-/clean-modules-2.0.6.tgz", - "integrity": "sha512-e3R40CfLfzS3tlBWO5RcIMZYsIecEERklMln5qb4HvvujyvLLTi2lPEhhCGtH5gJL+4t0lVguiynMHXNkNdoDA==", - "dev": true, - "license": "ISC", - "dependencies": { - "arg": "^5.0.1", - "picomatch": "^2.3.0", - "pretty-bytes": "^5.6.0", - "pretty-ms": "^7.0.1", - "supports-color": "^8.1.1", - "yargs": "^17.1.1" - }, - "bin": { - "clean-modules": "bin/cli.js" - }, - "engines": { - "node": ">=12" - } - }, - "node_modules/clean-stack": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/clean-stack/-/clean-stack-2.2.0.tgz", - "integrity": "sha512-4diC9HaTE+KRAMWhDhrGOECgWZxoevMc5TlkObMqNSsVU62PYzXZ/SMTjzyGAFF1YusgxGcSWTEXBhp0CPwQ1A==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=6" - } - }, - "node_modules/cli-boxes": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/cli-boxes/-/cli-boxes-2.2.1.tgz", - "integrity": "sha512-y4coMcylgSCdVinjiDBuR8PCC2bLjyGTwEmPb9NHR/QaNU6EUOXcTY/s6VjGMD6ENSEaeQYHCY0GNGS5jfMwPw==", - "license": "MIT", - "engines": { - "node": ">=6" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/cli-color": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/cli-color/-/cli-color-2.0.4.tgz", - "integrity": "sha512-zlnpg0jNcibNrO7GG9IeHH7maWFeCz+Ja1wx/7tZNU5ASSSSZ+/qZciM0/LHCYxSdqv5h2sdbQ/PXYdOuetXvA==", - "license": "ISC", - "dependencies": { - "d": "^1.0.1", - "es5-ext": "^0.10.64", - "es6-iterator": "^2.0.3", - "memoizee": "^0.4.15", - "timers-ext": "^0.1.7" - }, - "engines": { - "node": ">=0.10" - } - }, - "node_modules/cli-cursor": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-3.1.0.tgz", - "integrity": "sha512-I/zHAwsKf9FqGoXM4WWRACob9+SNukZTd94DWF57E4toouRulbCxcUh6RKUEOQlYTHJnzkPMySvPNaaSLNfLZw==", - "license": "MIT", - "dependencies": { - "restore-cursor": "^3.1.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/cli-width": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/cli-width/-/cli-width-3.0.0.tgz", - "integrity": "sha512-FxqpkPPwu1HjuN93Omfm4h8uIanXofW0RxVEW3k5RKx+mJJYSthzNhp32Kzxxy3YAEZ/Dc/EWN1vZRY0+kOhbw==", - "license": "ISC", - "engines": { - "node": ">= 10" - } - }, - "node_modules/cliui": { - "version": "8.0.1", - "resolved": "https://registry.npmjs.org/cliui/-/cliui-8.0.1.tgz", - "integrity": "sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ==", - "license": "ISC", - "dependencies": { - "string-width": "^4.2.0", - "strip-ansi": "^6.0.1", - "wrap-ansi": "^7.0.0" - }, - "engines": { - "node": ">=12" - } - }, - "node_modules/clone-response": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/clone-response/-/clone-response-1.0.3.tgz", - "integrity": "sha512-ROoL94jJH2dUVML2Y/5PEDNaSHgeOdSDicUyS7izcF63G6sTc/FTjLub4b8Il9S8S0beOfYt0TaA5qvFK+w0wA==", - "dev": true, - "license": "MIT", - "dependencies": { - "mimic-response": "^1.0.0" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/collection-visit": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/collection-visit/-/collection-visit-1.0.0.tgz", - "integrity": "sha512-lNkKvzEeMBBjUGHZ+q6z9pSJla0KWAQPvtzhEV9+iGyQYG+pBpl7xKDhxoNSOZH2hhv0v5k0y2yAM4o4SjoSkw==", - "dev": true, - "license": "MIT", - "dependencies": { - "map-visit": "^1.0.0", - "object-visit": "^1.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "license": "MIT", - "dependencies": { - "color-name": "~1.1.4" - }, - "engines": { - "node": ">=7.0.0" - } - }, - "node_modules/color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "license": "MIT" - }, - "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.20", - "resolved": "https://registry.npmjs.org/colorette/-/colorette-2.0.20.tgz", - "integrity": "sha512-IfEDxwoWIjkeXL1eXcDiow4UbKjhLdq6/EuSVR9GMN7KVH3r9gQ83e73hsz1Nd1T3ijd5xv1wcWRYO+D6kCI2w==", - "dev": true, - "license": "MIT" - }, - "node_modules/combined-stream": { - "version": "1.0.8", - "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz", - "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==", - "license": "MIT", - "dependencies": { - "delayed-stream": "~1.0.0" - }, - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/commander": { - "version": "12.1.0", - "resolved": "https://registry.npmjs.org/commander/-/commander-12.1.0.tgz", - "integrity": "sha512-Vw8qHK3bZM9y/P10u3Vib8o/DdkvA2OtPtZvD871QKjy74Wj1WSKFILMPRPSdUSx5RFK1arlJzEtA4PkFgnbuA==", - "license": "MIT", - "engines": { - "node": ">=18" - } - }, - "node_modules/commondir": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/commondir/-/commondir-1.0.1.tgz", - "integrity": "sha512-W9pAhw0ja1Edb5GVdIF1mjZw/ASI0AlShXM83UUGe2DVr5TdAPEA1OA8m/g8zWp9x6On7gqufY+FatDbC3MDQg==", - "dev": true, - "license": "MIT" - }, - "node_modules/compare-func": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/compare-func/-/compare-func-2.0.0.tgz", - "integrity": "sha512-zHig5N+tPWARooBnb0Zx1MFcdfpyJrfTJ3Y5L+IFvUm8rM74hHz66z0gw0x4tijh5CorKkKUCnW82R2vmpeCRA==", - "dev": true, - "license": "MIT", - "dependencies": { - "array-ify": "^1.0.0", - "dot-prop": "^5.1.0" - } - }, - "node_modules/component-emitter": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/component-emitter/-/component-emitter-1.3.1.tgz", - "integrity": "sha512-T0+barUSQRTUQASh8bx02dl+DhF54GtIDY13Y3m9oWTklKbb3Wv974meRpeZ3lp1JpLVECWWNHC4vaG2XHXouQ==", - "dev": true, - "license": "MIT", - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/compressible": { - "version": "2.0.18", - "resolved": "https://registry.npmjs.org/compressible/-/compressible-2.0.18.tgz", - "integrity": "sha512-AF3r7P5dWxL8MxyITRMlORQNaOA2IkAFaTr4k7BUumjPtRpGDTZpl0Pb1XCO6JeDCBdp126Cgs9sMxqSjgYyRg==", - "license": "MIT", - "dependencies": { - "mime-db": ">= 1.43.0 < 2" - }, - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/compression": { - "version": "1.7.5", - "resolved": "https://registry.npmjs.org/compression/-/compression-1.7.5.tgz", - "integrity": "sha512-bQJ0YRck5ak3LgtnpKkiabX5pNF7tMUh1BSy2ZBOTh0Dim0BUu6aPPwByIns6/A5Prh8PufSPerMDUklpzes2Q==", - "license": "MIT", - "dependencies": { - "bytes": "3.1.2", - "compressible": "~2.0.18", - "debug": "2.6.9", - "negotiator": "~0.6.4", - "on-headers": "~1.0.2", - "safe-buffer": "5.2.1", - "vary": "~1.1.2" - }, - "engines": { - "node": ">= 0.8.0" - } - }, - "node_modules/compression/node_modules/debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", - "license": "MIT", - "dependencies": { - "ms": "2.0.0" - } - }, - "node_modules/compression/node_modules/ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", - "license": "MIT" - }, - "node_modules/compression/node_modules/negotiator": { - "version": "0.6.4", - "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.4.tgz", - "integrity": "sha512-myRT3DiWPHqho5PrJaIRyaMv2kgYf0mUVgBNOYMuCH5Ki1yEiQaf/ZJuQ62nvpc44wL5WDbTX7yGJi1Neevw8w==", - "license": "MIT", - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/concat-map": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", - "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==", - "license": "MIT" - }, - "node_modules/concat-stream": { - "version": "1.6.2", - "resolved": "https://registry.npmjs.org/concat-stream/-/concat-stream-1.6.2.tgz", - "integrity": "sha512-27HBghJxjiZtIk3Ycvn/4kbJk/1uZuJFfuPEns6LaEvpvG1f0hTea8lilrouyo9mVc2GWdcEZ8OLoGmSADlrCw==", - "engines": [ - "node >= 0.8" - ], - "license": "MIT", - "dependencies": { - "buffer-from": "^1.0.0", - "inherits": "^2.0.3", - "readable-stream": "^2.2.2", - "typedarray": "^0.0.6" - } - }, - "node_modules/config": { - "version": "1.31.0", - "resolved": "https://registry.npmjs.org/config/-/config-1.31.0.tgz", - "integrity": "sha512-Ep/l9Rd1J9IPueztJfpbOqVzuKHQh4ZODMNt9xqTYdBBNRXbV4oTu34kCkkfdRVcDq0ohtpaeXGgb+c0LQxFRA==", - "license": "MIT", - "dependencies": { - "json5": "^1.0.1" - }, - "engines": { - "node": ">= 4.0.0" - } - }, - "node_modules/config-chain": { - "version": "1.1.13", - "resolved": "https://registry.npmjs.org/config-chain/-/config-chain-1.1.13.tgz", - "integrity": "sha512-qj+f8APARXHrM0hraqXYb2/bOVSV4PvJQlNZ/DVj0QrmNM2q2euizkeuVckQ57J+W0mRH6Hvi+k50M4Jul2VRQ==", - "license": "MIT", - "dependencies": { - "ini": "^1.3.4", - "proto-list": "~1.2.1" - } - }, - "node_modules/config/node_modules/json5": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/json5/-/json5-1.0.2.tgz", - "integrity": "sha512-g1MWMLBiz8FKi1e4w0UyVL3w+iJceWAFBAaBnnGKOpNa5f8TLktkbre1+s6oICydWAm+HRUGTmI+//xv2hvXYA==", - "license": "MIT", - "dependencies": { - "minimist": "^1.2.0" - }, - "bin": { - "json5": "lib/cli.js" - } - }, - "node_modules/connect": { - "version": "3.7.0", - "resolved": "https://registry.npmjs.org/connect/-/connect-3.7.0.tgz", - "integrity": "sha512-ZqRXc+tZukToSNmh5C2iWMSoV3X1YUcPbqEM4DkEG5tNQXrQUZCNVGGv3IuicnkMtPfGf3Xtp8WCXs295iQ1pQ==", - "license": "MIT", - "dependencies": { - "debug": "2.6.9", - "finalhandler": "1.1.2", - "parseurl": "~1.3.3", - "utils-merge": "1.0.1" - }, - "engines": { - "node": ">= 0.10.0" - } - }, - "node_modules/connect/node_modules/debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", - "license": "MIT", - "dependencies": { - "ms": "2.0.0" - } - }, - "node_modules/connect/node_modules/encodeurl": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.2.tgz", - "integrity": "sha512-TPJXq8JqFaVYm2CWmPvnP2Iyo4ZSM7/QKcSmuMLDObfpH5fi7RUGmd/rTDf+rut/saiDiQEeVTNgAmJEdAOx0w==", - "license": "MIT", - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/connect/node_modules/finalhandler": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.1.2.tgz", - "integrity": "sha512-aAWcW57uxVNrQZqFXjITpW3sIUQmHGG3qSb9mUah9MgMC4NeWhNOlNjXEYq3HjRAvL6arUviZGGJsBg6z0zsWA==", - "license": "MIT", - "dependencies": { - "debug": "2.6.9", - "encodeurl": "~1.0.2", - "escape-html": "~1.0.3", - "on-finished": "~2.3.0", - "parseurl": "~1.3.3", - "statuses": "~1.5.0", - "unpipe": "~1.0.0" - }, - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/connect/node_modules/ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", - "license": "MIT" - }, - "node_modules/connect/node_modules/on-finished": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.3.0.tgz", - "integrity": "sha512-ikqdkGAAyf/X/gPhXGvfgAytDZtDbr+bkNUJ0N9h5MI/dmdgCs3l6hoHrcUv41sRKew3jIwrp4qQDXiK99Utww==", - "license": "MIT", - "dependencies": { - "ee-first": "1.1.1" - }, - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/connect/node_modules/statuses": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.5.0.tgz", - "integrity": "sha512-OpZ3zP+jT1PI7I8nemJX4AKmAX070ZkYPVWV/AaKTJl+tXCTGyVdC1a4SL8RUQYEwk/f34ZX8UTykN68FwrqAA==", - "license": "MIT", - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/consola": { - "version": "2.15.3", - "resolved": "https://registry.npmjs.org/consola/-/consola-2.15.3.tgz", - "integrity": "sha512-9vAdYbHj6x2fLKC4+oPH0kFzY/orMZyG2Aj+kNylHxKGJ/Ed4dpNyAQYwJOdqO4zdM7XpVHmyejQDcQHrnuXbw==", - "license": "MIT" - }, - "node_modules/console-browserify": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/console-browserify/-/console-browserify-1.2.0.tgz", - "integrity": "sha512-ZMkYO/LkF17QvCPqM0gxw8yUzigAOZOSWSHg91FH6orS7vcEj5dVZTidN2fQ14yBSdg97RqhSNwLUXInd52OTA==", - "dev": true - }, - "node_modules/consolidate": { - "version": "0.15.1", - "resolved": "https://registry.npmjs.org/consolidate/-/consolidate-0.15.1.tgz", - "integrity": "sha512-DW46nrsMJgy9kqAbPt5rKaCr7uFtpo4mSUvLHIUbJEjm0vo+aY5QLwBUq3FK4tRnJr/X0Psc0C4jf/h+HtXSMw==", - "deprecated": "Please upgrade to consolidate v1.0.0+ as it has been modernized with several long-awaited fixes implemented. Maintenance is supported by Forward Email at https://forwardemail.net ; follow/watch https://github.com/ladjs/consolidate for updates and release changelog", - "dev": true, - "license": "MIT", - "dependencies": { - "bluebird": "^3.1.1" - }, - "engines": { - "node": ">= 0.10.0" - } - }, - "node_modules/constants-browserify": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/constants-browserify/-/constants-browserify-1.0.0.tgz", - "integrity": "sha512-xFxOwqIzR/e1k1gLiWEophSCMqXcwVHIH7akf7b/vxcUeGunlj3hvZaaqxwHsTgn+IndtkQJgSztIDWeumWJDQ==", - "dev": true, - "license": "MIT" - }, - "node_modules/content-disposition": { - "version": "0.5.4", - "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.4.tgz", - "integrity": "sha512-FveZTNuGw04cxlAiWbzi6zTAL/lhehaWbTtgluJh4/E95DqMwTmha3KZN1aAWA8cFIhHzMZUvLevkw5Rqk+tSQ==", - "license": "MIT", - "dependencies": { - "safe-buffer": "5.2.1" - }, - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/content-type": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/content-type/-/content-type-1.0.5.tgz", - "integrity": "sha512-nTjqfcBFEipKdXCv4YDQWCfmcLZKm81ldF0pAopTvyrFGVbcR6P/VAAd5G7N+0tTr8QqiU0tFadD6FK4NtJwOA==", - "license": "MIT", - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/conventional-changelog-angular": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/conventional-changelog-angular/-/conventional-changelog-angular-6.0.0.tgz", - "integrity": "sha512-6qLgrBF4gueoC7AFVHu51nHL9pF9FRjXrH+ceVf7WmAfH3gs+gEYOkvxhjMPjZu57I4AGUGoNTY8V7Hrgf1uqg==", - "dev": true, - "license": "ISC", - "dependencies": { - "compare-func": "^2.0.0" - }, - "engines": { - "node": ">=14" - } - }, - "node_modules/conventional-changelog-conventionalcommits": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/conventional-changelog-conventionalcommits/-/conventional-changelog-conventionalcommits-6.1.0.tgz", - "integrity": "sha512-3cS3GEtR78zTfMzk0AizXKKIdN4OvSh7ibNz6/DPbhWWQu7LqE/8+/GqSodV+sywUR2gpJAdP/1JFf4XtN7Zpw==", - "dev": true, - "license": "ISC", - "dependencies": { - "compare-func": "^2.0.0" - }, - "engines": { - "node": ">=14" - } - }, - "node_modules/conventional-commits-parser": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/conventional-commits-parser/-/conventional-commits-parser-4.0.0.tgz", - "integrity": "sha512-WRv5j1FsVM5FISJkoYMR6tPk07fkKT0UodruX4je86V4owk451yjXAKzKAPOs9l7y59E2viHUS9eQ+dfUA9NSg==", - "dev": true, - "license": "MIT", - "dependencies": { - "is-text-path": "^1.0.1", - "JSONStream": "^1.3.5", - "meow": "^8.1.2", - "split2": "^3.2.2" - }, - "bin": { - "conventional-commits-parser": "cli.js" - }, - "engines": { - "node": ">=14" - } - }, - "node_modules/convert-source-map": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-2.0.0.tgz", - "integrity": "sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==", - "dev": true, - "license": "MIT" - }, - "node_modules/cookie": { - "version": "0.6.0", - "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.6.0.tgz", - "integrity": "sha512-U71cyTamuh1CRNCfpGY6to28lxvNwPG4Guz/EVjgf3Jmzv0vlDp1atT9eS5dDjMYHucpHbWns6Lwf3BKz6svdw==", - "license": "MIT", - "peer": true, - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/cookie-parser": { - "version": "1.4.7", - "resolved": "https://registry.npmjs.org/cookie-parser/-/cookie-parser-1.4.7.tgz", - "integrity": "sha512-nGUvgXnotP3BsjiLX2ypbQnWoGUPIIfHQNZkkC668ntrzGWEZVW70HDEB1qnNGMicPje6EttlIgzo51YSwNQGw==", - "license": "MIT", - "dependencies": { - "cookie": "0.7.2", - "cookie-signature": "1.0.6" - }, - "engines": { - "node": ">= 0.8.0" - } - }, - "node_modules/cookie-parser/node_modules/cookie": { - "version": "0.7.2", - "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.7.2.tgz", - "integrity": "sha512-yki5XnKuf750l50uGTllt6kKILY4nQ1eNIQatoXEByZ5dWgnKqbnqmTrBE5B4N7lrMJKQ2ytWMiTO2o0v6Ew/w==", - "license": "MIT", - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/cookie-signature": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.0.6.tgz", - "integrity": "sha512-QADzlaHc8icV8I7vbaJXJwod9HWYp8uCqf1xa4OfNu1T7JVxQIrUgOWtHdNDtPiywmFbiS12VjotIXLrKM3orQ==", - "license": "MIT" - }, - "node_modules/cookie-universal": { - "version": "2.2.2", - "resolved": "https://registry.npmjs.org/cookie-universal/-/cookie-universal-2.2.2.tgz", - "integrity": "sha512-nUXF6HH2YKbn8vGcdSzWJhjRkDHbnbekuVu2nsRu00zYsX7o/H3xGJRlPVoM4wX/8cpJYpyi9nDt+boER0Wjug==", - "license": "MIT", - "dependencies": { - "@types/cookie": "^0.3.3", - "cookie": "^0.4.0" - } - }, - "node_modules/cookie-universal-nuxt": { - "version": "2.2.2", - "resolved": "https://registry.npmjs.org/cookie-universal-nuxt/-/cookie-universal-nuxt-2.2.2.tgz", - "integrity": "sha512-Pr6P5UCzl1EAvPh7z7jFkknBw0KTdykm6gFmPHrH4LV9s3flVmAH0ZP/ZqUXcp6b0SKZfizkn+XR1cO+QinGhQ==", - "license": "MIT", - "dependencies": { - "@types/cookie": "^0.3.3", - "cookie-universal": "^2.2.2" - } - }, - "node_modules/cookie-universal/node_modules/cookie": { - "version": "0.4.2", - "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.4.2.tgz", - "integrity": "sha512-aSWTXFzaKWkvHO1Ny/s+ePFpvKsPnjc551iI41v3ny/ow6tBG5Vd+FuqGNhh1LxOmVzOlGUriIlOaokOvhaStA==", - "license": "MIT", - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/cookies": { - "version": "0.7.3", - "resolved": "https://registry.npmjs.org/cookies/-/cookies-0.7.3.tgz", - "integrity": "sha512-+gixgxYSgQLTaTIilDHAdlNPZDENDQernEMiIcZpYYP14zgHsCt4Ce1FEjFtcp6GefhozebB6orvhAAWx/IS0A==", - "license": "MIT", - "dependencies": { - "depd": "~1.1.2", - "keygrip": "~1.0.3" - }, - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/cookies/node_modules/depd": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/depd/-/depd-1.1.2.tgz", - "integrity": "sha512-7emPTl6Dpo6JRXOXjLRxck+FlLRX5847cLKEn00PLAgc3g2hTZZgr+e4c2v6QpSmLeFP3n5yUo7ft6avBK/5jQ==", - "license": "MIT", - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/copy-concurrently": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/copy-concurrently/-/copy-concurrently-1.0.5.tgz", - "integrity": "sha512-f2domd9fsVDFtaFcbaRZuYXwtdmnzqbADSwhSWYxYB/Q8zsdUUFMXVRwXGDMWmbEzAn1kdRrtI1T/KTFOL4X2A==", - "deprecated": "This package is no longer supported.", - "dev": true, - "license": "ISC", - "dependencies": { - "aproba": "^1.1.1", - "fs-write-stream-atomic": "^1.0.8", - "iferr": "^0.1.5", - "mkdirp": "^0.5.1", - "rimraf": "^2.5.4", - "run-queue": "^1.0.0" - } - }, - "node_modules/copy-concurrently/node_modules/mkdirp": { - "version": "0.5.6", - "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.6.tgz", - "integrity": "sha512-FP+p8RB8OWpF3YZBCrP5gtADmtXApB5AMLn+vdyA+PyxCjrCs00mjyUozssO33cwDeT3wNGdLxJ5M//YqtHAJw==", - "dev": true, - "license": "MIT", - "dependencies": { - "minimist": "^1.2.6" - }, - "bin": { - "mkdirp": "bin/cmd.js" - } - }, - "node_modules/copy-concurrently/node_modules/rimraf": { - "version": "2.7.1", - "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.7.1.tgz", - "integrity": "sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w==", - "deprecated": "Rimraf versions prior to v4 are no longer supported", - "dev": true, - "license": "ISC", - "dependencies": { - "glob": "^7.1.3" - }, - "bin": { - "rimraf": "bin.js" - } - }, - "node_modules/copy-descriptor": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/copy-descriptor/-/copy-descriptor-0.1.1.tgz", - "integrity": "sha512-XgZ0pFcakEUlbwQEVNg3+QAis1FyTL3Qel9FYy8pSkQqoG3PNoT0bOCQtOXcOkur21r2Eq2kI+IE+gsmAEVlYw==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/core-js": { - "version": "3.39.0", - "resolved": "https://registry.npmjs.org/core-js/-/core-js-3.39.0.tgz", - "integrity": "sha512-raM0ew0/jJUqkJ0E6e8UDtl+y/7ktFivgWvqw8dNSQeNWoSDLvQ1H/RN3aPXB9tBd4/FhyR4RDPGhsNIMsAn7g==", - "dev": true, - "hasInstallScript": true, - "license": "MIT", - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/core-js" - } - }, - "node_modules/core-js-compat": { - "version": "3.39.0", - "resolved": "https://registry.npmjs.org/core-js-compat/-/core-js-compat-3.39.0.tgz", - "integrity": "sha512-VgEUx3VwlExr5no0tXlBt+silBvhTryPwCXRI2Id1PN8WTKu7MreethvddqOubrYxkFdv/RnYrqlv1sFNAUelw==", - "dev": true, - "license": "MIT", - "dependencies": { - "browserslist": "^4.24.2" - }, - "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", - "integrity": "sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ==", - "license": "MIT" - }, - "node_modules/cors": { - "version": "2.8.5", - "resolved": "https://registry.npmjs.org/cors/-/cors-2.8.5.tgz", - "integrity": "sha512-KIHbLJqu73RGr/hnbrO9uBeixNGuvSQjul/jdFvS/KFSIH1hWVd1ng7zOHx+YrEfInLG7q4n6GHQ9cDtxv/P6g==", - "license": "MIT", - "dependencies": { - "object-assign": "^4", - "vary": "^1" - }, - "engines": { - "node": ">= 0.10" - } - }, - "node_modules/cosmiconfig": { - "version": "8.3.6", - "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-8.3.6.tgz", - "integrity": "sha512-kcZ6+W5QzcJ3P1Mt+83OUv/oHFqZHIx8DuxG6eZ5RGMERoLqp4BuGjhHLYGK+Kf5XVkQvqBSmAy/nGWN3qDgEA==", - "dev": true, - "license": "MIT", - "dependencies": { - "import-fresh": "^3.3.0", - "js-yaml": "^4.1.0", - "parse-json": "^5.2.0", - "path-type": "^4.0.0" - }, - "engines": { - "node": ">=14" - }, - "funding": { - "url": "https://github.com/sponsors/d-fischer" - }, - "peerDependencies": { - "typescript": ">=4.9.5" - }, - "peerDependenciesMeta": { - "typescript": { - "optional": true - } - } - }, - "node_modules/cosmiconfig-typescript-loader": { - "version": "4.4.0", - "resolved": "https://registry.npmjs.org/cosmiconfig-typescript-loader/-/cosmiconfig-typescript-loader-4.4.0.tgz", - "integrity": "sha512-BabizFdC3wBHhbI4kJh0VkQP9GkBfoHPydD0COMce1nJ1kJAB3F2TmJ/I7diULBKtmEWSwEbuN/KDtgnmUUVmw==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=v14.21.3" - }, - "peerDependencies": { - "@types/node": "*", - "cosmiconfig": ">=7", - "ts-node": ">=10", - "typescript": ">=4" - } - }, - "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/crc": { - "version": "4.3.2", - "resolved": "https://registry.npmjs.org/crc/-/crc-4.3.2.tgz", - "integrity": "sha512-uGDHf4KLLh2zsHa8D8hIQ1H/HtFQhyHrc0uhHBcoKGol/Xnb+MPYfUMw7cvON6ze/GUESTudKayDcJC5HnJv1A==", - "license": "MIT", - "engines": { - "node": ">=12" - }, - "peerDependencies": { - "buffer": ">=6.0.3" - }, - "peerDependenciesMeta": { - "buffer": { - "optional": true - } - } - }, - "node_modules/create-ecdh": { - "version": "4.0.4", - "resolved": "https://registry.npmjs.org/create-ecdh/-/create-ecdh-4.0.4.tgz", - "integrity": "sha512-mf+TCx8wWc9VpuxfP2ht0iSISLZnt0JgWlrOKZiNqyUZWnjIaCIVNQArMHnCZKfEYRg6IM7A+NeJoN8gf/Ws0A==", - "dev": true, - "license": "MIT", - "dependencies": { - "bn.js": "^4.1.0", - "elliptic": "^6.5.3" - } - }, - "node_modules/create-hash": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/create-hash/-/create-hash-1.2.0.tgz", - "integrity": "sha512-z00bCGNHDG8mHAkP7CtT1qVu+bFQUPjYq/4Iv3C3kWjTFV10zIjfSoeqXo9Asws8gwSHDGj/hl2u4OGIjapeCg==", - "dev": true, - "license": "MIT", - "dependencies": { - "cipher-base": "^1.0.1", - "inherits": "^2.0.1", - "md5.js": "^1.3.4", - "ripemd160": "^2.0.1", - "sha.js": "^2.4.0" - } - }, - "node_modules/create-hmac": { - "version": "1.1.7", - "resolved": "https://registry.npmjs.org/create-hmac/-/create-hmac-1.1.7.tgz", - "integrity": "sha512-MJG9liiZ+ogc4TzUwuvbER1JRdgvUFSB5+VR/g5h82fGaIRWMWddtKBHi7/sVhfjQZ6SehlyhvQYrcYkaUIpLg==", - "dev": true, - "license": "MIT", - "dependencies": { - "cipher-base": "^1.0.3", - "create-hash": "^1.1.0", - "inherits": "^2.0.1", - "ripemd160": "^2.0.0", - "safe-buffer": "^5.0.1", - "sha.js": "^2.4.8" - } - }, - "node_modules/create-require": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/create-require/-/create-require-1.1.1.tgz", - "integrity": "sha512-dcKFX3jn0MpIaXjisoRvexIJVEKzaq7z2rZKxf+MSr9TkdmHmsU4m2lcLojrj/FHl8mk5VxMmYA+ftRkP/3oKQ==", - "license": "MIT" - }, - "node_modules/cropperjs": { - "version": "1.6.2", - "resolved": "https://registry.npmjs.org/cropperjs/-/cropperjs-1.6.2.tgz", - "integrity": "sha512-nhymn9GdnV3CqiEHJVai54TULFAE3VshJTXSqSJKa8yXAKyBKDWdhHarnlIPrshJ0WMFTGuFvG02YjLXfPiuOA==", - "dev": true, - "license": "MIT" - }, - "node_modules/cross-spawn": { - "version": "7.0.6", - "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.6.tgz", - "integrity": "sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==", - "license": "MIT", - "dependencies": { - "path-key": "^3.1.0", - "shebang-command": "^2.0.0", - "which": "^2.0.1" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/crypto-browserify": { - "version": "3.12.1", - "resolved": "https://registry.npmjs.org/crypto-browserify/-/crypto-browserify-3.12.1.tgz", - "integrity": "sha512-r4ESw/IlusD17lgQi1O20Fa3qNnsckR126TdUuBgAu7GBYSIPvdNyONd3Zrxh0xCwA4+6w/TDArBPsMvhur+KQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "browserify-cipher": "^1.0.1", - "browserify-sign": "^4.2.3", - "create-ecdh": "^4.0.4", - "create-hash": "^1.2.0", - "create-hmac": "^1.1.7", - "diffie-hellman": "^5.0.3", - "hash-base": "~3.0.4", - "inherits": "^2.0.4", - "pbkdf2": "^3.1.2", - "public-encrypt": "^4.0.3", - "randombytes": "^2.1.0", - "randomfill": "^1.0.4" - }, - "engines": { - "node": ">= 0.10" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/css-blank-pseudo": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/css-blank-pseudo/-/css-blank-pseudo-6.0.2.tgz", - "integrity": "sha512-J/6m+lsqpKPqWHOifAFtKFeGLOzw3jR92rxQcwRUfA/eTuZzKfKlxOmYDx2+tqOPQAueNvBiY8WhAeHu5qNmTg==", - "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/csstools" - }, - { - "type": "opencollective", - "url": "https://opencollective.com/csstools" - } - ], - "license": "MIT-0", - "dependencies": { - "postcss-selector-parser": "^6.0.13" - }, - "engines": { - "node": "^14 || ^16 || >=18" - }, - "peerDependencies": { - "postcss": "^8.4" - } - }, - "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-has-pseudo": { - "version": "6.0.5", - "resolved": "https://registry.npmjs.org/css-has-pseudo/-/css-has-pseudo-6.0.5.tgz", - "integrity": "sha512-ZTv6RlvJJZKp32jPYnAJVhowDCrRrHUTAxsYSuUPBEDJjzws6neMnzkRblxtgmv1RgcV5dhH2gn7E3wA9Wt6lw==", - "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/csstools" - }, - { - "type": "opencollective", - "url": "https://opencollective.com/csstools" - } - ], - "license": "MIT-0", - "dependencies": { - "@csstools/selector-specificity": "^3.1.1", - "postcss-selector-parser": "^6.0.13", - "postcss-value-parser": "^4.2.0" - }, - "engines": { - "node": "^14 || ^16 || >=18" - }, - "peerDependencies": { - "postcss": "^8.4" - } - }, - "node_modules/css-loader": { - "version": "5.2.7", - "resolved": "https://registry.npmjs.org/css-loader/-/css-loader-5.2.7.tgz", - "integrity": "sha512-Q7mOvpBNBG7YrVGMxRxcBJZFL75o+cH2abNASdibkj/fffYD8qWbInZrD0S9ccI6vZclF3DsHE7njGlLtaHbhg==", - "dev": true, - "license": "MIT", - "dependencies": { - "icss-utils": "^5.1.0", - "loader-utils": "^2.0.0", - "postcss": "^8.2.15", - "postcss-modules-extract-imports": "^3.0.0", - "postcss-modules-local-by-default": "^4.0.0", - "postcss-modules-scope": "^3.0.0", - "postcss-modules-values": "^4.0.0", - "postcss-value-parser": "^4.1.0", - "schema-utils": "^3.0.0", - "semver": "^7.3.5" - }, - "engines": { - "node": ">= 10.13.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/webpack" - }, - "peerDependencies": { - "webpack": "^4.27.0 || ^5.0.0" - } - }, - "node_modules/css-loader/node_modules/ajv": { - "version": "6.12.6", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", - "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", - "dev": true, - "license": "MIT", - "dependencies": { - "fast-deep-equal": "^3.1.1", - "fast-json-stable-stringify": "^2.0.0", - "json-schema-traverse": "^0.4.1", - "uri-js": "^4.2.2" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/epoberezkin" - } - }, - "node_modules/css-loader/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", - "peerDependencies": { - "ajv": "^6.9.1" - } - }, - "node_modules/css-loader/node_modules/json-schema-traverse": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", - "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", - "dev": true, - "license": "MIT" - }, - "node_modules/css-loader/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" - } - }, - "node_modules/css-loader/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", - "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/css-prefers-color-scheme": { - "version": "9.0.1", - "resolved": "https://registry.npmjs.org/css-prefers-color-scheme/-/css-prefers-color-scheme-9.0.1.tgz", - "integrity": "sha512-iFit06ochwCKPRiWagbTa1OAWCvWWVdEnIFd8BaRrgO8YrrNh4RAWUQTFcYX5tdFZgFl1DJ3iiULchZyEbnF4g==", - "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/csstools" - }, - { - "type": "opencollective", - "url": "https://opencollective.com/csstools" - } - ], - "license": "MIT-0", - "engines": { - "node": "^14 || ^16 || >=18" - }, - "peerDependencies": { - "postcss": "^8.4" - } - }, - "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==", - "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/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==", - "license": "BSD-2-Clause", - "engines": { - "node": ">= 6" - }, - "funding": { - "url": "https://github.com/sponsors/fb55" - } - }, - "node_modules/cssdb": { - "version": "8.2.1", - "resolved": "https://registry.npmjs.org/cssdb/-/cssdb-8.2.1.tgz", - "integrity": "sha512-KwEPys7lNsC8OjASI8RrmwOYYDcm0JOW9zQhcV83ejYcQkirTEyeAGui8aO2F5PiS6SLpxuTzl6qlMElIdsgIg==", - "dev": true, - "funding": [ - { - "type": "opencollective", - "url": "https://opencollective.com/csstools" - }, - { - "type": "github", - "url": "https://github.com/sponsors/csstools" - } - ], - "license": "MIT-0" - }, - "node_modules/cssesc": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/cssesc/-/cssesc-3.0.0.tgz", - "integrity": "sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg==", - "dev": true, - "license": "MIT", - "bin": { - "cssesc": "bin/cssesc" - }, - "engines": { - "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/csv-stringify": { - "version": "6.5.2", - "resolved": "https://registry.npmjs.org/csv-stringify/-/csv-stringify-6.5.2.tgz", - "integrity": "sha512-RFPahj0sXcmUyjrObAK+DOWtMvMIFV328n4qZJhgX3x2RqkQgOTU2mCUmiFR0CzM6AzChlRSUErjiJeEt8BaQA==", - "license": "MIT" - }, - "node_modules/cuint": { - "version": "0.2.2", - "resolved": "https://registry.npmjs.org/cuint/-/cuint-0.2.2.tgz", - "integrity": "sha512-d4ZVpCW31eWwCMe1YT3ur7mUDnTXbgwyzaL320DrcRT45rfjYxkt5QWLrmOJ+/UEAI2+fQgKe/fCjR8l4TpRgw==", - "dev": true, - "license": "MIT" - }, - "node_modules/cyclist": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/cyclist/-/cyclist-1.0.2.tgz", - "integrity": "sha512-0sVXIohTfLqVIW3kb/0n6IiWF3Ifj5nm2XaSrLq2DI6fKIGa2fYAZdk917rUneaeLVpYfFcyXE2ft0fe3remsA==", - "dev": true, - "license": "MIT" - }, - "node_modules/d": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/d/-/d-1.0.2.tgz", - "integrity": "sha512-MOqHvMWF9/9MX6nza0KgvFH4HpMU0EF5uUDXqX/BtxtU8NfB0QzRtJ8Oe/6SuS4kbhyzVJwjd97EA4PKrzJ8bw==", - "license": "ISC", - "dependencies": { - "es5-ext": "^0.10.64", - "type": "^2.7.2" - }, - "engines": { - "node": ">=0.12" - } - }, - "node_modules/dargs": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/dargs/-/dargs-7.0.0.tgz", - "integrity": "sha512-2iy1EkLdlBzQGvbweYRFxmFath8+K7+AKB0TlhHWkNuH+TmovaMH/Wp7V7R4u7f4SnX3OgLsU9t1NI9ioDnUpg==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/data-view-buffer": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/data-view-buffer/-/data-view-buffer-1.0.1.tgz", - "integrity": "sha512-0lht7OugA5x3iJLOWFhWK/5ehONdprk0ISXqVFn/NFrDu+cuc8iADFrGQz5BnRK7LLU3JmkbXSxaqX+/mXYtUA==", - "dev": true, - "license": "MIT", - "dependencies": { - "call-bind": "^1.0.6", - "es-errors": "^1.3.0", - "is-data-view": "^1.0.1" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/data-view-byte-length": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/data-view-byte-length/-/data-view-byte-length-1.0.1.tgz", - "integrity": "sha512-4J7wRJD3ABAzr8wP+OcIcqq2dlUKp4DVflx++hs5h5ZKydWMI6/D/fAot+yh6g2tHh8fLFTvNOaVN357NvSrOQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "call-bind": "^1.0.7", - "es-errors": "^1.3.0", - "is-data-view": "^1.0.1" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/data-view-byte-offset": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/data-view-byte-offset/-/data-view-byte-offset-1.0.0.tgz", - "integrity": "sha512-t/Ygsytq+R995EJ5PZlD4Cu56sWa8InXySaViRzw9apusqsOO2bQP+SbYzAhR0pFKoB+43lYy8rWban9JSuXnA==", - "dev": true, - "license": "MIT", - "dependencies": { - "call-bind": "^1.0.6", - "es-errors": "^1.3.0", - "is-data-view": "^1.0.1" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/dayjs": { - "version": "1.11.13", - "resolved": "https://registry.npmjs.org/dayjs/-/dayjs-1.11.13.tgz", - "integrity": "sha512-oaMBel6gjolK862uaPQOVTA7q3TZhuSvuMQAAglQDOWYO9A91IrAOUJEyKVlqJlHE0vq5p5UXxzdPfMH/x6xNg==", - "license": "MIT" - }, - "node_modules/de-indent": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/de-indent/-/de-indent-1.0.2.tgz", - "integrity": "sha512-e/1zu3xH5MQryN2zdVaF0OrdNLUbvWxzMbi+iNA6Bky7l1RoP8a2fIbRocyHclXt/arDrrR6lL3TqFD9pMQTsg==", - "dev": true, - "license": "MIT" - }, - "node_modules/debounce": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/debounce/-/debounce-1.2.1.tgz", - "integrity": "sha512-XRRe6Glud4rd/ZGQfiV1ruXSfbvfJedlV9Y6zOlP+2K04vBYiJEte6stfFkCP03aMnY5tsipamumUjL14fofug==", - "dev": true, - "license": "MIT" - }, - "node_modules/debounce-promise": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/debounce-promise/-/debounce-promise-3.1.2.tgz", - "integrity": "sha512-rZHcgBkbYavBeD9ej6sP56XfG53d51CD4dnaw989YX/nZ/ZJfgRx/9ePKmTNiUiyQvh4mtrMoS3OAWW+yoYtpg==", - "dev": true, - "license": "MIT" - }, - "node_modules/debug": { - "version": "4.3.7", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.7.tgz", - "integrity": "sha512-Er2nc/H7RrMXZBFCEim6TCmMk02Z8vLC2Rbi1KEBggpo0fS6l0S1nnapwmIi3yW/+GOJap1Krg4w0Hg80oCqgQ==", - "license": "MIT", - "dependencies": { - "ms": "^2.1.3" - }, - "engines": { - "node": ">=6.0" - }, - "peerDependenciesMeta": { - "supports-color": { - "optional": true - } - } - }, - "node_modules/decache": { - "version": "4.6.2", - "resolved": "https://registry.npmjs.org/decache/-/decache-4.6.2.tgz", - "integrity": "sha512-2LPqkLeu8XWHU8qNCS3kcF6sCcb5zIzvWaAHYSvPfwhdd7mHuah29NssMzrTYyHN4F5oFy2ko9OBYxegtU0FEw==", - "dev": true, - "license": "MIT", - "dependencies": { - "callsite": "^1.0.0" - } - }, - "node_modules/decamelize": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-1.2.0.tgz", - "integrity": "sha512-z2S+W9X73hAUUki+N+9Za2lBlun89zigOyGrsax+KUQ6wKW4ZoWpEYBkGhQjwAjjDCkWxhY0VKEhk8wzY7F5cA==", - "license": "MIT", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/decamelize-keys": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/decamelize-keys/-/decamelize-keys-1.1.1.tgz", - "integrity": "sha512-WiPxgEirIV0/eIOMcnFBA3/IJZAZqKnwAwWyvvdi4lsr1WCN22nhdf/3db3DoZcUjTV2SqfzIwNyp6y2xs3nmg==", - "dev": true, - "license": "MIT", - "dependencies": { - "decamelize": "^1.1.0", - "map-obj": "^1.0.0" - }, - "engines": { - "node": ">=0.10.0" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/decamelize-keys/node_modules/map-obj": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/map-obj/-/map-obj-1.0.1.tgz", - "integrity": "sha512-7N/q3lyZ+LVCp7PzuxrJr4KMbBE2hW7BT7YNia330OFxIf4d3r5zVpicP2650l7CPN6RM9zOJRl3NGpqSiw3Eg==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/decode-uri-component": { - "version": "0.2.2", - "resolved": "https://registry.npmjs.org/decode-uri-component/-/decode-uri-component-0.2.2.tgz", - "integrity": "sha512-FqUYQ+8o158GyGTrMFJms9qh3CqTKvAqgqsTnkLI8sKu0028orqBhxNMFkFen0zGyg6epACD32pjVk58ngIErQ==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=0.10" - } - }, - "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==", - "dev": true, - "license": "MIT", - "dependencies": { - "mimic-response": "^3.1.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==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/deep-is": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.4.tgz", - "integrity": "sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==", - "dev": true, - "license": "MIT" - }, - "node_modules/deepmerge": { - "version": "4.3.1", - "resolved": "https://registry.npmjs.org/deepmerge/-/deepmerge-4.3.1.tgz", - "integrity": "sha512-3sUqbMEc77XqpdNO7FRyRog+eW3ph+GYCbj+rK+uYyRMuwsVy0rMiVtPn+QJlKFvWP/1PYpapqYn0Me2knFn+A==", - "license": "MIT", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/default-require-extensions": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/default-require-extensions/-/default-require-extensions-3.0.1.tgz", - "integrity": "sha512-eXTJmRbm2TIt9MgWTsOH1wEuhew6XGZcMeGKCtLedIg/NCsg1iBePXkceTdK4Fii7pzmN9tGsZhKzZ4h7O/fxw==", - "dev": true, - "license": "MIT", - "dependencies": { - "strip-bom": "^4.0.0" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "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==", - "dev": true, - "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==", - "license": "MIT", - "dependencies": { - "es-define-property": "^1.0.0", - "es-errors": "^1.3.0", - "gopd": "^1.0.1" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/define-properties": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.2.1.tgz", - "integrity": "sha512-8QmQKqEASLd5nx0U1B1okLElbUuuttJ/AnYmRXbbbGDWh6uS208EjD4Xqq/I9wK7u0v6O08XhTWnt5XtEbR6Dg==", - "dev": true, - "license": "MIT", - "dependencies": { - "define-data-property": "^1.0.1", - "has-property-descriptors": "^1.0.0", - "object-keys": "^1.1.1" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/define-property": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/define-property/-/define-property-2.0.2.tgz", - "integrity": "sha512-jwK2UV4cnPpbcG7+VRARKTZPUWowwXA8bzH5NP6ud0oeAxyYPuGZUAC7hMugpCdz4BeSZl2Dl9k66CHJ/46ZYQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "is-descriptor": "^1.0.2", - "isobject": "^3.0.1" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/defu": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/defu/-/defu-5.0.1.tgz", - "integrity": "sha512-EPS1carKg+dkEVy3qNTqIdp2qV7mUP08nIsupfwQpz++slCVRw7qbQyWvSTig+kFPwz2XXp5/kIIkH+CwrJKkQ==", - "license": "MIT" - }, - "node_modules/delay": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/delay/-/delay-5.0.0.tgz", - "integrity": "sha512-ReEBKkIfe4ya47wlPYf/gu5ib6yUG0/Aez0JQZQz94kiWtRQvZIQbTiehsnwHvLSWJnQdhVeqYue7Id1dKr0qw==", - "license": "MIT", - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/delayed-stream": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", - "integrity": "sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==", - "license": "MIT", - "engines": { - "node": ">=0.4.0" - } - }, - "node_modules/depd": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/depd/-/depd-2.0.0.tgz", - "integrity": "sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==", - "license": "MIT", - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/des.js": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/des.js/-/des.js-1.1.0.tgz", - "integrity": "sha512-r17GxjhUCjSRy8aiJpr8/UadFIzMzJGexI3Nmz4ADi9LYSFx4gTBp80+NaX/YsXWWLhpZ7v/v/ubEc/bCNfKwg==", - "dev": true, - "license": "MIT", - "dependencies": { - "inherits": "^2.0.1", - "minimalistic-assert": "^1.0.0" - } - }, - "node_modules/destr": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/destr/-/destr-2.0.3.tgz", - "integrity": "sha512-2N3BOUU4gYMpTP24s5rF5iP7BDr7uNTCs4ozw3kf/eKfvWSIu93GEBi5m427YoyJoeOzQ5smuu4nNAPGb8idSQ==", - "license": "MIT" - }, - "node_modules/destroy": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/destroy/-/destroy-1.2.0.tgz", - "integrity": "sha512-2sJGJTaXIIaR1w4iJSNoN0hnMY7Gpc/n8D4qSCJw8QqFWXf7cuAgnEHxBpweaVcPevC2l3KpjYCx3NypQQgaJg==", - "license": "MIT", - "engines": { - "node": ">= 0.8", - "npm": "1.2.8000 || >= 1.4.16" - } - }, - "node_modules/detect-indent": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/detect-indent/-/detect-indent-5.0.0.tgz", - "integrity": "sha512-rlpvsxUtM0PQvy9iZe640/IWwWYyBsTApREbA1pHOpmOUIl9MkP/U4z7vTtg4Oaojvqhxt7sdufnT0EzGaR31g==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=4" - } - }, - "node_modules/detect-node": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/detect-node/-/detect-node-2.1.0.tgz", - "integrity": "sha512-T0NIuQpnTvFDATNuHN5roPwSBG83rFsuO+MXXH9/3N1eFbn4wcPjttvjMLEPWJ0RGUYgQE7cGgS3tNxbqCGM7g==", - "license": "MIT" - }, - "node_modules/devalue": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/devalue/-/devalue-2.0.1.tgz", - "integrity": "sha512-I2TiqT5iWBEyB8GRfTDP0hiLZ0YeDJZ+upDxjBfOC2lebO5LezQMv7QvIUTzdb64jQyAKLf1AHADtGN+jw6v8Q==", - "license": "MIT" - }, - "node_modules/diff": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/diff/-/diff-5.0.0.tgz", - "integrity": "sha512-/VTCrvm5Z0JGty/BWHljh+BAiw3IK+2j87NGMu8Nwc/f48WoDAC395uomO9ZD117ZOBaHmkX1oyLvkVM/aIT3w==", - "dev": true, - "license": "BSD-3-Clause", - "engines": { - "node": ">=0.3.1" - } - }, - "node_modules/diffie-hellman": { - "version": "5.0.3", - "resolved": "https://registry.npmjs.org/diffie-hellman/-/diffie-hellman-5.0.3.tgz", - "integrity": "sha512-kqag/Nl+f3GwyK25fhUMYj81BUOrZ9IuJsjIcDE5icNM9FJHAVm3VcUDxdLPoQtTuUylWm6ZIknYJwwaPxsUzg==", - "dev": true, - "license": "MIT", - "dependencies": { - "bn.js": "^4.1.0", - "miller-rabin": "^4.0.0", - "randombytes": "^2.0.0" - } - }, - "node_modules/dijkstrajs": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/dijkstrajs/-/dijkstrajs-1.0.3.tgz", - "integrity": "sha512-qiSlmBq9+BCdCA/L46dw8Uy93mloxsPSbwnm5yrKn2vMPiy8KyAskTF6zuV/j5BMsmOGZDPs7KjU+mjb670kfA==", - "license": "MIT" - }, - "node_modules/dir-glob": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/dir-glob/-/dir-glob-3.0.1.tgz", - "integrity": "sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==", - "license": "MIT", - "dependencies": { - "path-type": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/doctrine": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-3.0.0.tgz", - "integrity": "sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==", - "dev": true, - "license": "Apache-2.0", - "dependencies": { - "esutils": "^2.0.2" - }, - "engines": { - "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": "2.0.0", - "resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-2.0.0.tgz", - "integrity": "sha512-wIkAryiqt/nV5EQKqQpo3SToSOV9J0DnbJqwK7Wv/Trc92zIAYZ4FlMu+JPFW1DfGFt81ZTCGgDEabffXeLyJg==", - "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/dom-serializer/node_modules/entities": { - "version": "4.5.0", - "resolved": "https://registry.npmjs.org/entities/-/entities-4.5.0.tgz", - "integrity": "sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw==", - "license": "BSD-2-Clause", - "engines": { - "node": ">=0.12" - }, - "funding": { - "url": "https://github.com/fb55/entities?sponsor=1" - } - }, - "node_modules/domain-browser": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/domain-browser/-/domain-browser-1.2.0.tgz", - "integrity": "sha512-jnjyiM6eRyZl2H+W8Q/zLMA481hzi0eszAaBUzIVnmYVDBbnLxVNnfu1HgEBvCbL+71FrxMl3E6lpKH7Ge3OXA==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=0.4", - "npm": ">=1.2" - } - }, - "node_modules/domelementtype": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-2.3.0.tgz", - "integrity": "sha512-OLETBj6w0OsagBwdXnPdN0cnMfF9opN69co+7ZrbfPGrdpPVNBUj02spi6B1N7wChLQiPn4CSH/zJvXw56gmHw==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/fb55" - } - ], - "license": "BSD-2-Clause" - }, - "node_modules/domhandler": { - "version": "5.0.3", - "resolved": "https://registry.npmjs.org/domhandler/-/domhandler-5.0.3.tgz", - "integrity": "sha512-cgwlv/1iFQiFnU96XXgROh8xTeetsnJiDsTc7TYCLFd9+/WNkIqPTxiM/8pSd8VIrhXGTf1Ny1q1hquVqDJB5w==", - "license": "BSD-2-Clause", - "dependencies": { - "domelementtype": "^2.3.0" - }, - "engines": { - "node": ">= 4" - }, - "funding": { - "url": "https://github.com/fb55/domhandler?sponsor=1" - } - }, - "node_modules/domutils": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/domutils/-/domutils-3.1.0.tgz", - "integrity": "sha512-H78uMmQtI2AhgDJjWeQmHwJJ2bLPD3GMmO7Zja/ZZh84wkm+4ut+IUnUdRa8uCGX88DiVx1j6FRe1XfxEgjEZA==", - "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/dot-case": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/dot-case/-/dot-case-3.0.4.tgz", - "integrity": "sha512-Kv5nKlh6yRrdrGvxeJ2e5y2eRUpkUosIW4A2AS38zwSz27zu7ufDwQPi5Jhs3XAlGNetl3bmnGhQsMtkKJnj3w==", - "dev": true, - "license": "MIT", - "dependencies": { - "no-case": "^3.0.4", - "tslib": "^2.0.3" - } - }, - "node_modules/dot-case/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==", - "dev": true, - "license": "MIT", - "dependencies": { - "tslib": "^2.0.3" - } - }, - "node_modules/dot-case/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==", - "dev": true, - "license": "MIT", - "dependencies": { - "lower-case": "^2.0.2", - "tslib": "^2.0.3" - } - }, - "node_modules/dot-prop": { - "version": "5.3.0", - "resolved": "https://registry.npmjs.org/dot-prop/-/dot-prop-5.3.0.tgz", - "integrity": "sha512-QM8q3zDe58hqUqjraQOmzZ1LIH9SWQJTlEKCH4kJ2oQvLZk7RbQXvtDM2XEq3fwkV9CCvvH4LA0AV+ogFsBM2Q==", - "dev": true, - "license": "MIT", - "dependencies": { - "is-obj": "^2.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/dotenv": { - "version": "16.4.5", - "resolved": "https://registry.npmjs.org/dotenv/-/dotenv-16.4.5.tgz", - "integrity": "sha512-ZmdL2rui+eB2YwhsWzjInR8LldtZHGDoQ1ugH85ppHKwpUHL7j7rN0Ti9NCnGiQbhaZ11FpR+7ao1dNsmduNUg==", - "license": "BSD-2-Clause", - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://dotenvx.com" - } - }, - "node_modules/duplexer": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/duplexer/-/duplexer-0.1.2.tgz", - "integrity": "sha512-jtD6YG370ZCIi/9GTaJKQxWTZD045+4R4hTk/x1UyoqadyJ9x9CgSi1RlVDQF8U2sxLLSnFkCaMihqljHIWgMg==", - "dev": true, - "license": "MIT" - }, - "node_modules/duplexify": { - "version": "3.7.1", - "resolved": "https://registry.npmjs.org/duplexify/-/duplexify-3.7.1.tgz", - "integrity": "sha512-07z8uv2wMyS51kKhD1KsdXJg5WQ6t93RneqRxUHnskXVtlYYkLqM0gqStQZ3pj073g687jPCHrqNfCzawLYh5g==", - "dev": true, - "license": "MIT", - "dependencies": { - "end-of-stream": "^1.0.0", - "inherits": "^2.0.1", - "readable-stream": "^2.0.0", - "stream-shift": "^1.0.0" - } - }, - "node_modules/eastasianwidth": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/eastasianwidth/-/eastasianwidth-0.2.0.tgz", - "integrity": "sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==", - "license": "MIT" - }, - "node_modules/ecdsa-sig-formatter": { - "version": "1.0.11", - "resolved": "https://registry.npmjs.org/ecdsa-sig-formatter/-/ecdsa-sig-formatter-1.0.11.tgz", - "integrity": "sha512-nagl3RYrbNv6kQkeJIpt6NJZy8twLB/2vtz6yN9Z4vRKHN4/QZJIEbqohALSgwKdnksuY3k5Addp5lg8sVoVcQ==", - "license": "Apache-2.0", - "dependencies": { - "safe-buffer": "^5.0.1" - } - }, - "node_modules/editorconfig": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/editorconfig/-/editorconfig-1.0.4.tgz", - "integrity": "sha512-L9Qe08KWTlqYMVvMcTIvMAdl1cDUubzRNYL+WfA4bLDMHe4nemKkpmYzkznE1FwLKu0EEmy6obgQKzMJrg4x9Q==", - "license": "MIT", - "dependencies": { - "@one-ini/wasm": "0.1.1", - "commander": "^10.0.0", - "minimatch": "9.0.1", - "semver": "^7.5.3" - }, - "bin": { - "editorconfig": "bin/editorconfig" - }, - "engines": { - "node": ">=14" - } - }, - "node_modules/editorconfig/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==", - "license": "MIT", - "dependencies": { - "balanced-match": "^1.0.0" - } - }, - "node_modules/editorconfig/node_modules/commander": { - "version": "10.0.1", - "resolved": "https://registry.npmjs.org/commander/-/commander-10.0.1.tgz", - "integrity": "sha512-y4Mg2tXshplEbSGzx7amzPwKKOCGuoSRP/CjEdwwk0FOGlUbq6lKuoyDZTNZkmxHdJtp54hdfY/JUrdL7Xfdug==", - "license": "MIT", - "engines": { - "node": ">=14" - } - }, - "node_modules/editorconfig/node_modules/minimatch": { - "version": "9.0.1", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.1.tgz", - "integrity": "sha512-0jWhJpD/MdhPXwPuiRkCbfYfSKp2qnn2eOc279qI7f+osl/l+prKSrvhg157zSYvx/1nmgn2NqdT6k2Z7zSH9w==", - "license": "ISC", - "dependencies": { - "brace-expansion": "^2.0.1" - }, - "engines": { - "node": ">=16 || 14 >=14.17" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/ee-first": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz", - "integrity": "sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow==", - "license": "MIT" - }, - "node_modules/electron-to-chromium": { - "version": "1.5.63", - "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.63.tgz", - "integrity": "sha512-ddeXKuY9BHo/mw145axlyWjlJ1UBt4WK3AlvkT7W2AbqfRQoacVoRUCF6wL3uIx/8wT9oLKXzI+rFqHHscByaA==", - "dev": true, - "license": "ISC" - }, - "node_modules/elliptic": { - "version": "6.6.1", - "resolved": "https://registry.npmjs.org/elliptic/-/elliptic-6.6.1.tgz", - "integrity": "sha512-RaddvvMatK2LJHqFJ+YA4WysVN5Ita9E35botqIYspQ4TkRAlCicdzKOjlyv/1Za5RyTNn7di//eEV0uTAfe3g==", - "dev": true, - "license": "MIT", - "dependencies": { - "bn.js": "^4.11.9", - "brorand": "^1.1.0", - "hash.js": "^1.0.0", - "hmac-drbg": "^1.0.1", - "inherits": "^2.0.4", - "minimalistic-assert": "^1.0.1", - "minimalistic-crypto-utils": "^1.0.1" - } - }, - "node_modules/email-validator": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/email-validator/-/email-validator-2.0.4.tgz", - "integrity": "sha512-gYCwo7kh5S3IDyZPLZf6hSS0MnZT8QmJFqYvbqlDZSbwdZlY6QZWxJ4i/6UhITOJ4XzyI647Bm2MXKCLqnJ4nQ==", - "engines": { - "node": ">4.0" - } - }, - "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==", - "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": "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==", - "dev": true, - "license": "MIT", - "dependencies": { - "once": "^1.4.0" - } - }, - "node_modules/enhanced-resolve": { - "version": "4.5.0", - "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-4.5.0.tgz", - "integrity": "sha512-Nv9m36S/vxpsI+Hc4/ZGRs0n9mXqSWGGq49zxb/cJfPAQMbUtttJAlNPS4AQzaBdw/pKskw5bMbekT/Y7W/Wlg==", - "dev": true, - "dependencies": { - "graceful-fs": "^4.1.2", - "memory-fs": "^0.5.0", - "tapable": "^1.0.0" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/enquirer": { - "version": "2.4.1", - "resolved": "https://registry.npmjs.org/enquirer/-/enquirer-2.4.1.tgz", - "integrity": "sha512-rRqJg/6gd538VHvR3PSrdRBb/1Vy2YfzHqzvbhGIQpDRKIa4FgV/54b5Q1xYSxOOwKvjXweS26E0Q+nAMwp2pQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "ansi-colors": "^4.1.1", - "strip-ansi": "^6.0.1" - }, - "engines": { - "node": ">=8.6" - } - }, - "node_modules/entities": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/entities/-/entities-2.1.0.tgz", - "integrity": "sha512-hCx1oky9PFrJ611mf0ifBLBRW8lUUVRlFolb5gWRfIELabBlbp9xZvrqZLZAs+NxFnbfQoeGd8wDkygjg7U85w==", - "license": "BSD-2-Clause", - "funding": { - "url": "https://github.com/fb55/entities?sponsor=1" - } - }, - "node_modules/errno": { - "version": "0.1.8", - "resolved": "https://registry.npmjs.org/errno/-/errno-0.1.8.tgz", - "integrity": "sha512-dJ6oBr5SQ1VSd9qkk7ByRgb/1SH4JZjCHSW/mr63/QcXO9zLVxvJ6Oy13nio03rxpSnVDDjFor75SjVeZWPW/A==", - "dev": true, - "license": "MIT", - "dependencies": { - "prr": "~1.0.1" - }, - "bin": { - "errno": "cli.js" - } - }, - "node_modules/error-ex": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.2.tgz", - "integrity": "sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==", - "dev": true, - "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/es-abstract": { - "version": "1.23.5", - "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.23.5.tgz", - "integrity": "sha512-vlmniQ0WNPwXqA0BnmwV3Ng7HxiGlh6r5U6JcTMNx8OilcAGqVJBHJcPjqOMaczU9fRuRK5Px2BdVyPRnKMMVQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "array-buffer-byte-length": "^1.0.1", - "arraybuffer.prototype.slice": "^1.0.3", - "available-typed-arrays": "^1.0.7", - "call-bind": "^1.0.7", - "data-view-buffer": "^1.0.1", - "data-view-byte-length": "^1.0.1", - "data-view-byte-offset": "^1.0.0", - "es-define-property": "^1.0.0", - "es-errors": "^1.3.0", - "es-object-atoms": "^1.0.0", - "es-set-tostringtag": "^2.0.3", - "es-to-primitive": "^1.2.1", - "function.prototype.name": "^1.1.6", - "get-intrinsic": "^1.2.4", - "get-symbol-description": "^1.0.2", - "globalthis": "^1.0.4", - "gopd": "^1.0.1", - "has-property-descriptors": "^1.0.2", - "has-proto": "^1.0.3", - "has-symbols": "^1.0.3", - "hasown": "^2.0.2", - "internal-slot": "^1.0.7", - "is-array-buffer": "^3.0.4", - "is-callable": "^1.2.7", - "is-data-view": "^1.0.1", - "is-negative-zero": "^2.0.3", - "is-regex": "^1.1.4", - "is-shared-array-buffer": "^1.0.3", - "is-string": "^1.0.7", - "is-typed-array": "^1.1.13", - "is-weakref": "^1.0.2", - "object-inspect": "^1.13.3", - "object-keys": "^1.1.1", - "object.assign": "^4.1.5", - "regexp.prototype.flags": "^1.5.3", - "safe-array-concat": "^1.1.2", - "safe-regex-test": "^1.0.3", - "string.prototype.trim": "^1.2.9", - "string.prototype.trimend": "^1.0.8", - "string.prototype.trimstart": "^1.0.8", - "typed-array-buffer": "^1.0.2", - "typed-array-byte-length": "^1.0.1", - "typed-array-byte-offset": "^1.0.2", - "typed-array-length": "^1.0.6", - "unbox-primitive": "^1.0.2", - "which-typed-array": "^1.1.15" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/es-array-method-boxes-properly": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/es-array-method-boxes-properly/-/es-array-method-boxes-properly-1.0.0.tgz", - "integrity": "sha512-wd6JXUmyHmt8T5a2xreUwKcGPq6f1f+WwIJkijUqiGcJz1qqnZgP6XIK+QyIWU5lT7imeNxUll48bziG+TSYcA==", - "dev": true, - "license": "MIT" - }, - "node_modules/es-define-property": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/es-define-property/-/es-define-property-1.0.0.tgz", - "integrity": "sha512-jxayLKShrEqqzJ0eumQbVhTYQM27CfT1T35+gCgDFoL82JLsXqTJ76zv6A0YLOgEnLUMvLzsDsGIrl8NFpT2gQ==", - "license": "MIT", - "dependencies": { - "get-intrinsic": "^1.2.4" - }, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/es-errors": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/es-errors/-/es-errors-1.3.0.tgz", - "integrity": "sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==", - "license": "MIT", - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/es-object-atoms": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/es-object-atoms/-/es-object-atoms-1.0.0.tgz", - "integrity": "sha512-MZ4iQ6JwHOBQjahnjwaC1ZtIBH+2ohjamzAO3oaHcXYup7qxjF2fixyH+Q71voWHeOkI2q/TnJao/KfXYIZWbw==", - "dev": true, - "license": "MIT", - "dependencies": { - "es-errors": "^1.3.0" - }, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/es-set-tostringtag": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/es-set-tostringtag/-/es-set-tostringtag-2.0.3.tgz", - "integrity": "sha512-3T8uNMC3OQTHkFUsFq8r/BwAXLHvU/9O9mE0fBc/MY5iq/8H7ncvO947LmYA6ldWw9Uh8Yhf25zu6n7nML5QWQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "get-intrinsic": "^1.2.4", - "has-tostringtag": "^1.0.2", - "hasown": "^2.0.1" - }, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/es-shim-unscopables": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/es-shim-unscopables/-/es-shim-unscopables-1.0.2.tgz", - "integrity": "sha512-J3yBRXCzDu4ULnQwxyToo/OjdMx6akgVC7K6few0a7F/0wLtmKKN7I73AH5T2836UuXRqN7Qg+IIUw/+YJksRw==", - "dev": true, - "license": "MIT", - "dependencies": { - "hasown": "^2.0.0" - } - }, - "node_modules/es-to-primitive": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/es-to-primitive/-/es-to-primitive-1.2.1.tgz", - "integrity": "sha512-QCOllgZJtaUo9miYBcLChTUaHNjJF3PYs1VidD7AwiEj1kYxKeQTctLAezAOH5ZKRH0g2IgPn6KwB4IT8iRpvA==", - "dev": true, - "license": "MIT", - "dependencies": { - "is-callable": "^1.1.4", - "is-date-object": "^1.0.1", - "is-symbol": "^1.0.2" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/es5-ext": { - "version": "0.10.64", - "resolved": "https://registry.npmjs.org/es5-ext/-/es5-ext-0.10.64.tgz", - "integrity": "sha512-p2snDhiLaXe6dahss1LddxqEm+SkuDvV8dnIQG0MWjyHpcMNfXKPE+/Cc0y+PhxJX3A4xGNeFCj5oc0BUh6deg==", - "hasInstallScript": true, - "license": "ISC", - "dependencies": { - "es6-iterator": "^2.0.3", - "es6-symbol": "^3.1.3", - "esniff": "^2.0.1", - "next-tick": "^1.1.0" - }, - "engines": { - "node": ">=0.10" - } - }, - "node_modules/es6-error": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/es6-error/-/es6-error-4.1.1.tgz", - "integrity": "sha512-Um/+FxMr9CISWh0bi5Zv0iOD+4cFh5qLeks1qhAopKVAJw3drgKbKySikp7wGhDL0HPeaja0P5ULZrxLkniUVg==", - "dev": true, - "license": "MIT" - }, - "node_modules/es6-iterator": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/es6-iterator/-/es6-iterator-2.0.3.tgz", - "integrity": "sha512-zw4SRzoUkd+cl+ZoE15A9o1oQd920Bb0iOJMQkQhl3jNc03YqVjAhG7scf9C5KWRU/R13Orf588uCC6525o02g==", - "license": "MIT", - "dependencies": { - "d": "1", - "es5-ext": "^0.10.35", - "es6-symbol": "^3.1.1" - } - }, - "node_modules/es6-symbol": { - "version": "3.1.4", - "resolved": "https://registry.npmjs.org/es6-symbol/-/es6-symbol-3.1.4.tgz", - "integrity": "sha512-U9bFFjX8tFiATgtkJ1zg25+KviIXpgRvRHS8sau3GfhVzThRQrOeksPeT0BWW2MNZs1OEWJ1DPXOQMn0KKRkvg==", - "license": "ISC", - "dependencies": { - "d": "^1.0.2", - "ext": "^1.7.0" - }, - "engines": { - "node": ">=0.12" - } - }, - "node_modules/es6-weak-map": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/es6-weak-map/-/es6-weak-map-2.0.3.tgz", - "integrity": "sha512-p5um32HOTO1kP+w7PRnB+5lQ43Z6muuMuIMffvDN8ZB4GcnjLBV6zGStpbASIMk4DCAvEaamhe2zhyCb/QXXsA==", - "license": "ISC", - "dependencies": { - "d": "1", - "es5-ext": "^0.10.46", - "es6-iterator": "^2.0.3", - "es6-symbol": "^3.1.1" - } - }, - "node_modules/escalade": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.2.0.tgz", - "integrity": "sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==", - "license": "MIT", - "engines": { - "node": ">=6" - } - }, - "node_modules/escape-goat": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/escape-goat/-/escape-goat-3.0.0.tgz", - "integrity": "sha512-w3PwNZJwRxlp47QGzhuEBldEqVHHhh8/tIPcl6ecf2Bou99cdAt0knihBV0Ecc7CGxYduXVBDheH1K2oADRlvw==", - "license": "MIT", - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/escape-html": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz", - "integrity": "sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow==", - "license": "MIT" - }, - "node_modules/escape-string-regexp": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz", - "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==", - "license": "MIT", - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/eslint": { - "version": "7.32.0", - "resolved": "https://registry.npmjs.org/eslint/-/eslint-7.32.0.tgz", - "integrity": "sha512-VHZ8gX+EDfz+97jGcgyGCyRia/dPOd6Xh9yPv8Bl1+SoaIwD+a/vlrOmGRUyOYu7MwUhc7CxqeaDZU13S4+EpA==", - "deprecated": "This version is no longer supported. Please see https://eslint.org/version-support for other options.", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/code-frame": "7.12.11", - "@eslint/eslintrc": "^0.4.3", - "@humanwhocodes/config-array": "^0.5.0", - "ajv": "^6.10.0", - "chalk": "^4.0.0", - "cross-spawn": "^7.0.2", - "debug": "^4.0.1", - "doctrine": "^3.0.0", - "enquirer": "^2.3.5", - "escape-string-regexp": "^4.0.0", - "eslint-scope": "^5.1.1", - "eslint-utils": "^2.1.0", - "eslint-visitor-keys": "^2.0.0", - "espree": "^7.3.1", - "esquery": "^1.4.0", - "esutils": "^2.0.2", - "fast-deep-equal": "^3.1.3", - "file-entry-cache": "^6.0.1", - "functional-red-black-tree": "^1.0.1", - "glob-parent": "^5.1.2", - "globals": "^13.6.0", - "ignore": "^4.0.6", - "import-fresh": "^3.0.0", - "imurmurhash": "^0.1.4", - "is-glob": "^4.0.0", - "js-yaml": "^3.13.1", - "json-stable-stringify-without-jsonify": "^1.0.1", - "levn": "^0.4.1", - "lodash.merge": "^4.6.2", - "minimatch": "^3.0.4", - "natural-compare": "^1.4.0", - "optionator": "^0.9.1", - "progress": "^2.0.0", - "regexpp": "^3.1.0", - "semver": "^7.2.1", - "strip-ansi": "^6.0.0", - "strip-json-comments": "^3.1.0", - "table": "^6.0.9", - "text-table": "^0.2.0", - "v8-compile-cache": "^2.0.3" - }, - "bin": { - "eslint": "bin/eslint.js" - }, - "engines": { - "node": "^10.12.0 || >=12.0.0" - }, - "funding": { - "url": "https://opencollective.com/eslint" - } - }, - "node_modules/eslint-config-standard": { - "version": "16.0.3", - "resolved": "https://registry.npmjs.org/eslint-config-standard/-/eslint-config-standard-16.0.3.tgz", - "integrity": "sha512-x4fmJL5hGqNJKGHSjnLdgA6U6h1YW/G2dW9fA+cyVur4SK6lyue8+UgNKWlZtUDTXvgKDD/Oa3GQjmB5kjtVvg==", - "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", - "peerDependencies": { - "eslint": "^7.12.1", - "eslint-plugin-import": "^2.22.1", - "eslint-plugin-node": "^11.1.0", - "eslint-plugin-promise": "^4.2.1 || ^5.0.0" - } - }, - "node_modules/eslint-import-resolver-node": { - "version": "0.3.9", - "resolved": "https://registry.npmjs.org/eslint-import-resolver-node/-/eslint-import-resolver-node-0.3.9.tgz", - "integrity": "sha512-WFj2isz22JahUv+B788TlO3N6zL3nNJGU8CcZbPZvVEkBPaJdCV4vy5wyghty5ROFbCRnm132v8BScu5/1BQ8g==", - "dev": true, - "license": "MIT", - "dependencies": { - "debug": "^3.2.7", - "is-core-module": "^2.13.0", - "resolve": "^1.22.4" - } - }, - "node_modules/eslint-import-resolver-node/node_modules/debug": { - "version": "3.2.7", - "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", - "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "ms": "^2.1.1" - } - }, - "node_modules/eslint-module-utils": { - "version": "2.12.0", - "resolved": "https://registry.npmjs.org/eslint-module-utils/-/eslint-module-utils-2.12.0.tgz", - "integrity": "sha512-wALZ0HFoytlyh/1+4wuZ9FJCD/leWHQzzrxJ8+rebyReSLk7LApMyd3WJaLVoN+D5+WIdJyDK1c6JnE65V4Zyg==", - "dev": true, - "license": "MIT", - "dependencies": { - "debug": "^3.2.7" - }, - "engines": { - "node": ">=4" - }, - "peerDependenciesMeta": { - "eslint": { - "optional": true - } - } - }, - "node_modules/eslint-module-utils/node_modules/debug": { - "version": "3.2.7", - "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", - "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "ms": "^2.1.1" - } - }, - "node_modules/eslint-plugin-es": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/eslint-plugin-es/-/eslint-plugin-es-3.0.1.tgz", - "integrity": "sha512-GUmAsJaN4Fc7Gbtl8uOBlayo2DqhwWvEzykMHSCZHU3XdJ+NSzzZcVhXh3VxX5icqQ+oQdIEawXX8xkR3mIFmQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "eslint-utils": "^2.0.0", - "regexpp": "^3.0.0" - }, - "engines": { - "node": ">=8.10.0" - }, - "funding": { - "url": "https://github.com/sponsors/mysticatea" - }, - "peerDependencies": { - "eslint": ">=4.19.1" - } - }, - "node_modules/eslint-plugin-import": { - "version": "2.31.0", - "resolved": "https://registry.npmjs.org/eslint-plugin-import/-/eslint-plugin-import-2.31.0.tgz", - "integrity": "sha512-ixmkI62Rbc2/w8Vfxyh1jQRTdRTF52VxwRVHl/ykPAmqG+Nb7/kNn+byLP0LxPgI7zWA16Jt82SybJInmMia3A==", - "dev": true, - "license": "MIT", - "dependencies": { - "@rtsao/scc": "^1.1.0", - "array-includes": "^3.1.8", - "array.prototype.findlastindex": "^1.2.5", - "array.prototype.flat": "^1.3.2", - "array.prototype.flatmap": "^1.3.2", - "debug": "^3.2.7", - "doctrine": "^2.1.0", - "eslint-import-resolver-node": "^0.3.9", - "eslint-module-utils": "^2.12.0", - "hasown": "^2.0.2", - "is-core-module": "^2.15.1", - "is-glob": "^4.0.3", - "minimatch": "^3.1.2", - "object.fromentries": "^2.0.8", - "object.groupby": "^1.0.3", - "object.values": "^1.2.0", - "semver": "^6.3.1", - "string.prototype.trimend": "^1.0.8", - "tsconfig-paths": "^3.15.0" - }, - "engines": { - "node": ">=4" - }, - "peerDependencies": { - "eslint": "^2 || ^3 || ^4 || ^5 || ^6 || ^7.2.0 || ^8 || ^9" - } - }, - "node_modules/eslint-plugin-import/node_modules/debug": { - "version": "3.2.7", - "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", - "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "ms": "^2.1.1" - } - }, - "node_modules/eslint-plugin-import/node_modules/doctrine": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-2.1.0.tgz", - "integrity": "sha512-35mSku4ZXK0vfCuHEDAwt55dg2jNajHZ1odvF+8SSr82EsZY4QmXfuWso8oEd8zRhVObSN18aM0CjSdoBX7zIw==", - "dev": true, - "license": "Apache-2.0", - "dependencies": { - "esutils": "^2.0.2" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/eslint-plugin-import/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/eslint-plugin-no-only-tests": { - "version": "2.6.0", - "resolved": "https://registry.npmjs.org/eslint-plugin-no-only-tests/-/eslint-plugin-no-only-tests-2.6.0.tgz", - "integrity": "sha512-T9SmE/g6UV1uZo1oHAqOvL86XWl7Pl2EpRpnLI8g/bkJu+h7XBCB+1LnubRZ2CUQXj805vh4/CYZdnqtVaEo2Q==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=4.0.0" - } - }, - "node_modules/eslint-plugin-node": { - "version": "11.1.0", - "resolved": "https://registry.npmjs.org/eslint-plugin-node/-/eslint-plugin-node-11.1.0.tgz", - "integrity": "sha512-oUwtPJ1W0SKD0Tr+wqu92c5xuCeQqB3hSCHasn/ZgjFdA9iDGNkNf2Zi9ztY7X+hNuMib23LNGRm6+uN+KLE3g==", - "dev": true, - "license": "MIT", - "dependencies": { - "eslint-plugin-es": "^3.0.0", - "eslint-utils": "^2.0.0", - "ignore": "^5.1.1", - "minimatch": "^3.0.4", - "resolve": "^1.10.1", - "semver": "^6.1.0" - }, - "engines": { - "node": ">=8.10.0" - }, - "peerDependencies": { - "eslint": ">=5.16.0" - } - }, - "node_modules/eslint-plugin-node/node_modules/ignore": { - "version": "5.3.2", - "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.3.2.tgz", - "integrity": "sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 4" - } - }, - "node_modules/eslint-plugin-node/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/eslint-plugin-promise": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/eslint-plugin-promise/-/eslint-plugin-promise-5.2.0.tgz", - "integrity": "sha512-SftLb1pUG01QYq2A/hGAWfDRXqYD82zE7j7TopDOyNdU+7SvvoXREls/+PRTY17vUXzXnZA/zfnyKgRH6x4JJw==", - "dev": true, - "license": "ISC", - "engines": { - "node": "^10.12.0 || >=12.0.0" - }, - "peerDependencies": { - "eslint": "^7.0.0" - } - }, - "node_modules/eslint-plugin-vue": { - "version": "8.7.1", - "resolved": "https://registry.npmjs.org/eslint-plugin-vue/-/eslint-plugin-vue-8.7.1.tgz", - "integrity": "sha512-28sbtm4l4cOzoO1LtzQPxfxhQABararUb1JtqusQqObJpWX2e/gmVyeYVfepizPFne0Q5cILkYGiBoV36L12Wg==", - "dev": true, - "license": "MIT", - "dependencies": { - "eslint-utils": "^3.0.0", - "natural-compare": "^1.4.0", - "nth-check": "^2.0.1", - "postcss-selector-parser": "^6.0.9", - "semver": "^7.3.5", - "vue-eslint-parser": "^8.0.1" - }, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "peerDependencies": { - "eslint": "^6.2.0 || ^7.0.0 || ^8.0.0" - } - }, - "node_modules/eslint-plugin-vue/node_modules/eslint-utils": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/eslint-utils/-/eslint-utils-3.0.0.tgz", - "integrity": "sha512-uuQC43IGctw68pJA1RgbQS8/NP7rch6Cwd4j3ZBtgo4/8Flj4eGE7ZYSZRN3iq5pVUv6GPdW5Z1RFleo84uLDA==", - "dev": true, - "license": "MIT", - "dependencies": { - "eslint-visitor-keys": "^2.0.0" - }, - "engines": { - "node": "^10.0.0 || ^12.0.0 || >= 14.0.0" - }, - "funding": { - "url": "https://github.com/sponsors/mysticatea" - }, - "peerDependencies": { - "eslint": ">=5" - } - }, - "node_modules/eslint-scope": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-5.1.1.tgz", - "integrity": "sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw==", - "dev": true, - "license": "BSD-2-Clause", - "dependencies": { - "esrecurse": "^4.3.0", - "estraverse": "^4.1.1" - }, - "engines": { - "node": ">=8.0.0" - } - }, - "node_modules/eslint-utils": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/eslint-utils/-/eslint-utils-2.1.0.tgz", - "integrity": "sha512-w94dQYoauyvlDc43XnGB8lU3Zt713vNChgt4EWwhXAP2XkBvndfxF0AgIqKOOasjPIPzj9JqgwkwbCYD0/V3Zg==", - "dev": true, - "license": "MIT", - "dependencies": { - "eslint-visitor-keys": "^1.1.0" - }, - "engines": { - "node": ">=6" - }, - "funding": { - "url": "https://github.com/sponsors/mysticatea" - } - }, - "node_modules/eslint-utils/node_modules/eslint-visitor-keys": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-1.3.0.tgz", - "integrity": "sha512-6J72N8UNa462wa/KFODt/PJ3IU60SDpC3QXC1Hjc1BXXpfL2C9R5+AU7jhe0F6GREqVMh4Juu+NY7xn+6dipUQ==", - "dev": true, - "license": "Apache-2.0", - "engines": { - "node": ">=4" - } - }, - "node_modules/eslint-visitor-keys": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-2.1.0.tgz", - "integrity": "sha512-0rSmRBzXgDzIsD6mGdJgevzgezI534Cer5L/vyMX0kHzT/jiB43jRhd9YUlMGYLQy2zprNmoT8qasCGtY+QaKw==", - "dev": true, - "license": "Apache-2.0", - "engines": { - "node": ">=10" - } - }, - "node_modules/eslint/node_modules/@babel/code-frame": { - "version": "7.12.11", - "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.12.11.tgz", - "integrity": "sha512-Zt1yodBx1UcyiePMSkWnU4hPqhwq7hGi2nFL1LeA3EUl+q2LQx16MISgJ0+z7dnmgvP9QtIleuETGOiOH1RcIw==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/highlight": "^7.10.4" - } - }, - "node_modules/eslint/node_modules/ajv": { - "version": "6.12.6", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", - "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", - "dev": true, - "license": "MIT", - "dependencies": { - "fast-deep-equal": "^3.1.1", - "fast-json-stable-stringify": "^2.0.0", - "json-schema-traverse": "^0.4.1", - "uri-js": "^4.2.2" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/epoberezkin" - } - }, - "node_modules/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/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/json-schema-traverse": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", - "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", - "dev": true, - "license": "MIT" - }, - "node_modules/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/esniff": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/esniff/-/esniff-2.0.1.tgz", - "integrity": "sha512-kTUIGKQ/mDPFoJ0oVfcmyJn4iBDRptjNVIzwIFR7tqWXdVI9xfA2RMwY/gbSpJG3lkdWNEjLap/NqVHZiJsdfg==", - "license": "ISC", - "dependencies": { - "d": "^1.0.1", - "es5-ext": "^0.10.62", - "event-emitter": "^0.3.5", - "type": "^2.7.2" - }, - "engines": { - "node": ">=0.10" - } - }, - "node_modules/espree": { - "version": "7.3.1", - "resolved": "https://registry.npmjs.org/espree/-/espree-7.3.1.tgz", - "integrity": "sha512-v3JCNCE64umkFpmkFGqzVKsOT0tN1Zr+ueqLZfpV1Ob8e+CEgPWa+OxCoGH3tnhimMKIaBm4m/vaRpJ/krRz2g==", - "dev": true, - "license": "BSD-2-Clause", - "dependencies": { - "acorn": "^7.4.0", - "acorn-jsx": "^5.3.1", - "eslint-visitor-keys": "^1.3.0" - }, - "engines": { - "node": "^10.12.0 || >=12.0.0" - } - }, - "node_modules/espree/node_modules/eslint-visitor-keys": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-1.3.0.tgz", - "integrity": "sha512-6J72N8UNa462wa/KFODt/PJ3IU60SDpC3QXC1Hjc1BXXpfL2C9R5+AU7jhe0F6GREqVMh4Juu+NY7xn+6dipUQ==", - "dev": true, - "license": "Apache-2.0", - "engines": { - "node": ">=4" - } - }, - "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==", - "dev": true, - "license": "BSD-3-Clause", - "dependencies": { - "estraverse": "^5.1.0" - }, - "engines": { - "node": ">=0.10" - } - }, - "node_modules/esquery/node_modules/estraverse": { - "version": "5.3.0", - "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", - "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", - "dev": true, - "license": "BSD-2-Clause", - "engines": { - "node": ">=4.0" - } - }, - "node_modules/esrecurse": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.3.0.tgz", - "integrity": "sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==", - "dev": true, - "license": "BSD-2-Clause", - "dependencies": { - "estraverse": "^5.2.0" - }, - "engines": { - "node": ">=4.0" - } - }, - "node_modules/esrecurse/node_modules/estraverse": { - "version": "5.3.0", - "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", - "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", - "dev": true, - "license": "BSD-2-Clause", - "engines": { - "node": ">=4.0" - } - }, - "node_modules/estraverse": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.3.0.tgz", - "integrity": "sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==", - "dev": true, - "license": "BSD-2-Clause", - "engines": { - "node": ">=4.0" - } - }, - "node_modules/esutils": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz", - "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==", - "dev": true, - "license": "BSD-2-Clause", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/etag": { - "version": "1.8.1", - "resolved": "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz", - "integrity": "sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg==", - "license": "MIT", - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/event-emitter": { - "version": "0.3.5", - "resolved": "https://registry.npmjs.org/event-emitter/-/event-emitter-0.3.5.tgz", - "integrity": "sha512-D9rRn9y7kLPnJ+hMq7S/nhvoKwwvVJahBi2BPmx3bvbsEdK3W9ii8cBSGjP+72/LnM4n6fo3+dkCX5FeTQruXA==", - "license": "MIT", - "dependencies": { - "d": "1", - "es5-ext": "~0.10.14" - } - }, - "node_modules/event-to-promise": { - "version": "0.8.0", - "resolved": "https://registry.npmjs.org/event-to-promise/-/event-to-promise-0.8.0.tgz", - "integrity": "sha512-/J+h6lLXMhNrahk5XipFHjSOlTv4Zl+D5rXomuhT3MIUxkP7beRxazgCQ6ERYJTFPPM8WC8dbHIeQc1VaKrOxw==", - "deprecated": "Use promise-toolbox/fromEvent instead", - "license": "MIT" - }, - "node_modules/eventemitter3": { - "version": "4.0.7", - "resolved": "https://registry.npmjs.org/eventemitter3/-/eventemitter3-4.0.7.tgz", - "integrity": "sha512-8guHBZCwKnFhYdHr2ysuRWErTwhoN2X8XELRlrRwpmfeY2jjuUN4taQMsULKUVo1K4DvZl+0pgfyoysHxvmvEw==", - "license": "MIT" - }, - "node_modules/events": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/events/-/events-3.3.0.tgz", - "integrity": "sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=0.8.x" - } - }, - "node_modules/eventsource-polyfill": { - "version": "0.9.6", - "resolved": "https://registry.npmjs.org/eventsource-polyfill/-/eventsource-polyfill-0.9.6.tgz", - "integrity": "sha512-LyMFp2oPDGhum2lMvkjqKZEwWd2/AoXyt8aoyftTBMWwPHNgU+2tdxhTHPluDxoz+z4gNj0uHAPR9nqevATMbg==", - "dev": true, - "license": "MIT" - }, - "node_modules/evp_bytestokey": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/evp_bytestokey/-/evp_bytestokey-1.0.3.tgz", - "integrity": "sha512-/f2Go4TognH/KvCISP7OUsHn85hT9nUkxxA9BEWxFn+Oj9o8ZNLm/40hdlgSLyuOimsrTKLUMEorQexp/aPQeA==", - "dev": true, - "license": "MIT", - "dependencies": { - "md5.js": "^1.3.4", - "safe-buffer": "^5.1.1" - } - }, - "node_modules/execa": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/execa/-/execa-5.1.1.tgz", - "integrity": "sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg==", - "license": "MIT", - "dependencies": { - "cross-spawn": "^7.0.3", - "get-stream": "^6.0.0", - "human-signals": "^2.1.0", - "is-stream": "^2.0.0", - "merge-stream": "^2.0.0", - "npm-run-path": "^4.0.1", - "onetime": "^5.1.2", - "signal-exit": "^3.0.3", - "strip-final-newline": "^2.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sindresorhus/execa?sponsor=1" - } - }, - "node_modules/execa/node_modules/signal-exit": { - "version": "3.0.7", - "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz", - "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==", - "license": "ISC" - }, - "node_modules/exit": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/exit/-/exit-0.1.2.tgz", - "integrity": "sha512-Zk/eNKV2zbjpKzrsQ+n1G6poVbErQxJ0LBOJXaKZ1EViLzH+hrLu9cdXI4zw9dBQJslwBEpbQ2P1oS7nDxs6jQ==", - "engines": { - "node": ">= 0.8.0" - } - }, - "node_modules/expand-brackets": { - "version": "2.1.4", - "resolved": "https://registry.npmjs.org/expand-brackets/-/expand-brackets-2.1.4.tgz", - "integrity": "sha512-w/ozOKR9Obk3qoWeY/WDi6MFta9AoMR+zud60mdnbniMcBxRuFJyDt2LdX/14A1UABeqk+Uk+LDfUpvoGKppZA==", - "dev": true, - "license": "MIT", - "dependencies": { - "debug": "^2.3.3", - "define-property": "^0.2.5", - "extend-shallow": "^2.0.1", - "posix-character-classes": "^0.1.0", - "regex-not": "^1.0.0", - "snapdragon": "^0.8.1", - "to-regex": "^3.0.1" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/expand-brackets/node_modules/debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", - "dev": true, - "license": "MIT", - "dependencies": { - "ms": "2.0.0" - } - }, - "node_modules/expand-brackets/node_modules/define-property": { - "version": "0.2.5", - "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", - "integrity": "sha512-Rr7ADjQZenceVOAKop6ALkkRAmH1A4Gx9hV/7ZujPUN2rkATqFO0JZLZInbAjpZYoJ1gUx8MRMQVkYemcbMSTA==", - "dev": true, - "license": "MIT", - "dependencies": { - "is-descriptor": "^0.1.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/expand-brackets/node_modules/extend-shallow": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", - "integrity": "sha512-zCnTtlxNoAiDc3gqY2aYAWFx7XWWiasuF2K8Me5WbN8otHKTUKBwjPtNpRs/rbUZm7KxWAaNj7P1a/p52GbVug==", - "dev": true, - "license": "MIT", - "dependencies": { - "is-extendable": "^0.1.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/expand-brackets/node_modules/is-descriptor": { - "version": "0.1.7", - "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-0.1.7.tgz", - "integrity": "sha512-C3grZTvObeN1xud4cRWl366OMXZTj0+HGyk4hvfpx4ZHt1Pb60ANSXqCK7pdOTeUQpRzECBSTphqvD7U+l22Eg==", - "dev": true, - "license": "MIT", - "dependencies": { - "is-accessor-descriptor": "^1.0.1", - "is-data-descriptor": "^1.0.1" - }, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/expand-brackets/node_modules/is-extendable": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-0.1.1.tgz", - "integrity": "sha512-5BMULNob1vgFX6EjQw5izWDxrecWK9AM72rugNr0TFldMOi0fj6Jk+zeKIt0xGj4cEfQIJth4w3OKWOJ4f+AFw==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/expand-brackets/node_modules/ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", - "dev": true, - "license": "MIT" - }, - "node_modules/expr-eval": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/expr-eval/-/expr-eval-2.0.2.tgz", - "integrity": "sha512-4EMSHGOPSwAfBiibw3ndnP0AvjDWLsMvGOvWEZ2F96IGk0bIVdjQisOHxReSkE13mHcfbuCiXw+G4y0zv6N8Eg==", - "dev": true, - "license": "MIT", - "optional": true - }, - "node_modules/express": { - "version": "4.21.1", - "resolved": "https://registry.npmjs.org/express/-/express-4.21.1.tgz", - "integrity": "sha512-YSFlK1Ee0/GC8QaO91tHcDxJiE/X4FbpAyQWkxAvG6AXCuR65YzK8ua6D9hvi/TzUfZMpc+BwuM1IPw8fmQBiQ==", - "license": "MIT", - "dependencies": { - "accepts": "~1.3.8", - "array-flatten": "1.1.1", - "body-parser": "1.20.3", - "content-disposition": "0.5.4", - "content-type": "~1.0.4", - "cookie": "0.7.1", - "cookie-signature": "1.0.6", - "debug": "2.6.9", - "depd": "2.0.0", - "encodeurl": "~2.0.0", - "escape-html": "~1.0.3", - "etag": "~1.8.1", - "finalhandler": "1.3.1", - "fresh": "0.5.2", - "http-errors": "2.0.0", - "merge-descriptors": "1.0.3", - "methods": "~1.1.2", - "on-finished": "2.4.1", - "parseurl": "~1.3.3", - "path-to-regexp": "0.1.10", - "proxy-addr": "~2.0.7", - "qs": "6.13.0", - "range-parser": "~1.2.1", - "safe-buffer": "5.2.1", - "send": "0.19.0", - "serve-static": "1.16.2", - "setprototypeof": "1.2.0", - "statuses": "2.0.1", - "type-is": "~1.6.18", - "utils-merge": "1.0.1", - "vary": "~1.1.2" - }, - "engines": { - "node": ">= 0.10.0" - } - }, - "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==", - "license": "MIT", - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/express/node_modules/debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", - "license": "MIT", - "dependencies": { - "ms": "2.0.0" - } - }, - "node_modules/express/node_modules/ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", - "license": "MIT" - }, - "node_modules/ext": { - "version": "1.7.0", - "resolved": "https://registry.npmjs.org/ext/-/ext-1.7.0.tgz", - "integrity": "sha512-6hxeJYaL110a9b5TEJSj0gojyHQAmA2ch5Os+ySCiA1QGdS697XWY1pzsrSjqA9LDEEgdB/KypIlR59RcLuHYw==", - "license": "ISC", - "dependencies": { - "type": "^2.7.2" - } - }, - "node_modules/extend-shallow": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-3.0.2.tgz", - "integrity": "sha512-BwY5b5Ql4+qZoefgMj2NUmx+tehVTH/Kf4k1ZEtOHNFcm2wSxMRo992l6X3TIgni2eZVTZ85xMOjF31fwZAj6Q==", - "dev": true, - "license": "MIT", - "dependencies": { - "assign-symbols": "^1.0.0", - "is-extendable": "^1.0.1" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/external-editor": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/external-editor/-/external-editor-3.1.0.tgz", - "integrity": "sha512-hMQ4CX1p1izmuLYyZqLMO/qGNw10wSv9QDCPfzXfyFrOaCSSoRfqE1Kf1s5an66J5JZC62NewG+mK49jOCtQew==", - "license": "MIT", - "dependencies": { - "chardet": "^0.7.0", - "iconv-lite": "^0.4.24", - "tmp": "^0.0.33" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/extglob": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/extglob/-/extglob-2.0.4.tgz", - "integrity": "sha512-Nmb6QXkELsuBr24CJSkilo6UHHgbekK5UiZgfE6UHD3Eb27YC6oD+bhcT+tJ6cl8dmsgdQxnWlcry8ksBIBLpw==", - "dev": true, - "license": "MIT", - "dependencies": { - "array-unique": "^0.3.2", - "define-property": "^1.0.0", - "expand-brackets": "^2.1.4", - "extend-shallow": "^2.0.1", - "fragment-cache": "^0.2.1", - "regex-not": "^1.0.0", - "snapdragon": "^0.8.1", - "to-regex": "^3.0.1" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/extglob/node_modules/define-property": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz", - "integrity": "sha512-cZTYKFWspt9jZsMscWo8sc/5lbPC9Q0N5nBLgb+Yd915iL3udB1uFgS3B8YCx66UVHq018DAVFoee7x+gxggeA==", - "dev": true, - "license": "MIT", - "dependencies": { - "is-descriptor": "^1.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/extglob/node_modules/extend-shallow": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", - "integrity": "sha512-zCnTtlxNoAiDc3gqY2aYAWFx7XWWiasuF2K8Me5WbN8otHKTUKBwjPtNpRs/rbUZm7KxWAaNj7P1a/p52GbVug==", - "dev": true, - "license": "MIT", - "dependencies": { - "is-extendable": "^0.1.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/extglob/node_modules/is-extendable": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-0.1.1.tgz", - "integrity": "sha512-5BMULNob1vgFX6EjQw5izWDxrecWK9AM72rugNr0TFldMOi0fj6Jk+zeKIt0xGj4cEfQIJth4w3OKWOJ4f+AFw==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/extract-css-chunks-webpack-plugin": { - "version": "4.10.0", - "resolved": "https://registry.npmjs.org/extract-css-chunks-webpack-plugin/-/extract-css-chunks-webpack-plugin-4.10.0.tgz", - "integrity": "sha512-D/wb/Tbexq8XMBl4uhthto25WBaHI9P8vucDdzwPtLTyVi4Rdw/aiRLSL2rHaF6jZfPAjThWXepFU9PXsdtIbA==", - "dev": true, - "license": "MIT", - "dependencies": { - "loader-utils": "^2.0.4", - "normalize-url": "1.9.1", - "schema-utils": "^1.0.0", - "webpack-sources": "^1.1.0" - }, - "engines": { - "node": ">= 6.9.0" - }, - "peerDependencies": { - "webpack": "^4.4.0 || ^5.0.0" - } - }, - "node_modules/extract-css-chunks-webpack-plugin/node_modules/ajv": { - "version": "6.12.6", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", - "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", - "dev": true, - "license": "MIT", - "dependencies": { - "fast-deep-equal": "^3.1.1", - "fast-json-stable-stringify": "^2.0.0", - "json-schema-traverse": "^0.4.1", - "uri-js": "^4.2.2" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/epoberezkin" - } - }, - "node_modules/extract-css-chunks-webpack-plugin/node_modules/ajv-errors": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/ajv-errors/-/ajv-errors-1.0.1.tgz", - "integrity": "sha512-DCRfO/4nQ+89p/RK43i8Ezd41EqdGIU4ld7nGF8OQ14oc/we5rEntLCUa7+jrn3nn83BosfwZA0wb4pon2o8iQ==", - "dev": true, - "license": "MIT", - "peerDependencies": { - "ajv": ">=5.0.0" - } - }, - "node_modules/extract-css-chunks-webpack-plugin/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", - "peerDependencies": { - "ajv": "^6.9.1" - } - }, - "node_modules/extract-css-chunks-webpack-plugin/node_modules/is-plain-obj": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-1.1.0.tgz", - "integrity": "sha512-yvkRyxmFKEOQ4pNXCmJG5AEQNlXJS5LaONXo5/cLdTZdWvsZ1ioJEonLGAosKlMWE8lwUy/bJzMjcw8az73+Fg==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/extract-css-chunks-webpack-plugin/node_modules/json-schema-traverse": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", - "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", - "dev": true, - "license": "MIT" - }, - "node_modules/extract-css-chunks-webpack-plugin/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" - } - }, - "node_modules/extract-css-chunks-webpack-plugin/node_modules/normalize-url": { - "version": "1.9.1", - "resolved": "https://registry.npmjs.org/normalize-url/-/normalize-url-1.9.1.tgz", - "integrity": "sha512-A48My/mtCklowHBlI8Fq2jFWK4tX4lJ5E6ytFsSOq1fzpvT0SQSgKhSg7lN5c2uYFOrUAOQp6zhhJnpp1eMloQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "object-assign": "^4.0.1", - "prepend-http": "^1.0.0", - "query-string": "^4.1.0", - "sort-keys": "^1.0.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/extract-css-chunks-webpack-plugin/node_modules/schema-utils": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-1.0.0.tgz", - "integrity": "sha512-i27Mic4KovM/lnGsy8whRCHhc7VicJajAjTrYg11K9zfZXnYIt4k5F+kZkwjnrhKzLic/HLU4j11mjsz2G/75g==", - "dev": true, - "license": "MIT", - "dependencies": { - "ajv": "^6.1.0", - "ajv-errors": "^1.0.0", - "ajv-keywords": "^3.1.0" - }, - "engines": { - "node": ">= 4" - } - }, - "node_modules/extract-css-chunks-webpack-plugin/node_modules/sort-keys": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/sort-keys/-/sort-keys-1.1.2.tgz", - "integrity": "sha512-vzn8aSqKgytVik0iwdBEi+zevbTYZogewTUM6dtpmGwEcdzbub/TX4bCzRhebDCRC3QzXgJsLRKB2V/Oof7HXg==", - "dev": true, - "license": "MIT", - "dependencies": { - "is-plain-obj": "^1.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/extsprintf": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/extsprintf/-/extsprintf-1.4.1.tgz", - "integrity": "sha512-Wrk35e8ydCKDj/ArClo1VrPVmN8zph5V4AtHwIuHhvMXsKf73UT3BOD+azBIW+3wOJ4FhEH7zyaJCFvChjYvMA==", - "engines": [ - "node >=0.6.0" - ], - "license": "MIT" - }, - "node_modules/fast-copy": { - "version": "2.1.7", - "resolved": "https://registry.npmjs.org/fast-copy/-/fast-copy-2.1.7.tgz", - "integrity": "sha512-ozrGwyuCTAy7YgFCua8rmqmytECYk/JYAMXcswOcm0qvGoE3tPb7ivBeIHTOK2DiapBhDZgacIhzhQIKU5TCfA==", - "dev": true, - "license": "MIT" - }, - "node_modules/fast-deep-equal": { - "version": "3.1.3", - "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", - "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==", - "license": "MIT" - }, - "node_modules/fast-equals": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/fast-equals/-/fast-equals-2.0.4.tgz", - "integrity": "sha512-caj/ZmjHljPrZtbzJ3kfH5ia/k4mTJe/qSiXAGzxZWRZgsgDV0cvNaQULqUX8t0/JVlzzEdYOwCN5DmzTxoD4w==", - "dev": true, - "license": "MIT" - }, - "node_modules/fast-glob": { - "version": "3.3.2", - "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.3.2.tgz", - "integrity": "sha512-oX2ruAFQwf/Orj8m737Y5adxDQO0LAB7/S5MnxCdTNDd4p6BsyIVsv9JQsATbTSq8KHRpLwIHbVlUNatxd+1Ow==", - "license": "MIT", - "dependencies": { - "@nodelib/fs.stat": "^2.0.2", - "@nodelib/fs.walk": "^1.2.3", - "glob-parent": "^5.1.2", - "merge2": "^1.3.0", - "micromatch": "^4.0.4" - }, - "engines": { - "node": ">=8.6.0" - } - }, - "node_modules/fast-json-stable-stringify": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz", - "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==", - "dev": true, - "license": "MIT" - }, - "node_modules/fast-json-stringify": { - "version": "5.12.0", - "resolved": "https://registry.npmjs.org/fast-json-stringify/-/fast-json-stringify-5.12.0.tgz", - "integrity": "sha512-7Nnm9UPa7SfHRbHVA1kJQrGXCRzB7LMlAAqHXQFkEQqueJm1V8owm0FsE/2Do55/4CcdhwiLQERaKomOnKQkyA==", - "license": "MIT", - "dependencies": { - "@fastify/merge-json-schemas": "^0.1.0", - "ajv": "^8.10.0", - "ajv-formats": "^2.1.1", - "fast-deep-equal": "^3.1.3", - "fast-uri": "^2.1.0", - "json-schema-ref-resolver": "^1.0.1", - "rfdc": "^1.2.0" - } - }, - "node_modules/fast-json-stringify/node_modules/ajv-formats": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/ajv-formats/-/ajv-formats-2.1.1.tgz", - "integrity": "sha512-Wx0Kx52hxE7C18hkMEggYlEifqWZtYaRgouJor+WMdPnQyEK13vgEWyVNup7SoeeoLMsr4kf5h6dOW11I15MUA==", - "license": "MIT", - "dependencies": { - "ajv": "^8.0.0" - }, - "peerDependencies": { - "ajv": "^8.0.0" - }, - "peerDependenciesMeta": { - "ajv": { - "optional": true - } - } - }, - "node_modules/fast-json-stringify/node_modules/fast-uri": { - "version": "2.4.0", - "resolved": "https://registry.npmjs.org/fast-uri/-/fast-uri-2.4.0.tgz", - "integrity": "sha512-ypuAmmMKInk5q7XcepxlnUWDLWv4GFtaJqAzWKqn62IpQ3pejtr5dTVbt3vwqVaMKmkNR55sTT+CqUKIaT21BA==", - "license": "MIT" - }, - "node_modules/fast-levenshtein": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz", - "integrity": "sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==", - "dev": true, - "license": "MIT" - }, - "node_modules/fast-printf": { - "version": "1.6.9", - "resolved": "https://registry.npmjs.org/fast-printf/-/fast-printf-1.6.9.tgz", - "integrity": "sha512-FChq8hbz65WMj4rstcQsFB0O7Cy++nmbNfLYnD9cYv2cRn8EG6k/MGn9kO/tjO66t09DLDugj3yL+V2o6Qftrg==", - "license": "BSD-3-Clause", - "dependencies": { - "boolean": "^3.1.4" - }, - "engines": { - "node": ">=10.0" - } - }, - "node_modules/fast-uri": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/fast-uri/-/fast-uri-3.0.3.tgz", - "integrity": "sha512-aLrHthzCjH5He4Z2H9YZ+v6Ujb9ocRuW6ZzkJQOrTxleEijANq4v1TsaPaVG1PZcuurEzrLcWRyYBYXD5cEiaw==", - "license": "BSD-3-Clause" - }, - "node_modules/fastq": { - "version": "1.17.1", - "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.17.1.tgz", - "integrity": "sha512-sRVD3lWVIXWg6By68ZN7vho9a1pQcN/WBFaAAsDDFzlJjvoGx0P8z7V1t72grFJfJhu3YPZBuu25f7Kaw2jN1w==", - "license": "ISC", - "dependencies": { - "reusify": "^1.0.4" - } - }, - "node_modules/figgy-pudding": { - "version": "3.5.2", - "resolved": "https://registry.npmjs.org/figgy-pudding/-/figgy-pudding-3.5.2.tgz", - "integrity": "sha512-0btnI/H8f2pavGMN8w40mlSKOfTK2SVJmBfBeVIj3kNw0swwgzyRq0d5TJVOwodFmtvpPeWPN/MCcfuWF0Ezbw==", - "deprecated": "This module is no longer supported.", - "dev": true, - "license": "ISC" - }, - "node_modules/figures": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/figures/-/figures-3.2.0.tgz", - "integrity": "sha512-yaduQFRKLXYOGgEn6AZau90j3ggSOyiqXU0F9JZfeXYhNa+Jk4X+s45A2zg5jns87GAFa34BBm2kXw4XpNcbdg==", - "license": "MIT", - "dependencies": { - "escape-string-regexp": "^1.0.5" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/figures/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==", - "license": "MIT", - "engines": { - "node": ">=0.8.0" - } - }, - "node_modules/file-entry-cache": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-6.0.1.tgz", - "integrity": "sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg==", - "dev": true, - "license": "MIT", - "dependencies": { - "flat-cache": "^3.0.4" - }, - "engines": { - "node": "^10.12.0 || >=12.0.0" - } - }, - "node_modules/file-loader": { - "version": "6.2.0", - "resolved": "https://registry.npmjs.org/file-loader/-/file-loader-6.2.0.tgz", - "integrity": "sha512-qo3glqyTa61Ytg4u73GultjHGjdRyig3tG6lPtyX/jOEJvHif9uB0/OCI2Kif6ctF3caQTW2G5gym21oAsI4pw==", - "dev": true, - "license": "MIT", - "dependencies": { - "loader-utils": "^2.0.0", - "schema-utils": "^3.0.0" - }, - "engines": { - "node": ">= 10.13.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/webpack" - }, - "peerDependencies": { - "webpack": "^4.0.0 || ^5.0.0" - } - }, - "node_modules/file-loader/node_modules/ajv": { - "version": "6.12.6", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", - "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", - "dev": true, - "license": "MIT", - "dependencies": { - "fast-deep-equal": "^3.1.1", - "fast-json-stable-stringify": "^2.0.0", - "json-schema-traverse": "^0.4.1", - "uri-js": "^4.2.2" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/epoberezkin" - } - }, - "node_modules/file-loader/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", - "peerDependencies": { - "ajv": "^6.9.1" - } - }, - "node_modules/file-loader/node_modules/json-schema-traverse": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", - "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", - "dev": true, - "license": "MIT" - }, - "node_modules/file-loader/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" - } - }, - "node_modules/file-loader/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", - "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/file-uri-to-path": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/file-uri-to-path/-/file-uri-to-path-1.0.0.tgz", - "integrity": "sha512-0Zt+s3L7Vf1biwWZ29aARiVYLx7iMGnEUl9x33fbB/j3jR81u/O2LbqK+Bm1CDSNDKVtJ/YjwY7TUd5SkeLQLw==", - "dev": true, - "license": "MIT", - "optional": true - }, - "node_modules/fill-range": { - "version": "7.1.1", - "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.1.1.tgz", - "integrity": "sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==", - "license": "MIT", - "dependencies": { - "to-regex-range": "^5.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/finalhandler": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.3.1.tgz", - "integrity": "sha512-6BN9trH7bp3qvnrRyzsBz+g3lZxTNZTbVO2EV1CS0WIcDbawYVdYvGflME/9QP0h0pYlCDBCTjYa9nZzMDpyxQ==", - "license": "MIT", - "dependencies": { - "debug": "2.6.9", - "encodeurl": "~2.0.0", - "escape-html": "~1.0.3", - "on-finished": "2.4.1", - "parseurl": "~1.3.3", - "statuses": "2.0.1", - "unpipe": "~1.0.0" - }, - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/finalhandler/node_modules/debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", - "license": "MIT", - "dependencies": { - "ms": "2.0.0" - } - }, - "node_modules/finalhandler/node_modules/ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", - "license": "MIT" - }, - "node_modules/find-cache-dir": { - "version": "3.3.2", - "resolved": "https://registry.npmjs.org/find-cache-dir/-/find-cache-dir-3.3.2.tgz", - "integrity": "sha512-wXZV5emFEjrridIgED11OoUKLxiYjAcqot/NJdAkOhlJ+vGzwhOAfcG5OX1jP+S0PcjEn8bdMJv+g2jwQ3Onig==", - "dev": true, - "license": "MIT", - "dependencies": { - "commondir": "^1.0.1", - "make-dir": "^3.0.2", - "pkg-dir": "^4.1.0" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/avajs/find-cache-dir?sponsor=1" - } - }, - "node_modules/find-up": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz", - "integrity": "sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==", - "dev": true, - "license": "MIT", - "dependencies": { - "locate-path": "^6.0.0", - "path-exists": "^4.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/find-yarn-workspace-root": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/find-yarn-workspace-root/-/find-yarn-workspace-root-2.0.0.tgz", - "integrity": "sha512-1IMnbjt4KzsQfnhnzNd8wUEgXZ44IzZaZmnLYx7D5FZlaHt2gW20Cri8Q+E/t5tIj4+epTBub+2Zxu/vNILzqQ==", - "dev": true, - "license": "Apache-2.0", - "dependencies": { - "micromatch": "^4.0.2" - } - }, - "node_modules/flat": { - "version": "5.0.2", - "resolved": "https://registry.npmjs.org/flat/-/flat-5.0.2.tgz", - "integrity": "sha512-b6suED+5/3rTpUBdG1gupIl8MPFCAMA0QXwmljLhvCUKcUvdE4gWky9zpuGCcXHOsz4J9wPGNWq6OKpmIzz3hQ==", - "license": "BSD-3-Clause", - "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", - "integrity": "sha512-CYcENa+FtcUKLmhhqyctpclsq7QF38pKjZHsGNiSQF5r4FtoKDWabFDl3hzaEQMvT1LHEysw5twgLvpYYb4vbw==", - "dev": true, - "license": "MIT", - "dependencies": { - "flatted": "^3.2.9", - "keyv": "^4.5.3", - "rimraf": "^3.0.2" - }, - "engines": { - "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" - }, - "node_modules/flatted": { - "version": "3.3.2", - "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.3.2.tgz", - "integrity": "sha512-AiwGJM8YcNOaobumgtng+6NHuOqC3A7MixFeDafM3X9cIUM+xUXoS5Vfgf+OihAYe20fxqNM9yPBXJzRtZ/4eA==", - "dev": true, - "license": "ISC" - }, - "node_modules/flush-write-stream": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/flush-write-stream/-/flush-write-stream-1.1.1.tgz", - "integrity": "sha512-3Z4XhFZ3992uIq0XOqb9AreonueSYphE6oYbpt5+3u06JWklbsPkNv3ZKkP9Bz/r+1MWCaMoSQ28P85+1Yc77w==", - "dev": true, - "license": "MIT", - "dependencies": { - "inherits": "^2.0.3", - "readable-stream": "^2.3.6" - } - }, - "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==", - "funding": [ - { - "type": "individual", - "url": "https://github.com/sponsors/RubenVerborgh" - } - ], - "license": "MIT", - "engines": { - "node": ">=4.0" - }, - "peerDependenciesMeta": { - "debug": { - "optional": true - } - } - }, - "node_modules/for-each": { - "version": "0.3.3", - "resolved": "https://registry.npmjs.org/for-each/-/for-each-0.3.3.tgz", - "integrity": "sha512-jqYfLp7mo9vIyQf8ykW2v7A+2N4QjeCeI5+Dz9XraiO1ign81wjiH7Fb9vSOWvQfNtmSa4H2RoQTrrXivdUZmw==", - "dev": true, - "license": "MIT", - "dependencies": { - "is-callable": "^1.1.3" - } - }, - "node_modules/for-in": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/for-in/-/for-in-1.0.2.tgz", - "integrity": "sha512-7EwmXrOjyL+ChxMhmG5lnW9MPt1aIeZEwKhQzoBUdTV0N3zuwWDZYVJatDvZ2OyzPUvdIAZDsCetk3coyMfcnQ==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/foreground-child": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/foreground-child/-/foreground-child-2.0.0.tgz", - "integrity": "sha512-dCIq9FpEcyQyXKCkyzmlPTFNgrCzPudOe+mhvJU5zAtlBnGVy2yKxtfsxK2tQBThwq225jcvBjpw1Gr40uzZCA==", - "dev": true, - "license": "ISC", - "dependencies": { - "cross-spawn": "^7.0.0", - "signal-exit": "^3.0.2" - }, - "engines": { - "node": ">=8.0.0" - } - }, - "node_modules/foreground-child/node_modules/signal-exit": { - "version": "3.0.7", - "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz", - "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==", - "dev": true, - "license": "ISC" - }, - "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==", - "license": "MIT", - "dependencies": { - "asynckit": "^0.4.0", - "combined-stream": "^1.0.8", - "mime-types": "^2.1.12" - }, - "engines": { - "node": ">= 6" - } - }, - "node_modules/forwarded": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.2.0.tgz", - "integrity": "sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow==", - "license": "MIT", - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/fraction.js": { - "version": "4.3.7", - "resolved": "https://registry.npmjs.org/fraction.js/-/fraction.js-4.3.7.tgz", - "integrity": "sha512-ZsDfxO51wGAXREY55a7la9LScWpwv9RxIrYABrlvOFBlH/ShPnrtsXeuUIfXKKOVicNxQ+o8JTbJvjS4M89yew==", - "dev": true, - "license": "MIT", - "engines": { - "node": "*" - }, - "funding": { - "type": "patreon", - "url": "https://github.com/sponsors/rawify" - } - }, - "node_modules/fragment-cache": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/fragment-cache/-/fragment-cache-0.2.1.tgz", - "integrity": "sha512-GMBAbW9antB8iZRHLoGw0b3HANt57diZYFO/HL1JGIC1MjKrdmhxvrJbupnVvpys0zsz7yBApXdQyfepKly2kA==", - "dev": true, - "license": "MIT", - "dependencies": { - "map-cache": "^0.2.2" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/fresh": { - "version": "0.5.2", - "resolved": "https://registry.npmjs.org/fresh/-/fresh-0.5.2.tgz", - "integrity": "sha512-zJ2mQYM18rEFOudeV4GShTGIQ7RbzA7ozbU9I/XBpm7kqgMywgmylMwXHxZJmkVoYkna9d2pVXVXPdYTP9ej8Q==", - "license": "MIT", - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/from2": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/from2/-/from2-2.3.0.tgz", - "integrity": "sha512-OMcX/4IC/uqEPVgGeyfN22LJk6AZrMkRZHxcHBMBvHScDGgwTm2GT2Wkgtocyd3JfZffjj2kYUDXXII0Fk9W0g==", - "dev": true, - "license": "MIT", - "dependencies": { - "inherits": "^2.0.1", - "readable-stream": "^2.0.0" - } - }, - "node_modules/fromentries": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/fromentries/-/fromentries-1.3.2.tgz", - "integrity": "sha512-cHEpEQHUg0f8XdtZCc2ZAhrHzKzT0MrFUTcvx+hfxYu7rGMDc5SKoXFh+n4YigxsHXRzc6OrCshdR1bWH6HHyg==", - "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/fs-extra": { - "version": "8.1.0", - "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-8.1.0.tgz", - "integrity": "sha512-yhlQgA6mnOJUKOsRUFsgJdQCvkKhcz8tlZG5HBQfReYZy46OwLcY+Zia0mtdHsOo9y/hP+CxMN0TU9QxoOtG4g==", - "license": "MIT", - "dependencies": { - "graceful-fs": "^4.2.0", - "jsonfile": "^4.0.0", - "universalify": "^0.1.0" - }, - "engines": { - "node": ">=6 <7 || >=8" - } - }, - "node_modules/fs-memo": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/fs-memo/-/fs-memo-1.2.0.tgz", - "integrity": "sha512-YEexkCpL4j03jn5SxaMHqcO6IuWuqm8JFUYhyCep7Ao89JIYmB8xoKhK7zXXJ9cCaNXpyNH5L3QtAmoxjoHW2w==", - "dev": true, - "license": "MIT" - }, - "node_modules/fs-minipass": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/fs-minipass/-/fs-minipass-2.1.0.tgz", - "integrity": "sha512-V/JgOLFCS+R6Vcq0slCuaeWEdNC3ouDlJMNIsacH2VtALiu9mV4LPrHc5cDl8k5aw6J8jwgWWpiTo5RYhmIzvg==", - "dev": true, - "license": "ISC", - "dependencies": { - "minipass": "^3.0.0" - }, - "engines": { - "node": ">= 8" - } - }, - "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==", - "dev": true, - "license": "Unlicense" - }, - "node_modules/fs-write-stream-atomic": { - "version": "1.0.10", - "resolved": "https://registry.npmjs.org/fs-write-stream-atomic/-/fs-write-stream-atomic-1.0.10.tgz", - "integrity": "sha512-gehEzmPn2nAwr39eay+x3X34Ra+M2QlVUTLhkXPjWdeO8RF9kszk116avgBJM3ZyNHgHXBNx+VmPaFC36k0PzA==", - "deprecated": "This package is no longer supported.", - "dev": true, - "license": "ISC", - "dependencies": { - "graceful-fs": "^4.1.2", - "iferr": "^0.1.5", - "imurmurhash": "^0.1.4", - "readable-stream": "1 || 2" - } - }, - "node_modules/fs.realpath": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", - "integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==", - "license": "ISC" - }, - "node_modules/fsevents": { - "version": "2.3.3", - "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz", - "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==", - "hasInstallScript": true, - "license": "MIT", - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": "^8.16.0 || ^10.6.0 || >=11.0.0" - } - }, - "node_modules/function-bind": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz", - "integrity": "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==", - "license": "MIT", - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/function.prototype.name": { - "version": "1.1.6", - "resolved": "https://registry.npmjs.org/function.prototype.name/-/function.prototype.name-1.1.6.tgz", - "integrity": "sha512-Z5kx79swU5P27WEayXM1tBi5Ze/lbIyiNgU3qyXUOf9b2rgXYyF9Dy9Cx+IQv/Lc8WCG6L82zwUPpSS9hGehIg==", - "dev": true, - "license": "MIT", - "dependencies": { - "call-bind": "^1.0.2", - "define-properties": "^1.2.0", - "es-abstract": "^1.22.1", - "functions-have-names": "^1.2.3" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/functional-red-black-tree": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/functional-red-black-tree/-/functional-red-black-tree-1.0.1.tgz", - "integrity": "sha512-dsKNQNdj6xA3T+QlADDA7mOSlX0qiMINjn0cgr+eGHGsbSHzTabcIogz2+p/iqP1Xs6EP/sS2SbqH+brGTbq0g==", - "dev": true, - "license": "MIT" - }, - "node_modules/functions-have-names": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/functions-have-names/-/functions-have-names-1.2.3.tgz", - "integrity": "sha512-xckBUXyTIqT97tq2x2AMb+g163b5JFysYk0x4qxNFwbfQkmNZoiRHb6sPzI9/QV33WeuvVYBUIiD4NzNIyqaRQ==", - "dev": true, - "license": "MIT", - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/gensync": { - "version": "1.0.0-beta.2", - "resolved": "https://registry.npmjs.org/gensync/-/gensync-1.0.0-beta.2.tgz", - "integrity": "sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/get-caller-file": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", - "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==", - "license": "ISC", - "engines": { - "node": "6.* || 8.* || >= 10.*" - } - }, - "node_modules/get-intrinsic": { - "version": "1.2.4", - "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.2.4.tgz", - "integrity": "sha512-5uYhsJH8VJBTv7oslg4BznJYhDoRI6waYCxMmCdnTrcCrHA/fCFKoTFz2JKKE0HdDFUF7/oQuhzumXJK7paBRQ==", - "license": "MIT", - "dependencies": { - "es-errors": "^1.3.0", - "function-bind": "^1.1.2", - "has-proto": "^1.0.1", - "has-symbols": "^1.0.3", - "hasown": "^2.0.0" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/get-package-type": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/get-package-type/-/get-package-type-0.1.0.tgz", - "integrity": "sha512-pjzuKtY64GYfWizNAJ0fr9VqttZkNiK2iS430LtIHzjBEr6bX8Am2zm4sW4Ro5wjWW5cAlRL1qAMTcXbjNAO2Q==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=8.0.0" - } - }, - "node_modules/get-port-please": { - "version": "2.6.1", - "resolved": "https://registry.npmjs.org/get-port-please/-/get-port-please-2.6.1.tgz", - "integrity": "sha512-4PDSrL6+cuMM1xs6w36ZIkaKzzE0xzfVBCfebHIJ3FE8iB9oic/ECwPw3iNiD4h1AoJ5XLLBhEviFAVrZsDC5A==", - "dev": true, - "license": "MIT", - "dependencies": { - "fs-memo": "^1.2.0" - } - }, - "node_modules/get-stdin": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/get-stdin/-/get-stdin-8.0.0.tgz", - "integrity": "sha512-sY22aA6xchAzprjyqmSEQv4UbAAzRN0L2dQB0NlN5acTTK9Don6nhoc3eAbUnpZiCANAMfd/+40kVdKfFygohg==", - "license": "MIT", - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/get-stream": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-6.0.1.tgz", - "integrity": "sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==", - "license": "MIT", - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/get-symbol-description": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/get-symbol-description/-/get-symbol-description-1.0.2.tgz", - "integrity": "sha512-g0QYk1dZBxGwk+Ngc+ltRH2IBp2f7zBkBMBJZCDerh6EhlhSR6+9irMCuT/09zD6qkarHUSn529sK/yL4S27mg==", - "dev": true, - "license": "MIT", - "dependencies": { - "call-bind": "^1.0.5", - "es-errors": "^1.3.0", - "get-intrinsic": "^1.2.4" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/get-value": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/get-value/-/get-value-2.0.6.tgz", - "integrity": "sha512-Ln0UQDlxH1BapMu3GPtf7CuYNwRZf2gwCuPqbyG6pB8WfmFpzqcy4xtAaAMUhnNqjMKTiCPZG2oMT3YSx8U2NA==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/git-config-path": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/git-config-path/-/git-config-path-2.0.0.tgz", - "integrity": "sha512-qc8h1KIQbJpp+241id3GuAtkdyJ+IK+LIVtkiFTRKRrmddDzs3SI9CvP1QYmWBFvm1I/PWRwj//of8bgAc0ltA==", - "license": "MIT", - "engines": { - "node": ">=4" - } - }, - "node_modules/git-raw-commits": { - "version": "2.0.11", - "resolved": "https://registry.npmjs.org/git-raw-commits/-/git-raw-commits-2.0.11.tgz", - "integrity": "sha512-VnctFhw+xfj8Va1xtfEqCUD2XDrbAPSJx+hSrE5K7fGdjZruW7XV+QOrN7LF/RJyvspRiD2I0asWsxFp0ya26A==", - "dev": true, - "license": "MIT", - "dependencies": { - "dargs": "^7.0.0", - "lodash": "^4.17.15", - "meow": "^8.0.0", - "split2": "^3.0.0", - "through2": "^4.0.0" - }, - "bin": { - "git-raw-commits": "cli.js" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/git-up": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/git-up/-/git-up-7.0.0.tgz", - "integrity": "sha512-ONdIrbBCFusq1Oy0sC71F5azx8bVkvtZtMJAsv+a6lz5YAmbNnLD6HAB4gptHZVLPR8S2/kVN6Gab7lryq5+lQ==", - "license": "MIT", - "dependencies": { - "is-ssh": "^1.4.0", - "parse-url": "^8.1.0" - } - }, - "node_modules/git-url-parse": { - "version": "13.1.1", - "resolved": "https://registry.npmjs.org/git-url-parse/-/git-url-parse-13.1.1.tgz", - "integrity": "sha512-PCFJyeSSdtnbfhSNRw9Wk96dDCNx+sogTe4YNXeXSJxt7xz5hvXekuRn9JX7m+Mf4OscCu8h+mtAl3+h5Fo8lQ==", - "license": "MIT", - "dependencies": { - "git-up": "^7.0.0" - } - }, - "node_modules/glob": { - "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", - "license": "ISC", - "dependencies": { - "fs.realpath": "^1.0.0", - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "^3.1.1", - "once": "^1.3.0", - "path-is-absolute": "^1.0.0" - }, - "engines": { - "node": "*" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/glob-parent": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", - "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", - "license": "ISC", - "dependencies": { - "is-glob": "^4.0.1" - }, - "engines": { - "node": ">= 6" - } - }, - "node_modules/glob-promise": { - "version": "4.2.2", - "resolved": "https://registry.npmjs.org/glob-promise/-/glob-promise-4.2.2.tgz", - "integrity": "sha512-xcUzJ8NWN5bktoTIX7eOclO1Npxd/dyVqUJxlLIDasT4C7KZyqlPIwkdJ0Ypiy3p2ZKahTjK4M9uC3sNSfNMzw==", - "license": "MIT", - "dependencies": { - "@types/glob": "^7.1.3" - }, - "engines": { - "node": ">=12" - }, - "funding": { - "type": "individual", - "url": "https://github.com/sponsors/ahmadnassri" - }, - "peerDependencies": { - "glob": "^7.1.6" - } - }, - "node_modules/glob-to-regexp": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/glob-to-regexp/-/glob-to-regexp-0.4.1.tgz", - "integrity": "sha512-lkX1HJXwyMcprw/5YUZc2s7DrpAiHB21/V+E1rHUrVNokkvB6bqMzT0VfV6/86ZNabt1k14YOIaT7nDvOX3Iiw==", - "dev": true, - "license": "BSD-2-Clause" - }, - "node_modules/global-dirs": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/global-dirs/-/global-dirs-0.1.1.tgz", - "integrity": "sha512-NknMLn7F2J7aflwFOlGdNIuCDpN3VGoSoB+aap3KABFWbHVn1TCgFC+np23J8W2BiZbjfEw3BFBycSMv1AFblg==", - "dev": true, - "license": "MIT", - "dependencies": { - "ini": "^1.3.4" - }, - "engines": { - "node": ">=4" - } - }, - "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==", - "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==", - "dev": true, - "license": "MIT", - "dependencies": { - "define-properties": "^1.2.1", - "gopd": "^1.0.1" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/globby": { - "version": "11.1.0", - "resolved": "https://registry.npmjs.org/globby/-/globby-11.1.0.tgz", - "integrity": "sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g==", - "license": "MIT", - "dependencies": { - "array-union": "^2.1.0", - "dir-glob": "^3.0.1", - "fast-glob": "^3.2.9", - "ignore": "^5.2.0", - "merge2": "^1.4.1", - "slash": "^3.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/globby/node_modules/ignore": { - "version": "5.3.2", - "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.3.2.tgz", - "integrity": "sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g==", - "license": "MIT", - "engines": { - "node": ">= 4" - } - }, - "node_modules/gm": { - "version": "1.25.0", - "resolved": "https://registry.npmjs.org/gm/-/gm-1.25.0.tgz", - "integrity": "sha512-4kKdWXTtgQ4biIo7hZA396HT062nDVVHPjQcurNZ3o/voYN+o5FUC5kOwuORbpExp3XbTJ3SU7iRipiIhQtovw==", - "license": "MIT", - "dependencies": { - "array-parallel": "~0.1.3", - "array-series": "~0.1.5", - "cross-spawn": "^4.0.0", - "debug": "^3.1.0" - }, - "engines": { - "node": ">=14" - } - }, - "node_modules/gm/node_modules/cross-spawn": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-4.0.2.tgz", - "integrity": "sha512-yAXz/pA1tD8Gtg2S98Ekf/sewp3Lcp3YoFKJ4Hkp5h5yLWnKVTDU0kwjKJ8NDCYcfTLfyGkzTikst+jWypT1iA==", - "license": "MIT", - "dependencies": { - "lru-cache": "^4.0.1", - "which": "^1.2.9" - } - }, - "node_modules/gm/node_modules/debug": { - "version": "3.2.7", - "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", - "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", - "license": "MIT", - "dependencies": { - "ms": "^2.1.1" - } - }, - "node_modules/gm/node_modules/lru-cache": { - "version": "4.1.5", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-4.1.5.tgz", - "integrity": "sha512-sWZlbEP2OsHNkXrMl5GYk/jKk70MBng6UU4YI/qGDYbgf6YbP4EvmqISbXCoJiRKs+1bSpFHVgQxvJ17F2li5g==", - "license": "ISC", - "dependencies": { - "pseudomap": "^1.0.2", - "yallist": "^2.1.2" - } - }, - "node_modules/gm/node_modules/which": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz", - "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==", - "license": "ISC", - "dependencies": { - "isexe": "^2.0.0" - }, - "bin": { - "which": "bin/which" - } - }, - "node_modules/gm/node_modules/yallist": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-2.1.2.tgz", - "integrity": "sha512-ncTzHV7NvsQZkYe1DW7cbDLm0YpzHmZF5r/iyP3ZnQtMiJ+pjzisCiMNI+Sj+xQF5pXhSHxSB3uDbsBTzY/c2A==", - "license": "ISC" - }, - "node_modules/google-fonts-helper": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/google-fonts-helper/-/google-fonts-helper-1.2.0.tgz", - "integrity": "sha512-ojpHo6uwaqI2/tpXcCBY9u/3erd++Wjpf1UQkmb+ZUa/oMztiospubmQCwDQ0AHhFUkBMW1+R12am1kxQFqymg==", - "dev": true, - "license": "MIT", - "dependencies": { - "deepmerge": "^4.2.2", - "fs-extra": "^9.0.1", - "got": "^11.8.1" - } - }, - "node_modules/google-fonts-helper/node_modules/fs-extra": { - "version": "9.1.0", - "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-9.1.0.tgz", - "integrity": "sha512-hcg3ZmepS30/7BSFqRvoo3DOMQu7IjqxO5nCDt+zM9XWjb33Wg7ziNT+Qvqbuc3+gWpzO02JubVyk2G4Zvo1OQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "at-least-node": "^1.0.0", - "graceful-fs": "^4.2.0", - "jsonfile": "^6.0.1", - "universalify": "^2.0.0" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/google-fonts-helper/node_modules/jsonfile": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.1.0.tgz", - "integrity": "sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "universalify": "^2.0.0" - }, - "optionalDependencies": { - "graceful-fs": "^4.1.6" - } - }, - "node_modules/google-fonts-helper/node_modules/universalify": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.1.tgz", - "integrity": "sha512-gptHNQghINnc/vTGIk0SOFGFNXw7JVrlRUtConJRlvaw6DuX0wO5Jeko9sWrMBhh+PsYAZ7oXAiOnf/UKogyiw==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 10.0.0" - } - }, - "node_modules/gopd": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.0.1.tgz", - "integrity": "sha512-d65bNlIadxvpb/A2abVdlqKqV563juRnZ1Wtk6s1sIR8uNsXR70xqIzVqxVf1eTqDunwT2MkczEeaezCKTZhwA==", - "license": "MIT", - "dependencies": { - "get-intrinsic": "^1.1.3" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/got": { - "version": "11.8.6", - "resolved": "https://registry.npmjs.org/got/-/got-11.8.6.tgz", - "integrity": "sha512-6tfZ91bOr7bOXnK7PRDCGBLa1H4U080YHNaAQ2KsMGlLEzRbk44nsZF2E1IeRc3vtJHPVbKCYgdFbaGO2ljd8g==", - "dev": true, - "license": "MIT", - "dependencies": { - "@sindresorhus/is": "^4.0.0", - "@szmarczak/http-timer": "^4.0.5", - "@types/cacheable-request": "^6.0.1", - "@types/responselike": "^1.0.0", - "cacheable-lookup": "^5.0.3", - "cacheable-request": "^7.0.2", - "decompress-response": "^6.0.0", - "http2-wrapper": "^1.0.0-beta.5.2", - "lowercase-keys": "^2.0.0", - "p-cancelable": "^2.0.0", - "responselike": "^2.0.0" - }, - "engines": { - "node": ">=10.19.0" - }, - "funding": { - "url": "https://github.com/sindresorhus/got?sponsor=1" - } - }, - "node_modules/got/node_modules/cacheable-lookup": { - "version": "5.0.4", - "resolved": "https://registry.npmjs.org/cacheable-lookup/-/cacheable-lookup-5.0.4.tgz", - "integrity": "sha512-2/kNscPhpcxrOigMZzbiWF7dz8ilhb/nIHU3EyZiXWXpeq/au8qJ8VhdftMkty3n7Gj6HIGalQG8oiBNB3AJgA==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=10.6.0" - } - }, - "node_modules/graceful-fs": { - "version": "4.2.11", - "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.11.tgz", - "integrity": "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==", - "license": "ISC" - }, - "node_modules/growl": { - "version": "1.10.5", - "resolved": "https://registry.npmjs.org/growl/-/growl-1.10.5.tgz", - "integrity": "sha512-qBr4OuELkhPenW6goKVXiv47US3clb3/IbuWF9KNKEijAy9oeHxU9IgzjvJhHkUzhaj7rOUD7+YGWqUjLp5oSA==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=4.x" - } - }, - "node_modules/gzip-size": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/gzip-size/-/gzip-size-6.0.0.tgz", - "integrity": "sha512-ax7ZYomf6jqPTQ4+XCpUGyXKHk5WweS+e05MBO4/y3WJ5RkmPXNKvX+bx1behVILVwr6JSQvZAku021CHPXG3Q==", - "dev": true, - "license": "MIT", - "dependencies": { - "duplexer": "^0.1.2" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/hard-rejection": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/hard-rejection/-/hard-rejection-2.1.0.tgz", - "integrity": "sha512-VIZB+ibDhx7ObhAe7OVtoEbuP4h/MuOTHJ+J8h/eBXotJYl0fBgR72xDFCKgIh22OJZIOVNxBMWuhAr10r8HdA==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=6" - } - }, - "node_modules/hard-source-webpack-plugin": { - "version": "0.13.1", - "resolved": "https://registry.npmjs.org/hard-source-webpack-plugin/-/hard-source-webpack-plugin-0.13.1.tgz", - "integrity": "sha512-r9zf5Wq7IqJHdVAQsZ4OP+dcUSvoHqDMxJlIzaE2J0TZWn3UjMMrHqwDHR8Jr/pzPfG7XxSe36E7Y8QGNdtuAw==", - "dev": true, - "license": "ISC", - "dependencies": { - "chalk": "^2.4.1", - "find-cache-dir": "^2.0.0", - "graceful-fs": "^4.1.11", - "lodash": "^4.15.0", - "mkdirp": "^0.5.1", - "node-object-hash": "^1.2.0", - "parse-json": "^4.0.0", - "pkg-dir": "^3.0.0", - "rimraf": "^2.6.2", - "semver": "^5.6.0", - "tapable": "^1.0.0-beta.5", - "webpack-sources": "^1.0.1", - "write-json-file": "^2.3.0" - }, - "engines": { - "node": ">=8.0.0" - }, - "peerDependencies": { - "webpack": "*" - } - }, - "node_modules/hard-source-webpack-plugin/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, - "license": "MIT", - "dependencies": { - "color-convert": "^1.9.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/hard-source-webpack-plugin/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, - "license": "MIT", - "dependencies": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/hard-source-webpack-plugin/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, - "license": "MIT", - "dependencies": { - "color-name": "1.1.3" - } - }, - "node_modules/hard-source-webpack-plugin/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, - "license": "MIT" - }, - "node_modules/hard-source-webpack-plugin/node_modules/escape-string-regexp": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", - "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=0.8.0" - } - }, - "node_modules/hard-source-webpack-plugin/node_modules/find-cache-dir": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/find-cache-dir/-/find-cache-dir-2.1.0.tgz", - "integrity": "sha512-Tq6PixE0w/VMFfCgbONnkiQIVol/JJL7nRMi20fqzA4NRs9AfeqMGeRdPi3wIhYkxjeBaWh2rxwapn5Tu3IqOQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "commondir": "^1.0.1", - "make-dir": "^2.0.0", - "pkg-dir": "^3.0.0" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/hard-source-webpack-plugin/node_modules/find-up": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-3.0.0.tgz", - "integrity": "sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg==", - "dev": true, - "license": "MIT", - "dependencies": { - "locate-path": "^3.0.0" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/hard-source-webpack-plugin/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_modules/hard-source-webpack-plugin/node_modules/locate-path": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-3.0.0.tgz", - "integrity": "sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A==", - "dev": true, - "license": "MIT", - "dependencies": { - "p-locate": "^3.0.0", - "path-exists": "^3.0.0" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/hard-source-webpack-plugin/node_modules/make-dir": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-2.1.0.tgz", - "integrity": "sha512-LS9X+dc8KLxXCb8dni79fLIIUA5VyZoyjSMCwTluaXA0o27cCK0bhXkpgw+sTXVpPy/lSO57ilRixqk0vDmtRA==", - "dev": true, - "license": "MIT", - "dependencies": { - "pify": "^4.0.1", - "semver": "^5.6.0" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/hard-source-webpack-plugin/node_modules/mkdirp": { - "version": "0.5.6", - "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.6.tgz", - "integrity": "sha512-FP+p8RB8OWpF3YZBCrP5gtADmtXApB5AMLn+vdyA+PyxCjrCs00mjyUozssO33cwDeT3wNGdLxJ5M//YqtHAJw==", - "dev": true, - "license": "MIT", - "dependencies": { - "minimist": "^1.2.6" - }, - "bin": { - "mkdirp": "bin/cmd.js" - } - }, - "node_modules/hard-source-webpack-plugin/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", - "dependencies": { - "p-try": "^2.0.0" - }, - "engines": { - "node": ">=6" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/hard-source-webpack-plugin/node_modules/p-locate": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-3.0.0.tgz", - "integrity": "sha512-x+12w/To+4GFfgJhBEpiDcLozRJGegY+Ei7/z0tSLkMmxGZNybVMSfWj9aJn8Z5Fc7dBUNJOOVgPv2H7IwulSQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "p-limit": "^2.0.0" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/hard-source-webpack-plugin/node_modules/parse-json": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-4.0.0.tgz", - "integrity": "sha512-aOIos8bujGN93/8Ox/jPLh7RwVnPEysynVFE+fQZyg6jKELEHwzgKdLRFHUgXJL6kylijVSBC4BvN9OmsB48Rw==", - "dev": true, - "license": "MIT", - "dependencies": { - "error-ex": "^1.3.1", - "json-parse-better-errors": "^1.0.1" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/hard-source-webpack-plugin/node_modules/path-exists": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz", - "integrity": "sha512-bpC7GYwiDYQ4wYLe+FA8lhRjhQCMcQGuSgGGqDkg/QerRWw9CmGRT0iSOVRSZJ29NMLZgIzqaljJ63oaL4NIJQ==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=4" - } - }, - "node_modules/hard-source-webpack-plugin/node_modules/pify": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/pify/-/pify-4.0.1.tgz", - "integrity": "sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=6" - } - }, - "node_modules/hard-source-webpack-plugin/node_modules/pkg-dir": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-3.0.0.tgz", - "integrity": "sha512-/E57AYkoeQ25qkxMj5PBOVgF8Kiu/h7cYS30Z5+R7WaiCCBfLq58ZI/dSeaEKb9WVJV5n/03QwrN3IeWIFllvw==", - "dev": true, - "license": "MIT", - "dependencies": { - "find-up": "^3.0.0" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/hard-source-webpack-plugin/node_modules/rimraf": { - "version": "2.7.1", - "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.7.1.tgz", - "integrity": "sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w==", - "deprecated": "Rimraf versions prior to v4 are no longer supported", - "dev": true, - "license": "ISC", - "dependencies": { - "glob": "^7.1.3" - }, - "bin": { - "rimraf": "bin.js" - } - }, - "node_modules/hard-source-webpack-plugin/node_modules/semver": { - "version": "5.7.2", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.2.tgz", - "integrity": "sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g==", - "dev": true, - "license": "ISC", - "bin": { - "semver": "bin/semver" - } - }, - "node_modules/hard-source-webpack-plugin/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, - "license": "MIT", - "dependencies": { - "has-flag": "^3.0.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/has-bigints": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/has-bigints/-/has-bigints-1.0.2.tgz", - "integrity": "sha512-tSvCKtBr9lkF0Ex0aQiP9N+OpV4zi2r/Nee5VkRDbaqv35RLYMzbwQfFSZZH0kR+Rd6302UJZ2p/bJCEoR3VoQ==", - "dev": true, - "license": "MIT", - "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==", - "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==", - "license": "MIT", - "dependencies": { - "es-define-property": "^1.0.0" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/has-proto": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/has-proto/-/has-proto-1.0.3.tgz", - "integrity": "sha512-SJ1amZAJUiZS+PhsVLf5tGydlaVB8EdFpaSO4gmiUKUOxk8qzn5AIy4ZeJUmh22znIdk/uMAUT2pl3FxzVUH+Q==", - "license": "MIT", - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/has-symbols": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.3.tgz", - "integrity": "sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==", - "license": "MIT", - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/has-tostringtag": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/has-tostringtag/-/has-tostringtag-1.0.2.tgz", - "integrity": "sha512-NqADB8VjPFLM2V0VvHUewwwsw0ZWBaIdgo+ieHtK3hasLz4qeCRjYcqfB6AQrBggRKppKF8L52/VqdVsO47Dlw==", - "dev": true, - "license": "MIT", - "dependencies": { - "has-symbols": "^1.0.3" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/has-value": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/has-value/-/has-value-1.0.0.tgz", - "integrity": "sha512-IBXk4GTsLYdQ7Rvt+GRBrFSVEkmuOUy4re0Xjd9kJSUQpnTrWR4/y9RpfexN9vkAPMFuQoeWKwqzPozRTlasGw==", - "dev": true, - "license": "MIT", - "dependencies": { - "get-value": "^2.0.6", - "has-values": "^1.0.0", - "isobject": "^3.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/has-values": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/has-values/-/has-values-1.0.0.tgz", - "integrity": "sha512-ODYZC64uqzmtfGMEAX/FvZiRyWLpAC3vYnNunURUnkGVTS+mI0smVsWaPydRBsE3g+ok7h960jChO8mFcWlHaQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "is-number": "^3.0.0", - "kind-of": "^4.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/has-values/node_modules/is-number": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz", - "integrity": "sha512-4cboCqIpliH+mAvFNegjZQ4kgKc3ZUhQVr3HvWbSh5q3WH2v82ct+T2Y1hdU5Gdtorx/cLifQjqCbL7bpznLTg==", - "dev": true, - "license": "MIT", - "dependencies": { - "kind-of": "^3.0.2" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/has-values/node_modules/is-number/node_modules/kind-of": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha512-NOW9QQXMoZGg/oqnVNoNTTIFEIid1627WCffUBJEdMxYApq7mNE7CpzucIPc+ZQg25Phej7IJSmX3hO+oblOtQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "is-buffer": "^1.1.5" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/has-values/node_modules/kind-of": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-4.0.0.tgz", - "integrity": "sha512-24XsCxmEbRwEDbz/qz3stgin8TTzZ1ESR56OMCN0ujYg+vRutNSiOj9bHH9u85DKgXguraugV5sFuvbD4FW/hw==", - "dev": true, - "license": "MIT", - "dependencies": { - "is-buffer": "^1.1.5" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/hash-base": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/hash-base/-/hash-base-3.0.4.tgz", - "integrity": "sha512-EeeoJKjTyt868liAlVmcv2ZsUfGHlE3Q+BICOXcZiwN3osr5Q/zFGYmTJpoIzuaSTAwndFy+GqhEwlU4L3j4Ow==", - "dev": true, - "license": "MIT", - "dependencies": { - "inherits": "^2.0.1", - "safe-buffer": "^5.0.1" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/hash-sum": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/hash-sum/-/hash-sum-2.0.0.tgz", - "integrity": "sha512-WdZTbAByD+pHfl/g9QSsBIIwy8IT+EsPiKDs0KNX+zSHhdDLFKdZu0BQHljvO+0QI/BasbMSUa8wYNCZTvhslg==", - "license": "MIT" - }, - "node_modules/hash.js": { - "version": "1.1.7", - "resolved": "https://registry.npmjs.org/hash.js/-/hash.js-1.1.7.tgz", - "integrity": "sha512-taOaskGt4z4SOANNseOviYDvjEJinIkRgmp7LbKP2YTTmVxWBl87s/uzK9r+44BclBSp2X7K1hqeNfz9JbBeXA==", - "dev": true, - "license": "MIT", - "dependencies": { - "inherits": "^2.0.3", - "minimalistic-assert": "^1.0.1" - } - }, - "node_modules/hasha": { - "version": "5.2.2", - "resolved": "https://registry.npmjs.org/hasha/-/hasha-5.2.2.tgz", - "integrity": "sha512-Hrp5vIK/xr5SkeN2onO32H0MgNZ0f17HRNH39WfL0SYUNOTZ5Lz1TJ8Pajo/87dYGEFlLMm7mIc/k/s6Bvz9HQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "is-stream": "^2.0.0", - "type-fest": "^0.8.0" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/hasha/node_modules/type-fest": { - "version": "0.8.1", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.8.1.tgz", - "integrity": "sha512-4dbzIzqvjtgiM5rw1k5rEHtBANKmdudhGyBEajN01fEyhaAIhsoKNy6y7+IN93IfpFtwY9iqi7kD+xwKhQsNJA==", - "dev": true, - "license": "(MIT OR CC0-1.0)", - "engines": { - "node": ">=8" - } - }, - "node_modules/hasown": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.2.tgz", - "integrity": "sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==", - "license": "MIT", - "dependencies": { - "function-bind": "^1.1.2" - }, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/he": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/he/-/he-1.2.0.tgz", - "integrity": "sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw==", - "license": "MIT", - "bin": { - "he": "bin/he" - } - }, - "node_modules/highlight.js": { - "version": "10.7.3", - "resolved": "https://registry.npmjs.org/highlight.js/-/highlight.js-10.7.3.tgz", - "integrity": "sha512-tzcUFauisWKNHaRkN4Wjl/ZA07gENAjFl3J/c480dprkGTg5EQstgaNFqBfUqCq54kZRIEcreTsAgF/m2quD7A==", - "dev": true, - "license": "BSD-3-Clause", - "engines": { - "node": "*" - } - }, - "node_modules/hmac-drbg": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/hmac-drbg/-/hmac-drbg-1.0.1.tgz", - "integrity": "sha512-Tti3gMqLdZfhOQY1Mzf/AanLiqh1WTiJgEj26ZuYQ9fbkLomzGchCws4FyrSd4VkpBfiNhaE1On+lOz894jvXg==", - "dev": true, - "license": "MIT", - "dependencies": { - "hash.js": "^1.0.3", - "minimalistic-assert": "^1.0.0", - "minimalistic-crypto-utils": "^1.0.1" - } - }, - "node_modules/hookable": { - "version": "4.4.1", - "resolved": "https://registry.npmjs.org/hookable/-/hookable-4.4.1.tgz", - "integrity": "sha512-KWjZM8C7IVT2qne5HTXjM6R6VnRfjfRlf/oCnHd+yFxoHO1DzOl6B9LzV/VqGQK/IrFewq+EG+ePVrE9Tpc3fg==", - "license": "MIT" - }, - "node_modules/hosted-git-info": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-4.1.0.tgz", - "integrity": "sha512-kyCuEOWjJqZuDbRHzL8V93NzQhwIB71oFWSyzVo+KPZI+pnQPPxucdkrOZvkLRnrf5URsQM+IJ09Dw29cRALIA==", - "dev": true, - "license": "ISC", - "dependencies": { - "lru-cache": "^6.0.0" - }, - "engines": { - "node": ">=10" - } - }, - "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==", - "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/mdevils" - }, - { - "type": "patreon", - "url": "https://patreon.com/mdevils" - } - ], - "license": "MIT" - }, - "node_modules/html-escaper": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/html-escaper/-/html-escaper-2.0.2.tgz", - "integrity": "sha512-H2iMtd0I4Mt5eYiapRdIDjp+XzelXQ0tFE4JS7YFwFevXXMmOp9myNrUvCg0D6ws8iqkRPBfKHgbwig1SmlLfg==", - "dev": true, - "license": "MIT" - }, - "node_modules/html-minifier": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/html-minifier/-/html-minifier-4.0.0.tgz", - "integrity": "sha512-aoGxanpFPLg7MkIl/DDFYtb0iWz7jMFGqFhvEDZga6/4QTjneiD8I/NXL1x5aaoCp7FSIT6h/OhykDdPsbtMig==", - "license": "MIT", - "dependencies": { - "camel-case": "^3.0.0", - "clean-css": "^4.2.1", - "commander": "^2.19.0", - "he": "^1.2.0", - "param-case": "^2.1.1", - "relateurl": "^0.2.7", - "uglify-js": "^3.5.1" - }, - "bin": { - "html-minifier": "cli.js" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/html-minifier-terser": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/html-minifier-terser/-/html-minifier-terser-7.2.0.tgz", - "integrity": "sha512-tXgn3QfqPIpGl9o+K5tpcj3/MN4SfLtsx2GWwBC3SSd0tXQGyF3gsSqad8loJgKZGM3ZxbYDd5yhiBIdWpmvLA==", - "dev": true, - "license": "MIT", - "dependencies": { - "camel-case": "^4.1.2", - "clean-css": "~5.3.2", - "commander": "^10.0.0", - "entities": "^4.4.0", - "param-case": "^3.0.4", - "relateurl": "^0.2.7", - "terser": "^5.15.1" - }, - "bin": { - "html-minifier-terser": "cli.js" - }, - "engines": { - "node": "^14.13.1 || >=16.0.0" - } - }, - "node_modules/html-minifier-terser/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==", - "dev": true, - "license": "MIT", - "dependencies": { - "pascal-case": "^3.1.2", - "tslib": "^2.0.3" - } - }, - "node_modules/html-minifier-terser/node_modules/clean-css": { - "version": "5.3.3", - "resolved": "https://registry.npmjs.org/clean-css/-/clean-css-5.3.3.tgz", - "integrity": "sha512-D5J+kHaVb/wKSFcyyV75uCn8fiY4sV38XJoe4CUyGQ+mOU/fMVYUdH1hJC+CJQ5uY3EnW27SbJYS4X8BiLrAFg==", - "dev": true, - "license": "MIT", - "dependencies": { - "source-map": "~0.6.0" - }, - "engines": { - "node": ">= 10.0" - } - }, - "node_modules/html-minifier-terser/node_modules/commander": { - "version": "10.0.1", - "resolved": "https://registry.npmjs.org/commander/-/commander-10.0.1.tgz", - "integrity": "sha512-y4Mg2tXshplEbSGzx7amzPwKKOCGuoSRP/CjEdwwk0FOGlUbq6lKuoyDZTNZkmxHdJtp54hdfY/JUrdL7Xfdug==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=14" - } - }, - "node_modules/html-minifier-terser/node_modules/entities": { - "version": "4.5.0", - "resolved": "https://registry.npmjs.org/entities/-/entities-4.5.0.tgz", - "integrity": "sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw==", - "dev": true, - "license": "BSD-2-Clause", - "engines": { - "node": ">=0.12" - }, - "funding": { - "url": "https://github.com/fb55/entities?sponsor=1" - } - }, - "node_modules/html-minifier-terser/node_modules/param-case": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/param-case/-/param-case-3.0.4.tgz", - "integrity": "sha512-RXlj7zCYokReqWpOPH9oYivUzLYZ5vAPIfEmCTNViosC78F8F0H9y7T7gG2M39ymgutxF5gcFEsyZQSph9Bp3A==", - "dev": true, - "license": "MIT", - "dependencies": { - "dot-case": "^3.0.4", - "tslib": "^2.0.3" - } - }, - "node_modules/html-minifier/node_modules/commander": { - "version": "2.20.3", - "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz", - "integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==", - "license": "MIT" - }, - "node_modules/html-tags": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/html-tags/-/html-tags-2.0.0.tgz", - "integrity": "sha512-+Il6N8cCo2wB/Vd3gqy/8TZhTD3QvcVeQLCnZiGkGCH3JP28IgGAY41giccp2W4R3jfyJPAP318FQTa1yU7K7g==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=4" - } - }, - "node_modules/html-webpack-plugin": { - "version": "4.5.2", - "resolved": "https://registry.npmjs.org/html-webpack-plugin/-/html-webpack-plugin-4.5.2.tgz", - "integrity": "sha512-q5oYdzjKUIPQVjOosjgvCHQOv9Ett9CYYHlgvJeXG0qQvdSojnBq4vAdQBwn1+yGveAwHCoe/rMR86ozX3+c2A==", - "dev": true, - "license": "MIT", - "dependencies": { - "@types/html-minifier-terser": "^5.0.0", - "@types/tapable": "^1.0.5", - "@types/webpack": "^4.41.8", - "html-minifier-terser": "^5.0.1", - "loader-utils": "^1.2.3", - "lodash": "^4.17.20", - "pretty-error": "^2.1.1", - "tapable": "^1.1.3", - "util.promisify": "1.0.0" - }, - "engines": { - "node": ">=6.9" - }, - "peerDependencies": { - "webpack": "^4.0.0 || ^5.0.0" - } - }, - "node_modules/html-webpack-plugin/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==", - "dev": true, - "license": "MIT", - "dependencies": { - "pascal-case": "^3.1.2", - "tslib": "^2.0.3" - } - }, - "node_modules/html-webpack-plugin/node_modules/commander": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/commander/-/commander-4.1.1.tgz", - "integrity": "sha512-NOKm8xhkzAjzFx8B2v5OAHT+u5pRQc2UCa2Vq9jYL/31o2wi9mxBA7LIFs3sV5VSC49z6pEhfbMULvShKj26WA==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 6" - } - }, - "node_modules/html-webpack-plugin/node_modules/html-minifier-terser": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/html-minifier-terser/-/html-minifier-terser-5.1.1.tgz", - "integrity": "sha512-ZPr5MNObqnV/T9akshPKbVgyOqLmy+Bxo7juKCfTfnjNniTAMdy4hz21YQqoofMBJD2kdREaqPPdThoR78Tgxg==", - "dev": true, - "license": "MIT", - "dependencies": { - "camel-case": "^4.1.1", - "clean-css": "^4.2.3", - "commander": "^4.1.1", - "he": "^1.2.0", - "param-case": "^3.0.3", - "relateurl": "^0.2.7", - "terser": "^4.6.3" - }, - "bin": { - "html-minifier-terser": "cli.js" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/html-webpack-plugin/node_modules/param-case": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/param-case/-/param-case-3.0.4.tgz", - "integrity": "sha512-RXlj7zCYokReqWpOPH9oYivUzLYZ5vAPIfEmCTNViosC78F8F0H9y7T7gG2M39ymgutxF5gcFEsyZQSph9Bp3A==", - "dev": true, - "license": "MIT", - "dependencies": { - "dot-case": "^3.0.4", - "tslib": "^2.0.3" - } - }, - "node_modules/html-webpack-plugin/node_modules/terser": { - "version": "4.8.1", - "resolved": "https://registry.npmjs.org/terser/-/terser-4.8.1.tgz", - "integrity": "sha512-4GnLC0x667eJG0ewJTa6z/yXrbLGv80D9Ru6HIpCQmO+Q4PfEtBFi0ObSckqwL6VyQv/7ENJieXHo2ANmdQwgw==", - "dev": true, - "license": "BSD-2-Clause", - "dependencies": { - "commander": "^2.20.0", - "source-map": "~0.6.1", - "source-map-support": "~0.5.12" - }, - "bin": { - "terser": "bin/terser" - }, - "engines": { - "node": ">=6.0.0" - } - }, - "node_modules/html-webpack-plugin/node_modules/terser/node_modules/commander": { - "version": "2.20.3", - "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz", - "integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==", - "dev": true, - "license": "MIT" - }, - "node_modules/htmlparser2": { - "version": "8.0.2", - "resolved": "https://registry.npmjs.org/htmlparser2/-/htmlparser2-8.0.2.tgz", - "integrity": "sha512-GYdjWKDkbRLkZ5geuHs5NY1puJ+PXwP7+fHPRz06Eirsb9ugf6d8kkXav6ADhcODhFFPMIXyxkxSuMf3D6NCFA==", - "funding": [ - "https://github.com/fb55/htmlparser2?sponsor=1", - { - "type": "github", - "url": "https://github.com/sponsors/fb55" - } - ], - "license": "MIT", - "dependencies": { - "domelementtype": "^2.3.0", - "domhandler": "^5.0.3", - "domutils": "^3.0.1", - "entities": "^4.4.0" - } - }, - "node_modules/htmlparser2/node_modules/entities": { - "version": "4.5.0", - "resolved": "https://registry.npmjs.org/entities/-/entities-4.5.0.tgz", - "integrity": "sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw==", - "license": "BSD-2-Clause", - "engines": { - "node": ">=0.12" - }, - "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==", - "dev": true, - "license": "BSD-2-Clause" - }, - "node_modules/http-errors": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-2.0.0.tgz", - "integrity": "sha512-FtwrG/euBzaEjYeRqOgly7G0qviiXoJWnvEH2Z1plBdXgbyjv34pHTSb9zoeHMyDy33+DWy5Wt9Wo+TURtOYSQ==", - "license": "MIT", - "dependencies": { - "depd": "2.0.0", - "inherits": "2.0.4", - "setprototypeof": "1.2.0", - "statuses": "2.0.1", - "toidentifier": "1.0.1" - }, - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/http-proxy": { - "version": "1.18.1", - "resolved": "https://registry.npmjs.org/http-proxy/-/http-proxy-1.18.1.tgz", - "integrity": "sha512-7mz/721AbnJwIVbnaSv1Cz3Am0ZLT/UBwkC92VlxhXv/k/BBQfM2fXElQNC27BVGr0uwUpplYPQM9LnaBMR5NQ==", - "license": "MIT", - "dependencies": { - "eventemitter3": "^4.0.0", - "follow-redirects": "^1.0.0", - "requires-port": "^1.0.0" - }, - "engines": { - "node": ">=8.0.0" - } - }, - "node_modules/http-proxy-middleware": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/http-proxy-middleware/-/http-proxy-middleware-1.3.1.tgz", - "integrity": "sha512-13eVVDYS4z79w7f1+NPllJtOQFx/FdUW4btIvVRMaRlUY9VGstAbo5MOhLEuUgZFRHn3x50ufn25zkj/boZnEg==", - "license": "MIT", - "dependencies": { - "@types/http-proxy": "^1.17.5", - "http-proxy": "^1.18.1", - "is-glob": "^4.0.1", - "is-plain-obj": "^3.0.0", - "micromatch": "^4.0.2" - }, - "engines": { - "node": ">=8.0.0" - } - }, - "node_modules/http-terminator": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/http-terminator/-/http-terminator-3.2.0.tgz", - "integrity": "sha512-JLjck1EzPaWjsmIf8bziM3p9fgR1Y3JoUKAkyYEbZmFrIvJM6I8vVJfBGWlEtV9IWOvzNnaTtjuwZeBY2kwB4g==", - "license": "BSD-3-Clause", - "dependencies": { - "delay": "^5.0.0", - "p-wait-for": "^3.2.0", - "roarr": "^7.0.4", - "type-fest": "^2.3.3" - }, - "engines": { - "node": ">=14" - } - }, - "node_modules/http2-wrapper": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/http2-wrapper/-/http2-wrapper-1.0.3.tgz", - "integrity": "sha512-V+23sDMr12Wnz7iTcDeJr3O6AIxlnvT/bmaAAAP/Xda35C90p9599p0F1eHR/N1KILWSoWVAiOMFjBBXaXSMxg==", - "dev": true, - "license": "MIT", - "dependencies": { - "quick-lru": "^5.1.1", - "resolve-alpn": "^1.0.0" - }, - "engines": { - "node": ">=10.19.0" - } - }, - "node_modules/https-browserify": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/https-browserify/-/https-browserify-1.0.0.tgz", - "integrity": "sha512-J+FkSdyD+0mA0N+81tMotaRMfSL9SGi+xpD3T6YApKsc3bGSXJlfXri3VyFOeYkfLRQisDk1W+jIFFKBeUBbBg==", - "dev": true, - "license": "MIT" - }, - "node_modules/human-signals": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-2.1.0.tgz", - "integrity": "sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw==", - "license": "Apache-2.0", - "engines": { - "node": ">=10.17.0" - } - }, - "node_modules/husky": { - "version": "8.0.3", - "resolved": "https://registry.npmjs.org/husky/-/husky-8.0.3.tgz", - "integrity": "sha512-+dQSyqPh4x1hlO1swXBiNb2HzTDN1I2IGLQx1GrBuiqFJfoMrnZWwVmatvSiO+Iz8fBUnf+lekwNo4c2LlXItg==", - "dev": true, - "license": "MIT", - "bin": { - "husky": "lib/bin.js" - }, - "engines": { - "node": ">=14" - }, - "funding": { - "url": "https://github.com/sponsors/typicode" - } - }, - "node_modules/hyperdyperid": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/hyperdyperid/-/hyperdyperid-1.2.0.tgz", - "integrity": "sha512-Y93lCzHYgGWdrJ66yIktxiaGULYc6oGiABxhcO5AufBeOyoIdZF7bIfLaOrbM0iGIOXQQgxxRrFEnb+Y6w1n4A==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=10.18" - } - }, - "node_modules/iconv-lite": { - "version": "0.4.24", - "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", - "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", - "license": "MIT", - "dependencies": { - "safer-buffer": ">= 2.1.2 < 3" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/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" - } - }, - "node_modules/ieee754": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.2.1.tgz", - "integrity": "sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==", - "devOptional": 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": "BSD-3-Clause" - }, - "node_modules/iferr": { - "version": "0.1.5", - "resolved": "https://registry.npmjs.org/iferr/-/iferr-0.1.5.tgz", - "integrity": "sha512-DUNFN5j7Tln0D+TxzloUjKB+CtVu6myn0JEFak6dG18mNt9YkQ6lzGCdafwofISZ1lLF3xRHJ98VKy9ynkcFaA==", - "dev": true, - "license": "MIT" - }, - "node_modules/iframe-resizer": { - "version": "4.4.5", - "resolved": "https://registry.npmjs.org/iframe-resizer/-/iframe-resizer-4.4.5.tgz", - "integrity": "sha512-U8bCywf/Gh07O69RXo6dXAzTtODQrxaHGHRI7Nt4ipXsuq6EMxVsOP/jjaP43YtXz/ibESS0uSVDN3sOGCzSmw==", - "dev": true, - "hasInstallScript": true, - "license": "MIT", - "engines": { - "node": ">=0.8.0" - }, - "funding": { - "type": "individual", - "url": "https://iframe-resizer.com//pricing" - } - }, - "node_modules/ignore": { - "version": "4.0.6", - "resolved": "https://registry.npmjs.org/ignore/-/ignore-4.0.6.tgz", - "integrity": "sha512-cyFDKrqc/YdcWFniJhzI42+AzS+gNwmUzOSFcRCQYwySuBBBy/KjuxWLZ/FHEH6Moq1NizMOBWyTcv8O4OZIMg==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 4" - } - }, - "node_modules/ignore-by-default": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/ignore-by-default/-/ignore-by-default-1.0.1.tgz", - "integrity": "sha512-Ius2VYcGNk7T90CppJqcIkS5ooHUZyIQK+ClZfMfMNFEF9VSE73Fq+906u/CWu92x4gzZMWOwfFYckPObzdEbA==", - "dev": true, - "license": "ISC" - }, - "node_modules/import-fresh": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.0.tgz", - "integrity": "sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==", - "dev": true, - "license": "MIT", - "dependencies": { - "parent-module": "^1.0.0", - "resolve-from": "^4.0.0" - }, - "engines": { - "node": ">=6" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/import-fresh/node_modules/resolve-from": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz", - "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=4" - } - }, - "node_modules/imurmurhash": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", - "integrity": "sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=0.8.19" - } - }, - "node_modules/indent-string": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-4.0.0.tgz", - "integrity": "sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/infer-owner": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/infer-owner/-/infer-owner-1.0.4.tgz", - "integrity": "sha512-IClj+Xz94+d7irH5qRyfJonOdfTzuDaifE6ZPWfx0N0+/ATZCbuTPq2prFl526urkQd90WyUKIh1DfBQ2hMz9A==", - "dev": true, - "license": "ISC" - }, - "node_modules/inflight": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", - "integrity": "sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==", - "deprecated": "This module is not supported, and leaks memory. Do not use it. Check out lru-cache if you want a good and tested way to coalesce async requests by a key value, which is much more comprehensive and powerful.", - "license": "ISC", - "dependencies": { - "once": "^1.3.0", - "wrappy": "1" - } - }, - "node_modules/inherits": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", - "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", - "license": "ISC" - }, - "node_modules/ini": { - "version": "1.3.8", - "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.8.tgz", - "integrity": "sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==", - "license": "ISC" - }, - "node_modules/initials": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/initials/-/initials-3.1.2.tgz", - "integrity": "sha512-Sltg35nx8+GX1w4U86rmbxFEmqFiSuMJviS6cB2KChB+jcT2/8Td+nlImXD74HkqpZF5PMv8hN57AyrA/7ltXw==", - "license": "MIT" - }, - "node_modules/inquirer": { - "version": "7.3.3", - "resolved": "https://registry.npmjs.org/inquirer/-/inquirer-7.3.3.tgz", - "integrity": "sha512-JG3eIAj5V9CwcGvuOmoo6LB9kbAYT8HXffUl6memuszlwDC/qvFAJw49XJ5NROSFNPxp3iQg1GqkFhaY/CR0IA==", - "license": "MIT", - "dependencies": { - "ansi-escapes": "^4.2.1", - "chalk": "^4.1.0", - "cli-cursor": "^3.1.0", - "cli-width": "^3.0.0", - "external-editor": "^3.0.3", - "figures": "^3.0.0", - "lodash": "^4.17.19", - "mute-stream": "0.0.8", - "run-async": "^2.4.0", - "rxjs": "^6.6.0", - "string-width": "^4.1.0", - "strip-ansi": "^6.0.0", - "through": "^2.3.6" - }, - "engines": { - "node": ">=8.0.0" - } - }, - "node_modules/inquirer/node_modules/chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", - "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/inquirer/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==", - "license": "MIT", - "dependencies": { - "has-flag": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/internal-slot": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/internal-slot/-/internal-slot-1.0.7.tgz", - "integrity": "sha512-NGnrKwXzSms2qUUih/ILZ5JBqNTSa1+ZmP6flaIp6KmSElgE9qdndzS3cqjrDovwFdmwsGsLdeFgB6suw+1e9g==", - "dev": true, - "license": "MIT", - "dependencies": { - "es-errors": "^1.3.0", - "hasown": "^2.0.0", - "side-channel": "^1.0.4" - }, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/ip-address": { - "version": "9.0.5", - "resolved": "https://registry.npmjs.org/ip-address/-/ip-address-9.0.5.tgz", - "integrity": "sha512-zHtQzGojZXTwZTHQqra+ETKd4Sn3vgi7uBmlPoXVWZqYvuKmtI0l/VZTjqGmJY9x88GGOaZ9+G9ES8hC4T4X8g==", - "license": "MIT", - "dependencies": { - "jsbn": "1.1.0", - "sprintf-js": "^1.1.3" - }, - "engines": { - "node": ">= 12" - } - }, - "node_modules/ip-address/node_modules/sprintf-js": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.1.3.tgz", - "integrity": "sha512-Oo+0REFV59/rz3gfJNKQiBlwfHaSESl1pcGyABQsnnIfWOFt6JNj5gCog2U6MLZ//IGYD+nA8nI+mTShREReaA==", - "license": "BSD-3-Clause" - }, - "node_modules/ipaddr.js": { - "version": "1.9.1", - "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.9.1.tgz", - "integrity": "sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g==", - "license": "MIT", - "engines": { - "node": ">= 0.10" - } - }, - "node_modules/is_js": { - "version": "0.9.0", - "resolved": "https://registry.npmjs.org/is_js/-/is_js-0.9.0.tgz", - "integrity": "sha512-8Y5EHSH+TonfUHX2g3pMJljdbGavg55q4jmHzghJCdqYDbdNROC8uw/YFQwIRCRqRJT1EY3pJefz+kglw+o7sg==", - "license": "MIT" - }, - "node_modules/is-accessor-descriptor": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.1.tgz", - "integrity": "sha512-YBUanLI8Yoihw923YeFUS5fs0fF2f5TSFTNiYAAzhhDscDa3lEqYuz1pDOEP5KvX94I9ey3vsqjJcLVFVU+3QA==", - "dev": true, - "license": "MIT", - "dependencies": { - "hasown": "^2.0.0" - }, - "engines": { - "node": ">= 0.10" - } - }, - "node_modules/is-array-buffer": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/is-array-buffer/-/is-array-buffer-3.0.4.tgz", - "integrity": "sha512-wcjaerHw0ydZwfhiKbXJWLDY8A7yV7KhjQOpb83hGgGfId/aQa4TOvwyzn2PuswW2gPCYEL/nEAiSVpdOj1lXw==", - "dev": true, - "license": "MIT", - "dependencies": { - "call-bind": "^1.0.2", - "get-intrinsic": "^1.2.1" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-arrayish": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz", - "integrity": "sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg==", - "dev": true, - "license": "MIT" - }, - "node_modules/is-bigint": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/is-bigint/-/is-bigint-1.0.4.tgz", - "integrity": "sha512-zB9CruMamjym81i2JZ3UMn54PKGsQzsJeo6xvN3HJJ4CAsQNB6iRutp2To77OfCNuoxspsIhzaPoO1zyCEhFOg==", - "dev": true, - "license": "MIT", - "dependencies": { - "has-bigints": "^1.0.1" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-binary-path": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz", - "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==", - "license": "MIT", - "dependencies": { - "binary-extensions": "^2.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/is-boolean-object": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/is-boolean-object/-/is-boolean-object-1.1.2.tgz", - "integrity": "sha512-gDYaKHJmnj4aWxyj6YHyXVpdQawtVLHU5cb+eztPGczf6cjuTdwve5ZIEfgXqH4e57An1D1AKf8CZ3kYrQRqYA==", - "dev": true, - "license": "MIT", - "dependencies": { - "call-bind": "^1.0.2", - "has-tostringtag": "^1.0.0" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-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-ci": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/is-ci/-/is-ci-2.0.0.tgz", - "integrity": "sha512-YfJT7rkpQB0updsdHLGWrvhBJfcfzNNawYDNIyQXJz0IViGf75O8EBPKSdvw2rF+LGCsX4FZ8tcr3b19LcZq4w==", - "dev": true, - "license": "MIT", - "dependencies": { - "ci-info": "^2.0.0" - }, - "bin": { - "is-ci": "bin.js" - } - }, - "node_modules/is-ci/node_modules/ci-info": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-2.0.0.tgz", - "integrity": "sha512-5tK7EtrZ0N+OLFMthtqOj4fI2Jeb88C4CAZPu25LDVUgXJ0A3Js4PMGqrn0JU1W0Mh1/Z8wZzYPxqUrXeBboCQ==", - "dev": true, - "license": "MIT" - }, - "node_modules/is-core-module": { - "version": "2.15.1", - "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.15.1.tgz", - "integrity": "sha512-z0vtXSwucUJtANQWldhbtbt7BnL0vxiFjIdDLAatwhDYty2bad6s+rijD6Ri4YuYJubLzIJLUidCh09e1djEVQ==", - "license": "MIT", - "dependencies": { - "hasown": "^2.0.2" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-data-descriptor": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.1.tgz", - "integrity": "sha512-bc4NlCDiCr28U4aEsQ3Qs2491gVq4V8G7MQyws968ImqjKuYtTJXrl7Vq7jsN7Ly/C3xj5KWFrY7sHNeDkAzXw==", - "dev": true, - "license": "MIT", - "dependencies": { - "hasown": "^2.0.0" - }, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/is-data-view": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/is-data-view/-/is-data-view-1.0.1.tgz", - "integrity": "sha512-AHkaJrsUVW6wq6JS8y3JnM/GJF/9cf+k20+iDzlSaJrinEo5+7vRiteOSwBhHRiAyQATN1AmY4hwzxJKPmYf+w==", - "dev": true, - "license": "MIT", - "dependencies": { - "is-typed-array": "^1.1.13" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-date-object": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/is-date-object/-/is-date-object-1.0.5.tgz", - "integrity": "sha512-9YQaSxsAiSwcvS33MBk3wTCVnWK+HhF8VZR2jRxehM16QcVOdHqPn4VPHmRK4lSr38n9JriurInLcP90xsYNfQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "has-tostringtag": "^1.0.0" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-descriptor": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.3.tgz", - "integrity": "sha512-JCNNGbwWZEVaSPtS45mdtrneRWJFp07LLmykxeFV5F6oBvNF8vHSfJuJgoT472pSfk+Mf8VnlrspaFBHWM8JAw==", - "dev": true, - "license": "MIT", - "dependencies": { - "is-accessor-descriptor": "^1.0.1", - "is-data-descriptor": "^1.0.1" - }, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/is-docker": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/is-docker/-/is-docker-2.2.1.tgz", - "integrity": "sha512-F+i2BKsFrH66iaUFc0woD8sLy8getkwTwtOBjvs56Cx4CgJDeKQeqfz8wAYiSb8JOprWhHH5p77PbmYCvvUuXQ==", - "dev": true, - "license": "MIT", - "bin": { - "is-docker": "cli.js" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/is-extendable": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-1.0.1.tgz", - "integrity": "sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==", - "dev": true, - "license": "MIT", - "dependencies": { - "is-plain-object": "^2.0.4" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/is-extglob": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", - "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==", - "license": "MIT", - "engines": { - "node": ">=0.10.0" - } - }, - "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==", - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/is-glob": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", - "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", - "license": "MIT", - "dependencies": { - "is-extglob": "^2.1.1" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/is-https": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/is-https/-/is-https-4.0.0.tgz", - "integrity": "sha512-FeMLiqf8E5g6SdiVJsPcNZX8k4h2fBs1wp5Bb6uaNxn58ufK1axBqQZdmAQsqh0t9BuwFObybrdVJh6MKyPlyg==", - "license": "MIT" - }, - "node_modules/is-negative-zero": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/is-negative-zero/-/is-negative-zero-2.0.3.tgz", - "integrity": "sha512-5KoIu2Ngpyek75jXodFvnafB6DJgr3u8uuK0LEZJjrU19DrMD3EVERaR8sjz8CCGgpZvxPl9SuE1GMVPFHx1mw==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-number": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", - "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", - "license": "MIT", - "engines": { - "node": ">=0.12.0" - } - }, - "node_modules/is-number-object": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/is-number-object/-/is-number-object-1.0.7.tgz", - "integrity": "sha512-k1U0IRzLMo7ZlYIfzRu23Oh6MiIFasgpb9X76eqfFZAqwH44UI4KTBvBYIZ1dSL9ZzChTB9ShHfLkR4pdW5krQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "has-tostringtag": "^1.0.0" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-obj": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/is-obj/-/is-obj-2.0.0.tgz", - "integrity": "sha512-drqDG3cbczxxEJRoOXcOjtdp1J/lyp1mNn0xaznRs8+muBhgQcrnbspox5X5fOw0HnMnbfDzvnEMEtqDEJEo8w==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/is-plain-obj": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-3.0.0.tgz", - "integrity": "sha512-gwsOE28k+23GP1B6vFl1oVh/WOzmawBrKwo5Ev6wMKzPkaXaCDIQKzLnvsA42DRlbVTWorkgTKIviAKCWkfUwA==", - "license": "MIT", - "engines": { - "node": ">=10" - }, - "funding": { - "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-promise": { - "version": "2.2.2", - "resolved": "https://registry.npmjs.org/is-promise/-/is-promise-2.2.2.tgz", - "integrity": "sha512-+lP4/6lKUBfQjZ2pdxThZvLUAafmZb8OAxFb8XXtiQmS35INgr85hdOGoEs124ez1FCnZJt6jau/T+alh58QFQ==", - "license": "MIT" - }, - "node_modules/is-regex": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.1.4.tgz", - "integrity": "sha512-kvRdxDsxZjhzUX07ZnLydzS1TU/TJlTUHHY4YLL87e37oUA49DfkLqgy+VjFocowy29cKvcSiu+kIv728jTTVg==", - "dev": true, - "license": "MIT", - "dependencies": { - "call-bind": "^1.0.2", - "has-tostringtag": "^1.0.0" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-retry-allowed": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/is-retry-allowed/-/is-retry-allowed-2.2.0.tgz", - "integrity": "sha512-XVm7LOeLpTW4jV19QSH38vkswxoLud8sQ57YwJVTPWdiaI9I8keEhGFpBlslyVsgdQy4Opg8QOLb8YRgsyZiQg==", - "license": "MIT", - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/is-shared-array-buffer": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/is-shared-array-buffer/-/is-shared-array-buffer-1.0.3.tgz", - "integrity": "sha512-nA2hv5XIhLR3uVzDDfCIknerhx8XUKnstuOERPNNIinXG7v9u+ohXF67vxm4TPTEPU6lm61ZkwP3c9PCB97rhg==", - "dev": true, - "license": "MIT", - "dependencies": { - "call-bind": "^1.0.7" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-ssh": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/is-ssh/-/is-ssh-1.4.0.tgz", - "integrity": "sha512-x7+VxdxOdlV3CYpjvRLBv5Lo9OJerlYanjwFrPR9fuGPjCiNiCzFgAWpiLAohSbsnH4ZAys3SBh+hq5rJosxUQ==", - "license": "MIT", - "dependencies": { - "protocols": "^2.0.1" - } - }, - "node_modules/is-stream": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-2.0.1.tgz", - "integrity": "sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==", - "license": "MIT", - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/is-string": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/is-string/-/is-string-1.0.7.tgz", - "integrity": "sha512-tE2UXzivje6ofPW7l23cjDOMa09gb7xlAqG6jG5ej6uPV32TlWP3NKPigtaGeHNu9fohccRYvIiZMfOOnOYUtg==", - "dev": true, - "license": "MIT", - "dependencies": { - "has-tostringtag": "^1.0.0" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-symbol": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/is-symbol/-/is-symbol-1.0.4.tgz", - "integrity": "sha512-C/CPBqKWnvdcxqIARxyOh4v1UUEOCHpgDa0WYgpKDFMszcrPcffg5uhwSgPCLD2WWxmq6isisz87tzT01tuGhg==", - "dev": true, - "license": "MIT", - "dependencies": { - "has-symbols": "^1.0.2" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-text-path": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/is-text-path/-/is-text-path-1.0.1.tgz", - "integrity": "sha512-xFuJpne9oFz5qDaodwmmG08e3CawH/2ZV8Qqza1Ko7Sk8POWbkRdwIoAWVhqvq0XeUzANEhKo2n0IXUGBm7A/w==", - "dev": true, - "license": "MIT", - "dependencies": { - "text-extensions": "^1.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/is-typed-array": { - "version": "1.1.13", - "resolved": "https://registry.npmjs.org/is-typed-array/-/is-typed-array-1.1.13.tgz", - "integrity": "sha512-uZ25/bUAlUY5fR4OKT4rZQEBrzQWYV9ZJYGGsUmEJ6thodVJ1HX64ePQ6Z0qPWP+m+Uq6e9UugrE38jeYsDSMw==", - "dev": true, - "license": "MIT", - "dependencies": { - "which-typed-array": "^1.1.14" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-typedarray": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz", - "integrity": "sha512-cyA56iCMHAh5CdzjJIa4aohJyeO1YbwLi3Jc35MmRU6poroFjIGZzUzupGiRPOjgHg9TLu43xbpwXk523fMxKA==", - "dev": true, - "license": "MIT" - }, - "node_modules/is-unicode-supported": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/is-unicode-supported/-/is-unicode-supported-0.1.0.tgz", - "integrity": "sha512-knxG2q4UC3u8stRGyAVJCOdxFmv5DZiRcdlIaAQXAbSfJya+OhopNotLQrstBhququ4ZpuKbDc/8S6mgXgPFPw==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/is-weakref": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/is-weakref/-/is-weakref-1.0.2.tgz", - "integrity": "sha512-qctsuLZmIQ0+vSSMfoVvyFe2+GSEvnmZ2ezTup1SBse9+twCCeial6EEi3Nc2KFcf6+qz2FBPnjXsk8xhKSaPQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "call-bind": "^1.0.2" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-windows": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/is-windows/-/is-windows-1.0.2.tgz", - "integrity": "sha512-eXK1UInq2bPmjyX6e3VHIzMLobc4J94i4AWn+Hpq3OU5KkrRC96OAcR3PRJ/pGu6m8TRnBHP9dkXQVsT/COVIA==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/is-wsl": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/is-wsl/-/is-wsl-2.2.0.tgz", - "integrity": "sha512-fKzAra0rGJUUBwGBgNkHZuToZcn+TtXHpeCgmkMJMMYx1sQDYaCSyjJBSCa2nH1DGm7s3n1oBnohoVTBaN7Lww==", - "dev": true, - "license": "MIT", - "dependencies": { - "is-docker": "^2.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/isarray": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", - "integrity": "sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==", - "license": "MIT" - }, - "node_modules/isexe": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", - "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==", - "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/istanbul-lib-coverage": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/istanbul-lib-coverage/-/istanbul-lib-coverage-3.2.2.tgz", - "integrity": "sha512-O8dpsF+r0WV/8MNRKfnmrtCWhuKjxrq2w+jpzBL5UZKTi2LeVWnWOmWRxFlesJONmc+wLAGvKQZEOanko0LFTg==", - "dev": true, - "license": "BSD-3-Clause", - "engines": { - "node": ">=8" - } - }, - "node_modules/istanbul-lib-hook": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/istanbul-lib-hook/-/istanbul-lib-hook-3.0.0.tgz", - "integrity": "sha512-Pt/uge1Q9s+5VAZ+pCo16TYMWPBIl+oaNIjgLQxcX0itS6ueeaA+pEfThZpH8WxhFgCiEb8sAJY6MdUKgiIWaQ==", - "dev": true, - "license": "BSD-3-Clause", - "dependencies": { - "append-transform": "^2.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/istanbul-lib-instrument": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/istanbul-lib-instrument/-/istanbul-lib-instrument-4.0.3.tgz", - "integrity": "sha512-BXgQl9kf4WTCPCCpmFGoJkz/+uhvm7h7PFKUYxh7qarQd3ER33vHG//qaE8eN25l07YqZPpHXU9I09l/RD5aGQ==", - "dev": true, - "license": "BSD-3-Clause", - "dependencies": { - "@babel/core": "^7.7.5", - "@istanbuljs/schema": "^0.1.2", - "istanbul-lib-coverage": "^3.0.0", - "semver": "^6.3.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/istanbul-lib-instrument/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/istanbul-lib-processinfo": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/istanbul-lib-processinfo/-/istanbul-lib-processinfo-2.0.3.tgz", - "integrity": "sha512-NkwHbo3E00oybX6NGJi6ar0B29vxyvNwoC7eJ4G4Yq28UfY758Hgn/heV8VRFhevPED4LXfFz0DQ8z/0kw9zMg==", - "dev": true, - "license": "ISC", - "dependencies": { - "archy": "^1.0.0", - "cross-spawn": "^7.0.3", - "istanbul-lib-coverage": "^3.2.0", - "p-map": "^3.0.0", - "rimraf": "^3.0.0", - "uuid": "^8.3.2" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/istanbul-lib-report": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/istanbul-lib-report/-/istanbul-lib-report-3.0.1.tgz", - "integrity": "sha512-GCfE1mtsHGOELCU8e/Z7YWzpmybrx/+dSTfLrvY8qRmaY6zXTKWn6WQIjaAFw069icm6GVMNkgu0NzI4iPZUNw==", - "dev": true, - "license": "BSD-3-Clause", - "dependencies": { - "istanbul-lib-coverage": "^3.0.0", - "make-dir": "^4.0.0", - "supports-color": "^7.1.0" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/istanbul-lib-report/node_modules/make-dir": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-4.0.0.tgz", - "integrity": "sha512-hXdUTZYIVOt1Ex//jAQi+wTZZpUpwBj/0QsOzqegb3rGMMeJiSEu5xLHnYfBrRV4RH2+OCSOO95Is/7x1WJ4bw==", - "dev": true, - "license": "MIT", - "dependencies": { - "semver": "^7.5.3" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/istanbul-lib-report/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/istanbul-lib-source-maps": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/istanbul-lib-source-maps/-/istanbul-lib-source-maps-4.0.1.tgz", - "integrity": "sha512-n3s8EwkdFIJCG3BPKBYvskgXGoy88ARzvegkitk60NxRdwltLOTaH7CUiMRXvwYorl0Q712iEjcWB+fK/MrWVw==", - "dev": true, - "license": "BSD-3-Clause", - "dependencies": { - "debug": "^4.1.1", - "istanbul-lib-coverage": "^3.0.0", - "source-map": "^0.6.1" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/istanbul-reports": { - "version": "3.1.7", - "resolved": "https://registry.npmjs.org/istanbul-reports/-/istanbul-reports-3.1.7.tgz", - "integrity": "sha512-BewmUXImeuRk2YY0PVbxgKAysvhRPUQE0h5QRM++nVWyubKGV0l8qQ5op8+B2DOmwSe63Jivj0BjkPQVf8fP5g==", - "dev": true, - "license": "BSD-3-Clause", - "dependencies": { - "html-escaper": "^2.0.0", - "istanbul-lib-report": "^3.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "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==", - "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-worker": { - "version": "26.6.2", - "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-26.6.2.tgz", - "integrity": "sha512-KWYVV1c4i+jbMpaBC+U++4Va0cp8OisU185o73T1vo99hqi7w8tSJfUXYswwqqrjzwxa6KpRK54WhPvwf5w6PQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "@types/node": "*", - "merge-stream": "^2.0.0", - "supports-color": "^7.0.0" - }, - "engines": { - "node": ">= 10.13.0" - } - }, - "node_modules/jest-worker/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/jiti": { - "version": "1.21.6", - "resolved": "https://registry.npmjs.org/jiti/-/jiti-1.21.6.tgz", - "integrity": "sha512-2yTgeWTWzMWkHu6Jp9NKgePDaYHbntiwvYuuJLbbN9vl7DC9DvXKOB2BC3ZZ92D3cvV/aflH0osDfwpHepQ53w==", - "license": "MIT", - "bin": { - "jiti": "bin/jiti.js" - } - }, - "node_modules/joi": { - "version": "17.13.3", - "resolved": "https://registry.npmjs.org/joi/-/joi-17.13.3.tgz", - "integrity": "sha512-otDA4ldcIx+ZXsKHWmp0YizCweVRZG96J10b0FevjfuncLO1oX59THoAmHkNubYJ+9gWsYsp5k8v4ib6oDv1fA==", - "license": "BSD-3-Clause", - "dependencies": { - "@hapi/hoek": "^9.3.0", - "@hapi/topo": "^5.1.0", - "@sideway/address": "^4.1.5", - "@sideway/formula": "^3.0.1", - "@sideway/pinpoint": "^2.0.0" - } - }, - "node_modules/joi/node_modules/@hapi/hoek": { - "version": "9.3.0", - "resolved": "https://registry.npmjs.org/@hapi/hoek/-/hoek-9.3.0.tgz", - "integrity": "sha512-/c6rf4UJlmHlC9b5BaNvzAcFv7HZ2QHaV0D4/HNlBdvFnvQq8RI4kYdhyPCl7Xj+oWvTWQ8ujhqS53LIgAe6KQ==", - "license": "BSD-3-Clause" - }, - "node_modules/jose": { - "version": "4.15.9", - "resolved": "https://registry.npmjs.org/jose/-/jose-4.15.9.tgz", - "integrity": "sha512-1vUQX+IdDMVPj4k8kOxgUqlcK518yluMuGZwqlr44FS1ppZB/5GWh4rZG89erpOBOJjU/OBsnCVFfapsRz6nEA==", - "license": "MIT", - "funding": { - "url": "https://github.com/sponsors/panva" - } - }, - "node_modules/js-beautify": { - "version": "1.15.1", - "resolved": "https://registry.npmjs.org/js-beautify/-/js-beautify-1.15.1.tgz", - "integrity": "sha512-ESjNzSlt/sWE8sciZH8kBF8BPlwXPwhR6pWKAw8bw4Bwj+iZcnKW6ONWUutJ7eObuBZQpiIb8S7OYspWrKt7rA==", - "license": "MIT", - "dependencies": { - "config-chain": "^1.1.13", - "editorconfig": "^1.0.4", - "glob": "^10.3.3", - "js-cookie": "^3.0.5", - "nopt": "^7.2.0" - }, - "bin": { - "css-beautify": "js/bin/css-beautify.js", - "html-beautify": "js/bin/html-beautify.js", - "js-beautify": "js/bin/js-beautify.js" - }, - "engines": { - "node": ">=14" - } - }, - "node_modules/js-beautify/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==", - "license": "MIT", - "dependencies": { - "balanced-match": "^1.0.0" - } - }, - "node_modules/js-beautify/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==", - "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/js-beautify/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==", - "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/js-beautify/node_modules/minimatch": { - "version": "9.0.5", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.5.tgz", - "integrity": "sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==", - "license": "ISC", - "dependencies": { - "brace-expansion": "^2.0.1" - }, - "engines": { - "node": ">=16 || 14 >=14.17" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/js-beautify/node_modules/minipass": { - "version": "7.1.2", - "resolved": "https://registry.npmjs.org/minipass/-/minipass-7.1.2.tgz", - "integrity": "sha512-qOOzS1cBTWYF4BH8fVePDBOO9iptMnGUEZwNc/cMWnTV2nVLZ7VoNWEPHkYczZA0pdoA7dl6e7FL659nX9S2aw==", - "license": "ISC", - "engines": { - "node": ">=16 || 14 >=14.17" - } - }, - "node_modules/js-cookie": { - "version": "3.0.5", - "resolved": "https://registry.npmjs.org/js-cookie/-/js-cookie-3.0.5.tgz", - "integrity": "sha512-cEiJEAEoIbWfCZYKWhVwFuvPX1gETRYPw6LlaTKoxD3s2AkXzkCjnp6h0V77ozyqj0jakteJ4YqDJT830+lVGw==", - "license": "MIT", - "engines": { - "node": ">=14" - } - }, - "node_modules/js-tokens": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", - "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==", - "license": "MIT" - }, - "node_modules/js-yaml": { - "version": "3.14.1", - "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.1.tgz", - "integrity": "sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==", - "license": "MIT", - "dependencies": { - "argparse": "^1.0.7", - "esprima": "^4.0.0" - }, - "bin": { - "js-yaml": "bin/js-yaml.js" - } - }, - "node_modules/jsbn": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/jsbn/-/jsbn-1.1.0.tgz", - "integrity": "sha512-4bYVV3aAMtDTTu4+xsDYa6sy9GyJ69/amsu9sYF2zqjiEoZA5xJi3BrfX3uY+/IekIu7MwdObdbDWpoZdBv3/A==", - "license": "MIT" - }, - "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==", - "license": "MIT", - "bin": { - "jsesc": "bin/jsesc" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/json-buffer": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/json-buffer/-/json-buffer-3.0.1.tgz", - "integrity": "sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==", - "dev": true, - "license": "MIT" - }, - "node_modules/json-parse-better-errors": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/json-parse-better-errors/-/json-parse-better-errors-1.0.2.tgz", - "integrity": "sha512-mrqyZKfX5EhL7hvqcV6WG1yYjnjeuYDzDhhcAAUrq8Po85NBQBJP+ZDUT75qZQ98IkUoBqdkExkukOU7Ts2wrw==", - "dev": true, - "license": "MIT" - }, - "node_modules/json-parse-even-better-errors": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz", - "integrity": "sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==", - "dev": true, - "license": "MIT" - }, - "node_modules/json-schema-ref-resolver": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/json-schema-ref-resolver/-/json-schema-ref-resolver-1.0.1.tgz", - "integrity": "sha512-EJAj1pgHc1hxF6vo2Z3s69fMjO1INq6eGHXZ8Z6wCQeldCuwxGK9Sxf4/cScGn3FZubCVUehfWtcDM/PLteCQw==", - "license": "MIT", - "dependencies": { - "fast-deep-equal": "^3.1.3" - } - }, - "node_modules/json-schema-to-typescript": { - "version": "11.0.5", - "resolved": "https://registry.npmjs.org/json-schema-to-typescript/-/json-schema-to-typescript-11.0.5.tgz", - "integrity": "sha512-ZNlvngzlPzjYYECbR+uJ9aUWo25Gw/VuwUytvcuKiwc6NaiZhMyf7qBsxZE2eixmj8AoQEQJhSRG7btln0sUDw==", - "license": "MIT", - "dependencies": { - "@bcherny/json-schema-ref-parser": "10.0.5-fork", - "@types/json-schema": "^7.0.11", - "@types/lodash": "^4.14.182", - "@types/prettier": "^2.6.1", - "cli-color": "^2.0.2", - "get-stdin": "^8.0.0", - "glob": "^7.1.6", - "glob-promise": "^4.2.2", - "is-glob": "^4.0.3", - "lodash": "^4.17.21", - "minimist": "^1.2.6", - "mkdirp": "^1.0.4", - "mz": "^2.7.0", - "prettier": "^2.6.2" - }, - "bin": { - "json2ts": "dist/src/cli.js" - }, - "engines": { - "node": ">=12.0.0" - } - }, - "node_modules/json-schema-traverse": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", - "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==", - "license": "MIT" - }, - "node_modules/json-stable-stringify-without-jsonify": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz", - "integrity": "sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==", - "dev": true, - "license": "MIT" - }, - "node_modules/json-web-key": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/json-web-key/-/json-web-key-0.3.0.tgz", - "integrity": "sha512-H6Fa0vWf9o4JnHMPA1HNgBHIteJxVfamdtM0O81fnyaqSb/nwSV8fRt4z4PKUYr5oZDNQshVS1cJbNMO4/MqCw==", - "license": "MIT", - "dependencies": { - "asn1.js": "~4.6.2" - } - }, - "node_modules/json5": { - "version": "2.2.3", - "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.3.tgz", - "integrity": "sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==", - "license": "MIT", - "bin": { - "json5": "lib/cli.js" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/jsonfile": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-4.0.0.tgz", - "integrity": "sha512-m6F1R3z8jjlf2imQHS2Qez5sjKWQzbuuhuJ/FKYFRZvPE3PuHcSMVZzfsLhGVOkfd20obL5SWEBew5ShlquNxg==", - "license": "MIT", - "optionalDependencies": { - "graceful-fs": "^4.1.6" - } - }, - "node_modules/jsonparse": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/jsonparse/-/jsonparse-1.3.1.tgz", - "integrity": "sha512-POQXvpdL69+CluYsillJ7SUhKvytYjW9vG/GKpnf+xP8UWgYEM/RaMzHHofbALDiKbbP1W8UEYmgGl39WkPZsg==", - "dev": true, - "engines": [ - "node >= 0.2.0" - ], - "license": "MIT" - }, - "node_modules/JSONStream": { - "version": "1.3.5", - "resolved": "https://registry.npmjs.org/JSONStream/-/JSONStream-1.3.5.tgz", - "integrity": "sha512-E+iruNOY8VV9s4JEbe1aNEm6MiszPRr/UfcHMz0TQh1BXSxHK+ASV1R6W4HpjBhSeS+54PIsAMCBmwD06LLsqQ==", - "dev": true, - "license": "(MIT OR Apache-2.0)", - "dependencies": { - "jsonparse": "^1.2.0", - "through": ">=2.2.7 <3" - }, - "bin": { - "JSONStream": "bin.js" - }, - "engines": { - "node": "*" - } - }, - "node_modules/jsonwebtoken": { - "version": "9.0.2", - "resolved": "https://registry.npmjs.org/jsonwebtoken/-/jsonwebtoken-9.0.2.tgz", - "integrity": "sha512-PRp66vJ865SSqOlgqS8hujT5U4AOgMfhrwYIuIhfKaoSCZcirrmASQr8CX7cUg+RMih+hgznrjp99o+W4pJLHQ==", - "license": "MIT", - "dependencies": { - "jws": "^3.2.2", - "lodash.includes": "^4.3.0", - "lodash.isboolean": "^3.0.3", - "lodash.isinteger": "^4.0.4", - "lodash.isnumber": "^3.0.3", - "lodash.isplainobject": "^4.0.6", - "lodash.isstring": "^4.0.1", - "lodash.once": "^4.0.0", - "ms": "^2.1.1", - "semver": "^7.5.4" - }, - "engines": { - "node": ">=12", - "npm": ">=6" - } - }, - "node_modules/juice": { - "version": "10.0.1", - "resolved": "https://registry.npmjs.org/juice/-/juice-10.0.1.tgz", - "integrity": "sha512-ZhJT1soxJCkOiO55/mz8yeBKTAJhRzX9WBO+16ZTqNTONnnVlUPyVBIzQ7lDRjaBdTbid+bAnyIon/GM3yp4cA==", - "license": "MIT", - "dependencies": { - "cheerio": "1.0.0-rc.12", - "commander": "^6.1.0", - "mensch": "^0.3.4", - "slick": "^1.12.2", - "web-resource-inliner": "^6.0.1" - }, - "bin": { - "juice": "bin/juice" - }, - "engines": { - "node": ">=10.0.0" - } - }, - "node_modules/juice/node_modules/commander": { - "version": "6.2.1", - "resolved": "https://registry.npmjs.org/commander/-/commander-6.2.1.tgz", - "integrity": "sha512-U7VdrJFnJgo4xjrHpTzu0yrHPGImdsmD95ZlgYSEajAn2JKzDhDTPG9kBTefmObL2w/ngeZnilk+OV9CG3d7UA==", - "license": "MIT", - "engines": { - "node": ">= 6" - } - }, - "node_modules/jwa": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/jwa/-/jwa-1.4.1.tgz", - "integrity": "sha512-qiLX/xhEEFKUAJ6FiBMbes3w9ATzyk5W7Hvzpa/SLYdxNtng+gcurvrI7TbACjIXlsJyr05/S1oUhZrc63evQA==", - "license": "MIT", - "dependencies": { - "buffer-equal-constant-time": "1.0.1", - "ecdsa-sig-formatter": "1.0.11", - "safe-buffer": "^5.0.1" - } - }, - "node_modules/jwks-rsa": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/jwks-rsa/-/jwks-rsa-3.1.0.tgz", - "integrity": "sha512-v7nqlfezb9YfHHzYII3ef2a2j1XnGeSE/bK3WfumaYCqONAIstJbrEGapz4kadScZzEt7zYCN7bucj8C0Mv/Rg==", - "license": "MIT", - "dependencies": { - "@types/express": "^4.17.17", - "@types/jsonwebtoken": "^9.0.2", - "debug": "^4.3.4", - "jose": "^4.14.6", - "limiter": "^1.1.5", - "lru-memoizer": "^2.2.0" - }, - "engines": { - "node": ">=14" - } - }, - "node_modules/jws": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/jws/-/jws-3.2.2.tgz", - "integrity": "sha512-YHlZCB6lMTllWDtSPHz/ZXTsi8S00usEV6v1tjq8tOUZzw7DpSDWVXjXDre6ed1w/pd495ODpHZYSdkRTsa0HA==", - "license": "MIT", - "dependencies": { - "jwa": "^1.4.1", - "safe-buffer": "^5.0.1" - } - }, - "node_modules/jwt-decode": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/jwt-decode/-/jwt-decode-4.0.0.tgz", - "integrity": "sha512-+KJGIyHgkGuIq3IEBNftfhW/LfWhXUIY6OmyVWjliu5KH1y0fw7VQ8YndE2O4qZdMSd9SqbnC8GOcZEy0Om7sA==", - "devOptional": true, - "license": "MIT", - "engines": { - "node": ">=18" - } - }, - "node_modules/keygrip": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/keygrip/-/keygrip-1.0.3.tgz", - "integrity": "sha512-/PpesirAIfaklxUzp4Yb7xBper9MwP6hNRA6BGGUFCgbJ+BM5CKBtsoxinNXkLHAr+GXS1/lSlF2rP7cv5Fl+g==", - "license": "MIT", - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/keyv": { - "version": "4.5.4", - "resolved": "https://registry.npmjs.org/keyv/-/keyv-4.5.4.tgz", - "integrity": "sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw==", - "dev": true, - "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==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/klaw-sync": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/klaw-sync/-/klaw-sync-6.0.0.tgz", - "integrity": "sha512-nIeuVSzdCCs6TDPTqI8w1Yre34sSq7AkZ4B3sfOBbI2CgVSB4Du4aLQijFU2+lhAFCwt9+42Hel6lQNIv6AntQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "graceful-fs": "^4.1.11" - } - }, - "node_modules/klona": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/klona/-/klona-2.0.6.tgz", - "integrity": "sha512-dhG34DXATL5hSxJbIexCft8FChFXtmskoZYnoPWjXQuebWYCNkVeV3KkGegCK9CP1oswI/vQibS2GY7Em/sJJA==", - "license": "MIT", - "engines": { - "node": ">= 8" - } - }, - "node_modules/last-call-webpack-plugin": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/last-call-webpack-plugin/-/last-call-webpack-plugin-3.0.0.tgz", - "integrity": "sha512-7KI2l2GIZa9p2spzPIVZBYyNKkN+e/SQPpnjlTiPhdbDW3F86tdKKELxKpzJ5sgU19wQWsACULZmpTPYHeWO5w==", - "dev": true, - "license": "MIT", - "dependencies": { - "lodash": "^4.17.5", - "webpack-sources": "^1.1.0" - } - }, - "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==", - "license": "MIT", - "dependencies": { - "picocolors": "^1.0.0", - "shell-quote": "^1.8.1" - } - }, - "node_modules/launch-editor-middleware": { - "version": "2.9.1", - "resolved": "https://registry.npmjs.org/launch-editor-middleware/-/launch-editor-middleware-2.9.1.tgz", - "integrity": "sha512-4wF6AtPtaIENiZdH/a+3yW8Xni7uxzTEDd1z+gH00hUWBCSmQknFohznMd9BWhLk8MXObeB5ir69GbIr9qFW1w==", - "license": "MIT", - "dependencies": { - "launch-editor": "^2.9.1" - } - }, - "node_modules/ldap-filter": { - "version": "0.3.3", - "resolved": "https://registry.npmjs.org/ldap-filter/-/ldap-filter-0.3.3.tgz", - "integrity": "sha512-/tFkx5WIn4HuO+6w9lsfxq4FN3O+fDZeO9Mek8dCD8rTUpqzRa766BOBO7BcGkn3X86m5+cBm1/2S/Shzz7gMg==", - "license": "MIT", - "dependencies": { - "assert-plus": "^1.0.0" - }, - "engines": { - "node": ">=0.8" - } - }, - "node_modules/ldapjs": { - "version": "2.3.3", - "resolved": "https://registry.npmjs.org/ldapjs/-/ldapjs-2.3.3.tgz", - "integrity": "sha512-75QiiLJV/PQqtpH+HGls44dXweviFwQ6SiIK27EqzKQ5jU/7UFrl2E5nLdQ3IYRBzJ/AVFJI66u0MZ0uofKYwg==", - "deprecated": "This package has been decomissioned. See https://github.com/ldapjs/node-ldapjs/blob/8ffd0bc9c149088a10ec4c1ec6a18450f76ad05d/README.md", - "license": "MIT", - "dependencies": { - "abstract-logging": "^2.0.0", - "asn1": "^0.2.4", - "assert-plus": "^1.0.0", - "backoff": "^2.5.0", - "ldap-filter": "^0.3.3", - "once": "^1.4.0", - "vasync": "^2.2.0", - "verror": "^1.8.1" - }, - "engines": { - "node": ">=10.13.0" - } - }, - "node_modules/levn": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/levn/-/levn-0.4.1.tgz", - "integrity": "sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "prelude-ls": "^1.2.1", - "type-check": "~0.4.0" - }, - "engines": { - "node": ">= 0.8.0" - } - }, - "node_modules/lilconfig": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/lilconfig/-/lilconfig-3.1.2.tgz", - "integrity": "sha512-eop+wDAvpItUys0FWkHIKeC9ybYrTGbU41U5K7+bttZZeohvnY7M9dZ5kB21GNWiFT2q1OoPTvncPCgSOVO5ow==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=14" - }, - "funding": { - "url": "https://github.com/sponsors/antonk52" - } - }, - "node_modules/limiter": { - "version": "1.1.5", - "resolved": "https://registry.npmjs.org/limiter/-/limiter-1.1.5.tgz", - "integrity": "sha512-FWWMIEOxz3GwUI4Ts/IvgVy6LPvoMPgjMdQ185nN6psJyBJ4yOpzqm695/h5umdLJg2vW3GR5iG11MAkR2AzJA==" - }, - "node_modules/lines-and-columns": { - "version": "1.2.4", - "resolved": "https://registry.npmjs.org/lines-and-columns/-/lines-and-columns-1.2.4.tgz", - "integrity": "sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==", - "dev": true, - "license": "MIT" - }, - "node_modules/linkify-it": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/linkify-it/-/linkify-it-3.0.3.tgz", - "integrity": "sha512-ynTsyrFSdE5oZ/O9GEf00kPngmOfVwazR5GKDq6EYfhlpFug3J2zybX56a2PRRpc9P+FuSoGNAwjlbDs9jJBPQ==", - "dev": true, - "license": "MIT", - "optional": true, - "dependencies": { - "uc.micro": "^1.0.1" - } - }, - "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==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=6.11.5" - } - }, - "node_modules/loader-utils": { - "version": "1.4.2", - "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-1.4.2.tgz", - "integrity": "sha512-I5d00Pd/jwMD2QCduo657+YM/6L3KZu++pmX9VFncxaxvHcru9jx1lBaFft+r4Mt2jK0Yhp41XlRAihzPxHNCg==", - "dev": true, - "license": "MIT", - "dependencies": { - "big.js": "^5.2.2", - "emojis-list": "^3.0.0", - "json5": "^1.0.1" - }, - "engines": { - "node": ">=4.0.0" - } - }, - "node_modules/loader-utils/node_modules/json5": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/json5/-/json5-1.0.2.tgz", - "integrity": "sha512-g1MWMLBiz8FKi1e4w0UyVL3w+iJceWAFBAaBnnGKOpNa5f8TLktkbre1+s6oICydWAm+HRUGTmI+//xv2hvXYA==", - "dev": true, - "license": "MIT", - "dependencies": { - "minimist": "^1.2.0" - }, - "bin": { - "json5": "lib/cli.js" - } - }, - "node_modules/locate-path": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz", - "integrity": "sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==", - "dev": true, - "license": "MIT", - "dependencies": { - "p-locate": "^5.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/lodash": { - "version": "4.17.21", - "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz", - "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==", - "license": "MIT" - }, - "node_modules/lodash._reinterpolate": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/lodash._reinterpolate/-/lodash._reinterpolate-3.0.0.tgz", - "integrity": "sha512-xYHt68QRoYGjeeM/XOE1uJtvXQAgvszfBhjV4yvsQH0u2i9I6cI6c6/eG4Hh3UAOVn0y/xAXwmTzEay49Q//HA==", - "license": "MIT" - }, - "node_modules/lodash.camelcase": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/lodash.camelcase/-/lodash.camelcase-4.3.0.tgz", - "integrity": "sha512-TwuEnCnxbc3rAvhf/LbG7tJUDzhqXyFnv3dtzLOPgCG/hODL7WFnsbwktkD7yUV0RrreP/l1PALq/YSg6VvjlA==", - "dev": true, - "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.flattendeep": { - "version": "4.4.0", - "resolved": "https://registry.npmjs.org/lodash.flattendeep/-/lodash.flattendeep-4.4.0.tgz", - "integrity": "sha512-uHaJFihxmJcEX3kT4I23ABqKKalJ/zDrDg0lsFtc1h+3uw49SIJ5beyhx5ExVRti3AvKoOJngIj7xz3oylPdWQ==", - "dev": true, - "license": "MIT" - }, - "node_modules/lodash.includes": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/lodash.includes/-/lodash.includes-4.3.0.tgz", - "integrity": "sha512-W3Bx6mdkRTGtlJISOvVD/lbqjTlPPUDTMnlXZFnVwi9NKJ6tiAk6LVdlhZMm17VZisqhKcgzpO5Wz91PCt5b0w==", - "license": "MIT" - }, - "node_modules/lodash.isboolean": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/lodash.isboolean/-/lodash.isboolean-3.0.3.tgz", - "integrity": "sha512-Bz5mupy2SVbPHURB98VAcw+aHh4vRV5IPNhILUCsOzRmsTmSQ17jIuqopAentWoehktxGd9e/hbIXq980/1QJg==", - "license": "MIT" - }, - "node_modules/lodash.isfunction": { - "version": "3.0.9", - "resolved": "https://registry.npmjs.org/lodash.isfunction/-/lodash.isfunction-3.0.9.tgz", - "integrity": "sha512-AirXNj15uRIMMPihnkInB4i3NHeb4iBtNg9WRWuK2o31S+ePwwNmDPaTL3o7dTJ+VXNZim7rFs4rxN4YU1oUJw==", - "dev": true, - "license": "MIT" - }, - "node_modules/lodash.isinteger": { - "version": "4.0.4", - "resolved": "https://registry.npmjs.org/lodash.isinteger/-/lodash.isinteger-4.0.4.tgz", - "integrity": "sha512-DBwtEWN2caHQ9/imiNeEA5ys1JoRtRfY3d7V9wkqtbycnAmTvRRmbHKDV4a0EYc678/dia0jrte4tjYwVBaZUA==", - "license": "MIT" - }, - "node_modules/lodash.isnumber": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/lodash.isnumber/-/lodash.isnumber-3.0.3.tgz", - "integrity": "sha512-QYqzpfwO3/CWf3XP+Z+tkQsfaLL/EnUlXWVkIk5FUPc4sBdTehEqZONuyRt2P67PXAk+NXmTBcc97zw9t1FQrw==", - "license": "MIT" - }, - "node_modules/lodash.isplainobject": { - "version": "4.0.6", - "resolved": "https://registry.npmjs.org/lodash.isplainobject/-/lodash.isplainobject-4.0.6.tgz", - "integrity": "sha512-oSXzaWypCMHkPC3NvBEaPHf0KsA5mvPrOPgQWDsbg8n7orZ290M0BmC/jgRZ4vcJ6DTAhjrsSYgdsW/F+MFOBA==", - "license": "MIT" - }, - "node_modules/lodash.isstring": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/lodash.isstring/-/lodash.isstring-4.0.1.tgz", - "integrity": "sha512-0wJxfxH1wgO3GrbuP+dTTk7op+6L41QCXbGINEmD+ny/G/eCqGzxyCsh7159S+mgDDcoarnBw6PC1PS5+wUGgw==", - "license": "MIT" - }, - "node_modules/lodash.kebabcase": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/lodash.kebabcase/-/lodash.kebabcase-4.1.1.tgz", - "integrity": "sha512-N8XRTIMMqqDgSy4VLKPnJ/+hpGZN+PHQiJnSenYqPaVV/NCqEogTnAdZLQiGKhxX+JCs8waWq2t1XHWKOmlY8g==", - "dev": true, - "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, - "license": "MIT" - }, - "node_modules/lodash.merge": { - "version": "4.6.2", - "resolved": "https://registry.npmjs.org/lodash.merge/-/lodash.merge-4.6.2.tgz", - "integrity": "sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==", - "license": "MIT" - }, - "node_modules/lodash.mergewith": { - "version": "4.6.2", - "resolved": "https://registry.npmjs.org/lodash.mergewith/-/lodash.mergewith-4.6.2.tgz", - "integrity": "sha512-GK3g5RPZWTRSeLSpgP8Xhra+pnjBC56q9FZYe1d5RN3TJ35dbkGy3YqBSMbyCrlbi+CM9Z3Jk5yTL7RCsqboyQ==", - "dev": true, - "license": "MIT" - }, - "node_modules/lodash.once": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/lodash.once/-/lodash.once-4.1.1.tgz", - "integrity": "sha512-Sb487aTOCr9drQVL8pIxOzVhafOjZN9UU54hiN8PU3uAiSV7lx1yYNpbNmex2PK6dSJoNTSJUUswT651yww3Mg==", - "license": "MIT" - }, - "node_modules/lodash.snakecase": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/lodash.snakecase/-/lodash.snakecase-4.1.1.tgz", - "integrity": "sha512-QZ1d4xoBHYUeuouhEq3lk3Uq7ldgyFXGBhg04+oRLnIz8o9T65Eh+8YdroUwn846zchkA9yDsDl5CVVaV2nqYw==", - "dev": true, - "license": "MIT" - }, - "node_modules/lodash.startcase": { - "version": "4.4.0", - "resolved": "https://registry.npmjs.org/lodash.startcase/-/lodash.startcase-4.4.0.tgz", - "integrity": "sha512-+WKqsK294HMSc2jEbNgpHpd0JfIBhp7rEV4aqXWqFr6AlXov+SlcgB1Fv01y2kGe3Gc8nMW7VA0SrGuSkRfIEg==", - "dev": true, - "license": "MIT" - }, - "node_modules/lodash.template": { - "version": "4.5.0", - "resolved": "https://registry.npmjs.org/lodash.template/-/lodash.template-4.5.0.tgz", - "integrity": "sha512-84vYFxIkmidUiFxidA/KjjH9pAycqW+h980j7Fuz5qxRtO9pgB7MDFTdys1N7A5mcucRiDyEq4fusljItR1T/A==", - "license": "MIT", - "dependencies": { - "lodash._reinterpolate": "^3.0.0", - "lodash.templatesettings": "^4.0.0" - } - }, - "node_modules/lodash.templatesettings": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/lodash.templatesettings/-/lodash.templatesettings-4.2.0.tgz", - "integrity": "sha512-stgLz+i3Aa9mZgnjr/O+v9ruKZsPsndy7qPZOchbqk2cnTU1ZaldKK+v7m54WoKIyxiuMZTKT2H81F8BeAc3ZQ==", - "license": "MIT", - "dependencies": { - "lodash._reinterpolate": "^3.0.0" - } - }, - "node_modules/lodash.truncate": { - "version": "4.4.2", - "resolved": "https://registry.npmjs.org/lodash.truncate/-/lodash.truncate-4.4.2.tgz", - "integrity": "sha512-jttmRe7bRse52OsWIMDLaXxWqRAmtIUccAQ3garviCqJjafXOfNMO0yMfNpdD6zbGaTU0P5Nz7e7gAT6cKmJRw==", - "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==", - "license": "MIT" - }, - "node_modules/lodash.upperfirst": { - "version": "4.3.1", - "resolved": "https://registry.npmjs.org/lodash.upperfirst/-/lodash.upperfirst-4.3.1.tgz", - "integrity": "sha512-sReKOYJIJf74dhJONhU4e0/shzi1trVbSWDOhKYE5XV2O+H7Sb2Dihwuc7xWxVl+DgFPyTqIN3zMfT9cq5iWDg==", - "dev": true, - "license": "MIT" - }, - "node_modules/log-symbols": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/log-symbols/-/log-symbols-4.1.0.tgz", - "integrity": "sha512-8XPvpAA8uyhfteu8pIvQxpJZ7SYYdpUivZpGy6sFsBuKRY/7rQGavedeB8aK+Zkyq6upMFVL/9AW6vOYzfRyLg==", - "dev": true, - "license": "MIT", - "dependencies": { - "chalk": "^4.1.0", - "is-unicode-supported": "^0.1.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/log-symbols/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/log-symbols/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/lower-case": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/lower-case/-/lower-case-1.1.4.tgz", - "integrity": "sha512-2Fgx1Ycm599x+WGpIYwJOvsjmXFzTSc34IwDWALRA/8AopUKAVPwfJ+h5+f85BCp0PWmmJcWzEpxOpoXycMpdA==", - "license": "MIT" - }, - "node_modules/lowercase-keys": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/lowercase-keys/-/lowercase-keys-2.0.0.tgz", - "integrity": "sha512-tqNXrS78oMOE73NMxK4EMLQsQowWf8jKooH9g7xPavRT706R6bkQJ6DY2Te7QukaZsulxa30wQ7bk0pm4XiHmA==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/lru-cache": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", - "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", - "license": "ISC", - "dependencies": { - "yallist": "^4.0.0" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/lru-memoizer": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/lru-memoizer/-/lru-memoizer-2.3.0.tgz", - "integrity": "sha512-GXn7gyHAMhO13WSKrIiNfztwxodVsP8IoZ3XfrJV4yH2x0/OeTO/FIaAHTY5YekdGgW94njfuKmyyt1E0mR6Ug==", - "license": "MIT", - "dependencies": { - "lodash.clonedeep": "^4.5.0", - "lru-cache": "6.0.0" - } - }, - "node_modules/lru-queue": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/lru-queue/-/lru-queue-0.1.0.tgz", - "integrity": "sha512-BpdYkt9EvGl8OfWHDQPISVpcl5xZthb+XPsbELj5AQXxIC8IriDZIQYjBJPEm5rS420sjZ0TLEzRcq5KdBhYrQ==", - "license": "MIT", - "dependencies": { - "es5-ext": "~0.10.2" - } - }, - "node_modules/make-dir": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-3.1.0.tgz", - "integrity": "sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw==", - "dev": true, - "license": "MIT", - "dependencies": { - "semver": "^6.0.0" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "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==", - "dev": true, - "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", - "integrity": "sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw==", - "dev": true, - "license": "ISC" - }, - "node_modules/map-cache": { - "version": "0.2.2", - "resolved": "https://registry.npmjs.org/map-cache/-/map-cache-0.2.2.tgz", - "integrity": "sha512-8y/eV9QQZCiyn1SprXSrCmqJN0yNRATe+PO8ztwqrvrbdRLA3eYJF0yaR0YayLWkMbsQSKWS9N2gPcGEc4UsZg==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/map-obj": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/map-obj/-/map-obj-4.3.0.tgz", - "integrity": "sha512-hdN1wVrZbb29eBGiGjJbeP8JbKjq1urkHJ/LIP/NY48MZ1QVXUsQBV1G1zvYFHn1XE06cwjBsOI2K3Ulnj1YXQ==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/map-visit": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/map-visit/-/map-visit-1.0.0.tgz", - "integrity": "sha512-4y7uGv8bd2WdM9vpQsiQNo41Ln1NvhvDRuVt0k2JZQ+ezN2uaQes7lZeZ+QQUHOLQAtDaBJ+7wCbi+ab/KFs+w==", - "dev": true, - "license": "MIT", - "dependencies": { - "object-visit": "^1.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/markdown-it": { - "version": "12.3.2", - "resolved": "https://registry.npmjs.org/markdown-it/-/markdown-it-12.3.2.tgz", - "integrity": "sha512-TchMembfxfNVpHkbtriWltGWc+m3xszaRD0CZup7GFFhzIgQqxIfn3eGj1yZpfuflzPvfkt611B2Q/Bsk1YnGg==", - "dev": true, - "license": "MIT", - "optional": true, - "dependencies": { - "argparse": "^2.0.1", - "entities": "~2.1.0", - "linkify-it": "^3.0.1", - "mdurl": "^1.0.1", - "uc.micro": "^1.0.5" - }, - "bin": { - "markdown-it": "bin/markdown-it.js" - } - }, - "node_modules/markdown-it/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", - "optional": true - }, - "node_modules/markdown-table": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/markdown-table/-/markdown-table-2.0.0.tgz", - "integrity": "sha512-Ezda85ToJUBhM6WGaG6veasyym+Tbs3cMAw/ZhOPqXiYsr0jgocBV3j3nx+4lk47plLlIqjwuTm/ywVI+zjJ/A==", - "dev": true, - "license": "MIT", - "dependencies": { - "repeat-string": "^1.0.0" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/wooorm" - } - }, - "node_modules/match-all": { - "version": "1.2.6", - "resolved": "https://registry.npmjs.org/match-all/-/match-all-1.2.6.tgz", - "integrity": "sha512-0EESkXiTkWzrQQntBu2uzKvLu6vVkUGz40nGPbSZuegcfE5UuSzNjLaIu76zJWuaT/2I3Z/8M06OlUOZLGwLlQ==", - "dev": true, - "license": "MIT" - }, - "node_modules/material-colors": { - "version": "1.2.6", - "resolved": "https://registry.npmjs.org/material-colors/-/material-colors-1.2.6.tgz", - "integrity": "sha512-6qE4B9deFBIa9YSpOc9O0Sgc43zTeVYbgDT5veRKSlB2+ZuHNoVVxA1L/ckMUayV9Ay9y7Z/SZCLcGteW9i7bg==", - "license": "ISC" - }, - "node_modules/md5.js": { - "version": "1.3.5", - "resolved": "https://registry.npmjs.org/md5.js/-/md5.js-1.3.5.tgz", - "integrity": "sha512-xitP+WxNPcTTOgnTJcrhM0xvdPepipPSf3I8EIpGKeFLjt3PlJLIDG3u8EX53ZIubkb+5U2+3rELYpEhHhzdkg==", - "dev": true, - "license": "MIT", - "dependencies": { - "hash-base": "^3.0.0", - "inherits": "^2.0.1", - "safe-buffer": "^5.1.2" - } - }, - "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/mdurl": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/mdurl/-/mdurl-1.0.1.tgz", - "integrity": "sha512-/sKlQJCBYVY9Ers9hqzKou4H6V5UWc/M59TH2dvkt+84itfnq7uFOMLpOiOS4ujvHP4etln18fmIxA5R5fll0g==", - "dev": true, - "license": "MIT" - }, - "node_modules/media-typer": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz", - "integrity": "sha512-dq+qelQ9akHpcOl/gUVRTxVIOkAJ1wR3QAvb4RsVjS8oVoFjDGTc679wJYmUmknUF5HwMLOgb5O+a3KxfWapPQ==", - "license": "MIT", - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/memfs": { - "version": "4.14.0", - "resolved": "https://registry.npmjs.org/memfs/-/memfs-4.14.0.tgz", - "integrity": "sha512-JUeY0F/fQZgIod31Ja1eJgiSxLn7BfQlCnqhwXFBzFHEw63OdLK7VJUJ7bnzNsWgCyoUP5tEp1VRY8rDaYzqOA==", - "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/memoizee": { - "version": "0.4.17", - "resolved": "https://registry.npmjs.org/memoizee/-/memoizee-0.4.17.tgz", - "integrity": "sha512-DGqD7Hjpi/1or4F/aYAspXKNm5Yili0QDAFAY4QYvpqpgiY6+1jOfqpmByzjxbWd/T9mChbCArXAbDAsTm5oXA==", - "license": "ISC", - "dependencies": { - "d": "^1.0.2", - "es5-ext": "^0.10.64", - "es6-weak-map": "^2.0.3", - "event-emitter": "^0.3.5", - "is-promise": "^2.2.2", - "lru-queue": "^0.1.0", - "next-tick": "^1.1.0", - "timers-ext": "^0.1.7" - }, - "engines": { - "node": ">=0.12" - } - }, - "node_modules/memory-fs": { - "version": "0.5.0", - "resolved": "https://registry.npmjs.org/memory-fs/-/memory-fs-0.5.0.tgz", - "integrity": "sha512-jA0rdU5KoQMC0e6ppoNRtpp6vjFq6+NY7r8hywnC7V+1Xj/MtHwGIbB1QaK/dunyjWteJzmkpd7ooeWg10T7GA==", - "dev": true, - "license": "MIT", - "dependencies": { - "errno": "^0.1.3", - "readable-stream": "^2.0.1" - }, - "engines": { - "node": ">=4.3.0 <5.0.0 || >=5.10" - } - }, - "node_modules/memory-pager": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/memory-pager/-/memory-pager-1.5.0.tgz", - "integrity": "sha512-ZS4Bp4r/Zoeq6+NLJpP+0Zzm0pR8whtGPf1XExKLJBAczGMnSi3It14OiNCStjQjM6NU1okjQGSxgEZN8eBYKg==", - "license": "MIT", - "optional": true - }, - "node_modules/mensch": { - "version": "0.3.4", - "resolved": "https://registry.npmjs.org/mensch/-/mensch-0.3.4.tgz", - "integrity": "sha512-IAeFvcOnV9V0Yk+bFhYR07O3yNina9ANIN5MoXBKYJ/RLYPurd2d0yw14MDhpr9/momp0WofT1bPUh3hkzdi/g==", - "license": "MIT" - }, - "node_modules/meow": { - "version": "8.1.2", - "resolved": "https://registry.npmjs.org/meow/-/meow-8.1.2.tgz", - "integrity": "sha512-r85E3NdZ+mpYk1C6RjPFEMSE+s1iZMuHtsHAqY0DT3jZczl0diWUZ8g6oU7h0M9cD2EL+PzaYghhCLzR0ZNn5Q==", - "dev": true, - "license": "MIT", - "dependencies": { - "@types/minimist": "^1.2.0", - "camelcase-keys": "^6.2.2", - "decamelize-keys": "^1.1.0", - "hard-rejection": "^2.1.0", - "minimist-options": "4.1.0", - "normalize-package-data": "^3.0.0", - "read-pkg-up": "^7.0.1", - "redent": "^3.0.0", - "trim-newlines": "^3.0.0", - "type-fest": "^0.18.0", - "yargs-parser": "^20.2.3" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/meow/node_modules/type-fest": { - "version": "0.18.1", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.18.1.tgz", - "integrity": "sha512-OIAYXk8+ISY+qTOwkHtKqzAuxchoMiD9Udx+FSGQDuiRR+PJKJHc2NJAXlbhkGwTt/4/nKZxELY1w3ReWOL8mw==", - "dev": true, - "license": "(MIT OR CC0-1.0)", - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/merge-descriptors": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-1.0.3.tgz", - "integrity": "sha512-gaNvAS7TZ897/rVaZ0nMtAyxNyi/pdbjbAwUpFQpN70GqnVfOiXpeUUMKRBmzXaSQ8DdTX4/0ms62r2K+hE6mQ==", - "license": "MIT", - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/merge-source-map": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/merge-source-map/-/merge-source-map-1.1.0.tgz", - "integrity": "sha512-Qkcp7P2ygktpMPh2mCQZaf3jhN6D3Z/qVZHSdWvQ+2Ef5HgRAPBO57A77+ENm0CPx2+1Ce/MYKi3ymqdfuqibw==", - "dev": true, - "license": "MIT", - "dependencies": { - "source-map": "^0.6.1" - } - }, - "node_modules/merge-stream": { - "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" - }, - "node_modules/merge2": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz", - "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==", - "license": "MIT", - "engines": { - "node": ">= 8" - } - }, - "node_modules/methods": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/methods/-/methods-1.1.2.tgz", - "integrity": "sha512-iclAHeNqNm68zFtnZ0e+1L2yUIdvzNoauKU4WBA3VvH/vPFieF7qfRlwUZU+DA9P9bPXIS90ulxoUoCH23sV2w==", - "license": "MIT", - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/micromatch": { - "version": "4.0.8", - "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.8.tgz", - "integrity": "sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA==", - "license": "MIT", - "dependencies": { - "braces": "^3.0.3", - "picomatch": "^2.3.1" - }, - "engines": { - "node": ">=8.6" - } - }, - "node_modules/miller-rabin": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/miller-rabin/-/miller-rabin-4.0.1.tgz", - "integrity": "sha512-115fLhvZVqWwHPbClyntxEVfVDfl9DLLTuJvq3g2O/Oxi8AiNouAHvDSzHS0viUJc+V5vm3eq91Xwqn9dp4jRA==", - "dev": true, - "license": "MIT", - "dependencies": { - "bn.js": "^4.0.0", - "brorand": "^1.0.1" - }, - "bin": { - "miller-rabin": "bin/miller-rabin" - } - }, - "node_modules/mime": { - "version": "2.5.2", - "resolved": "https://registry.npmjs.org/mime/-/mime-2.5.2.tgz", - "integrity": "sha512-tqkh47FzKeCPD2PUiPB6pkbMzsCasjxAfC62/Wap5qrUWcb+sFasXUC5I3gYM5iBM8v/Qpn4UK0x+j0iHyFPDg==", - "license": "MIT", - "bin": { - "mime": "cli.js" - }, - "engines": { - "node": ">=4.0.0" - } - }, - "node_modules/mime-db": { - "version": "1.52.0", - "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", - "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==", - "license": "MIT", - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/mime-types": { - "version": "2.1.35", - "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz", - "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", - "license": "MIT", - "dependencies": { - "mime-db": "1.52.0" - }, - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/mimic-fn": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz", - "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==", - "license": "MIT", - "engines": { - "node": ">=6" - } - }, - "node_modules/mimic-response": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/mimic-response/-/mimic-response-1.0.1.tgz", - "integrity": "sha512-j5EctnkH7amfV/q5Hgmoal1g2QHFJRraOtmx0JpIqkxhBhI/lJSl1nMpQ45hVarwNETOoWEimndZ4QK0RHxuxQ==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=4" - } - }, - "node_modules/min-indent": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/min-indent/-/min-indent-1.0.1.tgz", - "integrity": "sha512-I9jwMn07Sy/IwOj3zVkVik2JTvgpaykDZEigL6Rx6N9LbMywwUSMtxET+7lVoDLLd3O3IXwJwvuuns8UB/HeAg==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=4" - } - }, - "node_modules/minimalistic-assert": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/minimalistic-assert/-/minimalistic-assert-1.0.1.tgz", - "integrity": "sha512-UtJcAD4yEaGtjPezWuO9wC4nwUnVH/8/Im3yEHQP4b67cXlD/Qr9hdITCU1xDbSEXg2XKNaP8jsReV7vQd00/A==", - "license": "ISC" - }, - "node_modules/minimalistic-crypto-utils": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/minimalistic-crypto-utils/-/minimalistic-crypto-utils-1.0.1.tgz", - "integrity": "sha512-JIYlbt6g8i5jKfJ3xz7rF0LXmv2TkDxBLUkiBeZ7bAx4GnnNMr8xFpGnOxn6GhTEHx3SjRrZEoU+j04prX1ktg==", - "dev": true, - "license": "MIT" - }, - "node_modules/minimatch": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", - "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", - "license": "ISC", - "dependencies": { - "brace-expansion": "^1.1.7" - }, - "engines": { - "node": "*" - } - }, - "node_modules/minimist": { - "version": "1.2.8", - "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.8.tgz", - "integrity": "sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==", - "license": "MIT", - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/minimist-options": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/minimist-options/-/minimist-options-4.1.0.tgz", - "integrity": "sha512-Q4r8ghd80yhO/0j1O3B2BjweX3fiHg9cdOwjJd2J76Q135c+NDxGCqdYKQ1SKBuFfgWbAUzBfvYjPUEeNgqN1A==", - "dev": true, - "license": "MIT", - "dependencies": { - "arrify": "^1.0.1", - "is-plain-obj": "^1.1.0", - "kind-of": "^6.0.3" - }, - "engines": { - "node": ">= 6" - } - }, - "node_modules/minimist-options/node_modules/is-plain-obj": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-1.1.0.tgz", - "integrity": "sha512-yvkRyxmFKEOQ4pNXCmJG5AEQNlXJS5LaONXo5/cLdTZdWvsZ1ioJEonLGAosKlMWE8lwUy/bJzMjcw8az73+Fg==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/minipass": { - "version": "3.3.6", - "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.3.6.tgz", - "integrity": "sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw==", - "dev": true, - "license": "ISC", - "dependencies": { - "yallist": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/minipass-collect": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/minipass-collect/-/minipass-collect-1.0.2.tgz", - "integrity": "sha512-6T6lH0H8OG9kITm/Jm6tdooIbogG9e0tLgpY6mphXSm/A9u8Nq1ryBG+Qspiub9LjWlBPsPS3tWQ/Botq4FdxA==", - "dev": true, - "license": "ISC", - "dependencies": { - "minipass": "^3.0.0" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/minipass-flush": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/minipass-flush/-/minipass-flush-1.0.5.tgz", - "integrity": "sha512-JmQSYYpPUqX5Jyn1mXaRwOda1uQ8HP5KAT/oDSLCzt1BYRhQU0/hDtsB1ufZfEEzMZ9aAVmsBw8+FWsIXlClWw==", - "dev": true, - "license": "ISC", - "dependencies": { - "minipass": "^3.0.0" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/minipass-pipeline": { - "version": "1.2.4", - "resolved": "https://registry.npmjs.org/minipass-pipeline/-/minipass-pipeline-1.2.4.tgz", - "integrity": "sha512-xuIq7cIOt09RPRJ19gdi4b+RiNvDFYe5JH+ggNvBqGqpQXcru3PcRmOZuHBKWK1Txf9+cQ+HMVN4d6z46LZP7A==", - "dev": true, - "license": "ISC", - "dependencies": { - "minipass": "^3.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/minizlib": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/minizlib/-/minizlib-2.1.2.tgz", - "integrity": "sha512-bAxsR8BVfj60DWXHE3u30oHzfl4G7khkSuPW+qvpd7jFRHm7dLxOjUk1EHACJ/hxLY8phGJ0YhYHZo7jil7Qdg==", - "dev": true, - "license": "MIT", - "dependencies": { - "minipass": "^3.0.0", - "yallist": "^4.0.0" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/mississippi": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/mississippi/-/mississippi-3.0.0.tgz", - "integrity": "sha512-x471SsVjUtBRtcvd4BzKE9kFC+/2TeWgKCgw0bZcw1b9l2X3QX5vCWgF+KaZaYm87Ss//rHnWryupDrgLvmSkA==", - "dev": true, - "license": "BSD-2-Clause", - "dependencies": { - "concat-stream": "^1.5.0", - "duplexify": "^3.4.2", - "end-of-stream": "^1.1.0", - "flush-write-stream": "^1.0.0", - "from2": "^2.1.0", - "parallel-transform": "^1.1.0", - "pump": "^3.0.0", - "pumpify": "^1.3.3", - "stream-each": "^1.1.0", - "through2": "^2.0.0" - }, - "engines": { - "node": ">=4.0.0" - } - }, - "node_modules/mississippi/node_modules/through2": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/through2/-/through2-2.0.5.tgz", - "integrity": "sha512-/mrRod8xqpA+IHSLyGCQ2s8SPHiCDEeQJSep1jqLYeEUClOFG2Qsh+4FU6G9VeqpZnGW/Su8LQGc4YKni5rYSQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "readable-stream": "~2.3.6", - "xtend": "~4.0.1" - } - }, - "node_modules/mixin-deep": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/mixin-deep/-/mixin-deep-1.3.2.tgz", - "integrity": "sha512-WRoDn//mXBiJ1H40rqa3vH0toePwSsGb45iInWlTySa+Uu4k3tYUSxa2v1KqAiLtvlrSzaExqS1gtk96A9zvEA==", - "dev": true, - "license": "MIT", - "dependencies": { - "for-in": "^1.0.2", - "is-extendable": "^1.0.1" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/mjml": { - "version": "4.15.3", - "resolved": "https://registry.npmjs.org/mjml/-/mjml-4.15.3.tgz", - "integrity": "sha512-bW2WpJxm6HS+S3Yu6tq1DUPFoTxU9sPviUSmnL7Ua+oVO3WA5ILFWqvujUlz+oeuM+HCwEyMiP5xvKNPENVjYA==", - "license": "MIT", - "dependencies": { - "@babel/runtime": "^7.23.9", - "mjml-cli": "4.15.3", - "mjml-core": "4.15.3", - "mjml-migrate": "4.15.3", - "mjml-preset-core": "4.15.3", - "mjml-validator": "4.15.3" - }, - "bin": { - "mjml": "bin/mjml" - } - }, - "node_modules/mjml-accordion": { - "version": "4.15.3", - "resolved": "https://registry.npmjs.org/mjml-accordion/-/mjml-accordion-4.15.3.tgz", - "integrity": "sha512-LPNVSj1LyUVYT9G1gWwSw3GSuDzDsQCu0tPB2uDsq4VesYNnU6v3iLCQidMiR6azmIt13OEozG700ygAUuA6Ng==", - "license": "MIT", - "dependencies": { - "@babel/runtime": "^7.23.9", - "lodash": "^4.17.21", - "mjml-core": "4.15.3" - } - }, - "node_modules/mjml-body": { - "version": "4.15.3", - "resolved": "https://registry.npmjs.org/mjml-body/-/mjml-body-4.15.3.tgz", - "integrity": "sha512-7pfUOVPtmb0wC+oUOn4xBsAw4eT5DyD6xqaxj/kssu6RrFXOXgJaVnDPAI9AzIvXJ/5as9QrqRGYAddehwWpHQ==", - "license": "MIT", - "dependencies": { - "@babel/runtime": "^7.23.9", - "lodash": "^4.17.21", - "mjml-core": "4.15.3" - } - }, - "node_modules/mjml-button": { - "version": "4.15.3", - "resolved": "https://registry.npmjs.org/mjml-button/-/mjml-button-4.15.3.tgz", - "integrity": "sha512-79qwn9AgdGjJR1vLnrcm2rq2AsAZkKC5JPwffTMG+Nja6zGYpTDZFZ56ekHWr/r1b5WxkukcPj2PdevUug8c+Q==", - "license": "MIT", - "dependencies": { - "@babel/runtime": "^7.23.9", - "lodash": "^4.17.21", - "mjml-core": "4.15.3" - } - }, - "node_modules/mjml-carousel": { - "version": "4.15.3", - "resolved": "https://registry.npmjs.org/mjml-carousel/-/mjml-carousel-4.15.3.tgz", - "integrity": "sha512-3ju6I4l7uUhPRrJfN3yK9AMsfHvrYbRkcJ1GRphFHzUj37B2J6qJOQUpzA547Y4aeh69TSb7HFVf1t12ejQxVw==", - "license": "MIT", - "dependencies": { - "@babel/runtime": "^7.23.9", - "lodash": "^4.17.21", - "mjml-core": "4.15.3" - } - }, - "node_modules/mjml-cli": { - "version": "4.15.3", - "resolved": "https://registry.npmjs.org/mjml-cli/-/mjml-cli-4.15.3.tgz", - "integrity": "sha512-+V2TDw3tXUVEptFvLSerz125C2ogYl8klIBRY1m5BHd4JvGVf3yhx8N3PngByCzA6PGcv/eydGQN+wy34SHf0Q==", - "license": "MIT", - "dependencies": { - "@babel/runtime": "^7.23.9", - "chokidar": "^3.0.0", - "glob": "^10.3.10", - "html-minifier": "^4.0.0", - "js-beautify": "^1.6.14", - "lodash": "^4.17.21", - "minimatch": "^9.0.3", - "mjml-core": "4.15.3", - "mjml-migrate": "4.15.3", - "mjml-parser-xml": "4.15.3", - "mjml-validator": "4.15.3", - "yargs": "^17.7.2" - }, - "bin": { - "mjml-cli": "bin/mjml" - } - }, - "node_modules/mjml-cli/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==", - "license": "MIT", - "dependencies": { - "balanced-match": "^1.0.0" - } - }, - "node_modules/mjml-cli/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==", - "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/mjml-cli/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==", - "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/mjml-cli/node_modules/minimatch": { - "version": "9.0.5", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.5.tgz", - "integrity": "sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==", - "license": "ISC", - "dependencies": { - "brace-expansion": "^2.0.1" - }, - "engines": { - "node": ">=16 || 14 >=14.17" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/mjml-cli/node_modules/minipass": { - "version": "7.1.2", - "resolved": "https://registry.npmjs.org/minipass/-/minipass-7.1.2.tgz", - "integrity": "sha512-qOOzS1cBTWYF4BH8fVePDBOO9iptMnGUEZwNc/cMWnTV2nVLZ7VoNWEPHkYczZA0pdoA7dl6e7FL659nX9S2aw==", - "license": "ISC", - "engines": { - "node": ">=16 || 14 >=14.17" - } - }, - "node_modules/mjml-column": { - "version": "4.15.3", - "resolved": "https://registry.npmjs.org/mjml-column/-/mjml-column-4.15.3.tgz", - "integrity": "sha512-hYdEFdJGHPbZJSEysykrevEbB07yhJGSwfDZEYDSbhQQFjV2tXrEgYcFD5EneMaowjb55e3divSJxU4c5q4Qgw==", - "license": "MIT", - "dependencies": { - "@babel/runtime": "^7.23.9", - "lodash": "^4.17.21", - "mjml-core": "4.15.3" - } - }, - "node_modules/mjml-core": { - "version": "4.15.3", - "resolved": "https://registry.npmjs.org/mjml-core/-/mjml-core-4.15.3.tgz", - "integrity": "sha512-Dmwk+2cgSD9L9GmTbEUNd8QxkTZtW9P7FN/ROZW/fGZD6Hq6/4TB0zEspg2Ow9eYjZXO2ofOJ3PaQEEShKV0kQ==", - "license": "MIT", - "dependencies": { - "@babel/runtime": "^7.23.9", - "cheerio": "1.0.0-rc.12", - "detect-node": "^2.0.4", - "html-minifier": "^4.0.0", - "js-beautify": "^1.6.14", - "juice": "^10.0.0", - "lodash": "^4.17.21", - "mjml-migrate": "4.15.3", - "mjml-parser-xml": "4.15.3", - "mjml-validator": "4.15.3" - } - }, - "node_modules/mjml-divider": { - "version": "4.15.3", - "resolved": "https://registry.npmjs.org/mjml-divider/-/mjml-divider-4.15.3.tgz", - "integrity": "sha512-vh27LQ9FG/01y0b9ntfqm+GT5AjJnDSDY9hilss2ixIUh0FemvfGRfsGVeV5UBVPBKK7Ffhvfqc7Rciob9Spzw==", - "license": "MIT", - "dependencies": { - "@babel/runtime": "^7.23.9", - "lodash": "^4.17.21", - "mjml-core": "4.15.3" - } - }, - "node_modules/mjml-group": { - "version": "4.15.3", - "resolved": "https://registry.npmjs.org/mjml-group/-/mjml-group-4.15.3.tgz", - "integrity": "sha512-HSu/rKnGZVKFq3ciT46vi1EOy+9mkB0HewO4+P6dP/Y0UerWkN6S3UK11Cxsj0cAp0vFwkPDCdOeEzRdpFEkzA==", - "license": "MIT", - "dependencies": { - "@babel/runtime": "^7.23.9", - "lodash": "^4.17.21", - "mjml-core": "4.15.3" - } - }, - "node_modules/mjml-head": { - "version": "4.15.3", - "resolved": "https://registry.npmjs.org/mjml-head/-/mjml-head-4.15.3.tgz", - "integrity": "sha512-o3mRuuP/MB5fZycjD3KH/uXsnaPl7Oo8GtdbJTKtH1+O/3pz8GzGMkscTKa97l03DAG2EhGrzzLcU2A6eshwFw==", - "license": "MIT", - "dependencies": { - "@babel/runtime": "^7.23.9", - "lodash": "^4.17.21", - "mjml-core": "4.15.3" - } - }, - "node_modules/mjml-head-attributes": { - "version": "4.15.3", - "resolved": "https://registry.npmjs.org/mjml-head-attributes/-/mjml-head-attributes-4.15.3.tgz", - "integrity": "sha512-2ISo0r5ZKwkrvJgDou9xVPxxtXMaETe2AsAA02L89LnbB2KC0N5myNsHV0sEysTw9+CfCmgjAb0GAI5QGpxKkQ==", - "license": "MIT", - "dependencies": { - "@babel/runtime": "^7.23.9", - "lodash": "^4.17.21", - "mjml-core": "4.15.3" - } - }, - "node_modules/mjml-head-breakpoint": { - "version": "4.15.3", - "resolved": "https://registry.npmjs.org/mjml-head-breakpoint/-/mjml-head-breakpoint-4.15.3.tgz", - "integrity": "sha512-Eo56FA5C2v6ucmWQL/JBJ2z641pLOom4k0wP6CMZI2utfyiJ+e2Uuinj1KTrgDcEvW4EtU9HrfAqLK9UosLZlg==", - "license": "MIT", - "dependencies": { - "@babel/runtime": "^7.23.9", - "lodash": "^4.17.21", - "mjml-core": "4.15.3" - } - }, - "node_modules/mjml-head-font": { - "version": "4.15.3", - "resolved": "https://registry.npmjs.org/mjml-head-font/-/mjml-head-font-4.15.3.tgz", - "integrity": "sha512-CzV2aDPpiNIIgGPHNcBhgyedKY4SX3BJoTwOobSwZVIlEA6TAWB4Z9WwFUmQqZOgo1AkkiTHPZQvGcEhFFXH6g==", - "license": "MIT", - "dependencies": { - "@babel/runtime": "^7.23.9", - "lodash": "^4.17.21", - "mjml-core": "4.15.3" - } - }, - "node_modules/mjml-head-html-attributes": { - "version": "4.15.3", - "resolved": "https://registry.npmjs.org/mjml-head-html-attributes/-/mjml-head-html-attributes-4.15.3.tgz", - "integrity": "sha512-MDNDPMBOgXUZYdxhosyrA2kudiGO8aogT0/cODyi2Ed9o/1S7W+je11JUYskQbncqhWKGxNyaP4VWa+6+vUC/g==", - "license": "MIT", - "dependencies": { - "@babel/runtime": "^7.23.9", - "lodash": "^4.17.21", - "mjml-core": "4.15.3" - } - }, - "node_modules/mjml-head-preview": { - "version": "4.15.3", - "resolved": "https://registry.npmjs.org/mjml-head-preview/-/mjml-head-preview-4.15.3.tgz", - "integrity": "sha512-J2PxCefUVeFwsAExhrKo4lwxDevc5aKj888HBl/wN4EuWOoOg06iOGCxz4Omd8dqyFsrqvbBuPqRzQ+VycGmaA==", - "license": "MIT", - "dependencies": { - "@babel/runtime": "^7.23.9", - "lodash": "^4.17.21", - "mjml-core": "4.15.3" - } - }, - "node_modules/mjml-head-style": { - "version": "4.15.3", - "resolved": "https://registry.npmjs.org/mjml-head-style/-/mjml-head-style-4.15.3.tgz", - "integrity": "sha512-9J+JuH+mKrQU65CaJ4KZegACUgNIlYmWQYx3VOBR/tyz+8kDYX7xBhKJCjQ1I4wj2Tvga3bykd89Oc2kFZ5WOw==", - "license": "MIT", - "dependencies": { - "@babel/runtime": "^7.23.9", - "lodash": "^4.17.21", - "mjml-core": "4.15.3" - } - }, - "node_modules/mjml-head-title": { - "version": "4.15.3", - "resolved": "https://registry.npmjs.org/mjml-head-title/-/mjml-head-title-4.15.3.tgz", - "integrity": "sha512-IM59xRtsxID4DubQ0iLmoCGXguEe+9BFG4z6y2xQDrscIa4QY3KlfqgKGT69ojW+AVbXXJPEVqrAi4/eCsLItQ==", - "license": "MIT", - "dependencies": { - "@babel/runtime": "^7.23.9", - "lodash": "^4.17.21", - "mjml-core": "4.15.3" - } - }, - "node_modules/mjml-hero": { - "version": "4.15.3", - "resolved": "https://registry.npmjs.org/mjml-hero/-/mjml-hero-4.15.3.tgz", - "integrity": "sha512-9cLAPuc69yiuzNrMZIN58j+HMK1UWPaq2i3/Fg2ZpimfcGFKRcPGCbEVh0v+Pb6/J0+kf8yIO0leH20opu3AyQ==", - "license": "MIT", - "dependencies": { - "@babel/runtime": "^7.23.9", - "lodash": "^4.17.21", - "mjml-core": "4.15.3" - } - }, - "node_modules/mjml-image": { - "version": "4.15.3", - "resolved": "https://registry.npmjs.org/mjml-image/-/mjml-image-4.15.3.tgz", - "integrity": "sha512-g1OhSdofIytE9qaOGdTPmRIp7JsCtgO0zbsn1Fk6wQh2gEL55Z40j/VoghslWAWTgT2OHFdBKnMvWtN6U5+d2Q==", - "license": "MIT", - "dependencies": { - "@babel/runtime": "^7.23.9", - "lodash": "^4.17.21", - "mjml-core": "4.15.3" - } - }, - "node_modules/mjml-migrate": { - "version": "4.15.3", - "resolved": "https://registry.npmjs.org/mjml-migrate/-/mjml-migrate-4.15.3.tgz", - "integrity": "sha512-sr/+35RdxZroNQVegjpfRHJ5hda9XCgaS4mK2FGO+Mb1IUevKfeEPII3F/cHDpNwFeYH3kAgyqQ22ClhGLWNBA==", - "license": "MIT", - "dependencies": { - "@babel/runtime": "^7.23.9", - "js-beautify": "^1.6.14", - "lodash": "^4.17.21", - "mjml-core": "4.15.3", - "mjml-parser-xml": "4.15.3", - "yargs": "^17.7.2" - }, - "bin": { - "migrate": "lib/cli.js" - } - }, - "node_modules/mjml-navbar": { - "version": "4.15.3", - "resolved": "https://registry.npmjs.org/mjml-navbar/-/mjml-navbar-4.15.3.tgz", - "integrity": "sha512-VsKH/Jdlf8Yu3y7GpzQV5n7JMdpqvZvTSpF6UQXL0PWOm7k6+LX+sCZimOfpHJ+wCaaybpxokjWZ71mxOoCWoA==", - "license": "MIT", - "dependencies": { - "@babel/runtime": "^7.23.9", - "lodash": "^4.17.21", - "mjml-core": "4.15.3" - } - }, - "node_modules/mjml-parser-xml": { - "version": "4.15.3", - "resolved": "https://registry.npmjs.org/mjml-parser-xml/-/mjml-parser-xml-4.15.3.tgz", - "integrity": "sha512-Tz0UX8/JVYICLjT+U8J1f/TFxIYVYjzZHeh4/Oyta0pLpRLeZlxEd71f3u3kdnulCKMP4i37pFRDmyLXAlEuLw==", - "license": "MIT", - "dependencies": { - "@babel/runtime": "^7.23.9", - "detect-node": "2.1.0", - "htmlparser2": "^9.1.0", - "lodash": "^4.17.15" - } - }, - "node_modules/mjml-parser-xml/node_modules/entities": { - "version": "4.5.0", - "resolved": "https://registry.npmjs.org/entities/-/entities-4.5.0.tgz", - "integrity": "sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw==", - "license": "BSD-2-Clause", - "engines": { - "node": ">=0.12" - }, - "funding": { - "url": "https://github.com/fb55/entities?sponsor=1" - } - }, - "node_modules/mjml-parser-xml/node_modules/htmlparser2": { - "version": "9.1.0", - "resolved": "https://registry.npmjs.org/htmlparser2/-/htmlparser2-9.1.0.tgz", - "integrity": "sha512-5zfg6mHUoaer/97TxnGpxmbR7zJtPwIYFMZ/H5ucTlPZhKvtum05yiPK3Mgai3a0DyVxv7qYqoweaEd2nrYQzQ==", - "funding": [ - "https://github.com/fb55/htmlparser2?sponsor=1", - { - "type": "github", - "url": "https://github.com/sponsors/fb55" - } - ], - "license": "MIT", - "dependencies": { - "domelementtype": "^2.3.0", - "domhandler": "^5.0.3", - "domutils": "^3.1.0", - "entities": "^4.5.0" - } - }, - "node_modules/mjml-preset-core": { - "version": "4.15.3", - "resolved": "https://registry.npmjs.org/mjml-preset-core/-/mjml-preset-core-4.15.3.tgz", - "integrity": "sha512-1zZS8P4O0KweWUqNS655+oNnVMPQ1Rq1GaZq5S9JfwT1Vh/m516lSmiTW9oko6gGHytt5s6Yj6oOeu5Zm8FoLw==", - "license": "MIT", - "dependencies": { - "@babel/runtime": "^7.23.9", - "mjml-accordion": "4.15.3", - "mjml-body": "4.15.3", - "mjml-button": "4.15.3", - "mjml-carousel": "4.15.3", - "mjml-column": "4.15.3", - "mjml-divider": "4.15.3", - "mjml-group": "4.15.3", - "mjml-head": "4.15.3", - "mjml-head-attributes": "4.15.3", - "mjml-head-breakpoint": "4.15.3", - "mjml-head-font": "4.15.3", - "mjml-head-html-attributes": "4.15.3", - "mjml-head-preview": "4.15.3", - "mjml-head-style": "4.15.3", - "mjml-head-title": "4.15.3", - "mjml-hero": "4.15.3", - "mjml-image": "4.15.3", - "mjml-navbar": "4.15.3", - "mjml-raw": "4.15.3", - "mjml-section": "4.15.3", - "mjml-social": "4.15.3", - "mjml-spacer": "4.15.3", - "mjml-table": "4.15.3", - "mjml-text": "4.15.3", - "mjml-wrapper": "4.15.3" - } - }, - "node_modules/mjml-raw": { - "version": "4.15.3", - "resolved": "https://registry.npmjs.org/mjml-raw/-/mjml-raw-4.15.3.tgz", - "integrity": "sha512-IGyHheOYyRchBLiAEgw3UM11kFNmBSMupu2BDdejC6ZiDhEAdG+tyERlsCwDPYtXanvFpGWULIu3XlsUPc+RZw==", - "license": "MIT", - "dependencies": { - "@babel/runtime": "^7.23.9", - "lodash": "^4.17.21", - "mjml-core": "4.15.3" - } - }, - "node_modules/mjml-section": { - "version": "4.15.3", - "resolved": "https://registry.npmjs.org/mjml-section/-/mjml-section-4.15.3.tgz", - "integrity": "sha512-JfVPRXH++Hd933gmQfG8JXXCBCR6fIzC3DwiYycvanL/aW1cEQ2EnebUfQkt5QzlYjOkJEH+JpccAsq3ln6FZQ==", - "license": "MIT", - "dependencies": { - "@babel/runtime": "^7.23.9", - "lodash": "^4.17.21", - "mjml-core": "4.15.3" - } - }, - "node_modules/mjml-social": { - "version": "4.15.3", - "resolved": "https://registry.npmjs.org/mjml-social/-/mjml-social-4.15.3.tgz", - "integrity": "sha512-7sD5FXrESOxpT9Z4Oh36bS6u/geuUrMP1aCg2sjyAwbPcF1aWa2k9OcatQfpRf6pJEhUZ18y6/WBBXmMVmSzXg==", - "license": "MIT", - "dependencies": { - "@babel/runtime": "^7.23.9", - "lodash": "^4.17.21", - "mjml-core": "4.15.3" - } - }, - "node_modules/mjml-spacer": { - "version": "4.15.3", - "resolved": "https://registry.npmjs.org/mjml-spacer/-/mjml-spacer-4.15.3.tgz", - "integrity": "sha512-3B7Qj+17EgDdAtZ3NAdMyOwLTX1jfmJuY7gjyhS2HtcZAmppW+cxqHUBwCKfvSRgTQiccmEvtNxaQK+tfyrZqA==", - "license": "MIT", - "dependencies": { - "@babel/runtime": "^7.23.9", - "lodash": "^4.17.21", - "mjml-core": "4.15.3" - } - }, - "node_modules/mjml-table": { - "version": "4.15.3", - "resolved": "https://registry.npmjs.org/mjml-table/-/mjml-table-4.15.3.tgz", - "integrity": "sha512-FLx7DcRKTdKdcOCbMyBaeudeHaHpwPveRrBm6WyQe3LXx6FfdmOh59i71/16LFQMgBOD3N4/UJkzxLzlTJzMqQ==", - "license": "MIT", - "dependencies": { - "@babel/runtime": "^7.23.9", - "lodash": "^4.17.21", - "mjml-core": "4.15.3" - } - }, - "node_modules/mjml-text": { - "version": "4.15.3", - "resolved": "https://registry.npmjs.org/mjml-text/-/mjml-text-4.15.3.tgz", - "integrity": "sha512-+C0hxCmw9kg0XzT6vhE5mFkK6y225nC8UEQcN94K0fBCjPKkM+HqZMwGX205fzdGRi+Bxa55b/VhrIVwdv+8vw==", - "license": "MIT", - "dependencies": { - "@babel/runtime": "^7.23.9", - "lodash": "^4.17.21", - "mjml-core": "4.15.3" - } - }, - "node_modules/mjml-validator": { - "version": "4.15.3", - "resolved": "https://registry.npmjs.org/mjml-validator/-/mjml-validator-4.15.3.tgz", - "integrity": "sha512-Xb72KdqRwjv/qM2rJpV22syyP2N3cRQ9VVDrN6u2FSzLq02buFNxmSPJ7CKhat3PrUNdVHU75KZwOf/tz4UEhA==", - "license": "MIT", - "dependencies": { - "@babel/runtime": "^7.23.9" - } - }, - "node_modules/mjml-wrapper": { - "version": "4.15.3", - "resolved": "https://registry.npmjs.org/mjml-wrapper/-/mjml-wrapper-4.15.3.tgz", - "integrity": "sha512-ditsCijeHJrmBmObtJmQ18ddLxv5oPyMTdPU8Di8APOnD2zPk7Z4UAuJSl7HXB45oFiivr3MJf4koFzMUSZ6Gg==", - "license": "MIT", - "dependencies": { - "@babel/runtime": "^7.23.9", - "lodash": "^4.17.21", - "mjml-core": "4.15.3", - "mjml-section": "4.15.3" - } - }, - "node_modules/mkdirp": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.4.tgz", - "integrity": "sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==", - "license": "MIT", - "bin": { - "mkdirp": "bin/cmd.js" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/mocha": { - "version": "9.2.2", - "resolved": "https://registry.npmjs.org/mocha/-/mocha-9.2.2.tgz", - "integrity": "sha512-L6XC3EdwT6YrIk0yXpavvLkn8h+EU+Y5UcCHKECyMbdUIxyMuZj4bX4U9e1nvnvUUvQVsV2VHQr5zLdcUkhW/g==", - "dev": true, - "license": "MIT", - "dependencies": { - "@ungap/promise-all-settled": "1.1.2", - "ansi-colors": "4.1.1", - "browser-stdout": "1.3.1", - "chokidar": "3.5.3", - "debug": "4.3.3", - "diff": "5.0.0", - "escape-string-regexp": "4.0.0", - "find-up": "5.0.0", - "glob": "7.2.0", - "growl": "1.10.5", - "he": "1.2.0", - "js-yaml": "4.1.0", - "log-symbols": "4.1.0", - "minimatch": "4.2.1", - "ms": "2.1.3", - "nanoid": "3.3.1", - "serialize-javascript": "6.0.0", - "strip-json-comments": "3.1.1", - "supports-color": "8.1.1", - "which": "2.0.2", - "workerpool": "6.2.0", - "yargs": "16.2.0", - "yargs-parser": "20.2.4", - "yargs-unparser": "2.0.0" - }, - "bin": { - "_mocha": "bin/_mocha", - "mocha": "bin/mocha" - }, - "engines": { - "node": ">= 12.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/mochajs" - } - }, - "node_modules/mocha/node_modules/ansi-colors": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/ansi-colors/-/ansi-colors-4.1.1.tgz", - "integrity": "sha512-JoX0apGbHaUJBNl6yF+p6JAFYZ666/hhCGKN5t9QFjbJQKUU/g8MNbFDbvfrgKXvI1QpZplPOnwIo99lX/AAmA==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=6" - } - }, - "node_modules/mocha/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/mocha/node_modules/chokidar": { - "version": "3.5.3", - "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.5.3.tgz", - "integrity": "sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw==", - "dev": true, - "funding": [ - { - "type": "individual", - "url": "https://paulmillr.com/funding/" - } - ], - "license": "MIT", - "dependencies": { - "anymatch": "~3.1.2", - "braces": "~3.0.2", - "glob-parent": "~5.1.2", - "is-binary-path": "~2.1.0", - "is-glob": "~4.0.1", - "normalize-path": "~3.0.0", - "readdirp": "~3.6.0" - }, - "engines": { - "node": ">= 8.10.0" - }, - "optionalDependencies": { - "fsevents": "~2.3.2" - } - }, - "node_modules/mocha/node_modules/cliui": { - "version": "7.0.4", - "resolved": "https://registry.npmjs.org/cliui/-/cliui-7.0.4.tgz", - "integrity": "sha512-OcRE68cOsVMXp1Yvonl/fzkQOyjLSu/8bhPDfQt0e0/Eb283TKP20Fs2MqoPsr9SwA595rRCA+QMzYc9nBP+JQ==", - "dev": true, - "license": "ISC", - "dependencies": { - "string-width": "^4.2.0", - "strip-ansi": "^6.0.0", - "wrap-ansi": "^7.0.0" - } - }, - "node_modules/mocha/node_modules/debug": { - "version": "4.3.3", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.3.tgz", - "integrity": "sha512-/zxw5+vh1Tfv+4Qn7a5nsbcJKPaSvCDhojn6FEl9vupwK2VCSDtEiEtqr8DFtzYFOdz63LBkxec7DYuc2jon6Q==", - "dev": true, - "license": "MIT", - "dependencies": { - "ms": "2.1.2" - }, - "engines": { - "node": ">=6.0" - }, - "peerDependenciesMeta": { - "supports-color": { - "optional": true - } - } - }, - "node_modules/mocha/node_modules/debug/node_modules/ms": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", - "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", - "dev": true, - "license": "MIT" - }, - "node_modules/mocha/node_modules/glob": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.0.tgz", - "integrity": "sha512-lmLf6gtyrPq8tTjSmrO94wBeQbFR3HbLHbuyD69wuyQkImp2hWqMGB47OX65FBkPffO641IP9jWa1z4ivqG26Q==", - "deprecated": "Glob versions prior to v9 are no longer supported", - "dev": true, - "license": "ISC", - "dependencies": { - "fs.realpath": "^1.0.0", - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "^3.0.4", - "once": "^1.3.0", - "path-is-absolute": "^1.0.0" - }, - "engines": { - "node": "*" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/mocha/node_modules/glob/node_modules/minimatch": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", - "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", - "dev": true, - "license": "ISC", - "dependencies": { - "brace-expansion": "^1.1.7" - }, - "engines": { - "node": "*" - } - }, - "node_modules/mocha/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/mocha/node_modules/minimatch": { - "version": "4.2.1", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-4.2.1.tgz", - "integrity": "sha512-9Uq1ChtSZO+Mxa/CL1eGizn2vRn3MlLgzhT0Iz8zaY8NdvxvB0d5QdPFmCKf7JKA9Lerx5vRrnwO03jsSfGG9g==", - "dev": true, - "license": "ISC", - "dependencies": { - "brace-expansion": "^1.1.7" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/mocha/node_modules/nanoid": { - "version": "3.3.1", - "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.1.tgz", - "integrity": "sha512-n6Vs/3KGyxPQd6uO0eH4Bv0ojGSUvuLlIHtC3Y0kEO23YRge8H9x1GCzLn28YX0H66pMkxuaeESFq4tKISKwdw==", - "dev": true, - "license": "MIT", - "bin": { - "nanoid": "bin/nanoid.cjs" - }, - "engines": { - "node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1" - } - }, - "node_modules/mocha/node_modules/serialize-javascript": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-6.0.0.tgz", - "integrity": "sha512-Qr3TosvguFt8ePWqsvRfrKyQXIiW+nGbYpy8XK24NQHE83caxWt+mIymTT19DGFbNWNLfEwsrkSmN64lVWB9ag==", - "dev": true, - "license": "BSD-3-Clause", - "dependencies": { - "randombytes": "^2.1.0" - } - }, - "node_modules/mocha/node_modules/yargs": { - "version": "16.2.0", - "resolved": "https://registry.npmjs.org/yargs/-/yargs-16.2.0.tgz", - "integrity": "sha512-D1mvvtDG0L5ft/jGWkLpG1+m0eQxOfaBvTNELraWj22wSVUMWxZUvYgJYcKh6jGGIkJFhH4IZPQhR4TKpc8mBw==", - "dev": true, - "license": "MIT", - "dependencies": { - "cliui": "^7.0.2", - "escalade": "^3.1.1", - "get-caller-file": "^2.0.5", - "require-directory": "^2.1.1", - "string-width": "^4.2.0", - "y18n": "^5.0.5", - "yargs-parser": "^20.2.2" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/mocha/node_modules/yargs-parser": { - "version": "20.2.4", - "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-20.2.4.tgz", - "integrity": "sha512-WOkpgNhPTlE73h4VFAFsOnomJVaovO8VqLDzy5saChRBFQFBoMYirowyW+Q9HB4HFF4Z7VZTiG3iSzJJA29yRA==", - "dev": true, - "license": "ISC", - "engines": { - "node": ">=10" - } - }, - "node_modules/moment": { - "version": "2.30.1", - "resolved": "https://registry.npmjs.org/moment/-/moment-2.30.1.tgz", - "integrity": "sha512-uEmtNhbDOrWPFS+hdjFCBfy9f2YoyzRpwcl+DqpC6taX21FzsTLQVbMV/W7PzNSX6x/bhC1zA3c2UQ5NzH6how==", - "license": "MIT", - "engines": { - "node": "*" - } - }, - "node_modules/mongodb": { - "version": "5.9.2", - "resolved": "https://registry.npmjs.org/mongodb/-/mongodb-5.9.2.tgz", - "integrity": "sha512-H60HecKO4Bc+7dhOv4sJlgvenK4fQNqqUIlXxZYQNbfEWSALGAwGoyJd/0Qwk4TttFXUOHJ2ZJQe/52ScaUwtQ==", - "license": "Apache-2.0", - "dependencies": { - "bson": "^5.5.0", - "mongodb-connection-string-url": "^2.6.0", - "socks": "^2.7.1" - }, - "engines": { - "node": ">=14.20.1" - }, - "optionalDependencies": { - "@mongodb-js/saslprep": "^1.1.0" - }, - "peerDependencies": { - "@aws-sdk/credential-providers": "^3.188.0", - "@mongodb-js/zstd": "^1.0.0", - "kerberos": "^1.0.0 || ^2.0.0", - "mongodb-client-encryption": ">=2.3.0 <3", - "snappy": "^7.2.2" - }, - "peerDependenciesMeta": { - "@aws-sdk/credential-providers": { - "optional": true - }, - "@mongodb-js/zstd": { - "optional": true - }, - "kerberos": { - "optional": true - }, - "mongodb-client-encryption": { - "optional": true - }, - "snappy": { - "optional": true - } - } - }, - "node_modules/mongodb-connection-string-url": { - "version": "2.6.0", - "resolved": "https://registry.npmjs.org/mongodb-connection-string-url/-/mongodb-connection-string-url-2.6.0.tgz", - "integrity": "sha512-WvTZlI9ab0QYtTYnuMLgobULWhokRjtC7db9LtcVfJ+Hsnyr5eo6ZtNAt3Ly24XZScGMelOcGtm7lSn0332tPQ==", - "license": "Apache-2.0", - "dependencies": { - "@types/whatwg-url": "^8.2.1", - "whatwg-url": "^11.0.0" - } - }, - "node_modules/move-concurrently": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/move-concurrently/-/move-concurrently-1.0.1.tgz", - "integrity": "sha512-hdrFxZOycD/g6A6SoI2bB5NA/5NEqD0569+S47WZhPvm46sD50ZHdYaFmnua5lndde9rCHGjmfK7Z8BuCt/PcQ==", - "deprecated": "This package is no longer supported.", - "dev": true, - "license": "ISC", - "dependencies": { - "aproba": "^1.1.1", - "copy-concurrently": "^1.0.0", - "fs-write-stream-atomic": "^1.0.8", - "mkdirp": "^0.5.1", - "rimraf": "^2.5.4", - "run-queue": "^1.0.3" - } - }, - "node_modules/move-concurrently/node_modules/mkdirp": { - "version": "0.5.6", - "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.6.tgz", - "integrity": "sha512-FP+p8RB8OWpF3YZBCrP5gtADmtXApB5AMLn+vdyA+PyxCjrCs00mjyUozssO33cwDeT3wNGdLxJ5M//YqtHAJw==", - "dev": true, - "license": "MIT", - "dependencies": { - "minimist": "^1.2.6" - }, - "bin": { - "mkdirp": "bin/cmd.js" - } - }, - "node_modules/move-concurrently/node_modules/rimraf": { - "version": "2.7.1", - "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.7.1.tgz", - "integrity": "sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w==", - "deprecated": "Rimraf versions prior to v4 are no longer supported", - "dev": true, - "license": "ISC", - "dependencies": { - "glob": "^7.1.3" - }, - "bin": { - "rimraf": "bin.js" - } - }, - "node_modules/mrmime": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/mrmime/-/mrmime-2.0.0.tgz", - "integrity": "sha512-eu38+hdgojoyq63s+yTpN4XMBdt5l8HhMhc4VKLO9KM5caLIBvUm4thi7fFaxyTmCKeNnXZ5pAlBwCUnhA09uw==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=10" - } - }, - "node_modules/ms": { - "version": "2.1.3", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", - "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", - "license": "MIT" - }, - "node_modules/multer": { - "version": "1.4.4-lts.1", - "resolved": "https://registry.npmjs.org/multer/-/multer-1.4.4-lts.1.tgz", - "integrity": "sha512-WeSGziVj6+Z2/MwQo3GvqzgR+9Uc+qt8SwHKh3gvNPiISKfsMfG4SvCOFYlxxgkXt7yIV2i1yczehm0EOKIxIg==", - "license": "MIT", - "dependencies": { - "append-field": "^1.0.0", - "busboy": "^1.0.0", - "concat-stream": "^1.5.2", - "mkdirp": "^0.5.4", - "object-assign": "^4.1.1", - "type-is": "^1.6.4", - "xtend": "^4.0.0" - }, - "engines": { - "node": ">= 6.0.0" - } - }, - "node_modules/multer/node_modules/mkdirp": { - "version": "0.5.6", - "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.6.tgz", - "integrity": "sha512-FP+p8RB8OWpF3YZBCrP5gtADmtXApB5AMLn+vdyA+PyxCjrCs00mjyUozssO33cwDeT3wNGdLxJ5M//YqtHAJw==", - "license": "MIT", - "dependencies": { - "minimist": "^1.2.6" - }, - "bin": { - "mkdirp": "bin/cmd.js" - } - }, - "node_modules/mustache": { - "version": "2.3.2", - "resolved": "https://registry.npmjs.org/mustache/-/mustache-2.3.2.tgz", - "integrity": "sha512-KpMNwdQsYz3O/SBS1qJ/o3sqUJ5wSb8gb0pul8CO0S56b9Y2ALm8zCfsjPXsqGFfoNBkDwZuZIAjhsZI03gYVQ==", - "license": "MIT", - "bin": { - "mustache": "bin/mustache" - }, - "engines": { - "npm": ">=1.4.0" - } - }, - "node_modules/mute-stream": { - "version": "0.0.8", - "resolved": "https://registry.npmjs.org/mute-stream/-/mute-stream-0.0.8.tgz", - "integrity": "sha512-nnbWWOkoWyUsTjKrhgD0dcz22mdkSnpYqbEjIm2nhwhuxlSkpywJmBo8h0ZqJdkp73mb90SssHkN4rsRaBAfAA==", - "license": "ISC" - }, - "node_modules/mz": { - "version": "2.7.0", - "resolved": "https://registry.npmjs.org/mz/-/mz-2.7.0.tgz", - "integrity": "sha512-z81GNO7nnYMEhrGh9LeymoE4+Yr0Wn5McHIZMK5cfQCl+NDX08sCZgUc9/6MHni9IWuFLm1Z3HTCXu2z9fN62Q==", - "license": "MIT", - "dependencies": { - "any-promise": "^1.0.0", - "object-assign": "^4.0.1", - "thenify-all": "^1.0.0" - } - }, - "node_modules/nan": { - "version": "2.22.0", - "resolved": "https://registry.npmjs.org/nan/-/nan-2.22.0.tgz", - "integrity": "sha512-nbajikzWTMwsW+eSsNm3QwlOs7het9gGJU5dDZzRTQGk03vyBOauxgI4VakDzE0PtsGTmXPsXTbbjVhRwR5mpw==", - "dev": true, - "license": "MIT", - "optional": true - }, - "node_modules/nanoid": { - "version": "5.0.8", - "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-5.0.8.tgz", - "integrity": "sha512-TcJPw+9RV9dibz1hHUzlLVy8N4X9TnwirAjrU08Juo6BNKggzVfP2ZJ/3ZUSq15Xl5i85i+Z89XBO90pB2PghQ==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/ai" - } - ], - "license": "MIT", - "bin": { - "nanoid": "bin/nanoid.js" - }, - "engines": { - "node": "^18 || >=20" - } - }, - "node_modules/nanomatch": { - "version": "1.2.13", - "resolved": "https://registry.npmjs.org/nanomatch/-/nanomatch-1.2.13.tgz", - "integrity": "sha512-fpoe2T0RbHwBTBUOftAfBPaDEi06ufaUai0mE6Yn1kacc3SnTErfb/h+X94VXzI64rKFHYImXSvdwGGCmwOqCA==", - "dev": true, - "license": "MIT", - "dependencies": { - "arr-diff": "^4.0.0", - "array-unique": "^0.3.2", - "define-property": "^2.0.2", - "extend-shallow": "^3.0.2", - "fragment-cache": "^0.2.1", - "is-windows": "^1.0.2", - "kind-of": "^6.0.2", - "object.pick": "^1.3.0", - "regex-not": "^1.0.0", - "snapdragon": "^0.8.1", - "to-regex": "^3.0.1" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/natural-compare": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz", - "integrity": "sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==", - "dev": true, - "license": "MIT" - }, - "node_modules/negotiator": { - "version": "0.6.3", - "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.3.tgz", - "integrity": "sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg==", - "license": "MIT", - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/neo-async": { - "version": "2.6.2", - "resolved": "https://registry.npmjs.org/neo-async/-/neo-async-2.6.2.tgz", - "integrity": "sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw==", - "dev": true, - "license": "MIT" - }, - "node_modules/neoip": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/neoip/-/neoip-2.1.0.tgz", - "integrity": "sha512-4zQ8eVAmbBNV3Fmpm3Li2tNPnrU6UobMXpO1OZsY/Eg2AGOB+H8dZfAabMVrh7Xl9xAVIDcEIlUVA057Fi7QdA==", - "license": "MIT" - }, - "node_modules/next-tick": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/next-tick/-/next-tick-1.1.0.tgz", - "integrity": "sha512-CXdUiJembsNjuToQvxayPZF9Vqht7hewsvy2sOWafLvi2awflj9mOC6bHIg50orX8IJvWKY9wYQ/zB2kogPslQ==", - "license": "ISC" - }, - "node_modules/nice-try": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/nice-try/-/nice-try-1.0.5.tgz", - "integrity": "sha512-1nh45deeb5olNY7eX82BkPO7SSxR5SSYJiPTrTdFUVYwAl8CKMA5N9PjTYkHiRjisVcxcQ1HXdLhx2qxxJzLNQ==", - "dev": true, - "license": "MIT" - }, - "node_modules/no-case": { - "version": "2.3.2", - "resolved": "https://registry.npmjs.org/no-case/-/no-case-2.3.2.tgz", - "integrity": "sha512-rmTZ9kz+f3rCvK2TD1Ue/oZlns7OGoIWP4fc3llxxRXlOkHKoWPPWJOfFYpITabSow43QJbRIoHQXtt10VldyQ==", - "license": "MIT", - "dependencies": { - "lower-case": "^1.1.1" - } - }, - "node_modules/node-cron": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/node-cron/-/node-cron-3.0.3.tgz", - "integrity": "sha512-dOal67//nohNgYWb+nWmg5dkFdIwDm8EpeGYMekPMrngV3637lqnX0lbUcCtgibHTz6SEz7DAIjKvKDFYCnO1A==", - "license": "ISC", - "dependencies": { - "uuid": "8.3.2" - }, - "engines": { - "node": ">=6.0.0" - } - }, - "node_modules/node-fetch": { - "version": "2.7.0", - "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.7.0.tgz", - "integrity": "sha512-c4FRfUm/dbcWZ7U+1Wq0AwCyFL+3nt2bEw05wfxSz+DWpWsitgmSgYmy2dQdWyKC1694ELPqMs/YzUSNozLt8A==", - "license": "MIT", - "dependencies": { - "whatwg-url": "^5.0.0" - }, - "engines": { - "node": "4.x || >=6.0.0" - }, - "peerDependencies": { - "encoding": "^0.1.0" - }, - "peerDependenciesMeta": { - "encoding": { - "optional": true - } - } - }, - "node_modules/node-fetch-native": { - "version": "1.6.4", - "resolved": "https://registry.npmjs.org/node-fetch-native/-/node-fetch-native-1.6.4.tgz", - "integrity": "sha512-IhOigYzAKHd244OC0JIMIUrjzctirCmPkaIfhDeGcEETWof5zKYUW7e7MYvChGWh/4CJeXEgsRyGzuF334rOOQ==", - "license": "MIT" - }, - "node_modules/node-fetch/node_modules/tr46": { - "version": "0.0.3", - "resolved": "https://registry.npmjs.org/tr46/-/tr46-0.0.3.tgz", - "integrity": "sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==", - "license": "MIT" - }, - "node_modules/node-fetch/node_modules/webidl-conversions": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-3.0.1.tgz", - "integrity": "sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ==", - "license": "BSD-2-Clause" - }, - "node_modules/node-fetch/node_modules/whatwg-url": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-5.0.0.tgz", - "integrity": "sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw==", - "license": "MIT", - "dependencies": { - "tr46": "~0.0.3", - "webidl-conversions": "^3.0.0" - } - }, - "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==", - "license": "(BSD-3-Clause OR GPL-2.0)", - "engines": { - "node": ">= 6.13.0" - } - }, - "node_modules/node-html-parser": { - "version": "6.1.13", - "resolved": "https://registry.npmjs.org/node-html-parser/-/node-html-parser-6.1.13.tgz", - "integrity": "sha512-qIsTMOY4C/dAa5Q5vsobRpOOvPfC4pB61UVW2uSwZNUp0QU/jCekTal1vMmbO0DgdHeLUJpv/ARmDqErVxA3Sg==", - "dev": true, - "license": "MIT", - "dependencies": { - "css-select": "^5.1.0", - "he": "1.2.0" - } - }, - "node_modules/node-libs-browser": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/node-libs-browser/-/node-libs-browser-2.2.1.tgz", - "integrity": "sha512-h/zcD8H9kaDZ9ALUWwlBUDo6TKF8a7qBSCSEGfjTVIYeqsioSKaAX+BN7NgiMGp6iSIXZ3PxgCu8KS3b71YK5Q==", - "dev": true, - "license": "MIT", - "dependencies": { - "assert": "^1.1.1", - "browserify-zlib": "^0.2.0", - "buffer": "^4.3.0", - "console-browserify": "^1.1.0", - "constants-browserify": "^1.0.0", - "crypto-browserify": "^3.11.0", - "domain-browser": "^1.1.1", - "events": "^3.0.0", - "https-browserify": "^1.0.0", - "os-browserify": "^0.3.0", - "path-browserify": "0.0.1", - "process": "^0.11.10", - "punycode": "^1.2.4", - "querystring-es3": "^0.2.0", - "readable-stream": "^2.3.3", - "stream-browserify": "^2.0.1", - "stream-http": "^2.7.2", - "string_decoder": "^1.0.0", - "timers-browserify": "^2.0.4", - "tty-browserify": "0.0.0", - "url": "^0.11.0", - "util": "^0.11.0", - "vm-browserify": "^1.0.1" - } - }, - "node_modules/node-libs-browser/node_modules/buffer": { - "version": "4.9.2", - "resolved": "https://registry.npmjs.org/buffer/-/buffer-4.9.2.tgz", - "integrity": "sha512-xq+q3SRMOxGivLhBNaUdC64hDTQwejJ+H0T/NB1XMtTVEwNTrfFF3gAxiyW0Bu/xWEGhjVKgUcMhCrUy2+uCWg==", - "dev": true, - "license": "MIT", - "dependencies": { - "base64-js": "^1.0.2", - "ieee754": "^1.1.4", - "isarray": "^1.0.0" - } - }, - "node_modules/node-object-hash": { - "version": "1.4.2", - "resolved": "https://registry.npmjs.org/node-object-hash/-/node-object-hash-1.4.2.tgz", - "integrity": "sha512-UdS4swXs85fCGWWf6t6DMGgpN/vnlKeSGEQ7hJcrs7PBFoxoKLmibc3QRb7fwiYsjdL7PX8iI/TMSlZ90dgHhQ==", - "dev": true, - "license": "ISC", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/node-preload": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/node-preload/-/node-preload-0.2.1.tgz", - "integrity": "sha512-RM5oyBy45cLEoHqCeh+MNuFAxO0vTFBLskvQbOKnEE7YTTSN4tbN8QWDIPQ6L+WvKsB/qLEGpYe2ZZ9d4W9OIQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "process-on-spawn": "^1.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/node-releases": { - "version": "2.0.18", - "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.18.tgz", - "integrity": "sha512-d9VeXT4SJ7ZeOqGX6R5EM022wpL+eWPooLI+5UpWn2jCT1aosUQEhQP214x33Wkwx3JQMvIm+tIoVOdodFS40g==", - "dev": true, - "license": "MIT" - }, - "node_modules/node-res": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/node-res/-/node-res-5.0.1.tgz", - "integrity": "sha512-YOleO9c7MAqoHC+Ccu2vzvV1fL6Ku49gShq3PIMKWHRgrMSih3XcwL05NbLBi6oU2J471gTBfdpVVxwT6Pfhxg==", - "dev": true, - "license": "MIT", - "dependencies": { - "destroy": "^1.0.4", - "etag": "^1.8.1", - "mime-types": "^2.1.19", - "on-finished": "^2.3.0", - "vary": "^1.1.2" - } - }, - "node_modules/node-rsa": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/node-rsa/-/node-rsa-1.1.1.tgz", - "integrity": "sha512-Jd4cvbJMryN21r5HgxQOpMEqv+ooke/korixNNK3mGqfGJmy0M77WDDzo/05969+OkMy3XW1UuZsSmW9KQm7Fw==", - "license": "MIT", - "dependencies": { - "asn1": "^0.2.4" - } - }, - "node_modules/nodemailer": { - "version": "6.9.16", - "resolved": "https://registry.npmjs.org/nodemailer/-/nodemailer-6.9.16.tgz", - "integrity": "sha512-psAuZdTIRN08HKVd/E8ObdV6NO7NTBY3KsC30F7M4H1OnmLCUNaS56FpYxyb26zWLSyYF9Ozch9KYHhHegsiOQ==", - "license": "MIT-0", - "engines": { - "node": ">=6.0.0" - } - }, - "node_modules/nodemon": { - "version": "2.0.22", - "resolved": "https://registry.npmjs.org/nodemon/-/nodemon-2.0.22.tgz", - "integrity": "sha512-B8YqaKMmyuCO7BowF1Z1/mkPqLk6cs/l63Ojtd6otKjMx47Dq1utxfRxcavH1I7VSaL8n5BUaoutadnsX3AAVQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "chokidar": "^3.5.2", - "debug": "^3.2.7", - "ignore-by-default": "^1.0.1", - "minimatch": "^3.1.2", - "pstree.remy": "^1.1.8", - "semver": "^5.7.1", - "simple-update-notifier": "^1.0.7", - "supports-color": "^5.5.0", - "touch": "^3.1.0", - "undefsafe": "^2.0.5" - }, - "bin": { - "nodemon": "bin/nodemon.js" - }, - "engines": { - "node": ">=8.10.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/nodemon" - } - }, - "node_modules/nodemon/node_modules/debug": { - "version": "3.2.7", - "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", - "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "ms": "^2.1.1" - } - }, - "node_modules/nodemon/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_modules/nodemon/node_modules/semver": { - "version": "5.7.2", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.2.tgz", - "integrity": "sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g==", - "dev": true, - "license": "ISC", - "bin": { - "semver": "bin/semver" - } - }, - "node_modules/nodemon/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, - "license": "MIT", - "dependencies": { - "has-flag": "^3.0.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/nopt": { - "version": "7.2.1", - "resolved": "https://registry.npmjs.org/nopt/-/nopt-7.2.1.tgz", - "integrity": "sha512-taM24ViiimT/XntxbPyJQzCG+p4EKOpgD3mxFwW38mGjVUrfERQOeY4EDHjdnptttfHuHQXFx+lTP08Q+mLa/w==", - "license": "ISC", - "dependencies": { - "abbrev": "^2.0.0" - }, - "bin": { - "nopt": "bin/nopt.js" - }, - "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" - } - }, - "node_modules/normalize-package-data": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-3.0.3.tgz", - "integrity": "sha512-p2W1sgqij3zMMyRC067Dg16bfzVH+w7hyegmpIvZ4JNjqtGOVAIvLmjBx3yP7YTe9vKJgkoNOPjwQGogDoMXFA==", - "dev": true, - "license": "BSD-2-Clause", - "dependencies": { - "hosted-git-info": "^4.0.1", - "is-core-module": "^2.5.0", - "semver": "^7.3.4", - "validate-npm-package-license": "^3.0.1" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/normalize-path": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", - "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", - "license": "MIT", - "engines": { - "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": "6.1.0", - "resolved": "https://registry.npmjs.org/normalize-url/-/normalize-url-6.1.0.tgz", - "integrity": "sha512-DlL+XwOy3NxAQ8xuC0okPgK46iuVNAK01YN7RueYBqqFeGsBjV9XmCAzAdgt+667bCl5kPh9EqKKDwnaPG1I7A==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/npm-run-path": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-4.0.1.tgz", - "integrity": "sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw==", - "license": "MIT", - "dependencies": { - "path-key": "^3.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "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==", - "license": "BSD-2-Clause", - "dependencies": { - "boolbase": "^1.0.0" - }, - "funding": { - "url": "https://github.com/fb55/nth-check?sponsor=1" - } - }, - "node_modules/nuxt": { - "version": "2.18.1", - "resolved": "https://registry.npmjs.org/nuxt/-/nuxt-2.18.1.tgz", - "integrity": "sha512-SZFOLDKgCfLu23BrQE0YYNWeoi/h+fw07TNDNDzRfbmMvQlStgTBG7lqeELytXdQnaPKWjWAYo12K7pPPRZb9Q==", - "deprecated": "Nuxt 2 has reached EOL and is no longer actively maintained. See https://nuxt.com/blog/nuxt2-eol for more details.", - "dev": true, - "hasInstallScript": true, - "license": "MIT", - "dependencies": { - "@nuxt/babel-preset-app": "2.18.1", - "@nuxt/builder": "2.18.1", - "@nuxt/cli": "2.18.1", - "@nuxt/components": "^2.2.1", - "@nuxt/config": "2.18.1", - "@nuxt/core": "2.18.1", - "@nuxt/generator": "2.18.1", - "@nuxt/loading-screen": "^2.0.4", - "@nuxt/opencollective": "^0.4.0", - "@nuxt/server": "2.18.1", - "@nuxt/telemetry": "^1.5.0", - "@nuxt/utils": "2.18.1", - "@nuxt/vue-app": "2.18.1", - "@nuxt/vue-renderer": "2.18.1", - "@nuxt/webpack": "2.18.1" - }, - "bin": { - "nuxt": "bin/nuxt.js" - } - }, - "node_modules/nuxt-start": { - "version": "2.18.1", - "resolved": "https://registry.npmjs.org/nuxt-start/-/nuxt-start-2.18.1.tgz", - "integrity": "sha512-Zje5xy9zxgIsfYB/tE6X+HthC3UFOkABCTdRCcdOyW8/9697CBHCiRrAqxUZTxXD8iaxWl7NWlmgv4q89J4omw==", - "license": "MIT", - "dependencies": { - "@nuxt/cli": "2.18.1", - "@nuxt/config": "2.18.1", - "@nuxt/core": "2.18.1", - "@nuxt/server": "2.18.1", - "@nuxt/telemetry": "^1.5.0", - "@nuxt/utils": "2.18.1", - "@nuxt/vue-renderer": "2.18.1", - "node-fetch-native": "^1.6.4", - "vue": "^2.7.16", - "vue-client-only": "^2.1.0", - "vue-meta": "^2.4.0", - "vue-no-ssr": "^1.1.1", - "vue-router": "^3.6.5", - "vuex": "^3.6.2" - }, - "bin": { - "nuxt-start": "bin/nuxt-start.js" - } - }, - "node_modules/nyc": { - "version": "15.1.0", - "resolved": "https://registry.npmjs.org/nyc/-/nyc-15.1.0.tgz", - "integrity": "sha512-jMW04n9SxKdKi1ZMGhvUTHBN0EICCRkHemEoE5jm6mTYcqcdas0ATzgUgejlQUHMvpnOZqGB5Xxsv9KxJW1j8A==", - "dev": true, - "license": "ISC", - "dependencies": { - "@istanbuljs/load-nyc-config": "^1.0.0", - "@istanbuljs/schema": "^0.1.2", - "caching-transform": "^4.0.0", - "convert-source-map": "^1.7.0", - "decamelize": "^1.2.0", - "find-cache-dir": "^3.2.0", - "find-up": "^4.1.0", - "foreground-child": "^2.0.0", - "get-package-type": "^0.1.0", - "glob": "^7.1.6", - "istanbul-lib-coverage": "^3.0.0", - "istanbul-lib-hook": "^3.0.0", - "istanbul-lib-instrument": "^4.0.0", - "istanbul-lib-processinfo": "^2.0.2", - "istanbul-lib-report": "^3.0.0", - "istanbul-lib-source-maps": "^4.0.0", - "istanbul-reports": "^3.0.2", - "make-dir": "^3.0.0", - "node-preload": "^0.2.1", - "p-map": "^3.0.0", - "process-on-spawn": "^1.0.0", - "resolve-from": "^5.0.0", - "rimraf": "^3.0.0", - "signal-exit": "^3.0.2", - "spawn-wrap": "^2.0.0", - "test-exclude": "^6.0.0", - "yargs": "^15.0.2" - }, - "bin": { - "nyc": "bin/nyc.js" - }, - "engines": { - "node": ">=8.9" - } - }, - "node_modules/nyc/node_modules/cliui": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/cliui/-/cliui-6.0.0.tgz", - "integrity": "sha512-t6wbgtoCXvAzst7QgXxJYqPt0usEfbgQdftEPbLL/cvv6HPE5VgvqCuAIDR0NgU52ds6rFwqrgakNLrHEjCbrQ==", - "dev": true, - "license": "ISC", - "dependencies": { - "string-width": "^4.2.0", - "strip-ansi": "^6.0.0", - "wrap-ansi": "^6.2.0" - } - }, - "node_modules/nyc/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/nyc/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", - "dependencies": { - "locate-path": "^5.0.0", - "path-exists": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/nyc/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", - "dependencies": { - "p-locate": "^4.1.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/nyc/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", - "dependencies": { - "p-try": "^2.0.0" - }, - "engines": { - "node": ">=6" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/nyc/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", - "dependencies": { - "p-limit": "^2.2.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/nyc/node_modules/signal-exit": { - "version": "3.0.7", - "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz", - "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==", - "dev": true, - "license": "ISC" - }, - "node_modules/nyc/node_modules/wrap-ansi": { - "version": "6.2.0", - "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-6.2.0.tgz", - "integrity": "sha512-r6lPcBGxZXlIcymEu7InxDMhdW0KDxpLgoFLcguasxCaJ/SOIZwINatK9KY/tf+ZrlywOKU0UDj3ATXUBfxJXA==", - "dev": true, - "license": "MIT", - "dependencies": { - "ansi-styles": "^4.0.0", - "string-width": "^4.1.0", - "strip-ansi": "^6.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/nyc/node_modules/y18n": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/y18n/-/y18n-4.0.3.tgz", - "integrity": "sha512-JKhqTOwSrqNA1NY5lSztJ1GrBiUodLMmIZuLiDaMRJ+itFd+ABVE8XBjOvIWL+rSqNDC74LCSFmlb/U4UZ4hJQ==", - "dev": true, - "license": "ISC" - }, - "node_modules/nyc/node_modules/yargs": { - "version": "15.4.1", - "resolved": "https://registry.npmjs.org/yargs/-/yargs-15.4.1.tgz", - "integrity": "sha512-aePbxDmcYW++PaqBsJ+HYUFwCdv4LVvdnhBy78E57PIor8/OVvhMrADFFEDh8DHDFRv/O9i3lPhsENjO7QX0+A==", - "dev": true, - "license": "MIT", - "dependencies": { - "cliui": "^6.0.0", - "decamelize": "^1.2.0", - "find-up": "^4.1.0", - "get-caller-file": "^2.0.1", - "require-directory": "^2.1.1", - "require-main-filename": "^2.0.0", - "set-blocking": "^2.0.0", - "string-width": "^4.2.0", - "which-module": "^2.0.0", - "y18n": "^4.0.0", - "yargs-parser": "^18.1.2" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/nyc/node_modules/yargs-parser": { - "version": "18.1.3", - "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-18.1.3.tgz", - "integrity": "sha512-o50j0JeToy/4K6OZcaQmW6lyXXKhq7csREXcDwk2omFPJEwUNOVtJKvmDr9EI1fAJZUyZcRF7kxGBWmRXudrCQ==", - "dev": true, - "license": "ISC", - "dependencies": { - "camelcase": "^5.0.0", - "decamelize": "^1.2.0" + }, + "node_modules/acorn": { + "version": "8.12.1", + "license": "MIT", + "bin": { + "acorn": "bin/acorn" }, "engines": { - "node": ">=6" + "node": ">=0.4.0" } }, - "node_modules/object-assign": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", - "integrity": "sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==", + "node_modules/acorn-jsx": { + "version": "5.3.2", "license": "MIT", - "engines": { - "node": ">=0.10.0" + "peerDependencies": { + "acorn": "^6.0.0 || ^7.0.0 || ^8.0.0" } }, - "node_modules/object-copy": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/object-copy/-/object-copy-0.1.0.tgz", - "integrity": "sha512-79LYn6VAb63zgtmAteVOWo9Vdj71ZVBy3Pbse+VqxDpEP83XuujMrGqHIwAXJ5I/aM0zU7dIyIAhifVTPrNItQ==", - "dev": true, + "node_modules/agentkeepalive": { + "version": "4.5.0", "license": "MIT", "dependencies": { - "copy-descriptor": "^0.1.0", - "define-property": "^0.2.5", - "kind-of": "^3.0.3" + "humanize-ms": "^1.2.1" }, "engines": { - "node": ">=0.10.0" + "node": ">= 8.0.0" } }, - "node_modules/object-copy/node_modules/define-property": { - "version": "0.2.5", - "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", - "integrity": "sha512-Rr7ADjQZenceVOAKop6ALkkRAmH1A4Gx9hV/7ZujPUN2rkATqFO0JZLZInbAjpZYoJ1gUx8MRMQVkYemcbMSTA==", - "dev": true, + "node_modules/ajv": { + "version": "8.17.1", "license": "MIT", "dependencies": { - "is-descriptor": "^0.1.0" + "fast-deep-equal": "^3.1.3", + "fast-uri": "^3.0.1", + "json-schema-traverse": "^1.0.0", + "require-from-string": "^2.0.2" }, - "engines": { - "node": ">=0.10.0" + "funding": { + "type": "github", + "url": "https://github.com/sponsors/epoberezkin" } }, - "node_modules/object-copy/node_modules/is-descriptor": { - "version": "0.1.7", - "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-0.1.7.tgz", - "integrity": "sha512-C3grZTvObeN1xud4cRWl366OMXZTj0+HGyk4hvfpx4ZHt1Pb60ANSXqCK7pdOTeUQpRzECBSTphqvD7U+l22Eg==", - "dev": true, + "node_modules/ajv-errors": { + "version": "3.0.0", "license": "MIT", - "dependencies": { - "is-accessor-descriptor": "^1.0.1", - "is-data-descriptor": "^1.0.1" - }, - "engines": { - "node": ">= 0.4" + "peerDependencies": { + "ajv": "^8.0.1" } }, - "node_modules/object-copy/node_modules/kind-of": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha512-NOW9QQXMoZGg/oqnVNoNTTIFEIid1627WCffUBJEdMxYApq7mNE7CpzucIPc+ZQg25Phej7IJSmX3hO+oblOtQ==", - "dev": true, + "node_modules/ajv-formats": { + "version": "3.0.1", "license": "MIT", "dependencies": { - "is-buffer": "^1.1.5" + "ajv": "^8.0.0" }, - "engines": { - "node": ">=0.10.0" + "peerDependencies": { + "ajv": "^8.0.0" + }, + "peerDependenciesMeta": { + "ajv": { + "optional": true + } } }, - "node_modules/object-hash": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/object-hash/-/object-hash-2.2.0.tgz", - "integrity": "sha512-gScRMn0bS5fH+IuwyIFgnh9zBdo4DV+6GhygmWM9HyNJSgS0hScp1f5vjtm7oIIOiT9trXrShAkLFSc2IqKNgw==", + "node_modules/ajv-i18n": { + "version": "4.2.0", "license": "MIT", - "engines": { - "node": ">= 6" + "peerDependencies": { + "ajv": "^8.0.0-beta.0" } }, - "node_modules/object-inspect": { - "version": "1.13.3", - "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.13.3.tgz", - "integrity": "sha512-kDCGIbxkDSXE3euJZZXzc6to7fCrKHNI/hSRQnRuQ+BWjFNzZwiFF8fj/6o2t2G9/jTj8PSIYTfCLelLZEeRpA==", + "node_modules/alien-signals": { + "version": "0.2.2", + "license": "MIT" + }, + "node_modules/ansi-colors": { + "version": "4.1.3", "license": "MIT", "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" + "node": ">=6" } }, - "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, + "node_modules/ansi-regex": { + "version": "5.0.1", "license": "MIT", "engines": { - "node": ">= 0.4" + "node": ">=8" } }, - "node_modules/object-visit": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/object-visit/-/object-visit-1.0.1.tgz", - "integrity": "sha512-GBaMwwAVK9qbQN3Scdo0OyvgPW7l3lnaVMj84uTOZlswkX0KpF6fyDBJhtTthf7pymztoN36/KEr1DyhF96zEA==", - "dev": true, + "node_modules/ansi-styles": { + "version": "4.3.0", "license": "MIT", "dependencies": { - "isobject": "^3.0.0" + "color-convert": "^2.0.1" }, "engines": { - "node": ">=0.10.0" + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" } }, - "node_modules/object.assign": { - "version": "4.1.5", - "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.5.tgz", - "integrity": "sha512-byy+U7gp+FVwmyzKPYhW2h5l3crpmGsxl7X2s8y43IgxvG4g3QZ6CffDtsNQy1WsmZpQbO+ybo0AlW7TY6DcBQ==", - "dev": true, - "license": "MIT", + "node_modules/anymatch": { + "version": "3.1.3", + "license": "ISC", "dependencies": { - "call-bind": "^1.0.5", - "define-properties": "^1.2.1", - "has-symbols": "^1.0.3", - "object-keys": "^1.1.1" + "normalize-path": "^3.0.0", + "picomatch": "^2.0.4" }, "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" + "node": ">= 8" } }, - "node_modules/object.fromentries": { - "version": "2.0.8", - "resolved": "https://registry.npmjs.org/object.fromentries/-/object.fromentries-2.0.8.tgz", - "integrity": "sha512-k6E21FzySsSK5a21KRADBd/NGneRegFO5pLHfdQLpRDETUNJueLXs3WCzyQ3tFRDYgbq3KHGXfTbi2bs8WQ6rQ==", + "node_modules/append-field": { + "version": "1.0.0", + "license": "MIT" + }, + "node_modules/argparse": { + "version": "2.0.1", + "license": "Python-2.0" + }, + "node_modules/array-buffer-byte-length": { + "version": "1.0.1", "dev": true, "license": "MIT", "dependencies": { - "call-bind": "^1.0.7", - "define-properties": "^1.2.1", - "es-abstract": "^1.23.2", - "es-object-atoms": "^1.0.0" + "call-bind": "^1.0.5", + "is-array-buffer": "^3.0.4" }, "engines": { "node": ">= 0.4" @@ -18373,66 +2968,60 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/object.getownpropertydescriptors": { - "version": "2.1.8", - "resolved": "https://registry.npmjs.org/object.getownpropertydescriptors/-/object.getownpropertydescriptors-2.1.8.tgz", - "integrity": "sha512-qkHIGe4q0lSYMv0XI4SsBTJz3WaURhLvd0lKSgtVuOsJ2krg4SgMw3PIRQFMp07yi++UR3se2mkcLqsBNpBb/A==", + "node_modules/array-flatten": { + "version": "3.0.0", + "license": "MIT" + }, + "node_modules/array-ify": { + "version": "1.0.0", + "dev": true, + "license": "MIT" + }, + "node_modules/array-includes": { + "version": "3.1.8", "dev": true, "license": "MIT", "dependencies": { - "array.prototype.reduce": "^1.0.6", "call-bind": "^1.0.7", "define-properties": "^1.2.1", "es-abstract": "^1.23.2", "es-object-atoms": "^1.0.0", - "gopd": "^1.0.1", - "safe-array-concat": "^1.1.2" + "get-intrinsic": "^1.2.4", + "is-string": "^1.0.7" }, "engines": { - "node": ">= 0.8" + "node": ">= 0.4" }, "funding": { "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/object.groupby": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/object.groupby/-/object.groupby-1.0.3.tgz", - "integrity": "sha512-+Lhy3TQTuzXI5hevh8sBGqbmurHbbIjAi0Z4S63nthVLmLxfbj4T54a4CfZrXIrt9iP4mVAPYMo/v99taj3wjQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "call-bind": "^1.0.7", - "define-properties": "^1.2.1", - "es-abstract": "^1.23.2" - }, - "engines": { - "node": ">= 0.4" - } + "node_modules/array-parallel": { + "version": "0.1.3", + "license": "MIT" }, - "node_modules/object.pick": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/object.pick/-/object.pick-1.3.0.tgz", - "integrity": "sha512-tqa/UMy/CCoYmj+H5qc07qvSL9dqcs/WZENZ1JbtWBlATP+iVOe778gE6MSijnyCnORzDuX6hU+LA4SZ09YjFQ==", - "dev": true, + "node_modules/array-series": { + "version": "0.1.5", + "license": "MIT" + }, + "node_modules/array-union": { + "version": "2.1.0", "license": "MIT", - "dependencies": { - "isobject": "^3.0.1" - }, "engines": { - "node": ">=0.10.0" + "node": ">=8" } }, - "node_modules/object.values": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/object.values/-/object.values-1.2.0.tgz", - "integrity": "sha512-yBYjY9QX2hnRmZHAjG/f13MzmBzxzYgQhFrke06TTyKY5zSTEqkOeukBzIdVA3j3ulu8Qa3MbVFShV7T2RmGtQ==", + "node_modules/array.prototype.findlast": { + "version": "1.2.5", "dev": true, "license": "MIT", "dependencies": { "call-bind": "^1.0.7", "define-properties": "^1.2.1", - "es-object-atoms": "^1.0.0" + "es-abstract": "^1.23.2", + "es-errors": "^1.3.0", + "es-object-atoms": "^1.0.0", + "es-shim-unscopables": "^1.0.2" }, "engines": { "node": ">= 0.4" @@ -18441,2209 +3030,1748 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/on-finished": { - "version": "2.4.1", - "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.4.1.tgz", - "integrity": "sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg==", - "license": "MIT", - "dependencies": { - "ee-first": "1.1.1" - }, - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/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==", - "license": "MIT", - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/once": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", - "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==", - "license": "ISC", - "dependencies": { - "wrappy": "1" - } - }, - "node_modules/onetime": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/onetime/-/onetime-5.1.2.tgz", - "integrity": "sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==", + "node_modules/array.prototype.flat": { + "version": "1.3.2", + "dev": true, "license": "MIT", "dependencies": { - "mimic-fn": "^2.1.0" + "call-bind": "^1.0.2", + "define-properties": "^1.2.0", + "es-abstract": "^1.22.1", + "es-shim-unscopables": "^1.0.0" }, "engines": { - "node": ">=6" + "node": ">= 0.4" }, "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/open": { - "version": "7.4.2", - "resolved": "https://registry.npmjs.org/open/-/open-7.4.2.tgz", - "integrity": "sha512-MVHddDVweXZF3awtlAS+6pgKLlm/JgxZ90+/NBurBoQctVOOB/zDdVjcyPzQ+0laDGbsWgrRkflI65sQeOgT9Q==", + "node_modules/array.prototype.flatmap": { + "version": "1.3.2", "dev": true, "license": "MIT", "dependencies": { - "is-docker": "^2.0.0", - "is-wsl": "^2.1.1" + "call-bind": "^1.0.2", + "define-properties": "^1.2.0", + "es-abstract": "^1.22.1", + "es-shim-unscopables": "^1.0.0" }, "engines": { - "node": ">=8" + "node": ">= 0.4" }, "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/opener": { - "version": "1.5.2", - "resolved": "https://registry.npmjs.org/opener/-/opener-1.5.2.tgz", - "integrity": "sha512-ur5UIdyw5Y7yEj9wLzhqXiy6GZ3Mwx0yGI+5sMn2r0N0v3cKJvUmFH5yPP+WXh9e0xfyzyJX95D8l088DNFj7A==", - "license": "(WTFPL OR MIT)", - "bin": { - "opener": "bin/opener-bin.js" + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/optimize-css-assets-webpack-plugin": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/optimize-css-assets-webpack-plugin/-/optimize-css-assets-webpack-plugin-6.0.1.tgz", - "integrity": "sha512-BshV2UZPfggZLdUfN3zFBbG4sl/DynUI+YCB6fRRDWaqO2OiWN8GPcp4Y0/fEV6B3k9Hzyk3czve3V/8B/SzKQ==", + "node_modules/array.prototype.tosorted": { + "version": "1.1.4", "dev": true, "license": "MIT", "dependencies": { - "cssnano": "^5.0.2", - "last-call-webpack-plugin": "^3.0.0", - "postcss": "^8.2.1" + "call-bind": "^1.0.7", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.3", + "es-errors": "^1.3.0", + "es-shim-unscopables": "^1.0.2" }, - "peerDependencies": { - "webpack": "^4.0.0" - } - }, - "node_modules/optimize-css-assets-webpack-plugin/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/optimize-css-assets-webpack-plugin/node_modules/css-declaration-sorter": { - "version": "6.4.1", - "resolved": "https://registry.npmjs.org/css-declaration-sorter/-/css-declaration-sorter-6.4.1.tgz", - "integrity": "sha512-rtdthzxKuyq6IzqX6jEcIzQF/YqccluefyCYheovBOLhFT/drQA9zj/UbRAa9J7C0o6EG6u3E6g+vKkay7/k3g==", - "dev": true, - "license": "ISC", "engines": { - "node": "^10 || ^12 || >=14" - }, - "peerDependencies": { - "postcss": "^8.0.9" + "node": ">= 0.4" } }, - "node_modules/optimize-css-assets-webpack-plugin/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==", + "node_modules/arraybuffer.prototype.slice": { + "version": "1.0.3", "dev": true, - "license": "BSD-2-Clause", + "license": "MIT", "dependencies": { - "boolbase": "^1.0.0", - "css-what": "^6.0.1", - "domhandler": "^4.3.1", - "domutils": "^2.8.0", - "nth-check": "^2.0.1" + "array-buffer-byte-length": "^1.0.1", + "call-bind": "^1.0.5", + "define-properties": "^1.2.1", + "es-abstract": "^1.22.3", + "es-errors": "^1.2.1", + "get-intrinsic": "^1.2.3", + "is-array-buffer": "^3.0.4", + "is-shared-array-buffer": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" }, "funding": { - "url": "https://github.com/sponsors/fb55" + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/optimize-css-assets-webpack-plugin/node_modules/css-tree": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/css-tree/-/css-tree-1.1.3.tgz", - "integrity": "sha512-tRpdppF7TRazZrjJ6v3stzv93qxRcSsFmW6cX0Zm2NVKpxE1WV1HblnghVv9TreireHkqI/VDEsfolRF1p6y7Q==", - "dev": true, + "node_modules/asn1": { + "version": "0.2.6", "license": "MIT", "dependencies": { - "mdn-data": "2.0.14", - "source-map": "^0.6.1" - }, - "engines": { - "node": ">=8.0.0" + "safer-buffer": "~2.1.0" } }, - "node_modules/optimize-css-assets-webpack-plugin/node_modules/cssnano": { - "version": "5.1.15", - "resolved": "https://registry.npmjs.org/cssnano/-/cssnano-5.1.15.tgz", - "integrity": "sha512-j+BKgDcLDQA+eDifLx0EO4XSA56b7uut3BQFH+wbSaSTuGLuiyTa/wbRYthUXX8LC9mLg+WWKe8h+qJuwTAbHw==", - "dev": true, + "node_modules/asn1.js": { + "version": "5.4.1", "license": "MIT", "dependencies": { - "cssnano-preset-default": "^5.2.14", - "lilconfig": "^2.0.3", - "yaml": "^1.10.2" - }, - "engines": { - "node": "^10 || ^12 || >=14.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/cssnano" - }, - "peerDependencies": { - "postcss": "^8.2.15" - } - }, - "node_modules/optimize-css-assets-webpack-plugin/node_modules/cssnano-preset-default": { - "version": "5.2.14", - "resolved": "https://registry.npmjs.org/cssnano-preset-default/-/cssnano-preset-default-5.2.14.tgz", - "integrity": "sha512-t0SFesj/ZV2OTylqQVOrFgEh5uanxbO6ZAdeCrNsUQ6fVuXwYTxJPNAGvGTxHbD68ldIJNec7PyYZDBrfDQ+6A==", - "dev": true, - "license": "MIT", - "dependencies": { - "css-declaration-sorter": "^6.3.1", - "cssnano-utils": "^3.1.0", - "postcss-calc": "^8.2.3", - "postcss-colormin": "^5.3.1", - "postcss-convert-values": "^5.1.3", - "postcss-discard-comments": "^5.1.2", - "postcss-discard-duplicates": "^5.1.0", - "postcss-discard-empty": "^5.1.1", - "postcss-discard-overridden": "^5.1.0", - "postcss-merge-longhand": "^5.1.7", - "postcss-merge-rules": "^5.1.4", - "postcss-minify-font-values": "^5.1.0", - "postcss-minify-gradients": "^5.1.1", - "postcss-minify-params": "^5.1.4", - "postcss-minify-selectors": "^5.2.1", - "postcss-normalize-charset": "^5.1.0", - "postcss-normalize-display-values": "^5.1.0", - "postcss-normalize-positions": "^5.1.1", - "postcss-normalize-repeat-style": "^5.1.1", - "postcss-normalize-string": "^5.1.0", - "postcss-normalize-timing-functions": "^5.1.0", - "postcss-normalize-unicode": "^5.1.1", - "postcss-normalize-url": "^5.1.0", - "postcss-normalize-whitespace": "^5.1.1", - "postcss-ordered-values": "^5.1.3", - "postcss-reduce-initial": "^5.1.2", - "postcss-reduce-transforms": "^5.1.0", - "postcss-svgo": "^5.1.0", - "postcss-unique-selectors": "^5.1.1" - }, - "engines": { - "node": "^10 || ^12 || >=14.0" - }, - "peerDependencies": { - "postcss": "^8.2.15" + "bn.js": "^4.0.0", + "inherits": "^2.0.1", + "minimalistic-assert": "^1.0.0", + "safer-buffer": "^2.1.0" } }, - "node_modules/optimize-css-assets-webpack-plugin/node_modules/cssnano-utils": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/cssnano-utils/-/cssnano-utils-3.1.0.tgz", - "integrity": "sha512-JQNR19/YZhz4psLX/rQ9M83e3z2Wf/HdJbryzte4a3NSuafyp9w/I4U+hx5C2S9g41qlstH7DEWnZaaj83OuEA==", - "dev": true, + "node_modules/assert-plus": { + "version": "1.0.0", "license": "MIT", "engines": { - "node": "^10 || ^12 || >=14.0" - }, - "peerDependencies": { - "postcss": "^8.2.15" + "node": ">=0.8" } }, - "node_modules/optimize-css-assets-webpack-plugin/node_modules/csso": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/csso/-/csso-4.2.0.tgz", - "integrity": "sha512-wvlcdIbf6pwKEk7vHj8/Bkc0B4ylXZruLvOgs9doS5eOsOpuodOV2zJChSpkp+pRpYQLQMeF04nr3Z68Sta9jA==", - "dev": true, + "node_modules/ast-kit": { + "version": "1.3.0", "license": "MIT", "dependencies": { - "css-tree": "^1.1.2" + "@babel/parser": "^7.25.8", + "pathe": "^1.1.2" }, "engines": { - "node": ">=8.0.0" + "node": ">=16.14.0" } }, - "node_modules/optimize-css-assets-webpack-plugin/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, + "node_modules/ast-walker-scope": { + "version": "0.6.2", "license": "MIT", "dependencies": { - "domelementtype": "^2.0.1", - "domhandler": "^4.2.0", - "entities": "^2.0.0" + "@babel/parser": "^7.25.3", + "ast-kit": "^1.0.1" }, - "funding": { - "url": "https://github.com/cheeriojs/dom-serializer?sponsor=1" + "engines": { + "node": ">=16.14.0" } }, - "node_modules/optimize-css-assets-webpack-plugin/node_modules/domhandler": { - "version": "4.3.1", - "resolved": "https://registry.npmjs.org/domhandler/-/domhandler-4.3.1.tgz", - "integrity": "sha512-GrwoxYN+uWlzO8uhUXRl0P+kHE4GtVPfYzVLcUxPL7KNdHKj66vvlhiweIHqYYXWlw+T8iLMp42Lm67ghw4WMQ==", + "node_modules/async": { + "version": "3.2.6", + "license": "MIT" + }, + "node_modules/asynckit": { + "version": "0.4.0", + "license": "MIT" + }, + "node_modules/available-typed-arrays": { + "version": "1.0.7", "dev": true, - "license": "BSD-2-Clause", + "license": "MIT", "dependencies": { - "domelementtype": "^2.2.0" + "possible-typed-array-names": "^1.0.0" }, "engines": { - "node": ">= 4" + "node": ">= 0.4" }, "funding": { - "url": "https://github.com/fb55/domhandler?sponsor=1" + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/optimize-css-assets-webpack-plugin/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", + "node_modules/axios": { + "version": "1.7.7", + "license": "MIT", "dependencies": { - "dom-serializer": "^1.0.1", - "domelementtype": "^2.2.0", - "domhandler": "^4.2.0" - }, - "funding": { - "url": "https://github.com/fb55/domutils?sponsor=1" + "follow-redirects": "^1.15.6", + "form-data": "^4.0.0", + "proxy-from-env": "^1.1.0" } }, - "node_modules/optimize-css-assets-webpack-plugin/node_modules/lilconfig": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/lilconfig/-/lilconfig-2.1.0.tgz", - "integrity": "sha512-utWOt/GHzuUxnLKxB6dk81RoOeoNeHgbrXiuGk4yyF5qlRz+iIVWu56E2fqGHFrXz0QNUhLB/8nKqvRH66JKGQ==", - "dev": true, + "node_modules/backoff": { + "version": "2.5.0", "license": "MIT", + "dependencies": { + "precond": "0.2" + }, "engines": { - "node": ">=10" + "node": ">= 0.6" } }, - "node_modules/optimize-css-assets-webpack-plugin/node_modules/mdn-data": { - "version": "2.0.14", - "resolved": "https://registry.npmjs.org/mdn-data/-/mdn-data-2.0.14.tgz", - "integrity": "sha512-dn6wd0uw5GsdswPFfsgMp5NSB0/aDe6fK94YJV/AJDYXL6HVLWBsxeq7js7Ad+mU2K9LAlwpk6kN2D5mwCPVow==", - "dev": true, - "license": "CC0-1.0" + "node_modules/balanced-match": { + "version": "1.0.2", + "license": "MIT" }, - "node_modules/optimize-css-assets-webpack-plugin/node_modules/postcss-calc": { - "version": "8.2.4", - "resolved": "https://registry.npmjs.org/postcss-calc/-/postcss-calc-8.2.4.tgz", - "integrity": "sha512-SmWMSJmB8MRnnULldx0lQIyhSNvuDl9HfrZkaqqE/WHAhToYsAvDq+yAsA/kIyINDszOp3Rh0GFoNuH5Ypsm3Q==", + "node_modules/basic-auth": { + "version": "2.0.1", "dev": true, "license": "MIT", "dependencies": { - "postcss-selector-parser": "^6.0.9", - "postcss-value-parser": "^4.2.0" + "safe-buffer": "5.1.2" }, - "peerDependencies": { - "postcss": "^8.2.2" + "engines": { + "node": ">= 0.8" } }, - "node_modules/optimize-css-assets-webpack-plugin/node_modules/postcss-colormin": { - "version": "5.3.1", - "resolved": "https://registry.npmjs.org/postcss-colormin/-/postcss-colormin-5.3.1.tgz", - "integrity": "sha512-UsWQG0AqTFQmpBegeLLc1+c3jIqBNB0zlDGRWR+dQ3pRKJL1oeMzyqmH3o2PIfn9MBdNrVPWhDbT769LxCTLJQ==", + "node_modules/basic-auth/node_modules/safe-buffer": { + "version": "5.1.2", "dev": true, + "license": "MIT" + }, + "node_modules/binary-extensions": { + "version": "2.3.0", "license": "MIT", - "dependencies": { - "browserslist": "^4.21.4", - "caniuse-api": "^3.0.0", - "colord": "^2.9.1", - "postcss-value-parser": "^4.2.0" - }, "engines": { - "node": "^10 || ^12 || >=14.0" + "node": ">=8" }, - "peerDependencies": { - "postcss": "^8.2.15" + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/optimize-css-assets-webpack-plugin/node_modules/postcss-convert-values": { - "version": "5.1.3", - "resolved": "https://registry.npmjs.org/postcss-convert-values/-/postcss-convert-values-5.1.3.tgz", - "integrity": "sha512-82pC1xkJZtcJEfiLw6UXnXVXScgtBrjlO5CBmuDQc+dlb88ZYheFsjTn40+zBVi3DkfF7iezO0nJUPLcJK3pvA==", - "dev": true, + "node_modules/bintrees": { + "version": "1.0.2", + "license": "MIT" + }, + "node_modules/bn.js": { + "version": "4.12.0", + "license": "MIT" + }, + "node_modules/body-parser": { + "version": "2.0.1", "license": "MIT", "dependencies": { - "browserslist": "^4.21.4", - "postcss-value-parser": "^4.2.0" + "bytes": "3.1.2", + "content-type": "~1.0.5", + "debug": "3.1.0", + "destroy": "1.2.0", + "http-errors": "2.0.0", + "iconv-lite": "0.5.2", + "on-finished": "2.4.1", + "qs": "6.13.0", + "raw-body": "^3.0.0", + "type-is": "~1.6.18", + "unpipe": "1.0.0" }, "engines": { - "node": "^10 || ^12 || >=14.0" - }, - "peerDependencies": { - "postcss": "^8.2.15" + "node": ">= 0.10" } }, - "node_modules/optimize-css-assets-webpack-plugin/node_modules/postcss-discard-comments": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/postcss-discard-comments/-/postcss-discard-comments-5.1.2.tgz", - "integrity": "sha512-+L8208OVbHVF2UQf1iDmRcbdjJkuBF6IS29yBDSiWUIzpYaAhtNl6JYnYm12FnkeCwQqF5LeklOu6rAqgfBZqQ==", - "dev": true, + "node_modules/body-parser/node_modules/debug": { + "version": "3.1.0", "license": "MIT", - "engines": { - "node": "^10 || ^12 || >=14.0" - }, - "peerDependencies": { - "postcss": "^8.2.15" + "dependencies": { + "ms": "2.0.0" } }, - "node_modules/optimize-css-assets-webpack-plugin/node_modules/postcss-discard-duplicates": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/postcss-discard-duplicates/-/postcss-discard-duplicates-5.1.0.tgz", - "integrity": "sha512-zmX3IoSI2aoenxHV6C7plngHWWhUOV3sP1T8y2ifzxzbtnuhk1EdPwm0S1bIUNaJ2eNbWeGLEwzw8huPD67aQw==", - "dev": true, + "node_modules/body-parser/node_modules/media-typer": { + "version": "0.3.0", "license": "MIT", "engines": { - "node": "^10 || ^12 || >=14.0" - }, - "peerDependencies": { - "postcss": "^8.2.15" + "node": ">= 0.6" } }, - "node_modules/optimize-css-assets-webpack-plugin/node_modules/postcss-discard-empty": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/postcss-discard-empty/-/postcss-discard-empty-5.1.1.tgz", - "integrity": "sha512-zPz4WljiSuLWsI0ir4Mcnr4qQQ5e1Ukc3i7UfE2XcrwKK2LIPIqE5jxMRxO6GbI3cv//ztXDsXwEWT3BHOGh3A==", - "dev": true, + "node_modules/body-parser/node_modules/mime-db": { + "version": "1.52.0", "license": "MIT", "engines": { - "node": "^10 || ^12 || >=14.0" - }, - "peerDependencies": { - "postcss": "^8.2.15" + "node": ">= 0.6" } }, - "node_modules/optimize-css-assets-webpack-plugin/node_modules/postcss-discard-overridden": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/postcss-discard-overridden/-/postcss-discard-overridden-5.1.0.tgz", - "integrity": "sha512-21nOL7RqWR1kasIVdKs8HNqQJhFxLsyRfAnUDm4Fe4t4mCWL9OJiHvlHPjcd8zc5Myu89b/7wZDnOSjFgeWRtw==", - "dev": true, + "node_modules/body-parser/node_modules/mime-types": { + "version": "2.1.35", "license": "MIT", - "engines": { - "node": "^10 || ^12 || >=14.0" + "dependencies": { + "mime-db": "1.52.0" }, - "peerDependencies": { - "postcss": "^8.2.15" + "engines": { + "node": ">= 0.6" } }, - "node_modules/optimize-css-assets-webpack-plugin/node_modules/postcss-merge-longhand": { - "version": "5.1.7", - "resolved": "https://registry.npmjs.org/postcss-merge-longhand/-/postcss-merge-longhand-5.1.7.tgz", - "integrity": "sha512-YCI9gZB+PLNskrK0BB3/2OzPnGhPkBEwmwhfYk1ilBHYVAZB7/tkTHFBAnCrvBBOmeYyMYw3DMjT55SyxMBzjQ==", - "dev": true, + "node_modules/body-parser/node_modules/ms": { + "version": "2.0.0", + "license": "MIT" + }, + "node_modules/body-parser/node_modules/type-is": { + "version": "1.6.18", "license": "MIT", "dependencies": { - "postcss-value-parser": "^4.2.0", - "stylehacks": "^5.1.1" + "media-typer": "0.3.0", + "mime-types": "~2.1.24" }, "engines": { - "node": "^10 || ^12 || >=14.0" - }, - "peerDependencies": { - "postcss": "^8.2.15" + "node": ">= 0.6" } }, - "node_modules/optimize-css-assets-webpack-plugin/node_modules/postcss-merge-rules": { - "version": "5.1.4", - "resolved": "https://registry.npmjs.org/postcss-merge-rules/-/postcss-merge-rules-5.1.4.tgz", - "integrity": "sha512-0R2IuYpgU93y9lhVbO/OylTtKMVcHb67zjWIfCiKR9rWL3GUk1677LAqD/BcHizukdZEjT8Ru3oHRoAYoJy44g==", - "dev": true, + "node_modules/boolbase": { + "version": "1.0.0", + "license": "ISC" + }, + "node_modules/boolean": { + "version": "3.2.0", + "license": "MIT" + }, + "node_modules/brace-expansion": { + "version": "2.0.1", "license": "MIT", "dependencies": { - "browserslist": "^4.21.4", - "caniuse-api": "^3.0.0", - "cssnano-utils": "^3.1.0", - "postcss-selector-parser": "^6.0.5" - }, - "engines": { - "node": "^10 || ^12 || >=14.0" - }, - "peerDependencies": { - "postcss": "^8.2.15" + "balanced-match": "^1.0.0" } }, - "node_modules/optimize-css-assets-webpack-plugin/node_modules/postcss-minify-font-values": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/postcss-minify-font-values/-/postcss-minify-font-values-5.1.0.tgz", - "integrity": "sha512-el3mYTgx13ZAPPirSVsHqFzl+BBBDrXvbySvPGFnQcTI4iNslrPaFq4muTkLZmKlGk4gyFAYUBMH30+HurREyA==", - "dev": true, + "node_modules/braces": { + "version": "3.0.3", "license": "MIT", "dependencies": { - "postcss-value-parser": "^4.2.0" + "fill-range": "^7.1.1" }, "engines": { - "node": "^10 || ^12 || >=14.0" - }, - "peerDependencies": { - "postcss": "^8.2.15" + "node": ">=8" } }, - "node_modules/optimize-css-assets-webpack-plugin/node_modules/postcss-minify-gradients": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/postcss-minify-gradients/-/postcss-minify-gradients-5.1.1.tgz", - "integrity": "sha512-VGvXMTpCEo4qHTNSa9A0a3D+dxGFZCYwR6Jokk+/3oB6flu2/PnPXAh2x7x52EkY5xlIHLm+Le8tJxe/7TNhzw==", - "dev": true, - "license": "MIT", - "dependencies": { - "colord": "^2.9.1", - "cssnano-utils": "^3.1.0", - "postcss-value-parser": "^4.2.0" - }, + "node_modules/bson": { + "version": "6.8.0", + "license": "Apache-2.0", "engines": { - "node": "^10 || ^12 || >=14.0" - }, - "peerDependencies": { - "postcss": "^8.2.15" + "node": ">=16.20.1" } }, - "node_modules/optimize-css-assets-webpack-plugin/node_modules/postcss-minify-params": { - "version": "5.1.4", - "resolved": "https://registry.npmjs.org/postcss-minify-params/-/postcss-minify-params-5.1.4.tgz", - "integrity": "sha512-+mePA3MgdmVmv6g+30rn57USjOGSAyuxUmkfiWpzalZ8aiBkdPYjXWtHuwJGm1v5Ojy0Z0LaSYhHaLJQB0P8Jw==", - "dev": true, - "license": "MIT", + "node_modules/buffer-builder": { + "version": "0.2.0", + "license": "MIT/X11" + }, + "node_modules/buffer-equal-constant-time": { + "version": "1.0.1", + "license": "BSD-3-Clause" + }, + "node_modules/buffer-from": { + "version": "1.1.2", + "license": "MIT" + }, + "node_modules/busboy": { + "version": "1.6.0", "dependencies": { - "browserslist": "^4.21.4", - "cssnano-utils": "^3.1.0", - "postcss-value-parser": "^4.2.0" + "streamsearch": "^1.1.0" }, "engines": { - "node": "^10 || ^12 || >=14.0" - }, - "peerDependencies": { - "postcss": "^8.2.15" + "node": ">=10.16.0" } }, - "node_modules/optimize-css-assets-webpack-plugin/node_modules/postcss-minify-selectors": { - "version": "5.2.1", - "resolved": "https://registry.npmjs.org/postcss-minify-selectors/-/postcss-minify-selectors-5.2.1.tgz", - "integrity": "sha512-nPJu7OjZJTsVUmPdm2TcaiohIwxP+v8ha9NehQ2ye9szv4orirRU3SDdtUmKH+10nzn0bAyOXZ0UEr7OpvLehg==", - "dev": true, + "node_modules/bytes": { + "version": "3.1.2", "license": "MIT", - "dependencies": { - "postcss-selector-parser": "^6.0.5" - }, "engines": { - "node": "^10 || ^12 || >=14.0" - }, - "peerDependencies": { - "postcss": "^8.2.15" + "node": ">= 0.8" } }, - "node_modules/optimize-css-assets-webpack-plugin/node_modules/postcss-normalize-charset": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/postcss-normalize-charset/-/postcss-normalize-charset-5.1.0.tgz", - "integrity": "sha512-mSgUJ+pd/ldRGVx26p2wz9dNZ7ji6Pn8VWBajMXFf8jk7vUoSrZ2lt/wZR7DtlZYKesmZI680qjr2CeFF2fbUg==", - "dev": true, + "node_modules/cacheable-lookup": { + "version": "7.0.0", "license": "MIT", "engines": { - "node": "^10 || ^12 || >=14.0" - }, - "peerDependencies": { - "postcss": "^8.2.15" + "node": ">=14.16" } }, - "node_modules/optimize-css-assets-webpack-plugin/node_modules/postcss-normalize-display-values": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/postcss-normalize-display-values/-/postcss-normalize-display-values-5.1.0.tgz", - "integrity": "sha512-WP4KIM4o2dazQXWmFaqMmcvsKmhdINFblgSeRgn8BJ6vxaMyaJkwAzpPpuvSIoG/rmX3M+IrRZEz2H0glrQNEA==", - "dev": true, + "node_modules/call-bind": { + "version": "1.0.7", "license": "MIT", "dependencies": { - "postcss-value-parser": "^4.2.0" + "es-define-property": "^1.0.0", + "es-errors": "^1.3.0", + "function-bind": "^1.1.2", + "get-intrinsic": "^1.2.4", + "set-function-length": "^1.2.1" }, "engines": { - "node": "^10 || ^12 || >=14.0" + "node": ">= 0.4" }, - "peerDependencies": { - "postcss": "^8.2.15" + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/optimize-css-assets-webpack-plugin/node_modules/postcss-normalize-positions": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/postcss-normalize-positions/-/postcss-normalize-positions-5.1.1.tgz", - "integrity": "sha512-6UpCb0G4eofTCQLFVuI3EVNZzBNPiIKcA1AKVka+31fTVySphr3VUgAIULBhxZkKgwLImhzMR2Bw1ORK+37INg==", - "dev": true, + "node_modules/call-me-maybe": { + "version": "1.0.2", + "license": "MIT" + }, + "node_modules/callsites": { + "version": "3.1.0", "license": "MIT", - "dependencies": { - "postcss-value-parser": "^4.2.0" - }, "engines": { - "node": "^10 || ^12 || >=14.0" - }, - "peerDependencies": { - "postcss": "^8.2.15" + "node": ">=6" } }, - "node_modules/optimize-css-assets-webpack-plugin/node_modules/postcss-normalize-repeat-style": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/postcss-normalize-repeat-style/-/postcss-normalize-repeat-style-5.1.1.tgz", - "integrity": "sha512-mFpLspGWkQtBcWIRFLmewo8aC3ImN2i/J3v8YCFUwDnPu3Xz4rLohDO26lGjwNsQxB3YF0KKRwspGzE2JEuS0g==", - "dev": true, + "node_modules/camel-case": { + "version": "3.0.0", "license": "MIT", "dependencies": { - "postcss-value-parser": "^4.2.0" - }, - "engines": { - "node": "^10 || ^12 || >=14.0" - }, - "peerDependencies": { - "postcss": "^8.2.15" + "no-case": "^2.2.0", + "upper-case": "^1.1.1" } }, - "node_modules/optimize-css-assets-webpack-plugin/node_modules/postcss-normalize-string": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/postcss-normalize-string/-/postcss-normalize-string-5.1.0.tgz", - "integrity": "sha512-oYiIJOf4T9T1N4i+abeIc7Vgm/xPCGih4bZz5Nm0/ARVJ7K6xrDlLwvwqOydvyL3RHNf8qZk6vo3aatiw/go3w==", - "dev": true, + "node_modules/camelcase": { + "version": "5.3.1", "license": "MIT", - "dependencies": { - "postcss-value-parser": "^4.2.0" - }, "engines": { - "node": "^10 || ^12 || >=14.0" - }, - "peerDependencies": { - "postcss": "^8.2.15" + "node": ">=6" } }, - "node_modules/optimize-css-assets-webpack-plugin/node_modules/postcss-normalize-timing-functions": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/postcss-normalize-timing-functions/-/postcss-normalize-timing-functions-5.1.0.tgz", - "integrity": "sha512-DOEkzJ4SAXv5xkHl0Wa9cZLF3WCBhF3o1SKVxKQAa+0pYKlueTpCgvkFAHfk+Y64ezX9+nITGrDZeVGgITJXjg==", - "dev": true, + "node_modules/capitalize": { + "version": "2.0.4", + "license": "MIT" + }, + "node_modules/chalk": { + "version": "4.1.2", "license": "MIT", "dependencies": { - "postcss-value-parser": "^4.2.0" + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" }, "engines": { - "node": "^10 || ^12 || >=14.0" + "node": ">=10" }, - "peerDependencies": { - "postcss": "^8.2.15" + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" } }, - "node_modules/optimize-css-assets-webpack-plugin/node_modules/postcss-normalize-unicode": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/postcss-normalize-unicode/-/postcss-normalize-unicode-5.1.1.tgz", - "integrity": "sha512-qnCL5jzkNUmKVhZoENp1mJiGNPcsJCs1aaRmURmeJGES23Z/ajaln+EPTD+rBeNkSryI+2WTdW+lwcVdOikrpA==", - "dev": true, + "node_modules/change-case": { + "version": "5.4.4", + "license": "MIT" + }, + "node_modules/cheerio": { + "version": "1.0.0-rc.12", "license": "MIT", "dependencies": { - "browserslist": "^4.21.4", - "postcss-value-parser": "^4.2.0" + "cheerio-select": "^2.1.0", + "dom-serializer": "^2.0.0", + "domhandler": "^5.0.3", + "domutils": "^3.0.1", + "htmlparser2": "^8.0.1", + "parse5": "^7.0.0", + "parse5-htmlparser2-tree-adapter": "^7.0.0" }, "engines": { - "node": "^10 || ^12 || >=14.0" + "node": ">= 6" }, - "peerDependencies": { - "postcss": "^8.2.15" + "funding": { + "url": "https://github.com/cheeriojs/cheerio?sponsor=1" } }, - "node_modules/optimize-css-assets-webpack-plugin/node_modules/postcss-normalize-url": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/postcss-normalize-url/-/postcss-normalize-url-5.1.0.tgz", - "integrity": "sha512-5upGeDO+PVthOxSmds43ZeMeZfKH+/DKgGRD7TElkkyS46JXAUhMzIKiCa7BabPeIy3AQcTkXwVVN7DbqsiCew==", - "dev": true, - "license": "MIT", + "node_modules/cheerio-select": { + "version": "2.1.0", + "license": "BSD-2-Clause", "dependencies": { - "normalize-url": "^6.0.1", - "postcss-value-parser": "^4.2.0" - }, - "engines": { - "node": "^10 || ^12 || >=14.0" + "boolbase": "^1.0.0", + "css-select": "^5.1.0", + "css-what": "^6.1.0", + "domelementtype": "^2.3.0", + "domhandler": "^5.0.3", + "domutils": "^3.0.1" }, - "peerDependencies": { - "postcss": "^8.2.15" + "funding": { + "url": "https://github.com/sponsors/fb55" } }, - "node_modules/optimize-css-assets-webpack-plugin/node_modules/postcss-normalize-whitespace": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/postcss-normalize-whitespace/-/postcss-normalize-whitespace-5.1.1.tgz", - "integrity": "sha512-83ZJ4t3NUDETIHTa3uEg6asWjSBYL5EdkVB0sDncx9ERzOKBVJIUeDO9RyA9Zwtig8El1d79HBp0JEi8wvGQnA==", - "dev": true, + "node_modules/chokidar": { + "version": "3.6.0", "license": "MIT", "dependencies": { - "postcss-value-parser": "^4.2.0" + "anymatch": "~3.1.2", + "braces": "~3.0.2", + "glob-parent": "~5.1.2", + "is-binary-path": "~2.1.0", + "is-glob": "~4.0.1", + "normalize-path": "~3.0.0", + "readdirp": "~3.6.0" }, "engines": { - "node": "^10 || ^12 || >=14.0" + "node": ">= 8.10.0" }, - "peerDependencies": { - "postcss": "^8.2.15" + "funding": { + "url": "https://paulmillr.com/funding/" + }, + "optionalDependencies": { + "fsevents": "~2.3.2" } }, - "node_modules/optimize-css-assets-webpack-plugin/node_modules/postcss-ordered-values": { - "version": "5.1.3", - "resolved": "https://registry.npmjs.org/postcss-ordered-values/-/postcss-ordered-values-5.1.3.tgz", - "integrity": "sha512-9UO79VUhPwEkzbb3RNpqqghc6lcYej1aveQteWY+4POIwlqkYE21HKWaLDF6lWNuqCobEAyTovVhtI32Rbv2RQ==", - "dev": true, - "license": "MIT", + "node_modules/chokidar/node_modules/glob-parent": { + "version": "5.1.2", + "license": "ISC", "dependencies": { - "cssnano-utils": "^3.1.0", - "postcss-value-parser": "^4.2.0" + "is-glob": "^4.0.1" }, "engines": { - "node": "^10 || ^12 || >=14.0" - }, - "peerDependencies": { - "postcss": "^8.2.15" + "node": ">= 6" } }, - "node_modules/optimize-css-assets-webpack-plugin/node_modules/postcss-reduce-initial": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/postcss-reduce-initial/-/postcss-reduce-initial-5.1.2.tgz", - "integrity": "sha512-dE/y2XRaqAi6OvjzD22pjTUQ8eOfc6m/natGHgKFBK9DxFmIm69YmaRVQrGgFlEfc1HePIurY0TmDeROK05rIg==", - "dev": true, + "node_modules/clean-css": { + "version": "4.2.4", "license": "MIT", "dependencies": { - "browserslist": "^4.21.4", - "caniuse-api": "^3.0.0" + "source-map": "~0.6.0" }, "engines": { - "node": "^10 || ^12 || >=14.0" - }, - "peerDependencies": { - "postcss": "^8.2.15" + "node": ">= 4.0" } }, - "node_modules/optimize-css-assets-webpack-plugin/node_modules/postcss-reduce-transforms": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/postcss-reduce-transforms/-/postcss-reduce-transforms-5.1.0.tgz", - "integrity": "sha512-2fbdbmgir5AvpW9RLtdONx1QoYG2/EtqpNQbFASDlixBbAYuTcJ0dECwlqNqH7VbaUnEnh8SrxOe2sRIn24XyQ==", - "dev": true, - "license": "MIT", + "node_modules/cliui": { + "version": "8.0.1", + "license": "ISC", "dependencies": { - "postcss-value-parser": "^4.2.0" + "string-width": "^4.2.0", + "strip-ansi": "^6.0.1", + "wrap-ansi": "^7.0.0" }, "engines": { - "node": "^10 || ^12 || >=14.0" - }, - "peerDependencies": { - "postcss": "^8.2.15" + "node": ">=12" } }, - "node_modules/optimize-css-assets-webpack-plugin/node_modules/postcss-svgo": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/postcss-svgo/-/postcss-svgo-5.1.0.tgz", - "integrity": "sha512-D75KsH1zm5ZrHyxPakAxJWtkyXew5qwS70v56exwvw542d9CRtTo78K0WeFxZB4G7JXKKMbEZtZayTGdIky/eA==", - "dev": true, + "node_modules/color-convert": { + "version": "2.0.1", "license": "MIT", "dependencies": { - "postcss-value-parser": "^4.2.0", - "svgo": "^2.7.0" + "color-name": "~1.1.4" }, "engines": { - "node": "^10 || ^12 || >=14.0" - }, - "peerDependencies": { - "postcss": "^8.2.15" + "node": ">=7.0.0" } }, - "node_modules/optimize-css-assets-webpack-plugin/node_modules/postcss-unique-selectors": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/postcss-unique-selectors/-/postcss-unique-selectors-5.1.1.tgz", - "integrity": "sha512-5JiODlELrz8L2HwxfPnhOWZYWDxVHWL83ufOv84NrcgipI7TaeRsatAhK4Tr2/ZiYldpK/wBvw5BD3qfaK96GA==", - "dev": true, + "node_modules/color-name": { + "version": "1.1.4", + "license": "MIT" + }, + "node_modules/colorjs.io": { + "version": "0.5.2", + "license": "MIT" + }, + "node_modules/combined-stream": { + "version": "1.0.8", "license": "MIT", "dependencies": { - "postcss-selector-parser": "^6.0.5" + "delayed-stream": "~1.0.0" }, "engines": { - "node": "^10 || ^12 || >=14.0" - }, - "peerDependencies": { - "postcss": "^8.2.15" + "node": ">= 0.8" } }, - "node_modules/optimize-css-assets-webpack-plugin/node_modules/stylehacks": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/stylehacks/-/stylehacks-5.1.1.tgz", - "integrity": "sha512-sBpcd5Hx7G6seo7b1LkpttvTz7ikD0LlH5RmdcBNb6fFR0Fl7LQwHDFr300q4cwUqi+IYrFGmsIHieMBfnN/Bw==", - "dev": true, + "node_modules/commander": { + "version": "12.1.0", "license": "MIT", - "dependencies": { - "browserslist": "^4.21.4", - "postcss-selector-parser": "^6.0.4" - }, "engines": { - "node": "^10 || ^12 || >=14.0" - }, - "peerDependencies": { - "postcss": "^8.2.15" + "node": ">=18" } }, - "node_modules/optimize-css-assets-webpack-plugin/node_modules/svgo": { - "version": "2.8.0", - "resolved": "https://registry.npmjs.org/svgo/-/svgo-2.8.0.tgz", - "integrity": "sha512-+N/Q9kV1+F+UeWYoSiULYo4xYSDQlTgb+ayMobAXPwMnLvop7oxKMo9OzIrX5x3eS4L4f2UHhc9axXwY8DpChg==", + "node_modules/commitlint": { + "version": "19.5.0", "dev": true, "license": "MIT", "dependencies": { - "@trysound/sax": "0.2.0", - "commander": "^7.2.0", - "css-select": "^4.1.3", - "css-tree": "^1.1.3", - "csso": "^4.2.0", - "picocolors": "^1.0.0", - "stable": "^0.1.8" + "@commitlint/cli": "^19.5.0", + "@commitlint/types": "^19.5.0" }, "bin": { - "svgo": "bin/svgo" + "commitlint": "cli.js" }, "engines": { - "node": ">=10.13.0" + "node": ">=v18" } }, - "node_modules/optionator": { - "version": "0.9.4", - "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.9.4.tgz", - "integrity": "sha512-6IpQ7mKUxRcZNLIObR0hz7lxsapSSIYNZJwXPGeF0mTVqGKFIXj1DQcMoT22S3ROcLyY/rz0PWaWZ9ayWmad9g==", + "node_modules/compare-func": { + "version": "2.0.0", "dev": true, "license": "MIT", "dependencies": { - "deep-is": "^0.1.3", - "fast-levenshtein": "^2.0.6", - "levn": "^0.4.1", - "prelude-ls": "^1.2.1", - "type-check": "^0.4.0", - "word-wrap": "^1.2.5" - }, - "engines": { - "node": ">= 0.8.0" + "array-ify": "^1.0.0", + "dot-prop": "^5.1.0" } }, - "node_modules/os-browserify": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/os-browserify/-/os-browserify-0.3.0.tgz", - "integrity": "sha512-gjcpUc3clBf9+210TRaDWbf+rZZZEshZ+DlXMRCeAjp0xhTrnQsKHypIy1J3d5hKdUzj69t708EHtU8P6bUn0A==", - "dev": true, + "node_modules/concat-map": { + "version": "0.0.1", "license": "MIT" }, - "node_modules/os-tmpdir": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/os-tmpdir/-/os-tmpdir-1.0.2.tgz", - "integrity": "sha512-D2FR03Vir7FIu45XBY20mTb+/ZSWB00sjU9jdQXt83gDrI4Ztz5Fs7/yy74g2N5SVQY4xY1qDr4rNddwYRVX0g==", - "license": "MIT", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/otplib": { - "version": "12.0.1", - "resolved": "https://registry.npmjs.org/otplib/-/otplib-12.0.1.tgz", - "integrity": "sha512-xDGvUOQjop7RDgxTQ+o4pOol0/3xSZzawTiPKRrHnQWAy0WjhNs/5HdIDJCrqC4MBynmjXgULc6YfioaxZeFgg==", + "node_modules/concat-stream": { + "version": "1.6.2", + "engines": [ + "node >= 0.8" + ], "license": "MIT", "dependencies": { - "@otplib/core": "^12.0.1", - "@otplib/preset-default": "^12.0.1", - "@otplib/preset-v11": "^12.0.1" + "buffer-from": "^1.0.0", + "inherits": "^2.0.3", + "readable-stream": "^2.2.2", + "typedarray": "^0.0.6" } }, - "node_modules/p-cancelable": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/p-cancelable/-/p-cancelable-2.1.1.tgz", - "integrity": "sha512-BZOr3nRQHOntUjTrH8+Lh54smKHoHyur8We1V8DSMVrl5A2malOOwuJRnKRDjSnkoeBh4at6BwEnb5I7Jl31wg==", - "dev": true, + "node_modules/confbox": { + "version": "0.1.8", + "license": "MIT" + }, + "node_modules/config": { + "version": "3.3.12", "license": "MIT", + "dependencies": { + "json5": "^2.2.3" + }, "engines": { - "node": ">=8" + "node": ">= 10.0.0" } }, - "node_modules/p-finally": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/p-finally/-/p-finally-1.0.0.tgz", - "integrity": "sha512-LICb2p9CB7FS+0eR1oqWnHhp0FljGLZCWBE9aix0Uye9W8LTQPwMTYVGWQWIw9RdQiDg4+epXQODwIYJtSJaow==", + "node_modules/config-chain": { + "version": "1.1.13", "license": "MIT", - "engines": { - "node": ">=4" + "dependencies": { + "ini": "^1.3.4", + "proto-list": "~1.2.1" } }, - "node_modules/p-limit": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz", - "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==", - "dev": true, + "node_modules/config-chain/node_modules/ini": { + "version": "1.3.8", + "license": "ISC" + }, + "node_modules/content-disposition": { + "version": "1.0.0", "license": "MIT", "dependencies": { - "yocto-queue": "^0.1.0" + "safe-buffer": "5.2.1" }, "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "node": ">= 0.6" } }, - "node_modules/p-locate": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-5.0.0.tgz", - "integrity": "sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==", - "dev": true, + "node_modules/content-type": { + "version": "1.0.5", "license": "MIT", - "dependencies": { - "p-limit": "^3.0.2" - }, "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "node": ">= 0.6" } }, - "node_modules/p-map": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/p-map/-/p-map-3.0.0.tgz", - "integrity": "sha512-d3qXVTF/s+W+CdJ5A29wywV2n8CQQYahlgz2bFiA+4eVNJbHJodPZ+/gXwPGh0bOqA+j8S+6+ckmvLGPk1QpxQ==", + "node_modules/conventional-changelog-angular": { + "version": "7.0.0", "dev": true, - "license": "MIT", + "license": "ISC", "dependencies": { - "aggregate-error": "^3.0.0" + "compare-func": "^2.0.0" }, "engines": { - "node": ">=8" + "node": ">=16" } }, - "node_modules/p-timeout": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/p-timeout/-/p-timeout-3.2.0.tgz", - "integrity": "sha512-rhIwUycgwwKcP9yTOOFK/AKsAopjjCakVqLHePO3CC6Mir1Z99xT+R63jZxAT5lFZLa2inS5h+ZS2GvR99/FBg==", - "license": "MIT", + "node_modules/conventional-changelog-conventionalcommits": { + "version": "7.0.2", + "dev": true, + "license": "ISC", "dependencies": { - "p-finally": "^1.0.0" + "compare-func": "^2.0.0" }, "engines": { - "node": ">=8" + "node": ">=16" } }, - "node_modules/p-try": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz", - "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==", + "node_modules/conventional-commits-parser": { + "version": "5.0.0", + "dev": true, "license": "MIT", + "dependencies": { + "is-text-path": "^2.0.0", + "JSONStream": "^1.3.5", + "meow": "^12.0.1", + "split2": "^4.0.0" + }, + "bin": { + "conventional-commits-parser": "cli.mjs" + }, "engines": { - "node": ">=6" + "node": ">=16" } }, - "node_modules/p-wait-for": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/p-wait-for/-/p-wait-for-3.2.0.tgz", - "integrity": "sha512-wpgERjNkLrBiFmkMEjuZJEWKKDrNfHCKA1OhyN1wg1FrLkULbviEy6py1AyJUgZ72YWFbZ38FIpnqvVqAlDUwA==", + "node_modules/cookie": { + "version": "0.7.2", "license": "MIT", - "dependencies": { - "p-timeout": "^3.0.0" - }, "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "node": ">= 0.6" } }, - "node_modules/package-hash": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/package-hash/-/package-hash-4.0.0.tgz", - "integrity": "sha512-whdkPIooSu/bASggZ96BWVvZTRMOFxnyUG5PnTSGKoJE2gd5mbVNmR2Nj20QFzxYYgAXpoqC+AiXzl+UMRh7zQ==", - "dev": true, - "license": "ISC", + "node_modules/cookie-parser": { + "version": "1.4.7", + "license": "MIT", "dependencies": { - "graceful-fs": "^4.1.15", - "hasha": "^5.0.0", - "lodash.flattendeep": "^4.4.0", - "release-zalgo": "^1.0.0" + "cookie": "0.7.2", + "cookie-signature": "1.0.6" }, "engines": { - "node": ">=8" + "node": ">= 0.8.0" } }, - "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==", - "license": "BlueOak-1.0.0" - }, - "node_modules/pako": { - "version": "1.0.11", - "resolved": "https://registry.npmjs.org/pako/-/pako-1.0.11.tgz", - "integrity": "sha512-4hLB8Py4zZce5s4yd9XzopqwVv/yGNhV1Bl8NTmCq1763HeK2+EwVTv+leGeL13Dnh2wfbqowVPXCIO0z4taYw==", - "license": "(MIT AND Zlib)" + "node_modules/cookie-parser/node_modules/cookie-signature": { + "version": "1.0.6", + "license": "MIT" }, - "node_modules/parallel-transform": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/parallel-transform/-/parallel-transform-1.2.0.tgz", - "integrity": "sha512-P2vSmIu38uIlvdcU7fDkyrxj33gTUy/ABO5ZUbGowxNCopBq/OoD42bP4UmMrJoPyk4Uqf0mu3mtWBhHCZD8yg==", - "dev": true, + "node_modules/cookie-signature": { + "version": "1.2.1", "license": "MIT", - "dependencies": { - "cyclist": "^1.0.1", - "inherits": "^2.0.3", - "readable-stream": "^2.1.5" + "engines": { + "node": ">=6.6.0" } }, - "node_modules/param-case": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/param-case/-/param-case-2.1.1.tgz", - "integrity": "sha512-eQE845L6ot89sk2N8liD8HAuH4ca6Vvr7VWAWwt7+kvvG5aBcPmmphQ68JsEG2qa9n1TykS2DLeMt363AAH8/w==", + "node_modules/cookies": { + "version": "0.9.1", "license": "MIT", "dependencies": { - "no-case": "^2.2.0" + "depd": "~2.0.0", + "keygrip": "~1.1.0" + }, + "engines": { + "node": ">= 0.8" } }, - "node_modules/parent-module": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz", - "integrity": "sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==", + "node_modules/core-util-is": { + "version": "1.0.3", + "license": "MIT" + }, + "node_modules/cors": { + "version": "2.8.5", "dev": true, "license": "MIT", "dependencies": { - "callsites": "^3.0.0" + "object-assign": "^4", + "vary": "^1" }, "engines": { - "node": ">=6" + "node": ">= 0.10" } }, - "node_modules/parse-asn1": { - "version": "5.1.7", - "resolved": "https://registry.npmjs.org/parse-asn1/-/parse-asn1-5.1.7.tgz", - "integrity": "sha512-CTM5kuWR3sx9IFamcl5ErfPl6ea/N8IYwiJ+vpeB2g+1iknv7zBl5uPwbMbRVznRVbrNY6lGuDoE5b30grmbqg==", + "node_modules/cosmiconfig": { + "version": "9.0.0", "dev": true, - "license": "ISC", + "license": "MIT", "dependencies": { - "asn1.js": "^4.10.1", - "browserify-aes": "^1.2.0", - "evp_bytestokey": "^1.0.3", - "hash-base": "~3.0", - "pbkdf2": "^3.1.2", - "safe-buffer": "^5.2.1" + "env-paths": "^2.2.1", + "import-fresh": "^3.3.0", + "js-yaml": "^4.1.0", + "parse-json": "^5.2.0" }, "engines": { - "node": ">= 0.10" + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/d-fischer" + }, + "peerDependencies": { + "typescript": ">=4.9.5" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } } }, - "node_modules/parse-asn1/node_modules/asn1.js": { - "version": "4.10.1", - "resolved": "https://registry.npmjs.org/asn1.js/-/asn1.js-4.10.1.tgz", - "integrity": "sha512-p32cOF5q0Zqs9uBiONKYLm6BClCoBCM5O9JfeUSlnQLBTxYdTK+pW+nXflm8UkKd2UYlEbYz5qEi0JuZR9ckSw==", + "node_modules/cosmiconfig-typescript-loader": { + "version": "5.0.0", "dev": true, "license": "MIT", "dependencies": { - "bn.js": "^4.0.0", - "inherits": "^2.0.1", - "minimalistic-assert": "^1.0.0" + "jiti": "^1.19.1" + }, + "engines": { + "node": ">=v16" + }, + "peerDependencies": { + "@types/node": "*", + "cosmiconfig": ">=8.2", + "typescript": ">=4" } }, - "node_modules/parse-git-config": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/parse-git-config/-/parse-git-config-3.0.0.tgz", - "integrity": "sha512-wXoQGL1D+2COYWCD35/xbiKma1Z15xvZL8cI25wvxzled58V51SJM04Urt/uznS900iQor7QO04SgdfT/XlbuA==", + "node_modules/cropperjs": { + "version": "1.6.2", + "license": "MIT" + }, + "node_modules/cross-spawn": { + "version": "7.0.3", "license": "MIT", "dependencies": { - "git-config-path": "^2.0.0", - "ini": "^1.3.5" + "path-key": "^3.1.0", + "shebang-command": "^2.0.0", + "which": "^2.0.1" }, "engines": { - "node": ">=8" + "node": ">= 8" } }, - "node_modules/parse-json": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-5.2.0.tgz", - "integrity": "sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg==", - "dev": true, - "license": "MIT", + "node_modules/css-select": { + "version": "5.1.0", + "license": "BSD-2-Clause", "dependencies": { - "@babel/code-frame": "^7.0.0", - "error-ex": "^1.3.1", - "json-parse-even-better-errors": "^2.3.0", - "lines-and-columns": "^1.1.6" + "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/css-what": { + "version": "6.1.0", + "license": "BSD-2-Clause", "engines": { - "node": ">=8" + "node": ">= 6" }, "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "url": "https://github.com/sponsors/fb55" } }, - "node_modules/parse-ms": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/parse-ms/-/parse-ms-2.1.0.tgz", - "integrity": "sha512-kHt7kzLoS9VBZfUsiKjv43mr91ea+U05EyKkEtqp7vNbHxmaVuEqN7XxeEVnGrMtYOAxGrDElSi96K7EgO1zCA==", + "node_modules/cssesc": { + "version": "3.0.0", "dev": true, "license": "MIT", + "bin": { + "cssesc": "bin/cssesc" + }, "engines": { - "node": ">=6" + "node": ">=4" } }, - "node_modules/parse-path": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/parse-path/-/parse-path-7.0.0.tgz", - "integrity": "sha512-Euf9GG8WT9CdqwuWJGdf3RkUcTBArppHABkO7Lm8IzRQp0e2r/kkFnmhu4TSK30Wcu5rVAZLmfPKSBBi9tWFog==", - "license": "MIT", - "dependencies": { - "protocols": "^2.0.0" - } + "node_modules/csstype": { + "version": "3.1.3", + "license": "MIT" }, - "node_modules/parse-url": { - "version": "8.1.0", - "resolved": "https://registry.npmjs.org/parse-url/-/parse-url-8.1.0.tgz", - "integrity": "sha512-xDvOoLU5XRrcOZvnI6b8zA6n9O9ejNk/GExuz1yBuWUGn9KA97GI6HTs6u02wKara1CeVmZhH+0TZFdWScR89w==", - "license": "MIT", + "node_modules/csv-stringify": { + "version": "6.5.1", + "license": "MIT" + }, + "node_modules/d": { + "version": "1.0.2", + "license": "ISC", "dependencies": { - "parse-path": "^7.0.0" + "es5-ext": "^0.10.64", + "type": "^2.7.2" + }, + "engines": { + "node": ">=0.12" } }, - "node_modules/parse5": { - "version": "7.2.1", - "resolved": "https://registry.npmjs.org/parse5/-/parse5-7.2.1.tgz", - "integrity": "sha512-BuBYQYlv1ckiPdQi/ohiivi9Sagc9JG+Ozs0r7b/0iK3sKmrb0b9FdWdBbOdx6hBCM/F9Ir82ofnBhtZOjCRPQ==", + "node_modules/dargs": { + "version": "8.1.0", + "dev": true, "license": "MIT", - "dependencies": { - "entities": "^4.5.0" + "engines": { + "node": ">=12" }, "funding": { - "url": "https://github.com/inikulin/parse5?sponsor=1" + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/parse5-htmlparser2-tree-adapter": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/parse5-htmlparser2-tree-adapter/-/parse5-htmlparser2-tree-adapter-7.1.0.tgz", - "integrity": "sha512-ruw5xyKs6lrpo9x9rCZqZZnIUntICjQAd0Wsmp396Ul9lN/h+ifgVV1x1gZHi8euej6wTfpqX8j+BFQxF0NS/g==", + "node_modules/data-view-buffer": { + "version": "1.0.1", + "dev": true, "license": "MIT", "dependencies": { - "domhandler": "^5.0.3", - "parse5": "^7.0.0" + "call-bind": "^1.0.6", + "es-errors": "^1.3.0", + "is-data-view": "^1.0.1" }, - "funding": { - "url": "https://github.com/inikulin/parse5?sponsor=1" - } - }, - "node_modules/parse5/node_modules/entities": { - "version": "4.5.0", - "resolved": "https://registry.npmjs.org/entities/-/entities-4.5.0.tgz", - "integrity": "sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw==", - "license": "BSD-2-Clause", "engines": { - "node": ">=0.12" + "node": ">= 0.4" }, "funding": { - "url": "https://github.com/fb55/entities?sponsor=1" - } - }, - "node_modules/parseurl": { - "version": "1.3.3", - "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz", - "integrity": "sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==", - "license": "MIT", - "engines": { - "node": ">= 0.8" + "url": "https://github.com/sponsors/ljharb" } }, - "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==", + "node_modules/data-view-byte-length": { + "version": "1.0.1", "dev": true, "license": "MIT", "dependencies": { - "no-case": "^3.0.4", - "tslib": "^2.0.3" + "call-bind": "^1.0.7", + "es-errors": "^1.3.0", + "is-data-view": "^1.0.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/pascal-case/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==", + "node_modules/data-view-byte-offset": { + "version": "1.0.0", "dev": true, "license": "MIT", "dependencies": { - "tslib": "^2.0.3" + "call-bind": "^1.0.6", + "es-errors": "^1.3.0", + "is-data-view": "^1.0.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/pascal-case/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==", - "dev": true, + "node_modules/dayjs": { + "version": "1.11.13", + "license": "MIT" + }, + "node_modules/de-indent": { + "version": "1.0.2", + "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==", "license": "MIT", "dependencies": { - "lower-case": "^2.0.2", - "tslib": "^2.0.3" + "ms": "^2.1.3" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } } - }, - "node_modules/pascalcase": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/pascalcase/-/pascalcase-0.1.1.tgz", - "integrity": "sha512-XHXfu/yOQRy9vYOtUDVMN60OEJjW013GoObG1o+xwQTpB9eYJX/BjXMsdW13ZDPruFhYYn0AG22w0xgQMwl3Nw==", - "dev": true, + }, + "node_modules/decamelize": { + "version": "1.2.0", "license": "MIT", "engines": { "node": ">=0.10.0" } }, - "node_modules/patch-package": { - "version": "6.5.1", - "resolved": "https://registry.npmjs.org/patch-package/-/patch-package-6.5.1.tgz", - "integrity": "sha512-I/4Zsalfhc6bphmJTlrLoOcAF87jcxko4q0qsv4bGcurbr8IskEOtdnt9iCmsQVGL1B+iUhSQqweyTLJfCF9rA==", - "dev": true, - "license": "MIT", - "dependencies": { - "@yarnpkg/lockfile": "^1.1.0", - "chalk": "^4.1.2", - "cross-spawn": "^6.0.5", - "find-yarn-workspace-root": "^2.0.0", - "fs-extra": "^9.0.0", - "is-ci": "^2.0.0", - "klaw-sync": "^6.0.0", - "minimist": "^1.2.6", - "open": "^7.4.2", - "rimraf": "^2.6.3", - "semver": "^5.6.0", - "slash": "^2.0.0", - "tmp": "^0.0.33", - "yaml": "^1.10.2" - }, - "bin": { - "patch-package": "index.js" - }, - "engines": { - "node": ">=10", - "npm": ">5" - } + "node_modules/deep-is": { + "version": "0.1.4", + "license": "MIT" }, - "node_modules/patch-package/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, + "node_modules/define-data-property": { + "version": "1.1.4", "license": "MIT", "dependencies": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" + "es-define-property": "^1.0.0", + "es-errors": "^1.3.0", + "gopd": "^1.0.1" }, "engines": { - "node": ">=10" + "node": ">= 0.4" }, "funding": { - "url": "https://github.com/chalk/chalk?sponsor=1" + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/patch-package/node_modules/cross-spawn": { - "version": "6.0.6", - "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-6.0.6.tgz", - "integrity": "sha512-VqCUuhcd1iB+dsv8gxPttb5iZh/D0iubSP21g36KXdEuf6I5JiioesUVjpCdHV9MZRUfVFlvwtIUyPfxo5trtw==", + "node_modules/define-properties": { + "version": "1.2.1", "dev": true, "license": "MIT", "dependencies": { - "nice-try": "^1.0.4", - "path-key": "^2.0.1", - "semver": "^5.5.0", - "shebang-command": "^1.2.0", - "which": "^1.2.9" + "define-data-property": "^1.0.1", + "has-property-descriptors": "^1.0.0", + "object-keys": "^1.1.1" }, "engines": { - "node": ">=4.8" + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/patch-package/node_modules/fs-extra": { - "version": "9.1.0", - "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-9.1.0.tgz", - "integrity": "sha512-hcg3ZmepS30/7BSFqRvoo3DOMQu7IjqxO5nCDt+zM9XWjb33Wg7ziNT+Qvqbuc3+gWpzO02JubVyk2G4Zvo1OQ==", - "dev": true, + "node_modules/defu": { + "version": "6.1.4", + "license": "MIT" + }, + "node_modules/delay": { + "version": "5.0.0", "license": "MIT", - "dependencies": { - "at-least-node": "^1.0.0", - "graceful-fs": "^4.2.0", - "jsonfile": "^6.0.1", - "universalify": "^2.0.0" - }, "engines": { "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/patch-package/node_modules/jsonfile": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.1.0.tgz", - "integrity": "sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==", - "dev": true, + "node_modules/delayed-stream": { + "version": "1.0.0", "license": "MIT", - "dependencies": { - "universalify": "^2.0.0" - }, - "optionalDependencies": { - "graceful-fs": "^4.1.6" + "engines": { + "node": ">=0.4.0" } }, - "node_modules/patch-package/node_modules/path-key": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/path-key/-/path-key-2.0.1.tgz", - "integrity": "sha512-fEHGKCSmUSDPv4uoj8AlD+joPlq3peND+HRYyxFz4KPw4z926S/b8rIuFs2FYJg3BwsxJf6A9/3eIdLaYC+9Dw==", - "dev": true, + "node_modules/depd": { + "version": "2.0.0", "license": "MIT", "engines": { - "node": ">=4" + "node": ">= 0.8" } }, - "node_modules/patch-package/node_modules/rimraf": { - "version": "2.7.1", - "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.7.1.tgz", - "integrity": "sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w==", - "deprecated": "Rimraf versions prior to v4 are no longer supported", - "dev": true, - "license": "ISC", - "dependencies": { - "glob": "^7.1.3" - }, - "bin": { - "rimraf": "bin.js" - } + "node_modules/destr": { + "version": "2.0.3", + "license": "MIT", + "peer": true }, - "node_modules/patch-package/node_modules/semver": { - "version": "5.7.2", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.2.tgz", - "integrity": "sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g==", - "dev": true, - "license": "ISC", - "bin": { - "semver": "bin/semver" + "node_modules/destroy": { + "version": "1.2.0", + "license": "MIT", + "engines": { + "node": ">= 0.8", + "npm": "1.2.8000 || >= 1.4.16" } }, - "node_modules/patch-package/node_modules/shebang-command": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-1.2.0.tgz", - "integrity": "sha512-EV3L1+UQWGor21OmnvojK36mhg+TyIKDh3iFBKBohr5xeXIhNBcx8oWdgkTEEQ+BEFFYdLRuqMfd5L84N1V5Vg==", - "dev": true, + "node_modules/detect-node": { + "version": "2.1.0", + "license": "MIT" + }, + "node_modules/dijkstrajs": { + "version": "1.0.3", + "license": "MIT" + }, + "node_modules/dir-glob": { + "version": "3.0.1", "license": "MIT", "dependencies": { - "shebang-regex": "^1.0.0" + "path-type": "^4.0.0" }, "engines": { - "node": ">=0.10.0" + "node": ">=8" } }, - "node_modules/patch-package/node_modules/shebang-regex": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-1.0.0.tgz", - "integrity": "sha512-wpoSFAxys6b2a2wHZ1XpDSgD7N9iVjg29Ph9uV/uaP9Ex/KXlkTZTeddxDPSYQpgvzKLGJke2UU0AzoGCjNIvQ==", + "node_modules/doctrine": { + "version": "2.1.0", "dev": true, - "license": "MIT", + "license": "Apache-2.0", + "dependencies": { + "esutils": "^2.0.2" + }, "engines": { "node": ">=0.10.0" } }, - "node_modules/patch-package/node_modules/slash": { + "node_modules/dom-serializer": { "version": "2.0.0", - "resolved": "https://registry.npmjs.org/slash/-/slash-2.0.0.tgz", - "integrity": "sha512-ZYKh3Wh2z1PpEXWr0MpSBZ0V6mZHAQfYevttO11c51CaWjGTaadiKZ+wVt1PbMlDV5qhMFslpZCemhwOK7C89A==", - "dev": true, "license": "MIT", - "engines": { - "node": ">=6" + "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/patch-package/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", + "node_modules/domelementtype": { + "version": "2.3.0", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/fb55" + } + ], + "license": "BSD-2-Clause" + }, + "node_modules/domhandler": { + "version": "5.0.3", + "license": "BSD-2-Clause", "dependencies": { - "has-flag": "^4.0.0" + "domelementtype": "^2.3.0" }, "engines": { - "node": ">=8" + "node": ">= 4" + }, + "funding": { + "url": "https://github.com/fb55/domhandler?sponsor=1" } }, - "node_modules/patch-package/node_modules/universalify": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.1.tgz", - "integrity": "sha512-gptHNQghINnc/vTGIk0SOFGFNXw7JVrlRUtConJRlvaw6DuX0wO5Jeko9sWrMBhh+PsYAZ7oXAiOnf/UKogyiw==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 10.0.0" + "node_modules/domutils": { + "version": "3.1.0", + "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/patch-package/node_modules/which": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz", - "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==", + "node_modules/dot-prop": { + "version": "5.3.0", "dev": true, - "license": "ISC", + "license": "MIT", "dependencies": { - "isexe": "^2.0.0" + "is-obj": "^2.0.0" }, - "bin": { - "which": "bin/which" + "engines": { + "node": ">=8" } }, - "node_modules/path-browserify": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/path-browserify/-/path-browserify-0.0.1.tgz", - "integrity": "sha512-BapA40NHICOS+USX9SN4tyhq+A2RrN/Ws5F0Z5aMHDp98Fl86lX8Oti8B7uN93L4Ifv4fHOEA+pQw87gmMO/lQ==", - "dev": true, + "node_modules/eastasianwidth": { + "version": "0.2.0", "license": "MIT" }, - "node_modules/path-dirname": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/path-dirname/-/path-dirname-1.0.2.tgz", - "integrity": "sha512-ALzNPpyNq9AqXMBjeymIjFDAkAFH06mHJH/cSBHAgU0s4vfpBn6b2nf8tiRLvagKD8RbTpq2FKTBg7cl9l3c7Q==", - "dev": true, - "license": "MIT", - "optional": true - }, - "node_modules/path-exists": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", - "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", - "license": "MIT", - "engines": { - "node": ">=8" + "node_modules/ecdsa-sig-formatter": { + "version": "1.0.11", + "license": "Apache-2.0", + "dependencies": { + "safe-buffer": "^5.0.1" } }, - "node_modules/path-is-absolute": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", - "integrity": "sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==", + "node_modules/editorconfig": { + "version": "1.0.4", "license": "MIT", + "dependencies": { + "@one-ini/wasm": "0.1.1", + "commander": "^10.0.0", + "minimatch": "9.0.1", + "semver": "^7.5.3" + }, + "bin": { + "editorconfig": "bin/editorconfig" + }, "engines": { - "node": ">=0.10.0" + "node": ">=14" } }, - "node_modules/path-key": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", - "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", + "node_modules/editorconfig/node_modules/commander": { + "version": "10.0.1", "license": "MIT", "engines": { - "node": ">=8" + "node": ">=14" } }, - "node_modules/path-parse": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz", - "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==", - "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==", - "license": "BlueOak-1.0.0", + "node_modules/editorconfig/node_modules/minimatch": { + "version": "9.0.1", + "license": "ISC", "dependencies": { - "lru-cache": "^10.2.0", - "minipass": "^5.0.0 || ^6.0.2 || ^7.0.0" + "brace-expansion": "^2.0.1" }, "engines": { - "node": ">=16 || 14 >=14.18" + "node": ">=16 || 14 >=14.17" }, "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==", - "license": "ISC" - }, - "node_modules/path-scurry/node_modules/minipass": { - "version": "7.1.2", - "resolved": "https://registry.npmjs.org/minipass/-/minipass-7.1.2.tgz", - "integrity": "sha512-qOOzS1cBTWYF4BH8fVePDBOO9iptMnGUEZwNc/cMWnTV2nVLZ7VoNWEPHkYczZA0pdoA7dl6e7FL659nX9S2aw==", - "license": "ISC", - "engines": { - "node": ">=16 || 14 >=14.17" - } - }, - "node_modules/path-to-regexp": { - "version": "0.1.10", - "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.10.tgz", - "integrity": "sha512-7lf7qcQidTku0Gu3YDPc8DJ1q7OOucfa/BSsIwjuh56VU7katFvuM8hULfkwB3Fns/rsVF7PwPKVw1sl5KQS9w==", + "node_modules/ee-first": { + "version": "1.1.1", "license": "MIT" }, - "node_modules/path-type": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/path-type/-/path-type-4.0.0.tgz", - "integrity": "sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==", - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/pbkdf2": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/pbkdf2/-/pbkdf2-3.1.2.tgz", - "integrity": "sha512-iuh7L6jA7JEGu2WxDwtQP1ddOpaJNC4KlDEFfdQajSGgGPNi4OyDc2R7QnbY2bR9QjBVGwgvTdNJZoE7RaxUMA==", - "dev": true, - "license": "MIT", + "node_modules/ejs": { + "version": "3.1.10", + "license": "Apache-2.0", "dependencies": { - "create-hash": "^1.1.2", - "create-hmac": "^1.1.4", - "ripemd160": "^2.0.1", - "safe-buffer": "^5.0.1", - "sha.js": "^2.4.8" + "jake": "^10.8.5" + }, + "bin": { + "ejs": "bin/cli.js" }, "engines": { - "node": ">=0.12" + "node": ">=0.10.0" } }, - "node_modules/picocolors": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.1.1.tgz", - "integrity": "sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==", - "license": "ISC" - }, - "node_modules/picomatch": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", - "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", - "license": "MIT", + "node_modules/email-validator": { + "version": "2.0.4", "engines": { - "node": ">=8.6" - }, - "funding": { - "url": "https://github.com/sponsors/jonschlinkert" + "node": ">4.0" } }, - "node_modules/pify": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/pify/-/pify-5.0.0.tgz", - "integrity": "sha512-eW/gHNMlxdSP6dmG6uJip6FXN0EQBwm2clYYd8Wul42Cwu/DK8HEftzsapcNdYe2MfLiIwZqsDk2RDEsTE79hA==", + "node_modules/emoji-regex": { + "version": "8.0.0", + "license": "MIT" + }, + "node_modules/encodeurl": { + "version": "2.0.0", "license": "MIT", "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "node": ">= 0.8" } }, - "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==", + "node_modules/enhanced-resolve": { + "version": "5.17.1", "dev": true, "license": "MIT", "dependencies": { - "find-up": "^4.0.0" + "graceful-fs": "^4.2.4", + "tapable": "^2.2.0" }, "engines": { - "node": ">=8" + "node": ">=10.13.0" } }, - "node_modules/pkg-dir/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==", + "node_modules/entities": { + "version": "4.5.0", + "license": "BSD-2-Clause", + "engines": { + "node": ">=0.12" + }, + "funding": { + "url": "https://github.com/fb55/entities?sponsor=1" + } + }, + "node_modules/env-paths": { + "version": "2.2.1", "dev": true, "license": "MIT", - "dependencies": { - "locate-path": "^5.0.0", - "path-exists": "^4.0.0" - }, "engines": { - "node": ">=8" + "node": ">=6" } }, - "node_modules/pkg-dir/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==", + "node_modules/error-ex": { + "version": "1.3.2", "dev": true, "license": "MIT", "dependencies": { - "p-locate": "^4.1.0" - }, - "engines": { - "node": ">=8" + "is-arrayish": "^0.2.1" } }, - "node_modules/pkg-dir/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==", + "node_modules/es-abstract": { + "version": "1.23.3", "dev": true, "license": "MIT", "dependencies": { - "p-try": "^2.0.0" + "array-buffer-byte-length": "^1.0.1", + "arraybuffer.prototype.slice": "^1.0.3", + "available-typed-arrays": "^1.0.7", + "call-bind": "^1.0.7", + "data-view-buffer": "^1.0.1", + "data-view-byte-length": "^1.0.1", + "data-view-byte-offset": "^1.0.0", + "es-define-property": "^1.0.0", + "es-errors": "^1.3.0", + "es-object-atoms": "^1.0.0", + "es-set-tostringtag": "^2.0.3", + "es-to-primitive": "^1.2.1", + "function.prototype.name": "^1.1.6", + "get-intrinsic": "^1.2.4", + "get-symbol-description": "^1.0.2", + "globalthis": "^1.0.3", + "gopd": "^1.0.1", + "has-property-descriptors": "^1.0.2", + "has-proto": "^1.0.3", + "has-symbols": "^1.0.3", + "hasown": "^2.0.2", + "internal-slot": "^1.0.7", + "is-array-buffer": "^3.0.4", + "is-callable": "^1.2.7", + "is-data-view": "^1.0.1", + "is-negative-zero": "^2.0.3", + "is-regex": "^1.1.4", + "is-shared-array-buffer": "^1.0.3", + "is-string": "^1.0.7", + "is-typed-array": "^1.1.13", + "is-weakref": "^1.0.2", + "object-inspect": "^1.13.1", + "object-keys": "^1.1.1", + "object.assign": "^4.1.5", + "regexp.prototype.flags": "^1.5.2", + "safe-array-concat": "^1.1.2", + "safe-regex-test": "^1.0.3", + "string.prototype.trim": "^1.2.9", + "string.prototype.trimend": "^1.0.8", + "string.prototype.trimstart": "^1.0.8", + "typed-array-buffer": "^1.0.2", + "typed-array-byte-length": "^1.0.1", + "typed-array-byte-offset": "^1.0.2", + "typed-array-length": "^1.0.6", + "unbox-primitive": "^1.0.2", + "which-typed-array": "^1.1.15" }, "engines": { - "node": ">=6" + "node": ">= 0.4" }, "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/pkg-dir/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, + "node_modules/es-define-property": { + "version": "1.0.0", "license": "MIT", "dependencies": { - "p-limit": "^2.2.0" + "get-intrinsic": "^1.2.4" }, "engines": { - "node": ">=8" + "node": ">= 0.4" } }, - "node_modules/pngjs": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/pngjs/-/pngjs-5.0.0.tgz", - "integrity": "sha512-40QW5YalBNfQo5yRYmiw7Yz6TKKVr3h6970B2YE+3fQpsWcrbj1PzJgxeJ19DRQjhMbKPIuMY8rFaXc8moolVw==", + "node_modules/es-errors": { + "version": "1.3.0", "license": "MIT", "engines": { - "node": ">=10.13.0" + "node": ">= 0.4" } }, - "node_modules/pnp-webpack-plugin": { - "version": "1.7.0", - "resolved": "https://registry.npmjs.org/pnp-webpack-plugin/-/pnp-webpack-plugin-1.7.0.tgz", - "integrity": "sha512-2Rb3vm+EXble/sMXNSu6eoBx8e79gKqhNq9F5ZWW6ERNCTE/Q0wQNne5541tE5vKjfM8hpNCYL+LGc1YTfI0dg==", + "node_modules/es-iterator-helpers": { + "version": "1.1.0", "dev": true, "license": "MIT", "dependencies": { - "ts-pnp": "^1.1.6" + "call-bind": "^1.0.7", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.3", + "es-errors": "^1.3.0", + "es-set-tostringtag": "^2.0.3", + "function-bind": "^1.1.2", + "get-intrinsic": "^1.2.4", + "globalthis": "^1.0.4", + "has-property-descriptors": "^1.0.2", + "has-proto": "^1.0.3", + "has-symbols": "^1.0.3", + "internal-slot": "^1.0.7", + "iterator.prototype": "^1.1.3", + "safe-array-concat": "^1.1.2" }, "engines": { - "node": ">=6" - } - }, - "node_modules/posix-character-classes": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/posix-character-classes/-/posix-character-classes-0.1.1.tgz", - "integrity": "sha512-xTgYBc3fuo7Yt7JbiuFxSYGToMoz8fLoE6TC9Wx1P/u+LfeThMOAqmuyECnlBaaJb+u1m9hHiXUEtwW4OzfUJg==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=0.10.0" + "node": ">= 0.4" } }, - "node_modules/possible-typed-array-names": { + "node_modules/es-object-atoms": { "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==", - "funding": [ - { - "type": "opencollective", - "url": "https://opencollective.com/postcss/" - }, - { - "type": "tidelift", - "url": "https://tidelift.com/funding/github/npm/postcss" - }, - { - "type": "github", - "url": "https://github.com/sponsors/ai" - } - ], - "license": "MIT", "dependencies": { - "nanoid": "^3.3.7", - "picocolors": "^1.1.1", - "source-map-js": "^1.2.1" + "es-errors": "^1.3.0" }, "engines": { - "node": "^10 || ^12 || >=14" + "node": ">= 0.4" } }, - "node_modules/postcss-attribute-case-insensitive": { - "version": "6.0.3", - "resolved": "https://registry.npmjs.org/postcss-attribute-case-insensitive/-/postcss-attribute-case-insensitive-6.0.3.tgz", - "integrity": "sha512-KHkmCILThWBRtg+Jn1owTnHPnFit4OkqS+eKiGEOPIGke54DCeYGJ6r0Fx/HjfE9M9kznApCLcU0DvnPchazMQ==", + "node_modules/es-set-tostringtag": { + "version": "2.0.3", "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/csstools" - }, - { - "type": "opencollective", - "url": "https://opencollective.com/csstools" - } - ], "license": "MIT", "dependencies": { - "postcss-selector-parser": "^6.0.13" + "get-intrinsic": "^1.2.4", + "has-tostringtag": "^1.0.2", + "hasown": "^2.0.1" }, "engines": { - "node": "^14 || ^16 || >=18" - }, - "peerDependencies": { - "postcss": "^8.4" + "node": ">= 0.4" } }, - "node_modules/postcss-calc": { - "version": "10.0.2", - "resolved": "https://registry.npmjs.org/postcss-calc/-/postcss-calc-10.0.2.tgz", - "integrity": "sha512-DT/Wwm6fCKgpYVI7ZEWuPJ4az8hiEHtCUeYjZXqU7Ou4QqYh1Df2yCQ7Ca6N7xqKPFkxN3fhf+u9KSoOCJNAjg==", + "node_modules/es-shim-unscopables": { + "version": "1.0.2", "dev": true, "license": "MIT", "dependencies": { - "postcss-selector-parser": "^6.1.2", - "postcss-value-parser": "^4.2.0" - }, - "engines": { - "node": "^18.12 || ^20.9 || >=22.0" - }, - "peerDependencies": { - "postcss": "^8.4.38" + "hasown": "^2.0.0" } }, - "node_modules/postcss-clamp": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/postcss-clamp/-/postcss-clamp-4.1.0.tgz", - "integrity": "sha512-ry4b1Llo/9zz+PKC+030KUnPITTJAHeOwjfAyyB60eT0AorGLdzp52s31OsPRHRf8NchkgFoG2y6fCfn1IV1Ow==", + "node_modules/es-to-primitive": { + "version": "1.2.1", "dev": true, "license": "MIT", "dependencies": { - "postcss-value-parser": "^4.2.0" + "is-callable": "^1.1.4", + "is-date-object": "^1.0.1", + "is-symbol": "^1.0.2" }, "engines": { - "node": ">=7.6.0" + "node": ">= 0.4" }, - "peerDependencies": { - "postcss": "^8.4.6" + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/postcss-color-functional-notation": { - "version": "6.0.14", - "resolved": "https://registry.npmjs.org/postcss-color-functional-notation/-/postcss-color-functional-notation-6.0.14.tgz", - "integrity": "sha512-dNUX+UH4dAozZ8uMHZ3CtCNYw8fyFAmqqdcyxMr7PEdM9jLXV19YscoYO0F25KqZYhmtWKQ+4tKrIZQrwzwg7A==", - "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/csstools" - }, - { - "type": "opencollective", - "url": "https://opencollective.com/csstools" - } - ], - "license": "MIT-0", + "node_modules/es5-ext": { + "version": "0.10.64", + "hasInstallScript": true, + "license": "ISC", "dependencies": { - "@csstools/css-color-parser": "^2.0.4", - "@csstools/css-parser-algorithms": "^2.7.1", - "@csstools/css-tokenizer": "^2.4.1", - "@csstools/postcss-progressive-custom-properties": "^3.3.0", - "@csstools/utilities": "^1.0.0" + "es6-iterator": "^2.0.3", + "es6-symbol": "^3.1.3", + "esniff": "^2.0.1", + "next-tick": "^1.1.0" }, "engines": { - "node": "^14 || ^16 || >=18" - }, - "peerDependencies": { - "postcss": "^8.4" + "node": ">=0.10" } }, - "node_modules/postcss-color-hex-alpha": { - "version": "9.0.4", - "resolved": "https://registry.npmjs.org/postcss-color-hex-alpha/-/postcss-color-hex-alpha-9.0.4.tgz", - "integrity": "sha512-XQZm4q4fNFqVCYMGPiBjcqDhuG7Ey2xrl99AnDJMyr5eDASsAGalndVgHZF8i97VFNy1GQeZc4q2ydagGmhelQ==", - "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/csstools" - }, - { - "type": "opencollective", - "url": "https://opencollective.com/csstools" - } - ], + "node_modules/es6-iterator": { + "version": "2.0.3", "license": "MIT", "dependencies": { - "@csstools/utilities": "^1.0.0", - "postcss-value-parser": "^4.2.0" + "d": "1", + "es5-ext": "^0.10.35", + "es6-symbol": "^3.1.1" + } + }, + "node_modules/es6-symbol": { + "version": "3.1.4", + "license": "ISC", + "dependencies": { + "d": "^1.0.2", + "ext": "^1.7.0" }, "engines": { - "node": "^14 || ^16 || >=18" - }, - "peerDependencies": { - "postcss": "^8.4" + "node": ">=0.12" } }, - "node_modules/postcss-color-rebeccapurple": { - "version": "9.0.3", - "resolved": "https://registry.npmjs.org/postcss-color-rebeccapurple/-/postcss-color-rebeccapurple-9.0.3.tgz", - "integrity": "sha512-ruBqzEFDYHrcVq3FnW3XHgwRqVMrtEPLBtD7K2YmsLKVc2jbkxzzNEctJKsPCpDZ+LeMHLKRDoSShVefGc+CkQ==", - "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/csstools" - }, - { - "type": "opencollective", - "url": "https://opencollective.com/csstools" - } - ], - "license": "MIT-0", + "node_modules/es6-weak-map": { + "version": "2.0.3", + "license": "ISC", "dependencies": { - "@csstools/utilities": "^1.0.0", - "postcss-value-parser": "^4.2.0" + "d": "1", + "es5-ext": "^0.10.46", + "es6-iterator": "^2.0.3", + "es6-symbol": "^3.1.1" + } + }, + "node_modules/esbuild": { + "version": "0.21.5", + "hasInstallScript": true, + "license": "MIT", + "bin": { + "esbuild": "bin/esbuild" }, "engines": { - "node": "^14 || ^16 || >=18" + "node": ">=12" }, - "peerDependencies": { - "postcss": "^8.4" + "optionalDependencies": { + "@esbuild/aix-ppc64": "0.21.5", + "@esbuild/android-arm": "0.21.5", + "@esbuild/android-arm64": "0.21.5", + "@esbuild/android-x64": "0.21.5", + "@esbuild/darwin-arm64": "0.21.5", + "@esbuild/darwin-x64": "0.21.5", + "@esbuild/freebsd-arm64": "0.21.5", + "@esbuild/freebsd-x64": "0.21.5", + "@esbuild/linux-arm": "0.21.5", + "@esbuild/linux-arm64": "0.21.5", + "@esbuild/linux-ia32": "0.21.5", + "@esbuild/linux-loong64": "0.21.5", + "@esbuild/linux-mips64el": "0.21.5", + "@esbuild/linux-ppc64": "0.21.5", + "@esbuild/linux-riscv64": "0.21.5", + "@esbuild/linux-s390x": "0.21.5", + "@esbuild/linux-x64": "0.21.5", + "@esbuild/netbsd-x64": "0.21.5", + "@esbuild/openbsd-x64": "0.21.5", + "@esbuild/sunos-x64": "0.21.5", + "@esbuild/win32-arm64": "0.21.5", + "@esbuild/win32-ia32": "0.21.5", + "@esbuild/win32-x64": "0.21.5" } }, - "node_modules/postcss-colormin": { - "version": "7.0.2", - "resolved": "https://registry.npmjs.org/postcss-colormin/-/postcss-colormin-7.0.2.tgz", - "integrity": "sha512-YntRXNngcvEvDbEjTdRWGU606eZvB5prmHG4BF0yLmVpamXbpsRJzevyy6MZVyuecgzI2AWAlvFi8DAeCqwpvA==", - "dev": true, + "node_modules/escalade": { + "version": "3.2.0", "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": ">=6" } }, - "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, + "node_modules/escape-goat": { + "version": "3.0.0", "license": "MIT", - "dependencies": { - "browserslist": "^4.23.3", - "postcss-value-parser": "^4.2.0" - }, "engines": { - "node": "^18.12.0 || ^20.9.0 || >=22.0" + "node": ">=10" }, - "peerDependencies": { - "postcss": "^8.4.31" + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/postcss-custom-media": { - "version": "10.0.8", - "resolved": "https://registry.npmjs.org/postcss-custom-media/-/postcss-custom-media-10.0.8.tgz", - "integrity": "sha512-V1KgPcmvlGdxTel4/CyQtBJEFhMVpEmRGFrnVtgfGIHj5PJX9vO36eFBxKBeJn+aCDTed70cc+98Mz3J/uVdGQ==", - "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/csstools" - }, - { - "type": "opencollective", - "url": "https://opencollective.com/csstools" - } - ], + "node_modules/escape-html": { + "version": "1.0.3", + "license": "MIT" + }, + "node_modules/escape-string-regexp": { + "version": "4.0.0", "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/escodegen": { + "version": "2.1.0", + "license": "BSD-2-Clause", "dependencies": { - "@csstools/cascade-layer-name-parser": "^1.0.13", - "@csstools/css-parser-algorithms": "^2.7.1", - "@csstools/css-tokenizer": "^2.4.1", - "@csstools/media-query-list-parser": "^2.1.13" + "esprima": "^4.0.1", + "estraverse": "^5.2.0", + "esutils": "^2.0.2" + }, + "bin": { + "escodegen": "bin/escodegen.js", + "esgenerate": "bin/esgenerate.js" }, "engines": { - "node": "^14 || ^16 || >=18" + "node": ">=6.0" }, - "peerDependencies": { - "postcss": "^8.4" + "optionalDependencies": { + "source-map": "~0.6.1" } }, - "node_modules/postcss-custom-properties": { - "version": "13.3.12", - "resolved": "https://registry.npmjs.org/postcss-custom-properties/-/postcss-custom-properties-13.3.12.tgz", - "integrity": "sha512-oPn/OVqONB2ZLNqN185LDyaVByELAA/u3l2CS2TS16x2j2XsmV4kd8U49+TMxmUsEU9d8fB/I10E6U7kB0L1BA==", - "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/csstools" - }, - { - "type": "opencollective", - "url": "https://opencollective.com/csstools" - } - ], - "license": "MIT", - "dependencies": { - "@csstools/cascade-layer-name-parser": "^1.0.13", - "@csstools/css-parser-algorithms": "^2.7.1", - "@csstools/css-tokenizer": "^2.4.1", - "@csstools/utilities": "^1.0.0", - "postcss-value-parser": "^4.2.0" + "node_modules/eslint": { + "version": "9.12.0", + "license": "MIT", + "dependencies": { + "@eslint-community/eslint-utils": "^4.2.0", + "@eslint-community/regexpp": "^4.11.0", + "@eslint/config-array": "^0.18.0", + "@eslint/core": "^0.6.0", + "@eslint/eslintrc": "^3.1.0", + "@eslint/js": "9.12.0", + "@eslint/plugin-kit": "^0.2.0", + "@humanfs/node": "^0.16.5", + "@humanwhocodes/module-importer": "^1.0.1", + "@humanwhocodes/retry": "^0.3.1", + "@types/estree": "^1.0.6", + "@types/json-schema": "^7.0.15", + "ajv": "^6.12.4", + "chalk": "^4.0.0", + "cross-spawn": "^7.0.2", + "debug": "^4.3.2", + "escape-string-regexp": "^4.0.0", + "eslint-scope": "^8.1.0", + "eslint-visitor-keys": "^4.1.0", + "espree": "^10.2.0", + "esquery": "^1.5.0", + "esutils": "^2.0.2", + "fast-deep-equal": "^3.1.3", + "file-entry-cache": "^8.0.0", + "find-up": "^5.0.0", + "glob-parent": "^6.0.2", + "ignore": "^5.2.0", + "imurmurhash": "^0.1.4", + "is-glob": "^4.0.0", + "json-stable-stringify-without-jsonify": "^1.0.1", + "lodash.merge": "^4.6.2", + "minimatch": "^3.1.2", + "natural-compare": "^1.4.0", + "optionator": "^0.9.3", + "text-table": "^0.2.0" + }, + "bin": { + "eslint": "bin/eslint.js" }, "engines": { - "node": "^14 || ^16 || >=18" + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "url": "https://eslint.org/donate" }, "peerDependencies": { - "postcss": "^8.4" + "jiti": "*" + }, + "peerDependenciesMeta": { + "jiti": { + "optional": true + } } }, - "node_modules/postcss-custom-selectors": { - "version": "7.1.12", - "resolved": "https://registry.npmjs.org/postcss-custom-selectors/-/postcss-custom-selectors-7.1.12.tgz", - "integrity": "sha512-ctIoprBMJwByYMGjXG0F7IT2iMF2hnamQ+aWZETyBM0aAlyaYdVZTeUkk8RB+9h9wP+NdN3f01lfvKl2ZSqC0g==", + "node_modules/eslint-compat-utils": { + "version": "0.5.1", "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/csstools" - }, - { - "type": "opencollective", - "url": "https://opencollective.com/csstools" - } - ], "license": "MIT", "dependencies": { - "@csstools/cascade-layer-name-parser": "^1.0.13", - "@csstools/css-parser-algorithms": "^2.7.1", - "@csstools/css-tokenizer": "^2.4.1", - "postcss-selector-parser": "^6.1.0" + "semver": "^7.5.4" }, "engines": { - "node": "^14 || ^16 || >=18" + "node": ">=12" }, "peerDependencies": { - "postcss": "^8.4" + "eslint": ">=6.0.0" } }, - "node_modules/postcss-dir-pseudo-class": { - "version": "8.0.1", - "resolved": "https://registry.npmjs.org/postcss-dir-pseudo-class/-/postcss-dir-pseudo-class-8.0.1.tgz", - "integrity": "sha512-uULohfWBBVoFiZXgsQA24JV6FdKIidQ+ZqxOouhWwdE+qJlALbkS5ScB43ZTjPK+xUZZhlaO/NjfCt5h4IKUfw==", + "node_modules/eslint-plugin-es-x": { + "version": "7.8.0", "dev": true, "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/csstools" - }, - { - "type": "opencollective", - "url": "https://opencollective.com/csstools" - } + "https://github.com/sponsors/ota-meshi", + "https://opencollective.com/eslint" ], - "license": "MIT-0", + "license": "MIT", "dependencies": { - "postcss-selector-parser": "^6.0.13" + "@eslint-community/eslint-utils": "^4.1.2", + "@eslint-community/regexpp": "^4.11.0", + "eslint-compat-utils": "^0.5.1" }, "engines": { - "node": "^14 || ^16 || >=18" + "node": "^14.18.0 || >=16.0.0" }, "peerDependencies": { - "postcss": "^8.4" + "eslint": ">=8" } }, - "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==", + "node_modules/eslint-plugin-n": { + "version": "17.11.1", "dev": true, "license": "MIT", "dependencies": { - "postcss-selector-parser": "^6.1.2" + "@eslint-community/eslint-utils": "^4.4.0", + "enhanced-resolve": "^5.17.0", + "eslint-plugin-es-x": "^7.5.0", + "get-tsconfig": "^4.7.0", + "globals": "^15.8.0", + "ignore": "^5.2.4", + "minimatch": "^9.0.5", + "semver": "^7.5.3" }, "engines": { - "node": "^18.12.0 || ^20.9.0 || >=22.0" + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" }, - "peerDependencies": { - "postcss": "^8.4.31" - } - }, - "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" + "funding": { + "url": "https://opencollective.com/eslint" }, "peerDependencies": { - "postcss": "^8.4.31" + "eslint": ">=8.23.0" } }, - "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==", + "node_modules/eslint-plugin-n/node_modules/globals": { + "version": "15.11.0", "dev": true, "license": "MIT", "engines": { - "node": "^18.12.0 || ^20.9.0 || >=22.0" + "node": ">=18" }, - "peerDependencies": { - "postcss": "^8.4.31" + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "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==", + "node_modules/eslint-plugin-promise": { + "version": "7.1.0", "dev": true, - "license": "MIT", + "license": "ISC", "engines": { - "node": "^18.12.0 || ^20.9.0 || >=22.0" + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" }, "peerDependencies": { - "postcss": "^8.4.31" + "eslint": "^7.0.0 || ^8.0.0 || ^9.0.0" } }, - "node_modules/postcss-double-position-gradients": { - "version": "5.0.7", - "resolved": "https://registry.npmjs.org/postcss-double-position-gradients/-/postcss-double-position-gradients-5.0.7.tgz", - "integrity": "sha512-1xEhjV9u1s4l3iP5lRt1zvMjI/ya8492o9l/ivcxHhkO3nOz16moC4JpMxDUGrOs4R3hX+KWT7gKoV842cwRgg==", + "node_modules/eslint-plugin-react": { + "version": "7.37.1", "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/csstools" - }, - { - "type": "opencollective", - "url": "https://opencollective.com/csstools" - } - ], - "license": "MIT-0", + "license": "MIT", "dependencies": { - "@csstools/postcss-progressive-custom-properties": "^3.3.0", - "@csstools/utilities": "^1.0.0", - "postcss-value-parser": "^4.2.0" + "array-includes": "^3.1.8", + "array.prototype.findlast": "^1.2.5", + "array.prototype.flatmap": "^1.3.2", + "array.prototype.tosorted": "^1.1.4", + "doctrine": "^2.1.0", + "es-iterator-helpers": "^1.0.19", + "estraverse": "^5.3.0", + "hasown": "^2.0.2", + "jsx-ast-utils": "^2.4.1 || ^3.0.0", + "minimatch": "^3.1.2", + "object.entries": "^1.1.8", + "object.fromentries": "^2.0.8", + "object.values": "^1.2.0", + "prop-types": "^15.8.1", + "resolve": "^2.0.0-next.5", + "semver": "^6.3.1", + "string.prototype.matchall": "^4.0.11", + "string.prototype.repeat": "^1.0.0" }, "engines": { - "node": "^14 || ^16 || >=18" + "node": ">=4" }, "peerDependencies": { - "postcss": "^8.4" + "eslint": "^3 || ^4 || ^5 || ^6 || ^7 || ^8 || ^9.7" } }, - "node_modules/postcss-focus-visible": { - "version": "9.0.1", - "resolved": "https://registry.npmjs.org/postcss-focus-visible/-/postcss-focus-visible-9.0.1.tgz", - "integrity": "sha512-N2VQ5uPz3Z9ZcqI5tmeholn4d+1H14fKXszpjogZIrFbhaq0zNAtq8sAnw6VLiqGbL8YBzsnu7K9bBkTqaRimQ==", + "node_modules/eslint-plugin-react/node_modules/brace-expansion": { + "version": "1.1.11", "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/csstools" - }, - { - "type": "opencollective", - "url": "https://opencollective.com/csstools" - } - ], - "license": "MIT-0", + "license": "MIT", "dependencies": { - "postcss-selector-parser": "^6.0.13" - }, - "engines": { - "node": "^14 || ^16 || >=18" - }, - "peerDependencies": { - "postcss": "^8.4" + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" } }, - "node_modules/postcss-focus-within": { - "version": "8.0.1", - "resolved": "https://registry.npmjs.org/postcss-focus-within/-/postcss-focus-within-8.0.1.tgz", - "integrity": "sha512-NFU3xcY/xwNaapVb+1uJ4n23XImoC86JNwkY/uduytSl2s9Ekc2EpzmRR63+ExitnW3Mab3Fba/wRPCT5oDILA==", + "node_modules/eslint-plugin-react/node_modules/minimatch": { + "version": "3.1.2", "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/csstools" - }, - { - "type": "opencollective", - "url": "https://opencollective.com/csstools" - } - ], - "license": "MIT-0", + "license": "ISC", "dependencies": { - "postcss-selector-parser": "^6.0.13" + "brace-expansion": "^1.1.7" }, "engines": { - "node": "^14 || ^16 || >=18" - }, - "peerDependencies": { - "postcss": "^8.4" + "node": "*" } }, - "node_modules/postcss-font-variant": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/postcss-font-variant/-/postcss-font-variant-5.0.0.tgz", - "integrity": "sha512-1fmkBaCALD72CK2a9i468mA/+tr9/1cBxRRMXOUaZqO43oWPR5imcyPjXwuv7PXbCid4ndlP5zWhidQVVa3hmA==", + "node_modules/eslint-plugin-react/node_modules/semver": { + "version": "6.3.1", "dev": true, - "license": "MIT", - "peerDependencies": { - "postcss": "^8.1.0" + "license": "ISC", + "bin": { + "semver": "bin/semver.js" } }, - "node_modules/postcss-gap-properties": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/postcss-gap-properties/-/postcss-gap-properties-5.0.1.tgz", - "integrity": "sha512-k2z9Cnngc24c0KF4MtMuDdToROYqGMMUQGcE6V0odwjHyOHtaDBlLeRBV70y9/vF7KIbShrTRZ70JjsI1BZyWw==", + "node_modules/eslint-plugin-vue": { + "version": "9.29.0", "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/csstools" - }, - { - "type": "opencollective", - "url": "https://opencollective.com/csstools" - } - ], - "license": "MIT-0", + "license": "MIT", + "dependencies": { + "@eslint-community/eslint-utils": "^4.4.0", + "globals": "^13.24.0", + "natural-compare": "^1.4.0", + "nth-check": "^2.1.1", + "postcss-selector-parser": "^6.0.15", + "semver": "^7.6.3", + "vue-eslint-parser": "^9.4.3", + "xml-name-validator": "^4.0.0" + }, "engines": { - "node": "^14 || ^16 || >=18" + "node": "^14.17.0 || >=16.0.0" }, "peerDependencies": { - "postcss": "^8.4" + "eslint": "^6.2.0 || ^7.0.0 || ^8.0.0 || ^9.0.0" } }, - "node_modules/postcss-image-set-function": { - "version": "6.0.3", - "resolved": "https://registry.npmjs.org/postcss-image-set-function/-/postcss-image-set-function-6.0.3.tgz", - "integrity": "sha512-i2bXrBYzfbRzFnm+pVuxVePSTCRiNmlfssGI4H0tJQvDue+yywXwUxe68VyzXs7cGtMaH6MCLY6IbCShrSroCw==", + "node_modules/eslint-plugin-vue/node_modules/globals": { + "version": "13.24.0", "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/csstools" - }, - { - "type": "opencollective", - "url": "https://opencollective.com/csstools" - } - ], - "license": "MIT-0", + "license": "MIT", "dependencies": { - "@csstools/utilities": "^1.0.0", - "postcss-value-parser": "^4.2.0" + "type-fest": "^0.20.2" }, "engines": { - "node": "^14 || ^16 || >=18" + "node": ">=8" }, - "peerDependencies": { - "postcss": "^8.4" + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/postcss-import": { - "version": "15.1.0", - "resolved": "https://registry.npmjs.org/postcss-import/-/postcss-import-15.1.0.tgz", - "integrity": "sha512-hpr+J05B2FVYUAXHeK1YyI267J/dDDhMU6B6civm8hSY1jYJnBXxzKDKDswzJmtLHryrjhnDjqqp/49t8FALew==", + "node_modules/eslint-plugin-vue/node_modules/type-fest": { + "version": "0.20.2", "dev": true, - "license": "MIT", - "dependencies": { - "postcss-value-parser": "^4.0.0", - "read-cache": "^1.0.0", - "resolve": "^1.1.7" - }, + "license": "(MIT OR CC0-1.0)", "engines": { - "node": ">=14.0.0" + "node": ">=10" }, - "peerDependencies": { - "postcss": "^8.0.0" + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/postcss-import-resolver": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/postcss-import-resolver/-/postcss-import-resolver-2.0.0.tgz", - "integrity": "sha512-y001XYgGvVwgxyxw9J1a5kqM/vtmIQGzx34g0A0Oy44MFcy/ZboZw1hu/iN3VYFjSTRzbvd7zZJJz0Kh0AGkTw==", + "node_modules/eslint-plugin-vuetify": { + "version": "2.5.1", "dev": true, "license": "MIT", "dependencies": { - "enhanced-resolve": "^4.1.1" + "eslint-plugin-vue": "^9.6.0", + "requireindex": "^1.2.0" + }, + "peerDependencies": { + "eslint": "^8.0.0 || ^9.0.0", + "vuetify": "^3.0.0" } }, - "node_modules/postcss-lab-function": { - "version": "6.0.19", - "resolved": "https://registry.npmjs.org/postcss-lab-function/-/postcss-lab-function-6.0.19.tgz", - "integrity": "sha512-vwln/mgvFrotJuGV8GFhpAOu9iGf3pvTBr6dLPDmUcqVD5OsQpEFyQMAFTxSxWXGEzBj6ld4pZ/9GDfEpXvo0g==", - "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/csstools" - }, - { - "type": "opencollective", - "url": "https://opencollective.com/csstools" - } - ], - "license": "MIT-0", + "node_modules/eslint-scope": { + "version": "8.1.0", + "license": "BSD-2-Clause", "dependencies": { - "@csstools/css-color-parser": "^2.0.4", - "@csstools/css-parser-algorithms": "^2.7.1", - "@csstools/css-tokenizer": "^2.4.1", - "@csstools/postcss-progressive-custom-properties": "^3.3.0", - "@csstools/utilities": "^1.0.0" + "esrecurse": "^4.3.0", + "estraverse": "^5.2.0" }, "engines": { - "node": "^14 || ^16 || >=18" + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" }, - "peerDependencies": { - "postcss": "^8.4" + "funding": { + "url": "https://opencollective.com/eslint" } }, - "node_modules/postcss-loader": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/postcss-loader/-/postcss-loader-4.3.0.tgz", - "integrity": "sha512-M/dSoIiNDOo8Rk0mUqoj4kpGq91gcxCfb9PoyZVdZ76/AuhxylHDYZblNE8o+EQ9AMSASeMFEKxZf5aU6wlx1Q==", - "dev": true, - "license": "MIT", - "dependencies": { - "cosmiconfig": "^7.0.0", - "klona": "^2.0.4", - "loader-utils": "^2.0.0", - "schema-utils": "^3.0.0", - "semver": "^7.3.4" - }, + "node_modules/eslint-visitor-keys": { + "version": "3.4.3", + "license": "Apache-2.0", "engines": { - "node": ">= 10.13.0" + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" }, "funding": { - "type": "opencollective", - "url": "https://opencollective.com/webpack" - }, - "peerDependencies": { - "postcss": "^7.0.0 || ^8.0.1", - "webpack": "^4.0.0 || ^5.0.0" + "url": "https://opencollective.com/eslint" } }, - "node_modules/postcss-loader/node_modules/ajv": { + "node_modules/eslint/node_modules/ajv": { "version": "6.12.6", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", - "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", - "dev": true, "license": "MIT", "dependencies": { "fast-deep-equal": "^3.1.1", @@ -20656,1764 +4784,1260 @@ "url": "https://github.com/sponsors/epoberezkin" } }, - "node_modules/postcss-loader/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, + "node_modules/eslint/node_modules/brace-expansion": { + "version": "1.1.11", "license": "MIT", - "peerDependencies": { - "ajv": "^6.9.1" + "dependencies": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" } }, - "node_modules/postcss-loader/node_modules/cosmiconfig": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-7.1.0.tgz", - "integrity": "sha512-AdmX6xUzdNASswsFtmwSt7Vj8po9IuqXm0UXz7QKPuEUmPB4XyjGfaAr2PSuELMwkRMVH1EpIkX5bTZGRB3eCA==", - "dev": true, - "license": "MIT", - "dependencies": { - "@types/parse-json": "^4.0.0", - "import-fresh": "^3.2.1", - "parse-json": "^5.0.0", - "path-type": "^4.0.0", - "yaml": "^1.10.0" - }, + "node_modules/eslint/node_modules/eslint-visitor-keys": { + "version": "4.1.0", + "license": "Apache-2.0", "engines": { - "node": ">=10" + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" } }, - "node_modules/postcss-loader/node_modules/json-schema-traverse": { + "node_modules/eslint/node_modules/json-schema-traverse": { "version": "0.4.1", - "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", - "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", - "dev": true, "license": "MIT" }, - "node_modules/postcss-loader/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", + "node_modules/eslint/node_modules/minimatch": { + "version": "3.1.2", + "license": "ISC", "dependencies": { - "big.js": "^5.2.2", - "emojis-list": "^3.0.0", - "json5": "^2.1.2" + "brace-expansion": "^1.1.7" }, "engines": { - "node": ">=8.9.0" + "node": "*" } }, - "node_modules/postcss-loader/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", + "node_modules/esniff": { + "version": "2.0.1", + "license": "ISC", "dependencies": { - "@types/json-schema": "^7.0.8", - "ajv": "^6.12.5", - "ajv-keywords": "^3.5.2" + "d": "^1.0.1", + "es5-ext": "^0.10.62", + "event-emitter": "^0.3.5", + "type": "^2.7.2" }, "engines": { - "node": ">= 10.13.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/webpack" + "node": ">=0.10" } }, - "node_modules/postcss-logical": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/postcss-logical/-/postcss-logical-7.0.1.tgz", - "integrity": "sha512-8GwUQZE0ri0K0HJHkDv87XOLC8DE0msc+HoWLeKdtjDZEwpZ5xuK3QdV6FhmHSQW40LPkg43QzvATRAI3LsRkg==", - "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/csstools" - }, - { - "type": "opencollective", - "url": "https://opencollective.com/csstools" - } - ], - "license": "MIT-0", + "node_modules/espree": { + "version": "10.2.0", + "license": "BSD-2-Clause", "dependencies": { - "postcss-value-parser": "^4.2.0" + "acorn": "^8.12.0", + "acorn-jsx": "^5.3.2", + "eslint-visitor-keys": "^4.1.0" }, "engines": { - "node": "^14 || ^16 || >=18" + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" }, - "peerDependencies": { - "postcss": "^8.4" + "funding": { + "url": "https://opencollective.com/eslint" } }, - "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" - }, + "node_modules/espree/node_modules/eslint-visitor-keys": { + "version": "4.1.0", + "license": "Apache-2.0", "engines": { - "node": "^18.12.0 || ^20.9.0 || >=22.0" + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" }, - "peerDependencies": { - "postcss": "^8.4.31" + "funding": { + "url": "https://opencollective.com/eslint" } }, - "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" + "node_modules/esprima": { + "version": "4.0.1", + "license": "BSD-2-Clause", + "bin": { + "esparse": "bin/esparse.js", + "esvalidate": "bin/esvalidate.js" }, "engines": { - "node": "^18.12.0 || ^20.9.0 || >=22.0" - }, - "peerDependencies": { - "postcss": "^8.4.31" + "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", + "node_modules/esquery": { + "version": "1.6.0", + "license": "BSD-3-Clause", "dependencies": { - "postcss-value-parser": "^4.2.0" + "estraverse": "^5.1.0" }, "engines": { - "node": "^18.12.0 || ^20.9.0 || >=22.0" - }, - "peerDependencies": { - "postcss": "^8.4.31" + "node": ">=0.10" } }, - "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", + "node_modules/esrecurse": { + "version": "4.3.0", + "license": "BSD-2-Clause", "dependencies": { - "colord": "^2.9.3", - "cssnano-utils": "^5.0.0", - "postcss-value-parser": "^4.2.0" + "estraverse": "^5.2.0" }, "engines": { - "node": "^18.12.0 || ^20.9.0 || >=22.0" - }, - "peerDependencies": { - "postcss": "^8.4.31" + "node": ">=4.0" } }, - "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" - }, + "node_modules/estraverse": { + "version": "5.3.0", + "license": "BSD-2-Clause", "engines": { - "node": "^18.12.0 || ^20.9.0 || >=22.0" - }, - "peerDependencies": { - "postcss": "^8.4.31" + "node": ">=4.0" } }, - "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" - }, + "node_modules/estree-walker": { + "version": "2.0.2", + "license": "MIT" + }, + "node_modules/esutils": { + "version": "2.0.3", + "license": "BSD-2-Clause", "engines": { - "node": "^18.12.0 || ^20.9.0 || >=22.0" - }, - "peerDependencies": { - "postcss": "^8.4.31" + "node": ">=0.10.0" } }, - "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==", - "dev": true, - "license": "ISC", + "node_modules/etag": { + "version": "1.8.1", + "license": "MIT", "engines": { - "node": "^10 || ^12 || >= 14" - }, - "peerDependencies": { - "postcss": "^8.1.0" + "node": ">= 0.6" } }, - "node_modules/postcss-modules-local-by-default": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/postcss-modules-local-by-default/-/postcss-modules-local-by-default-4.1.0.tgz", - "integrity": "sha512-rm0bdSv4jC3BDma3s9H19ZddW0aHX6EoqwDYU2IfZhRN+53QrufTRo2IdkAbRqLx4R2IYbZnbjKKxg4VN5oU9Q==", - "dev": true, + "node_modules/event-emitter": { + "version": "0.3.5", "license": "MIT", "dependencies": { - "icss-utils": "^5.0.0", - "postcss-selector-parser": "^7.0.0", - "postcss-value-parser": "^4.1.0" - }, - "engines": { - "node": "^10 || ^12 || >= 14" - }, - "peerDependencies": { - "postcss": "^8.1.0" + "d": "1", + "es5-ext": "~0.10.14" } }, - "node_modules/postcss-modules-local-by-default/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, + "node_modules/express": { + "version": "5.0.1", "license": "MIT", "dependencies": { - "cssesc": "^3.0.0", - "util-deprecate": "^1.0.2" + "accepts": "^2.0.0", + "body-parser": "^2.0.1", + "content-disposition": "^1.0.0", + "content-type": "~1.0.4", + "cookie": "0.7.1", + "cookie-signature": "^1.2.1", + "debug": "4.3.6", + "depd": "2.0.0", + "encodeurl": "~2.0.0", + "escape-html": "~1.0.3", + "etag": "~1.8.1", + "finalhandler": "^2.0.0", + "fresh": "2.0.0", + "http-errors": "2.0.0", + "merge-descriptors": "^2.0.0", + "methods": "~1.1.2", + "mime-types": "^3.0.0", + "on-finished": "2.4.1", + "once": "1.4.0", + "parseurl": "~1.3.3", + "proxy-addr": "~2.0.7", + "qs": "6.13.0", + "range-parser": "~1.2.1", + "router": "^2.0.0", + "safe-buffer": "5.2.1", + "send": "^1.1.0", + "serve-static": "^2.1.0", + "setprototypeof": "1.2.0", + "statuses": "2.0.1", + "type-is": "^2.0.0", + "utils-merge": "1.0.1", + "vary": "~1.1.2" }, "engines": { - "node": ">=4" + "node": ">= 18" } }, - "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" - }, + "node_modules/express/node_modules/cookie": { + "version": "0.7.1", + "license": "MIT", "engines": { - "node": "^10 || ^12 || >= 14" - }, - "peerDependencies": { - "postcss": "^8.1.0" + "node": ">= 0.6" } }, - "node_modules/postcss-modules-scope/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, + "node_modules/express/node_modules/debug": { + "version": "4.3.6", "license": "MIT", "dependencies": { - "cssesc": "^3.0.0", - "util-deprecate": "^1.0.2" + "ms": "2.1.2" }, "engines": { - "node": ">=4" + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } } }, - "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, + "node_modules/express/node_modules/ms": { + "version": "2.1.2", + "license": "MIT" + }, + "node_modules/ext": { + "version": "1.7.0", "license": "ISC", "dependencies": { - "icss-utils": "^5.0.0" - }, - "engines": { - "node": "^10 || ^12 || >= 14" - }, - "peerDependencies": { - "postcss": "^8.1.0" + "type": "^2.7.2" } }, - "node_modules/postcss-nesting": { - "version": "12.1.5", - "resolved": "https://registry.npmjs.org/postcss-nesting/-/postcss-nesting-12.1.5.tgz", - "integrity": "sha512-N1NgI1PDCiAGWPTYrwqm8wpjv0bgDmkYHH72pNsqTCv9CObxjxftdYu6AKtGN+pnJa7FQjMm3v4sp8QJbFsYdQ==", - "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/csstools" - }, - { - "type": "opencollective", - "url": "https://opencollective.com/csstools" - } + "node_modules/extsprintf": { + "version": "1.4.1", + "engines": [ + "node >=0.6.0" ], - "license": "MIT-0", - "dependencies": { - "@csstools/selector-resolve-nested": "^1.1.0", - "@csstools/selector-specificity": "^3.1.1", - "postcss-selector-parser": "^6.1.0" - }, - "engines": { - "node": "^14 || ^16 || >=18" - }, - "peerDependencies": { - "postcss": "^8.4" - } + "license": "MIT" }, - "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/fast-deep-equal": { + "version": "3.1.3", + "license": "MIT" }, - "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, + "node_modules/fast-glob": { + "version": "3.3.2", "license": "MIT", "dependencies": { - "postcss-value-parser": "^4.2.0" + "@nodelib/fs.stat": "^2.0.2", + "@nodelib/fs.walk": "^1.2.3", + "glob-parent": "^5.1.2", + "merge2": "^1.3.0", + "micromatch": "^4.0.4" }, "engines": { - "node": "^18.12.0 || ^20.9.0 || >=22.0" - }, - "peerDependencies": { - "postcss": "^8.4.31" + "node": ">=8.6.0" } }, - "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", + "node_modules/fast-glob/node_modules/glob-parent": { + "version": "5.1.2", + "license": "ISC", "dependencies": { - "postcss-value-parser": "^4.2.0" + "is-glob": "^4.0.1" }, "engines": { - "node": "^18.12.0 || ^20.9.0 || >=22.0" - }, - "peerDependencies": { - "postcss": "^8.4.31" + "node": ">= 6" } }, - "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", + "node_modules/fast-json-stable-stringify": { + "version": "2.1.0", + "license": "MIT" + }, + "node_modules/fast-levenshtein": { + "version": "2.0.6", + "license": "MIT" + }, + "node_modules/fast-printf": { + "version": "1.6.9", + "license": "BSD-3-Clause", "dependencies": { - "postcss-value-parser": "^4.2.0" + "boolean": "^3.1.4" }, "engines": { - "node": "^18.12.0 || ^20.9.0 || >=22.0" - }, - "peerDependencies": { - "postcss": "^8.4.31" + "node": ">=10.0" } }, - "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", + "node_modules/fast-uri": { + "version": "3.0.2", + "license": "MIT" + }, + "node_modules/fastq": { + "version": "1.17.1", + "license": "ISC", "dependencies": { - "postcss-value-parser": "^4.2.0" - }, - "engines": { - "node": "^18.12.0 || ^20.9.0 || >=22.0" - }, - "peerDependencies": { - "postcss": "^8.4.31" + "reusify": "^1.0.4" } }, - "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, + "node_modules/file-entry-cache": { + "version": "8.0.0", "license": "MIT", "dependencies": { - "postcss-value-parser": "^4.2.0" + "flat-cache": "^4.0.0" }, "engines": { - "node": "^18.12.0 || ^20.9.0 || >=22.0" - }, - "peerDependencies": { - "postcss": "^8.4.31" + "node": ">=16.0.0" } }, - "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", + "node_modules/filelist": { + "version": "1.0.4", + "license": "Apache-2.0", "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" + "minimatch": "^5.0.1" } }, - "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", + "node_modules/filelist/node_modules/minimatch": { + "version": "5.1.6", + "license": "ISC", "dependencies": { - "postcss-value-parser": "^4.2.0" + "brace-expansion": "^2.0.1" }, "engines": { - "node": "^18.12.0 || ^20.9.0 || >=22.0" - }, - "peerDependencies": { - "postcss": "^8.4.31" + "node": ">=10" } }, - "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, + "node_modules/fill-range": { + "version": "7.1.1", "license": "MIT", "dependencies": { - "postcss-value-parser": "^4.2.0" + "to-regex-range": "^5.0.1" }, "engines": { - "node": "^18.12.0 || ^20.9.0 || >=22.0" - }, - "peerDependencies": { - "postcss": "^8.4.31" + "node": ">=8" } }, - "node_modules/postcss-opacity-percentage": { + "node_modules/finalhandler": { "version": "2.0.0", - "resolved": "https://registry.npmjs.org/postcss-opacity-percentage/-/postcss-opacity-percentage-2.0.0.tgz", - "integrity": "sha512-lyDrCOtntq5Y1JZpBFzIWm2wG9kbEdujpNt4NLannF+J9c8CgFIzPa80YQfdza+Y+yFfzbYj/rfoOsYsooUWTQ==", - "dev": true, - "funding": [ - { - "type": "kofi", - "url": "https://ko-fi.com/mrcgrtz" - }, - { - "type": "liberapay", - "url": "https://liberapay.com/mrcgrtz" - } - ], - "license": "MIT", - "engines": { - "node": "^14 || ^16 || >=18" - }, - "peerDependencies": { - "postcss": "^8.2" - } - }, - "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" + "debug": "2.6.9", + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "on-finished": "2.4.1", + "parseurl": "~1.3.3", + "statuses": "2.0.1", + "unpipe": "~1.0.0" }, "engines": { - "node": "^18.12.0 || ^20.9.0 || >=22.0" - }, - "peerDependencies": { - "postcss": "^8.4.31" + "node": ">= 0.8" } }, - "node_modules/postcss-overflow-shorthand": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/postcss-overflow-shorthand/-/postcss-overflow-shorthand-5.0.1.tgz", - "integrity": "sha512-XzjBYKLd1t6vHsaokMV9URBt2EwC9a7nDhpQpjoPk2HRTSQfokPfyAS/Q7AOrzUu6q+vp/GnrDBGuj/FCaRqrQ==", - "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/csstools" - }, - { - "type": "opencollective", - "url": "https://opencollective.com/csstools" - } - ], - "license": "MIT-0", + "node_modules/finalhandler/node_modules/debug": { + "version": "2.6.9", + "license": "MIT", "dependencies": { - "postcss-value-parser": "^4.2.0" - }, - "engines": { - "node": "^14 || ^16 || >=18" - }, - "peerDependencies": { - "postcss": "^8.4" + "ms": "2.0.0" } }, - "node_modules/postcss-page-break": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/postcss-page-break/-/postcss-page-break-3.0.4.tgz", - "integrity": "sha512-1JGu8oCjVXLa9q9rFTo4MbeeA5FMe00/9C7lN4va606Rdb+HkxXtXsmEDrIraQ11fGz/WvKWa8gMuCKkrXpTsQ==", - "dev": true, + "node_modules/finalhandler/node_modules/encodeurl": { + "version": "1.0.2", "license": "MIT", - "peerDependencies": { - "postcss": "^8" - } - }, - "node_modules/postcss-place": { - "version": "9.0.1", - "resolved": "https://registry.npmjs.org/postcss-place/-/postcss-place-9.0.1.tgz", - "integrity": "sha512-JfL+paQOgRQRMoYFc2f73pGuG/Aw3tt4vYMR6UA3cWVMxivviPTnMFnFTczUJOA4K2Zga6xgQVE+PcLs64WC8Q==", - "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/csstools" - }, - { - "type": "opencollective", - "url": "https://opencollective.com/csstools" - } - ], - "license": "MIT-0", - "dependencies": { - "postcss-value-parser": "^4.2.0" - }, "engines": { - "node": "^14 || ^16 || >=18" - }, - "peerDependencies": { - "postcss": "^8.4" + "node": ">= 0.8" } }, - "node_modules/postcss-preset-env": { - "version": "9.6.0", - "resolved": "https://registry.npmjs.org/postcss-preset-env/-/postcss-preset-env-9.6.0.tgz", - "integrity": "sha512-Lxfk4RYjUdwPCYkc321QMdgtdCP34AeI94z+/8kVmqnTIlD4bMRQeGcMZgwz8BxHrzQiFXYIR5d7k/9JMs2MEA==", - "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/csstools" - }, - { - "type": "opencollective", - "url": "https://opencollective.com/csstools" - } - ], - "license": "MIT-0", - "dependencies": { - "@csstools/postcss-cascade-layers": "^4.0.6", - "@csstools/postcss-color-function": "^3.0.19", - "@csstools/postcss-color-mix-function": "^2.0.19", - "@csstools/postcss-content-alt-text": "^1.0.0", - "@csstools/postcss-exponential-functions": "^1.0.9", - "@csstools/postcss-font-format-keywords": "^3.0.2", - "@csstools/postcss-gamut-mapping": "^1.0.11", - "@csstools/postcss-gradients-interpolation-method": "^4.0.20", - "@csstools/postcss-hwb-function": "^3.0.18", - "@csstools/postcss-ic-unit": "^3.0.7", - "@csstools/postcss-initial": "^1.0.1", - "@csstools/postcss-is-pseudo-class": "^4.0.8", - "@csstools/postcss-light-dark-function": "^1.0.8", - "@csstools/postcss-logical-float-and-clear": "^2.0.1", - "@csstools/postcss-logical-overflow": "^1.0.1", - "@csstools/postcss-logical-overscroll-behavior": "^1.0.1", - "@csstools/postcss-logical-resize": "^2.0.1", - "@csstools/postcss-logical-viewport-units": "^2.0.11", - "@csstools/postcss-media-minmax": "^1.1.8", - "@csstools/postcss-media-queries-aspect-ratio-number-values": "^2.0.11", - "@csstools/postcss-nested-calc": "^3.0.2", - "@csstools/postcss-normalize-display-values": "^3.0.2", - "@csstools/postcss-oklab-function": "^3.0.19", - "@csstools/postcss-progressive-custom-properties": "^3.3.0", - "@csstools/postcss-relative-color-syntax": "^2.0.19", - "@csstools/postcss-scope-pseudo-class": "^3.0.1", - "@csstools/postcss-stepped-value-functions": "^3.0.10", - "@csstools/postcss-text-decoration-shorthand": "^3.0.7", - "@csstools/postcss-trigonometric-functions": "^3.0.10", - "@csstools/postcss-unset-value": "^3.0.1", - "autoprefixer": "^10.4.19", - "browserslist": "^4.23.1", - "css-blank-pseudo": "^6.0.2", - "css-has-pseudo": "^6.0.5", - "css-prefers-color-scheme": "^9.0.1", - "cssdb": "^8.1.0", - "postcss-attribute-case-insensitive": "^6.0.3", - "postcss-clamp": "^4.1.0", - "postcss-color-functional-notation": "^6.0.14", - "postcss-color-hex-alpha": "^9.0.4", - "postcss-color-rebeccapurple": "^9.0.3", - "postcss-custom-media": "^10.0.8", - "postcss-custom-properties": "^13.3.12", - "postcss-custom-selectors": "^7.1.12", - "postcss-dir-pseudo-class": "^8.0.1", - "postcss-double-position-gradients": "^5.0.7", - "postcss-focus-visible": "^9.0.1", - "postcss-focus-within": "^8.0.1", - "postcss-font-variant": "^5.0.0", - "postcss-gap-properties": "^5.0.1", - "postcss-image-set-function": "^6.0.3", - "postcss-lab-function": "^6.0.19", - "postcss-logical": "^7.0.1", - "postcss-nesting": "^12.1.5", - "postcss-opacity-percentage": "^2.0.0", - "postcss-overflow-shorthand": "^5.0.1", - "postcss-page-break": "^3.0.4", - "postcss-place": "^9.0.1", - "postcss-pseudo-class-any-link": "^9.0.2", - "postcss-replace-overflow-wrap": "^4.0.0", - "postcss-selector-not": "^7.0.2" - }, - "engines": { - "node": "^14 || ^16 || >=18" - }, - "peerDependencies": { - "postcss": "^8.4" - } + "node_modules/finalhandler/node_modules/ms": { + "version": "2.0.0", + "license": "MIT" }, - "node_modules/postcss-pseudo-class-any-link": { - "version": "9.0.2", - "resolved": "https://registry.npmjs.org/postcss-pseudo-class-any-link/-/postcss-pseudo-class-any-link-9.0.2.tgz", - "integrity": "sha512-HFSsxIqQ9nA27ahyfH37cRWGk3SYyQLpk0LiWw/UGMV4VKT5YG2ONee4Pz/oFesnK0dn2AjcyequDbIjKJgB0g==", - "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/csstools" - }, - { - "type": "opencollective", - "url": "https://opencollective.com/csstools" - } - ], - "license": "MIT-0", + "node_modules/find-up": { + "version": "5.0.0", + "license": "MIT", "dependencies": { - "postcss-selector-parser": "^6.0.13" + "locate-path": "^6.0.0", + "path-exists": "^4.0.0" }, "engines": { - "node": "^14 || ^16 || >=18" + "node": ">=10" }, - "peerDependencies": { - "postcss": "^8.4" + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "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" + "node_modules/flat": { + "version": "6.0.1", + "license": "BSD-3-Clause", + "bin": { + "flat": "cli.js" }, "engines": { - "node": "^18.12.0 || ^20.9.0 || >=22.0" - }, - "peerDependencies": { - "postcss": "^8.4.31" + "node": ">=18" } }, - "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, + "node_modules/flat-cache": { + "version": "4.0.1", "license": "MIT", "dependencies": { - "postcss-value-parser": "^4.2.0" + "flatted": "^3.2.9", + "keyv": "^4.5.4" }, "engines": { - "node": "^18.12.0 || ^20.9.0 || >=22.0" - }, - "peerDependencies": { - "postcss": "^8.4.31" + "node": ">=16" } }, - "node_modules/postcss-replace-overflow-wrap": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/postcss-replace-overflow-wrap/-/postcss-replace-overflow-wrap-4.0.0.tgz", - "integrity": "sha512-KmF7SBPphT4gPPcKZc7aDkweHiKEEO8cla/GjcBK+ckKxiZslIu3C4GCRW3DNfL0o7yW7kMQu9xlZ1kXRXLXtw==", - "dev": true, - "license": "MIT", - "peerDependencies": { - "postcss": "^8.0.3" - } + "node_modules/flatted": { + "version": "3.3.1", + "license": "ISC" }, - "node_modules/postcss-selector-not": { - "version": "7.0.2", - "resolved": "https://registry.npmjs.org/postcss-selector-not/-/postcss-selector-not-7.0.2.tgz", - "integrity": "sha512-/SSxf/90Obye49VZIfc0ls4H0P6i6V1iHv0pzZH8SdgvZOPFkF37ef1r5cyWcMflJSFJ5bfuoluTnFnBBFiuSA==", - "dev": true, + "node_modules/follow-redirects": { + "version": "1.15.9", "funding": [ { - "type": "github", - "url": "https://github.com/sponsors/csstools" - }, - { - "type": "opencollective", - "url": "https://opencollective.com/csstools" + "type": "individual", + "url": "https://github.com/sponsors/RubenVerborgh" } ], "license": "MIT", - "dependencies": { - "postcss-selector-parser": "^6.0.13" - }, - "engines": { - "node": "^14 || ^16 || >=18" - }, - "peerDependencies": { - "postcss": "^8.4" - } - }, - "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-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" + "node": ">=4.0" }, - "peerDependencies": { - "postcss": "^8.4.31" + "peerDependenciesMeta": { + "debug": { + "optional": true + } } }, - "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==", + "node_modules/for-each": { + "version": "0.3.3", "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" + "is-callable": "^1.1.3" } }, - "node_modules/postcss-url": { - "version": "10.1.3", - "resolved": "https://registry.npmjs.org/postcss-url/-/postcss-url-10.1.3.tgz", - "integrity": "sha512-FUzyxfI5l2tKmXdYc6VTu3TWZsInayEKPbiyW+P6vmmIrrb4I6CGX0BFoewgYHLK+oIL5FECEK02REYRpBvUCw==", - "dev": true, - "license": "MIT", + "node_modules/foreground-child": { + "version": "3.3.0", + "license": "ISC", "dependencies": { - "make-dir": "~3.1.0", - "mime": "~2.5.2", - "minimatch": "~3.0.4", - "xxhashjs": "~0.2.2" + "cross-spawn": "^7.0.0", + "signal-exit": "^4.0.1" }, "engines": { - "node": ">=10" + "node": ">=14" }, - "peerDependencies": { - "postcss": "^8.0.0" + "funding": { + "url": "https://github.com/sponsors/isaacs" } }, - "node_modules/postcss-url/node_modules/minimatch": { - "version": "3.0.8", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.8.tgz", - "integrity": "sha512-6FsRAQsxQ61mw+qP1ZzbL9Bc78x2p5OqNgNpnoAFLTrX8n5Kxph0CsnhmKKNXTWjXqU5L0pGPR7hYk+XWZr60Q==", - "dev": true, - "license": "ISC", + "node_modules/form-data": { + "version": "4.0.1", + "license": "MIT", "dependencies": { - "brace-expansion": "^1.1.7" + "asynckit": "^0.4.0", + "combined-stream": "^1.0.8", + "mime-types": "^2.1.12" }, "engines": { - "node": "*" + "node": ">= 6" } }, - "node_modules/postcss-value-parser": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-4.2.0.tgz", - "integrity": "sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ==", - "dev": true, - "license": "MIT" - }, - "node_modules/postcss/node_modules/nanoid": { - "version": "3.3.7", - "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.7.tgz", - "integrity": "sha512-eSRppjcPIatRIMC1U6UngP8XFcz8MQWGQdt1MTBQ7NaAmvXDfvNxbvWV3x2y6CdEUciCSsDHDQZbhYaB8QEo2g==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/ai" - } - ], + "node_modules/form-data/node_modules/mime-db": { + "version": "1.52.0", "license": "MIT", - "bin": { - "nanoid": "bin/nanoid.cjs" - }, "engines": { - "node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1" + "node": ">= 0.6" } }, - "node_modules/precond": { - "version": "0.2.3", - "resolved": "https://registry.npmjs.org/precond/-/precond-0.2.3.tgz", - "integrity": "sha512-QCYG84SgGyGzqJ/vlMsxeXd/pgL/I94ixdNFyh1PusWmTCyVfPJjZ1K1jvHtsbfnXQs2TSkEP2fR7QiMZAnKFQ==", + "node_modules/form-data/node_modules/mime-types": { + "version": "2.1.35", + "license": "MIT", + "dependencies": { + "mime-db": "1.52.0" + }, "engines": { "node": ">= 0.6" } }, - "node_modules/prelude-ls": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.2.1.tgz", - "integrity": "sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==", - "dev": true, + "node_modules/forwarded": { + "version": "0.2.0", "license": "MIT", "engines": { - "node": ">= 0.8.0" + "node": ">= 0.6" } }, - "node_modules/prepend-http": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/prepend-http/-/prepend-http-1.0.4.tgz", - "integrity": "sha512-PhmXi5XmoyKw1Un4E+opM2KcsJInDvKyuOumcjjw3waw86ZNjHwVUOOWLc4bCzLdcKNaWBH9e99sbWzDQsVaYg==", - "dev": true, + "node_modules/fresh": { + "version": "2.0.0", "license": "MIT", "engines": { - "node": ">=0.10.0" + "node": ">= 0.8" } }, - "node_modules/prettier": { - "version": "2.8.8", - "resolved": "https://registry.npmjs.org/prettier/-/prettier-2.8.8.tgz", - "integrity": "sha512-tdN8qQGvNjw4CHbY+XXk0JgCXn9QiF21a55rBe5LJAU+kDyC4WQn4+awm2Xfk2lQMk5fKup9XgzTZtGkjBdP9Q==", + "node_modules/function-bind": { + "version": "1.1.2", "license": "MIT", - "bin": { - "prettier": "bin-prettier.js" - }, - "engines": { - "node": ">=10.13.0" - }, "funding": { - "url": "https://github.com/prettier/prettier?sponsor=1" + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/pretty-bytes": { - "version": "5.6.0", - "resolved": "https://registry.npmjs.org/pretty-bytes/-/pretty-bytes-5.6.0.tgz", - "integrity": "sha512-FFw039TmrBqFK8ma/7OL3sDz/VytdtJr044/QUJtH0wK9lb9jLq9tJyIxUwtQJHwar2BqtiA4iCWSwo9JLkzFg==", + "node_modules/function.prototype.name": { + "version": "1.1.6", + "dev": true, "license": "MIT", + "dependencies": { + "call-bind": "^1.0.2", + "define-properties": "^1.2.0", + "es-abstract": "^1.22.1", + "functions-have-names": "^1.2.3" + }, "engines": { - "node": ">=6" + "node": ">= 0.4" }, "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/pretty-error": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/pretty-error/-/pretty-error-2.1.2.tgz", - "integrity": "sha512-EY5oDzmsX5wvuynAByrmY0P0hcp+QpnAKbJng2A2MPjVKXCxrDSUkzghVJ4ZGPIv+JC4gX8fPUWscC0RtjsWGw==", + "node_modules/functions-have-names": { + "version": "1.2.3", "dev": true, "license": "MIT", - "dependencies": { - "lodash": "^4.17.20", - "renderkid": "^2.0.4" + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/pretty-ms": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/pretty-ms/-/pretty-ms-7.0.1.tgz", - "integrity": "sha512-973driJZvxiGOQ5ONsFhOF/DtzPMOMtgC11kCpUrPGMTgqp2q/1gwzCquocrN33is0VZ5GFHXZYMM9l6h67v2Q==", - "dev": true, + "node_modules/get-caller-file": { + "version": "2.0.5", + "license": "ISC", + "engines": { + "node": "6.* || 8.* || >= 10.*" + } + }, + "node_modules/get-intrinsic": { + "version": "1.2.4", "license": "MIT", "dependencies": { - "parse-ms": "^2.1.0" + "es-errors": "^1.3.0", + "function-bind": "^1.1.2", + "has-proto": "^1.0.1", + "has-symbols": "^1.0.3", + "hasown": "^2.0.0" }, "engines": { - "node": ">=10" + "node": ">= 0.4" }, "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/pretty-time": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/pretty-time/-/pretty-time-1.1.0.tgz", - "integrity": "sha512-28iF6xPQrP8Oa6uxE6a1biz+lWeTOAPKggvjB8HAs6nVMKZwf5bG++632Dx614hIWgUPkgivRfG+a8uAXGTIbA==", + "node_modules/get-symbol-description": { + "version": "1.0.2", "dev": true, "license": "MIT", + "dependencies": { + "call-bind": "^1.0.5", + "es-errors": "^1.3.0", + "get-intrinsic": "^1.2.4" + }, "engines": { - "node": ">=4" + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "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==", + "node_modules/get-tsconfig": { + "version": "4.8.1", "dev": true, "license": "MIT", - "engines": { - "node": ">= 0.6.0" + "dependencies": { + "resolve-pkg-maps": "^1.0.0" + }, + "funding": { + "url": "https://github.com/privatenumber/get-tsconfig?sponsor=1" } }, - "node_modules/process-nextick-args": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz", - "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==", - "license": "MIT" - }, - "node_modules/process-on-spawn": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/process-on-spawn/-/process-on-spawn-1.1.0.tgz", - "integrity": "sha512-JOnOPQ/8TZgjs1JIH/m9ni7FfimjNa/PRx7y/Wb5qdItsnhO0jE4AT7fC0HjC28DUQWDr50dwSYZLdRMlqDq3Q==", + "node_modules/git-raw-commits": { + "version": "4.0.0", "dev": true, "license": "MIT", "dependencies": { - "fromentries": "^1.2.0" + "dargs": "^8.0.0", + "meow": "^12.0.1", + "split2": "^4.0.0" + }, + "bin": { + "git-raw-commits": "cli.mjs" }, "engines": { - "node": ">=8" + "node": ">=16" } }, - "node_modules/progress": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/progress/-/progress-2.0.3.tgz", - "integrity": "sha512-7PiHtLll5LdnKIMw100I+8xJXR5gW2QwWYkT6iJva0bXitZKa/XMrSbdmg3r2Xnaidz9Qumd0VPaMrZlF9V9sA==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=0.4.0" + "node_modules/glob": { + "version": "10.4.5", + "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/prom-client": { - "version": "14.2.0", - "resolved": "https://registry.npmjs.org/prom-client/-/prom-client-14.2.0.tgz", - "integrity": "sha512-sF308EhTenb/pDRPakm+WgiN+VdM/T1RaHj1x+MvAuT8UiQP8JmOEbxVqtkbfR4LrvOg5n7ic01kRBDGXjYikA==", - "license": "Apache-2.0", + "node_modules/glob-parent": { + "version": "6.0.2", + "license": "ISC", "dependencies": { - "tdigest": "^0.1.1" + "is-glob": "^4.0.3" }, "engines": { - "node": ">=10" + "node": ">=10.13.0" } }, - "node_modules/promise-inflight": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/promise-inflight/-/promise-inflight-1.0.1.tgz", - "integrity": "sha512-6zWPyEOFaQBJYcGMHBKTKJ3u6TBsnMFOIZSa6ce1e/ZrrsOlnHRHbabMjLiBYKp+n44X9eUI6VUPaukCXHuG4g==", + "node_modules/global-directory": { + "version": "4.0.1", "dev": true, - "license": "ISC" - }, - "node_modules/proper-lockfile": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/proper-lockfile/-/proper-lockfile-4.1.2.tgz", - "integrity": "sha512-TjNPblN4BwAWMXU8s9AEz4JmQxnD1NNL7bNOY/AKUzyamc379FWASUhc/K1pL2noVb+XmZKLL68cjzLsiOAMaA==", "license": "MIT", "dependencies": { - "graceful-fs": "^4.2.4", - "retry": "^0.12.0", - "signal-exit": "^3.0.2" + "ini": "4.1.1" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/proper-lockfile/node_modules/signal-exit": { - "version": "3.0.7", - "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz", - "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==", - "license": "ISC" + "node_modules/globals": { + "version": "14.0.0", + "license": "MIT", + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } }, - "node_modules/property-expr": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/property-expr/-/property-expr-2.0.6.tgz", - "integrity": "sha512-SVtmxhRE/CGkn3eZY1T6pC8Nln6Fr/lu1mKSgRud0eC73whjGfoAogbn78LkD8aFL0zz3bAFerKSnOl7NlErBA==", + "node_modules/globalthis": { + "version": "1.0.4", "dev": true, "license": "MIT", - "optional": true - }, - "node_modules/proto-list": { - "version": "1.2.4", - "resolved": "https://registry.npmjs.org/proto-list/-/proto-list-1.2.4.tgz", - "integrity": "sha512-vtK/94akxsTMhe0/cbfpR+syPuszcuwhqVjJq26CuNDgFGj682oRBXOP5MJpv2r7JtE8MsiepGIqvvOTBwn2vA==", - "license": "ISC" - }, - "node_modules/protocols": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/protocols/-/protocols-2.0.1.tgz", - "integrity": "sha512-/XJ368cyBJ7fzLMwLKv1e4vLxOju2MNAIokcr7meSaNcVbWz/CPcW22cP04mwxOErdA5mwjA8Q6w/cdAQxVn7Q==", - "license": "MIT" + "dependencies": { + "define-properties": "^1.2.1", + "gopd": "^1.0.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } }, - "node_modules/proxy-addr": { - "version": "2.0.7", - "resolved": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.7.tgz", - "integrity": "sha512-llQsMLSUDUPT44jdrU/O37qlnifitDP+ZwrmmZcoSKyLKvtZxpyV0n2/bD/N4tBAAZ/gJEdZU7KMraoK1+XYAg==", + "node_modules/globby": { + "version": "11.1.0", "license": "MIT", "dependencies": { - "forwarded": "0.2.0", - "ipaddr.js": "1.9.1" + "array-union": "^2.1.0", + "dir-glob": "^3.0.1", + "fast-glob": "^3.2.9", + "ignore": "^5.2.0", + "merge2": "^1.4.1", + "slash": "^3.0.0" }, "engines": { - "node": ">= 0.10" + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "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" - }, - "node_modules/prr": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/prr/-/prr-1.0.1.tgz", - "integrity": "sha512-yPw4Sng1gWghHQWj0B3ZggWUm4qVbPwPFcRG8KyxiU7J2OHFSoEHKS+EZ3fv5l1t9CyCiop6l/ZYeWbrgoQejw==", - "dev": true, - "license": "MIT" - }, - "node_modules/pseudomap": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/pseudomap/-/pseudomap-1.0.2.tgz", - "integrity": "sha512-b/YwNhb8lk1Zz2+bXXpS/LK9OisiZZ1SNsSLxN1x2OXVEhW2Ckr/7mWE5vrC1ZTiJlD9g19jWszTmJsB+oEpFQ==", - "license": "ISC" - }, - "node_modules/pstree.remy": { - "version": "1.1.8", - "resolved": "https://registry.npmjs.org/pstree.remy/-/pstree.remy-1.1.8.tgz", - "integrity": "sha512-77DZwxQmxKnu3aR542U+X8FypNzbfJ+C5XQDk3uWjWxn6151aIMGthWYRXTqT1E5oJvg+ljaa2OJi+VfvCOQ8w==", - "dev": true, - "license": "MIT" + "node_modules/gm": { + "version": "1.25.0", + "license": "MIT", + "dependencies": { + "array-parallel": "~0.1.3", + "array-series": "~0.1.5", + "cross-spawn": "^4.0.0", + "debug": "^3.1.0" + }, + "engines": { + "node": ">=14" + } }, - "node_modules/public-encrypt": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/public-encrypt/-/public-encrypt-4.0.3.tgz", - "integrity": "sha512-zVpa8oKZSz5bTMTFClc1fQOnyyEzpl5ozpi1B5YcvBrdohMjH2rfsBtyXcuNuwjsDIXmBYlF2N5FlJYhR29t8Q==", - "dev": true, + "node_modules/gm/node_modules/cross-spawn": { + "version": "4.0.2", "license": "MIT", "dependencies": { - "bn.js": "^4.1.0", - "browserify-rsa": "^4.0.0", - "create-hash": "^1.1.0", - "parse-asn1": "^5.0.0", - "randombytes": "^2.0.1", - "safe-buffer": "^5.1.2" + "lru-cache": "^4.0.1", + "which": "^1.2.9" } }, - "node_modules/pump": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/pump/-/pump-3.0.2.tgz", - "integrity": "sha512-tUPXtzlGM8FE3P0ZL6DVs/3P58k9nk8/jZeQCurTJylQA8qFYzHFfhBJkuqyE0FifOsQ0uKWekiZ5g8wtr28cw==", - "dev": true, + "node_modules/gm/node_modules/debug": { + "version": "3.2.7", "license": "MIT", "dependencies": { - "end-of-stream": "^1.1.0", - "once": "^1.3.1" + "ms": "^2.1.1" } }, - "node_modules/pumpify": { - "version": "1.5.1", - "resolved": "https://registry.npmjs.org/pumpify/-/pumpify-1.5.1.tgz", - "integrity": "sha512-oClZI37HvuUJJxSKKrC17bZ9Cu0ZYhEAGPsPUy9KlMUmv9dKX2o77RUmq7f3XjIxbwyGwYzbzQ1L2Ks8sIradQ==", - "dev": true, - "license": "MIT", + "node_modules/gm/node_modules/lru-cache": { + "version": "4.1.5", + "license": "ISC", "dependencies": { - "duplexify": "^3.6.0", - "inherits": "^2.0.3", - "pump": "^2.0.0" + "pseudomap": "^1.0.2", + "yallist": "^2.1.2" } }, - "node_modules/pumpify/node_modules/pump": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/pump/-/pump-2.0.1.tgz", - "integrity": "sha512-ruPMNRkN3MHP1cWJc9OWr+T/xDP0jhXYCLfJcBuX54hhfIBnaQmAUMfDcG4DM5UMWByBbJY69QSphm3jtDKIkA==", - "dev": true, - "license": "MIT", + "node_modules/gm/node_modules/which": { + "version": "1.3.1", + "license": "ISC", "dependencies": { - "end-of-stream": "^1.1.0", - "once": "^1.3.1" + "isexe": "^2.0.0" + }, + "bin": { + "which": "bin/which" } }, - "node_modules/punycode": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.4.1.tgz", - "integrity": "sha512-jmYNElW7yvO7TV33CjSmvSiE2yco3bV2czu/OzDKdMNVZQWfxCblURLhf+47syQRBntjfLdd/H0egrzIG+oaFQ==", - "dev": true, - "license": "MIT" + "node_modules/gm/node_modules/yallist": { + "version": "2.1.2", + "license": "ISC" }, - "node_modules/qrcode": { - "version": "1.5.4", - "resolved": "https://registry.npmjs.org/qrcode/-/qrcode-1.5.4.tgz", - "integrity": "sha512-1ca71Zgiu6ORjHqFBDpnSMTR2ReToX4l1Au1VFLyVeBTFavzQnv5JxMFr3ukHVKpSrSA2MCk0lNJSykjUfz7Zg==", + "node_modules/gopd": { + "version": "1.0.1", "license": "MIT", "dependencies": { - "dijkstrajs": "^1.0.1", - "pngjs": "^5.0.0", - "yargs": "^15.3.1" - }, - "bin": { - "qrcode": "bin/qrcode" + "get-intrinsic": "^1.1.3" }, - "engines": { - "node": ">=10.13.0" + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/qrcode/node_modules/cliui": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/cliui/-/cliui-6.0.0.tgz", - "integrity": "sha512-t6wbgtoCXvAzst7QgXxJYqPt0usEfbgQdftEPbLL/cvv6HPE5VgvqCuAIDR0NgU52ds6rFwqrgakNLrHEjCbrQ==", - "license": "ISC", - "dependencies": { - "string-width": "^4.2.0", - "strip-ansi": "^6.0.0", - "wrap-ansi": "^6.2.0" + "node_modules/graceful-fs": { + "version": "4.2.11", + "dev": true, + "license": "ISC" + }, + "node_modules/graphemer": { + "version": "1.4.0", + "dev": true, + "license": "MIT" + }, + "node_modules/has-bigints": { + "version": "1.0.2", + "dev": true, + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/qrcode/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==", + "node_modules/has-flag": { + "version": "4.0.0", "license": "MIT", - "dependencies": { - "locate-path": "^5.0.0", - "path-exists": "^4.0.0" - }, "engines": { "node": ">=8" } }, - "node_modules/qrcode/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==", + "node_modules/has-property-descriptors": { + "version": "1.0.2", "license": "MIT", "dependencies": { - "p-locate": "^4.1.0" + "es-define-property": "^1.0.0" }, - "engines": { - "node": ">=8" + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/qrcode/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==", + "node_modules/has-proto": { + "version": "1.0.3", "license": "MIT", - "dependencies": { - "p-try": "^2.0.0" - }, "engines": { - "node": ">=6" + "node": ">= 0.4" }, "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/qrcode/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==", + "node_modules/has-symbols": { + "version": "1.0.3", "license": "MIT", - "dependencies": { - "p-limit": "^2.2.0" - }, "engines": { - "node": ">=8" + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/qrcode/node_modules/wrap-ansi": { - "version": "6.2.0", - "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-6.2.0.tgz", - "integrity": "sha512-r6lPcBGxZXlIcymEu7InxDMhdW0KDxpLgoFLcguasxCaJ/SOIZwINatK9KY/tf+ZrlywOKU0UDj3ATXUBfxJXA==", + "node_modules/has-tostringtag": { + "version": "1.0.2", + "dev": true, "license": "MIT", "dependencies": { - "ansi-styles": "^4.0.0", - "string-width": "^4.1.0", - "strip-ansi": "^6.0.0" + "has-symbols": "^1.0.3" }, "engines": { - "node": ">=8" + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/qrcode/node_modules/y18n": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/y18n/-/y18n-4.0.3.tgz", - "integrity": "sha512-JKhqTOwSrqNA1NY5lSztJ1GrBiUodLMmIZuLiDaMRJ+itFd+ABVE8XBjOvIWL+rSqNDC74LCSFmlb/U4UZ4hJQ==", - "license": "ISC" - }, - "node_modules/qrcode/node_modules/yargs": { - "version": "15.4.1", - "resolved": "https://registry.npmjs.org/yargs/-/yargs-15.4.1.tgz", - "integrity": "sha512-aePbxDmcYW++PaqBsJ+HYUFwCdv4LVvdnhBy78E57PIor8/OVvhMrADFFEDh8DHDFRv/O9i3lPhsENjO7QX0+A==", + "node_modules/hasown": { + "version": "2.0.2", "license": "MIT", "dependencies": { - "cliui": "^6.0.0", - "decamelize": "^1.2.0", - "find-up": "^4.1.0", - "get-caller-file": "^2.0.1", - "require-directory": "^2.1.1", - "require-main-filename": "^2.0.0", - "set-blocking": "^2.0.0", - "string-width": "^4.2.0", - "which-module": "^2.0.0", - "y18n": "^4.0.0", - "yargs-parser": "^18.1.2" + "function-bind": "^1.1.2" }, "engines": { - "node": ">=8" + "node": ">= 0.4" } }, - "node_modules/qrcode/node_modules/yargs-parser": { - "version": "18.1.3", - "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-18.1.3.tgz", - "integrity": "sha512-o50j0JeToy/4K6OZcaQmW6lyXXKhq7csREXcDwk2omFPJEwUNOVtJKvmDr9EI1fAJZUyZcRF7kxGBWmRXudrCQ==", - "license": "ISC", + "node_modules/he": { + "version": "1.2.0", + "license": "MIT", + "bin": { + "he": "bin/he" + } + }, + "node_modules/hookable": { + "version": "5.5.3", + "license": "MIT" + }, + "node_modules/html-minifier": { + "version": "4.0.0", + "license": "MIT", "dependencies": { - "camelcase": "^5.0.0", - "decamelize": "^1.2.0" + "camel-case": "^3.0.0", + "clean-css": "^4.2.1", + "commander": "^2.19.0", + "he": "^1.2.0", + "param-case": "^2.1.1", + "relateurl": "^0.2.7", + "uglify-js": "^3.5.1" + }, + "bin": { + "html-minifier": "cli.js" }, "engines": { "node": ">=6" } }, - "node_modules/qs": { - "version": "6.13.0", - "resolved": "https://registry.npmjs.org/qs/-/qs-6.13.0.tgz", - "integrity": "sha512-+38qI9SOr8tfZ4QmJNplMUxqjbe7LKvvZgWdExBOmd+egZTtjLB67Gu0HRX3u/XOq7UU2Nx6nsjvS16Z9uwfpg==", - "license": "BSD-3-Clause", + "node_modules/html-minifier/node_modules/commander": { + "version": "2.20.3", + "license": "MIT" + }, + "node_modules/htmlparser2": { + "version": "8.0.2", + "funding": [ + "https://github.com/fb55/htmlparser2?sponsor=1", + { + "type": "github", + "url": "https://github.com/sponsors/fb55" + } + ], + "license": "MIT", "dependencies": { - "side-channel": "^1.0.6" - }, - "engines": { - "node": ">=0.6" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" + "domelementtype": "^2.3.0", + "domhandler": "^5.0.3", + "domutils": "^3.0.1", + "entities": "^4.4.0" } }, - "node_modules/query-string": { - "version": "4.3.4", - "resolved": "https://registry.npmjs.org/query-string/-/query-string-4.3.4.tgz", - "integrity": "sha512-O2XLNDBIg1DnTOa+2XrIwSiXEV8h2KImXUnjhhn2+UsvZ+Es2uyd5CCRTNQlDGbzUQOW3aYCBx9rVA6dzsiY7Q==", - "dev": true, + "node_modules/http-errors": { + "version": "2.0.0", "license": "MIT", "dependencies": { - "object-assign": "^4.1.0", - "strict-uri-encode": "^1.0.0" + "depd": "2.0.0", + "inherits": "2.0.4", + "setprototypeof": "1.2.0", + "statuses": "2.0.1", + "toidentifier": "1.0.1" }, "engines": { - "node": ">=0.10.0" + "node": ">= 0.8" } }, - "node_modules/querystring-es3": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/querystring-es3/-/querystring-es3-0.2.1.tgz", - "integrity": "sha512-773xhDQnZBMFobEiztv8LIl70ch5MSF/jUQVlhwFyBILqq96anmoctVIYz+ZRp0qbCKATTn6ev02M3r7Ga5vqA==", - "dev": true, + "node_modules/http-terminator": { + "version": "3.2.0", + "license": "BSD-3-Clause", + "dependencies": { + "delay": "^5.0.0", + "p-wait-for": "^3.2.0", + "roarr": "^7.0.4", + "type-fest": "^2.3.3" + }, "engines": { - "node": ">=0.4.x" + "node": ">=14" } }, - "node_modules/queue-microtask": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz", - "integrity": "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==", - "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/humanize-ms": { + "version": "1.2.1", + "license": "MIT", + "dependencies": { + "ms": "^2.0.0" + } }, - "node_modules/quick-lru": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/quick-lru/-/quick-lru-5.1.1.tgz", - "integrity": "sha512-WuyALRjWPDGtt/wzJiadO5AXY+8hZ80hVpe6MyivgraREW751X3SbhRvG3eLKOYN+8VEvqLcf3wdnt44Z4S4SA==", + "node_modules/husky": { + "version": "9.1.6", "dev": true, "license": "MIT", + "bin": { + "husky": "bin.js" + }, "engines": { - "node": ">=10" + "node": ">=18" }, "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "url": "https://github.com/sponsors/typicode" } }, - "node_modules/randombytes": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/randombytes/-/randombytes-2.1.0.tgz", - "integrity": "sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ==", + "node_modules/i18n": { + "version": "0.15.1", "license": "MIT", "dependencies": { - "safe-buffer": "^5.1.0" + "@messageformat/core": "^3.0.0", + "debug": "^4.3.3", + "fast-printf": "^1.6.9", + "make-plural": "^7.0.0", + "math-interval-parser": "^2.0.1", + "mustache": "^4.2.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/mashpie" } }, - "node_modules/randomfill": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/randomfill/-/randomfill-1.0.4.tgz", - "integrity": "sha512-87lcbR8+MhcWcUiQ+9e+Rwx8MyR2P7qnt15ynUlbm3TU/fjbgz4GsvfSUDTemtCCtVCqb4ZcEFlyPNTh9bBTLw==", - "dev": true, + "node_modules/iconv-lite": { + "version": "0.5.2", "license": "MIT", "dependencies": { - "randombytes": "^2.0.5", - "safe-buffer": "^5.1.0" + "safer-buffer": ">= 2.1.2 < 3" + }, + "engines": { + "node": ">=0.10.0" } }, - "node_modules/range-parser": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.1.tgz", - "integrity": "sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==", + "node_modules/iframe-resizer": { + "version": "4.4.5", + "hasInstallScript": true, "license": "MIT", "engines": { - "node": ">= 0.6" + "node": ">=0.8.0" + }, + "funding": { + "type": "individual", + "url": "https://iframe-resizer.com//pricing" } }, - "node_modules/rate-limiter-flexible": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/rate-limiter-flexible/-/rate-limiter-flexible-2.4.2.tgz", - "integrity": "sha512-rMATGGOdO1suFyf/mI5LYhts71g1sbdhmd6YvdiXO2gJnd42Tt6QS4JUKJKSWVVkMtBacm6l40FR7Trjo6Iruw==", - "license": "ISC" - }, - "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==", + "node_modules/ignore": { + "version": "5.3.2", "license": "MIT", - "dependencies": { - "bytes": "3.1.2", - "http-errors": "2.0.0", - "iconv-lite": "0.4.24", - "unpipe": "1.0.0" - }, "engines": { - "node": ">= 0.8" + "node": ">= 4" } }, - "node_modules/raw-loader": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/raw-loader/-/raw-loader-4.0.2.tgz", - "integrity": "sha512-ZnScIV3ag9A4wPX/ZayxL/jZH+euYb6FcUinPcgiQW0+UBtEv0O6Q3lGd3cqJ+GHH+rksEv3Pj99oxJ3u3VIKA==", - "dev": true, + "node_modules/immer": { + "version": "10.1.1", + "license": "MIT", + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/immer" + } + }, + "node_modules/immutable": { + "version": "4.3.7", + "license": "MIT" + }, + "node_modules/import-fresh": { + "version": "3.3.0", "license": "MIT", "dependencies": { - "loader-utils": "^2.0.0", - "schema-utils": "^3.0.0" + "parent-module": "^1.0.0", + "resolve-from": "^4.0.0" }, "engines": { - "node": ">= 10.13.0" + "node": ">=6" }, "funding": { - "type": "opencollective", - "url": "https://opencollective.com/webpack" - }, - "peerDependencies": { - "webpack": "^4.0.0 || ^5.0.0" + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/raw-loader/node_modules/ajv": { - "version": "6.12.6", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", - "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", + "node_modules/import-meta-resolve": { + "version": "4.1.0", "dev": true, "license": "MIT", - "dependencies": { - "fast-deep-equal": "^3.1.1", - "fast-json-stable-stringify": "^2.0.0", - "json-schema-traverse": "^0.4.1", - "uri-js": "^4.2.2" - }, "funding": { "type": "github", - "url": "https://github.com/sponsors/epoberezkin" + "url": "https://github.com/sponsors/wooorm" } }, - "node_modules/raw-loader/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, + "node_modules/imurmurhash": { + "version": "0.1.4", "license": "MIT", - "peerDependencies": { - "ajv": "^6.9.1" + "engines": { + "node": ">=0.8.19" } }, - "node_modules/raw-loader/node_modules/json-schema-traverse": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", - "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", + "node_modules/inherits": { + "version": "2.0.4", + "license": "ISC" + }, + "node_modules/ini": { + "version": "4.1.1", "dev": true, + "license": "ISC", + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, + "node_modules/initials": { + "version": "3.1.2", "license": "MIT" }, - "node_modules/raw-loader/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==", + "node_modules/internal-slot": { + "version": "1.0.7", "dev": true, "license": "MIT", "dependencies": { - "big.js": "^5.2.2", - "emojis-list": "^3.0.0", - "json5": "^2.1.2" + "es-errors": "^1.3.0", + "hasown": "^2.0.0", + "side-channel": "^1.0.4" }, "engines": { - "node": ">=8.9.0" + "node": ">= 0.4" } }, - "node_modules/raw-loader/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==", + "node_modules/ipaddr.js": { + "version": "1.9.1", + "license": "MIT", + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/is-array-buffer": { + "version": "3.0.4", "dev": true, "license": "MIT", "dependencies": { - "@types/json-schema": "^7.0.8", - "ajv": "^6.12.5", - "ajv-keywords": "^3.5.2" + "call-bind": "^1.0.2", + "get-intrinsic": "^1.2.1" }, "engines": { - "node": ">= 10.13.0" + "node": ">= 0.4" }, "funding": { - "type": "opencollective", - "url": "https://opencollective.com/webpack" - } - }, - "node_modules/rc9": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/rc9/-/rc9-2.1.2.tgz", - "integrity": "sha512-btXCnMmRIBINM2LDZoEmOogIZU7Qe7zn4BpomSKZ/ykbLObuBdvG+mFq11DL6fjH1DRwHhrlgtYWG96bJiC7Cg==", - "license": "MIT", - "dependencies": { - "defu": "^6.1.4", - "destr": "^2.0.3" + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/rc9/node_modules/defu": { - "version": "6.1.4", - "resolved": "https://registry.npmjs.org/defu/-/defu-6.1.4.tgz", - "integrity": "sha512-mEQCMmwJu317oSz8CwdIOdwf3xMif1ttiM8LTufzc3g6kR+9Pe236twL8j3IYT1F7GfRgGcW6MWxzZjLIkuHIg==", + "node_modules/is-arrayish": { + "version": "0.2.1", + "dev": true, "license": "MIT" }, - "node_modules/read-cache": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/read-cache/-/read-cache-1.0.0.tgz", - "integrity": "sha512-Owdv/Ft7IjOgm/i0xvNDZ1LrRANRfew4b2prF3OWMQLxLfu3bS8FVhCsrSCMK4lR56Y9ya+AThoTpDCTxCmpRA==", + "node_modules/is-async-function": { + "version": "2.0.0", "dev": true, "license": "MIT", "dependencies": { - "pify": "^2.3.0" + "has-tostringtag": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/read-cache/node_modules/pify": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", - "integrity": "sha512-udgsAY+fTnvv7kI7aaxbqwWNb0AHiB0qBO89PZKPkoTmGOgdbrHDKD+0B2X4uTfJ/FT1R09r9gTsjUjNJotuog==", + "node_modules/is-bigint": { + "version": "1.0.4", "dev": true, "license": "MIT", - "engines": { - "node": ">=0.10.0" + "dependencies": { + "has-bigints": "^1.0.1" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/read-pkg": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-5.2.0.tgz", - "integrity": "sha512-Ug69mNOpfvKDAc2Q8DRpMjjzdtrnv9HcSMX+4VsZxD1aZ6ZzrIE7rlzXBtWTyhULSMKg076AW6WR5iZpD0JiOg==", - "dev": true, + "node_modules/is-binary-path": { + "version": "2.1.0", "license": "MIT", "dependencies": { - "@types/normalize-package-data": "^2.4.0", - "normalize-package-data": "^2.5.0", - "parse-json": "^5.0.0", - "type-fest": "^0.6.0" + "binary-extensions": "^2.0.0" }, "engines": { "node": ">=8" } }, - "node_modules/read-pkg-up": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-7.0.1.tgz", - "integrity": "sha512-zK0TB7Xd6JpCLmlLmufqykGE+/TlOePD6qKClNW7hHDKFh/J7/7gCWGR7joEQEW1bKq3a3yUZSObOoWLFQ4ohg==", + "node_modules/is-boolean-object": { + "version": "1.1.2", "dev": true, "license": "MIT", "dependencies": { - "find-up": "^4.1.0", - "read-pkg": "^5.2.0", - "type-fest": "^0.8.1" + "call-bind": "^1.0.2", + "has-tostringtag": "^1.0.0" }, "engines": { - "node": ">=8" + "node": ">= 0.4" }, "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/read-pkg-up/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==", + "node_modules/is-callable": { + "version": "1.2.7", "dev": true, "license": "MIT", - "dependencies": { - "locate-path": "^5.0.0", - "path-exists": "^4.0.0" - }, "engines": { - "node": ">=8" + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/read-pkg-up/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==", + "node_modules/is-core-module": { + "version": "2.15.1", "dev": true, "license": "MIT", "dependencies": { - "p-locate": "^4.1.0" + "hasown": "^2.0.2" }, "engines": { - "node": ">=8" + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/read-pkg-up/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==", + "node_modules/is-data-view": { + "version": "1.0.1", "dev": true, "license": "MIT", "dependencies": { - "p-try": "^2.0.0" + "is-typed-array": "^1.1.13" }, "engines": { - "node": ">=6" + "node": ">= 0.4" }, "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/read-pkg-up/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==", + "node_modules/is-date-object": { + "version": "1.0.5", "dev": true, "license": "MIT", "dependencies": { - "p-limit": "^2.2.0" + "has-tostringtag": "^1.0.0" }, "engines": { - "node": ">=8" + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/read-pkg-up/node_modules/type-fest": { - "version": "0.8.1", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.8.1.tgz", - "integrity": "sha512-4dbzIzqvjtgiM5rw1k5rEHtBANKmdudhGyBEajN01fEyhaAIhsoKNy6y7+IN93IfpFtwY9iqi7kD+xwKhQsNJA==", - "dev": true, - "license": "(MIT OR CC0-1.0)", + "node_modules/is-extglob": { + "version": "2.1.1", + "license": "MIT", "engines": { - "node": ">=8" + "node": ">=0.10.0" } }, - "node_modules/read-pkg/node_modules/hosted-git-info": { - "version": "2.8.9", - "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-2.8.9.tgz", - "integrity": "sha512-mxIDAb9Lsm6DoOJ7xH+5+X4y1LU/4Hi50L9C5sIswK3JzULS4bwk1FvjdBgvYR4bzT4tuUQiC15FE2f5HbLvYw==", - "dev": true, - "license": "ISC" - }, - "node_modules/read-pkg/node_modules/normalize-package-data": { - "version": "2.5.0", - "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-2.5.0.tgz", - "integrity": "sha512-/5CMN3T0R4XTj4DcGaexo+roZSdSFW/0AOOTROrjxzCG1wrWXEsGbRKevjlIL+ZDE4sZlJr5ED4YW0yqmkK+eA==", + "node_modules/is-finalizationregistry": { + "version": "1.0.2", "dev": true, - "license": "BSD-2-Clause", + "license": "MIT", "dependencies": { - "hosted-git-info": "^2.1.4", - "resolve": "^1.10.0", - "semver": "2 || 3 || 4 || 5", - "validate-npm-package-license": "^3.0.1" - } - }, - "node_modules/read-pkg/node_modules/semver": { - "version": "5.7.2", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.2.tgz", - "integrity": "sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g==", - "dev": true, - "license": "ISC", - "bin": { - "semver": "bin/semver" + "call-bind": "^1.0.2" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/read-pkg/node_modules/type-fest": { - "version": "0.6.0", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.6.0.tgz", - "integrity": "sha512-q+MB8nYR1KDLrgr4G5yemftpMC7/QLqVndBmEEdqzmNj5dcFOO4Oo8qlwZE3ULT3+Zim1F8Kq4cBnikNhlCMlg==", - "dev": true, - "license": "(MIT OR CC0-1.0)", + "node_modules/is-fullwidth-code-point": { + "version": "3.0.0", + "license": "MIT", "engines": { "node": ">=8" } }, - "node_modules/readable-stream": { - "version": "2.3.8", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.8.tgz", - "integrity": "sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==", + "node_modules/is-generator-function": { + "version": "1.0.10", + "dev": true, "license": "MIT", "dependencies": { - "core-util-is": "~1.0.0", - "inherits": "~2.0.3", - "isarray": "~1.0.0", - "process-nextick-args": "~2.0.0", - "safe-buffer": "~5.1.1", - "string_decoder": "~1.1.1", - "util-deprecate": "~1.0.1" + "has-tostringtag": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/readable-stream/node_modules/safe-buffer": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", - "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", - "license": "MIT" - }, - "node_modules/readdirp": { - "version": "3.6.0", - "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz", - "integrity": "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==", + "node_modules/is-glob": { + "version": "4.0.3", "license": "MIT", "dependencies": { - "picomatch": "^2.2.1" + "is-extglob": "^2.1.1" }, "engines": { - "node": ">=8.10.0" + "node": ">=0.10.0" } }, - "node_modules/redent": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/redent/-/redent-3.0.0.tgz", - "integrity": "sha512-6tDA8g98We0zd0GvVeMT9arEOnTw9qM03L9cJXaCjrip1OO764RDBLBfrB4cwzNGDj5OA5ioymC9GkizgWJDUg==", + "node_modules/is-map": { + "version": "2.0.3", "dev": true, "license": "MIT", - "dependencies": { - "indent-string": "^4.0.0", - "strip-indent": "^3.0.0" - }, "engines": { - "node": ">=8" + "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==", + "node_modules/is-negative-zero": { + "version": "2.0.3", "dev": true, - "license": "MIT" + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } }, - "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==", + "node_modules/is-number": { + "version": "7.0.0", + "license": "MIT", + "engines": { + "node": ">=0.12.0" + } + }, + "node_modules/is-number-object": { + "version": "1.0.7", "dev": true, "license": "MIT", "dependencies": { - "regenerate": "^1.4.2" + "has-tostringtag": "^1.0.0" }, "engines": { - "node": ">=4" + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "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==", - "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==", + "node_modules/is-obj": { + "version": "2.0.0", "dev": true, "license": "MIT", - "dependencies": { - "@babel/runtime": "^7.8.4" + "engines": { + "node": ">=8" } }, - "node_modules/regex-not": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/regex-not/-/regex-not-1.0.2.tgz", - "integrity": "sha512-J6SDjUgDxQj5NusnOtdFxDwN/+HWykR8GELwctJ7mdqhcyy1xEc4SRFHUXvxTp661YaVKAjfRLZ9cCqS6tn32A==", + "node_modules/is-plain-object": { + "version": "5.0.0", "dev": true, "license": "MIT", - "dependencies": { - "extend-shallow": "^3.0.2", - "safe-regex": "^1.1.0" - }, "engines": { "node": ">=0.10.0" } }, - "node_modules/regexp.prototype.flags": { - "version": "1.5.3", - "resolved": "https://registry.npmjs.org/regexp.prototype.flags/-/regexp.prototype.flags-1.5.3.tgz", - "integrity": "sha512-vqlC04+RQoFalODCbCumG2xIOvapzVMHwsyIGM/SIE8fRhFFsXeH8/QQ+s0T0kDAhKc4k30s73/0ydkHQz6HlQ==", + "node_modules/is-promise": { + "version": "4.0.0", + "license": "MIT" + }, + "node_modules/is-regex": { + "version": "1.1.4", "dev": true, "license": "MIT", "dependencies": { - "call-bind": "^1.0.7", - "define-properties": "^1.2.1", - "es-errors": "^1.3.0", - "set-function-name": "^2.0.2" + "call-bind": "^1.0.2", + "has-tostringtag": "^1.0.0" }, "engines": { "node": ">= 0.4" @@ -22422,5377 +6046,4382 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/regexpp": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/regexpp/-/regexpp-3.2.0.tgz", - "integrity": "sha512-pq2bWo9mVD43nbts2wGv17XLiNLya+GklZ8kaDLV2Z08gDCsGpnKn9BFMepvWuHCbyVvY7J5o5+BVvoQbmlJLg==", + "node_modules/is-set": { + "version": "2.0.3", "dev": true, "license": "MIT", "engines": { - "node": ">=8" + "node": ">= 0.4" }, "funding": { - "url": "https://github.com/sponsors/mysticatea" + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/regexpu-core": { - "version": "6.1.1", - "resolved": "https://registry.npmjs.org/regexpu-core/-/regexpu-core-6.1.1.tgz", - "integrity": "sha512-k67Nb9jvwJcJmVpw0jPttR1/zVfnKf8Km0IPatrU/zJ5XeG3+Slx0xLXs9HByJSzXzrlz5EDvN6yLNMDc2qdnw==", + "node_modules/is-shared-array-buffer": { + "version": "1.0.3", "dev": true, "license": "MIT", "dependencies": { - "regenerate": "^1.4.2", - "regenerate-unicode-properties": "^10.2.0", - "regjsgen": "^0.8.0", - "regjsparser": "^0.11.0", - "unicode-match-property-ecmascript": "^2.0.0", - "unicode-match-property-value-ecmascript": "^2.1.0" + "call-bind": "^1.0.7" }, "engines": { - "node": ">=4" + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "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.11.2", - "resolved": "https://registry.npmjs.org/regjsparser/-/regjsparser-0.11.2.tgz", - "integrity": "sha512-3OGZZ4HoLJkkAZx/48mTXJNlmqTGOzc0o9OWQPuWpkOlXXPbyN6OafCcoXUnBqE2D3f/T5L+pWc1kdEmnfnRsA==", + "node_modules/is-string": { + "version": "1.0.7", "dev": true, - "license": "BSD-2-Clause", + "license": "MIT", "dependencies": { - "jsesc": "~3.0.2" + "has-tostringtag": "^1.0.0" }, - "bin": { - "regjsparser": "bin/parser" + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/relateurl": { - "version": "0.2.7", - "resolved": "https://registry.npmjs.org/relateurl/-/relateurl-0.2.7.tgz", - "integrity": "sha512-G08Dxvm4iDN3MLM0EsP62EDV9IuhXPR6blNz6Utcp7zyV3tr4HVNINt6MpaRWbxoOHT3Q7YN2P+jaHX8vUbgog==", + "node_modules/is-symbol": { + "version": "1.0.4", + "dev": true, "license": "MIT", + "dependencies": { + "has-symbols": "^1.0.2" + }, "engines": { - "node": ">= 0.10" + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/release-zalgo": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/release-zalgo/-/release-zalgo-1.0.0.tgz", - "integrity": "sha512-gUAyHVHPPC5wdqX/LG4LWtRYtgjxyX78oanFNTMMyFEfOqdC54s3eE82imuWKbOeqYht2CrNf64Qb8vgmmtZGA==", + "node_modules/is-text-path": { + "version": "2.0.0", "dev": true, - "license": "ISC", + "license": "MIT", "dependencies": { - "es6-error": "^4.0.1" + "text-extensions": "^2.0.0" }, "engines": { - "node": ">=4" + "node": ">=8" } }, - "node_modules/remove-trailing-separator": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/remove-trailing-separator/-/remove-trailing-separator-1.1.0.tgz", - "integrity": "sha512-/hS+Y0u3aOfIETiaiirUFwDBDzmXPvO+jAfKTitUngIPzdKc6Z0LoFjM/CK5PL4C+eKwHohlHAb6H0VFfmmUsw==", - "dev": true, - "license": "ISC", - "optional": true - }, - "node_modules/renderkid": { - "version": "2.0.7", - "resolved": "https://registry.npmjs.org/renderkid/-/renderkid-2.0.7.tgz", - "integrity": "sha512-oCcFyxaMrKsKcTY59qnCAtmDVSLfPbrv6A3tVbPdFMMrv5jaK10V6m40cKsoPNhAqN6rmHW9sswW4o3ruSrwUQ==", + "node_modules/is-typed-array": { + "version": "1.1.13", "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": "^3.0.1" + "which-typed-array": "^1.1.14" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/renderkid/node_modules/ansi-regex": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", - "integrity": "sha512-TIGnTpdo+E3+pCyAluZvtED5p5wCqLdezCyhPZzKPcxvFplEt4i+W7OONCKgeZFT3+y5NZZfOOS/Bdcanm1MYA==", + "node_modules/is-weakmap": { + "version": "2.0.2", "dev": true, "license": "MIT", "engines": { - "node": ">=0.10.0" + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/renderkid/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==", + "node_modules/is-weakref": { + "version": "1.0.2", "dev": true, - "license": "BSD-2-Clause", + "license": "MIT", "dependencies": { - "boolbase": "^1.0.0", - "css-what": "^6.0.1", - "domhandler": "^4.3.1", - "domutils": "^2.8.0", - "nth-check": "^2.0.1" + "call-bind": "^1.0.2" }, "funding": { - "url": "https://github.com/sponsors/fb55" + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/renderkid/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==", + "node_modules/is-weakset": { + "version": "2.0.3", "dev": true, "license": "MIT", "dependencies": { - "domelementtype": "^2.0.1", - "domhandler": "^4.2.0", - "entities": "^2.0.0" + "call-bind": "^1.0.7", + "get-intrinsic": "^1.2.4" + }, + "engines": { + "node": ">= 0.4" }, "funding": { - "url": "https://github.com/cheeriojs/dom-serializer?sponsor=1" + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/renderkid/node_modules/domhandler": { - "version": "4.3.1", - "resolved": "https://registry.npmjs.org/domhandler/-/domhandler-4.3.1.tgz", - "integrity": "sha512-GrwoxYN+uWlzO8uhUXRl0P+kHE4GtVPfYzVLcUxPL7KNdHKj66vvlhiweIHqYYXWlw+T8iLMp42Lm67ghw4WMQ==", + "node_modules/isarray": { + "version": "2.0.5", "dev": true, - "license": "BSD-2-Clause", + "license": "MIT" + }, + "node_modules/isexe": { + "version": "2.0.0", + "license": "ISC" + }, + "node_modules/iterator.prototype": { + "version": "1.1.3", + "dev": true, + "license": "MIT", "dependencies": { - "domelementtype": "^2.2.0" + "define-properties": "^1.2.1", + "get-intrinsic": "^1.2.1", + "has-symbols": "^1.0.3", + "reflect.getprototypeof": "^1.0.4", + "set-function-name": "^2.0.1" }, "engines": { - "node": ">= 4" + "node": ">= 0.4" + } + }, + "node_modules/jackspeak": { + "version": "3.4.3", + "license": "BlueOak-1.0.0", + "dependencies": { + "@isaacs/cliui": "^8.0.2" }, "funding": { - "url": "https://github.com/fb55/domhandler?sponsor=1" + "url": "https://github.com/sponsors/isaacs" + }, + "optionalDependencies": { + "@pkgjs/parseargs": "^0.11.0" } }, - "node_modules/renderkid/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", + "node_modules/jake": { + "version": "10.9.2", + "license": "Apache-2.0", "dependencies": { - "dom-serializer": "^1.0.1", - "domelementtype": "^2.2.0", - "domhandler": "^4.2.0" + "async": "^3.2.3", + "chalk": "^4.0.2", + "filelist": "^1.0.4", + "minimatch": "^3.1.2" }, - "funding": { - "url": "https://github.com/fb55/domutils?sponsor=1" + "bin": { + "jake": "bin/cli.js" + }, + "engines": { + "node": ">=10" } }, - "node_modules/renderkid/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" - } - ], + "node_modules/jake/node_modules/brace-expansion": { + "version": "1.1.11", + "license": "MIT", + "dependencies": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "node_modules/jake/node_modules/minimatch": { + "version": "3.1.2", + "license": "ISC", + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" + } + }, + "node_modules/jiti": { + "version": "1.21.6", + "devOptional": true, + "license": "MIT", + "bin": { + "jiti": "bin/jiti.js" + } + }, + "node_modules/joi": { + "version": "17.13.3", + "license": "BSD-3-Clause", + "dependencies": { + "@hapi/hoek": "^9.3.0", + "@hapi/topo": "^5.1.0", + "@sideway/address": "^4.1.5", + "@sideway/formula": "^3.0.1", + "@sideway/pinpoint": "^2.0.0" + } + }, + "node_modules/joi/node_modules/@hapi/hoek": { + "version": "9.3.0", + "license": "BSD-3-Clause" + }, + "node_modules/jose": { + "version": "4.15.9", "license": "MIT", - "dependencies": { - "domelementtype": "^2.0.1", - "domhandler": "^4.0.0", - "domutils": "^2.5.2", - "entities": "^2.0.0" + "funding": { + "url": "https://github.com/sponsors/panva" } }, - "node_modules/renderkid/node_modules/strip-ansi": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", - "integrity": "sha512-VhumSSbBqDTP8p2ZLKj40UjBCV4+v8bUSEpUb4KjRgWk9pbqGF4REFj6KEagidb2f/M6AzC0EmFyDNGaw9OCzg==", - "dev": true, + "node_modules/js-beautify": { + "version": "1.15.1", "license": "MIT", "dependencies": { - "ansi-regex": "^2.0.0" + "config-chain": "^1.1.13", + "editorconfig": "^1.0.4", + "glob": "^10.3.3", + "js-cookie": "^3.0.5", + "nopt": "^7.2.0" + }, + "bin": { + "css-beautify": "js/bin/css-beautify.js", + "html-beautify": "js/bin/html-beautify.js", + "js-beautify": "js/bin/js-beautify.js" }, "engines": { - "node": ">=0.10.0" + "node": ">=14" } }, - "node_modules/repeat-element": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/repeat-element/-/repeat-element-1.1.4.tgz", - "integrity": "sha512-LFiNfRcSu7KK3evMyYOuCzv3L10TW7yC1G2/+StMjK8Y6Vqd2MG7r/Qjw4ghtuCOjFvlnms/iMmLqpvW/ES/WQ==", - "dev": true, + "node_modules/js-cookie": { + "version": "3.0.5", "license": "MIT", "engines": { - "node": ">=0.10.0" + "node": ">=14" } }, - "node_modules/repeat-string": { - "version": "1.6.1", - "resolved": "https://registry.npmjs.org/repeat-string/-/repeat-string-1.6.1.tgz", - "integrity": "sha512-PV0dzCYDNfRi1jCDbJzpW7jNNDRuCOG/jI5ctQcGKt/clZD+YcPS3yIlWuTJMmESC8aevCFmWJy5wjAFgNqN6w==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=0.10" - } + "node_modules/js-tokens": { + "version": "9.0.0", + "license": "MIT" }, - "node_modules/replace-in-file": { - "version": "5.0.2", - "resolved": "https://registry.npmjs.org/replace-in-file/-/replace-in-file-5.0.2.tgz", - "integrity": "sha512-1Vc7Sbr/rTuHgU1PZuBb7tGsFx3D4NKdhV4BpEF2MuN/6+SoXcFtx+dZ1Zz+5Dq4k5x9js87Y+gXQYPTQ9ppkA==", + "node_modules/js-yaml": { + "version": "4.1.0", "license": "MIT", "dependencies": { - "chalk": "^3.0.0", - "glob": "^7.1.6", - "yargs": "^15.0.2" + "argparse": "^2.0.1" }, "bin": { - "replace-in-file": "bin/cli.js" + "js-yaml": "bin/js-yaml.js" } }, - "node_modules/replace-in-file/node_modules/chalk": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-3.0.0.tgz", - "integrity": "sha512-4D3B6Wf41KOYRFdszmDqMCGq5VV/uMAB273JILmO+3jAlh8X4qDtdtgCR3fxtbLEMzSx22QdhnDcJvu2u1fVwg==", - "license": "MIT", - "dependencies": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - }, - "engines": { - "node": ">=8" - } + "node_modules/json-buffer": { + "version": "3.0.1", + "license": "MIT" }, - "node_modules/replace-in-file/node_modules/cliui": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/cliui/-/cliui-6.0.0.tgz", - "integrity": "sha512-t6wbgtoCXvAzst7QgXxJYqPt0usEfbgQdftEPbLL/cvv6HPE5VgvqCuAIDR0NgU52ds6rFwqrgakNLrHEjCbrQ==", - "license": "ISC", - "dependencies": { - "string-width": "^4.2.0", - "strip-ansi": "^6.0.0", - "wrap-ansi": "^6.2.0" - } + "node_modules/json-parse-even-better-errors": { + "version": "2.3.1", + "dev": true, + "license": "MIT" }, - "node_modules/replace-in-file/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==", + "node_modules/json-schema-to-typescript": { + "version": "15.0.2", "license": "MIT", "dependencies": { - "locate-path": "^5.0.0", - "path-exists": "^4.0.0" + "@apidevtools/json-schema-ref-parser": "^11.5.5", + "@types/json-schema": "^7.0.15", + "@types/lodash": "^4.17.7", + "glob": "^10.3.12", + "is-glob": "^4.0.3", + "js-yaml": "^4.1.0", + "lodash": "^4.17.21", + "minimist": "^1.2.8", + "prettier": "^3.2.5" + }, + "bin": { + "json2ts": "dist/src/cli.js" }, "engines": { - "node": ">=8" + "node": ">=16.0.0" } }, - "node_modules/replace-in-file/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==", + "node_modules/json-schema-traverse": { + "version": "1.0.0", + "license": "MIT" + }, + "node_modules/json-stable-stringify-without-jsonify": { + "version": "1.0.1", + "license": "MIT" + }, + "node_modules/json-web-key": { + "version": "0.4.0", "license": "MIT", "dependencies": { - "p-locate": "^4.1.0" - }, - "engines": { - "node": ">=8" + "asn1.js": "^5.0.1" } }, - "node_modules/replace-in-file/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==", + "node_modules/json5": { + "version": "2.2.3", "license": "MIT", - "dependencies": { - "p-try": "^2.0.0" + "bin": { + "json5": "lib/cli.js" }, "engines": { "node": ">=6" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/replace-in-file/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==", + "node_modules/jsonc-eslint-parser": { + "version": "2.4.0", "license": "MIT", "dependencies": { - "p-limit": "^2.2.0" + "acorn": "^8.5.0", + "eslint-visitor-keys": "^3.0.0", + "espree": "^9.0.0", + "semver": "^7.3.5" }, "engines": { - "node": ">=8" - } - }, - "node_modules/replace-in-file/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==", - "license": "MIT", - "dependencies": { - "has-flag": "^4.0.0" + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" }, - "engines": { - "node": ">=8" + "funding": { + "url": "https://github.com/sponsors/ota-meshi" } }, - "node_modules/replace-in-file/node_modules/wrap-ansi": { - "version": "6.2.0", - "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-6.2.0.tgz", - "integrity": "sha512-r6lPcBGxZXlIcymEu7InxDMhdW0KDxpLgoFLcguasxCaJ/SOIZwINatK9KY/tf+ZrlywOKU0UDj3ATXUBfxJXA==", - "license": "MIT", + "node_modules/jsonc-eslint-parser/node_modules/espree": { + "version": "9.6.1", + "license": "BSD-2-Clause", "dependencies": { - "ansi-styles": "^4.0.0", - "string-width": "^4.1.0", - "strip-ansi": "^6.0.0" + "acorn": "^8.9.0", + "acorn-jsx": "^5.3.2", + "eslint-visitor-keys": "^3.4.1" }, "engines": { - "node": ">=8" + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" } }, - "node_modules/replace-in-file/node_modules/y18n": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/y18n/-/y18n-4.0.3.tgz", - "integrity": "sha512-JKhqTOwSrqNA1NY5lSztJ1GrBiUodLMmIZuLiDaMRJ+itFd+ABVE8XBjOvIWL+rSqNDC74LCSFmlb/U4UZ4hJQ==", - "license": "ISC" + "node_modules/jsonparse": { + "version": "1.3.1", + "dev": true, + "engines": [ + "node >= 0.2.0" + ], + "license": "MIT" }, - "node_modules/replace-in-file/node_modules/yargs": { - "version": "15.4.1", - "resolved": "https://registry.npmjs.org/yargs/-/yargs-15.4.1.tgz", - "integrity": "sha512-aePbxDmcYW++PaqBsJ+HYUFwCdv4LVvdnhBy78E57PIor8/OVvhMrADFFEDh8DHDFRv/O9i3lPhsENjO7QX0+A==", - "license": "MIT", + "node_modules/JSONStream": { + "version": "1.3.5", + "dev": true, + "license": "(MIT OR Apache-2.0)", "dependencies": { - "cliui": "^6.0.0", - "decamelize": "^1.2.0", - "find-up": "^4.1.0", - "get-caller-file": "^2.0.1", - "require-directory": "^2.1.1", - "require-main-filename": "^2.0.0", - "set-blocking": "^2.0.0", - "string-width": "^4.2.0", - "which-module": "^2.0.0", - "y18n": "^4.0.0", - "yargs-parser": "^18.1.2" + "jsonparse": "^1.2.0", + "through": ">=2.2.7 <3" }, - "engines": { - "node": ">=8" - } - }, - "node_modules/replace-in-file/node_modules/yargs-parser": { - "version": "18.1.3", - "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-18.1.3.tgz", - "integrity": "sha512-o50j0JeToy/4K6OZcaQmW6lyXXKhq7csREXcDwk2omFPJEwUNOVtJKvmDr9EI1fAJZUyZcRF7kxGBWmRXudrCQ==", - "license": "ISC", - "dependencies": { - "camelcase": "^5.0.0", - "decamelize": "^1.2.0" + "bin": { + "JSONStream": "bin.js" }, "engines": { - "node": ">=6" + "node": "*" } }, - "node_modules/request-ip": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/request-ip/-/request-ip-2.2.0.tgz", - "integrity": "sha512-Hn4zUAr+XHbUs2RrfHur62t7+UhvtevqK32ordFewguEfNHUkhSdYgbG7PDGmXZEzqEXll9bei0+VMe6gkmuUQ==", + "node_modules/jsonwebtoken": { + "version": "9.0.2", "license": "MIT", "dependencies": { - "is_js": "^0.9.0" - } - }, - "node_modules/require-directory": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", - "integrity": "sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==", - "license": "MIT", + "jws": "^3.2.2", + "lodash.includes": "^4.3.0", + "lodash.isboolean": "^3.0.3", + "lodash.isinteger": "^4.0.4", + "lodash.isnumber": "^3.0.3", + "lodash.isplainobject": "^4.0.6", + "lodash.isstring": "^4.0.1", + "lodash.once": "^4.0.0", + "ms": "^2.1.1", + "semver": "^7.5.4" + }, "engines": { - "node": ">=0.10.0" + "node": ">=12", + "npm": ">=6" } }, - "node_modules/require-from-string": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/require-from-string/-/require-from-string-2.0.2.tgz", - "integrity": "sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==", + "node_modules/jsx-ast-utils": { + "version": "3.3.5", + "dev": true, "license": "MIT", + "dependencies": { + "array-includes": "^3.1.6", + "array.prototype.flat": "^1.3.1", + "object.assign": "^4.1.4", + "object.values": "^1.1.6" + }, "engines": { - "node": ">=0.10.0" + "node": ">=4.0" } }, - "node_modules/require-main-filename": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/require-main-filename/-/require-main-filename-2.0.0.tgz", - "integrity": "sha512-NKN5kMDylKuldxYLSUfrbo5Tuzh4hd+2E8NPPX02mZtn1VuREQToYe/ZdlJy+J3uCpfaiGF05e7B8W0iXbQHmg==", - "license": "ISC" - }, - "node_modules/requires-port": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/requires-port/-/requires-port-1.0.0.tgz", - "integrity": "sha512-KigOCHcocU3XODJxsu8i/j8T9tzT4adHiecwORRQ0ZZFcp7ahwXuRU1m+yuO90C5ZUyGeGfocHDI14M3L3yDAQ==", - "license": "MIT" - }, - "node_modules/resolve": { - "version": "1.22.8", - "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.8.tgz", - "integrity": "sha512-oKWePCxqpd6FlLvGV1VU0x7bkPmmCNolxzjMf4NczoDnQcIWrAF+cPtZn5i6n+RfD2d9i0tzpKnG6Yk168yIyw==", + "node_modules/juice": { + "version": "10.0.1", "license": "MIT", "dependencies": { - "is-core-module": "^2.13.0", - "path-parse": "^1.0.7", - "supports-preserve-symlinks-flag": "^1.0.0" + "cheerio": "1.0.0-rc.12", + "commander": "^6.1.0", + "mensch": "^0.3.4", + "slick": "^1.12.2", + "web-resource-inliner": "^6.0.1" }, "bin": { - "resolve": "bin/resolve" + "juice": "bin/juice" }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/resolve-alpn": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/resolve-alpn/-/resolve-alpn-1.2.1.tgz", - "integrity": "sha512-0a1F4l73/ZFZOakJnQ3FvkJ2+gSTQWz/r2KE5OdDY0TxPm5h4GkqkWWfM47T7HsbnOtcJVEF4epCVy6u7Q3K+g==", - "dev": true, - "license": "MIT" - }, - "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", "engines": { - "node": ">=8" + "node": ">=10.0.0" } }, - "node_modules/resolve-global": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/resolve-global/-/resolve-global-1.0.0.tgz", - "integrity": "sha512-zFa12V4OLtT5XUX/Q4VLvTfBf+Ok0SPc1FNGM/z9ctUdiU618qwKpWnd0CHs3+RqROfyEg/DhuHbMWYqcgljEw==", - "dev": true, + "node_modules/juice/node_modules/commander": { + "version": "6.2.1", "license": "MIT", - "dependencies": { - "global-dirs": "^0.1.1" - }, "engines": { - "node": ">=8" + "node": ">= 6" } }, - "node_modules/resolve-url": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/resolve-url/-/resolve-url-0.2.1.tgz", - "integrity": "sha512-ZuF55hVUQaaczgOIwqWzkEcEidmlD/xl44x1UZnhOXcYuFN2S6+rcxpG+C1N3So0wvNI3DmJICUFfu2SxhBmvg==", - "deprecated": "https://github.com/lydell/resolve-url#deprecated", - "dev": true, - "license": "MIT" - }, - "node_modules/responselike": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/responselike/-/responselike-2.0.1.tgz", - "integrity": "sha512-4gl03wn3hj1HP3yzgdI7d3lCkF95F21Pz4BPGvKHinyQzALR5CapwC8yIi0Rh58DEMQ/SguC03wFj2k0M/mHhw==", - "dev": true, - "license": "MIT", - "dependencies": { - "lowercase-keys": "^2.0.0" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "node_modules/jwa": { + "version": "1.4.1", + "license": "MIT", + "dependencies": { + "buffer-equal-constant-time": "1.0.1", + "ecdsa-sig-formatter": "1.0.11", + "safe-buffer": "^5.0.1" } }, - "node_modules/restore-cursor": { + "node_modules/jwks-rsa": { "version": "3.1.0", - "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-3.1.0.tgz", - "integrity": "sha512-l+sSefzHpj5qimhFSE5a8nufZYAM3sBSVMAPtYkmC+4EH2anSGaEMXSD0izRQbu9nfyQ9y5JrVmp7E8oZrUjvA==", "license": "MIT", "dependencies": { - "onetime": "^5.1.0", - "signal-exit": "^3.0.2" + "@types/express": "^4.17.17", + "@types/jsonwebtoken": "^9.0.2", + "debug": "^4.3.4", + "jose": "^4.14.6", + "limiter": "^1.1.5", + "lru-memoizer": "^2.2.0" }, "engines": { - "node": ">=8" + "node": ">=14" } }, - "node_modules/restore-cursor/node_modules/signal-exit": { - "version": "3.0.7", - "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz", - "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==", - "license": "ISC" - }, - "node_modules/ret": { - "version": "0.1.15", - "resolved": "https://registry.npmjs.org/ret/-/ret-0.1.15.tgz", - "integrity": "sha512-TTlYpa+OL+vMMNG24xSlQGEJ3B/RzEfUlLct7b5G/ytav+wPrplCpVMFuwzXbkecJrb6IYo1iFb0S9v37754mg==", - "dev": true, + "node_modules/jws": { + "version": "3.2.2", "license": "MIT", - "engines": { - "node": ">=0.12" + "dependencies": { + "jwa": "^1.4.1", + "safe-buffer": "^5.0.1" } }, - "node_modules/retry": { - "version": "0.12.0", - "resolved": "https://registry.npmjs.org/retry/-/retry-0.12.0.tgz", - "integrity": "sha512-9LkiTwjUh6rT555DtE9rTX+BKByPfrMzEAtnlEtdEwr3Nkffwiihqe2bWADg+OQRjt9gl6ICdmB/ZFDCGAtSow==", + "node_modules/jwt-decode": { + "version": "4.0.0", "license": "MIT", "engines": { - "node": ">= 4" + "node": ">=18" } }, - "node_modules/reusify": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.0.4.tgz", - "integrity": "sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==", + "node_modules/keygrip": { + "version": "1.1.0", "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==", - "license": "MIT" - }, - "node_modules/rimraf": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", - "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", - "deprecated": "Rimraf versions prior to v4 are no longer supported", - "dev": true, - "license": "ISC", "dependencies": { - "glob": "^7.1.3" - }, - "bin": { - "rimraf": "bin.js" + "tsscmp": "1.0.6" }, - "funding": { - "url": "https://github.com/sponsors/isaacs" + "engines": { + "node": ">= 0.6" } }, - "node_modules/ripemd160": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/ripemd160/-/ripemd160-2.0.2.tgz", - "integrity": "sha512-ii4iagi25WusVoiC4B4lq7pbXfAp3D9v5CwfkY33vffw2+pkDjY1D8GaN7spsxvCSx8dkPqOZCEZyfxcmJG2IA==", - "dev": true, + "node_modules/keyv": { + "version": "4.5.4", "license": "MIT", "dependencies": { - "hash-base": "^3.0.0", - "inherits": "^2.0.1" + "json-buffer": "3.0.1" } }, - "node_modules/roarr": { - "version": "7.21.1", - "resolved": "https://registry.npmjs.org/roarr/-/roarr-7.21.1.tgz", - "integrity": "sha512-3niqt5bXFY1InKU8HKWqqYTYjtrBaxBMnXELXCXUYgtNYGUtZM5rB46HIC430AyacL95iEniGf7RgqsesykLmQ==", - "license": "BSD-3-Clause", + "node_modules/ldapjs": { + "version": "3.0.7", + "license": "MIT", "dependencies": { - "fast-printf": "^1.6.9", - "safe-stable-stringify": "^2.4.3", - "semver-compare": "^1.0.0" - }, - "engines": { - "node": ">=18.0" + "@ldapjs/asn1": "^2.0.0", + "@ldapjs/attribute": "^1.0.0", + "@ldapjs/change": "^1.0.0", + "@ldapjs/controls": "^2.1.0", + "@ldapjs/dn": "^1.1.0", + "@ldapjs/filter": "^2.1.1", + "@ldapjs/messages": "^1.3.0", + "@ldapjs/protocol": "^1.2.1", + "abstract-logging": "^2.0.1", + "assert-plus": "^1.0.0", + "backoff": "^2.5.0", + "once": "^1.4.0", + "vasync": "^2.2.1", + "verror": "^1.10.1" } }, - "node_modules/run-async": { - "version": "2.4.1", - "resolved": "https://registry.npmjs.org/run-async/-/run-async-2.4.1.tgz", - "integrity": "sha512-tvVnVv01b8c1RrA6Ep7JkStj85Guv/YrMcwqYQnwjsAS2cTmmPGBBjAjpCW7RrSodNSoE2/qg9O4bceNvUuDgQ==", + "node_modules/levn": { + "version": "0.4.1", "license": "MIT", + "dependencies": { + "prelude-ls": "^1.2.1", + "type-check": "~0.4.0" + }, "engines": { - "node": ">=0.12.0" + "node": ">= 0.8.0" } }, - "node_modules/run-parallel": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz", - "integrity": "sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==", - "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": { - "queue-microtask": "^1.2.2" - } + "node_modules/limiter": { + "version": "1.1.5" }, - "node_modules/run-queue": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/run-queue/-/run-queue-1.0.3.tgz", - "integrity": "sha512-ntymy489o0/QQplUDnpYAYUsO50K9SBrIVaKCWDOJzYJts0f9WH9RFJkyagebkw5+y1oi00R7ynNW/d12GBumg==", + "node_modules/lines-and-columns": { + "version": "1.2.4", "dev": true, - "license": "ISC", - "dependencies": { - "aproba": "^1.1.1" - } + "license": "MIT" }, - "node_modules/rxjs": { - "version": "6.6.7", - "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-6.6.7.tgz", - "integrity": "sha512-hTdwr+7yYNIT5n4AMYp85KA6yw2Va0FLa3Rguvbpa4W3I5xynaBZo41cM3XM+4Q6fRMj3sBYIR1VAmZMXYJvRQ==", - "license": "Apache-2.0", + "node_modules/local-pkg": { + "version": "0.5.0", + "license": "MIT", "dependencies": { - "tslib": "^1.9.0" + "mlly": "^1.4.2", + "pkg-types": "^1.0.3" }, "engines": { - "npm": ">=2.0.0" + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/antfu" } }, - "node_modules/rxjs/node_modules/tslib": { - "version": "1.14.1", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", - "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==", - "license": "0BSD" - }, - "node_modules/safe-array-concat": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/safe-array-concat/-/safe-array-concat-1.1.2.tgz", - "integrity": "sha512-vj6RsCsWBCf19jIeHEfkRMw8DPiBb+DMXklQ/1SGDHOMlHdPUkZXFQ2YdplS23zESTijAcurb1aSgJA3AgMu1Q==", - "dev": true, + "node_modules/locate-path": { + "version": "6.0.0", "license": "MIT", "dependencies": { - "call-bind": "^1.0.7", - "get-intrinsic": "^1.2.4", - "has-symbols": "^1.0.3", - "isarray": "^2.0.5" + "p-locate": "^5.0.0" }, "engines": { - "node": ">=0.4" + "node": ">=10" }, "funding": { - "url": "https://github.com/sponsors/ljharb" + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/safe-array-concat/node_modules/isarray": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-2.0.5.tgz", - "integrity": "sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw==", + "node_modules/lodash": { + "version": "4.17.21", + "license": "MIT" + }, + "node_modules/lodash.camelcase": { + "version": "4.3.0", "dev": true, "license": "MIT" }, - "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" - } - ], + "node_modules/lodash.clonedeep": { + "version": "4.5.0", "license": "MIT" }, - "node_modules/safe-regex": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/safe-regex/-/safe-regex-1.1.0.tgz", - "integrity": "sha512-aJXcif4xnaNUzvUuC5gcb46oTS7zvg4jpMTnuqtrEPlR3vFr4pxtdTwaF1Qs3Enjn9HK+ZlwQui+a7z0SywIzg==", + "node_modules/lodash.includes": { + "version": "4.3.0", + "license": "MIT" + }, + "node_modules/lodash.isboolean": { + "version": "3.0.3", + "license": "MIT" + }, + "node_modules/lodash.isinteger": { + "version": "4.0.4", + "license": "MIT" + }, + "node_modules/lodash.isnumber": { + "version": "3.0.3", + "license": "MIT" + }, + "node_modules/lodash.isplainobject": { + "version": "4.0.6", + "license": "MIT" + }, + "node_modules/lodash.isstring": { + "version": "4.0.1", + "license": "MIT" + }, + "node_modules/lodash.kebabcase": { + "version": "4.1.1", "dev": true, - "license": "MIT", - "dependencies": { - "ret": "~0.1.10" - } + "license": "MIT" }, - "node_modules/safe-regex-test": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/safe-regex-test/-/safe-regex-test-1.0.3.tgz", - "integrity": "sha512-CdASjNJPvRa7roO6Ra/gLYBTzYzzPyyBXxIMdGW3USQLyjWEls2RgW5UBTXaQVp+OrpeCK3bLem8smtmheoRuw==", + "node_modules/lodash.merge": { + "version": "4.6.2", + "license": "MIT" + }, + "node_modules/lodash.mergewith": { + "version": "4.6.2", "dev": true, - "license": "MIT", - "dependencies": { - "call-bind": "^1.0.6", - "es-errors": "^1.3.0", - "is-regex": "^1.1.4" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } + "license": "MIT" }, - "node_modules/safe-stable-stringify": { - "version": "2.5.0", - "resolved": "https://registry.npmjs.org/safe-stable-stringify/-/safe-stable-stringify-2.5.0.tgz", - "integrity": "sha512-b3rppTKm9T+PsVCBEOUR46GWI7fdOs00VKZ1+9c1EWDaDMvjQc6tUwuFyIprgGgTcWoVHSKrU8H31ZHA2e0RHA==", - "license": "MIT", - "engines": { - "node": ">=10" - } + "node_modules/lodash.once": { + "version": "4.1.1", + "license": "MIT" }, - "node_modules/safer-buffer": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", - "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==", + "node_modules/lodash.snakecase": { + "version": "4.1.1", + "dev": true, "license": "MIT" }, - "node_modules/samlify": { - "version": "2.8.8", - "resolved": "https://registry.npmjs.org/samlify/-/samlify-2.8.8.tgz", - "integrity": "sha512-blMzLvt6Qb7P8jrgK/mHm40/ExB1pgptBMb3b3Pqa5d7qeB/mktEh7TDL5zxxiMHr6gBDUOEI9ZAncQhTeRYcA==", - "license": "MIT", - "dependencies": { - "@authenio/xml-encryption": "^2.0.2", - "@xmldom/xmldom": "^0.8.6", - "camelcase": "^6.2.0", - "node-forge": "^1.3.0", - "node-rsa": "^1.1.1", - "pako": "^1.0.10", - "uuid": "^8.3.2", - "xml": "^1.0.1", - "xml-crypto": "^3.0.1", - "xpath": "^0.0.32" - } + "node_modules/lodash.startcase": { + "version": "4.4.0", + "dev": true, + "license": "MIT" }, - "node_modules/samlify/node_modules/camelcase": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-6.3.0.tgz", - "integrity": "sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA==", - "license": "MIT", - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } + "node_modules/lodash.uniq": { + "version": "4.5.0", + "dev": true, + "license": "MIT" + }, + "node_modules/lodash.upperfirst": { + "version": "4.3.1", + "dev": true, + "license": "MIT" }, - "node_modules/sass": { - "version": "1.32.13", - "resolved": "https://registry.npmjs.org/sass/-/sass-1.32.13.tgz", - "integrity": "sha512-dEgI9nShraqP7cXQH+lEXVf73WOPCse0QlFzSD8k+1TcOxCMwVXfQlr0jtoluZysQOyJGnfr21dLvYKDJq8HkA==", + "node_modules/loose-envify": { + "version": "1.4.0", "dev": true, "license": "MIT", "dependencies": { - "chokidar": ">=3.0.0 <4.0.0" + "js-tokens": "^3.0.0 || ^4.0.0" }, "bin": { - "sass": "sass.js" - }, - "engines": { - "node": ">=8.9.0" + "loose-envify": "cli.js" } }, - "node_modules/sass-loader": { - "version": "10.5.2", - "resolved": "https://registry.npmjs.org/sass-loader/-/sass-loader-10.5.2.tgz", - "integrity": "sha512-vMUoSNOUKJILHpcNCCyD23X34gve1TS7Rjd9uXHeKqhvBG39x6XbswFDtpbTElj6XdMFezoWhkh5vtKudf2cgQ==", + "node_modules/loose-envify/node_modules/js-tokens": { + "version": "4.0.0", "dev": true, - "license": "MIT", + "license": "MIT" + }, + "node_modules/lower-case": { + "version": "1.1.4", + "license": "MIT" + }, + "node_modules/lru-cache": { + "version": "6.0.0", + "license": "ISC", "dependencies": { - "klona": "^2.0.4", - "loader-utils": "^2.0.0", - "neo-async": "^2.6.2", - "schema-utils": "^3.0.0", - "semver": "^7.3.2" + "yallist": "^4.0.0" }, "engines": { - "node": ">= 10.13.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/webpack" - }, - "peerDependencies": { - "fibers": ">= 3.1.0", - "node-sass": "^4.0.0 || ^5.0.0 || ^6.0.0 || ^7.0.0 || ^8.0.0 || ^9.0.0", - "sass": "^1.3.0", - "webpack": "^4.36.0 || ^5.0.0" - }, - "peerDependenciesMeta": { - "fibers": { - "optional": true - }, - "node-sass": { - "optional": true - }, - "sass": { - "optional": true - } + "node": ">=10" } }, - "node_modules/sass-loader/node_modules/ajv": { - "version": "6.12.6", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", - "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", - "dev": true, + "node_modules/lru-memoizer": { + "version": "2.3.0", "license": "MIT", "dependencies": { - "fast-deep-equal": "^3.1.1", - "fast-json-stable-stringify": "^2.0.0", - "json-schema-traverse": "^0.4.1", - "uri-js": "^4.2.2" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/epoberezkin" + "lodash.clonedeep": "^4.5.0", + "lru-cache": "6.0.0" } }, - "node_modules/sass-loader/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, + "node_modules/lru-queue": { + "version": "0.1.0", "license": "MIT", - "peerDependencies": { - "ajv": "^6.9.1" + "dependencies": { + "es5-ext": "~0.10.2" } }, - "node_modules/sass-loader/node_modules/json-schema-traverse": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", - "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", - "dev": true, - "license": "MIT" - }, - "node_modules/sass-loader/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, + "node_modules/magic-string": { + "version": "0.30.12", "license": "MIT", "dependencies": { - "big.js": "^5.2.2", - "emojis-list": "^3.0.0", - "json5": "^2.1.2" - }, - "engines": { - "node": ">=8.9.0" + "@jridgewell/sourcemap-codec": "^1.5.0" } }, - "node_modules/sass-loader/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, + "node_modules/magic-string-ast": { + "version": "0.6.2", "license": "MIT", "dependencies": { - "@types/json-schema": "^7.0.8", - "ajv": "^6.12.5", - "ajv-keywords": "^3.5.2" + "magic-string": "^0.30.10" }, "engines": { - "node": ">= 10.13.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/webpack" + "node": ">=16.14.0" } }, - "node_modules/schema-utils": { - "version": "2.7.1", - "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-2.7.1.tgz", - "integrity": "sha512-SHiNtMOUGWBQJwzISiVYKu82GiV4QYGePp3odlY1tuKO7gPtphAT5R/py0fA6xtbgLL/RvtJZnU9b8s0F1q0Xg==", - "dev": true, + "node_modules/magicast": { + "version": "0.3.5", "license": "MIT", "dependencies": { - "@types/json-schema": "^7.0.5", - "ajv": "^6.12.4", - "ajv-keywords": "^3.5.2" - }, - "engines": { - "node": ">= 8.9.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/webpack" + "@babel/parser": "^7.25.4", + "@babel/types": "^7.25.4", + "source-map-js": "^1.2.0" } }, - "node_modules/schema-utils/node_modules/ajv": { - "version": "6.12.6", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", - "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", - "dev": true, + "node_modules/make-plural": { + "version": "7.4.0", + "license": "Unicode-DFS-2016" + }, + "node_modules/marked": { + "version": "14.1.4", "license": "MIT", - "dependencies": { - "fast-deep-equal": "^3.1.1", - "fast-json-stable-stringify": "^2.0.0", - "json-schema-traverse": "^0.4.1", - "uri-js": "^4.2.2" + "bin": { + "marked": "bin/marked.js" }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/epoberezkin" + "engines": { + "node": ">= 18" } }, - "node_modules/schema-utils/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, + "node_modules/material-colors": { + "version": "1.2.6", + "license": "ISC" + }, + "node_modules/math-interval-parser": { + "version": "2.0.1", "license": "MIT", - "peerDependencies": { - "ajv": "^6.9.1" + "engines": { + "node": ">=0.10.0" } }, - "node_modules/schema-utils/node_modules/json-schema-traverse": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", - "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", - "dev": true, - "license": "MIT" - }, - "node_modules/scule": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/scule/-/scule-0.2.1.tgz", - "integrity": "sha512-M9gnWtn3J0W+UhJOHmBxBTwv8mZCan5i1Himp60t6vvZcor0wr+IM0URKmIglsWJ7bRujNAVVN77fp+uZaWoKg==", - "dev": true, - "license": "MIT" - }, - "node_modules/seedrandom": { - "version": "3.0.5", - "resolved": "https://registry.npmjs.org/seedrandom/-/seedrandom-3.0.5.tgz", - "integrity": "sha512-8OwmbklUNzwezjGInmZ+2clQmExQPvomqjL7LFqOYqtmuxRgQYqOD3mHaU+MvZn5FLUeVxVfQjwLZW/n/JFuqg==", - "license": "MIT" + "node_modules/media-typer": { + "version": "1.1.0", + "license": "MIT", + "engines": { + "node": ">= 0.8" + } }, - "node_modules/semver": { - "version": "7.5.4", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.4.tgz", - "integrity": "sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==", + "node_modules/memoizee": { + "version": "0.4.17", "license": "ISC", "dependencies": { - "lru-cache": "^6.0.0" - }, - "bin": { - "semver": "bin/semver.js" + "d": "^1.0.2", + "es5-ext": "^0.10.64", + "es6-weak-map": "^2.0.3", + "event-emitter": "^0.3.5", + "is-promise": "^2.2.2", + "lru-queue": "^0.1.0", + "next-tick": "^1.1.0", + "timers-ext": "^0.1.7" }, "engines": { - "node": ">=10" + "node": ">=0.12" } }, - "node_modules/semver-compare": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/semver-compare/-/semver-compare-1.0.0.tgz", - "integrity": "sha512-YM3/ITh2MJ5MtzaM429anh+x2jiLVjqILF4m4oyQB18W7Ggea7BfqdH/wGMK7dDiMghv/6WG7znWMwUDzJiXow==", + "node_modules/memoizee/node_modules/is-promise": { + "version": "2.2.2", "license": "MIT" }, - "node_modules/semver-extract": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/semver-extract/-/semver-extract-1.2.0.tgz", - "integrity": "sha512-k3f6evlSvwZF6NEJzoMbjv262rZu2vYPvl4WtcgY+SP+7Iwoo/Y7S6hV9XV/JzsQpc1qf7nQ+DCoxqvocD2NSg==", - "dev": true, - "license": "MIT", - "dependencies": { - "commander": "^2.18.0", - "semver": "^5.5.1" - }, - "bin": { - "semver-extract": "index.js" - } + "node_modules/memory-pager": { + "version": "1.5.0", + "license": "MIT" }, - "node_modules/semver-extract/node_modules/commander": { - "version": "2.20.3", - "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz", - "integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==", - "dev": true, + "node_modules/mensch": { + "version": "0.3.4", "license": "MIT" }, - "node_modules/semver-extract/node_modules/semver": { - "version": "5.7.2", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.2.tgz", - "integrity": "sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g==", + "node_modules/meow": { + "version": "12.1.1", "dev": true, - "license": "ISC", - "bin": { - "semver": "bin/semver" + "license": "MIT", + "engines": { + "node": ">=16.10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/send": { - "version": "0.19.0", - "resolved": "https://registry.npmjs.org/send/-/send-0.19.0.tgz", - "integrity": "sha512-dW41u5VfLXu8SJh5bwRmyYUbAoSB3c9uQh6L8h/KtsFREPWpbX1lrljJo186Jc4nmci/sGUZ9a0a0J2zgfq2hw==", + "node_modules/merge-descriptors": { + "version": "2.0.0", "license": "MIT", - "dependencies": { - "debug": "2.6.9", - "depd": "2.0.0", - "destroy": "1.2.0", - "encodeurl": "~1.0.2", - "escape-html": "~1.0.3", - "etag": "~1.8.1", - "fresh": "0.5.2", - "http-errors": "2.0.0", - "mime": "1.6.0", - "ms": "2.1.3", - "on-finished": "2.4.1", - "range-parser": "~1.2.1", - "statuses": "2.0.1" - }, "engines": { - "node": ">= 0.8.0" + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/send/node_modules/debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "node_modules/merge2": { + "version": "1.4.1", "license": "MIT", - "dependencies": { - "ms": "2.0.0" + "engines": { + "node": ">= 8" } }, - "node_modules/send/node_modules/debug/node_modules/ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", - "license": "MIT" + "node_modules/methods": { + "version": "1.1.2", + "license": "MIT", + "engines": { + "node": ">= 0.6" + } }, - "node_modules/send/node_modules/encodeurl": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.2.tgz", - "integrity": "sha512-TPJXq8JqFaVYm2CWmPvnP2Iyo4ZSM7/QKcSmuMLDObfpH5fi7RUGmd/rTDf+rut/saiDiQEeVTNgAmJEdAOx0w==", + "node_modules/micromatch": { + "version": "4.0.8", "license": "MIT", + "dependencies": { + "braces": "^3.0.3", + "picomatch": "^2.3.1" + }, "engines": { - "node": ">= 0.8" + "node": ">=8.6" } }, - "node_modules/send/node_modules/mime": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/mime/-/mime-1.6.0.tgz", - "integrity": "sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==", + "node_modules/mime": { + "version": "2.6.0", "license": "MIT", "bin": { "mime": "cli.js" }, "engines": { - "node": ">=4" + "node": ">=4.0.0" } }, - "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==", - "license": "BSD-3-Clause", - "dependencies": { - "randombytes": "^2.1.0" + "node_modules/mime-db": { + "version": "1.53.0", + "license": "MIT", + "engines": { + "node": ">= 0.6" } }, - "node_modules/serve-placeholder": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/serve-placeholder/-/serve-placeholder-2.0.2.tgz", - "integrity": "sha512-/TMG8SboeiQbZJWRlfTCqMs2DD3SZgWp0kDQePz9yUuCnDfDh/92gf7/PxGhzXTKBIPASIHxFcZndoNbp6QOLQ==", + "node_modules/mime-types": { + "version": "3.0.0", "license": "MIT", "dependencies": { - "defu": "^6.1.4" + "mime-db": "^1.53.0" + }, + "engines": { + "node": ">= 0.6" } }, - "node_modules/serve-placeholder/node_modules/defu": { - "version": "6.1.4", - "resolved": "https://registry.npmjs.org/defu/-/defu-6.1.4.tgz", - "integrity": "sha512-mEQCMmwJu317oSz8CwdIOdwf3xMif1ttiM8LTufzc3g6kR+9Pe236twL8j3IYT1F7GfRgGcW6MWxzZjLIkuHIg==", - "license": "MIT" + "node_modules/minimalistic-assert": { + "version": "1.0.1", + "license": "ISC" }, - "node_modules/serve-static": { - "version": "1.16.2", - "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.16.2.tgz", - "integrity": "sha512-VqpjJZKadQB/PEbEwvFdO43Ax5dFBZ2UECszz8bQ7pi7wt//PWe1P6MN7eCnjsatYtBT6EuiClbjSWP2WrIoTw==", - "license": "MIT", + "node_modules/minimatch": { + "version": "9.0.5", + "license": "ISC", "dependencies": { - "encodeurl": "~2.0.0", - "escape-html": "~1.0.3", - "parseurl": "~1.3.3", - "send": "0.19.0" + "brace-expansion": "^2.0.1" }, "engines": { - "node": ">= 0.8.0" + "node": ">=16 || 14 >=14.17" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" } }, - "node_modules/server-destroy": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/server-destroy/-/server-destroy-1.0.1.tgz", - "integrity": "sha512-rb+9B5YBIEzYcD6x2VKidaa+cqYBJQKnU4oe4E3ANwRRN56yk/ua1YCJT1n21NTS8w6CcOclAKNP3PhdCXKYtQ==", - "license": "ISC" + "node_modules/minimist": { + "version": "1.2.8", + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/ljharb" + } }, - "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/minipass": { + "version": "7.1.2", + "license": "ISC", + "engines": { + "node": ">=16 || 14 >=14.17" + } }, - "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==", + "node_modules/mjml": { + "version": "4.15.3", "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" + "@babel/runtime": "^7.23.9", + "mjml-cli": "4.15.3", + "mjml-core": "4.15.3", + "mjml-migrate": "4.15.3", + "mjml-preset-core": "4.15.3", + "mjml-validator": "4.15.3" }, - "engines": { - "node": ">= 0.4" + "bin": { + "mjml": "bin/mjml" } }, - "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, + "node_modules/mjml-accordion": { + "version": "4.15.3", "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" + "@babel/runtime": "^7.23.9", + "lodash": "^4.17.21", + "mjml-core": "4.15.3" } }, - "node_modules/set-value": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/set-value/-/set-value-2.0.1.tgz", - "integrity": "sha512-JxHc1weCN68wRY0fhCoXpyK55m/XPHafOmK4UWD7m2CI14GMcFypt4w/0+NV5f/ZMby2F6S2wwA7fgynh9gWSw==", - "dev": true, + "node_modules/mjml-body": { + "version": "4.15.3", "license": "MIT", "dependencies": { - "extend-shallow": "^2.0.1", - "is-extendable": "^0.1.1", - "is-plain-object": "^2.0.3", - "split-string": "^3.0.1" - }, - "engines": { - "node": ">=0.10.0" + "@babel/runtime": "^7.23.9", + "lodash": "^4.17.21", + "mjml-core": "4.15.3" } }, - "node_modules/set-value/node_modules/extend-shallow": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", - "integrity": "sha512-zCnTtlxNoAiDc3gqY2aYAWFx7XWWiasuF2K8Me5WbN8otHKTUKBwjPtNpRs/rbUZm7KxWAaNj7P1a/p52GbVug==", - "dev": true, + "node_modules/mjml-button": { + "version": "4.15.3", "license": "MIT", "dependencies": { - "is-extendable": "^0.1.0" - }, - "engines": { - "node": ">=0.10.0" + "@babel/runtime": "^7.23.9", + "lodash": "^4.17.21", + "mjml-core": "4.15.3" } }, - "node_modules/set-value/node_modules/is-extendable": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-0.1.1.tgz", - "integrity": "sha512-5BMULNob1vgFX6EjQw5izWDxrecWK9AM72rugNr0TFldMOi0fj6Jk+zeKIt0xGj4cEfQIJth4w3OKWOJ4f+AFw==", - "dev": true, + "node_modules/mjml-carousel": { + "version": "4.15.3", "license": "MIT", - "engines": { - "node": ">=0.10.0" + "dependencies": { + "@babel/runtime": "^7.23.9", + "lodash": "^4.17.21", + "mjml-core": "4.15.3" } }, - "node_modules/setimmediate": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/setimmediate/-/setimmediate-1.0.5.tgz", - "integrity": "sha512-MATJdZp8sLqDl/68LfQmbP8zKPLQNV6BIZoIgrscFDQ+RsvK/BxeDQOgyxKKoh0y/8h3BqVFnCqQ/gd+reiIXA==", - "dev": true, - "license": "MIT" - }, - "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/sha.js": { - "version": "2.4.11", - "resolved": "https://registry.npmjs.org/sha.js/-/sha.js-2.4.11.tgz", - "integrity": "sha512-QMEp5B7cftE7APOjk5Y6xgrbWu+WkLVQwk8JNjZ8nKRciZaByEW6MubieAiToS7+dwvrjGhH8jRXz3MVd0AYqQ==", - "dev": true, - "license": "(MIT AND BSD-3-Clause)", + "node_modules/mjml-cli": { + "version": "4.15.3", + "license": "MIT", "dependencies": { - "inherits": "^2.0.1", - "safe-buffer": "^5.0.1" + "@babel/runtime": "^7.23.9", + "chokidar": "^3.0.0", + "glob": "^10.3.10", + "html-minifier": "^4.0.0", + "js-beautify": "^1.6.14", + "lodash": "^4.17.21", + "minimatch": "^9.0.3", + "mjml-core": "4.15.3", + "mjml-migrate": "4.15.3", + "mjml-parser-xml": "4.15.3", + "mjml-validator": "4.15.3", + "yargs": "^17.7.2" }, "bin": { - "sha.js": "bin.js" + "mjml-cli": "bin/mjml" } }, - "node_modules/shebang-command": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", - "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", + "node_modules/mjml-column": { + "version": "4.15.3", "license": "MIT", "dependencies": { - "shebang-regex": "^3.0.0" - }, - "engines": { - "node": ">=8" + "@babel/runtime": "^7.23.9", + "lodash": "^4.17.21", + "mjml-core": "4.15.3" } }, - "node_modules/shebang-regex": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", - "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", + "node_modules/mjml-core": { + "version": "4.15.3", "license": "MIT", - "engines": { - "node": ">=8" + "dependencies": { + "@babel/runtime": "^7.23.9", + "cheerio": "1.0.0-rc.12", + "detect-node": "^2.0.4", + "html-minifier": "^4.0.0", + "js-beautify": "^1.6.14", + "juice": "^10.0.0", + "lodash": "^4.17.21", + "mjml-migrate": "4.15.3", + "mjml-parser-xml": "4.15.3", + "mjml-validator": "4.15.3" } }, - "node_modules/shell-quote": { - "version": "1.8.1", - "resolved": "https://registry.npmjs.org/shell-quote/-/shell-quote-1.8.1.tgz", - "integrity": "sha512-6j1W9l1iAs/4xYBI1SYOVZyFcCis9b4KCLQ8fgAGG07QvzaRLVVRQvAy85yNmmZSjYjg4MWh4gNvlPujU/5LpA==", + "node_modules/mjml-divider": { + "version": "4.15.3", "license": "MIT", - "funding": { - "url": "https://github.com/sponsors/ljharb" + "dependencies": { + "@babel/runtime": "^7.23.9", + "lodash": "^4.17.21", + "mjml-core": "4.15.3" } }, - "node_modules/shortid": { - "version": "2.2.16", - "resolved": "https://registry.npmjs.org/shortid/-/shortid-2.2.16.tgz", - "integrity": "sha512-Ugt+GIZqvGXCIItnsL+lvFJOiN7RYqlGy7QE41O3YC1xbNSeDGIRO7xg2JJXIAj1cAGnOeC1r7/T9pgrtQbv4g==", - "deprecated": "Package no longer supported. Contact Support at https://www.npmjs.com/support for more info.", + "node_modules/mjml-group": { + "version": "4.15.3", "license": "MIT", "dependencies": { - "nanoid": "^2.1.0" + "@babel/runtime": "^7.23.9", + "lodash": "^4.17.21", + "mjml-core": "4.15.3" } }, - "node_modules/shortid/node_modules/nanoid": { - "version": "2.1.11", - "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-2.1.11.tgz", - "integrity": "sha512-s/snB+WGm6uwi0WjsZdaVcuf3KJXlfGl2LcxgwkEwJF0D/BWzVWAZW/XY4bFaiR7s0Jk3FPvlnepg1H1b1UwlA==", - "license": "MIT" - }, - "node_modules/side-channel": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.0.6.tgz", - "integrity": "sha512-fDW/EZ6Q9RiO8eFG8Hj+7u/oW+XrPTIChwCOM2+th2A6OblDtYYIpve9m+KvI9Z4C9qSEXlaGR6bTEYHReuglA==", + "node_modules/mjml-head": { + "version": "4.15.3", "license": "MIT", "dependencies": { - "call-bind": "^1.0.7", - "es-errors": "^1.3.0", - "get-intrinsic": "^1.2.4", - "object-inspect": "^1.13.1" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/signal-exit": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-4.1.0.tgz", - "integrity": "sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==", - "license": "ISC", - "engines": { - "node": ">=14" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" + "@babel/runtime": "^7.23.9", + "lodash": "^4.17.21", + "mjml-core": "4.15.3" } }, - "node_modules/simple-oauth2": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/simple-oauth2/-/simple-oauth2-5.1.0.tgz", - "integrity": "sha512-gWDa38Ccm4MwlG5U7AlcJxPv3lvr80dU7ARJWrGdgvOKyzSj1gr3GBPN1rABTedAYvC/LsGYoFuFxwDBPtGEbw==", - "license": "Apache-2.0", + "node_modules/mjml-head-attributes": { + "version": "4.15.3", + "license": "MIT", "dependencies": { - "@hapi/hoek": "^11.0.4", - "@hapi/wreck": "^18.0.0", - "debug": "^4.3.4", - "joi": "^17.6.4" + "@babel/runtime": "^7.23.9", + "lodash": "^4.17.21", + "mjml-core": "4.15.3" } }, - "node_modules/simple-update-notifier": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/simple-update-notifier/-/simple-update-notifier-1.1.0.tgz", - "integrity": "sha512-VpsrsJSUcJEseSbMHkrsrAVSdvVS5I96Qo1QAQ4FxQ9wXFcB+pjj7FB7/us9+GcgfW4ziHtYMc1J0PLczb55mg==", - "dev": true, + "node_modules/mjml-head-breakpoint": { + "version": "4.15.3", "license": "MIT", "dependencies": { - "semver": "~7.0.0" - }, - "engines": { - "node": ">=8.10.0" + "@babel/runtime": "^7.23.9", + "lodash": "^4.17.21", + "mjml-core": "4.15.3" } }, - "node_modules/simple-update-notifier/node_modules/semver": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.0.0.tgz", - "integrity": "sha512-+GB6zVA9LWh6zovYQLALHwv5rb2PHGlJi3lfiqIHxR0uuwCgefcOJc59v9fv1w8GbStwxuuqqAjI9NMAOOgq1A==", - "dev": true, - "license": "ISC", - "bin": { - "semver": "bin/semver.js" + "node_modules/mjml-head-font": { + "version": "4.15.3", + "license": "MIT", + "dependencies": { + "@babel/runtime": "^7.23.9", + "lodash": "^4.17.21", + "mjml-core": "4.15.3" } }, - "node_modules/sirv": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/sirv/-/sirv-2.0.4.tgz", - "integrity": "sha512-94Bdh3cC2PKrbgSOUqTiGPWVZeSiXfKOVZNJniWoqrWrRkB1CJzBU3NEbiTsPcYy1lDsANA/THzS+9WBiy5nfQ==", - "dev": true, + "node_modules/mjml-head-html-attributes": { + "version": "4.15.3", "license": "MIT", "dependencies": { - "@polka/url": "^1.0.0-next.24", - "mrmime": "^2.0.0", - "totalist": "^3.0.0" - }, - "engines": { - "node": ">= 10" + "@babel/runtime": "^7.23.9", + "lodash": "^4.17.21", + "mjml-core": "4.15.3" } }, - "node_modules/slash": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", - "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==", + "node_modules/mjml-head-preview": { + "version": "4.15.3", "license": "MIT", - "engines": { - "node": ">=8" + "dependencies": { + "@babel/runtime": "^7.23.9", + "lodash": "^4.17.21", + "mjml-core": "4.15.3" } }, - "node_modules/slice-ansi": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-4.0.0.tgz", - "integrity": "sha512-qMCMfhY040cVHT43K9BFygqYbUPFZKHOg7K73mtTWJRb8pyP3fzf4Ixd5SzdEJQ6MRUg/WBnOLxghZtKKurENQ==", - "dev": true, + "node_modules/mjml-head-style": { + "version": "4.15.3", "license": "MIT", "dependencies": { - "ansi-styles": "^4.0.0", - "astral-regex": "^2.0.0", - "is-fullwidth-code-point": "^3.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/slice-ansi?sponsor=1" + "@babel/runtime": "^7.23.9", + "lodash": "^4.17.21", + "mjml-core": "4.15.3" } }, - "node_modules/slick": { - "version": "1.12.2", - "resolved": "https://registry.npmjs.org/slick/-/slick-1.12.2.tgz", - "integrity": "sha512-4qdtOGcBjral6YIBCWJ0ljFSKNLz9KkhbWtuGvUyRowl1kxfuE1x/Z/aJcaiilpb3do9bl5K7/1h9XC5wWpY/A==", - "license": "MIT (http://mootools.net/license.txt)", - "engines": { - "node": "*" + "node_modules/mjml-head-title": { + "version": "4.15.3", + "license": "MIT", + "dependencies": { + "@babel/runtime": "^7.23.9", + "lodash": "^4.17.21", + "mjml-core": "4.15.3" } }, - "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==", + "node_modules/mjml-hero": { + "version": "4.15.3", "license": "MIT", - "engines": { - "node": ">=8.0.0" + "dependencies": { + "@babel/runtime": "^7.23.9", + "lodash": "^4.17.21", + "mjml-core": "4.15.3" } }, - "node_modules/smart-buffer": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/smart-buffer/-/smart-buffer-4.2.0.tgz", - "integrity": "sha512-94hK0Hh8rPqQl2xXc3HsaBoOXKV20MToPkcXvwbISWLEs+64sBq5kFgn2kJDHb1Pry9yrP0dxrCI9RRci7RXKg==", + "node_modules/mjml-image": { + "version": "4.15.3", "license": "MIT", - "engines": { - "node": ">= 6.0.0", - "npm": ">= 3.0.0" + "dependencies": { + "@babel/runtime": "^7.23.9", + "lodash": "^4.17.21", + "mjml-core": "4.15.3" } }, - "node_modules/snapdragon": { - "version": "0.8.2", - "resolved": "https://registry.npmjs.org/snapdragon/-/snapdragon-0.8.2.tgz", - "integrity": "sha512-FtyOnWN/wCHTVXOMwvSv26d+ko5vWlIDD6zoUJ7LW8vh+ZBC8QdljveRP+crNrtBwioEUWy/4dMtbBjA4ioNlg==", - "dev": true, + "node_modules/mjml-migrate": { + "version": "4.15.3", "license": "MIT", "dependencies": { - "base": "^0.11.1", - "debug": "^2.2.0", - "define-property": "^0.2.5", - "extend-shallow": "^2.0.1", - "map-cache": "^0.2.2", - "source-map": "^0.5.6", - "source-map-resolve": "^0.5.0", - "use": "^3.1.0" + "@babel/runtime": "^7.23.9", + "js-beautify": "^1.6.14", + "lodash": "^4.17.21", + "mjml-core": "4.15.3", + "mjml-parser-xml": "4.15.3", + "yargs": "^17.7.2" }, - "engines": { - "node": ">=0.10.0" + "bin": { + "migrate": "lib/cli.js" } }, - "node_modules/snapdragon-node": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/snapdragon-node/-/snapdragon-node-2.1.1.tgz", - "integrity": "sha512-O27l4xaMYt/RSQ5TR3vpWCAB5Kb/czIcqUFOM/C4fYcLnbZUc1PkjTAMjof2pBWaSTwOUd6qUHcFGVGj7aIwnw==", - "dev": true, + "node_modules/mjml-navbar": { + "version": "4.15.3", "license": "MIT", "dependencies": { - "define-property": "^1.0.0", - "isobject": "^3.0.0", - "snapdragon-util": "^3.0.1" - }, - "engines": { - "node": ">=0.10.0" + "@babel/runtime": "^7.23.9", + "lodash": "^4.17.21", + "mjml-core": "4.15.3" } }, - "node_modules/snapdragon-node/node_modules/define-property": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz", - "integrity": "sha512-cZTYKFWspt9jZsMscWo8sc/5lbPC9Q0N5nBLgb+Yd915iL3udB1uFgS3B8YCx66UVHq018DAVFoee7x+gxggeA==", - "dev": true, + "node_modules/mjml-parser-xml": { + "version": "4.15.3", "license": "MIT", "dependencies": { - "is-descriptor": "^1.0.0" - }, - "engines": { - "node": ">=0.10.0" + "@babel/runtime": "^7.23.9", + "detect-node": "2.1.0", + "htmlparser2": "^9.1.0", + "lodash": "^4.17.15" } }, - "node_modules/snapdragon-util": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/snapdragon-util/-/snapdragon-util-3.0.1.tgz", - "integrity": "sha512-mbKkMdQKsjX4BAL4bRYTj21edOf8cN7XHdYUJEe+Zn99hVEYcMvKPct1IqNe7+AZPirn8BCDOQBHQZknqmKlZQ==", - "dev": true, + "node_modules/mjml-parser-xml/node_modules/htmlparser2": { + "version": "9.1.0", + "funding": [ + "https://github.com/fb55/htmlparser2?sponsor=1", + { + "type": "github", + "url": "https://github.com/sponsors/fb55" + } + ], "license": "MIT", "dependencies": { - "kind-of": "^3.2.0" - }, - "engines": { - "node": ">=0.10.0" + "domelementtype": "^2.3.0", + "domhandler": "^5.0.3", + "domutils": "^3.1.0", + "entities": "^4.5.0" } }, - "node_modules/snapdragon-util/node_modules/kind-of": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha512-NOW9QQXMoZGg/oqnVNoNTTIFEIid1627WCffUBJEdMxYApq7mNE7CpzucIPc+ZQg25Phej7IJSmX3hO+oblOtQ==", - "dev": true, + "node_modules/mjml-preset-core": { + "version": "4.15.3", "license": "MIT", "dependencies": { - "is-buffer": "^1.1.5" - }, - "engines": { - "node": ">=0.10.0" + "@babel/runtime": "^7.23.9", + "mjml-accordion": "4.15.3", + "mjml-body": "4.15.3", + "mjml-button": "4.15.3", + "mjml-carousel": "4.15.3", + "mjml-column": "4.15.3", + "mjml-divider": "4.15.3", + "mjml-group": "4.15.3", + "mjml-head": "4.15.3", + "mjml-head-attributes": "4.15.3", + "mjml-head-breakpoint": "4.15.3", + "mjml-head-font": "4.15.3", + "mjml-head-html-attributes": "4.15.3", + "mjml-head-preview": "4.15.3", + "mjml-head-style": "4.15.3", + "mjml-head-title": "4.15.3", + "mjml-hero": "4.15.3", + "mjml-image": "4.15.3", + "mjml-navbar": "4.15.3", + "mjml-raw": "4.15.3", + "mjml-section": "4.15.3", + "mjml-social": "4.15.3", + "mjml-spacer": "4.15.3", + "mjml-table": "4.15.3", + "mjml-text": "4.15.3", + "mjml-wrapper": "4.15.3" } }, - "node_modules/snapdragon/node_modules/debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", - "dev": true, + "node_modules/mjml-raw": { + "version": "4.15.3", "license": "MIT", "dependencies": { - "ms": "2.0.0" + "@babel/runtime": "^7.23.9", + "lodash": "^4.17.21", + "mjml-core": "4.15.3" } }, - "node_modules/snapdragon/node_modules/define-property": { - "version": "0.2.5", - "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", - "integrity": "sha512-Rr7ADjQZenceVOAKop6ALkkRAmH1A4Gx9hV/7ZujPUN2rkATqFO0JZLZInbAjpZYoJ1gUx8MRMQVkYemcbMSTA==", - "dev": true, + "node_modules/mjml-section": { + "version": "4.15.3", "license": "MIT", "dependencies": { - "is-descriptor": "^0.1.0" - }, - "engines": { - "node": ">=0.10.0" + "@babel/runtime": "^7.23.9", + "lodash": "^4.17.21", + "mjml-core": "4.15.3" } }, - "node_modules/snapdragon/node_modules/extend-shallow": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", - "integrity": "sha512-zCnTtlxNoAiDc3gqY2aYAWFx7XWWiasuF2K8Me5WbN8otHKTUKBwjPtNpRs/rbUZm7KxWAaNj7P1a/p52GbVug==", - "dev": true, + "node_modules/mjml-social": { + "version": "4.15.3", "license": "MIT", "dependencies": { - "is-extendable": "^0.1.0" - }, - "engines": { - "node": ">=0.10.0" + "@babel/runtime": "^7.23.9", + "lodash": "^4.17.21", + "mjml-core": "4.15.3" } }, - "node_modules/snapdragon/node_modules/is-descriptor": { - "version": "0.1.7", - "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-0.1.7.tgz", - "integrity": "sha512-C3grZTvObeN1xud4cRWl366OMXZTj0+HGyk4hvfpx4ZHt1Pb60ANSXqCK7pdOTeUQpRzECBSTphqvD7U+l22Eg==", - "dev": true, + "node_modules/mjml-spacer": { + "version": "4.15.3", "license": "MIT", "dependencies": { - "is-accessor-descriptor": "^1.0.1", - "is-data-descriptor": "^1.0.1" - }, - "engines": { - "node": ">= 0.4" + "@babel/runtime": "^7.23.9", + "lodash": "^4.17.21", + "mjml-core": "4.15.3" } }, - "node_modules/snapdragon/node_modules/is-extendable": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-0.1.1.tgz", - "integrity": "sha512-5BMULNob1vgFX6EjQw5izWDxrecWK9AM72rugNr0TFldMOi0fj6Jk+zeKIt0xGj4cEfQIJth4w3OKWOJ4f+AFw==", - "dev": true, + "node_modules/mjml-table": { + "version": "4.15.3", "license": "MIT", - "engines": { - "node": ">=0.10.0" + "dependencies": { + "@babel/runtime": "^7.23.9", + "lodash": "^4.17.21", + "mjml-core": "4.15.3" } }, - "node_modules/snapdragon/node_modules/ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", - "dev": true, - "license": "MIT" - }, - "node_modules/snapdragon/node_modules/source-map": { - "version": "0.5.7", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", - "integrity": "sha512-LbrmJOMUSdEVxIKvdcJzQC+nQhe8FUZQTXQy6+I75skNgn3OoQ0DZA8YnFa7gp8tqtL3KPf1kmo0R5DoApeSGQ==", - "dev": true, - "license": "BSD-3-Clause", - "engines": { - "node": ">=0.10.0" + "node_modules/mjml-text": { + "version": "4.15.3", + "license": "MIT", + "dependencies": { + "@babel/runtime": "^7.23.9", + "lodash": "^4.17.21", + "mjml-core": "4.15.3" } }, - "node_modules/socks": { - "version": "2.8.3", - "resolved": "https://registry.npmjs.org/socks/-/socks-2.8.3.tgz", - "integrity": "sha512-l5x7VUUWbjVFbafGLxPWkYsHIhEvmF85tbIeFZWc8ZPtoMyybuEhL7Jye/ooC4/d48FgOjSJXgsF/AJPYCW8Zw==", + "node_modules/mjml-validator": { + "version": "4.15.3", "license": "MIT", "dependencies": { - "ip-address": "^9.0.5", - "smart-buffer": "^4.2.0" - }, - "engines": { - "node": ">= 10.0.0", - "npm": ">= 3.0.0" + "@babel/runtime": "^7.23.9" } }, - "node_modules/sort-keys": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/sort-keys/-/sort-keys-2.0.0.tgz", - "integrity": "sha512-/dPCrG1s3ePpWm6yBbxZq5Be1dXGLyLn9Z791chDC3NFrpkVbWGzkBwPN1knaciexFXgRJ7hzdnwZ4stHSDmjg==", - "dev": true, + "node_modules/mjml-wrapper": { + "version": "4.15.3", "license": "MIT", "dependencies": { - "is-plain-obj": "^1.0.0" - }, - "engines": { - "node": ">=4" + "@babel/runtime": "^7.23.9", + "lodash": "^4.17.21", + "mjml-core": "4.15.3", + "mjml-section": "4.15.3" } }, - "node_modules/sort-keys/node_modules/is-plain-obj": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-1.1.0.tgz", - "integrity": "sha512-yvkRyxmFKEOQ4pNXCmJG5AEQNlXJS5LaONXo5/cLdTZdWvsZ1ioJEonLGAosKlMWE8lwUy/bJzMjcw8az73+Fg==", - "dev": true, + "node_modules/mkdirp": { + "version": "0.5.6", "license": "MIT", - "engines": { - "node": ">=0.10.0" + "dependencies": { + "minimist": "^1.2.6" + }, + "bin": { + "mkdirp": "bin/cmd.js" } }, - "node_modules/sortablejs": { - "version": "1.10.2", - "resolved": "https://registry.npmjs.org/sortablejs/-/sortablejs-1.10.2.tgz", - "integrity": "sha512-YkPGufevysvfwn5rfdlGyrGjt7/CRHwvRPogD/lC+TnvcN29jDpCifKP+rBqf+LRldfXSTh+0CGLcSg0VIxq3A==", - "dev": true, + "node_modules/mlly": { + "version": "1.7.2", "license": "MIT", - "optional": true - }, - "node_modules/source-list-map": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/source-list-map/-/source-list-map-2.0.1.tgz", - "integrity": "sha512-qnQ7gVMxGNxsiL4lEuJwe/To8UnK7fAnmbGEEH8RpLouuKbeEm0lhbQVFIrNSuB+G7tVrAlVsZgETT5nljf+Iw==", - "dev": true, - "license": "MIT" - }, - "node_modules/source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", - "license": "BSD-3-Clause", - "engines": { - "node": ">=0.10.0" + "dependencies": { + "acorn": "^8.12.1", + "pathe": "^1.1.2", + "pkg-types": "^1.2.0", + "ufo": "^1.5.4" } }, - "node_modules/source-map-js": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.2.1.tgz", - "integrity": "sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==", - "license": "BSD-3-Clause", + "node_modules/mongodb": { + "version": "6.9.0", + "license": "Apache-2.0", + "dependencies": { + "@mongodb-js/saslprep": "^1.1.5", + "bson": "^6.7.0", + "mongodb-connection-string-url": "^3.0.0" + }, "engines": { - "node": ">=0.10.0" + "node": ">=16.20.1" + }, + "peerDependencies": { + "@aws-sdk/credential-providers": "^3.188.0", + "@mongodb-js/zstd": "^1.1.0", + "gcp-metadata": "^5.2.0", + "kerberos": "^2.0.1", + "mongodb-client-encryption": ">=6.0.0 <7", + "snappy": "^7.2.2", + "socks": "^2.7.1" + }, + "peerDependenciesMeta": { + "@aws-sdk/credential-providers": { + "optional": true + }, + "@mongodb-js/zstd": { + "optional": true + }, + "gcp-metadata": { + "optional": true + }, + "kerberos": { + "optional": true + }, + "mongodb-client-encryption": { + "optional": true + }, + "snappy": { + "optional": true + }, + "socks": { + "optional": true + } } }, - "node_modules/source-map-resolve": { - "version": "0.5.3", - "resolved": "https://registry.npmjs.org/source-map-resolve/-/source-map-resolve-0.5.3.tgz", - "integrity": "sha512-Htz+RnsXWk5+P2slx5Jh3Q66vhQj1Cllm0zvnaY98+NFx+Dv2CF/f5O/t8x+KaNdrdIAsruNzoh/KpialbqAnw==", - "deprecated": "See https://github.com/lydell/source-map-resolve#deprecated", - "dev": true, - "license": "MIT", + "node_modules/mongodb-connection-string-url": { + "version": "3.0.1", + "license": "Apache-2.0", "dependencies": { - "atob": "^2.1.2", - "decode-uri-component": "^0.2.0", - "resolve-url": "^0.2.1", - "source-map-url": "^0.4.0", - "urix": "^0.1.0" + "@types/whatwg-url": "^11.0.2", + "whatwg-url": "^13.0.0" } }, - "node_modules/source-map-support": { - "version": "0.5.21", - "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.21.tgz", - "integrity": "sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w==", - "dev": true, - "license": "MIT", - "dependencies": { - "buffer-from": "^1.0.0", - "source-map": "^0.6.0" - } + "node_modules/moo": { + "version": "0.5.2", + "license": "BSD-3-Clause" + }, + "node_modules/ms": { + "version": "2.1.3", + "license": "MIT" }, - "node_modules/source-map-url": { + "node_modules/muggle-string": { "version": "0.4.1", - "resolved": "https://registry.npmjs.org/source-map-url/-/source-map-url-0.4.1.tgz", - "integrity": "sha512-cPiFOTLUKvJFIg4SKVScy4ilPPW6rFgMgfuZJPNoDuMs3nC1HbMUycBoJw77xFIp6z1UJQJOfx6C9GMH80DiTw==", - "deprecated": "See https://github.com/lydell/source-map-url#deprecated", - "dev": true, "license": "MIT" }, - "node_modules/sparse-bitfield": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/sparse-bitfield/-/sparse-bitfield-3.0.3.tgz", - "integrity": "sha512-kvzhi7vqKTfkh0PZU+2D2PIllw2ymqJKujUcyPMd9Y75Nv4nPbGJZXNhxsgdQab2BmlDct1YnfQCguEvHr7VsQ==", + "node_modules/multer": { + "version": "1.4.5-lts.1", "license": "MIT", - "optional": true, - "dependencies": { - "memory-pager": "^1.0.2" - } - }, - "node_modules/spawn-wrap": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/spawn-wrap/-/spawn-wrap-2.0.0.tgz", - "integrity": "sha512-EeajNjfN9zMnULLwhZZQU3GWBoFNkbngTUPfaawT4RkMiviTxcX0qfhVbGey39mfctfDHkWtuecgQ8NJcyQWHg==", - "dev": true, - "license": "ISC", "dependencies": { - "foreground-child": "^2.0.0", - "is-windows": "^1.0.2", - "make-dir": "^3.0.0", - "rimraf": "^3.0.0", - "signal-exit": "^3.0.2", - "which": "^2.0.1" + "append-field": "^1.0.0", + "busboy": "^1.0.0", + "concat-stream": "^1.5.2", + "mkdirp": "^0.5.4", + "object-assign": "^4.1.1", + "type-is": "^1.6.4", + "xtend": "^4.0.0" }, "engines": { - "node": ">=8" + "node": ">= 6.0.0" } }, - "node_modules/spawn-wrap/node_modules/signal-exit": { - "version": "3.0.7", - "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz", - "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==", - "dev": true, - "license": "ISC" - }, - "node_modules/spdx-correct": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/spdx-correct/-/spdx-correct-3.2.0.tgz", - "integrity": "sha512-kN9dJbvnySHULIluDHy32WHRUu3Og7B9sbY7tsFLctQkIqnMh3hErYgdMjTYuqmcXX+lK5T1lnUt3G7zNswmZA==", - "dev": true, - "license": "Apache-2.0", - "dependencies": { - "spdx-expression-parse": "^3.0.0", - "spdx-license-ids": "^3.0.0" + "node_modules/multer/node_modules/media-typer": { + "version": "0.3.0", + "license": "MIT", + "engines": { + "node": ">= 0.6" } }, - "node_modules/spdx-exceptions": { - "version": "2.5.0", - "resolved": "https://registry.npmjs.org/spdx-exceptions/-/spdx-exceptions-2.5.0.tgz", - "integrity": "sha512-PiU42r+xO4UbUS1buo3LPJkjlO7430Xn5SVAhdpzzsPHsjbYVflnnFdATgabnLude+Cqu25p6N+g2lw/PFsa4w==", - "dev": true, - "license": "CC-BY-3.0" - }, - "node_modules/spdx-expression-parse": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/spdx-expression-parse/-/spdx-expression-parse-3.0.1.tgz", - "integrity": "sha512-cbqHunsQWnJNE6KhVSMsMeH5H/L9EpymbzqTQ3uLwNCLZ1Q481oWaofqH7nO6V07xlXwY6PhQdQ2IedWx/ZK4Q==", - "dev": true, + "node_modules/multer/node_modules/mime-db": { + "version": "1.52.0", "license": "MIT", - "dependencies": { - "spdx-exceptions": "^2.1.0", - "spdx-license-ids": "^3.0.0" + "engines": { + "node": ">= 0.6" } }, - "node_modules/spdx-license-ids": { - "version": "3.0.20", - "resolved": "https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-3.0.20.tgz", - "integrity": "sha512-jg25NiDV/1fLtSgEgyvVyDunvaNHbuwF9lfNV17gSmPFAlYzdfNBlLtLzXTevwkPj7DhGbmN9VnmJIgLnhvaBw==", - "dev": true, - "license": "CC0-1.0" - }, - "node_modules/split-string": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/split-string/-/split-string-3.1.0.tgz", - "integrity": "sha512-NzNVhJDYpwceVVii8/Hu6DKfD2G+NrQHlS/V/qgv763EYudVwEcMQNxd2lh+0VrUByXN/oJkl5grOhYWvQUYiw==", - "dev": true, + "node_modules/multer/node_modules/mime-types": { + "version": "2.1.35", "license": "MIT", "dependencies": { - "extend-shallow": "^3.0.0" + "mime-db": "1.52.0" }, "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/split2": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/split2/-/split2-3.2.2.tgz", - "integrity": "sha512-9NThjpgZnifTkJpzTZ7Eue85S49QwpNhZTq6GRJwObb6jnLFNGB7Qm73V5HewTROPyxD0C29xqmaI68bQtV+hg==", - "dev": true, - "license": "ISC", - "dependencies": { - "readable-stream": "^3.0.0" + "node": ">= 0.6" } }, - "node_modules/split2/node_modules/readable-stream": { - "version": "3.6.2", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.2.tgz", - "integrity": "sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==", - "dev": true, + "node_modules/multer/node_modules/type-is": { + "version": "1.6.18", "license": "MIT", "dependencies": { - "inherits": "^2.0.3", - "string_decoder": "^1.1.1", - "util-deprecate": "^1.0.1" + "media-typer": "0.3.0", + "mime-types": "~2.1.24" }, "engines": { - "node": ">= 6" + "node": ">= 0.6" } }, - "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/mustache": { + "version": "4.2.0", + "license": "MIT", + "bin": { + "mustache": "bin/mustache" + } }, - "node_modules/ssri": { - "version": "8.0.1", - "resolved": "https://registry.npmjs.org/ssri/-/ssri-8.0.1.tgz", - "integrity": "sha512-97qShzy1AiyxvPNIkLWoGua7xoQzzPjQ0HAH4B0rWKo7SZ6USuPcrUiAFrws0UH8RrbWmgq3LMTObhPIHbbBeQ==", - "dev": true, - "license": "ISC", - "dependencies": { - "minipass": "^3.1.1" + "node_modules/nanoid": { + "version": "5.0.7", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", + "bin": { + "nanoid": "bin/nanoid.js" }, "engines": { - "node": ">= 8" + "node": "^18 || >=20" } }, - "node_modules/stable": { - "version": "0.1.8", - "resolved": "https://registry.npmjs.org/stable/-/stable-0.1.8.tgz", - "integrity": "sha512-ji9qxRnOVfcuLDySj9qzhGSEFVobyt1kIOSkj1qZzYLzq7Tos/oUUWvotUPQLlrsidqsK6tBH89Bc9kL5zHA6w==", - "deprecated": "Modern JS already guarantees Array#sort() is a stable sort, so this library is deprecated. See the compatibility table on MDN: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/sort#browser_compatibility", - "dev": true, + "node_modules/natural-compare": { + "version": "1.4.0", "license": "MIT" }, - "node_modules/stack-trace": { - "version": "0.0.10", - "resolved": "https://registry.npmjs.org/stack-trace/-/stack-trace-0.0.10.tgz", - "integrity": "sha512-KGzahc7puUKkzyMt+IqAep+TVNbKP+k2Lmwhub39m1AsTSkaDutx56aDCo+HLDzf/D26BIHTJWNiTG1KAJiQCg==", + "node_modules/negotiator": { + "version": "1.0.0", "license": "MIT", "engines": { - "node": "*" + "node": ">= 0.6" } }, - "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/static-extend": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/static-extend/-/static-extend-0.1.2.tgz", - "integrity": "sha512-72E9+uLc27Mt718pMHt9VMNiAL4LMsmDbBva8mxWUCkT07fSzEGMYUCk0XWY6lp0j6RBAG4cJ3mWuZv2OE3s0g==", + "node_modules/neostandard": { + "version": "0.11.6", "dev": true, "license": "MIT", "dependencies": { - "define-property": "^0.2.5", - "object-copy": "^0.1.0" + "@humanwhocodes/gitignore-to-minimatch": "^1.0.2", + "@stylistic/eslint-plugin": "^2.8.0", + "eslint-plugin-n": "^17.10.3", + "eslint-plugin-promise": "^7.1.0", + "eslint-plugin-react": "^7.36.1", + "find-up": "^5.0.0", + "globals": "^15.9.0", + "peowly": "^1.3.2", + "typescript-eslint": "^8.6.0" + }, + "bin": { + "neostandard": "cli.mjs" }, "engines": { - "node": ">=0.10.0" + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "peerDependencies": { + "eslint": "^9.0.0" } }, - "node_modules/static-extend/node_modules/define-property": { - "version": "0.2.5", - "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", - "integrity": "sha512-Rr7ADjQZenceVOAKop6ALkkRAmH1A4Gx9hV/7ZujPUN2rkATqFO0JZLZInbAjpZYoJ1gUx8MRMQVkYemcbMSTA==", + "node_modules/neostandard/node_modules/globals": { + "version": "15.11.0", "dev": true, "license": "MIT", - "dependencies": { - "is-descriptor": "^0.1.0" - }, "engines": { - "node": ">=0.10.0" + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/static-extend/node_modules/is-descriptor": { - "version": "0.1.7", - "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-0.1.7.tgz", - "integrity": "sha512-C3grZTvObeN1xud4cRWl366OMXZTj0+HGyk4hvfpx4ZHt1Pb60ANSXqCK7pdOTeUQpRzECBSTphqvD7U+l22Eg==", - "dev": true, + "node_modules/next-tick": { + "version": "1.1.0", + "license": "ISC" + }, + "node_modules/no-case": { + "version": "2.3.2", "license": "MIT", "dependencies": { - "is-accessor-descriptor": "^1.0.1", - "is-data-descriptor": "^1.0.1" + "lower-case": "^1.1.1" + } + }, + "node_modules/node-cron": { + "version": "3.0.3", + "license": "ISC", + "dependencies": { + "uuid": "8.3.2" }, "engines": { - "node": ">= 0.4" + "node": ">=6.0.0" } }, - "node_modules/statuses": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.1.tgz", - "integrity": "sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==", + "node_modules/node-fetch": { + "version": "2.7.0", "license": "MIT", + "dependencies": { + "whatwg-url": "^5.0.0" + }, "engines": { - "node": ">= 0.8" + "node": "4.x || >=6.0.0" + }, + "peerDependencies": { + "encoding": "^0.1.0" + }, + "peerDependenciesMeta": { + "encoding": { + "optional": true + } } }, - "node_modules/std-env": { - "version": "3.8.0", - "resolved": "https://registry.npmjs.org/std-env/-/std-env-3.8.0.tgz", - "integrity": "sha512-Bc3YwwCB+OzldMxOXJIIvC6cPRWr/LxOp48CdQTOkPyk/t4JWWJbrilwBd7RJzKV8QW7tJkcgAmeuLLJugl5/w==", + "node_modules/node-fetch-native": { + "version": "1.6.4", + "license": "MIT", + "peer": true + }, + "node_modules/node-fetch/node_modules/tr46": { + "version": "0.0.3", "license": "MIT" }, - "node_modules/stream-browserify": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/stream-browserify/-/stream-browserify-2.0.2.tgz", - "integrity": "sha512-nX6hmklHs/gr2FuxYDltq8fJA1GDlxKQCz8O/IM4atRqBH8OORmBNgfvW5gG10GT/qQ9u0CzIvr2X5Pkt6ntqg==", - "dev": true, + "node_modules/node-fetch/node_modules/webidl-conversions": { + "version": "3.0.1", + "license": "BSD-2-Clause" + }, + "node_modules/node-fetch/node_modules/whatwg-url": { + "version": "5.0.0", "license": "MIT", "dependencies": { - "inherits": "~2.0.1", - "readable-stream": "^2.0.2" + "tr46": "~0.0.3", + "webidl-conversions": "^3.0.0" } }, - "node_modules/stream-each": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/stream-each/-/stream-each-1.2.3.tgz", - "integrity": "sha512-vlMC2f8I2u/bZGqkdfLQW/13Zihpej/7PmSiMQsbYddxuTsJp8vRe2x2FvVExZg7FaOds43ROAuFJwPR4MTZLw==", - "dev": true, - "license": "MIT", - "dependencies": { - "end-of-stream": "^1.1.0", - "stream-shift": "^1.0.0" + "node_modules/node-forge": { + "version": "1.3.1", + "license": "(BSD-3-Clause OR GPL-2.0)", + "engines": { + "node": ">= 6.13.0" } }, - "node_modules/stream-http": { - "version": "2.8.3", - "resolved": "https://registry.npmjs.org/stream-http/-/stream-http-2.8.3.tgz", - "integrity": "sha512-+TSkfINHDo4J+ZobQLWiMouQYB+UVYFttRA94FpEzzJ7ZdqcL4uUUQ7WkdkI4DSozGmgBUE/a47L+38PenXhUw==", - "dev": true, + "node_modules/node-rsa": { + "version": "1.1.1", "license": "MIT", "dependencies": { - "builtin-status-codes": "^3.0.0", - "inherits": "^2.0.1", - "readable-stream": "^2.3.6", - "to-arraybuffer": "^1.0.0", - "xtend": "^4.0.0" + "asn1": "^0.2.4" } }, - "node_modules/stream-shift": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/stream-shift/-/stream-shift-1.0.3.tgz", - "integrity": "sha512-76ORR0DO1o1hlKwTbi/DM3EXWGf3ZJYO8cXX5RJwnul2DEg2oyoZyjLNoQM8WsvZiFKCRfC1O0J7iCvie3RZmQ==", - "dev": true, - "license": "MIT" + "node_modules/nodemailer": { + "version": "6.9.15", + "license": "MIT-0", + "engines": { + "node": ">=6.0.0" + } }, - "node_modules/streamsearch": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/streamsearch/-/streamsearch-1.1.0.tgz", - "integrity": "sha512-Mcc5wHehp9aXz1ax6bZUyY5afg9u2rv5cqQI3mRrYkGC8rW2hM02jWuwjtL++LS5qinSyhj2QfLyNsuc+VsExg==", + "node_modules/nopt": { + "version": "7.2.1", + "license": "ISC", + "dependencies": { + "abbrev": "^2.0.0" + }, + "bin": { + "nopt": "bin/nopt.js" + }, "engines": { - "node": ">=10.0.0" + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" } }, - "node_modules/strict-uri-encode": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/strict-uri-encode/-/strict-uri-encode-1.1.0.tgz", - "integrity": "sha512-R3f198pcvnB+5IpnBlRkphuE9n46WyVl8I39W/ZUTZLz4nqSP/oLYUrcnJrw462Ds8he4YKMov2efsTIw1BDGQ==", - "dev": true, + "node_modules/normalize-path": { + "version": "3.0.0", "license": "MIT", "engines": { "node": ">=0.10.0" } }, - "node_modules/string_decoder": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", - "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", - "license": "MIT", + "node_modules/nth-check": { + "version": "2.1.1", + "license": "BSD-2-Clause", "dependencies": { - "safe-buffer": "~5.1.0" + "boolbase": "^1.0.0" + }, + "funding": { + "url": "https://github.com/fb55/nth-check?sponsor=1" } }, - "node_modules/string_decoder/node_modules/safe-buffer": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", - "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", - "license": "MIT" - }, - "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==", + "node_modules/oauth2-mock-server": { + "version": "7.1.2", + "dev": true, "license": "MIT", "dependencies": { - "emoji-regex": "^8.0.0", - "is-fullwidth-code-point": "^3.0.0", - "strip-ansi": "^6.0.1" + "basic-auth": "^2.0.1", + "cors": "^2.8.5", + "express": "^4.18.2", + "is-plain-object": "^5.0.0", + "jose": "^5.3.0" + }, + "bin": { + "oauth2-mock-server": "dist/oauth2-mock-server.js" }, "engines": { - "node": ">=8" + "node": "^18.12 || ^20 || ^22", + "yarn": "^1.15.2" } }, - "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==", + "node_modules/oauth2-mock-server/node_modules/accepts": { + "version": "1.3.8", + "dev": true, "license": "MIT", "dependencies": { - "emoji-regex": "^8.0.0", - "is-fullwidth-code-point": "^3.0.0", - "strip-ansi": "^6.0.1" + "mime-types": "~2.1.34", + "negotiator": "0.6.3" }, "engines": { - "node": ">=8" + "node": ">= 0.6" } }, - "node_modules/string.prototype.trim": { - "version": "1.2.9", - "resolved": "https://registry.npmjs.org/string.prototype.trim/-/string.prototype.trim-1.2.9.tgz", - "integrity": "sha512-klHuCNxiMZ8MlsOihJhJEBJAiMVqU3Z2nEXWfWnIqjN0gEFS9J9+IxKozWWtQGcgoa1WUZzLjKPTr4ZHNFTFxw==", + "node_modules/oauth2-mock-server/node_modules/array-flatten": { + "version": "1.1.1", + "dev": true, + "license": "MIT" + }, + "node_modules/oauth2-mock-server/node_modules/body-parser": { + "version": "1.20.3", "dev": true, "license": "MIT", "dependencies": { - "call-bind": "^1.0.7", - "define-properties": "^1.2.1", - "es-abstract": "^1.23.0", - "es-object-atoms": "^1.0.0" - }, - "engines": { - "node": ">= 0.4" + "bytes": "3.1.2", + "content-type": "~1.0.5", + "debug": "2.6.9", + "depd": "2.0.0", + "destroy": "1.2.0", + "http-errors": "2.0.0", + "iconv-lite": "0.4.24", + "on-finished": "2.4.1", + "qs": "6.13.0", + "raw-body": "2.5.2", + "type-is": "~1.6.18", + "unpipe": "1.0.0" }, - "funding": { - "url": "https://github.com/sponsors/ljharb" + "engines": { + "node": ">= 0.8", + "npm": "1.2.8000 || >= 1.4.16" } }, - "node_modules/string.prototype.trimend": { - "version": "1.0.8", - "resolved": "https://registry.npmjs.org/string.prototype.trimend/-/string.prototype.trimend-1.0.8.tgz", - "integrity": "sha512-p73uL5VCHCO2BZZ6krwwQE3kCzM7NKmis8S//xEC6fQonchbum4eP6kR4DLEjQFO3Wnj3Fuo8NM0kOSjVdHjZQ==", + "node_modules/oauth2-mock-server/node_modules/content-disposition": { + "version": "0.5.4", "dev": true, "license": "MIT", "dependencies": { - "call-bind": "^1.0.7", - "define-properties": "^1.2.1", - "es-object-atoms": "^1.0.0" + "safe-buffer": "5.2.1" }, - "funding": { - "url": "https://github.com/sponsors/ljharb" + "engines": { + "node": ">= 0.6" } }, - "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==", + "node_modules/oauth2-mock-server/node_modules/cookie": { + "version": "0.7.1", "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": ">= 0.6" } }, - "node_modules/strip-ansi": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", - "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "node_modules/oauth2-mock-server/node_modules/cookie-signature": { + "version": "1.0.6", + "dev": true, + "license": "MIT" + }, + "node_modules/oauth2-mock-server/node_modules/debug": { + "version": "2.6.9", + "dev": true, "license": "MIT", "dependencies": { - "ansi-regex": "^5.0.1" - }, - "engines": { - "node": ">=8" + "ms": "2.0.0" } }, - "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==", + "node_modules/oauth2-mock-server/node_modules/debug/node_modules/ms": { + "version": "2.0.0", + "dev": true, + "license": "MIT" + }, + "node_modules/oauth2-mock-server/node_modules/express": { + "version": "4.21.1", + "dev": true, "license": "MIT", "dependencies": { - "ansi-regex": "^5.0.1" + "accepts": "~1.3.8", + "array-flatten": "1.1.1", + "body-parser": "1.20.3", + "content-disposition": "0.5.4", + "content-type": "~1.0.4", + "cookie": "0.7.1", + "cookie-signature": "1.0.6", + "debug": "2.6.9", + "depd": "2.0.0", + "encodeurl": "~2.0.0", + "escape-html": "~1.0.3", + "etag": "~1.8.1", + "finalhandler": "1.3.1", + "fresh": "0.5.2", + "http-errors": "2.0.0", + "merge-descriptors": "1.0.3", + "methods": "~1.1.2", + "on-finished": "2.4.1", + "parseurl": "~1.3.3", + "path-to-regexp": "0.1.10", + "proxy-addr": "~2.0.7", + "qs": "6.13.0", + "range-parser": "~1.2.1", + "safe-buffer": "5.2.1", + "send": "0.19.0", + "serve-static": "1.16.2", + "setprototypeof": "1.2.0", + "statuses": "2.0.1", + "type-is": "~1.6.18", + "utils-merge": "1.0.1", + "vary": "~1.1.2" }, "engines": { - "node": ">=8" + "node": ">= 0.10.0" } }, - "node_modules/strip-bom": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-4.0.0.tgz", - "integrity": "sha512-3xurFv5tEgii33Zi8Jtp55wEIILR9eh34FAW00PZf+JnSsTmV/ioewSgQl97JHvgjoRGwPShsWm+IdrxB35d0w==", + "node_modules/oauth2-mock-server/node_modules/finalhandler": { + "version": "1.3.1", "dev": true, "license": "MIT", + "dependencies": { + "debug": "2.6.9", + "encodeurl": "~2.0.0", + "escape-html": "~1.0.3", + "on-finished": "2.4.1", + "parseurl": "~1.3.3", + "statuses": "2.0.1", + "unpipe": "~1.0.0" + }, "engines": { - "node": ">=8" + "node": ">= 0.8" } }, - "node_modules/strip-final-newline": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/strip-final-newline/-/strip-final-newline-2.0.0.tgz", - "integrity": "sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA==", + "node_modules/oauth2-mock-server/node_modules/fresh": { + "version": "0.5.2", + "dev": true, "license": "MIT", "engines": { - "node": ">=6" + "node": ">= 0.6" } }, - "node_modules/strip-indent": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/strip-indent/-/strip-indent-3.0.0.tgz", - "integrity": "sha512-laJTa3Jb+VQpaC6DseHhF7dXVqHTfJPCRDaEbid/drOhgitgYku/letMUqOXFoWV0zIIUbjpdH2t+tYj4bQMRQ==", + "node_modules/oauth2-mock-server/node_modules/iconv-lite": { + "version": "0.4.24", "dev": true, "license": "MIT", "dependencies": { - "min-indent": "^1.0.0" + "safer-buffer": ">= 2.1.2 < 3" }, "engines": { - "node": ">=8" + "node": ">=0.10.0" } }, - "node_modules/strip-json-comments": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz", - "integrity": "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==", + "node_modules/oauth2-mock-server/node_modules/jose": { + "version": "5.9.6", "dev": true, "license": "MIT", - "engines": { - "node": ">=8" - }, "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "url": "https://github.com/sponsors/panva" } }, - "node_modules/style-resources-loader": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/style-resources-loader/-/style-resources-loader-1.5.0.tgz", - "integrity": "sha512-fIfyvQ+uvXaCBGGAgfh+9v46ARQB1AWdaop2RpQw0PBVuROsTBqGvx8dj0kxwjGOAyq3vepe4AOK3M6+Q/q2jw==", + "node_modules/oauth2-mock-server/node_modules/media-typer": { + "version": "0.3.0", "dev": true, "license": "MIT", - "dependencies": { - "glob": "^7.2.0", - "loader-utils": "^2.0.0", - "schema-utils": "^2.7.0", - "tslib": "^2.3.1" - }, "engines": { - "node": ">=8.9" - }, - "peerDependencies": { - "webpack": "^3.0.0 || ^4.0.0 || ^5.0.0" + "node": ">= 0.6" } }, - "node_modules/style-resources-loader/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==", + "node_modules/oauth2-mock-server/node_modules/merge-descriptors": { + "version": "1.0.3", "dev": true, "license": "MIT", - "dependencies": { - "big.js": "^5.2.2", - "emojis-list": "^3.0.0", - "json5": "^2.1.2" + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/oauth2-mock-server/node_modules/mime": { + "version": "1.6.0", + "dev": true, + "license": "MIT", + "bin": { + "mime": "cli.js" }, "engines": { - "node": ">=8.9.0" + "node": ">=4" } }, - "node_modules/stylehacks": { - "version": "7.0.4", - "resolved": "https://registry.npmjs.org/stylehacks/-/stylehacks-7.0.4.tgz", - "integrity": "sha512-i4zfNrGMt9SB4xRK9L83rlsFCgdGANfeDAYacO1pkqcE7cRHPdWHwnKZVz7WY17Veq/FvyYsRAU++Ga+qDFIww==", + "node_modules/oauth2-mock-server/node_modules/mime-db": { + "version": "1.52.0", "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": ">= 0.6" } }, - "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==", + "node_modules/oauth2-mock-server/node_modules/mime-types": { + "version": "2.1.35", "dev": true, "license": "MIT", "dependencies": { - "has-flag": "^4.0.0" + "mime-db": "1.52.0" }, "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/supports-color?sponsor=1" + "node": ">= 0.6" } }, - "node_modules/supports-preserve-symlinks-flag": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz", - "integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==", + "node_modules/oauth2-mock-server/node_modules/negotiator": { + "version": "0.6.3", + "dev": true, "license": "MIT", "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" + "node": ">= 0.6" } }, - "node_modules/svg-tags": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/svg-tags/-/svg-tags-1.0.0.tgz", - "integrity": "sha512-ovssysQTa+luh7A5Weu3Rta6FJlFBBbInjOh722LIt6klpU2/HtdUbszju/G4devcvk8PGt7FCLv5wftu3THUA==", - "dev": true + "node_modules/oauth2-mock-server/node_modules/path-to-regexp": { + "version": "0.1.10", + "dev": true, + "license": "MIT" }, - "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==", + "node_modules/oauth2-mock-server/node_modules/raw-body": { + "version": "2.5.2", "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" + "bytes": "3.1.2", + "http-errors": "2.0.0", + "iconv-lite": "0.4.24", + "unpipe": "1.0.0" }, "engines": { - "node": ">=14.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/svgo" + "node": ">= 0.8" } }, - "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==", + "node_modules/oauth2-mock-server/node_modules/send": { + "version": "0.19.0", "dev": true, "license": "MIT", + "dependencies": { + "debug": "2.6.9", + "depd": "2.0.0", + "destroy": "1.2.0", + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "etag": "~1.8.1", + "fresh": "0.5.2", + "http-errors": "2.0.0", + "mime": "1.6.0", + "ms": "2.1.3", + "on-finished": "2.4.1", + "range-parser": "~1.2.1", + "statuses": "2.0.1" + }, "engines": { - "node": ">= 10" + "node": ">= 0.8.0" } }, - "node_modules/table": { - "version": "6.8.2", - "resolved": "https://registry.npmjs.org/table/-/table-6.8.2.tgz", - "integrity": "sha512-w2sfv80nrAh2VCbqR5AK27wswXhqcck2AhfnNW76beQXskGZ1V12GwS//yYVa3d3fcvAip2OUnbDAjW2k3v9fA==", + "node_modules/oauth2-mock-server/node_modules/send/node_modules/encodeurl": { + "version": "1.0.2", "dev": true, - "license": "BSD-3-Clause", - "dependencies": { - "ajv": "^8.0.1", - "lodash.truncate": "^4.4.2", - "slice-ansi": "^4.0.0", - "string-width": "^4.2.3", - "strip-ansi": "^6.0.1" - }, + "license": "MIT", "engines": { - "node": ">=10.0.0" + "node": ">= 0.8" } }, - "node_modules/tapable": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/tapable/-/tapable-1.1.3.tgz", - "integrity": "sha512-4WK/bYZmj8xLr+HUCODHGF1ZFzsYffasLUgEiMBY4fgtltdO6B4WJtlSbPaDTLpYTcGVwM2qLnFTICEcNxs3kA==", + "node_modules/oauth2-mock-server/node_modules/serve-static": { + "version": "1.16.2", "dev": true, "license": "MIT", + "dependencies": { + "encodeurl": "~2.0.0", + "escape-html": "~1.0.3", + "parseurl": "~1.3.3", + "send": "0.19.0" + }, "engines": { - "node": ">=6" + "node": ">= 0.8.0" } }, - "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==", + "node_modules/oauth2-mock-server/node_modules/type-is": { + "version": "1.6.18", "dev": true, - "license": "ISC", + "license": "MIT", "dependencies": { - "chownr": "^2.0.0", - "fs-minipass": "^2.0.0", - "minipass": "^5.0.0", - "minizlib": "^2.1.1", - "mkdirp": "^1.0.3", - "yallist": "^4.0.0" + "media-typer": "0.3.0", + "mime-types": "~2.1.24" }, "engines": { - "node": ">=10" + "node": ">= 0.6" } }, - "node_modules/tar/node_modules/minipass": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/minipass/-/minipass-5.0.0.tgz", - "integrity": "sha512-3FnjYuehv9k6ovOEbyOswadCDPX1piCfhV8ncmYtHOjuPwylVWsghTLo7rabjC3Rx5xD4HDx8Wm1xnMF7S5qFQ==", - "dev": true, - "license": "ISC", + "node_modules/object-assign": { + "version": "4.1.1", + "license": "MIT", "engines": { - "node": ">=8" + "node": ">=0.10.0" } }, - "node_modules/tdigest": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/tdigest/-/tdigest-0.1.2.tgz", - "integrity": "sha512-+G0LLgjjo9BZX2MfdvPfH+MKLCrxlXSYec5DaPYP1fe6Iyhf0/fSmJ0bFiZ1F8BT6cGXl2LpltQptzjXKWEkKA==", + "node_modules/object-inspect": { + "version": "1.13.2", "license": "MIT", - "dependencies": { - "bintrees": "1.0.2" + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/terser": { - "version": "5.36.0", - "resolved": "https://registry.npmjs.org/terser/-/terser-5.36.0.tgz", - "integrity": "sha512-IYV9eNMuFAV4THUspIRXkLakHnV6XO7FEdtKjf/mDyrnqUg9LnlOn6/RwRvM9SZjR4GUq8Nk8zj67FzVARr74w==", + "node_modules/object-keys": { + "version": "1.1.1", "dev": true, - "license": "BSD-2-Clause", - "dependencies": { - "@jridgewell/source-map": "^0.3.3", - "acorn": "^8.8.2", - "commander": "^2.20.0", - "source-map-support": "~0.5.20" - }, - "bin": { - "terser": "bin/terser" - }, + "license": "MIT", "engines": { - "node": ">=10" + "node": ">= 0.4" } }, - "node_modules/terser-webpack-plugin": { - "version": "4.2.3", - "resolved": "https://registry.npmjs.org/terser-webpack-plugin/-/terser-webpack-plugin-4.2.3.tgz", - "integrity": "sha512-jTgXh40RnvOrLQNgIkwEKnQ8rmHjHK4u+6UBEi+W+FPmvb+uo+chJXntKe7/3lW5mNysgSWD60KyesnhW8D6MQ==", + "node_modules/object.assign": { + "version": "4.1.5", "dev": true, "license": "MIT", "dependencies": { - "cacache": "^15.0.5", - "find-cache-dir": "^3.3.1", - "jest-worker": "^26.5.0", - "p-limit": "^3.0.2", - "schema-utils": "^3.0.0", - "serialize-javascript": "^5.0.1", - "source-map": "^0.6.1", - "terser": "^5.3.4", - "webpack-sources": "^1.4.3" + "call-bind": "^1.0.5", + "define-properties": "^1.2.1", + "has-symbols": "^1.0.3", + "object-keys": "^1.1.1" }, "engines": { - "node": ">= 10.13.0" + "node": ">= 0.4" }, "funding": { - "type": "opencollective", - "url": "https://opencollective.com/webpack" - }, - "peerDependencies": { - "webpack": "^4.0.0 || ^5.0.0" + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/terser-webpack-plugin/node_modules/ajv": { - "version": "6.12.6", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", - "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", + "node_modules/object.entries": { + "version": "1.1.8", "dev": true, "license": "MIT", "dependencies": { - "fast-deep-equal": "^3.1.1", - "fast-json-stable-stringify": "^2.0.0", - "json-schema-traverse": "^0.4.1", - "uri-js": "^4.2.2" + "call-bind": "^1.0.7", + "define-properties": "^1.2.1", + "es-object-atoms": "^1.0.0" }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/epoberezkin" + "engines": { + "node": ">= 0.4" } }, - "node_modules/terser-webpack-plugin/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==", + "node_modules/object.fromentries": { + "version": "2.0.8", "dev": true, "license": "MIT", - "peerDependencies": { - "ajv": "^6.9.1" + "dependencies": { + "call-bind": "^1.0.7", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.2", + "es-object-atoms": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/terser-webpack-plugin/node_modules/json-schema-traverse": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", - "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", - "dev": true, - "license": "MIT" - }, - "node_modules/terser-webpack-plugin/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==", + "node_modules/object.values": { + "version": "1.2.0", "dev": true, "license": "MIT", "dependencies": { - "@types/json-schema": "^7.0.8", - "ajv": "^6.12.5", - "ajv-keywords": "^3.5.2" + "call-bind": "^1.0.7", + "define-properties": "^1.2.1", + "es-object-atoms": "^1.0.0" }, "engines": { - "node": ">= 10.13.0" + "node": ">= 0.4" }, "funding": { - "type": "opencollective", - "url": "https://opencollective.com/webpack" + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/terser-webpack-plugin/node_modules/serialize-javascript": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-5.0.1.tgz", - "integrity": "sha512-SaaNal9imEO737H2c05Og0/8LUXG7EnsZyMa8MzkmuHoELfT6txuj0cMqRj6zfPKnmQ1yasR4PCJc8x+M4JSPA==", - "dev": true, - "license": "BSD-3-Clause", + "node_modules/ofetch": { + "version": "1.4.1", + "license": "MIT", + "peer": true, "dependencies": { - "randombytes": "^2.1.0" + "destr": "^2.0.3", + "node-fetch-native": "^1.6.4", + "ufo": "^1.5.4" } }, - "node_modules/terser/node_modules/acorn": { - "version": "8.14.0", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.14.0.tgz", - "integrity": "sha512-cl669nCJTZBsL97OF4kUQm5g5hC2uihk0NxY3WENAC0TYdILVkAyHymAntgxGkl7K+t0cXIrH5siy5S4XkFycA==", - "dev": true, + "node_modules/on-finished": { + "version": "2.4.1", "license": "MIT", - "bin": { - "acorn": "bin/acorn" + "dependencies": { + "ee-first": "1.1.1" }, "engines": { - "node": ">=0.4.0" + "node": ">= 0.8" } }, - "node_modules/terser/node_modules/commander": { - "version": "2.20.3", - "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz", - "integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==", - "dev": true, - "license": "MIT" - }, - "node_modules/test-exclude": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/test-exclude/-/test-exclude-6.0.0.tgz", - "integrity": "sha512-cAGWPIyOHU6zlmg88jwm7VRyXnMN7iV68OGAbYDk/Mh/xC/pzVPlQtY6ngoIH/5/tciuhGfvESU8GrHrcxD56w==", - "dev": true, + "node_modules/once": { + "version": "1.4.0", "license": "ISC", "dependencies": { - "@istanbuljs/schema": "^0.1.2", - "glob": "^7.1.4", - "minimatch": "^3.0.4" - }, - "engines": { - "node": ">=8" + "wrappy": "1" } }, - "node_modules/text-extensions": { - "version": "1.9.0", - "resolved": "https://registry.npmjs.org/text-extensions/-/text-extensions-1.9.0.tgz", - "integrity": "sha512-wiBrwC1EhBelW12Zy26JeOUkQ5mRu+5o8rpsJk5+2t+Y5vE7e842qtZDQ2g1NpX/29HdyFeJ4nSIhI47ENSxlQ==", - "dev": true, + "node_modules/optionator": { + "version": "0.9.4", "license": "MIT", + "dependencies": { + "deep-is": "^0.1.3", + "fast-levenshtein": "^2.0.6", + "levn": "^0.4.1", + "prelude-ls": "^1.2.1", + "type-check": "^0.4.0", + "word-wrap": "^1.2.5" + }, "engines": { - "node": ">=0.10" + "node": ">= 0.8.0" } }, - "node_modules/text-table": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz", - "integrity": "sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw==", - "dev": true, - "license": "MIT" - }, - "node_modules/thenify": { - "version": "3.3.1", - "resolved": "https://registry.npmjs.org/thenify/-/thenify-3.3.1.tgz", - "integrity": "sha512-RVZSIV5IG10Hk3enotrhvz0T9em6cyHBLkH/YAZuKqd8hRkKhSfCGIcP2KUY0EPxndzANBmNllzWPwak+bheSw==", + "node_modules/os-tmpdir": { + "version": "1.0.2", "license": "MIT", - "dependencies": { - "any-promise": "^1.0.0" + "engines": { + "node": ">=0.10.0" } }, - "node_modules/thenify-all": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/thenify-all/-/thenify-all-1.6.0.tgz", - "integrity": "sha512-RNxQH/qI8/t3thXJDwcstUO4zeqo64+Uy/+sNVRBx4Xn2OX+OZ9oP+iJnNFqplFra2ZUVeKCSa2oVWi3T4uVmA==", + "node_modules/otplib": { + "version": "12.0.1", "license": "MIT", "dependencies": { - "thenify": ">= 3.1.0 < 4" - }, - "engines": { - "node": ">=0.8" - } - }, - "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==", - "dev": true, - "license": "Unlicense", - "engines": { - "node": ">=10.18" - }, - "peerDependencies": { - "tslib": "^2" + "@otplib/core": "^12.0.1", + "@otplib/preset-default": "^12.0.1", + "@otplib/preset-v11": "^12.0.1" } }, - "node_modules/thirty-two": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/thirty-two/-/thirty-two-1.0.2.tgz", - "integrity": "sha512-OEI0IWCe+Dw46019YLl6V10Us5bi574EvlJEOcAkB29IzQ/mYD1A6RyNHLjZPiHCmuodxvgF6U+vZO1L15lxVA==", + "node_modules/p-finally": { + "version": "1.0.0", + "license": "MIT", "engines": { - "node": ">=0.2.6" + "node": ">=4" } }, - "node_modules/thread-loader": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/thread-loader/-/thread-loader-3.0.4.tgz", - "integrity": "sha512-ByaL2TPb+m6yArpqQUZvP+5S1mZtXsEP7nWKKlAUTm7fCml8kB5s1uI3+eHRP2bk5mVYfRSBI7FFf+tWEyLZwA==", - "dev": true, + "node_modules/p-limit": { + "version": "3.1.0", "license": "MIT", "dependencies": { - "json-parse-better-errors": "^1.0.2", - "loader-runner": "^4.1.0", - "loader-utils": "^2.0.0", - "neo-async": "^2.6.2", - "schema-utils": "^3.0.0" + "yocto-queue": "^0.1.0" }, "engines": { - "node": ">= 10.13.0" + "node": ">=10" }, "funding": { - "type": "opencollective", - "url": "https://opencollective.com/webpack" - }, - "peerDependencies": { - "webpack": "^4.27.0 || ^5.0.0" + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/thread-loader/node_modules/ajv": { - "version": "6.12.6", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", - "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", - "dev": true, + "node_modules/p-locate": { + "version": "5.0.0", "license": "MIT", "dependencies": { - "fast-deep-equal": "^3.1.1", - "fast-json-stable-stringify": "^2.0.0", - "json-schema-traverse": "^0.4.1", - "uri-js": "^4.2.2" + "p-limit": "^3.0.2" + }, + "engines": { + "node": ">=10" }, "funding": { - "type": "github", - "url": "https://github.com/sponsors/epoberezkin" + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/thread-loader/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, + "node_modules/p-timeout": { + "version": "3.2.0", "license": "MIT", - "peerDependencies": { - "ajv": "^6.9.1" + "dependencies": { + "p-finally": "^1.0.0" + }, + "engines": { + "node": ">=8" } }, - "node_modules/thread-loader/node_modules/json-schema-traverse": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", - "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", - "dev": true, - "license": "MIT" - }, - "node_modules/thread-loader/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, + "node_modules/p-try": { + "version": "2.2.0", "license": "MIT", - "dependencies": { - "big.js": "^5.2.2", - "emojis-list": "^3.0.0", - "json5": "^2.1.2" - }, "engines": { - "node": ">=8.9.0" + "node": ">=6" } }, - "node_modules/thread-loader/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, + "node_modules/p-wait-for": { + "version": "3.2.0", "license": "MIT", "dependencies": { - "@types/json-schema": "^7.0.8", - "ajv": "^6.12.5", - "ajv-keywords": "^3.5.2" + "p-timeout": "^3.0.0" }, "engines": { - "node": ">= 10.13.0" + "node": ">=8" }, "funding": { - "type": "opencollective", - "url": "https://opencollective.com/webpack" + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/through": { - "version": "2.3.8", - "resolved": "https://registry.npmjs.org/through/-/through-2.3.8.tgz", - "integrity": "sha512-w89qg7PI8wAdvX60bMDP+bFoD5Dvhm9oLheFp5O4a2QF0cSBGsBX4qZmadPMvVqlLJBBci+WqGGOAPvcDeNSVg==", - "license": "MIT" + "node_modules/package-json-from-dist": { + "version": "1.0.1", + "license": "BlueOak-1.0.0" }, - "node_modules/through2": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/through2/-/through2-4.0.2.tgz", - "integrity": "sha512-iOqSav00cVxEEICeD7TjLB1sueEL+81Wpzp2bY17uZjZN0pWZPuo4suZ/61VujxmqSGFfgOcNuTZ85QJwNZQpw==", - "dev": true, + "node_modules/pako": { + "version": "1.0.11", + "license": "(MIT AND Zlib)" + }, + "node_modules/param-case": { + "version": "2.1.1", "license": "MIT", "dependencies": { - "readable-stream": "3" + "no-case": "^2.2.0" } }, - "node_modules/through2/node_modules/readable-stream": { - "version": "3.6.2", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.2.tgz", - "integrity": "sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==", - "dev": true, + "node_modules/parent-module": { + "version": "1.0.1", "license": "MIT", "dependencies": { - "inherits": "^2.0.3", - "string_decoder": "^1.1.1", - "util-deprecate": "^1.0.1" + "callsites": "^3.0.0" }, "engines": { - "node": ">= 6" - } - }, - "node_modules/time-fix-plugin": { - "version": "2.0.7", - "resolved": "https://registry.npmjs.org/time-fix-plugin/-/time-fix-plugin-2.0.7.tgz", - "integrity": "sha512-uVFet1LQToeUX0rTcSiYVYVoGuBpc8gP/2jnlUzuHMHe+gux6XLsNzxLUweabMwiUj5ejhoIMsUI55nVSEa/Vw==", - "dev": true, - "license": "MIT", - "peerDependencies": { - "webpack": ">=4.0.0" + "node": ">=6" } }, - "node_modules/timers-browserify": { - "version": "2.0.12", - "resolved": "https://registry.npmjs.org/timers-browserify/-/timers-browserify-2.0.12.tgz", - "integrity": "sha512-9phl76Cqm6FhSX9Xe1ZUAMLtm1BLkKj2Qd5ApyWkXzsMRaA7dgr81kf4wJmQf/hAvg8EEyJxDo3du/0KlhPiKQ==", + "node_modules/parse-json": { + "version": "5.2.0", "dev": true, "license": "MIT", "dependencies": { - "setimmediate": "^1.0.4" + "@babel/code-frame": "^7.0.0", + "error-ex": "^1.3.1", + "json-parse-even-better-errors": "^2.3.0", + "lines-and-columns": "^1.1.6" }, "engines": { - "node": ">=0.6.0" + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/timers-ext": { - "version": "0.1.8", - "resolved": "https://registry.npmjs.org/timers-ext/-/timers-ext-0.1.8.tgz", - "integrity": "sha512-wFH7+SEAcKfJpfLPkrgMPvvwnEtj8W4IurvEyrKsDleXnKLCDw71w8jltvfLa8Rm4qQxxT4jmDBYbJG/z7qoww==", - "license": "ISC", + "node_modules/parse5": { + "version": "7.2.0", + "license": "MIT", "dependencies": { - "es5-ext": "^0.10.64", - "next-tick": "^1.1.0" + "entities": "^4.5.0" }, - "engines": { - "node": ">=0.12" + "funding": { + "url": "https://github.com/inikulin/parse5?sponsor=1" } }, - "node_modules/tinycolor2": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/tinycolor2/-/tinycolor2-1.6.0.tgz", - "integrity": "sha512-XPaBkWQJdsf3pLKJV9p4qN/S+fm2Oj8AIPo1BTUhg5oxkvm9+SVEGFdhyOz7tTdUTfvxMiAs4sp6/eZO2Ew+pw==", - "dev": true, - "license": "MIT" - }, - "node_modules/tmp": { - "version": "0.0.33", - "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.0.33.tgz", - "integrity": "sha512-jRCJlojKnZ3addtTOjdIqoRuPEKBvNXcGYqzO6zWZX8KfKEpnGY5jfggJQ3EjKuu8D4bJRr0y+cYJFmYbImXGw==", + "node_modules/parse5-htmlparser2-tree-adapter": { + "version": "7.1.0", "license": "MIT", "dependencies": { - "os-tmpdir": "~1.0.2" + "domhandler": "^5.0.3", + "parse5": "^7.0.0" }, + "funding": { + "url": "https://github.com/inikulin/parse5?sponsor=1" + } + }, + "node_modules/parseurl": { + "version": "1.3.3", + "license": "MIT", "engines": { - "node": ">=0.6.0" + "node": ">= 0.8" } }, - "node_modules/to-arraybuffer": { + "node_modules/path-browserify": { "version": "1.0.1", - "resolved": "https://registry.npmjs.org/to-arraybuffer/-/to-arraybuffer-1.0.1.tgz", - "integrity": "sha512-okFlQcoGTi4LQBG/PgSYblw9VOyptsz2KJZqc6qtgGdes8VktzUQkj4BI2blit072iS8VODNcMA+tvnS9dnuMA==", - "dev": true, "license": "MIT" }, - "node_modules/to-object-path": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/to-object-path/-/to-object-path-0.3.0.tgz", - "integrity": "sha512-9mWHdnGRuh3onocaHzukyvCZhzvr6tiflAy/JRFXcJX0TjgfWA9pk9t8CMbzmBE4Jfw58pXbkngtBtqYxzNEyg==", - "dev": true, + "node_modules/path-exists": { + "version": "4.0.0", "license": "MIT", - "dependencies": { - "kind-of": "^3.0.2" - }, "engines": { - "node": ">=0.10.0" + "node": ">=8" } }, - "node_modules/to-object-path/node_modules/kind-of": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha512-NOW9QQXMoZGg/oqnVNoNTTIFEIid1627WCffUBJEdMxYApq7mNE7CpzucIPc+ZQg25Phej7IJSmX3hO+oblOtQ==", - "dev": true, + "node_modules/path-key": { + "version": "3.1.1", "license": "MIT", - "dependencies": { - "is-buffer": "^1.1.5" - }, "engines": { - "node": ">=0.10.0" + "node": ">=8" } }, - "node_modules/to-regex": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/to-regex/-/to-regex-3.0.2.tgz", - "integrity": "sha512-FWtleNAtZ/Ki2qtqej2CXTOayOH9bHDQF+Q48VpWyDXjbYxA4Yz8iDB31zXOBUlOHHKidDbqGVrTUvQMPmBGBw==", + "node_modules/path-parse": { + "version": "1.0.7", "dev": true, - "license": "MIT", + "license": "MIT" + }, + "node_modules/path-scurry": { + "version": "1.11.1", + "license": "BlueOak-1.0.0", "dependencies": { - "define-property": "^2.0.2", - "extend-shallow": "^3.0.2", - "regex-not": "^1.0.2", - "safe-regex": "^1.1.0" + "lru-cache": "^10.2.0", + "minipass": "^5.0.0 || ^6.0.2 || ^7.0.0" }, "engines": { - "node": ">=0.10.0" + "node": ">=16 || 14 >=14.18" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" } }, - "node_modules/to-regex-range": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", - "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", + "node_modules/path-scurry/node_modules/lru-cache": { + "version": "10.4.3", + "license": "ISC" + }, + "node_modules/path-to-regexp": { + "version": "8.2.0", "license": "MIT", - "dependencies": { - "is-number": "^7.0.0" - }, "engines": { - "node": ">=8.0" + "node": ">=16" } }, - "node_modules/toidentifier": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.1.tgz", - "integrity": "sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA==", + "node_modules/path-type": { + "version": "4.0.0", "license": "MIT", "engines": { - "node": ">=0.6" + "node": ">=8" } }, - "node_modules/totalist": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/totalist/-/totalist-3.0.1.tgz", - "integrity": "sha512-sf4i37nQ2LBx4m3wB74y+ubopq6W/dIzXg0FDGjsYnZHVa1Da8FH853wlL2gtUhg+xJXjfk3kUZS3BRoQeoQBQ==", + "node_modules/pathe": { + "version": "1.1.2", + "license": "MIT" + }, + "node_modules/peowly": { + "version": "1.3.2", "dev": true, "license": "MIT", "engines": { - "node": ">=6" + "node": ">=18.6.0" } }, - "node_modules/touch": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/touch/-/touch-3.1.1.tgz", - "integrity": "sha512-r0eojU4bI8MnHr8c5bNo7lJDdI2qXlWWJk6a9EAFG7vbhTjElYhBVS3/miuE0uOuoLdb8Mc/rVfsmm6eo5o9GA==", - "dev": true, - "license": "ISC", - "bin": { - "nodetouch": "bin/nodetouch.js" + "node_modules/picocolors": { + "version": "1.1.0", + "license": "ISC" + }, + "node_modules/picomatch": { + "version": "2.3.1", + "license": "MIT", + "engines": { + "node": ">=8.6" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" } }, - "node_modules/tr46": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/tr46/-/tr46-3.0.0.tgz", - "integrity": "sha512-l7FvfAHlcmulp8kr+flpQZmVwtu7nfRV7NZujtN0OqES8EL4O4e0qqzL0DC5gAvx/ZC/9lk6rhcUwYvkBnBnYA==", + "node_modules/pkg-types": { + "version": "1.2.1", "license": "MIT", "dependencies": { - "punycode": "^2.1.1" - }, - "engines": { - "node": ">=12" + "confbox": "^0.1.8", + "mlly": "^1.7.2", + "pathe": "^1.1.2" } }, - "node_modules/tr46/node_modules/punycode": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.1.tgz", - "integrity": "sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==", + "node_modules/pngjs": { + "version": "5.0.0", "license": "MIT", "engines": { - "node": ">=6" + "node": ">=10.13.0" } }, - "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==", + "node_modules/possible-typed-array-names": { + "version": "1.0.0", "dev": true, - "license": "Apache-2.0", + "license": "MIT", "engines": { - "node": ">=10.0" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/streamich" - }, - "peerDependencies": { - "tslib": "2" + "node": ">= 0.4" } }, - "node_modules/trim-newlines": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/trim-newlines/-/trim-newlines-3.0.1.tgz", - "integrity": "sha512-c1PTsA3tYrIsLGkJkzHF+w9F2EyxfXGo4UyJc4pFL++FMjnq0HJS69T3M7d//gKrFKwy429bouPescbjecU+Zw==", - "dev": true, + "node_modules/postcss": { + "version": "8.4.47", + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/postcss" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], "license": "MIT", + "dependencies": { + "nanoid": "^3.3.7", + "picocolors": "^1.1.0", + "source-map-js": "^1.2.1" + }, "engines": { - "node": ">=8" + "node": "^10 || ^12 || >=14" } }, - "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/postcss-selector-parser": { + "version": "6.1.2", "dev": true, "license": "MIT", "dependencies": { - "@cspotcode/source-map-support": "^0.8.0", - "@tsconfig/node10": "^1.0.7", - "@tsconfig/node12": "^1.0.7", - "@tsconfig/node14": "^1.0.0", - "@tsconfig/node16": "^1.0.2", - "acorn": "^8.4.1", - "acorn-walk": "^8.1.1", - "arg": "^4.1.0", - "create-require": "^1.1.0", - "diff": "^4.0.1", - "make-error": "^1.1.1", - "v8-compile-cache-lib": "^3.0.1", - "yn": "3.1.1" - }, - "bin": { - "ts-node": "dist/bin.js", - "ts-node-cwd": "dist/bin-cwd.js", - "ts-node-esm": "dist/bin-esm.js", - "ts-node-script": "dist/bin-script.js", - "ts-node-transpile-only": "dist/bin-transpile.js", - "ts-script": "dist/bin-script-deprecated.js" - }, - "peerDependencies": { - "@swc/core": ">=1.2.50", - "@swc/wasm": ">=1.2.50", - "@types/node": "*", - "typescript": ">=2.7" + "cssesc": "^3.0.0", + "util-deprecate": "^1.0.2" }, - "peerDependenciesMeta": { - "@swc/core": { - "optional": true - }, - "@swc/wasm": { - "optional": true - } + "engines": { + "node": ">=4" } }, - "node_modules/ts-node/node_modules/acorn": { - "version": "8.14.0", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.14.0.tgz", - "integrity": "sha512-cl669nCJTZBsL97OF4kUQm5g5hC2uihk0NxY3WENAC0TYdILVkAyHymAntgxGkl7K+t0cXIrH5siy5S4XkFycA==", - "dev": true, + "node_modules/postcss/node_modules/nanoid": { + "version": "3.3.7", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], "license": "MIT", "bin": { - "acorn": "bin/acorn" + "nanoid": "bin/nanoid.cjs" }, "engines": { - "node": ">=0.4.0" + "node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1" } }, - "node_modules/ts-node/node_modules/arg": { - "version": "4.1.3", - "resolved": "https://registry.npmjs.org/arg/-/arg-4.1.3.tgz", - "integrity": "sha512-58S9QDqG0Xx27YwPSt9fJxivjYl432YCwfDMfZ+71RAqUrZef7LrKQZ3LHLOwCS4FLNBplP533Zx895SeOCHvA==", - "dev": true, - "license": "MIT" - }, - "node_modules/ts-node/node_modules/diff": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/diff/-/diff-4.0.2.tgz", - "integrity": "sha512-58lmxKSA4BNyLz+HHMUzlOEpg09FV+ev6ZMe3vJihgdxzgcwZ8VoEEPmALCZG9LmqfVoNMMKpttIYTVG6uDY7A==", - "dev": true, - "license": "BSD-3-Clause", + "node_modules/precond": { + "version": "0.2.3", "engines": { - "node": ">=0.3.1" + "node": ">= 0.6" } }, - "node_modules/ts-pnp": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/ts-pnp/-/ts-pnp-1.2.0.tgz", - "integrity": "sha512-csd+vJOb/gkzvcCHgTGSChYpy5f1/XKNsmvBGO4JXS+z1v2HobugDz4s1IeFXM3wZB44uczs+eazB5Q/ccdhQw==", - "dev": true, + "node_modules/prelude-ls": { + "version": "1.2.1", "license": "MIT", "engines": { - "node": ">=6" - }, - "peerDependenciesMeta": { - "typescript": { - "optional": true - } + "node": ">= 0.8.0" } }, - "node_modules/tsconfig-paths": { - "version": "3.15.0", - "resolved": "https://registry.npmjs.org/tsconfig-paths/-/tsconfig-paths-3.15.0.tgz", - "integrity": "sha512-2Ac2RgzDe/cn48GvOe3M+o82pEFewD3UPbyoUHHdKasHwJKjds4fLXWf/Ux5kATBKN20oaFGu+jbElp1pos0mg==", - "dev": true, + "node_modules/prettier": { + "version": "3.3.3", "license": "MIT", - "dependencies": { - "@types/json5": "^0.0.29", - "json5": "^1.0.2", - "minimist": "^1.2.6", - "strip-bom": "^3.0.0" + "bin": { + "prettier": "bin/prettier.cjs" + }, + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/prettier/prettier?sponsor=1" } }, - "node_modules/tsconfig-paths/node_modules/json5": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/json5/-/json5-1.0.2.tgz", - "integrity": "sha512-g1MWMLBiz8FKi1e4w0UyVL3w+iJceWAFBAaBnnGKOpNa5f8TLktkbre1+s6oICydWAm+HRUGTmI+//xv2hvXYA==", - "dev": true, - "license": "MIT", + "node_modules/process-nextick-args": { + "version": "2.0.1", + "license": "MIT" + }, + "node_modules/process-warning": { + "version": "2.3.2", + "license": "MIT" + }, + "node_modules/prom-client": { + "version": "15.1.3", + "license": "Apache-2.0", "dependencies": { - "minimist": "^1.2.0" + "@opentelemetry/api": "^1.4.0", + "tdigest": "^0.1.1" }, - "bin": { - "json5": "lib/cli.js" + "engines": { + "node": "^16 || ^18 || >=20" } }, - "node_modules/tsconfig-paths/node_modules/strip-bom": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz", - "integrity": "sha512-vavAMRXOgBVNF6nyEEmL3DBK19iRpDcoIwW+swQ+CbGiu7lju6t+JklA1MHweoWtadgt4ISVUsXLyDq34ddcwA==", + "node_modules/prop-types": { + "version": "15.8.1", "dev": true, "license": "MIT", - "engines": { - "node": ">=4" + "dependencies": { + "loose-envify": "^1.4.0", + "object-assign": "^4.1.1", + "react-is": "^16.13.1" } }, - "node_modules/tslib": { - "version": "2.8.1", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.8.1.tgz", - "integrity": "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==", - "dev": true, - "license": "0BSD" + "node_modules/proto-list": { + "version": "1.2.4", + "license": "ISC" }, - "node_modules/tsscmp": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/tsscmp/-/tsscmp-1.0.6.tgz", - "integrity": "sha512-LxhtAkPDTkVCMQjt2h6eBVY28KCjikZqZfMcC15YBeNjkgUpdCfBu5HoiOTDu86v6smE8yOjyEktJ8hlbANHQA==", + "node_modules/proxy-addr": { + "version": "2.0.7", "license": "MIT", + "dependencies": { + "forwarded": "0.2.0", + "ipaddr.js": "1.9.1" + }, "engines": { - "node": ">=0.6.x" + "node": ">= 0.10" } }, - "node_modules/tty-browserify": { - "version": "0.0.0", - "resolved": "https://registry.npmjs.org/tty-browserify/-/tty-browserify-0.0.0.tgz", - "integrity": "sha512-JVa5ijo+j/sOoHGjw0sxw734b1LhBkQ3bvUGNdxnVXDCX81Yx7TFgnZygxrIIWn23hbfTaMYLwRmAxFyDuFmIw==", - "dev": true, + "node_modules/proxy-from-env": { + "version": "1.1.0", "license": "MIT" }, - "node_modules/type": { - "version": "2.7.3", - "resolved": "https://registry.npmjs.org/type/-/type-2.7.3.tgz", - "integrity": "sha512-8j+1QmAbPvLZow5Qpi6NCaN8FB60p/6x8/vfNqOk/hC+HuvFZhL4+WfekuhQLiqFZXOgQdrs3B+XxEmCc6b3FQ==", + "node_modules/pseudomap": { + "version": "1.0.2", "license": "ISC" }, - "node_modules/type-check": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.4.0.tgz", - "integrity": "sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==", - "dev": true, + "node_modules/punycode": { + "version": "2.3.1", + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/qrcode": { + "version": "1.5.4", "license": "MIT", "dependencies": { - "prelude-ls": "^1.2.1" + "dijkstrajs": "^1.0.1", + "pngjs": "^5.0.0", + "yargs": "^15.3.1" + }, + "bin": { + "qrcode": "bin/qrcode" }, "engines": { - "node": ">= 0.8.0" + "node": ">=10.13.0" } }, - "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==", - "license": "(MIT OR CC0-1.0)", - "engines": { - "node": ">=12.20" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "node_modules/qrcode/node_modules/cliui": { + "version": "6.0.0", + "license": "ISC", + "dependencies": { + "string-width": "^4.2.0", + "strip-ansi": "^6.0.0", + "wrap-ansi": "^6.2.0" } }, - "node_modules/type-is": { - "version": "1.6.18", - "resolved": "https://registry.npmjs.org/type-is/-/type-is-1.6.18.tgz", - "integrity": "sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g==", + "node_modules/qrcode/node_modules/find-up": { + "version": "4.1.0", "license": "MIT", "dependencies": { - "media-typer": "0.3.0", - "mime-types": "~2.1.24" + "locate-path": "^5.0.0", + "path-exists": "^4.0.0" }, "engines": { - "node": ">= 0.6" + "node": ">=8" } }, - "node_modules/typed-array-buffer": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/typed-array-buffer/-/typed-array-buffer-1.0.2.tgz", - "integrity": "sha512-gEymJYKZtKXzzBzM4jqa9w6Q1Jjm7x2d+sh19AdsD4wqnMPDYyvwpsIc2Q/835kHuo3BEQ7CjelGhfTsoBb2MQ==", - "dev": true, + "node_modules/qrcode/node_modules/locate-path": { + "version": "5.0.0", "license": "MIT", "dependencies": { - "call-bind": "^1.0.7", - "es-errors": "^1.3.0", - "is-typed-array": "^1.1.13" + "p-locate": "^4.1.0" }, "engines": { - "node": ">= 0.4" + "node": ">=8" } }, - "node_modules/typed-array-byte-length": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/typed-array-byte-length/-/typed-array-byte-length-1.0.1.tgz", - "integrity": "sha512-3iMJ9q0ao7WE9tWcaYKIptkNBuOIcZCCT0d4MRvuuH88fEoEH62IuQe0OtraD3ebQEoTRk8XCBoknUNc1Y67pw==", - "dev": true, + "node_modules/qrcode/node_modules/p-limit": { + "version": "2.3.0", "license": "MIT", "dependencies": { - "call-bind": "^1.0.7", - "for-each": "^0.3.3", - "gopd": "^1.0.1", - "has-proto": "^1.0.3", - "is-typed-array": "^1.1.13" + "p-try": "^2.0.0" }, "engines": { - "node": ">= 0.4" + "node": ">=6" }, "funding": { - "url": "https://github.com/sponsors/ljharb" + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/typed-array-byte-offset": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/typed-array-byte-offset/-/typed-array-byte-offset-1.0.2.tgz", - "integrity": "sha512-Ous0vodHa56FviZucS2E63zkgtgrACj7omjwd/8lTEMEPFFyjfixMZ1ZXenpgCFBBt4EC1J2XsyVS2gkG0eTFA==", - "dev": true, + "node_modules/qrcode/node_modules/p-locate": { + "version": "4.1.0", "license": "MIT", "dependencies": { - "available-typed-arrays": "^1.0.7", - "call-bind": "^1.0.7", - "for-each": "^0.3.3", - "gopd": "^1.0.1", - "has-proto": "^1.0.3", - "is-typed-array": "^1.1.13" + "p-limit": "^2.2.0" }, "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" + "node": ">=8" } }, - "node_modules/typed-array-length": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/typed-array-length/-/typed-array-length-1.0.6.tgz", - "integrity": "sha512-/OxDN6OtAk5KBpGb28T+HZc2M+ADtvRxXrKKbUwtsLgdoxgX13hyy7ek6bFRl5+aBs2yZzB0c4CnQfAtVypW/g==", - "dev": true, + "node_modules/qrcode/node_modules/wrap-ansi": { + "version": "6.2.0", "license": "MIT", "dependencies": { - "call-bind": "^1.0.7", - "for-each": "^0.3.3", - "gopd": "^1.0.1", - "has-proto": "^1.0.3", - "is-typed-array": "^1.1.13", - "possible-typed-array-names": "^1.0.0" + "ansi-styles": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0" }, "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" + "node": ">=8" } }, - "node_modules/typedarray": { - "version": "0.0.6", - "resolved": "https://registry.npmjs.org/typedarray/-/typedarray-0.0.6.tgz", - "integrity": "sha512-/aCDEGatGvZ2BIk+HmLf4ifCJFwvKFNb9/JeZPMulfgFracn9QFcAf5GO8B/mweUjSoblS5In0cWhqpfs/5PQA==", - "license": "MIT" + "node_modules/qrcode/node_modules/y18n": { + "version": "4.0.3", + "license": "ISC" }, - "node_modules/typedarray-to-buffer": { - "version": "3.1.5", - "resolved": "https://registry.npmjs.org/typedarray-to-buffer/-/typedarray-to-buffer-3.1.5.tgz", - "integrity": "sha512-zdu8XMNEDepKKR+XYOXAVPtWui0ly0NtohUscw+UmaHiAWT8hrV1rr//H6V+0DvJ3OQ19S979M0laLfX8rm82Q==", - "dev": true, + "node_modules/qrcode/node_modules/yargs": { + "version": "15.4.1", "license": "MIT", "dependencies": { - "is-typedarray": "^1.0.0" + "cliui": "^6.0.0", + "decamelize": "^1.2.0", + "find-up": "^4.1.0", + "get-caller-file": "^2.0.1", + "require-directory": "^2.1.1", + "require-main-filename": "^2.0.0", + "set-blocking": "^2.0.0", + "string-width": "^4.2.0", + "which-module": "^2.0.0", + "y18n": "^4.0.0", + "yargs-parser": "^18.1.2" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/qrcode/node_modules/yargs-parser": { + "version": "18.1.3", + "license": "ISC", + "dependencies": { + "camelcase": "^5.0.0", + "decamelize": "^1.2.0" + }, + "engines": { + "node": ">=6" } }, - "node_modules/typescript": { - "version": "5.6.3", - "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.6.3.tgz", - "integrity": "sha512-hjcS1mhfuyi4WW8IWtjP7brDrG2cuDZukyrYrSauoXGNgx0S7zceP07adYkJycEr56BOUTNPzbInooiN3fn1qw==", - "dev": true, - "license": "Apache-2.0", - "bin": { - "tsc": "bin/tsc", - "tsserver": "bin/tsserver" + "node_modules/qs": { + "version": "6.13.0", + "license": "BSD-3-Clause", + "dependencies": { + "side-channel": "^1.0.6" }, "engines": { - "node": ">=14.17" + "node": ">=0.6" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/ua-parser-js": { - "version": "1.0.39", - "resolved": "https://registry.npmjs.org/ua-parser-js/-/ua-parser-js-1.0.39.tgz", - "integrity": "sha512-k24RCVWlEcjkdOxYmVJgeD/0a1TiSpqLg+ZalVGV9lsnr4yqu0w7tX/x2xX6G4zpkgQnRf89lxuZ1wsbjXM8lw==", + "node_modules/queue-microtask": { + "version": "1.2.3", "funding": [ { - "type": "opencollective", - "url": "https://opencollective.com/ua-parser-js" + "type": "github", + "url": "https://github.com/sponsors/feross" }, { - "type": "paypal", - "url": "https://paypal.me/faisalman" + "type": "patreon", + "url": "https://www.patreon.com/feross" }, { - "type": "github", - "url": "https://github.com/sponsors/faisalman" + "type": "consulting", + "url": "https://feross.org/support" } ], + "license": "MIT" + }, + "node_modules/range-parser": { + "version": "1.2.1", "license": "MIT", - "bin": { - "ua-parser-js": "script/cli.js" - }, "engines": { - "node": "*" + "node": ">= 0.6" } }, - "node_modules/uc.micro": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/uc.micro/-/uc.micro-1.0.6.tgz", - "integrity": "sha512-8Y75pvTYkLJW2hWQHXxoqRgV7qb9B+9vFEtidML+7koHUFapnVJAZ6cKs+Qjz5Aw3aZWHMC6u0wJE3At+nSGwA==", - "dev": true, - "license": "MIT" - }, - "node_modules/ufo": { - "version": "0.8.6", - "resolved": "https://registry.npmjs.org/ufo/-/ufo-0.8.6.tgz", - "integrity": "sha512-fk6CmUgwKCfX79EzcDQQpSCMxrHstvbLswFChHS0Vump+kFkw7nJBfTZoC1j0bOGoY9I7R3n2DGek5ajbcYnOw==", - "license": "MIT" + "node_modules/rate-limiter-flexible": { + "version": "5.0.3", + "license": "ISC" }, - "node_modules/uglify-js": { - "version": "3.19.3", - "resolved": "https://registry.npmjs.org/uglify-js/-/uglify-js-3.19.3.tgz", - "integrity": "sha512-v3Xu+yuwBXisp6QYTcH4UbH+xYJXqnq2m/LtQVWKWzYc1iehYnLixoQDN9FH6/j9/oybfd6W9Ghwkl8+UMKTKQ==", - "license": "BSD-2-Clause", - "bin": { - "uglifyjs": "bin/uglifyjs" + "node_modules/raw-body": { + "version": "3.0.0", + "license": "MIT", + "dependencies": { + "bytes": "3.1.2", + "http-errors": "2.0.0", + "iconv-lite": "0.6.3", + "unpipe": "1.0.0" }, "engines": { - "node": ">=0.8.0" + "node": ">= 0.8" } }, - "node_modules/unbox-primitive": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/unbox-primitive/-/unbox-primitive-1.0.2.tgz", - "integrity": "sha512-61pPlCD9h51VoreyJ0BReideM3MDKMKnh6+V9L08331ipq6Q8OFXZYiqP6n/tbHx4s5I9uRhcye6BrbkizkBDw==", - "dev": true, + "node_modules/raw-body/node_modules/iconv-lite": { + "version": "0.6.3", "license": "MIT", "dependencies": { - "call-bind": "^1.0.2", - "has-bigints": "^1.0.2", - "has-symbols": "^1.0.3", - "which-boxed-primitive": "^1.0.2" + "safer-buffer": ">= 2.1.2 < 3.0.0" }, - "funding": { - "url": "https://github.com/sponsors/ljharb" + "engines": { + "node": ">=0.10.0" } }, - "node_modules/undefsafe": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/undefsafe/-/undefsafe-2.0.5.tgz", - "integrity": "sha512-WxONCrssBM8TSPRqN5EmsjVrsv4A8X12J4ArBiiayv3DyyG3ZlIg6yysuuSYdZsVz3TKcTg2fd//Ujd4CHV1iA==", + "node_modules/react-is": { + "version": "16.13.1", "dev": true, "license": "MIT" }, - "node_modules/unfetch": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/unfetch/-/unfetch-5.0.0.tgz", - "integrity": "sha512-3xM2c89siXg0nHvlmYsQ2zkLASvVMBisZm5lF3gFDqfF2xonNStDJyMpvaOBe0a1Edxmqrf2E0HBdmy9QyZaeg==", - "dev": true, + "node_modules/readable-stream": { + "version": "2.3.8", "license": "MIT", - "workspaces": [ - "./packages/isomorphic-unfetch" - ] + "dependencies": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" + } }, - "node_modules/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, + "node_modules/readable-stream/node_modules/isarray": { + "version": "1.0.0", + "license": "MIT" + }, + "node_modules/readable-stream/node_modules/safe-buffer": { + "version": "5.1.2", + "license": "MIT" + }, + "node_modules/readdirp": { + "version": "3.6.0", "license": "MIT", + "dependencies": { + "picomatch": "^2.2.1" + }, "engines": { - "node": ">=4" + "node": ">=8.10.0" } }, - "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==", + "node_modules/reflect.getprototypeof": { + "version": "1.0.6", "dev": true, "license": "MIT", "dependencies": { - "unicode-canonical-property-names-ecmascript": "^2.0.0", - "unicode-property-aliases-ecmascript": "^2.0.0" + "call-bind": "^1.0.7", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.1", + "es-errors": "^1.3.0", + "get-intrinsic": "^1.2.4", + "globalthis": "^1.0.3", + "which-builtin-type": "^1.1.3" }, "engines": { - "node": ">=4" + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "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==", + "node_modules/regenerator-runtime": { + "version": "0.14.1", + "license": "MIT" + }, + "node_modules/regexp.prototype.flags": { + "version": "1.5.3", "dev": true, "license": "MIT", + "dependencies": { + "call-bind": "^1.0.7", + "define-properties": "^1.2.1", + "es-errors": "^1.3.0", + "set-function-name": "^2.0.2" + }, "engines": { - "node": ">=4" + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "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, + "node_modules/relateurl": { + "version": "0.2.7", "license": "MIT", "engines": { - "node": ">=4" + "node": ">= 0.10" } }, - "node_modules/union-value": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/union-value/-/union-value-1.0.1.tgz", - "integrity": "sha512-tJfXmxMeWYnczCVs7XAEvIV7ieppALdyepWMkHkwciRpZraG/xwT+s2JN8+pr1+8jCRf80FFzvr+MpQeeoF4Xg==", - "dev": true, + "node_modules/require-directory": { + "version": "2.1.1", "license": "MIT", - "dependencies": { - "arr-union": "^3.1.0", - "get-value": "^2.0.6", - "is-extendable": "^0.1.1", - "set-value": "^2.0.1" - }, "engines": { "node": ">=0.10.0" } }, - "node_modules/union-value/node_modules/is-extendable": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-0.1.1.tgz", - "integrity": "sha512-5BMULNob1vgFX6EjQw5izWDxrecWK9AM72rugNr0TFldMOi0fj6Jk+zeKIt0xGj4cEfQIJth4w3OKWOJ4f+AFw==", - "dev": true, + "node_modules/require-from-string": { + "version": "2.0.2", "license": "MIT", "engines": { "node": ">=0.10.0" } }, - "node_modules/unique-filename": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/unique-filename/-/unique-filename-1.1.1.tgz", - "integrity": "sha512-Vmp0jIp2ln35UTXuryvjzkjGdRyf9b2lTXuSYUiPmzRcl3FDtYqAwOnTJkAngD9SWhnoJzDbTKwaOrZ+STtxNQ==", + "node_modules/require-main-filename": { + "version": "2.0.0", + "license": "ISC" + }, + "node_modules/requireindex": { + "version": "1.2.0", "dev": true, - "license": "ISC", - "dependencies": { - "unique-slug": "^2.0.0" + "license": "MIT", + "engines": { + "node": ">=0.10.5" } }, - "node_modules/unique-slug": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/unique-slug/-/unique-slug-2.0.2.tgz", - "integrity": "sha512-zoWr9ObaxALD3DOPfjPSqxt4fnZiWblxHIgeWqW8x7UqDzEtHEQLzji2cuJYQFCU6KmoJikOYAZlrTHHebjx2w==", + "node_modules/resolve": { + "version": "2.0.0-next.5", "dev": true, - "license": "ISC", + "license": "MIT", "dependencies": { - "imurmurhash": "^0.1.4" + "is-core-module": "^2.13.0", + "path-parse": "^1.0.7", + "supports-preserve-symlinks-flag": "^1.0.0" + }, + "bin": { + "resolve": "bin/resolve" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/universalify": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/universalify/-/universalify-0.1.2.tgz", - "integrity": "sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg==", + "node_modules/resolve-from": { + "version": "4.0.0", "license": "MIT", "engines": { - "node": ">= 4.0.0" + "node": ">=4" } }, - "node_modules/unpipe": { + "node_modules/resolve-pkg-maps": { "version": "1.0.0", - "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz", - "integrity": "sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ==", + "dev": true, "license": "MIT", - "engines": { - "node": ">= 0.8" + "funding": { + "url": "https://github.com/privatenumber/resolve-pkg-maps?sponsor=1" } }, - "node_modules/unset-value": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/unset-value/-/unset-value-1.0.0.tgz", - "integrity": "sha512-PcA2tsuGSF9cnySLHTLSh2qrQiJ70mn+r+Glzxv2TWZblxsxCC52BDlZoPCsz7STd9pN7EZetkWZBAvk4cgZdQ==", - "dev": true, + "node_modules/reusify": { + "version": "1.0.4", "license": "MIT", - "dependencies": { - "has-value": "^0.3.1", - "isobject": "^3.0.0" - }, "engines": { + "iojs": ">=1.0.0", "node": ">=0.10.0" } }, - "node_modules/unset-value/node_modules/has-value": { - "version": "0.3.1", - "resolved": "https://registry.npmjs.org/has-value/-/has-value-0.3.1.tgz", - "integrity": "sha512-gpG936j8/MzaeID5Yif+577c17TxaDmhuyVgSwtnL/q8UUTySg8Mecb+8Cf1otgLoD7DDH75axp86ER7LFsf3Q==", - "dev": true, - "license": "MIT", + "node_modules/roarr": { + "version": "7.21.1", + "license": "BSD-3-Clause", "dependencies": { - "get-value": "^2.0.3", - "has-values": "^0.1.4", - "isobject": "^2.0.0" + "fast-printf": "^1.6.9", + "safe-stable-stringify": "^2.4.3", + "semver-compare": "^1.0.0" }, "engines": { - "node": ">=0.10.0" + "node": ">=18.0" } }, - "node_modules/unset-value/node_modules/has-value/node_modules/isobject": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/isobject/-/isobject-2.1.0.tgz", - "integrity": "sha512-+OUdGJlgjOBZDfxnDjYYG6zp487z0JGNQq3cYQYg5f5hKR+syHMsaztzGeml/4kGG55CSpKSpWTY+jYGgsHLgA==", - "dev": true, + "node_modules/rollup": { + "version": "4.24.0", "license": "MIT", "dependencies": { - "isarray": "1.0.0" + "@types/estree": "1.0.6" + }, + "bin": { + "rollup": "dist/bin/rollup" }, "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/unset-value/node_modules/has-values": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/has-values/-/has-values-0.1.4.tgz", - "integrity": "sha512-J8S0cEdWuQbqD9//tlZxiMuMNmxB8PlEwvYwuxsTmR1G5RXUePEX/SJn7aD0GMLieuZYSwNH0cQuJGwnYunXRQ==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=0.10.0" + "node": ">=18.0.0", + "npm": ">=8.0.0" + }, + "optionalDependencies": { + "@rollup/rollup-android-arm-eabi": "4.24.0", + "@rollup/rollup-android-arm64": "4.24.0", + "@rollup/rollup-darwin-arm64": "4.24.0", + "@rollup/rollup-darwin-x64": "4.24.0", + "@rollup/rollup-linux-arm-gnueabihf": "4.24.0", + "@rollup/rollup-linux-arm-musleabihf": "4.24.0", + "@rollup/rollup-linux-arm64-gnu": "4.24.0", + "@rollup/rollup-linux-arm64-musl": "4.24.0", + "@rollup/rollup-linux-powerpc64le-gnu": "4.24.0", + "@rollup/rollup-linux-riscv64-gnu": "4.24.0", + "@rollup/rollup-linux-s390x-gnu": "4.24.0", + "@rollup/rollup-linux-x64-gnu": "4.24.0", + "@rollup/rollup-linux-x64-musl": "4.24.0", + "@rollup/rollup-win32-arm64-msvc": "4.24.0", + "@rollup/rollup-win32-ia32-msvc": "4.24.0", + "@rollup/rollup-win32-x64-msvc": "4.24.0", + "fsevents": "~2.3.2" } }, - "node_modules/upath": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/upath/-/upath-2.0.1.tgz", - "integrity": "sha512-1uEe95xksV1O0CYKXo8vQvN1JEbtJp7lb7C5U9HMsIp6IVwntkH/oNUzyVNQSd4S1sYk2FpSSW44FqMc8qee5w==", + "node_modules/router": { + "version": "2.0.0", "license": "MIT", + "dependencies": { + "array-flatten": "3.0.0", + "is-promise": "4.0.0", + "methods": "~1.1.2", + "parseurl": "~1.3.3", + "path-to-regexp": "^8.0.0", + "setprototypeof": "1.2.0", + "utils-merge": "1.0.1" + }, "engines": { - "node": ">=4", - "yarn": "*" + "node": ">= 0.10" } }, - "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==", - "dev": true, + "node_modules/run-parallel": { + "version": "1.2.0", "funding": [ { - "type": "opencollective", - "url": "https://opencollective.com/browserslist" + "type": "github", + "url": "https://github.com/sponsors/feross" }, { - "type": "tidelift", - "url": "https://tidelift.com/funding/github/npm/browserslist" + "type": "patreon", + "url": "https://www.patreon.com/feross" }, { - "type": "github", - "url": "https://github.com/sponsors/ai" + "type": "consulting", + "url": "https://feross.org/support" } ], "license": "MIT", "dependencies": { - "escalade": "^3.2.0", - "picocolors": "^1.1.0" - }, - "bin": { - "update-browserslist-db": "cli.js" - }, - "peerDependencies": { - "browserslist": ">= 4.21.0" + "queue-microtask": "^1.2.2" } }, - "node_modules/upper-case": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/upper-case/-/upper-case-1.1.3.tgz", - "integrity": "sha512-WRbjgmYzgXkCV7zNVpy5YgrHgbBv126rMALQQMrmzOVC4GM2waQ9x7xtm8VU+1yF2kWyPzI9zbZ48n4vSxwfSA==", - "license": "MIT" - }, - "node_modules/uri-js": { - "version": "4.4.1", - "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz", - "integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==", - "dev": true, - "license": "BSD-2-Clause", + "node_modules/rxjs": { + "version": "7.8.1", + "license": "Apache-2.0", "dependencies": { - "punycode": "^2.1.0" + "tslib": "^2.1.0" } }, - "node_modules/uri-js/node_modules/punycode": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.1.tgz", - "integrity": "sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==", + "node_modules/safe-array-concat": { + "version": "1.1.2", "dev": true, "license": "MIT", + "dependencies": { + "call-bind": "^1.0.7", + "get-intrinsic": "^1.2.4", + "has-symbols": "^1.0.3", + "isarray": "^2.0.5" + }, "engines": { - "node": ">=6" + "node": ">=0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/urix": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/urix/-/urix-0.1.0.tgz", - "integrity": "sha512-Am1ousAhSLBeB9cG/7k7r2R0zj50uDRlZHPGbazid5s9rlF1F/QKYObEKSIunSjIOkJZqwRRLpvewjEkM7pSqg==", - "deprecated": "Please see https://github.com/lydell/urix#deprecated", - "dev": true, + "node_modules/safe-buffer": { + "version": "5.2.1", + "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/url": { - "version": "0.11.4", - "resolved": "https://registry.npmjs.org/url/-/url-0.11.4.tgz", - "integrity": "sha512-oCwdVC7mTuWiPyjLUz/COz5TLk6wgp0RCsN+wHZ2Ekneac9w8uuV0njcbbie2ME+Vs+d6duwmYuR3HgQXs1fOg==", - "dev": true, - "license": "MIT", - "dependencies": { - "punycode": "^1.4.1", - "qs": "^6.12.3" - }, - "engines": { - "node": ">= 0.4" - } + "node_modules/safe-identifier": { + "version": "0.4.2", + "license": "ISC" }, - "node_modules/url-loader": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/url-loader/-/url-loader-4.1.1.tgz", - "integrity": "sha512-3BTV812+AVHHOJQO8O5MkWgZ5aosP7GnROJwvzLS9hWDj00lZ6Z0wNak423Lp9PBZN05N+Jk/N5Si8jRAlGyWA==", + "node_modules/safe-regex-test": { + "version": "1.0.3", "dev": true, "license": "MIT", "dependencies": { - "loader-utils": "^2.0.0", - "mime-types": "^2.1.27", - "schema-utils": "^3.0.0" + "call-bind": "^1.0.6", + "es-errors": "^1.3.0", + "is-regex": "^1.1.4" }, "engines": { - "node": ">= 10.13.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/webpack" - }, - "peerDependencies": { - "file-loader": "*", - "webpack": "^4.0.0 || ^5.0.0" - }, - "peerDependenciesMeta": { - "file-loader": { - "optional": true - } - } - }, - "node_modules/url-loader/node_modules/ajv": { - "version": "6.12.6", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", - "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", - "dev": true, - "license": "MIT", - "dependencies": { - "fast-deep-equal": "^3.1.1", - "fast-json-stable-stringify": "^2.0.0", - "json-schema-traverse": "^0.4.1", - "uri-js": "^4.2.2" + "node": ">= 0.4" }, "funding": { - "type": "github", - "url": "https://github.com/sponsors/epoberezkin" + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/url-loader/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, + "node_modules/safe-stable-stringify": { + "version": "2.5.0", "license": "MIT", - "peerDependencies": { - "ajv": "^6.9.1" + "engines": { + "node": ">=10" } }, - "node_modules/url-loader/node_modules/json-schema-traverse": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", - "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", - "dev": true, + "node_modules/safer-buffer": { + "version": "2.1.2", "license": "MIT" }, - "node_modules/url-loader/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, + "node_modules/samlify": { + "version": "2.8.11", "license": "MIT", "dependencies": { - "big.js": "^5.2.2", - "emojis-list": "^3.0.0", - "json5": "^2.1.2" - }, - "engines": { - "node": ">=8.9.0" + "@authenio/xml-encryption": "^2.0.2", + "@xmldom/xmldom": "^0.8.6", + "camelcase": "^6.2.0", + "node-forge": "^1.3.0", + "node-rsa": "^1.1.1", + "pako": "^1.0.10", + "uuid": "^8.3.2", + "xml": "^1.0.1", + "xml-crypto": "^3.0.1", + "xml-escape": "^1.1.0", + "xpath": "^0.0.32" } }, - "node_modules/url-loader/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, + "node_modules/samlify/node_modules/camelcase": { + "version": "6.3.0", "license": "MIT", - "dependencies": { - "@types/json-schema": "^7.0.8", - "ajv": "^6.12.5", - "ajv-keywords": "^3.5.2" - }, "engines": { - "node": ">= 10.13.0" + "node": ">=10" }, "funding": { - "type": "opencollective", - "url": "https://opencollective.com/webpack" - } - }, - "node_modules/use": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/use/-/use-3.1.1.tgz", - "integrity": "sha512-cwESVXlO3url9YWlFW/TA9cshCEhtu7IKJ/p5soJ/gGpj7vbvFrAY/eIioQ6Dw23KjZhYgiIo8HOs1nQ2vr/oQ==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=0.10.0" + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/util": { - "version": "0.11.1", - "resolved": "https://registry.npmjs.org/util/-/util-0.11.1.tgz", - "integrity": "sha512-HShAsny+zS2TZfaXxD9tYj4HQGlBezXZMZuM/S5PKLLoZkShZiGk9o5CzukI1LVHZvjdvZ2Sj1aW/Ndn2NB/HQ==", - "dev": true, + "node_modules/sass-embedded": { + "version": "1.79.5", "license": "MIT", "dependencies": { - "inherits": "2.0.3" - } - }, - "node_modules/util-deprecate": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", - "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==", - "license": "MIT" - }, - "node_modules/util.promisify": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/util.promisify/-/util.promisify-1.0.0.tgz", - "integrity": "sha512-i+6qA2MPhvoKLuxnJNpXAGhg7HphQOSUq2LKMZD0m15EiskXUkMvKdF4Uui0WYeCUGea+o2cw/ZuwehtfsrNkA==", - "dev": true, + "@bufbuild/protobuf": "^2.0.0", + "buffer-builder": "^0.2.0", + "colorjs.io": "^0.5.0", + "immutable": "^4.0.0", + "rxjs": "^7.4.0", + "supports-color": "^8.1.1", + "varint": "^6.0.0" + }, + "bin": { + "sass": "dist/bin/sass.js" + }, + "engines": { + "node": ">=16.0.0" + }, + "optionalDependencies": { + "sass-embedded-android-arm": "1.79.5", + "sass-embedded-android-arm64": "1.79.5", + "sass-embedded-android-ia32": "1.79.5", + "sass-embedded-android-riscv64": "1.79.5", + "sass-embedded-android-x64": "1.79.5", + "sass-embedded-darwin-arm64": "1.79.5", + "sass-embedded-darwin-x64": "1.79.5", + "sass-embedded-linux-arm": "1.79.5", + "sass-embedded-linux-arm64": "1.79.5", + "sass-embedded-linux-ia32": "1.79.5", + "sass-embedded-linux-musl-arm": "1.79.5", + "sass-embedded-linux-musl-arm64": "1.79.5", + "sass-embedded-linux-musl-ia32": "1.79.5", + "sass-embedded-linux-musl-riscv64": "1.79.5", + "sass-embedded-linux-musl-x64": "1.79.5", + "sass-embedded-linux-riscv64": "1.79.5", + "sass-embedded-linux-x64": "1.79.5", + "sass-embedded-win32-arm64": "1.79.5", + "sass-embedded-win32-ia32": "1.79.5", + "sass-embedded-win32-x64": "1.79.5" + } + }, + "node_modules/sass-embedded-linux-musl-x64": { + "version": "1.79.5", + "cpu": [ + "x64" + ], "license": "MIT", - "dependencies": { - "define-properties": "^1.1.2", - "object.getownpropertydescriptors": "^2.0.3" + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=14.0.0" } }, - "node_modules/util/node_modules/inherits": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", - "integrity": "sha512-x00IRNXNy63jwGkJmzPigoySHbaqpNuzKbBOmzK+g2OdZpQ9w+sxCN+VSB3ja7IAge2OP2qpfxTjeNcyjmW1uw==", - "dev": true, - "license": "ISC" - }, - "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", - "integrity": "sha512-pMZTvIkT1d+TFGvDOqodOclx0QWkkgi6Tdoa8gC8ffGAAqz9pzPTZWAybbsHHoED/ztMtkv/VoYTYyShUn81hA==", + "node_modules/sass-embedded-linux-x64": { + "version": "1.79.5", + "cpu": [ + "x64" + ], "license": "MIT", + "optional": true, + "os": [ + "linux" + ], "engines": { - "node": ">= 0.4.0" + "node": ">=14.0.0" } }, - "node_modules/uuid": { - "version": "8.3.2", - "resolved": "https://registry.npmjs.org/uuid/-/uuid-8.3.2.tgz", - "integrity": "sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg==", + "node_modules/sass-embedded/node_modules/supports-color": { + "version": "8.1.1", "license": "MIT", - "bin": { - "uuid": "dist/bin/uuid" + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/supports-color?sponsor=1" } }, - "node_modules/v8-compile-cache": { - "version": "2.4.0", - "resolved": "https://registry.npmjs.org/v8-compile-cache/-/v8-compile-cache-2.4.0.tgz", - "integrity": "sha512-ocyWc3bAHBB/guyqJQVI5o4BZkPhznPYUG2ea80Gond/BgNWpap8TOmLSeeQG7bnh2KMISxskdADG59j7zruhw==", - "dev": true, + "node_modules/scule": { + "version": "1.3.0", "license": "MIT" }, - "node_modules/v8-compile-cache-lib": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/v8-compile-cache-lib/-/v8-compile-cache-lib-3.0.1.tgz", - "integrity": "sha512-wa7YjyUGfNZngI/vtK0UHAN+lgDCxBPCylVXGp0zu59Fz5aiGtNXaq3DhIov063MorB+VfufLh3JlF2KdTK3xg==", - "dev": true, + "node_modules/seedrandom": { + "version": "3.0.5", "license": "MIT" }, - "node_modules/valid-data-url": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/valid-data-url/-/valid-data-url-3.0.1.tgz", - "integrity": "sha512-jOWVmzVceKlVVdwjNSenT4PbGghU0SBIizAev8ofZVgivk/TVHXSbNL8LP6M3spZvkR9/QolkyJavGSX5Cs0UA==", - "license": "MIT", + "node_modules/semver": { + "version": "7.6.3", + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + }, "engines": { "node": ">=10" } }, - "node_modules/validate-npm-package-license": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/validate-npm-package-license/-/validate-npm-package-license-3.0.4.tgz", - "integrity": "sha512-DpKm2Ui/xN7/HQKCtpZxoRWBhZ9Z0kqtygG8XCgNQ8ZlDnxuQmWhj566j8fN4Cu3/JmbhsDo7fcAJq4s9h27Ew==", - "dev": true, - "license": "Apache-2.0", + "node_modules/semver-compare": { + "version": "1.0.0", + "license": "MIT" + }, + "node_modules/send": { + "version": "1.1.0", + "license": "MIT", "dependencies": { - "spdx-correct": "^3.0.0", - "spdx-expression-parse": "^3.0.0" + "debug": "^4.3.5", + "destroy": "^1.2.0", + "encodeurl": "^2.0.0", + "escape-html": "^1.0.3", + "etag": "^1.8.1", + "fresh": "^0.5.2", + "http-errors": "^2.0.0", + "mime-types": "^2.1.35", + "ms": "^2.1.3", + "on-finished": "^2.4.1", + "range-parser": "^1.2.1", + "statuses": "^2.0.1" + }, + "engines": { + "node": ">= 18" } }, - "node_modules/vary": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz", - "integrity": "sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg==", + "node_modules/send/node_modules/fresh": { + "version": "0.5.2", "license": "MIT", "engines": { - "node": ">= 0.8" + "node": ">= 0.6" } }, - "node_modules/vasync": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/vasync/-/vasync-2.2.1.tgz", - "integrity": "sha512-Hq72JaTpcTFdWiNA4Y22Amej2GH3BFmBaKPPlDZ4/oC8HNn2ISHLkFrJU4Ds8R3jcUi7oo5Y9jcMHKjES+N9wQ==", - "engines": [ - "node >=0.6.0" - ], + "node_modules/send/node_modules/mime-db": { + "version": "1.52.0", "license": "MIT", - "dependencies": { - "verror": "1.10.0" + "engines": { + "node": ">= 0.6" } }, - "node_modules/vasync/node_modules/core-util-is": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz", - "integrity": "sha512-3lqz5YjWTYnW6dlDa5TLaTCcShfar1e40rmcJVwCBJC6mWlFuj0eCHIElmG1g5kyuJ/GD+8Wn4FFCcz4gJPfaQ==", - "license": "MIT" - }, - "node_modules/vasync/node_modules/verror": { - "version": "1.10.0", - "resolved": "https://registry.npmjs.org/verror/-/verror-1.10.0.tgz", - "integrity": "sha512-ZZKSmDAEFOijERBLkmYfJ+vmk3w+7hOLYDNkRCuRuMJGEmqYNCNLyBBFwWKVMhfwaEF3WOd0Zlw86U/WC/+nYw==", - "engines": [ - "node >=0.6.0" - ], + "node_modules/send/node_modules/mime-types": { + "version": "2.1.35", "license": "MIT", "dependencies": { - "assert-plus": "^1.0.0", - "core-util-is": "1.0.2", - "extsprintf": "^1.2.0" + "mime-db": "1.52.0" + }, + "engines": { + "node": ">= 0.6" } }, - "node_modules/verror": { - "version": "1.10.1", - "resolved": "https://registry.npmjs.org/verror/-/verror-1.10.1.tgz", - "integrity": "sha512-veufcmxri4e3XSrT0xwfUR7kguIkaxBeosDg00yDWhk49wdwkSUrvvsm7nc75e1PUyvIeZj6nS8VQRYz2/S4Xg==", + "node_modules/serve-static": { + "version": "2.1.0", "license": "MIT", "dependencies": { - "assert-plus": "^1.0.0", - "core-util-is": "1.0.2", - "extsprintf": "^1.2.0" + "encodeurl": "^2.0.0", + "escape-html": "^1.0.3", + "parseurl": "^1.3.3", + "send": "^1.0.0" }, "engines": { - "node": ">=0.6.0" + "node": ">= 18" } }, - "node_modules/verror/node_modules/core-util-is": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz", - "integrity": "sha512-3lqz5YjWTYnW6dlDa5TLaTCcShfar1e40rmcJVwCBJC6mWlFuj0eCHIElmG1g5kyuJ/GD+8Wn4FFCcz4gJPfaQ==", - "license": "MIT" - }, - "node_modules/vm-browserify": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/vm-browserify/-/vm-browserify-1.1.2.tgz", - "integrity": "sha512-2ham8XPWTONajOR0ohOKOHXkm3+gaBmGut3SRuu75xLd/RRaY6vqgh8NBYYk7+RW3u5AtzPQZG8F10LHkl0lAQ==", - "dev": true, - "license": "MIT" + "node_modules/set-blocking": { + "version": "2.0.0", + "license": "ISC" }, - "node_modules/vue": { - "version": "2.7.16", - "resolved": "https://registry.npmjs.org/vue/-/vue-2.7.16.tgz", - "integrity": "sha512-4gCtFXaAA3zYZdTp5s4Hl2sozuySsgz4jy1EnpBHNfpMa9dK1ZCG7viqBPCwXtmgc8nHqUsAu3G4gtmXkkY3Sw==", - "deprecated": "Vue 2 has reached EOL and is no longer actively maintained. See https://v2.vuejs.org/eol/ for more details.", + "node_modules/set-function-length": { + "version": "1.2.2", "license": "MIT", "dependencies": { - "@vue/compiler-sfc": "2.7.16", - "csstype": "^3.1.0" + "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/vue-client-only": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/vue-client-only/-/vue-client-only-2.1.0.tgz", - "integrity": "sha512-vKl1skEKn8EK9f8P2ZzhRnuaRHLHrlt1sbRmazlvsx6EiC3A8oWF8YCBrMJzoN+W3OnElwIGbVjsx6/xelY1AA==", - "license": "MIT" - }, - "node_modules/vue-cropperjs": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/vue-cropperjs/-/vue-cropperjs-4.2.0.tgz", - "integrity": "sha512-dvwCBtjGMiznkNIK2GFd1SQm1x+wmtWg4g4t+NrJSPj/fpHnubXxAUOIvY7lMFeR2lawRLsigCaGZrcXCzuTKA==", + "node_modules/set-function-name": { + "version": "2.0.2", "dev": true, "license": "MIT", "dependencies": { - "cropperjs": "^1.5.6" + "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/vue-eslint-parser": { - "version": "8.3.0", - "resolved": "https://registry.npmjs.org/vue-eslint-parser/-/vue-eslint-parser-8.3.0.tgz", - "integrity": "sha512-dzHGG3+sYwSf6zFBa0Gi9ZDshD7+ad14DGOdTLjruRVgZXe2J+DcZ9iUhyR48z5g1PqRa20yt3Njna/veLJL/g==", - "dev": true, + "node_modules/setprototypeof": { + "version": "1.2.0", + "license": "ISC" + }, + "node_modules/shebang-command": { + "version": "2.0.0", "license": "MIT", "dependencies": { - "debug": "^4.3.2", - "eslint-scope": "^7.0.0", - "eslint-visitor-keys": "^3.1.0", - "espree": "^9.0.0", - "esquery": "^1.4.0", - "lodash": "^4.17.21", - "semver": "^7.3.5" + "shebang-regex": "^3.0.0" }, "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "funding": { - "url": "https://github.com/sponsors/mysticatea" - }, - "peerDependencies": { - "eslint": ">=6.0.0" + "node": ">=8" } }, - "node_modules/vue-eslint-parser/node_modules/acorn": { - "version": "8.14.0", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.14.0.tgz", - "integrity": "sha512-cl669nCJTZBsL97OF4kUQm5g5hC2uihk0NxY3WENAC0TYdILVkAyHymAntgxGkl7K+t0cXIrH5siy5S4XkFycA==", - "dev": true, + "node_modules/shebang-regex": { + "version": "3.0.0", "license": "MIT", - "bin": { - "acorn": "bin/acorn" - }, "engines": { - "node": ">=0.4.0" + "node": ">=8" } }, - "node_modules/vue-eslint-parser/node_modules/eslint-scope": { - "version": "7.2.2", - "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-7.2.2.tgz", - "integrity": "sha512-dOt21O7lTMhDM+X9mB4GX+DZrZtCUJPL/wlcTqxyrx5IvO0IYtILdtrQGQp+8n5S0gwSVmOf9NQrjMOgfQZlIg==", - "dev": true, - "license": "BSD-2-Clause", + "node_modules/side-channel": { + "version": "1.0.6", + "license": "MIT", "dependencies": { - "esrecurse": "^4.3.0", - "estraverse": "^5.2.0" + "call-bind": "^1.0.7", + "es-errors": "^1.3.0", + "get-intrinsic": "^1.2.4", + "object-inspect": "^1.13.1" }, "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + "node": ">= 0.4" }, "funding": { - "url": "https://opencollective.com/eslint" + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/vue-eslint-parser/node_modules/eslint-visitor-keys": { - "version": "3.4.3", - "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.4.3.tgz", - "integrity": "sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==", - "dev": true, - "license": "Apache-2.0", + "node_modules/signal-exit": { + "version": "4.1.0", + "license": "ISC", "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + "node": ">=14" }, "funding": { - "url": "https://opencollective.com/eslint" + "url": "https://github.com/sponsors/isaacs" } }, - "node_modules/vue-eslint-parser/node_modules/espree": { - "version": "9.6.1", - "resolved": "https://registry.npmjs.org/espree/-/espree-9.6.1.tgz", - "integrity": "sha512-oruZaFkjorTpF32kDSI5/75ViwGeZginGGy2NoOSg3Q9bnwlnmDm4HLnkl0RE3n+njDXR037aY1+x58Z/zFdwQ==", - "dev": true, - "license": "BSD-2-Clause", + "node_modules/simple-oauth2": { + "version": "5.1.0", + "license": "Apache-2.0", "dependencies": { - "acorn": "^8.9.0", - "acorn-jsx": "^5.3.2", - "eslint-visitor-keys": "^3.4.1" - }, + "@hapi/hoek": "^11.0.4", + "@hapi/wreck": "^18.0.0", + "debug": "^4.3.4", + "joi": "^17.6.4" + } + }, + "node_modules/slash": { + "version": "3.0.0", + "license": "MIT", "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "funding": { - "url": "https://opencollective.com/eslint" + "node": ">=8" } }, - "node_modules/vue-eslint-parser/node_modules/estraverse": { - "version": "5.3.0", - "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", - "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", - "dev": true, - "license": "BSD-2-Clause", + "node_modules/slick": { + "version": "1.12.2", + "license": "MIT (http://mootools.net/license.txt)", "engines": { - "node": ">=4.0" + "node": "*" } }, - "node_modules/vue-hot-reload-api": { - "version": "2.3.4", - "resolved": "https://registry.npmjs.org/vue-hot-reload-api/-/vue-hot-reload-api-2.3.4.tgz", - "integrity": "sha512-BXq3jwIagosjgNVae6tkHzzIk6a8MHFtzAdwhnV5VlvPTFxDCvIttgSiHWjdGoTJvXtmRu5HacExfdarRcFhog==", - "dev": true, - "license": "MIT" + "node_modules/slugify": { + "version": "1.6.6", + "license": "MIT", + "engines": { + "node": ">=8.0.0" + } }, - "node_modules/vue-i18n": { - "version": "8.28.2", - "resolved": "https://registry.npmjs.org/vue-i18n/-/vue-i18n-8.28.2.tgz", - "integrity": "sha512-C5GZjs1tYlAqjwymaaCPDjCyGo10ajUphiwA922jKt9n7KPpqR7oM1PCwYzhB/E7+nT3wfdG3oRre5raIT1rKA==", - "license": "MIT" + "node_modules/source-map": { + "version": "0.6.1", + "license": "BSD-3-Clause", + "engines": { + "node": ">=0.10.0" + } }, - "node_modules/vue-loader": { - "version": "15.11.1", - "resolved": "https://registry.npmjs.org/vue-loader/-/vue-loader-15.11.1.tgz", - "integrity": "sha512-0iw4VchYLePqJfJu9s62ACWUXeSqM30SQqlIftbYWM3C+jpPcEHKSPUZBLjSF9au4HTHQ/naF6OGnO3Q/qGR3Q==", - "dev": true, - "license": "MIT", - "dependencies": { - "@vue/component-compiler-utils": "^3.1.0", - "hash-sum": "^1.0.2", - "loader-utils": "^1.1.0", - "vue-hot-reload-api": "^2.3.0", - "vue-style-loader": "^4.1.0" - }, - "peerDependencies": { - "css-loader": "*", - "webpack": "^3.0.0 || ^4.1.0 || ^5.0.0-0" - }, - "peerDependenciesMeta": { - "cache-loader": { - "optional": true - }, - "prettier": { - "optional": true - }, - "vue-template-compiler": { - "optional": true - } + "node_modules/source-map-js": { + "version": "1.2.1", + "license": "BSD-3-Clause", + "engines": { + "node": ">=0.10.0" } }, - "node_modules/vue-loader/node_modules/hash-sum": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/hash-sum/-/hash-sum-1.0.2.tgz", - "integrity": "sha512-fUs4B4L+mlt8/XAtSOGMUO1TXmAelItBPtJG7CyHJfYTdDjwisntGO2JQz7oUsatOY9o68+57eziUVNw/mRHmA==", - "dev": true, - "license": "MIT" - }, - "node_modules/vue-meta": { - "version": "2.4.0", - "resolved": "https://registry.npmjs.org/vue-meta/-/vue-meta-2.4.0.tgz", - "integrity": "sha512-XEeZUmlVeODclAjCNpWDnjgw+t3WA6gdzs6ENoIAgwO1J1d5p1tezDhtteLUFwcaQaTtayRrsx7GL6oXp/m2Jw==", + "node_modules/sparse-bitfield": { + "version": "3.0.3", "license": "MIT", "dependencies": { - "deepmerge": "^4.2.2" + "memory-pager": "^1.0.2" } }, - "node_modules/vue-moment": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/vue-moment/-/vue-moment-4.1.0.tgz", - "integrity": "sha512-Gzisqpg82ItlrUyiD9d0Kfru+JorW2o4mQOH06lEDZNgxci0tv/fua1Hl0bo4DozDV2JK1r52Atn/8QVCu8qQw==", + "node_modules/split2": { + "version": "4.2.0", "dev": true, - "license": "MIT", - "dependencies": { - "moment": "^2.19.2" - }, - "peerDependencies": { - "vue": ">=1.x.x" + "license": "ISC", + "engines": { + "node": ">= 10.x" } }, - "node_modules/vue-no-ssr": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/vue-no-ssr/-/vue-no-ssr-1.1.1.tgz", - "integrity": "sha512-ZMjqRpWabMPqPc7gIrG0Nw6vRf1+itwf0Itft7LbMXs2g3Zs/NFmevjZGN1x7K3Q95GmIjWbQZTVerxiBxI+0g==", - "license": "MIT" + "node_modules/statuses": { + "version": "2.0.1", + "license": "MIT", + "engines": { + "node": ">= 0.8" + } }, - "node_modules/vue-router": { - "version": "3.6.5", - "resolved": "https://registry.npmjs.org/vue-router/-/vue-router-3.6.5.tgz", - "integrity": "sha512-VYXZQLtjuvKxxcshuRAwjHnciqZVoXAjTjcqBTz4rKc8qih9g9pI3hbDjmqXaHdgL3v8pV6P8Z335XvHzESxLQ==", - "license": "MIT" + "node_modules/streamsearch": { + "version": "1.1.0", + "engines": { + "node": ">=10.0.0" + } }, - "node_modules/vue-server-renderer": { - "version": "2.7.16", - "resolved": "https://registry.npmjs.org/vue-server-renderer/-/vue-server-renderer-2.7.16.tgz", - "integrity": "sha512-U7GgR4rYmHmbs3Z2gqsasfk7JNuTsy/xrR5EMMGRLkjN8+ryDlqQq6Uu3DcmbCATAei814YOxyl0eq2HNqgXyQ==", + "node_modules/string_decoder": { + "version": "1.1.1", "license": "MIT", "dependencies": { - "chalk": "^4.1.2", - "hash-sum": "^2.0.0", - "he": "^1.2.0", - "lodash.template": "^4.5.0", - "lodash.uniq": "^4.5.0", - "resolve": "^1.22.0", - "serialize-javascript": "^6.0.0", - "source-map": "0.5.6" + "safe-buffer": "~5.1.0" } }, - "node_modules/vue-server-renderer/node_modules/chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "node_modules/string_decoder/node_modules/safe-buffer": { + "version": "5.1.2", + "license": "MIT" + }, + "node_modules/string-width": { + "version": "4.2.3", "license": "MIT", "dependencies": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - }, - "engines": { - "node": ">=10" + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" }, - "funding": { - "url": "https://github.com/chalk/chalk?sponsor=1" - } - }, - "node_modules/vue-server-renderer/node_modules/source-map": { - "version": "0.5.6", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.6.tgz", - "integrity": "sha512-MjZkVp0NHr5+TPihLcadqnlVoGIoWo4IBHptutGh9wI3ttUYvCG26HkSuDi+K6lsZ25syXJXcctwgyVCt//xqA==", - "license": "BSD-3-Clause", "engines": { - "node": ">=0.10.0" + "node": ">=8" } }, - "node_modules/vue-server-renderer/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==", + "node_modules/string-width-cjs": { + "name": "string-width", + "version": "4.2.3", "license": "MIT", "dependencies": { - "has-flag": "^4.0.0" + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" }, "engines": { "node": ">=8" } }, - "node_modules/vue-style-loader": { - "version": "4.1.3", - "resolved": "https://registry.npmjs.org/vue-style-loader/-/vue-style-loader-4.1.3.tgz", - "integrity": "sha512-sFuh0xfbtpRlKfm39ss/ikqs9AbKCoXZBpHeVZ8Tx650o0k0q/YCM7FRvigtxpACezfq6af+a7JeqVTWvncqDg==", + "node_modules/string.prototype.matchall": { + "version": "4.0.11", "dev": true, "license": "MIT", "dependencies": { - "hash-sum": "^1.0.2", - "loader-utils": "^1.0.2" + "call-bind": "^1.0.7", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.2", + "es-errors": "^1.3.0", + "es-object-atoms": "^1.0.0", + "get-intrinsic": "^1.2.4", + "gopd": "^1.0.1", + "has-symbols": "^1.0.3", + "internal-slot": "^1.0.7", + "regexp.prototype.flags": "^1.5.2", + "set-function-name": "^2.0.2", + "side-channel": "^1.0.6" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/vue-style-loader/node_modules/hash-sum": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/hash-sum/-/hash-sum-1.0.2.tgz", - "integrity": "sha512-fUs4B4L+mlt8/XAtSOGMUO1TXmAelItBPtJG7CyHJfYTdDjwisntGO2JQz7oUsatOY9o68+57eziUVNw/mRHmA==", - "dev": true, - "license": "MIT" - }, - "node_modules/vue-template-compiler": { - "version": "2.7.16", - "resolved": "https://registry.npmjs.org/vue-template-compiler/-/vue-template-compiler-2.7.16.tgz", - "integrity": "sha512-AYbUWAJHLGGQM7+cNTELw+KsOG9nl2CnSv467WobS5Cv9uk3wFcnr1Etsz2sEIHEZvw1U+o9mRlEO6QbZvUPGQ==", + "node_modules/string.prototype.repeat": { + "version": "1.0.0", "dev": true, "license": "MIT", "dependencies": { - "de-indent": "^1.0.2", - "he": "^1.2.0" + "define-properties": "^1.1.3", + "es-abstract": "^1.17.5" } }, - "node_modules/vue-template-es2015-compiler": { - "version": "1.9.1", - "resolved": "https://registry.npmjs.org/vue-template-es2015-compiler/-/vue-template-es2015-compiler-1.9.1.tgz", - "integrity": "sha512-4gDntzrifFnCEvyoO8PqyJDmguXgVPxKiIxrBKjIowvL9l+N66196+72XVYR8BBf1Uv1Fgt3bGevJ+sEmxfZzw==", - "dev": true, - "license": "MIT" - }, - "node_modules/vuedraggable": { - "version": "2.24.3", - "resolved": "https://registry.npmjs.org/vuedraggable/-/vuedraggable-2.24.3.tgz", - "integrity": "sha512-6/HDXi92GzB+Hcs9fC6PAAozK1RLt1ewPTLjK0anTYguXLAeySDmcnqE8IC0xa7shvSzRjQXq3/+dsZ7ETGF3g==", + "node_modules/string.prototype.trim": { + "version": "1.2.9", "dev": true, "license": "MIT", - "optional": true, "dependencies": { - "sortablejs": "1.10.2" + "call-bind": "^1.0.7", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.0", + "es-object-atoms": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/vuetify": { - "version": "2.6.14", - "resolved": "https://registry.npmjs.org/vuetify/-/vuetify-2.6.14.tgz", - "integrity": "sha512-nr6wU3uTzhhEPssH23cW0Ee/hCrayp7cjl3nNjM2OmNwiJlV91tZiL1VO3597SqZyjh1xIa+m9J2rpKTSdIlrA==", - "devOptional": true, + "node_modules/string.prototype.trimend": { + "version": "1.0.8", + "dev": true, "license": "MIT", - "funding": { - "type": "github", - "url": "https://github.com/sponsors/johnleider" + "dependencies": { + "call-bind": "^1.0.7", + "define-properties": "^1.2.1", + "es-object-atoms": "^1.0.0" }, - "peerDependencies": { - "vue": "^2.6.4" + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/vuetify-loader": { - "version": "1.9.2", - "resolved": "https://registry.npmjs.org/vuetify-loader/-/vuetify-loader-1.9.2.tgz", - "integrity": "sha512-8PP2w7aAs/rjA+Izec6qY7sHVb75MNrGQrDOTZJ5IEnvl+NiFhVpU2iWdRDZ3eMS842cWxSWStvkr+KJJKy+Iw==", + "node_modules/string.prototype.trimstart": { + "version": "1.0.8", "dev": true, "license": "MIT", "dependencies": { - "acorn": "^8.4.1", - "acorn-walk": "^8.2.0", - "decache": "^4.6.0", - "file-loader": "^6.2.0", - "loader-utils": "^2.0.0" + "call-bind": "^1.0.7", + "define-properties": "^1.2.1", + "es-object-atoms": "^1.0.0" }, - "peerDependencies": { - "gm": "^1.23.0", - "pug": "^2.0.0 || ^3.0.0", - "sharp": "*", - "vue": "^2.7.2", - "vuetify": "^1.3.0 || ^2.0.0", - "webpack": "^4.0.0 || ^5.0.0" + "engines": { + "node": ">= 0.4" }, - "peerDependenciesMeta": { - "gm": { - "optional": true - }, - "pug": { - "optional": true - }, - "sharp": { - "optional": true - } + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/vuetify-loader/node_modules/acorn": { - "version": "8.14.0", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.14.0.tgz", - "integrity": "sha512-cl669nCJTZBsL97OF4kUQm5g5hC2uihk0NxY3WENAC0TYdILVkAyHymAntgxGkl7K+t0cXIrH5siy5S4XkFycA==", - "dev": true, + "node_modules/strip-ansi": { + "version": "6.0.1", "license": "MIT", - "bin": { - "acorn": "bin/acorn" + "dependencies": { + "ansi-regex": "^5.0.1" }, "engines": { - "node": ">=0.4.0" + "node": ">=8" } }, - "node_modules/vuetify-loader/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, + "node_modules/strip-ansi-cjs": { + "name": "strip-ansi", + "version": "6.0.1", "license": "MIT", "dependencies": { - "big.js": "^5.2.2", - "emojis-list": "^3.0.0", - "json5": "^2.1.2" + "ansi-regex": "^5.0.1" }, "engines": { - "node": ">=8.9.0" + "node": ">=8" + } + }, + "node_modules/strip-json-comments": { + "version": "3.1.1", + "license": "MIT", + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/vuex": { - "version": "3.6.2", - "resolved": "https://registry.npmjs.org/vuex/-/vuex-3.6.2.tgz", - "integrity": "sha512-ETW44IqCgBpVomy520DT5jf8n0zoCac+sxWnn+hMe/CzaSejb/eVw2YToiXYX+Ex/AuHHia28vWTq4goAexFbw==", + "node_modules/strip-literal": { + "version": "2.1.0", "license": "MIT", - "peerDependencies": { - "vue": "^2.0.0" + "dependencies": { + "js-tokens": "^9.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/antfu" } }, - "node_modules/watchpack": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/watchpack/-/watchpack-2.4.2.tgz", - "integrity": "sha512-TnbFSbcOCcDgjZ4piURLCbJ3nJhznVh9kw6F6iokjiFPl8ONxe9A6nMDVXDiNbrSfLILs6vB07F7wLBrwPYzJw==", - "dev": true, + "node_modules/supports-color": { + "version": "7.2.0", "license": "MIT", "dependencies": { - "glob-to-regexp": "^0.4.1", - "graceful-fs": "^4.1.2" + "has-flag": "^4.0.0" }, "engines": { - "node": ">=10.13.0" + "node": ">=8" } }, - "node_modules/watchpack-chokidar2": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/watchpack-chokidar2/-/watchpack-chokidar2-2.0.1.tgz", - "integrity": "sha512-nCFfBIPKr5Sh61s4LPpy1Wtfi0HE8isJ3d2Yb5/Ppw2P2B/3eVSEBjKfN0fmHJSK14+31KwMKmcrzs2GM4P0Ww==", + "node_modules/supports-preserve-symlinks-flag": { + "version": "1.0.0", "dev": true, "license": "MIT", - "optional": true, - "dependencies": { - "chokidar": "^2.1.8" + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/watchpack-chokidar2/node_modules/anymatch": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-2.0.0.tgz", - "integrity": "sha512-5teOsQWABXHHBFP9y3skS5P3d/WfWXpv3FUpy+LorMrNYaT9pI4oLMQX7jzQ2KklNpGpWHzdCXTDT2Y3XGlZBw==", + "node_modules/tapable": { + "version": "2.2.1", "dev": true, - "license": "ISC", - "optional": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/tdigest": { + "version": "0.1.2", + "license": "MIT", "dependencies": { - "micromatch": "^3.1.4", - "normalize-path": "^2.1.1" + "bintrees": "1.0.2" } }, - "node_modules/watchpack-chokidar2/node_modules/anymatch/node_modules/normalize-path": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-2.1.1.tgz", - "integrity": "sha512-3pKJwH184Xo/lnH6oyP1q2pMd7HcypqqmRs91/6/i2CGtWwIKGCkOOMTm/zXbgTEWHw1uNpNi/igc3ePOYHb6w==", + "node_modules/text-extensions": { + "version": "2.4.0", "dev": true, "license": "MIT", - "optional": true, - "dependencies": { - "remove-trailing-separator": "^1.0.1" + "engines": { + "node": ">=8" }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/text-table": { + "version": "0.2.0", + "license": "MIT" + }, + "node_modules/thirty-two": { + "version": "1.0.2", "engines": { - "node": ">=0.10.0" + "node": ">=0.2.6" } }, - "node_modules/watchpack-chokidar2/node_modules/binary-extensions": { - "version": "1.13.1", - "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-1.13.1.tgz", - "integrity": "sha512-Un7MIEDdUC5gNpcGDV97op1Ywk748MpHcFTHoYs6qnj1Z3j7I53VG3nwZhKzoBZmbdRNnb6WRdFlwl7tSDuZGw==", + "node_modules/through": { + "version": "2.3.8", "dev": true, - "license": "MIT", - "optional": true, + "license": "MIT" + }, + "node_modules/timers-ext": { + "version": "0.1.8", + "license": "ISC", + "dependencies": { + "es5-ext": "^0.10.64", + "next-tick": "^1.1.0" + }, "engines": { - "node": ">=0.10.0" + "node": ">=0.12" } }, - "node_modules/watchpack-chokidar2/node_modules/braces": { - "version": "2.3.2", - "resolved": "https://registry.npmjs.org/braces/-/braces-2.3.2.tgz", - "integrity": "sha512-aNdbnj9P8PjdXU4ybaWLK2IF3jc/EoDYbC7AazW6to3TRsfXxscC9UXOB5iDiEQrkyIbWp2SLQda4+QAa7nc3w==", + "node_modules/tinycolor2": { + "version": "1.6.0", + "license": "MIT" + }, + "node_modules/tinyexec": { + "version": "0.3.0", "dev": true, + "license": "MIT" + }, + "node_modules/tldts": { + "version": "6.1.55", + "devOptional": true, + "license": "MIT", + "dependencies": { + "tldts-core": "^6.1.55" + }, + "bin": { + "tldts": "bin/cli.js" + } + }, + "node_modules/tldts-core": { + "version": "6.1.55", + "devOptional": true, + "license": "MIT" + }, + "node_modules/tmp": { + "version": "0.0.33", "license": "MIT", - "optional": true, "dependencies": { - "arr-flatten": "^1.1.0", - "array-unique": "^0.3.2", - "extend-shallow": "^2.0.1", - "fill-range": "^4.0.0", - "isobject": "^3.0.1", - "repeat-element": "^1.1.2", - "snapdragon": "^0.8.1", - "snapdragon-node": "^2.0.1", - "split-string": "^3.0.2", - "to-regex": "^3.0.1" + "os-tmpdir": "~1.0.2" }, "engines": { - "node": ">=0.10.0" + "node": ">=0.6.0" } }, - "node_modules/watchpack-chokidar2/node_modules/braces/node_modules/extend-shallow": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", - "integrity": "sha512-zCnTtlxNoAiDc3gqY2aYAWFx7XWWiasuF2K8Me5WbN8otHKTUKBwjPtNpRs/rbUZm7KxWAaNj7P1a/p52GbVug==", - "dev": true, + "node_modules/to-fast-properties": { + "version": "2.0.0", "license": "MIT", - "optional": true, - "dependencies": { - "is-extendable": "^0.1.0" - }, "engines": { - "node": ">=0.10.0" + "node": ">=4" } }, - "node_modules/watchpack-chokidar2/node_modules/chokidar": { - "version": "2.1.8", - "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-2.1.8.tgz", - "integrity": "sha512-ZmZUazfOzf0Nve7duiCKD23PFSCs4JPoYyccjUFF3aQkQadqBhfzhjkwBH2mNOG9cTBwhamM37EIsIkZw3nRgg==", - "dev": true, + "node_modules/to-regex-range": { + "version": "5.0.1", "license": "MIT", - "optional": true, "dependencies": { - "anymatch": "^2.0.0", - "async-each": "^1.0.1", - "braces": "^2.3.2", - "glob-parent": "^3.1.0", - "inherits": "^2.0.3", - "is-binary-path": "^1.0.0", - "is-glob": "^4.0.0", - "normalize-path": "^3.0.0", - "path-is-absolute": "^1.0.0", - "readdirp": "^2.2.1", - "upath": "^1.1.1" + "is-number": "^7.0.0" }, - "optionalDependencies": { - "fsevents": "^1.2.7" + "engines": { + "node": ">=8.0" } }, - "node_modules/watchpack-chokidar2/node_modules/fill-range": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-4.0.0.tgz", - "integrity": "sha512-VcpLTWqWDiTerugjj8e3+esbg+skS3M9e54UuR3iCeIDMXCLTsAH8hTSzDQU/X6/6t3eYkOKoZSef2PlU6U1XQ==", - "dev": true, + "node_modules/toidentifier": { + "version": "1.0.1", "license": "MIT", - "optional": true, - "dependencies": { - "extend-shallow": "^2.0.1", - "is-number": "^3.0.0", - "repeat-string": "^1.6.1", - "to-regex-range": "^2.1.0" - }, "engines": { - "node": ">=0.10.0" + "node": ">=0.6" } }, - "node_modules/watchpack-chokidar2/node_modules/fill-range/node_modules/extend-shallow": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", - "integrity": "sha512-zCnTtlxNoAiDc3gqY2aYAWFx7XWWiasuF2K8Me5WbN8otHKTUKBwjPtNpRs/rbUZm7KxWAaNj7P1a/p52GbVug==", - "dev": true, - "license": "MIT", - "optional": true, + "node_modules/tough-cookie": { + "version": "5.0.0", + "devOptional": true, + "license": "BSD-3-Clause", "dependencies": { - "is-extendable": "^0.1.0" + "tldts": "^6.1.32" }, "engines": { - "node": ">=0.10.0" + "node": ">=16" } }, - "node_modules/watchpack-chokidar2/node_modules/fsevents": { - "version": "1.2.13", - "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-1.2.13.tgz", - "integrity": "sha512-oWb1Z6mkHIskLzEJ/XWX0srkpkTQ7vaopMQkyaEIoq0fmtFVxOthb8cCxeT+p3ynTdkk/RZwbgG4brR5BeWECw==", - "deprecated": "Upgrade to fsevents v2 to mitigate potential security issues", - "dev": true, - "hasInstallScript": true, + "node_modules/tr46": { + "version": "4.1.1", "license": "MIT", - "optional": true, - "os": [ - "darwin" - ], "dependencies": { - "bindings": "^1.5.0", - "nan": "^2.12.1" + "punycode": "^2.3.0" }, "engines": { - "node": ">= 4.0" + "node": ">=14" } }, - "node_modules/watchpack-chokidar2/node_modules/glob-parent": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-3.1.0.tgz", - "integrity": "sha512-E8Ak/2+dZY6fnzlR7+ueWvhsH1SjHr4jjss4YS/h4py44jY9MhK/VFdaZJAWDz6BbL21KeteKxFSFpq8OS5gVA==", - "dev": true, - "license": "ISC", - "optional": true, - "dependencies": { - "is-glob": "^3.1.0", - "path-dirname": "^1.0.0" + "node_modules/ts-api-utils": { + "version": "1.3.0", + "license": "MIT", + "engines": { + "node": ">=16" + }, + "peerDependencies": { + "typescript": ">=4.2.0" } }, - "node_modules/watchpack-chokidar2/node_modules/glob-parent/node_modules/is-glob": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-3.1.0.tgz", - "integrity": "sha512-UFpDDrPgM6qpnFNI+rh/p3bUaq9hKLZN8bMUWzxmcnZVS3omf4IPK+BrewlnWjO1WmUsMYuSjKh4UJuV4+Lqmw==", - "dev": true, + "node_modules/tslib": { + "version": "2.7.0", + "license": "0BSD" + }, + "node_modules/tsscmp": { + "version": "1.0.6", "license": "MIT", - "optional": true, - "dependencies": { - "is-extglob": "^2.1.0" - }, "engines": { - "node": ">=0.10.0" + "node": ">=0.6.x" } }, - "node_modules/watchpack-chokidar2/node_modules/is-binary-path": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-1.0.1.tgz", - "integrity": "sha512-9fRVlXc0uCxEDj1nQzaWONSpbTfx0FmJfzHF7pwlI8DkWGoHBBea4Pg5Ky0ojwwxQmnSifgbKkI06Qv0Ljgj+Q==", - "dev": true, + "node_modules/type": { + "version": "2.7.3", + "license": "ISC" + }, + "node_modules/type-check": { + "version": "0.4.0", "license": "MIT", - "optional": true, "dependencies": { - "binary-extensions": "^1.0.0" + "prelude-ls": "^1.2.1" }, "engines": { - "node": ">=0.10.0" + "node": ">= 0.8.0" } }, - "node_modules/watchpack-chokidar2/node_modules/is-extendable": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-0.1.1.tgz", - "integrity": "sha512-5BMULNob1vgFX6EjQw5izWDxrecWK9AM72rugNr0TFldMOi0fj6Jk+zeKIt0xGj4cEfQIJth4w3OKWOJ4f+AFw==", - "dev": true, - "license": "MIT", - "optional": true, + "node_modules/type-fest": { + "version": "2.19.0", + "license": "(MIT OR CC0-1.0)", "engines": { - "node": ">=0.10.0" + "node": ">=12.20" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/watchpack-chokidar2/node_modules/is-number": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz", - "integrity": "sha512-4cboCqIpliH+mAvFNegjZQ4kgKc3ZUhQVr3HvWbSh5q3WH2v82ct+T2Y1hdU5Gdtorx/cLifQjqCbL7bpznLTg==", - "dev": true, + "node_modules/type-is": { + "version": "2.0.0", "license": "MIT", - "optional": true, "dependencies": { - "kind-of": "^3.0.2" + "content-type": "^1.0.5", + "media-typer": "^1.1.0", + "mime-types": "^3.0.0" }, "engines": { - "node": ">=0.10.0" + "node": ">= 0.6" } }, - "node_modules/watchpack-chokidar2/node_modules/is-number/node_modules/kind-of": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha512-NOW9QQXMoZGg/oqnVNoNTTIFEIid1627WCffUBJEdMxYApq7mNE7CpzucIPc+ZQg25Phej7IJSmX3hO+oblOtQ==", + "node_modules/typed-array-buffer": { + "version": "1.0.2", "dev": true, "license": "MIT", - "optional": true, "dependencies": { - "is-buffer": "^1.1.5" + "call-bind": "^1.0.7", + "es-errors": "^1.3.0", + "is-typed-array": "^1.1.13" }, "engines": { - "node": ">=0.10.0" + "node": ">= 0.4" } }, - "node_modules/watchpack-chokidar2/node_modules/micromatch": { - "version": "3.1.10", - "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-3.1.10.tgz", - "integrity": "sha512-MWikgl9n9M3w+bpsY3He8L+w9eF9338xRl8IAO5viDizwSzziFEyUzo2xrrloB64ADbTf8uA8vRqqttDTOmccg==", + "node_modules/typed-array-byte-length": { + "version": "1.0.1", "dev": true, "license": "MIT", - "optional": true, "dependencies": { - "arr-diff": "^4.0.0", - "array-unique": "^0.3.2", - "braces": "^2.3.1", - "define-property": "^2.0.2", - "extend-shallow": "^3.0.2", - "extglob": "^2.0.4", - "fragment-cache": "^0.2.1", - "kind-of": "^6.0.2", - "nanomatch": "^1.2.9", - "object.pick": "^1.3.0", - "regex-not": "^1.0.0", - "snapdragon": "^0.8.1", - "to-regex": "^3.0.2" + "call-bind": "^1.0.7", + "for-each": "^0.3.3", + "gopd": "^1.0.1", + "has-proto": "^1.0.3", + "is-typed-array": "^1.1.13" }, "engines": { - "node": ">=0.10.0" + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/watchpack-chokidar2/node_modules/readdirp": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-2.2.1.tgz", - "integrity": "sha512-1JU/8q+VgFZyxwrJ+SVIOsh+KywWGpds3NTqikiKpDMZWScmAYyKIgqkO+ARvNWJfXeXR1zxz7aHF4u4CyH6vQ==", + "node_modules/typed-array-byte-offset": { + "version": "1.0.2", "dev": true, "license": "MIT", - "optional": true, "dependencies": { - "graceful-fs": "^4.1.11", - "micromatch": "^3.1.10", - "readable-stream": "^2.0.2" + "available-typed-arrays": "^1.0.7", + "call-bind": "^1.0.7", + "for-each": "^0.3.3", + "gopd": "^1.0.1", + "has-proto": "^1.0.3", + "is-typed-array": "^1.1.13" }, "engines": { - "node": ">=0.10" + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/watchpack-chokidar2/node_modules/to-regex-range": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-2.1.1.tgz", - "integrity": "sha512-ZZWNfCjUokXXDGXFpZehJIkZqq91BcULFq/Pi7M5i4JnxXdhMKAK682z8bCW3o8Hj1wuuzoKcW3DfVzaP6VuNg==", + "node_modules/typed-array-length": { + "version": "1.0.6", "dev": true, "license": "MIT", - "optional": true, "dependencies": { - "is-number": "^3.0.0", - "repeat-string": "^1.6.1" + "call-bind": "^1.0.7", + "for-each": "^0.3.3", + "gopd": "^1.0.1", + "has-proto": "^1.0.3", + "is-typed-array": "^1.1.13", + "possible-typed-array-names": "^1.0.0" }, "engines": { - "node": ">=0.10.0" + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/watchpack-chokidar2/node_modules/upath": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/upath/-/upath-1.2.0.tgz", - "integrity": "sha512-aZwGpamFO61g3OlfT7OQCHqhGnW43ieH9WZeP7QxN/G/jS4jfqUkZxoryvJgVPEcrl5NL/ggHsSmLMHuH64Lhg==", - "dev": true, - "license": "MIT", - "optional": true, - "engines": { - "node": ">=4", - "yarn": "*" - } + "node_modules/typedarray": { + "version": "0.0.6", + "license": "MIT" }, - "node_modules/web-resource-inliner": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/web-resource-inliner/-/web-resource-inliner-6.0.1.tgz", - "integrity": "sha512-kfqDxt5dTB1JhqsCUQVFDj0rmY+4HLwGQIsLPbyrsN9y9WV/1oFDSx3BQ4GfCv9X+jVeQ7rouTqwK53rA/7t8A==", - "license": "MIT", - "dependencies": { - "ansi-colors": "^4.1.1", - "escape-goat": "^3.0.0", - "htmlparser2": "^5.0.0", - "mime": "^2.4.6", - "node-fetch": "^2.6.0", - "valid-data-url": "^3.0.0" + "node_modules/typescript": { + "version": "5.6.3", + "license": "Apache-2.0", + "bin": { + "tsc": "bin/tsc", + "tsserver": "bin/tsserver" }, "engines": { - "node": ">=10.0.0" + "node": ">=14.17" } }, - "node_modules/web-resource-inliner/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==", + "node_modules/typescript-eslint": { + "version": "8.9.0", + "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/web-resource-inliner/node_modules/dom-serializer/node_modules/domhandler": { - "version": "4.3.1", - "resolved": "https://registry.npmjs.org/domhandler/-/domhandler-4.3.1.tgz", - "integrity": "sha512-GrwoxYN+uWlzO8uhUXRl0P+kHE4GtVPfYzVLcUxPL7KNdHKj66vvlhiweIHqYYXWlw+T8iLMp42Lm67ghw4WMQ==", - "license": "BSD-2-Clause", - "dependencies": { - "domelementtype": "^2.2.0" + "@typescript-eslint/eslint-plugin": "8.9.0", + "@typescript-eslint/parser": "8.9.0", + "@typescript-eslint/utils": "8.9.0" }, "engines": { - "node": ">= 4" + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" }, "funding": { - "url": "https://github.com/fb55/domhandler?sponsor=1" + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } } }, - "node_modules/web-resource-inliner/node_modules/domhandler": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/domhandler/-/domhandler-3.3.0.tgz", - "integrity": "sha512-J1C5rIANUbuYK+FuFL98650rihynUOEzRLxW+90bKZRWB6A1X1Tf82GxR1qAWLyfNPRvjqfip3Q5tdYlmAa9lA==", + "node_modules/ufo": { + "version": "1.5.4", + "license": "MIT" + }, + "node_modules/uglify-js": { + "version": "3.19.3", "license": "BSD-2-Clause", - "dependencies": { - "domelementtype": "^2.0.1" + "bin": { + "uglifyjs": "bin/uglifyjs" }, "engines": { - "node": ">= 4" - }, - "funding": { - "url": "https://github.com/fb55/domhandler?sponsor=1" + "node": ">=0.8.0" } }, - "node_modules/web-resource-inliner/node_modules/domutils": { - "version": "2.8.0", - "resolved": "https://registry.npmjs.org/domutils/-/domutils-2.8.0.tgz", - "integrity": "sha512-w96Cjofp72M5IIhpjgobBimYEfoPjx1Vx0BSX9P30WBdZW2WIKU0T1Bd0kz2eNZ9ikjKgHbEyKx8BB6H1L3h3A==", - "license": "BSD-2-Clause", + "node_modules/unbox-primitive": { + "version": "1.0.2", + "dev": true, + "license": "MIT", "dependencies": { - "dom-serializer": "^1.0.1", - "domelementtype": "^2.2.0", - "domhandler": "^4.2.0" + "call-bind": "^1.0.2", + "has-bigints": "^1.0.2", + "has-symbols": "^1.0.3", + "which-boxed-primitive": "^1.0.2" }, "funding": { - "url": "https://github.com/fb55/domutils?sponsor=1" + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/web-resource-inliner/node_modules/domutils/node_modules/domhandler": { - "version": "4.3.1", - "resolved": "https://registry.npmjs.org/domhandler/-/domhandler-4.3.1.tgz", - "integrity": "sha512-GrwoxYN+uWlzO8uhUXRl0P+kHE4GtVPfYzVLcUxPL7KNdHKj66vvlhiweIHqYYXWlw+T8iLMp42Lm67ghw4WMQ==", - "license": "BSD-2-Clause", - "dependencies": { - "domelementtype": "^2.2.0" - }, - "engines": { - "node": ">= 4" + "node_modules/undici-types": { + "version": "6.19.8", + "license": "MIT" + }, + "node_modules/unhead": { + "version": "1.11.10", + "license": "MIT", + "dependencies": { + "@unhead/dom": "1.11.10", + "@unhead/schema": "1.11.10", + "@unhead/shared": "1.11.10", + "hookable": "^5.5.3" }, "funding": { - "url": "https://github.com/fb55/domhandler?sponsor=1" + "url": "https://github.com/sponsors/harlan-zw" } }, - "node_modules/web-resource-inliner/node_modules/htmlparser2": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/htmlparser2/-/htmlparser2-5.0.1.tgz", - "integrity": "sha512-vKZZra6CSe9qsJzh0BjBGXo8dvzNsq/oGvsjfRdOrrryfeD9UOBEEQdeoqCRmKZchF5h2zOBMQ6YuQ0uRUmdbQ==", + "node_modules/unicorn-magic": { + "version": "0.1.0", + "dev": true, "license": "MIT", - "dependencies": { - "domelementtype": "^2.0.1", - "domhandler": "^3.3.0", - "domutils": "^2.4.2", - "entities": "^2.0.0" + "engines": { + "node": ">=18" }, "funding": { - "url": "https://github.com/fb55/htmlparser2?sponsor=1" + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/webidl-conversions": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-7.0.0.tgz", - "integrity": "sha512-VwddBukDzu71offAQR975unBIGqfKZpM+8ZX6ySk8nYhVoo5CYaZyzt3YBvYtRtO+aoGlqxPg/B87NGVZ/fu6g==", - "license": "BSD-2-Clause", - "engines": { - "node": ">=12" + "node_modules/unimport": { + "version": "3.13.1", + "license": "MIT", + "dependencies": { + "@rollup/pluginutils": "^5.1.2", + "acorn": "^8.12.1", + "escape-string-regexp": "^5.0.0", + "estree-walker": "^3.0.3", + "fast-glob": "^3.3.2", + "local-pkg": "^0.5.0", + "magic-string": "^0.30.11", + "mlly": "^1.7.1", + "pathe": "^1.1.2", + "pkg-types": "^1.2.0", + "scule": "^1.3.0", + "strip-literal": "^2.1.0", + "unplugin": "^1.14.1" } }, - "node_modules/webpack": { - "version": "4.47.0", - "resolved": "https://registry.npmjs.org/webpack/-/webpack-4.47.0.tgz", - "integrity": "sha512-td7fYwgLSrky3fI1EuU5cneU4+pbH6GgOfuKNS1tNPcfdGinGELAqsb/BP4nnvZyKSG2i/xFGU7+n2PvZA8HJQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "@webassemblyjs/ast": "1.9.0", - "@webassemblyjs/helper-module-context": "1.9.0", - "@webassemblyjs/wasm-edit": "1.9.0", - "@webassemblyjs/wasm-parser": "1.9.0", - "acorn": "^6.4.1", - "ajv": "^6.10.2", - "ajv-keywords": "^3.4.1", - "chrome-trace-event": "^1.0.2", - "enhanced-resolve": "^4.5.0", - "eslint-scope": "^4.0.3", - "json-parse-better-errors": "^1.0.2", - "loader-runner": "^2.4.0", - "loader-utils": "^1.2.3", - "memory-fs": "^0.4.1", - "micromatch": "^3.1.10", - "mkdirp": "^0.5.3", - "neo-async": "^2.6.1", - "node-libs-browser": "^2.2.1", - "schema-utils": "^1.0.0", - "tapable": "^1.1.3", - "terser-webpack-plugin": "^1.4.3", - "watchpack": "^1.7.4", - "webpack-sources": "^1.4.1" - }, - "bin": { - "webpack": "bin/webpack.js" - }, + "node_modules/unimport/node_modules/escape-string-regexp": { + "version": "5.0.0", + "license": "MIT", "engines": { - "node": ">=6.11.5" + "node": ">=12" }, "funding": { - "type": "opencollective", - "url": "https://opencollective.com/webpack" - }, - "peerDependenciesMeta": { - "webpack-cli": { - "optional": true - }, - "webpack-command": { - "optional": true - } + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/webpack-bundle-analyzer": { - "version": "4.10.2", - "resolved": "https://registry.npmjs.org/webpack-bundle-analyzer/-/webpack-bundle-analyzer-4.10.2.tgz", - "integrity": "sha512-vJptkMm9pk5si4Bv922ZbKLV8UTT4zib4FPgXMhgzUny0bfDDkLXAVQs3ly3fS4/TN9ROFtb0NFrm04UXFE/Vw==", - "dev": true, + "node_modules/unimport/node_modules/estree-walker": { + "version": "3.0.3", "license": "MIT", "dependencies": { - "@discoveryjs/json-ext": "0.5.7", - "acorn": "^8.0.4", - "acorn-walk": "^8.0.0", - "commander": "^7.2.0", - "debounce": "^1.2.1", - "escape-string-regexp": "^4.0.0", - "gzip-size": "^6.0.0", - "html-escaper": "^2.0.2", - "opener": "^1.5.2", - "picocolors": "^1.0.0", - "sirv": "^2.0.3", - "ws": "^7.3.1" - }, - "bin": { - "webpack-bundle-analyzer": "lib/bin/analyzer.js" - }, - "engines": { - "node": ">= 10.13.0" + "@types/estree": "^1.0.0" } }, - "node_modules/webpack-bundle-analyzer/node_modules/acorn": { - "version": "8.14.0", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.14.0.tgz", - "integrity": "sha512-cl669nCJTZBsL97OF4kUQm5g5hC2uihk0NxY3WENAC0TYdILVkAyHymAntgxGkl7K+t0cXIrH5siy5S4XkFycA==", - "dev": true, + "node_modules/universal-cookie": { + "version": "7.2.1", "license": "MIT", - "bin": { - "acorn": "bin/acorn" - }, - "engines": { - "node": ">=0.4.0" + "dependencies": { + "@types/cookie": "^0.6.0", + "cookie": "^0.7.2" } }, - "node_modules/webpack-bundle-analyzer/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, + "node_modules/unpipe": { + "version": "1.0.0", "license": "MIT", "engines": { - "node": ">= 10" + "node": ">= 0.8" } }, - "node_modules/webpack-bundle-analyzer/node_modules/ws": { - "version": "7.5.10", - "resolved": "https://registry.npmjs.org/ws/-/ws-7.5.10.tgz", - "integrity": "sha512-+dbF1tHwZpXcbOJdVOkzLDxZP1ailvSxM6ZweXTegylPny803bFhA+vqBYw4s31NSAk4S2Qz+AKXK9a4wkdjcQ==", - "dev": true, + "node_modules/unplugin": { + "version": "1.14.1", "license": "MIT", + "dependencies": { + "acorn": "^8.12.1", + "webpack-virtual-modules": "^0.6.2" + }, "engines": { - "node": ">=8.3.0" + "node": ">=14.0.0" }, "peerDependencies": { - "bufferutil": "^4.0.1", - "utf-8-validate": "^5.0.2" + "webpack-sources": "^3" }, "peerDependenciesMeta": { - "bufferutil": { - "optional": true - }, - "utf-8-validate": { + "webpack-sources": { "optional": true } } }, - "node_modules/webpack-dev-middleware": { - "version": "5.3.4", - "resolved": "https://registry.npmjs.org/webpack-dev-middleware/-/webpack-dev-middleware-5.3.4.tgz", - "integrity": "sha512-BVdTqhhs+0IfoeAf7EoH5WE+exCmqGerHfDM0IL096Px60Tq2Mn9MAbnaGUe6HiMa41KMCYF19gyzZmBcq/o4Q==", - "dev": true, + "node_modules/unplugin-auto-import": { + "version": "0.18.3", "license": "MIT", "dependencies": { - "colorette": "^2.0.10", - "memfs": "^3.4.3", - "mime-types": "^2.1.31", - "range-parser": "^1.2.1", - "schema-utils": "^4.0.0" + "@antfu/utils": "^0.7.10", + "@rollup/pluginutils": "^5.1.0", + "fast-glob": "^3.3.2", + "local-pkg": "^0.5.0", + "magic-string": "^0.30.11", + "minimatch": "^9.0.5", + "unimport": "^3.12.0", + "unplugin": "^1.14.1" }, "engines": { - "node": ">= 12.13.0" + "node": ">=14" }, "funding": { - "type": "opencollective", - "url": "https://opencollective.com/webpack" + "url": "https://github.com/sponsors/antfu" }, "peerDependencies": { - "webpack": "^4.0.0 || ^5.0.0" + "@nuxt/kit": "^3.2.2", + "@vueuse/core": "*" + }, + "peerDependenciesMeta": { + "@nuxt/kit": { + "optional": true + }, + "@vueuse/core": { + "optional": true + } } }, - "node_modules/webpack-dev-middleware/node_modules/ajv-formats": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/ajv-formats/-/ajv-formats-2.1.1.tgz", - "integrity": "sha512-Wx0Kx52hxE7C18hkMEggYlEifqWZtYaRgouJor+WMdPnQyEK13vgEWyVNup7SoeeoLMsr4kf5h6dOW11I15MUA==", - "dev": true, + "node_modules/unplugin-fonts": { + "version": "1.1.1", "license": "MIT", "dependencies": { - "ajv": "^8.0.0" + "fast-glob": "^3.2.12", + "unplugin": "^1.3.1" }, "peerDependencies": { - "ajv": "^8.0.0" + "@nuxt/kit": "^3.0.0", + "vite": "^2.0.0 || ^3.0.0 || ^4.0.0 || ^5.0.0" }, "peerDependenciesMeta": { - "ajv": { + "@nuxt/kit": { "optional": true } } }, - "node_modules/webpack-dev-middleware/node_modules/memfs": { - "version": "3.5.3", - "resolved": "https://registry.npmjs.org/memfs/-/memfs-3.5.3.tgz", - "integrity": "sha512-UERzLsxzllchadvbPs5aolHh65ISpKpM+ccLbOJ8/vvpBKmAWf+la7dXFy7Mr0ySHbdHrFv5kGFCUHHe6GFEmw==", - "dev": true, - "license": "Unlicense", - "dependencies": { - "fs-monkey": "^1.0.4" - }, - "engines": { - "node": ">= 4.0.0" - } - }, - "node_modules/webpack-dev-middleware/node_modules/schema-utils": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-4.2.0.tgz", - "integrity": "sha512-L0jRsrPpjdckP3oPug3/VxNKt2trR8TcabrM6FOAAlvC/9Phcmm+cuAgTlxBqdBR1WJx7Naj9WHw+aOmheSVbw==", - "dev": true, + "node_modules/unplugin-vue-components": { + "version": "0.27.4", "license": "MIT", "dependencies": { - "@types/json-schema": "^7.0.9", - "ajv": "^8.9.0", - "ajv-formats": "^2.1.1", - "ajv-keywords": "^5.1.0" + "@antfu/utils": "^0.7.10", + "@rollup/pluginutils": "^5.1.0", + "chokidar": "^3.6.0", + "debug": "^4.3.6", + "fast-glob": "^3.3.2", + "local-pkg": "^0.5.0", + "magic-string": "^0.30.11", + "minimatch": "^9.0.5", + "mlly": "^1.7.1", + "unplugin": "^1.12.1" }, "engines": { - "node": ">= 12.13.0" + "node": ">=14" }, "funding": { - "type": "opencollective", - "url": "https://opencollective.com/webpack" - } - }, - "node_modules/webpack-hot-middleware": { - "version": "2.26.1", - "resolved": "https://registry.npmjs.org/webpack-hot-middleware/-/webpack-hot-middleware-2.26.1.tgz", - "integrity": "sha512-khZGfAeJx6I8K9zKohEWWYN6KDlVw2DHownoe+6Vtwj1LP9WFgegXnVMSkZ/dBEBtXFwrkkydsaPFlB7f8wU2A==", - "dev": true, - "license": "MIT", - "dependencies": { - "ansi-html-community": "0.0.8", - "html-entities": "^2.1.0", - "strip-ansi": "^6.0.0" - } - }, - "node_modules/webpack-node-externals": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/webpack-node-externals/-/webpack-node-externals-3.0.0.tgz", - "integrity": "sha512-LnL6Z3GGDPht/AigwRh2dvL9PQPFQ8skEpVrWZXLWBYmqcaojHNN0onvHzie6rq7EWKrrBfPYqNEzTJgiwEQDQ==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=6" - } - }, - "node_modules/webpack-sources": { - "version": "1.4.3", - "resolved": "https://registry.npmjs.org/webpack-sources/-/webpack-sources-1.4.3.tgz", - "integrity": "sha512-lgTS3Xhv1lCOKo7SA5TjKXMjpSM4sBjNV5+q2bqesbSPs5FjGmU6jjtBSkX9b4qW87vDIsCIlUPOEhbZrMdjeQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "source-list-map": "^2.0.0", - "source-map": "~0.6.1" - } - }, - "node_modules/webpack/node_modules/acorn": { - "version": "6.4.2", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-6.4.2.tgz", - "integrity": "sha512-XtGIhXwF8YM8bJhGxG5kXgjkEuNGLTkoYqVE+KMR+aspr4KGYmKYg7yUe3KghyQ9yheNwLnjmzh/7+gfDBmHCQ==", - "dev": true, - "license": "MIT", - "bin": { - "acorn": "bin/acorn" + "url": "https://github.com/sponsors/antfu" }, - "engines": { - "node": ">=0.4.0" + "peerDependencies": { + "@babel/parser": "^7.15.8", + "@nuxt/kit": "^3.2.2", + "vue": "2 || 3" + }, + "peerDependenciesMeta": { + "@babel/parser": { + "optional": true + }, + "@nuxt/kit": { + "optional": true + } } }, - "node_modules/webpack/node_modules/ajv": { - "version": "6.12.6", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", - "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", - "dev": true, + "node_modules/unplugin-vue-router": { + "version": "0.10.8", "license": "MIT", "dependencies": { - "fast-deep-equal": "^3.1.1", - "fast-json-stable-stringify": "^2.0.0", - "json-schema-traverse": "^0.4.1", - "uri-js": "^4.2.2" + "@babel/types": "^7.25.4", + "@rollup/pluginutils": "^5.1.0", + "@vue-macros/common": "^1.12.2", + "ast-walker-scope": "^0.6.2", + "chokidar": "^3.6.0", + "fast-glob": "^3.3.2", + "json5": "^2.2.3", + "local-pkg": "^0.5.0", + "magic-string": "^0.30.11", + "mlly": "^1.7.1", + "pathe": "^1.1.2", + "scule": "^1.3.0", + "unplugin": "^1.12.2", + "yaml": "^2.5.0" }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/epoberezkin" - } - }, - "node_modules/webpack/node_modules/ajv-errors": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/ajv-errors/-/ajv-errors-1.0.1.tgz", - "integrity": "sha512-DCRfO/4nQ+89p/RK43i8Ezd41EqdGIU4ld7nGF8OQ14oc/we5rEntLCUa7+jrn3nn83BosfwZA0wb4pon2o8iQ==", - "dev": true, - "license": "MIT", - "peerDependencies": { - "ajv": ">=5.0.0" - } - }, - "node_modules/webpack/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", "peerDependencies": { - "ajv": "^6.9.1" - } - }, - "node_modules/webpack/node_modules/braces": { - "version": "2.3.2", - "resolved": "https://registry.npmjs.org/braces/-/braces-2.3.2.tgz", - "integrity": "sha512-aNdbnj9P8PjdXU4ybaWLK2IF3jc/EoDYbC7AazW6to3TRsfXxscC9UXOB5iDiEQrkyIbWp2SLQda4+QAa7nc3w==", - "dev": true, - "license": "MIT", - "dependencies": { - "arr-flatten": "^1.1.0", - "array-unique": "^0.3.2", - "extend-shallow": "^2.0.1", - "fill-range": "^4.0.0", - "isobject": "^3.0.1", - "repeat-element": "^1.1.2", - "snapdragon": "^0.8.1", - "snapdragon-node": "^2.0.1", - "split-string": "^3.0.2", - "to-regex": "^3.0.1" + "vue-router": "^4.4.0" }, - "engines": { - "node": ">=0.10.0" + "peerDependenciesMeta": { + "vue-router": { + "optional": true + } } }, - "node_modules/webpack/node_modules/braces/node_modules/extend-shallow": { + "node_modules/upath": { "version": "2.0.1", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", - "integrity": "sha512-zCnTtlxNoAiDc3gqY2aYAWFx7XWWiasuF2K8Me5WbN8otHKTUKBwjPtNpRs/rbUZm7KxWAaNj7P1a/p52GbVug==", - "dev": true, "license": "MIT", - "dependencies": { - "is-extendable": "^0.1.0" - }, "engines": { - "node": ">=0.10.0" + "node": ">=4", + "yarn": "*" } }, - "node_modules/webpack/node_modules/cacache": { - "version": "12.0.4", - "resolved": "https://registry.npmjs.org/cacache/-/cacache-12.0.4.tgz", - "integrity": "sha512-a0tMB40oefvuInr4Cwb3GerbL9xTj1D5yg0T5xrjGCGyfvbxseIXX7BAO/u/hIXdafzOI5JC3wDwHyf24buOAQ==", - "dev": true, - "license": "ISC", - "dependencies": { - "bluebird": "^3.5.5", - "chownr": "^1.1.1", - "figgy-pudding": "^3.5.1", - "glob": "^7.1.4", - "graceful-fs": "^4.1.15", - "infer-owner": "^1.0.3", - "lru-cache": "^5.1.1", - "mississippi": "^3.0.0", - "mkdirp": "^0.5.1", - "move-concurrently": "^1.0.1", - "promise-inflight": "^1.0.1", - "rimraf": "^2.6.3", - "ssri": "^6.0.1", - "unique-filename": "^1.1.1", - "y18n": "^4.0.0" - } - }, - "node_modules/webpack/node_modules/chownr": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/chownr/-/chownr-1.1.4.tgz", - "integrity": "sha512-jJ0bqzaylmJtVnNgzTeSOs8DPavpbYgEr/b0YL8/2GO3xJEhInFmhKMUnEJQjZumK7KXGFhUy89PrsJWlakBVg==", - "dev": true, - "license": "ISC" - }, - "node_modules/webpack/node_modules/commander": { - "version": "2.20.3", - "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz", - "integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==", - "dev": true, + "node_modules/upper-case": { + "version": "1.1.3", "license": "MIT" }, - "node_modules/webpack/node_modules/eslint-scope": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-4.0.3.tgz", - "integrity": "sha512-p7VutNr1O/QrxysMo3E45FjYDTeXBy0iTltPFNSqKAIfjDSXC+4dj+qfyuD8bfAXrW/y6lW3O76VaYNPKfpKrg==", - "dev": true, + "node_modules/uri-js": { + "version": "4.4.1", "license": "BSD-2-Clause", "dependencies": { - "esrecurse": "^4.1.0", - "estraverse": "^4.1.1" - }, - "engines": { - "node": ">=4.0.0" + "punycode": "^2.1.0" } }, - "node_modules/webpack/node_modules/fill-range": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-4.0.0.tgz", - "integrity": "sha512-VcpLTWqWDiTerugjj8e3+esbg+skS3M9e54UuR3iCeIDMXCLTsAH8hTSzDQU/X6/6t3eYkOKoZSef2PlU6U1XQ==", - "dev": true, + "node_modules/useragent": { + "version": "2.3.0", "license": "MIT", "dependencies": { - "extend-shallow": "^2.0.1", - "is-number": "^3.0.0", - "repeat-string": "^1.6.1", - "to-regex-range": "^2.1.0" - }, - "engines": { - "node": ">=0.10.0" + "lru-cache": "4.1.x", + "tmp": "0.0.x" } }, - "node_modules/webpack/node_modules/fill-range/node_modules/extend-shallow": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", - "integrity": "sha512-zCnTtlxNoAiDc3gqY2aYAWFx7XWWiasuF2K8Me5WbN8otHKTUKBwjPtNpRs/rbUZm7KxWAaNj7P1a/p52GbVug==", - "dev": true, - "license": "MIT", + "node_modules/useragent/node_modules/lru-cache": { + "version": "4.1.5", + "license": "ISC", "dependencies": { - "is-extendable": "^0.1.0" - }, - "engines": { - "node": ">=0.10.0" + "pseudomap": "^1.0.2", + "yallist": "^2.1.2" } }, - "node_modules/webpack/node_modules/find-cache-dir": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/find-cache-dir/-/find-cache-dir-2.1.0.tgz", - "integrity": "sha512-Tq6PixE0w/VMFfCgbONnkiQIVol/JJL7nRMi20fqzA4NRs9AfeqMGeRdPi3wIhYkxjeBaWh2rxwapn5Tu3IqOQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "commondir": "^1.0.1", - "make-dir": "^2.0.0", - "pkg-dir": "^3.0.0" - }, - "engines": { - "node": ">=6" - } + "node_modules/useragent/node_modules/yallist": { + "version": "2.1.2", + "license": "ISC" }, - "node_modules/webpack/node_modules/find-up": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-3.0.0.tgz", - "integrity": "sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg==", - "dev": true, + "node_modules/util-deprecate": { + "version": "1.0.2", + "license": "MIT" + }, + "node_modules/utils-merge": { + "version": "1.0.1", "license": "MIT", - "dependencies": { - "locate-path": "^3.0.0" - }, "engines": { - "node": ">=6" + "node": ">= 0.4.0" } }, - "node_modules/webpack/node_modules/is-extendable": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-0.1.1.tgz", - "integrity": "sha512-5BMULNob1vgFX6EjQw5izWDxrecWK9AM72rugNr0TFldMOi0fj6Jk+zeKIt0xGj4cEfQIJth4w3OKWOJ4f+AFw==", - "dev": true, + "node_modules/uuid": { + "version": "8.3.2", "license": "MIT", - "engines": { - "node": ">=0.10.0" + "bin": { + "uuid": "dist/bin/uuid" } }, - "node_modules/webpack/node_modules/is-number": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz", - "integrity": "sha512-4cboCqIpliH+mAvFNegjZQ4kgKc3ZUhQVr3HvWbSh5q3WH2v82ct+T2Y1hdU5Gdtorx/cLifQjqCbL7bpznLTg==", - "dev": true, + "node_modules/valid-data-url": { + "version": "3.0.1", "license": "MIT", - "dependencies": { - "kind-of": "^3.0.2" - }, "engines": { - "node": ">=0.10.0" + "node": ">=10" } }, - "node_modules/webpack/node_modules/is-number/node_modules/kind-of": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha512-NOW9QQXMoZGg/oqnVNoNTTIFEIid1627WCffUBJEdMxYApq7mNE7CpzucIPc+ZQg25Phej7IJSmX3hO+oblOtQ==", - "dev": true, + "node_modules/varint": { + "version": "6.0.0", + "license": "MIT" + }, + "node_modules/vary": { + "version": "1.1.2", "license": "MIT", - "dependencies": { - "is-buffer": "^1.1.5" - }, "engines": { - "node": ">=0.10.0" + "node": ">= 0.8" } }, - "node_modules/webpack/node_modules/is-wsl": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/is-wsl/-/is-wsl-1.1.0.tgz", - "integrity": "sha512-gfygJYZ2gLTDlmbWMI0CE2MwnFzSN/2SZfkMlItC4K/JBlsWVDB0bO6XhqcY13YXE7iMcAJnzTCJjPiTeJJ0Mw==", - "dev": true, + "node_modules/vasync": { + "version": "2.2.1", + "engines": [ + "node >=0.6.0" + ], "license": "MIT", - "engines": { - "node": ">=4" + "dependencies": { + "verror": "1.10.0" } }, - "node_modules/webpack/node_modules/json-schema-traverse": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", - "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", - "dev": true, + "node_modules/vasync/node_modules/core-util-is": { + "version": "1.0.2", "license": "MIT" }, - "node_modules/webpack/node_modules/loader-runner": { - "version": "2.4.0", - "resolved": "https://registry.npmjs.org/loader-runner/-/loader-runner-2.4.0.tgz", - "integrity": "sha512-Jsmr89RcXGIwivFY21FcRrisYZfvLMTWx5kOLc+JTxtpBOG6xML0vzbc6SEQG2FO9/4Fc3wW4LVcB5DmGflaRw==", - "dev": true, + "node_modules/vasync/node_modules/verror": { + "version": "1.10.0", + "engines": [ + "node >=0.6.0" + ], "license": "MIT", - "engines": { - "node": ">=4.3.0 <5.0.0 || >=5.10" + "dependencies": { + "assert-plus": "^1.0.0", + "core-util-is": "1.0.2", + "extsprintf": "^1.2.0" } }, - "node_modules/webpack/node_modules/locate-path": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-3.0.0.tgz", - "integrity": "sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A==", - "dev": true, + "node_modules/verror": { + "version": "1.10.1", "license": "MIT", "dependencies": { - "p-locate": "^3.0.0", - "path-exists": "^3.0.0" + "assert-plus": "^1.0.0", + "core-util-is": "1.0.2", + "extsprintf": "^1.2.0" }, "engines": { - "node": ">=6" + "node": ">=0.6.0" } }, - "node_modules/webpack/node_modules/lru-cache": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-5.1.1.tgz", - "integrity": "sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==", - "dev": true, - "license": "ISC", - "dependencies": { - "yallist": "^3.0.2" - } + "node_modules/verror/node_modules/core-util-is": { + "version": "1.0.2", + "license": "MIT" }, - "node_modules/webpack/node_modules/make-dir": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-2.1.0.tgz", - "integrity": "sha512-LS9X+dc8KLxXCb8dni79fLIIUA5VyZoyjSMCwTluaXA0o27cCK0bhXkpgw+sTXVpPy/lSO57ilRixqk0vDmtRA==", - "dev": true, + "node_modules/vite": { + "version": "5.4.9", "license": "MIT", "dependencies": { - "pify": "^4.0.1", - "semver": "^5.6.0" + "esbuild": "^0.21.3", + "postcss": "^8.4.43", + "rollup": "^4.20.0" + }, + "bin": { + "vite": "bin/vite.js" }, "engines": { - "node": ">=6" + "node": "^18.0.0 || >=20.0.0" + }, + "funding": { + "url": "https://github.com/vitejs/vite?sponsor=1" + }, + "optionalDependencies": { + "fsevents": "~2.3.3" + }, + "peerDependencies": { + "@types/node": "^18.0.0 || >=20.0.0", + "less": "*", + "lightningcss": "^1.21.0", + "sass": "*", + "sass-embedded": "*", + "stylus": "*", + "sugarss": "*", + "terser": "^5.4.0" + }, + "peerDependenciesMeta": { + "@types/node": { + "optional": true + }, + "less": { + "optional": true + }, + "lightningcss": { + "optional": true + }, + "sass": { + "optional": true + }, + "sass-embedded": { + "optional": true + }, + "stylus": { + "optional": true + }, + "sugarss": { + "optional": true + }, + "terser": { + "optional": true + } } }, - "node_modules/webpack/node_modules/memory-fs": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/memory-fs/-/memory-fs-0.4.1.tgz", - "integrity": "sha512-cda4JKCxReDXFXRqOHPQscuIYg1PvxbE2S2GP45rnwfEK+vZaXC8C1OFvdHIbgw0DLzowXGVoxLaAmlgRy14GQ==", - "dev": true, + "node_modules/vite-plugin-vuetify": { + "version": "2.0.4", "license": "MIT", "dependencies": { - "errno": "^0.1.3", - "readable-stream": "^2.0.1" + "@vuetify/loader-shared": "^2.0.3", + "debug": "^4.3.3", + "upath": "^2.0.1" + }, + "engines": { + "node": "^18.0.0 || >=20.0.0" + }, + "peerDependencies": { + "vite": ">=5", + "vue": "^3.0.0", + "vuetify": "^3.0.0" } }, - "node_modules/webpack/node_modules/micromatch": { - "version": "3.1.10", - "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-3.1.10.tgz", - "integrity": "sha512-MWikgl9n9M3w+bpsY3He8L+w9eF9338xRl8IAO5viDizwSzziFEyUzo2xrrloB64ADbTf8uA8vRqqttDTOmccg==", - "dev": true, + "node_modules/vscode-uri": { + "version": "3.0.8", + "license": "MIT" + }, + "node_modules/vue": { + "version": "3.5.12", "license": "MIT", "dependencies": { - "arr-diff": "^4.0.0", - "array-unique": "^0.3.2", - "braces": "^2.3.1", - "define-property": "^2.0.2", - "extend-shallow": "^3.0.2", - "extglob": "^2.0.4", - "fragment-cache": "^0.2.1", - "kind-of": "^6.0.2", - "nanomatch": "^1.2.9", - "object.pick": "^1.3.0", - "regex-not": "^1.0.0", - "snapdragon": "^0.8.1", - "to-regex": "^3.0.2" + "@vue/compiler-dom": "3.5.12", + "@vue/compiler-sfc": "3.5.12", + "@vue/runtime-dom": "3.5.12", + "@vue/server-renderer": "3.5.12", + "@vue/shared": "3.5.12" }, - "engines": { - "node": ">=0.10.0" + "peerDependencies": { + "typescript": "*" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } } }, - "node_modules/webpack/node_modules/mkdirp": { - "version": "0.5.6", - "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.6.tgz", - "integrity": "sha512-FP+p8RB8OWpF3YZBCrP5gtADmtXApB5AMLn+vdyA+PyxCjrCs00mjyUozssO33cwDeT3wNGdLxJ5M//YqtHAJw==", - "dev": true, + "node_modules/vue-cropperjs": { + "version": "5.0.0", "license": "MIT", "dependencies": { - "minimist": "^1.2.6" + "cropperjs": "^1.5.6" }, - "bin": { - "mkdirp": "bin/cmd.js" + "peerDependencies": { + "vue": ">=3.0.0" } }, - "node_modules/webpack/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==", + "node_modules/vue-eslint-parser": { + "version": "9.4.3", "dev": true, "license": "MIT", "dependencies": { - "p-try": "^2.0.0" + "debug": "^4.3.4", + "eslint-scope": "^7.1.1", + "eslint-visitor-keys": "^3.3.0", + "espree": "^9.3.1", + "esquery": "^1.4.0", + "lodash": "^4.17.21", + "semver": "^7.3.6" }, "engines": { - "node": ">=6" + "node": "^14.17.0 || >=16.0.0" }, "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "url": "https://github.com/sponsors/mysticatea" + }, + "peerDependencies": { + "eslint": ">=6.0.0" } }, - "node_modules/webpack/node_modules/p-locate": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-3.0.0.tgz", - "integrity": "sha512-x+12w/To+4GFfgJhBEpiDcLozRJGegY+Ei7/z0tSLkMmxGZNybVMSfWj9aJn8Z5Fc7dBUNJOOVgPv2H7IwulSQ==", + "node_modules/vue-eslint-parser/node_modules/eslint-scope": { + "version": "7.2.2", "dev": true, - "license": "MIT", + "license": "BSD-2-Clause", "dependencies": { - "p-limit": "^2.0.0" + "esrecurse": "^4.3.0", + "estraverse": "^5.2.0" }, "engines": { - "node": ">=6" - } - }, - "node_modules/webpack/node_modules/path-exists": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz", - "integrity": "sha512-bpC7GYwiDYQ4wYLe+FA8lhRjhQCMcQGuSgGGqDkg/QerRWw9CmGRT0iSOVRSZJ29NMLZgIzqaljJ63oaL4NIJQ==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=4" - } - }, - "node_modules/webpack/node_modules/pify": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/pify/-/pify-4.0.1.tgz", - "integrity": "sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=6" + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" } }, - "node_modules/webpack/node_modules/pkg-dir": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-3.0.0.tgz", - "integrity": "sha512-/E57AYkoeQ25qkxMj5PBOVgF8Kiu/h7cYS30Z5+R7WaiCCBfLq58ZI/dSeaEKb9WVJV5n/03QwrN3IeWIFllvw==", + "node_modules/vue-eslint-parser/node_modules/espree": { + "version": "9.6.1", "dev": true, - "license": "MIT", + "license": "BSD-2-Clause", "dependencies": { - "find-up": "^3.0.0" + "acorn": "^8.9.0", + "acorn-jsx": "^5.3.2", + "eslint-visitor-keys": "^3.4.1" }, "engines": { - "node": ">=6" - } - }, - "node_modules/webpack/node_modules/rimraf": { - "version": "2.7.1", - "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.7.1.tgz", - "integrity": "sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w==", - "deprecated": "Rimraf versions prior to v4 are no longer supported", - "dev": true, - "license": "ISC", - "dependencies": { - "glob": "^7.1.3" + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" }, - "bin": { - "rimraf": "bin.js" + "funding": { + "url": "https://opencollective.com/eslint" } }, - "node_modules/webpack/node_modules/schema-utils": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-1.0.0.tgz", - "integrity": "sha512-i27Mic4KovM/lnGsy8whRCHhc7VicJajAjTrYg11K9zfZXnYIt4k5F+kZkwjnrhKzLic/HLU4j11mjsz2G/75g==", - "dev": true, + "node_modules/vue-i18n": { + "version": "10.0.4", "license": "MIT", "dependencies": { - "ajv": "^6.1.0", - "ajv-errors": "^1.0.0", - "ajv-keywords": "^3.1.0" + "@intlify/core-base": "10.0.4", + "@intlify/shared": "10.0.4", + "@vue/devtools-api": "^6.5.0" }, "engines": { - "node": ">= 4" - } - }, - "node_modules/webpack/node_modules/semver": { - "version": "5.7.2", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.2.tgz", - "integrity": "sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g==", - "dev": true, - "license": "ISC", - "bin": { - "semver": "bin/semver" - } - }, - "node_modules/webpack/node_modules/serialize-javascript": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-4.0.0.tgz", - "integrity": "sha512-GaNA54380uFefWghODBWEGisLZFj00nS5ACs6yHa9nLqlLpVLO8ChDGeKRjZnV4Nh4n0Qi7nhYZD/9fCPzEqkw==", - "dev": true, - "license": "BSD-3-Clause", - "dependencies": { - "randombytes": "^2.1.0" + "node": ">= 16" + }, + "funding": { + "url": "https://github.com/sponsors/kazupon" + }, + "peerDependencies": { + "vue": "^3.0.0" } }, - "node_modules/webpack/node_modules/ssri": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/ssri/-/ssri-6.0.2.tgz", - "integrity": "sha512-cepbSq/neFK7xB6A50KHN0xHDotYzq58wWCa5LeWqnPrHG8GzfEjO/4O8kpmcGW+oaxkvhEJCWgbgNk4/ZV93Q==", - "dev": true, - "license": "ISC", + "node_modules/vue-router": { + "version": "4.4.5", + "license": "MIT", "dependencies": { - "figgy-pudding": "^3.5.1" + "@vue/devtools-api": "^6.6.4" + }, + "funding": { + "url": "https://github.com/sponsors/posva" + }, + "peerDependencies": { + "vue": "^3.2.0" } }, - "node_modules/webpack/node_modules/terser": { - "version": "4.8.1", - "resolved": "https://registry.npmjs.org/terser/-/terser-4.8.1.tgz", - "integrity": "sha512-4GnLC0x667eJG0ewJTa6z/yXrbLGv80D9Ru6HIpCQmO+Q4PfEtBFi0ObSckqwL6VyQv/7ENJieXHo2ANmdQwgw==", - "dev": true, - "license": "BSD-2-Clause", + "node_modules/vue-tsc": { + "version": "2.1.10", + "license": "MIT", "dependencies": { - "commander": "^2.20.0", - "source-map": "~0.6.1", - "source-map-support": "~0.5.12" + "@volar/typescript": "~2.4.8", + "@vue/language-core": "2.1.10", + "semver": "^7.5.4" }, "bin": { - "terser": "bin/terser" + "vue-tsc": "bin/vue-tsc.js" }, - "engines": { - "node": ">=6.0.0" + "peerDependencies": { + "typescript": ">=5.0.0" } }, - "node_modules/webpack/node_modules/terser-webpack-plugin": { - "version": "1.4.6", - "resolved": "https://registry.npmjs.org/terser-webpack-plugin/-/terser-webpack-plugin-1.4.6.tgz", - "integrity": "sha512-2lBVf/VMVIddjSn3GqbT90GvIJ/eYXJkt8cTzU7NbjKqK8fwv18Ftr4PlbF46b/e88743iZFL5Dtr/rC4hjIeA==", - "dev": true, + "node_modules/vuetify": { + "version": "3.7.6", "license": "MIT", - "dependencies": { - "cacache": "^12.0.2", - "find-cache-dir": "^2.1.0", - "is-wsl": "^1.1.0", - "schema-utils": "^1.0.0", - "serialize-javascript": "^4.0.0", - "source-map": "^0.6.1", - "terser": "^4.1.2", - "webpack-sources": "^1.4.0", - "worker-farm": "^1.7.0" - }, "engines": { - "node": ">= 6.9.0" + "node": "^12.20 || >=14.13" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/johnleider" }, "peerDependencies": { - "webpack": "^4.0.0" + "typescript": ">=4.7", + "vite-plugin-vuetify": ">=1.0.0", + "vue": "^3.3.0", + "webpack-plugin-vuetify": ">=2.0.0" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + }, + "vite-plugin-vuetify": { + "optional": true + }, + "webpack-plugin-vuetify": { + "optional": true + } } }, - "node_modules/webpack/node_modules/to-regex-range": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-2.1.1.tgz", - "integrity": "sha512-ZZWNfCjUokXXDGXFpZehJIkZqq91BcULFq/Pi7M5i4JnxXdhMKAK682z8bCW3o8Hj1wuuzoKcW3DfVzaP6VuNg==", - "dev": true, + "node_modules/web-resource-inliner": { + "version": "6.0.1", "license": "MIT", "dependencies": { - "is-number": "^3.0.0", - "repeat-string": "^1.6.1" + "ansi-colors": "^4.1.1", + "escape-goat": "^3.0.0", + "htmlparser2": "^5.0.0", + "mime": "^2.4.6", + "node-fetch": "^2.6.0", + "valid-data-url": "^3.0.0" }, "engines": { - "node": ">=0.10.0" + "node": ">=10.0.0" } }, - "node_modules/webpack/node_modules/watchpack": { - "version": "1.7.5", - "resolved": "https://registry.npmjs.org/watchpack/-/watchpack-1.7.5.tgz", - "integrity": "sha512-9P3MWk6SrKjHsGkLT2KHXdQ/9SNkyoJbabxnKOoJepsvJjJG8uYTR3yTPxPQvNDI3w4Nz1xnE0TLHK4RIVe/MQ==", - "dev": true, + "node_modules/web-resource-inliner/node_modules/dom-serializer": { + "version": "1.4.1", "license": "MIT", "dependencies": { - "graceful-fs": "^4.1.2", - "neo-async": "^2.5.0" + "domelementtype": "^2.0.1", + "domhandler": "^4.2.0", + "entities": "^2.0.0" }, - "optionalDependencies": { - "chokidar": "^3.4.1", - "watchpack-chokidar2": "^2.0.1" + "funding": { + "url": "https://github.com/cheeriojs/dom-serializer?sponsor=1" } }, - "node_modules/webpack/node_modules/y18n": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/y18n/-/y18n-4.0.3.tgz", - "integrity": "sha512-JKhqTOwSrqNA1NY5lSztJ1GrBiUodLMmIZuLiDaMRJ+itFd+ABVE8XBjOvIWL+rSqNDC74LCSFmlb/U4UZ4hJQ==", - "dev": true, - "license": "ISC" - }, - "node_modules/webpack/node_modules/yallist": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz", - "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==", - "dev": true, - "license": "ISC" - }, - "node_modules/webpackbar": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/webpackbar/-/webpackbar-6.0.1.tgz", - "integrity": "sha512-TnErZpmuKdwWBdMoexjio3KKX6ZtoKHRVvLIU0A47R0VVBDtx3ZyOJDktgYixhoJokZTYTt1Z37OkO9pnGJa9Q==", - "dev": true, - "license": "MIT", + "node_modules/web-resource-inliner/node_modules/dom-serializer/node_modules/domhandler": { + "version": "4.3.1", + "license": "BSD-2-Clause", + "dependencies": { + "domelementtype": "^2.2.0" + }, + "engines": { + "node": ">= 4" + }, + "funding": { + "url": "https://github.com/fb55/domhandler?sponsor=1" + } + }, + "node_modules/web-resource-inliner/node_modules/domhandler": { + "version": "3.3.0", + "license": "BSD-2-Clause", "dependencies": { - "ansi-escapes": "^4.3.2", - "chalk": "^4.1.2", - "consola": "^3.2.3", - "figures": "^3.2.0", - "markdown-table": "^2.0.0", - "pretty-time": "^1.1.0", - "std-env": "^3.7.0", - "wrap-ansi": "^7.0.0" + "domelementtype": "^2.0.1" }, "engines": { - "node": ">=14.21.3" + "node": ">= 4" }, - "peerDependencies": { - "webpack": "3 || 4 || 5" + "funding": { + "url": "https://github.com/fb55/domhandler?sponsor=1" } }, - "node_modules/webpackbar/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", + "node_modules/web-resource-inliner/node_modules/domutils": { + "version": "2.8.0", + "license": "BSD-2-Clause", "dependencies": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" + "dom-serializer": "^1.0.1", + "domelementtype": "^2.2.0", + "domhandler": "^4.2.0" + }, + "funding": { + "url": "https://github.com/fb55/domutils?sponsor=1" + } + }, + "node_modules/web-resource-inliner/node_modules/domutils/node_modules/domhandler": { + "version": "4.3.1", + "license": "BSD-2-Clause", + "dependencies": { + "domelementtype": "^2.2.0" }, "engines": { - "node": ">=10" + "node": ">= 4" }, "funding": { - "url": "https://github.com/chalk/chalk?sponsor=1" + "url": "https://github.com/fb55/domhandler?sponsor=1" } }, - "node_modules/webpackbar/node_modules/consola": { - "version": "3.2.3", - "resolved": "https://registry.npmjs.org/consola/-/consola-3.2.3.tgz", - "integrity": "sha512-I5qxpzLv+sJhTVEoLYNcTW+bThDCPsit0vLNKShZx6rLtpilNpmmeTPaeqJb9ZE9dV3DGaeby6Vuhrw38WjeyQ==", - "dev": true, - "license": "MIT", - "engines": { - "node": "^14.18.0 || >=16.10.0" + "node_modules/web-resource-inliner/node_modules/entities": { + "version": "2.2.0", + "license": "BSD-2-Clause", + "funding": { + "url": "https://github.com/fb55/entities?sponsor=1" } }, - "node_modules/webpackbar/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, + "node_modules/web-resource-inliner/node_modules/htmlparser2": { + "version": "5.0.1", "license": "MIT", "dependencies": { - "has-flag": "^4.0.0" + "domelementtype": "^2.0.1", + "domhandler": "^3.3.0", + "domutils": "^2.4.2", + "entities": "^2.0.0" }, + "funding": { + "url": "https://github.com/fb55/htmlparser2?sponsor=1" + } + }, + "node_modules/webidl-conversions": { + "version": "7.0.0", + "license": "BSD-2-Clause", "engines": { - "node": ">=8" + "node": ">=12" } }, + "node_modules/webpack-virtual-modules": { + "version": "0.6.2", + "license": "MIT" + }, "node_modules/whatwg-url": { - "version": "11.0.0", - "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-11.0.0.tgz", - "integrity": "sha512-RKT8HExMpoYx4igMiVMY83lN6UeITKJlBQ+vR/8ZJ8OCdSiN3RwCq+9gH0+Xzj0+5IrM6i4j/6LuvzbZIQgEcQ==", + "version": "13.0.0", "license": "MIT", "dependencies": { - "tr46": "^3.0.0", + "tr46": "^4.1.1", "webidl-conversions": "^7.0.0" }, "engines": { - "node": ">=12" + "node": ">=16" } }, "node_modules/which": { "version": "2.0.2", - "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", - "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", "license": "ISC", "dependencies": { "isexe": "^2.0.0" @@ -27806,8 +10435,6 @@ }, "node_modules/which-boxed-primitive": { "version": "1.0.2", - "resolved": "https://registry.npmjs.org/which-boxed-primitive/-/which-boxed-primitive-1.0.2.tgz", - "integrity": "sha512-bwZdv0AKLpplFY2KZRX6TvyuN7ojjr7lwkg6ml0roIy9YeuSr7JS372qlNW18UQYzgYK9ziGcerWqZOmEn9VNg==", "dev": true, "license": "MIT", "dependencies": { @@ -27821,16 +10448,54 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/which-builtin-type": { + "version": "1.1.4", + "dev": true, + "license": "MIT", + "dependencies": { + "function.prototype.name": "^1.1.6", + "has-tostringtag": "^1.0.2", + "is-async-function": "^2.0.0", + "is-date-object": "^1.0.5", + "is-finalizationregistry": "^1.0.2", + "is-generator-function": "^1.0.10", + "is-regex": "^1.1.4", + "is-weakref": "^1.0.2", + "isarray": "^2.0.5", + "which-boxed-primitive": "^1.0.2", + "which-collection": "^1.0.2", + "which-typed-array": "^1.1.15" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/which-collection": { + "version": "1.0.2", + "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.15", - "resolved": "https://registry.npmjs.org/which-typed-array/-/which-typed-array-1.1.15.tgz", - "integrity": "sha512-oV0jmFtUky6CXfkqehVvBP/LSWJ2sy4vWMioiENyJLePrBO/yKyV9OyJySfAKosh+RYkIl5zJCNZ8/4JncrpdA==", "dev": true, "license": "MIT", "dependencies": { @@ -27847,49 +10512,15 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/widest-line": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/widest-line/-/widest-line-3.1.0.tgz", - "integrity": "sha512-NsmoXalsWVDMGupxZ5R08ka9flZjjiLvHVAWYOKtiKM8ujtZWr9cRffak+uSE48+Ob8ObalXpwyeUiyDD6QFgg==", - "license": "MIT", - "dependencies": { - "string-width": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, "node_modules/word-wrap": { "version": "1.2.5", - "resolved": "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.5.tgz", - "integrity": "sha512-BN22B5eaMMI9UMtjrGd5g5eCYPpCPDUy0FJXbYsaT5zYxjFOckS53SQDE3pWkVoWpHXVb3BrYcEN4Twa55B5cA==", - "dev": true, "license": "MIT", "engines": { "node": ">=0.10.0" } }, - "node_modules/worker-farm": { - "version": "1.7.0", - "resolved": "https://registry.npmjs.org/worker-farm/-/worker-farm-1.7.0.tgz", - "integrity": "sha512-rvw3QTZc8lAxyVrqcSGVm5yP/IJ2UcB3U0graE3LCFoZ0Yn2x4EoVSqJKdB/T5M+FLcRPjz4TDacRf3OCfNUzw==", - "dev": true, - "license": "MIT", - "dependencies": { - "errno": "~0.1.7" - } - }, - "node_modules/workerpool": { - "version": "6.2.0", - "resolved": "https://registry.npmjs.org/workerpool/-/workerpool-6.2.0.tgz", - "integrity": "sha512-Rsk5qQHJ9eowMH28Jwhe8HEbmdYDX4lwoMWshiCXugjtHqMD9ZbiqSDLxcsfdqsETPzVUtX5s1Z5kStiIM6l4A==", - "dev": true, - "license": "Apache-2.0" - }, "node_modules/wrap-ansi": { "version": "7.0.0", - "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", - "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", "license": "MIT", "dependencies": { "ansi-styles": "^4.0.0", @@ -27906,8 +10537,6 @@ "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==", "license": "MIT", "dependencies": { "ansi-styles": "^4.0.0", @@ -27923,123 +10552,14 @@ }, "node_modules/wrappy": { "version": "1.0.2", - "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", - "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==", - "license": "ISC" - }, - "node_modules/write-file-atomic": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-3.0.3.tgz", - "integrity": "sha512-AvHcyZ5JnSfq3ioSyjrBkH9yW4m7Ayk8/9My/DD9onKeu/94fwrMocemO2QAJFAlnnDN+ZDS+ZjAR5ua1/PV/Q==", - "dev": true, - "license": "ISC", - "dependencies": { - "imurmurhash": "^0.1.4", - "is-typedarray": "^1.0.0", - "signal-exit": "^3.0.2", - "typedarray-to-buffer": "^3.1.5" - } - }, - "node_modules/write-file-atomic/node_modules/signal-exit": { - "version": "3.0.7", - "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz", - "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==", - "dev": true, - "license": "ISC" - }, - "node_modules/write-json-file": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/write-json-file/-/write-json-file-2.3.0.tgz", - "integrity": "sha512-84+F0igFp2dPD6UpAQjOUX3CdKUOqUzn6oE9sDBNzUXINR5VceJ1rauZltqQB/bcYsx3EpKys4C7/PivKUAiWQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "detect-indent": "^5.0.0", - "graceful-fs": "^4.1.2", - "make-dir": "^1.0.0", - "pify": "^3.0.0", - "sort-keys": "^2.0.0", - "write-file-atomic": "^2.0.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/write-json-file/node_modules/make-dir": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-1.3.0.tgz", - "integrity": "sha512-2w31R7SJtieJJnQtGc7RVL2StM2vGYVfqUOvUDxH6bC6aJTxPxTF0GnIgCyu7tjockiUWAYQRbxa7vKn34s5sQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "pify": "^3.0.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/write-json-file/node_modules/pify": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/pify/-/pify-3.0.0.tgz", - "integrity": "sha512-C3FsVNH1udSEX48gGX1xfvwTWfsYWj5U+8/uK15BGzIGrKoUpghX8hWZwa/OFnakBiiVNmBvemTJR5mcy7iPcg==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=4" - } - }, - "node_modules/write-json-file/node_modules/signal-exit": { - "version": "3.0.7", - "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz", - "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==", - "dev": true, "license": "ISC" }, - "node_modules/write-json-file/node_modules/write-file-atomic": { - "version": "2.4.3", - "resolved": "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-2.4.3.tgz", - "integrity": "sha512-GaETH5wwsX+GcnzhPgKcKjJ6M2Cq3/iZp1WyY/X1CSqrW+jVNM9Y7D8EC2sM4ZG/V8wZlSniJnCKWPmBYAucRQ==", - "dev": true, - "license": "ISC", - "dependencies": { - "graceful-fs": "^4.1.11", - "imurmurhash": "^0.1.4", - "signal-exit": "^3.0.2" - } - }, - "node_modules/ws": { - "version": "8.18.0", - "resolved": "https://registry.npmjs.org/ws/-/ws-8.18.0.tgz", - "integrity": "sha512-8VbfWfHLbbwu3+N6OKsOMpBdT4kXPDDB9cJk2bJ6mh9ucxdlnNvH1e+roYkKmN9Nxw2yjz7VzeO9oOz2zJ04Pw==", - "license": "MIT", - "optional": true, - "peer": true, - "engines": { - "node": ">=10.0.0" - }, - "peerDependencies": { - "bufferutil": "^4.0.1", - "utf-8-validate": ">=5.0.2" - }, - "peerDependenciesMeta": { - "bufferutil": { - "optional": true - }, - "utf-8-validate": { - "optional": true - } - } - }, "node_modules/xml": { "version": "1.0.1", - "resolved": "https://registry.npmjs.org/xml/-/xml-1.0.1.tgz", - "integrity": "sha512-huCv9IH9Tcf95zuYCsQraZtWnJvBtLVE0QHMOs8bWyZAFZNDcYjsPq1nEx8jKA9y+Beo9v+7OBPRisQTjinQMw==", "license": "MIT" }, "node_modules/xml-crypto": { "version": "3.2.0", - "resolved": "https://registry.npmjs.org/xml-crypto/-/xml-crypto-3.2.0.tgz", - "integrity": "sha512-qVurBUOQrmvlgmZqIVBqmb06TD2a/PpEUfFPgD7BuBfjmoH4zgkqaWSIJrnymlCvM2GGt9x+XtJFA+ttoAufqg==", "license": "MIT", "dependencies": { "@xmldom/xmldom": "^0.8.8", @@ -28049,10 +10569,20 @@ "node": ">=4.0.0" } }, + "node_modules/xml-escape": { + "version": "1.1.0", + "license": "MIT License" + }, + "node_modules/xml-name-validator": { + "version": "4.0.0", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": ">=12" + } + }, "node_modules/xpath": { "version": "0.0.32", - "resolved": "https://registry.npmjs.org/xpath/-/xpath-0.0.32.tgz", - "integrity": "sha512-rxMJhSIoiO8vXcWvSifKqhvV96GjiD5wYb8/QHdoRyQvraTpp4IEv944nhGausZZ3u7dhQXteZuZbaqfpB7uYw==", "license": "MIT", "engines": { "node": ">=0.6.0" @@ -28060,27 +10590,13 @@ }, "node_modules/xtend": { "version": "4.0.2", - "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.2.tgz", - "integrity": "sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ==", "license": "MIT", "engines": { "node": ">=0.4" } }, - "node_modules/xxhashjs": { - "version": "0.2.2", - "resolved": "https://registry.npmjs.org/xxhashjs/-/xxhashjs-0.2.2.tgz", - "integrity": "sha512-AkTuIuVTET12tpsVIQo+ZU6f/qDmKuRUcjaqR+OIvm+aCBsZ95i7UVY5WJ9TMsSaZ0DA2WxoZ4acu0sPH+OKAw==", - "dev": true, - "license": "MIT", - "dependencies": { - "cuint": "^0.2.2" - } - }, "node_modules/y18n": { "version": "5.0.8", - "resolved": "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz", - "integrity": "sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==", "license": "ISC", "engines": { "node": ">=10" @@ -28088,24 +10604,35 @@ }, "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/yaml": { - "version": "1.10.2", - "resolved": "https://registry.npmjs.org/yaml/-/yaml-1.10.2.tgz", - "integrity": "sha512-r3vXyErRCYJ7wg28yvBY5VSoAF8ZvlcW9/BwUzEtUsjvX/DKs24dIkuwjtuprwJJHsbyUbLApepYTR1BN4uHrg==", - "dev": true, + "version": "2.6.0", "license": "ISC", + "bin": { + "yaml": "bin.mjs" + }, "engines": { - "node": ">= 6" + "node": ">= 14" + } + }, + "node_modules/yaml-eslint-parser": { + "version": "1.2.3", + "license": "MIT", + "dependencies": { + "eslint-visitor-keys": "^3.0.0", + "lodash": "^4.17.21", + "yaml": "^2.0.0" + }, + "engines": { + "node": "^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/ota-meshi" } }, "node_modules/yargs": { "version": "17.7.2", - "resolved": "https://registry.npmjs.org/yargs/-/yargs-17.7.2.tgz", - "integrity": "sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w==", "license": "MIT", "dependencies": { "cliui": "^8.0.1", @@ -28121,36 +10648,14 @@ } }, "node_modules/yargs-parser": { - "version": "20.2.9", - "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-20.2.9.tgz", - "integrity": "sha512-y11nGElTIV+CT3Zv9t7VKl+Q3hTQoT9a1Qzezhhl6Rp21gJ/IVTW7Z3y9EWXhuUBC2Shnf+DX0antecpAwSP8w==", - "dev": true, + "version": "21.1.1", "license": "ISC", "engines": { - "node": ">=10" - } - }, - "node_modules/yargs-unparser": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/yargs-unparser/-/yargs-unparser-2.0.0.tgz", - "integrity": "sha512-7pRTIA9Qc1caZ0bZ6RYRGbHJthJWuakf+WmHK0rVeLkNrrGhfoabBNdue6kdINI6r4if7ocq9aD/n7xwKOdzOA==", - "dev": true, - "license": "MIT", - "dependencies": { - "camelcase": "^6.0.0", - "decamelize": "^4.0.0", - "flat": "^5.0.2", - "is-plain-obj": "^2.1.0" - }, - "engines": { - "node": ">=10" + "node": ">=12" } }, - "node_modules/yargs-unparser/node_modules/camelcase": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-6.3.0.tgz", - "integrity": "sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA==", - "dev": true, + "node_modules/yocto-queue": { + "version": "0.1.0", "license": "MIT", "engines": { "node": ">=10" @@ -28159,59 +10664,54 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/yargs-unparser/node_modules/decamelize": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-4.0.0.tgz", - "integrity": "sha512-9iE1PgSik9HeIIw2JO94IidnE3eBoQrFJ3w7sFuzSX4DpmZ3v5sZpUiV5Swcf6mQEF+Y0ru8Neo+p+nyh2J+hQ==", - "dev": true, + "node_modules/zhead": { + "version": "2.2.4", "license": "MIT", - "engines": { - "node": ">=10" - }, "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/yargs-unparser/node_modules/is-plain-obj": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-2.1.0.tgz", - "integrity": "sha512-YWnfyRwxL/+SsrWYfOpUtz5b3YD+nyfkHvjbcanzk8zgyO4ASD67uVMRt8k5bM4lLMDnXfriRhOpemw+NfT1eA==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=8" + "url": "https://github.com/sponsors/harlan-zw" } }, - "node_modules/yargs/node_modules/yargs-parser": { - "version": "21.1.1", - "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-21.1.1.tgz", - "integrity": "sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==", - "license": "ISC", - "engines": { - "node": ">=12" - } - }, - "node_modules/yn": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/yn/-/yn-3.1.1.tgz", - "integrity": "sha512-Ux4ygGWsu2c7isFWe8Yu1YluJmqVhxqK2cLXNQA5AcC3QfbGNpM7fu0Y8b/z16pXLnFxZYvWhd3fhBY9DLmC6Q==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=6" + "shared": { + "name": "@sd/shared", + "version": "0.0.0", + "dependencies": { + "tinycolor2": "^1.6.0" } }, - "node_modules/yocto-queue": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz", - "integrity": "sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "ui": { + "name": "@sd/ui", + "version": "0.0.0", + "dependencies": { + "@data-fair/frame": "^0.2.1", + "@data-fair/lib-vue": "^1.15.5", + "@data-fair/lib-vuetify": "^1.8.0", + "@intlify/unplugin-vue-i18n": "^5.2.0", + "@koumoul/v-iframe": "^2.4.4", + "@koumoul/vjsf": "^3.8.0", + "@mdi/js": "^7.4.47", + "@sd/shared": "*", + "@types/config": "^3.3.5", + "@types/tinycolor2": "^1.4.6", + "@unhead/vue": "^1.11.10", + "@vitejs/plugin-vue": "^5.1.2", + "@vueuse/core": "^11.2.0", + "debug": "^4.4.0", + "iframe-resizer": "^4.4.5", + "ms": "^2.1.3", + "sass-embedded": "^1.79.4", + "ufo": "^1.5.4", + "unplugin-auto-import": "^0.18.3", + "unplugin-fonts": "^1.1.1", + "unplugin-vue-components": "^0.27.4", + "unplugin-vue-router": "^0.10.8", + "vite": "^5.4.1", + "vite-plugin-vuetify": "^2.0.4", + "vue": "^3.4.37", + "vue-cropperjs": "^5.0.0", + "vue-i18n": "^10.0.3", + "vue-router": "^4.4.5", + "vue-tsc": "^2.1.10", + "vuetify": "^3.7.6" } } } diff --git a/package.json b/package.json index 3c1d67dc..29a14b8f 100644 --- a/package.json +++ b/package.json @@ -2,174 +2,80 @@ "name": "simple-directory", "version": "7.13.1", "description": "Easy users and organizations management for modern Web-oriented architectures.", - "main": "server/app.js", + "type": "module", "scripts": { - "test": "npm run test-file && npm run test-mongo && npm run test-ldap", - "test-file": "NODE_ENV=test EVENTS_LOG_LEVEL=warn STORAGE_TYPE=file mocha --exit --bail --timeout 20000 test/file/*.js", - "test-mongo": "NODE_ENV=test EVENTS_LOG_LEVEL=warn STORAGE_TYPE=mongo mocha --exit --bail --timeout 20000 test/mongo", - "test-ldap": "NODE_ENV=test EVENTS_LOG_LEVEL=warn STORAGE_TYPE=ldap mocha --exit --bail --timeout 20000 test/ldap", - "test-cover": "nyc npm test", - "test-deps": "docker compose --profile test up -d", + "test-base": "NODE_ENV=test node --experimental-strip-types --test-force-exit --test-concurrency=1 --test --test-reporter=@reporters/bail --test-reporter-destination=stderr --test-reporter=spec --test-reporter-destination=stdout", + "test": "npm run test-base test-it/*.ts", + "test-deps": "docker compose --profile test up -d --wait", "report": "nyc report --reporter=html", - "lint": "eslint --ext js,vue .", - "lint-fix": "eslint --fix --ext js,vue .", - "dev-server": "NODE_ENV=development nodemon server", - "dev-client": "npm run link-doc && NODE_ENV=development nuxt", + "lint": "eslint . && npm -w ui run lint", + "lint-fix": "eslint --fix . && npm -w ui run lint-fix", + "dev-api": "npm -w api run dev", + "dev-ui": "npm -w ui run dev", "dev-deps": "docker compose --profile dev up -d", "stop-dev-deps": "docker compose --profile dev stop", "dev-zellij": "zellij --layout .zellij.kdl", - "build": "npm run link-doc && nuxt build --no-generate", - "start": "node server", - "analyze": "nuxt build --no-generate --analyze", - "doc": "nuxt --config-file ${PWD}/doc/nuxt.config.js", - "link-doc": "ln -nsf ${PWD}/doc/pages/doc public/pages/doc", - "build-doc": "nuxt generate --config-file ${PWD}/doc/nuxt.config.js", - "build-types": "df-build-types --mjs types", - "postinstall": "patch-package", - "prepare": "husky install", - "check-types": "tsc" + "build-types": "mkdir -p ui/src/components/vjsf && rm -f ui/src/components/vjsf/* && df-build-types . --vjsf-dir ui/src/components/vjsf", + "prepare": "husky || true", + "check-types": "tsc && npm -w ui run check-types", + "quality": "npm run test-deps && npm run lint && npm run build-types && npm run check-types && npm run test" }, "repository": { "type": "git", "url": "git+https://github.com/koumoul-dev/simple-directory.git" }, + "workspaces": [ + "ui", + "api", + "shared" + ], "author": "", "license": "AGPL-3.0-only", - "eslintConfig": { - "root": true, - "env": { - "node": true - }, - "plugins": [ - "no-only-tests" - ], - "extends": [ - "plugin:vue/essential", - "eslint:recommended", - "standard", - "plugin:vue/recommended" - ], - "rules": { - "vue/no-v-html": "off", - "vue/multi-word-component-names": "off", - "node/no-deprecated-api": "off", - "vue/no-mutating-props": "off", - "vue/require-prop-types": "off", - "vue/no-useless-template-attributes": "off" - } - }, "bugs": { "url": "https://github.com/koumoul-dev/simple-directory/issues" }, "homepage": "https://github.com/koumoul-dev/simple-directory#readme", "devDependencies": { - "@commitlint/cli": "^17.5.0", - "@commitlint/config-conventional": "^17.4.4", - "@data-fair/sd-vue": "^2.6.1", - "@koumoul/v-iframe": "^0.20.3", - "@koumoul/vjsf": "^2.21.3", - "@koumoul/vue-multianalytics": "^1.10.1", - "@mdi/font": "^7.0.96", - "@nuxtjs/google-fonts": "^1.3.0", - "@nuxtjs/markdownit": "^2.0.0", - "@nuxtjs/vuetify": "^1.12.3", - "clean-modules": "^2.0.4", - "eslint": "^7.32.0", - "eslint-config-standard": "^16.0.3", - "eslint-plugin-import": "^2.25.4", - "eslint-plugin-no-only-tests": "^2.6.0", - "eslint-plugin-node": "^11.1.0", - "eslint-plugin-promise": "^5.1.1", - "eslint-plugin-vue": "^8.5.0", - "husky": "^8.0.3", - "iframe-resizer": "^4.0.1", - "jwt-decode": "^4.0.0", - "mocha": "^9.2.1", - "nodemon": "^2.0.22", - "nuxt": "^2.17.3", - "nyc": "^15.1.0", - "patch-package": "^6.5.1", - "semver-extract": "^1.1.1", - "tinycolor2": "^1.4.2", - "typescript": "^5.3.3", - "vue": "^2.7.16", - "vue-cropperjs": "^4.1.0", - "vue-i18n": "^8.28.2", - "vue-moment": "^4.1.0", - "vue-router": "^3.6.5", - "vuetify": "2.6.14" + "@commitlint/config-conventional": "^19.2.2", + "@data-fair/lib-express": "^1.10.0", + "@data-fair/lib-node": "^2.2.1", + "@reporters/bail": "^1.2.1", + "@types/accept-language-parser": "^1.5.6", + "@types/capitalize": "^2.0.2", + "@types/config": "^3.3.3", + "@types/cookie-parser": "^1.4.7", + "@types/cookies": "^0.9.0", + "@types/gm": "^1.25.4", + "@types/ldapjs": "^3.0.6", + "@types/material-colors": "^1.2.3", + "@types/memoizee": "^0.4.11", + "@types/mjml": "^4.7.4", + "@types/multer": "^1.4.12", + "@types/node-cron": "^3.0.11", + "@types/nodemailer": "^6.4.16", + "@types/qrcode": "^1.5.5", + "@types/seedrandom": "^3.0.8", + "@types/simple-oauth2": "^5.0.7", + "@types/tinycolor2": "^1.4.6", + "@types/useragent": "^2.3.4", + "commitlint": "^19.2.2", + "eslint": "^9.10.0", + "eslint-plugin-vue": "^9.29.0", + "eslint-plugin-vuetify": "^2.5.1", + "husky": "^9.1.6", + "neostandard": "^0.11.5", + "oauth2-mock-server": "^7.1.2", + "tough-cookie": "^5.0.0", + "typescript": "~5.6.3" }, "dependencies": { - "@data-fair/lib": "^0.49.1", - "@data-fair/sd-express": "^1.4.0", - "@koumoul/nuxt-config-inject": "^0.4.10", - "@nuxtjs/axios": "^5.13.6", - "@nuxtjs/i18n": "^7.3.1", - "accept-language-parser": "^1.5.0", - "ajv-i18n": "^4.2.0", - "axios": "^1.3.4", - "body-parser": "^1.18.3", - "cacheable-lookup": "^6.0.4", - "capitalize": "^2.0.4", - "config": "^1.31.0", - "cookie-parser": "^1.4.3", - "cookie-universal-nuxt": "^2.1.5", - "cookies": "^0.7.3", - "cors": "^2.8.5", - "csv-stringify": "^6.2.4", - "dayjs": "^1.10.7", - "debug": "^4.3.4", - "email-validator": "^2.0.4", - "escape-string-regexp": "^4.0.0", - "event-to-promise": "^0.8.0", - "express": "^4.18.2", - "fast-json-stringify": "^5.12.0", - "flat": "^5.0.2", - "flatstr": "^1.0.12", - "fs-extra": "^8.1.0", - "gm": "^1.25.0", - "http-errors": "^2.0.0", - "http-terminator": "^3.2.0", - "initials": "^3.1.2", - "json-schema-to-typescript": "^11.0.5", - "json-web-key": "^0.3.0", - "jsonwebtoken": "^9.0.0", - "jwks-rsa": "^3.0.1", - "ldapjs": "^2.2.3", - "material-colors": "^1.2.6", - "memoizee": "^0.4.15", - "mjml": "^4.8.1", - "moment": "^2.29.4", - "mongodb": "^5.8.1", - "multer": "^1.4.4-lts.1", - "nanoid": "^5.0.8", - "node-cron": "^3.0.0", - "nodemailer": "^6.9.1", - "nuxt-start": "^2.16.3", - "otplib": "^12.0.1", - "prom-client": "^14.0.0", - "qrcode": "^1.4.4", - "rate-limiter-flexible": "^2.0.0", - "request-ip": "^2.1.3", - "samlify": "2.8.8", - "seedrandom": "^3.0.5", - "shortid": "^2.2.13", - "simple-oauth2": "^5.0.0", - "slugify": "^1.6.5", - "uuid": "^8.3.2", - "vuex": "^3.6.2" + "@data-fair/lib-types-builder": "^1.6.0", + "@koumoul/vjsf-compiler": "^0.2.2", + "@types/vue-cropperjs": "^4.1.6", + "@types/debug": "^4.1.12" }, - "overrides": { - "@data-fair/lib": { - "vue": "$vue", - "vuetify": "$vuetify", - "vue-router": "vue-router", - "vue-i18n": "vue-i18n", - "mongodb": "$mongodb", - "prom-client": "$prom-client" - }, - "@nuxtjs/axios": { - "axios": "0" - } + "relativeDependencies": { + "@data-fair/lib-vuetify": "../lib/packages/vuetify", + "@data-fair/lib-vue": "../lib/packages/vue" } } diff --git a/patches/@nuxt+server+2.18.1.patch b/patches/@nuxt+server+2.18.1.patch deleted file mode 100644 index fa748402..00000000 --- a/patches/@nuxt+server+2.18.1.patch +++ /dev/null @@ -1,13 +0,0 @@ -diff --git a/node_modules/@nuxt/server/dist/server.js b/node_modules/@nuxt/server/dist/server.js -index 21bfc34..777eb07 100644 ---- a/node_modules/@nuxt/server/dist/server.js -+++ b/node_modules/@nuxt/server/dist/server.js -@@ -23,7 +23,7 @@ const Youch = require('@nuxtjs/youch'); - const http = require('http'); - const https = require('https'); - const enableDestroy = require('server-destroy'); --const ip = require('ip'); -+const ip = require('neoip'); - const pify = require('pify'); - const onHeaders = require('on-headers'); - diff --git a/patches/samlify+2.8.8.patch b/patches/samlify+2.8.8.patch deleted file mode 100644 index 01ed3b50..00000000 --- a/patches/samlify+2.8.8.patch +++ /dev/null @@ -1,105 +0,0 @@ -diff --git a/node_modules/samlify/build/src/libsaml.js b/node_modules/samlify/build/src/libsaml.js -index 28cf6b3..02acb46 100644 ---- a/node_modules/samlify/build/src/libsaml.js -+++ b/node_modules/samlify/build/src/libsaml.js -@@ -200,7 +200,7 @@ var libSaml = function () { - * @return {string} - */ - function tagging(prefix, content) { -- var camelContent = (0, camelcase_1.default)(content); -+ var camelContent = (0, camelcase_1.default)(content, { locale: 'en-us' }); - return prefix + camelContent.charAt(0).toUpperCase() + camelContent.slice(1); - } - return { -@@ -453,7 +453,7 @@ var libSaml = function () { - constructMessageSignature: function (octetString, key, passphrase, isBase64, signingAlgorithm) { - // Default returning base64 encoded signature - // Embed with node-rsa module -- var decryptedKey = new node_rsa_1.default(utility_1.default.readPrivateKey(key, passphrase), 'private', { -+ var decryptedKey = new node_rsa_1.default(utility_1.default.readPrivateKey(key, passphrase), undefined, { - signingScheme: getSigningScheme(signingAlgorithm), - }); - var signature = decryptedKey.sign(octetString); -@@ -531,7 +531,11 @@ var libSaml = function () { - } - var encAssertionPrefix = sourceEntitySetting.tagPrefix.encryptedAssertion; - var encryptAssertionNode = new dom().parseFromString("<".concat(encAssertionPrefix, ":EncryptedAssertion xmlns:").concat(encAssertionPrefix, "=\"").concat(urn_1.namespace.names.assertion, "\">").concat(res, "")); -- doc.replaceChild(encryptAssertionNode, assertions[0]); -+ var parent = assertions[0].parentNode; -+ if (parent) { -+ parent.appendChild(encryptAssertionNode); -+ parent.removeChild(assertions[0]); -+ } - return resolve(utility_1.default.base64Encode(doc.toString())); - }); - } -@@ -575,7 +579,11 @@ var libSaml = function () { - return reject(new Error('ERR_UNDEFINED_ENCRYPTED_ASSERTION')); - } - var assertionNode = new dom().parseFromString(res); -- xml.replaceChild(assertionNode, encryptedAssertions[0]); -+ var parent = encryptedAssertions[0].parentNode; -+ if (parent) { -+ parent.appendChild(assertionNode); -+ parent.removeChild(encryptedAssertions[0]); -+ } - return resolve([xml.toString(), res]); - }); - }); -diff --git a/node_modules/samlify/build/src/libsaml.js.map b/node_modules/samlify/build/src/libsaml.js.map -index bcb4575..895de4a 100644 ---- a/node_modules/samlify/build/src/libsaml.js.map -+++ b/node_modules/samlify/build/src/libsaml.js.map -@@ -1 +1 @@ --{"version":3,"file":"libsaml.js","sourceRoot":"","sources":["../../src/libsaml.ts"],"names":[],"mappings":";AAAA;;;;EAIE;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAEF,yCAA2C;AAC3C,mDAA2D;AAC3D,6BAAuD;AACvD,+BAA+B;AAE/B,sDAAmD;AACnD,yCAAoD;AACpD,+DAAmD;AACnD,yCAAsC;AACtC,wDAAkC;AAClC,6BAAmC;AAEnC,IAAM,mBAAmB,GAAG,gBAAU,CAAC,SAAS,CAAC;AACjD,IAAM,gBAAgB,GAAG,gBAAU,CAAC,MAAM,CAAC;AAC3C,IAAM,OAAO,GAAG,aAAO,CAAC,OAAO,CAAC;AAChC,IAAM,SAAS,GAAG,aAAO,CAAC,SAAS,CAAC;AACpC,IAAM,GAAG,GAAG,kBAAS,CAAC;AA6FtB,IAAM,OAAO,GAAG;IAEd;;;MAGE;IACF,SAAS,mBAAmB,CAAC,IAAY;QACvC,IAAI,CAAC,SAAS,CAAC,aAAa,EAAE,SAAS,CAAC,WAAW,CAAC,CAAC,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,EAAE;YACzE,OAAO,aAAa,CAAC;SACtB;QACD,IAAI,CAAC,SAAS,CAAC,cAAc,EAAE,SAAS,CAAC,YAAY,CAAC,CAAC,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,EAAE;YAC3E,OAAO,cAAc,CAAC;SACvB;QACD,MAAM,IAAI,KAAK,CAAC,4BAA4B,CAAC,CAAC;IAChD,CAAC;IACD;;OAEG;IACH,IAAM,gBAAgB,GAAG;QACvB,4CAA4C,EAAE,YAAY;QAC1D,mDAAmD,EAAE,cAAc;QACnE,mDAAmD,EAAE,cAAc;KACpE,CAAC;IACF;;;MAGE;IACF,IAAM,2BAA2B,GAAG;QAClC,OAAO,EAAE,4cAA4c;KACtd,CAAC;IACF;;;MAGE;IACF,IAAM,4BAA4B,GAAG;QACnC,OAAO,EAAE,mUAAmU;KAC7U,CAAC;IAEF;;;MAGE;IACF,IAAM,iCAAiC,GAAG;QACxC,OAAO,EAAE,iEAAiE;KAC3E,CAAC;IAEF;;;MAGE;IACF,IAAM,wBAAwB,GAAG;QAC/B,OAAO,EAAE,6MAA6M;KACvN,CAAC;IAEF;;;MAGE;IACF,IAAM,4BAA4B,GAAG;QACnC,OAAO,EAAE,qrCAAqrC;QAC9rC,UAAU,EAAE,EAAE;QACd,mBAAmB,EAAE;YACnB,4BAA4B,EAAE,iCAAiC;YAC/D,mBAAmB,EAAE,wBAAwB;SAC9C;KACF,CAAC;IACF;;;MAGE;IACF,IAAM,6BAA6B,GAAG;QACpC,OAAO,EAAE,6WAA6W;KACvX,CAAC;IACF;;;;;MAKE;IACF,SAAS,gBAAgB,CAAC,MAAe;QACvC,IAAI,MAAM,EAAE;YACV,IAAM,QAAQ,GAAG,gBAAgB,CAAC,MAAM,CAAC,CAAC;YAC1C,IAAI,CAAC,CAAC,QAAQ,KAAK,SAAS,CAAC,EAAE;gBAC7B,OAAO,QAAQ,CAAC;aACjB;SACF;QACD,OAAO,gBAAgB,CAAC,mBAAmB,CAAC,QAAQ,CAAC,CAAC;IACxD,CAAC;IACD;;;;;MAKE;IACF,SAAS,eAAe,CAAC,MAAc;QACrC,IAAM,SAAS,GAAG,gBAAgB,CAAC,MAAM,CAAC,CAAC;QAC3C,IAAI,CAAC,CAAC,SAAS,KAAK,SAAS,CAAC,EAAE;YAC9B,OAAO,SAAS,CAAC;SAClB;QACD,OAAO,IAAI,CAAC,CAAC,gBAAgB;IAC/B,CAAC;IACD;;;;;;MAME;IACF,SAAS,WAAW,CAAC,KAAK,EAAE,YAAsB;QAChD,IAAI,IAAA,kBAAQ,EAAC,KAAK,CAAC,EAAE;YACnB,OAAO,YAAY,KAAK,IAAI,CAAC,CAAC,CAAC,qBAAqB,GAAG,KAAK,GAAG,WAAW,CAAC,CAAC,CAAC,qBAAqB,GAAG,KAAK,GAAG,IAAI,CAAC;SACnH;QACD,OAAO,qBAAqB,GAAG,KAAK,CAAC,IAAI,GAAG,MAAM,GAAG,KAAK,CAAC,IAAI,CAAC;IAClE,CAAC;IAED;;;;;;OAMG;IACH,SAAS,OAAO,CAAC,MAAc,EAAE,OAAe;QAC9C,IAAM,YAAY,GAAG,IAAA,mBAAS,EAAC,OAAO,CAAC,CAAC;QACxC,OAAO,MAAM,GAAG,YAAY,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,WAAW,EAAE,GAAG,YAAY,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;IAC/E,CAAC;IAED,OAAO;QAEL,WAAW,aAAA;QACX,mBAAmB,qBAAA;QACnB,2BAA2B,6BAAA;QAC3B,4BAA4B,8BAAA;QAC5B,iCAAiC,mCAAA;QACjC,wBAAwB,0BAAA;QACxB,4BAA4B,8BAAA;QAC5B,6BAA6B,+BAAA;QAE7B;;;;;UAKE;QACF,kBAAkB,YAAC,MAAc,EAAE,SAAc;YAC/C,MAAM,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC,OAAO,CAAC,UAAA,CAAC;gBAC9B,MAAM,GAAG,MAAM,CAAC,OAAO,CAAC,IAAI,MAAM,CAAC,WAAI,CAAC,MAAG,EAAE,GAAG,CAAC,EAAE,SAAS,CAAC,CAAC,CAAC,CAAC,CAAC;YACnE,CAAC,CAAC,CAAC;YACH,OAAO,MAAM,CAAC;QAChB,CAAC;QACD;;;;;;UAME;QACF,yBAAyB,YACvB,UAAoC,EACpC,iBAA+D,EAC/D,0BAA0F;YAD1F,kCAAA,EAAA,4CAA+D;YAC/D,2CAAA,EAAA,8DAA0F;YAE1F,IAAM,IAAI,GAAG,UAAU,CAAC,GAAG,CAAC,UAAC,EAAyE;oBAAvE,IAAI,UAAA,EAAE,UAAU,gBAAA,EAAE,QAAQ,cAAA,EAAE,YAAY,kBAAA,EAAE,YAAY,kBAAA,EAAE,aAAa,mBAAA;gBAClG,IAAM,mBAAmB,GAAG,kCAAkC,CAAC;gBAC/D,IAAM,oBAAoB,GAAG,2CAA2C,CAAC;gBACzE,IAAI,aAAa,GAAG,iBAAiB,CAAC,OAAO,CAAC;gBAC9C,aAAa,GAAG,aAAa,CAAC,OAAO,CAAC,QAAQ,EAAE,IAAI,CAAC,CAAC;gBACtD,aAAa,GAAG,aAAa,CAAC,OAAO,CAAC,cAAc,EAAE,UAAU,CAAC,CAAC;gBAClE,aAAa,GAAG,aAAa,CAAC,OAAO,CAAC,gBAAgB,EAAE,YAAY,CAAC,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,mBAAmB,CAAC,CAAC;gBAC3G,aAAa,GAAG,aAAa,CAAC,OAAO,CAAC,iBAAiB,EAAE,aAAa,CAAC,CAAC,CAAC,aAAa,CAAC,CAAC,CAAC,oBAAoB,CAAC,CAAC;gBAC/G,aAAa,GAAG,aAAa,CAAC,OAAO,CAAC,gBAAgB,EAAE,YAAY,CAAC,CAAC;gBACtE,aAAa,GAAG,aAAa,CAAC,OAAO,CAAC,SAAS,EAAE,WAAI,OAAO,CAAC,MAAM,EAAE,QAAQ,CAAC,MAAG,CAAC,CAAC;gBACnF,OAAO,aAAa,CAAC;YACvB,CAAC,CAAC,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;YACZ,OAAO,0BAA0B,CAAC,OAAO,CAAC,OAAO,CAAC,cAAc,EAAE,IAAI,CAAC,CAAC;QAC1E,CAAC;QAED;;;;;;;;;;UAUE;QACF,sBAAsB,YAAC,IAA0B;YAE7C,IAAA,cAAc,GAaZ,IAAI,eAbQ,EACd,iBAAiB,GAYf,IAAI,kBAZW,EACjB,UAAU,GAWR,IAAI,WAXI,EACV,cAAc,GAUZ,IAAI,eAVQ,EACd,KASE,IAAI,mBAT6C,EAAnD,kBAAkB,mBAAG,mBAAmB,CAAC,UAAU,KAAA,EACnD,KAQE,IAAI,yBALL,EAHD,wBAAwB,mBAAG;gBACzB,uDAAuD;gBACvD,yCAAyC;aAC1C,KAAA,EACD,WAAW,GAIT,IAAI,YAJK,EACX,eAAe,GAGb,IAAI,gBAHS,EACf,KAEE,IAAI,eAFe,EAArB,cAAc,mBAAG,IAAI,KAAA,EACrB,KACE,IAAI,gBADiB,EAAvB,eAAe,mBAAG,KAAK,KAAA,CAChB;YACT,IAAM,GAAG,GAAG,IAAI,sBAAS,EAAE,CAAC;YAC5B,sCAAsC;YACtC,IAAI,iBAAiB,EAAE;gBACrB,GAAG,CAAC,YAAY,CACd,iBAAiB,EACjB,wBAAwB,EACxB,eAAe,CAAC,kBAAkB,CAAC,CACpC,CAAC;aACH;YACD,IAAI,eAAe,EAAE;gBACnB,GAAG,CAAC,YAAY;gBACd,6BAA6B;gBAC7B,IAAI,EACJ,wBAAwB,EACxB,eAAe,CAAC,kBAAkB,CAAC,EACnC,EAAE,EACF,EAAE,EACF,EAAE,EACF,KAAK,CACN,CAAC;aACH;YACD,GAAG,CAAC,kBAAkB,GAAG,kBAAkB,CAAC;YAC5C,GAAG,CAAC,eAAe,GAAG,IAAI,IAAI,CAAC,UAAU,CAAC,WAAW,EAAE,eAAe,CAAC,CAAC;YACxE,GAAG,CAAC,UAAU,GAAG,iBAAO,CAAC,cAAc,CAAC,UAAU,EAAE,cAAc,EAAE,IAAI,CAAC,CAAC;YAC1E,IAAI,eAAe,EAAE;gBACnB,GAAG,CAAC,gBAAgB,CAAC,cAAc,EAAE,eAAe,CAAC,CAAC;aACvD;iBAAM;gBACL,GAAG,CAAC,gBAAgB,CAAC,cAAc,CAAC,CAAC;aACtC;YACD,OAAO,cAAc,KAAK,KAAK,CAAC,CAAC,CAAC,iBAAO,CAAC,YAAY,CAAC,GAAG,CAAC,YAAY,EAAE,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,YAAY,EAAE,CAAC;QAClG,CAAC;QACD;;;;;UAKE;QACF,eAAe,YAAC,GAAW,EAAE,IAA8B;YAA3D,iBA+IC;YA7IC,IAAM,GAAG,GAAG,IAAI,GAAG,EAAE,CAAC,eAAe,CAAC,GAAG,CAAC,CAAC;YAC3C,iIAAiI;YACjI,sDAAsD;YACtD,IAAM,qBAAqB,GAAG,0GAA0G,CAAC;YACzI,wDAAwD;YACxD,IAAM,uBAAuB,GAAG,uIAAuI,CAAC;YACxK,6DAA6D;YAC7D,IAAM,qBAAqB,GAAG,6OAA6O,CAAC;YAE5Q,4BAA4B;YAC5B,IAAI,SAAS,GAAQ,EAAE,CAAC;YACxB,IAAI,aAAa,GAAkB,IAAI,CAAC;YACxC,IAAM,oBAAoB,GAAG,IAAA,cAAM,EAAC,qBAAqB,EAAE,GAAG,CAAC,CAAC;YAChE,IAAM,sBAAsB,GAAG,IAAA,cAAM,EAAC,uBAAuB,EAAE,GAAG,CAAC,CAAC;YACpE,IAAM,mBAAmB,GAAG,IAAA,cAAM,EAAC,qBAAqB,EAAE,GAAG,CAAC,CAAC;YAE/D,SAAS,GAAG,SAAS,CAAC,MAAM,CAAC,oBAAoB,CAAC,CAAC;YACnD,SAAS,GAAG,SAAS,CAAC,MAAM,CAAC,sBAAsB,CAAC,CAAC;YAErD,yCAAyC;YACzC,IAAI,mBAAmB,CAAC,MAAM,KAAK,CAAC,EAAE;gBACpC,MAAM,IAAI,KAAK,CAAC,+BAA+B,CAAC,CAAC;aAClD;YAED,iDAAiD;YACjD,IAAI,SAAS,CAAC,MAAM,KAAK,CAAC,EAAE;gBAC1B,MAAM,IAAI,KAAK,CAAC,oBAAoB,CAAC,CAAC;aACvC;YAED,IAAM,GAAG,GAAG,IAAI,sBAAS,EAAE,CAAC;YAC5B,IAAI,QAAQ,GAAG,IAAI,CAAC;YACpB,4BAA4B;YAC5B,SAAS,CAAC,OAAO,CAAC,UAAA,aAAa;gBAE7B,GAAG,CAAC,kBAAkB,GAAG,IAAI,CAAC,kBAAkB,CAAC;gBAEjD,IAAI,CAAC,IAAI,CAAC,OAAO,IAAI,CAAC,IAAI,CAAC,QAAQ,EAAE;oBACnC,MAAM,IAAI,KAAK,CAAC,0CAA0C,CAAC,CAAC;iBAC7D;gBAED,IAAI,IAAI,CAAC,OAAO,EAAE;oBAChB,GAAG,CAAC,eAAe,GAAG,IAAI,wBAAW,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;iBACrD;gBAED,IAAI,IAAI,CAAC,QAAQ,EAAE;oBAEjB,IAAM,eAAe,GAAG,IAAA,cAAM,EAAC,uCAAuC,EAAE,aAAa,CAAQ,CAAC;oBAC9F,0BAA0B;oBAC1B,IAAI,YAAY,GAAQ,IAAI,CAAC,QAAQ,CAAC,kBAAkB,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC;oBAC1E,oEAAoE;oBACpE,IAAI,KAAK,CAAC,OAAO,CAAC,YAAY,CAAC,EAAE;wBAC/B,YAAY,GAAG,IAAA,qBAAW,EAAC,YAAY,CAAC,CAAC;qBAC1C;yBAAM,IAAI,OAAO,YAAY,KAAK,QAAQ,EAAE;wBAC3C,YAAY,GAAG,CAAC,YAAY,CAAC,CAAC;qBAC/B;oBACD,mCAAmC;oBACnC,YAAY,GAAG,YAAY,CAAC,GAAG,CAAC,iBAAO,CAAC,kBAAkB,CAAC,CAAC;oBAE5D,gDAAgD;oBAChD,IAAI,eAAe,CAAC,MAAM,KAAK,CAAC,IAAI,YAAY,CAAC,MAAM,KAAK,CAAC,EAAE;wBAC7D,MAAM,IAAI,KAAK,CAAC,yBAAyB,CAAC,CAAC;qBAC5C;oBAED,+BAA+B;oBAC/B,IAAI,eAAe,CAAC,MAAM,KAAK,CAAC,EAAE;wBAChC,IAAM,mBAAmB,GAAG,eAAe,CAAC,CAAC,CAAC,CAAC,UAAU,CAAC,IAAI,CAAC;wBAC/D,IAAM,iBAAe,GAAG,iBAAO,CAAC,kBAAkB,CAAC,mBAAmB,CAAC,CAAC;wBAExE,IACE,YAAY,CAAC,MAAM,IAAI,CAAC;4BACxB,CAAC,YAAY,CAAC,IAAI,CAAC,UAAA,IAAI,IAAI,OAAA,IAAI,CAAC,IAAI,EAAE,KAAK,iBAAe,CAAC,IAAI,EAAE,EAAtC,CAAsC,CAAC,EAClE;4BACA,sDAAsD;4BACtD,8EAA8E;4BAC9E,MAAM,IAAI,KAAK,CAAC,mDAAmD,CAAC,CAAC;yBACtE;wBAED,GAAG,CAAC,eAAe,GAAG,IAAI,KAAI,CAAC,UAAU,CAAC,iBAAe,CAAC,CAAC;qBAE5D;yBAAM;wBACL,iCAAiC;wBACjC,GAAG,CAAC,eAAe,GAAG,IAAI,KAAI,CAAC,UAAU,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC,CAAC;qBAC5D;iBAEF;gBAED,GAAG,CAAC,aAAa,CAAC,aAAa,CAAC,CAAC;gBAEjC,GAAG,CAAC,WAAW,CAAC,aAAa,CAAC,CAAC;gBAE/B,QAAQ,GAAG,QAAQ,IAAI,GAAG,CAAC,cAAc,CAAC,GAAG,CAAC,QAAQ,EAAE,CAAC,CAAC;gBAE1D,kFAAkF;gBAClF,IAAI,CAAC,QAAQ,EAAE;oBACb,MAAM,IAAI,KAAK,CAAC,gCAAgC,CAAC,CAAC;iBACnD;YAEH,CAAC,CAAC,CAAC;YAEH,+DAA+D;YAC/D,wDAAwD;YACxD,IAAI,oBAAoB,CAAC,MAAM,KAAK,CAAC,EAAE;gBACrC,IAAM,IAAI,GAAG,IAAA,cAAM,EAAC,0GAA0G,EAAE,GAAG,CAAC,CAAC;gBACrI,IAAI,IAAI,CAAC,MAAM,KAAK,CAAC,EAAE;oBACrB,aAAa,GAAG,IAAI,CAAC,CAAC,CAAC,CAAC,QAAQ,EAAE,CAAC;iBACpC;aACF;YAED,IAAI,sBAAsB,CAAC,MAAM,KAAK,CAAC,EAAE;gBACvC,IAAM,qBAAqB,GAAG,IAAA,mBAAO,EAAC,sBAAsB,CAAC,CAAC,CAAC,CAAC,QAAQ,EAAE,EAAE,CAAC;wBAC3E,GAAG,EAAE,QAAQ;wBACb,SAAS,EAAE,CAAC,WAAW,EAAE,YAAY,EAAE,WAAW,CAAC;wBACnD,UAAU,EAAE,CAAC,KAAK,CAAC;qBACpB,CAAC,CAAC,CAAC;gBACJ,8DAA8D;gBAC9D,IAAM,oBAAoB,GAAG,IAAA,mBAAO,EAAC,GAAG,CAAC,QAAQ,EAAE,EAAE,CAAC;wBACpD,GAAG,EAAE,IAAI;wBACT,SAAS,EAAE,CAAC,WAAW,EAAE,WAAW,CAAC;wBACrC,UAAU,EAAE,CAAC,IAAI,CAAC;qBACnB,CAAC,CAAC,CAAC;gBACJ,mBAAmB;gBACnB,wGAAwG;gBACxG,yGAAyG;gBACzG,wGAAwG;gBACxG,gEAAgE;gBAChE,iGAAiG;gBACjG,6GAA6G;gBAC7G,oGAAoG;gBACpG,IAAI,qBAAqB,CAAC,MAAM,KAAK,WAAI,oBAAoB,CAAC,EAAE,CAAE,EAAE;oBAClE,MAAM,IAAI,KAAK,CAAC,+BAA+B,CAAC,CAAC;iBAClD;gBACD,IAAM,WAAW,GAAG,IAAA,mBAAO,EAAC,GAAG,CAAC,QAAQ,EAAE,EAAE,CAAC;wBAC3C,GAAG,EAAE,WAAW;wBAChB,SAAS,EAAE,CAAC,WAAW,EAAE,WAAW,CAAC;wBACrC,UAAU,EAAE,EAAE;wBACd,OAAO,EAAE,IAAI;qBACd,CAAC,CAAC,CAAC;gBACJ,aAAa,GAAG,WAAW,CAAC,SAAS,CAAC,QAAQ,EAAE,CAAC;aAClD;YAED,OAAO,CAAC,QAAQ,EAAE,aAAa,CAAC,CAAC;QACnC,CAAC;QACD;;;;;UAKE;QACF,gBAAgB,YAAC,GAAW,EAAE,UAA2B;;YACvD;gBACE,GAAC,eAAe,IAAG;oBACjB;wBACE,KAAK,EAAE,EAAE,GAAG,KAAA,EAAE;qBACf;;wBAEC,GAAC,YAAY,IAAG;4BACd;gCACE,KAAK,EAAE;oCACL,UAAU,EAAE,oCAAoC;iCACjD;6BACF;;gCAEC,GAAC,aAAa,IAAG,CAAC;wCAChB,oBAAoB,EAAE,iBAAO,CAAC,kBAAkB,CAAC,UAAU,CAAC;qCAC7D,CAAC;;yBAEL;;iBACD;mBACJ;QACJ,CAAC;QACD;;;;;;;UAOE;QACF,yBAAyB,YACvB,WAAmB,EACnB,GAAW,EACX,UAAmB,EACnB,QAAkB,EAClB,gBAAyB;YAEzB,6CAA6C;YAC7C,6BAA6B;YAC7B,IAAM,YAAY,GAAG,IAAI,kBAAI,CAC3B,iBAAO,CAAC,cAAc,CAAC,GAAG,EAAE,UAAU,CAAC,EACvC,SAAS,EACT;gBACE,aAAa,EAAE,gBAAgB,CAAC,gBAAgB,CAAC;aAClD,CACF,CAAC;YACF,IAAM,SAAS,GAAG,YAAY,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC;YACjD,+BAA+B;YAC/B,OAAO,QAAQ,KAAK,KAAK,CAAC,CAAC,CAAC,SAAS,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC;QACvE,CAAC;QACD;;;;;;;UAOE;QACF,sBAAsB,YACpB,QAAQ,EACR,WAAmB,EACnB,SAA0B,EAC1B,eAAwB;YAExB,IAAM,QAAQ,GAAG,QAAQ,CAAC,kBAAkB,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC;YAC9D,IAAM,aAAa,GAAG,gBAAgB,CAAC,eAAe,CAAC,CAAC;YACxD,IAAM,GAAG,GAAG,IAAI,kBAAI,CAAC,iBAAO,CAAC,8BAA8B,CAAC,QAAQ,CAAC,EAAE,QAAQ,EAAE,EAAE,aAAa,eAAA,EAAE,CAAC,CAAC;YACpG,OAAO,GAAG,CAAC,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,WAAW,CAAC,EAAE,MAAM,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC,CAAC;QACtE,CAAC;QACD;;;;UAIE;QACF,UAAU,YAAC,eAAuB,EAAE,eAAyB;YAAzB,gCAAA,EAAA,oBAAyB;YAC3D,IAAI,CAAC,UAAU,GAAG,UAAA,GAAG;gBACnB,IAAM,MAAM,GAAG,eAAe,CAAC,MAAM,CAAC,CAAC,CAAC,UAAG,eAAe,CAAC,MAAM,MAAG,CAAC,CAAC,CAAC,EAAE,CAAC;gBAC1E,OAAO,WAAI,MAAM,uBAAa,MAAM,6BAAmB,eAAe,eAAK,MAAM,+BAAqB,MAAM,cAAW,CAAC;YAC1H,CAAC,CAAC;YACF,IAAI,CAAC,MAAM,GAAG,UAAA,OAAO;gBACnB,OAAO,iBAAO,CAAC,8BAA8B,CAAC,eAAe,CAAC,CAAC,QAAQ,EAAE,CAAC;YAC5E,CAAC,CAAC;QACJ,CAAC;QACD;;;;;;UAME;QACF,gBAAgB,YAAC,YAAY,EAAE,YAAY,EAAE,GAAY;YACvD,iDAAiD;YACjD,OAAO,IAAI,OAAO,CAAS,UAAC,OAAO,EAAE,MAAM;gBAEzC,IAAI,CAAC,GAAG,EAAE;oBACR,OAAO,MAAM,CAAC,IAAI,KAAK,CAAC,yBAAyB,CAAC,CAAC,CAAC;iBACrD;gBAED,IAAM,mBAAmB,GAAG,YAAY,CAAC,aAAa,CAAC;gBACvD,IAAM,oBAAoB,GAAG,YAAY,CAAC,UAAU,CAAC;gBACrD,IAAM,GAAG,GAAG,IAAI,GAAG,EAAE,CAAC,eAAe,CAAC,GAAG,CAAC,CAAC;gBAC3C,IAAM,UAAU,GAAG,IAAA,cAAM,EAAC,gCAAgC,EAAE,GAAG,CAAW,CAAC;gBAC3E,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,UAAU,CAAC,EAAE;oBAC9B,MAAM,IAAI,KAAK,CAAC,kBAAkB,CAAC,CAAC;iBACrC;gBACD,IAAI,UAAU,CAAC,MAAM,KAAK,CAAC,EAAE;oBAC3B,MAAM,IAAI,KAAK,CAAC,wBAAwB,CAAC,CAAC;iBAC3C;gBAED,8DAA8D;gBAC9D,IAAI,mBAAmB,CAAC,oBAAoB,EAAE;oBAE5C,IAAM,YAAY,GAAG,iBAAO,CAAC,8BAA8B,CAAC,oBAAoB,CAAC,kBAAkB,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC,CAAC;oBAEtH,MAAM,CAAC,OAAO,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC,QAAQ,EAAE,EAAE;wBACvC,4BAA4B;wBAC5B,OAAO,EAAE,MAAM,CAAC,IAAI,CAAC,YAAY,CAAC;wBAClC,GAAG,EAAE,MAAM,CAAC,IAAI,CAAC,qCAA8B,oBAAoB,CAAC,kBAAkB,CAAC,OAAO,CAAC,OAAO,CAAC,8BAA2B,CAAC;wBACnI,mBAAmB,EAAE,mBAAmB,CAAC,uBAAuB;wBAChE,sBAAsB,EAAE,mBAAmB,CAAC,sBAAsB;qBACnE,EAAE,UAAC,GAAG,EAAE,GAAG;wBACV,IAAI,GAAG,EAAE;4BACP,OAAO,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;4BACnB,OAAO,MAAM,CAAC,IAAI,KAAK,CAAC,uCAAuC,CAAC,CAAC,CAAC;yBACnE;wBACD,IAAI,CAAC,GAAG,EAAE;4BACR,OAAO,MAAM,CAAC,IAAI,KAAK,CAAC,mCAAmC,CAAC,CAAC,CAAC;yBAC/D;wBACO,IAAoB,kBAAkB,GAAK,mBAAmB,CAAC,SAAS,mBAAlC,CAAmC;wBACjF,IAAM,oBAAoB,GAAG,IAAI,GAAG,EAAE,CAAC,eAAe,CAAC,WAAI,kBAAkB,uCAA6B,kBAAkB,gBAAK,eAAS,CAAC,KAAK,CAAC,SAAS,gBAAK,GAAG,eAAK,kBAAkB,yBAAsB,CAAC,CAAC;wBACjN,GAAG,CAAC,YAAY,CAAC,oBAAoB,EAAE,UAAU,CAAC,CAAC,CAAC,CAAC,CAAC;wBACtD,OAAO,OAAO,CAAC,iBAAO,CAAC,YAAY,CAAC,GAAG,CAAC,QAAQ,EAAE,CAAC,CAAC,CAAC;oBACvD,CAAC,CAAC,CAAC;iBACJ;qBAAM;oBACL,OAAO,OAAO,CAAC,iBAAO,CAAC,YAAY,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,2BAA2B;iBACvE;YACH,CAAC,CAAC,CAAC;QACL,CAAC;QACD;;;;;;;UAOE;QACF,gBAAgB,YAAC,IAAI,EAAE,SAAiB;YACtC,OAAO,IAAI,OAAO,CAAgB,UAAC,OAAO,EAAE,MAAM;gBAChD,sDAAsD;gBACtD,IAAI,CAAC,SAAS,EAAE;oBACd,OAAO,MAAM,CAAC,IAAI,KAAK,CAAC,yBAAyB,CAAC,CAAC,CAAC;iBACrD;gBACD,2FAA2F;gBAC3F,IAAM,WAAW,GAAG,IAAI,CAAC,aAAa,CAAC;gBACvC,IAAM,GAAG,GAAG,IAAI,GAAG,EAAE,CAAC,eAAe,CAAC,SAAS,CAAC,CAAC;gBACjD,IAAM,mBAAmB,GAAG,IAAA,cAAM,EAAC,8EAA8E,EAAE,GAAG,CAAW,CAAC;gBAClI,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,mBAAmB,CAAC,EAAE;oBACvC,MAAM,IAAI,KAAK,CAAC,mCAAmC,CAAC,CAAC;iBACtD;gBACD,IAAI,mBAAmB,CAAC,MAAM,KAAK,CAAC,EAAE;oBACpC,MAAM,IAAI,KAAK,CAAC,wBAAwB,CAAC,CAAC;iBAC3C;gBACD,OAAO,MAAM,CAAC,OAAO,CAAC,mBAAmB,CAAC,CAAC,CAAC,CAAC,QAAQ,EAAE,EAAE;oBACvD,GAAG,EAAE,iBAAO,CAAC,cAAc,CAAC,WAAW,CAAC,aAAa,EAAE,WAAW,CAAC,iBAAiB,CAAC;iBACtF,EAAE,UAAC,GAAG,EAAE,GAAG;oBACV,IAAI,GAAG,EAAE;wBACP,OAAO,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;wBACnB,OAAO,MAAM,CAAC,IAAI,KAAK,CAAC,uCAAuC,CAAC,CAAC,CAAC;qBACnE;oBACD,IAAI,CAAC,GAAG,EAAE;wBACR,OAAO,MAAM,CAAC,IAAI,KAAK,CAAC,mCAAmC,CAAC,CAAC,CAAC;qBAC/D;oBACD,IAAM,aAAa,GAAG,IAAI,GAAG,EAAE,CAAC,eAAe,CAAC,GAAG,CAAC,CAAC;oBACrD,GAAG,CAAC,YAAY,CAAC,aAAa,EAAE,mBAAmB,CAAC,CAAC,CAAC,CAAC,CAAC;oBACxD,OAAO,OAAO,CAAC,CAAC,GAAG,CAAC,QAAQ,EAAE,EAAE,GAAG,CAAC,CAAC,CAAC;gBACxC,CAAC,CAAC,CAAC;YACL,CAAC,CAAC,CAAC;QACL,CAAC;QACD;;WAEG;QACG,UAAU,YAAC,KAAa;;;;;;4BAGpB,QAAQ,GAAK,IAAA,gBAAU,GAAE,SAAjB,CAAkB;4BAElC;;;;;+BAKG;4BACH,IAAI,CAAC,QAAQ,EAAE;gCAEb,qCAAqC;gCACrC,sBAAO,OAAO,CAAC,MAAM,CAAC,+LAA+L,CAAC,EAAC;6BAExN;;;;4BAGQ,qBAAM,QAAQ,CAAC,KAAK,CAAC,EAAA;gCAA5B,sBAAO,SAAqB,EAAC;;;4BAE7B,MAAM,GAAC,CAAC;;;;;SAGX;KACF,CAAC;AACJ,CAAC,CAAC;AAEF,kBAAe,OAAO,EAAE,CAAC"} -\ No newline at end of file -+{"version":3,"file":"libsaml.js","sourceRoot":"","sources":["../../src/libsaml.ts"],"names":[],"mappings":";AAAA;;;;EAIE;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAEF,yCAA2C;AAC3C,mDAA2D;AAC3D,6BAAuD;AACvD,+BAA+B;AAE/B,sDAAmD;AACnD,yCAAoD;AACpD,+DAAmD;AACnD,yCAAsC;AACtC,wDAAkC;AAClC,6BAAmC;AAEnC,IAAM,mBAAmB,GAAG,gBAAU,CAAC,SAAS,CAAC;AACjD,IAAM,gBAAgB,GAAG,gBAAU,CAAC,MAAM,CAAC;AAC3C,IAAM,OAAO,GAAG,aAAO,CAAC,OAAO,CAAC;AAChC,IAAM,SAAS,GAAG,aAAO,CAAC,SAAS,CAAC;AACpC,IAAM,GAAG,GAAG,kBAAS,CAAC;AA6FtB,IAAM,OAAO,GAAG;IAEd;;;MAGE;IACF,SAAS,mBAAmB,CAAC,IAAY;QACvC,IAAI,CAAC,SAAS,CAAC,aAAa,EAAE,SAAS,CAAC,WAAW,CAAC,CAAC,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,EAAE;YACzE,OAAO,aAAa,CAAC;SACtB;QACD,IAAI,CAAC,SAAS,CAAC,cAAc,EAAE,SAAS,CAAC,YAAY,CAAC,CAAC,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,EAAE;YAC3E,OAAO,cAAc,CAAC;SACvB;QACD,MAAM,IAAI,KAAK,CAAC,4BAA4B,CAAC,CAAC;IAChD,CAAC;IACD;;OAEG;IACH,IAAM,gBAAgB,GAAG;QACvB,4CAA4C,EAAE,YAAY;QAC1D,mDAAmD,EAAE,cAAc;QACnE,mDAAmD,EAAE,cAAc;KACpE,CAAC;IACF;;;MAGE;IACF,IAAM,2BAA2B,GAAG;QAClC,OAAO,EAAE,4cAA4c;KACtd,CAAC;IACF;;;MAGE;IACF,IAAM,4BAA4B,GAAG;QACnC,OAAO,EAAE,mUAAmU;KAC7U,CAAC;IAEF;;;MAGE;IACF,IAAM,iCAAiC,GAAG;QACxC,OAAO,EAAE,iEAAiE;KAC3E,CAAC;IAEF;;;MAGE;IACF,IAAM,wBAAwB,GAAG;QAC/B,OAAO,EAAE,6MAA6M;KACvN,CAAC;IAEF;;;MAGE;IACF,IAAM,4BAA4B,GAAG;QACnC,OAAO,EAAE,qrCAAqrC;QAC9rC,UAAU,EAAE,EAAE;QACd,mBAAmB,EAAE;YACnB,4BAA4B,EAAE,iCAAiC;YAC/D,mBAAmB,EAAE,wBAAwB;SAC9C;KACF,CAAC;IACF;;;MAGE;IACF,IAAM,6BAA6B,GAAG;QACpC,OAAO,EAAE,6WAA6W;KACvX,CAAC;IACF;;;;;MAKE;IACF,SAAS,gBAAgB,CAAC,MAAe;QACvC,IAAI,MAAM,EAAE;YACV,IAAM,QAAQ,GAAG,gBAAgB,CAAC,MAAM,CAAC,CAAC;YAC1C,IAAI,CAAC,CAAC,QAAQ,KAAK,SAAS,CAAC,EAAE;gBAC7B,OAAO,QAAQ,CAAC;aACjB;SACF;QACD,OAAO,gBAAgB,CAAC,mBAAmB,CAAC,QAAQ,CAAC,CAAC;IACxD,CAAC;IACD;;;;;MAKE;IACF,SAAS,eAAe,CAAC,MAAc;QACrC,IAAM,SAAS,GAAG,gBAAgB,CAAC,MAAM,CAAC,CAAC;QAC3C,IAAI,CAAC,CAAC,SAAS,KAAK,SAAS,CAAC,EAAE;YAC9B,OAAO,SAAS,CAAC;SAClB;QACD,OAAO,IAAI,CAAC,CAAC,gBAAgB;IAC/B,CAAC;IACD;;;;;;MAME;IACF,SAAS,WAAW,CAAC,KAAK,EAAE,YAAsB;QAChD,IAAI,IAAA,kBAAQ,EAAC,KAAK,CAAC,EAAE;YACnB,OAAO,YAAY,KAAK,IAAI,CAAC,CAAC,CAAC,qBAAqB,GAAG,KAAK,GAAG,WAAW,CAAC,CAAC,CAAC,qBAAqB,GAAG,KAAK,GAAG,IAAI,CAAC;SACnH;QACD,OAAO,qBAAqB,GAAG,KAAK,CAAC,IAAI,GAAG,MAAM,GAAG,KAAK,CAAC,IAAI,CAAC;IAClE,CAAC;IAED;;;;;;OAMG;IACH,SAAS,OAAO,CAAC,MAAc,EAAE,OAAe;QAC9C,IAAM,YAAY,GAAG,IAAA,mBAAS,EAAC,OAAO,EAAE,EAAC,MAAM,EAAE,OAAO,EAAC,CAAC,CAAC;QAC3D,OAAO,MAAM,GAAG,YAAY,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,WAAW,EAAE,GAAG,YAAY,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;IAC/E,CAAC;IAED,OAAO;QAEL,WAAW,aAAA;QACX,mBAAmB,qBAAA;QACnB,2BAA2B,6BAAA;QAC3B,4BAA4B,8BAAA;QAC5B,iCAAiC,mCAAA;QACjC,wBAAwB,0BAAA;QACxB,4BAA4B,8BAAA;QAC5B,6BAA6B,+BAAA;QAE7B;;;;;UAKE;QACF,kBAAkB,YAAC,MAAc,EAAE,SAAc;YAC/C,MAAM,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC,OAAO,CAAC,UAAA,CAAC;gBAC9B,MAAM,GAAG,MAAM,CAAC,OAAO,CAAC,IAAI,MAAM,CAAC,WAAI,CAAC,MAAG,EAAE,GAAG,CAAC,EAAE,SAAS,CAAC,CAAC,CAAC,CAAC,CAAC;YACnE,CAAC,CAAC,CAAC;YACH,OAAO,MAAM,CAAC;QAChB,CAAC;QACD;;;;;;UAME;QACF,yBAAyB,YACvB,UAAoC,EACpC,iBAA+D,EAC/D,0BAA0F;YAD1F,kCAAA,EAAA,4CAA+D;YAC/D,2CAAA,EAAA,8DAA0F;YAE1F,IAAM,IAAI,GAAG,UAAU,CAAC,GAAG,CAAC,UAAC,EAAyE;oBAAvE,IAAI,UAAA,EAAE,UAAU,gBAAA,EAAE,QAAQ,cAAA,EAAE,YAAY,kBAAA,EAAE,YAAY,kBAAA,EAAE,aAAa,mBAAA;gBAClG,IAAM,mBAAmB,GAAG,kCAAkC,CAAC;gBAC/D,IAAM,oBAAoB,GAAG,2CAA2C,CAAC;gBACzE,IAAI,aAAa,GAAG,iBAAiB,CAAC,OAAO,CAAC;gBAC9C,aAAa,GAAG,aAAa,CAAC,OAAO,CAAC,QAAQ,EAAE,IAAI,CAAC,CAAC;gBACtD,aAAa,GAAG,aAAa,CAAC,OAAO,CAAC,cAAc,EAAE,UAAU,CAAC,CAAC;gBAClE,aAAa,GAAG,aAAa,CAAC,OAAO,CAAC,gBAAgB,EAAE,YAAY,CAAC,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,mBAAmB,CAAC,CAAC;gBAC3G,aAAa,GAAG,aAAa,CAAC,OAAO,CAAC,iBAAiB,EAAE,aAAa,CAAC,CAAC,CAAC,aAAa,CAAC,CAAC,CAAC,oBAAoB,CAAC,CAAC;gBAC/G,aAAa,GAAG,aAAa,CAAC,OAAO,CAAC,gBAAgB,EAAE,YAAY,CAAC,CAAC;gBACtE,aAAa,GAAG,aAAa,CAAC,OAAO,CAAC,SAAS,EAAE,WAAI,OAAO,CAAC,MAAM,EAAE,QAAQ,CAAC,MAAG,CAAC,CAAC;gBACnF,OAAO,aAAa,CAAC;YACvB,CAAC,CAAC,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;YACZ,OAAO,0BAA0B,CAAC,OAAO,CAAC,OAAO,CAAC,cAAc,EAAE,IAAI,CAAC,CAAC;QAC1E,CAAC;QAED;;;;;;;;;;UAUE;QACF,sBAAsB,YAAC,IAA0B;YAE7C,IAAA,cAAc,GAaZ,IAAI,eAbQ,EACd,iBAAiB,GAYf,IAAI,kBAZW,EACjB,UAAU,GAWR,IAAI,WAXI,EACV,cAAc,GAUZ,IAAI,eAVQ,EACd,KASE,IAAI,mBAT6C,EAAnD,kBAAkB,mBAAG,mBAAmB,CAAC,UAAU,KAAA,EACnD,KAQE,IAAI,yBALL,EAHD,wBAAwB,mBAAG;gBACzB,uDAAuD;gBACvD,yCAAyC;aAC1C,KAAA,EACD,WAAW,GAIT,IAAI,YAJK,EACX,eAAe,GAGb,IAAI,gBAHS,EACf,KAEE,IAAI,eAFe,EAArB,cAAc,mBAAG,IAAI,KAAA,EACrB,KACE,IAAI,gBADiB,EAAvB,eAAe,mBAAG,KAAK,KAAA,CAChB;YACT,IAAM,GAAG,GAAG,IAAI,sBAAS,EAAE,CAAC;YAC5B,sCAAsC;YACtC,IAAI,iBAAiB,EAAE;gBACrB,GAAG,CAAC,YAAY,CACd,iBAAiB,EACjB,wBAAwB,EACxB,eAAe,CAAC,kBAAkB,CAAC,CACpC,CAAC;aACH;YACD,IAAI,eAAe,EAAE;gBACnB,GAAG,CAAC,YAAY;gBACd,6BAA6B;gBAC7B,IAAI,EACJ,wBAAwB,EACxB,eAAe,CAAC,kBAAkB,CAAC,EACnC,EAAE,EACF,EAAE,EACF,EAAE,EACF,KAAK,CACN,CAAC;aACH;YACD,GAAG,CAAC,kBAAkB,GAAG,kBAAkB,CAAC;YAC5C,GAAG,CAAC,eAAe,GAAG,IAAI,IAAI,CAAC,UAAU,CAAC,WAAW,EAAE,eAAe,CAAC,CAAC;YACxE,GAAG,CAAC,UAAU,GAAG,iBAAO,CAAC,cAAc,CAAC,UAAU,EAAE,cAAc,EAAE,IAAI,CAAC,CAAC;YAC1E,IAAI,eAAe,EAAE;gBACnB,GAAG,CAAC,gBAAgB,CAAC,cAAc,EAAE,eAAe,CAAC,CAAC;aACvD;iBAAM;gBACL,GAAG,CAAC,gBAAgB,CAAC,cAAc,CAAC,CAAC;aACtC;YACD,OAAO,cAAc,KAAK,KAAK,CAAC,CAAC,CAAC,iBAAO,CAAC,YAAY,CAAC,GAAG,CAAC,YAAY,EAAE,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,YAAY,EAAE,CAAC;QAClG,CAAC;QACD;;;;;UAKE;QACF,eAAe,YAAC,GAAW,EAAE,IAA8B;YAA3D,iBA+IC;YA7IC,IAAM,GAAG,GAAG,IAAI,GAAG,EAAE,CAAC,eAAe,CAAC,GAAG,CAAC,CAAC;YAC3C,iIAAiI;YACjI,sDAAsD;YACtD,IAAM,qBAAqB,GAAG,0GAA0G,CAAC;YACzI,wDAAwD;YACxD,IAAM,uBAAuB,GAAG,uIAAuI,CAAC;YACxK,6DAA6D;YAC7D,IAAM,qBAAqB,GAAG,6OAA6O,CAAC;YAE5Q,4BAA4B;YAC5B,IAAI,SAAS,GAAQ,EAAE,CAAC;YACxB,IAAI,aAAa,GAAkB,IAAI,CAAC;YACxC,IAAM,oBAAoB,GAAG,IAAA,cAAM,EAAC,qBAAqB,EAAE,GAAG,CAAC,CAAC;YAChE,IAAM,sBAAsB,GAAG,IAAA,cAAM,EAAC,uBAAuB,EAAE,GAAG,CAAC,CAAC;YACpE,IAAM,mBAAmB,GAAG,IAAA,cAAM,EAAC,qBAAqB,EAAE,GAAG,CAAC,CAAC;YAE/D,SAAS,GAAG,SAAS,CAAC,MAAM,CAAC,oBAAoB,CAAC,CAAC;YACnD,SAAS,GAAG,SAAS,CAAC,MAAM,CAAC,sBAAsB,CAAC,CAAC;YAErD,yCAAyC;YACzC,IAAI,mBAAmB,CAAC,MAAM,KAAK,CAAC,EAAE;gBACpC,MAAM,IAAI,KAAK,CAAC,+BAA+B,CAAC,CAAC;aAClD;YAED,iDAAiD;YACjD,IAAI,SAAS,CAAC,MAAM,KAAK,CAAC,EAAE;gBAC1B,MAAM,IAAI,KAAK,CAAC,oBAAoB,CAAC,CAAC;aACvC;YAED,IAAM,GAAG,GAAG,IAAI,sBAAS,EAAE,CAAC;YAC5B,IAAI,QAAQ,GAAG,IAAI,CAAC;YACpB,4BAA4B;YAC5B,SAAS,CAAC,OAAO,CAAC,UAAA,aAAa;gBAE7B,GAAG,CAAC,kBAAkB,GAAG,IAAI,CAAC,kBAAkB,CAAC;gBAEjD,IAAI,CAAC,IAAI,CAAC,OAAO,IAAI,CAAC,IAAI,CAAC,QAAQ,EAAE;oBACnC,MAAM,IAAI,KAAK,CAAC,0CAA0C,CAAC,CAAC;iBAC7D;gBAED,IAAI,IAAI,CAAC,OAAO,EAAE;oBAChB,GAAG,CAAC,eAAe,GAAG,IAAI,wBAAW,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;iBACrD;gBAED,IAAI,IAAI,CAAC,QAAQ,EAAE;oBAEjB,IAAM,eAAe,GAAG,IAAA,cAAM,EAAC,uCAAuC,EAAE,aAAa,CAAQ,CAAC;oBAC9F,0BAA0B;oBAC1B,IAAI,YAAY,GAAQ,IAAI,CAAC,QAAQ,CAAC,kBAAkB,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC;oBAC1E,oEAAoE;oBACpE,IAAI,KAAK,CAAC,OAAO,CAAC,YAAY,CAAC,EAAE;wBAC/B,YAAY,GAAG,IAAA,qBAAW,EAAC,YAAY,CAAC,CAAC;qBAC1C;yBAAM,IAAI,OAAO,YAAY,KAAK,QAAQ,EAAE;wBAC3C,YAAY,GAAG,CAAC,YAAY,CAAC,CAAC;qBAC/B;oBACD,mCAAmC;oBACnC,YAAY,GAAG,YAAY,CAAC,GAAG,CAAC,iBAAO,CAAC,kBAAkB,CAAC,CAAC;oBAE5D,gDAAgD;oBAChD,IAAI,eAAe,CAAC,MAAM,KAAK,CAAC,IAAI,YAAY,CAAC,MAAM,KAAK,CAAC,EAAE;wBAC7D,MAAM,IAAI,KAAK,CAAC,yBAAyB,CAAC,CAAC;qBAC5C;oBAED,+BAA+B;oBAC/B,IAAI,eAAe,CAAC,MAAM,KAAK,CAAC,EAAE;wBAChC,IAAM,mBAAmB,GAAG,eAAe,CAAC,CAAC,CAAC,CAAC,UAAU,CAAC,IAAI,CAAC;wBAC/D,IAAM,iBAAe,GAAG,iBAAO,CAAC,kBAAkB,CAAC,mBAAmB,CAAC,CAAC;wBAExE,IACE,YAAY,CAAC,MAAM,IAAI,CAAC;4BACxB,CAAC,YAAY,CAAC,IAAI,CAAC,UAAA,IAAI,IAAI,OAAA,IAAI,CAAC,IAAI,EAAE,KAAK,iBAAe,CAAC,IAAI,EAAE,EAAtC,CAAsC,CAAC,EAClE;4BACA,sDAAsD;4BACtD,8EAA8E;4BAC9E,MAAM,IAAI,KAAK,CAAC,mDAAmD,CAAC,CAAC;yBACtE;wBAED,GAAG,CAAC,eAAe,GAAG,IAAI,KAAI,CAAC,UAAU,CAAC,iBAAe,CAAC,CAAC;qBAE5D;yBAAM;wBACL,iCAAiC;wBACjC,GAAG,CAAC,eAAe,GAAG,IAAI,KAAI,CAAC,UAAU,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC,CAAC;qBAC5D;iBAEF;gBAED,GAAG,CAAC,aAAa,CAAC,aAAa,CAAC,CAAC;gBAEjC,GAAG,CAAC,WAAW,CAAC,aAAa,CAAC,CAAC;gBAE/B,QAAQ,GAAG,QAAQ,IAAI,GAAG,CAAC,cAAc,CAAC,GAAG,CAAC,QAAQ,EAAE,CAAC,CAAC;gBAE1D,kFAAkF;gBAClF,IAAI,CAAC,QAAQ,EAAE;oBACb,MAAM,IAAI,KAAK,CAAC,gCAAgC,CAAC,CAAC;iBACnD;YAEH,CAAC,CAAC,CAAC;YAEH,+DAA+D;YAC/D,wDAAwD;YACxD,IAAI,oBAAoB,CAAC,MAAM,KAAK,CAAC,EAAE;gBACrC,IAAM,IAAI,GAAG,IAAA,cAAM,EAAC,0GAA0G,EAAE,GAAG,CAAC,CAAC;gBACrI,IAAI,IAAI,CAAC,MAAM,KAAK,CAAC,EAAE;oBACrB,aAAa,GAAG,IAAI,CAAC,CAAC,CAAC,CAAC,QAAQ,EAAE,CAAC;iBACpC;aACF;YAED,IAAI,sBAAsB,CAAC,MAAM,KAAK,CAAC,EAAE;gBACvC,IAAM,qBAAqB,GAAG,IAAA,mBAAO,EAAC,sBAAsB,CAAC,CAAC,CAAC,CAAC,QAAQ,EAAE,EAAE,CAAC;wBAC3E,GAAG,EAAE,QAAQ;wBACb,SAAS,EAAE,CAAC,WAAW,EAAE,YAAY,EAAE,WAAW,CAAC;wBACnD,UAAU,EAAE,CAAC,KAAK,CAAC;qBACpB,CAAC,CAAC,CAAC;gBACJ,8DAA8D;gBAC9D,IAAM,oBAAoB,GAAG,IAAA,mBAAO,EAAC,GAAG,CAAC,QAAQ,EAAE,EAAE,CAAC;wBACpD,GAAG,EAAE,IAAI;wBACT,SAAS,EAAE,CAAC,WAAW,EAAE,WAAW,CAAC;wBACrC,UAAU,EAAE,CAAC,IAAI,CAAC;qBACnB,CAAC,CAAC,CAAC;gBACJ,mBAAmB;gBACnB,wGAAwG;gBACxG,yGAAyG;gBACzG,wGAAwG;gBACxG,gEAAgE;gBAChE,iGAAiG;gBACjG,6GAA6G;gBAC7G,oGAAoG;gBACpG,IAAI,qBAAqB,CAAC,MAAM,KAAK,WAAI,oBAAoB,CAAC,EAAE,CAAE,EAAE;oBAClE,MAAM,IAAI,KAAK,CAAC,+BAA+B,CAAC,CAAC;iBAClD;gBACD,IAAM,WAAW,GAAG,IAAA,mBAAO,EAAC,GAAG,CAAC,QAAQ,EAAE,EAAE,CAAC;wBAC3C,GAAG,EAAE,WAAW;wBAChB,SAAS,EAAE,CAAC,WAAW,EAAE,WAAW,CAAC;wBACrC,UAAU,EAAE,EAAE;wBACd,OAAO,EAAE,IAAI;qBACd,CAAC,CAAC,CAAC;gBACJ,aAAa,GAAG,WAAW,CAAC,SAAS,CAAC,QAAQ,EAAE,CAAC;aAClD;YAED,OAAO,CAAC,QAAQ,EAAE,aAAa,CAAC,CAAC;QACnC,CAAC;QACD;;;;;UAKE;QACF,gBAAgB,YAAC,GAAW,EAAE,UAA2B;;YACvD;gBACE,GAAC,eAAe,IAAG;oBACjB;wBACE,KAAK,EAAE,EAAE,GAAG,KAAA,EAAE;qBACf;;wBAEC,GAAC,YAAY,IAAG;4BACd;gCACE,KAAK,EAAE;oCACL,UAAU,EAAE,oCAAoC;iCACjD;6BACF;;gCAEC,GAAC,aAAa,IAAG,CAAC;wCAChB,oBAAoB,EAAE,iBAAO,CAAC,kBAAkB,CAAC,UAAU,CAAC;qCAC7D,CAAC;;yBAEL;;iBACD;mBACJ;QACJ,CAAC;QACD;;;;;;;UAOE;QACF,yBAAyB,YACvB,WAAmB,EACnB,GAAW,EACX,UAAmB,EACnB,QAAkB,EAClB,gBAAyB;YAEzB,6CAA6C;YAC7C,6BAA6B;YAC7B,IAAM,YAAY,GAAG,IAAI,kBAAI,CAC3B,iBAAO,CAAC,cAAc,CAAC,GAAG,EAAE,UAAU,CAAC,EACvC,SAAS,EACT;gBACE,aAAa,EAAE,gBAAgB,CAAC,gBAAgB,CAAC;aAClD,CACF,CAAC;YACF,IAAM,SAAS,GAAG,YAAY,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC;YACjD,+BAA+B;YAC/B,OAAO,QAAQ,KAAK,KAAK,CAAC,CAAC,CAAC,SAAS,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC;QACvE,CAAC;QACD;;;;;;;UAOE;QACF,sBAAsB,YACpB,QAAQ,EACR,WAAmB,EACnB,SAA0B,EAC1B,eAAwB;YAExB,IAAM,QAAQ,GAAG,QAAQ,CAAC,kBAAkB,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC;YAC9D,IAAM,aAAa,GAAG,gBAAgB,CAAC,eAAe,CAAC,CAAC;YACxD,IAAM,GAAG,GAAG,IAAI,kBAAI,CAAC,iBAAO,CAAC,8BAA8B,CAAC,QAAQ,CAAC,EAAE,QAAQ,EAAE,EAAE,aAAa,eAAA,EAAE,CAAC,CAAC;YACpG,OAAO,GAAG,CAAC,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,WAAW,CAAC,EAAE,MAAM,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC,CAAC;QACtE,CAAC;QACD;;;;UAIE;QACF,UAAU,YAAC,eAAuB,EAAE,eAAyB;YAAzB,gCAAA,EAAA,oBAAyB;YAC3D,IAAI,CAAC,UAAU,GAAG,UAAA,GAAG;gBACnB,IAAM,MAAM,GAAG,eAAe,CAAC,MAAM,CAAC,CAAC,CAAC,UAAG,eAAe,CAAC,MAAM,MAAG,CAAC,CAAC,CAAC,EAAE,CAAC;gBAC1E,OAAO,WAAI,MAAM,uBAAa,MAAM,6BAAmB,eAAe,eAAK,MAAM,+BAAqB,MAAM,cAAW,CAAC;YAC1H,CAAC,CAAC;YACF,IAAI,CAAC,MAAM,GAAG,UAAA,OAAO;gBACnB,OAAO,iBAAO,CAAC,8BAA8B,CAAC,eAAe,CAAC,CAAC,QAAQ,EAAE,CAAC;YAC5E,CAAC,CAAC;QACJ,CAAC;QACD;;;;;;UAME;QACF,gBAAgB,YAAC,YAAY,EAAE,YAAY,EAAE,GAAY;YACvD,iDAAiD;YACjD,OAAO,IAAI,OAAO,CAAS,UAAC,OAAO,EAAE,MAAM;gBAEzC,IAAI,CAAC,GAAG,EAAE;oBACR,OAAO,MAAM,CAAC,IAAI,KAAK,CAAC,yBAAyB,CAAC,CAAC,CAAC;iBACrD;gBAED,IAAM,mBAAmB,GAAG,YAAY,CAAC,aAAa,CAAC;gBACvD,IAAM,oBAAoB,GAAG,YAAY,CAAC,UAAU,CAAC;gBACrD,IAAM,GAAG,GAAG,IAAI,GAAG,EAAE,CAAC,eAAe,CAAC,GAAG,CAAC,CAAC;gBAC3C,IAAM,UAAU,GAAG,IAAA,cAAM,EAAC,gCAAgC,EAAE,GAAG,CAAW,CAAC;gBAC3E,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,UAAU,CAAC,EAAE;oBAC9B,MAAM,IAAI,KAAK,CAAC,kBAAkB,CAAC,CAAC;iBACrC;gBACD,IAAI,UAAU,CAAC,MAAM,KAAK,CAAC,EAAE;oBAC3B,MAAM,IAAI,KAAK,CAAC,wBAAwB,CAAC,CAAC;iBAC3C;gBAED,8DAA8D;gBAC9D,IAAI,mBAAmB,CAAC,oBAAoB,EAAE;oBAE5C,IAAM,YAAY,GAAG,iBAAO,CAAC,8BAA8B,CAAC,oBAAoB,CAAC,kBAAkB,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC,CAAC;oBAEtH,MAAM,CAAC,OAAO,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC,QAAQ,EAAE,EAAE;wBACvC,4BAA4B;wBAC5B,OAAO,EAAE,MAAM,CAAC,IAAI,CAAC,YAAY,CAAC;wBAClC,GAAG,EAAE,MAAM,CAAC,IAAI,CAAC,qCAA8B,oBAAoB,CAAC,kBAAkB,CAAC,OAAO,CAAC,OAAO,CAAC,8BAA2B,CAAC;wBACnI,mBAAmB,EAAE,mBAAmB,CAAC,uBAAuB;wBAChE,sBAAsB,EAAE,mBAAmB,CAAC,sBAAsB;qBACnE,EAAE,UAAC,GAAG,EAAE,GAAG;wBACV,IAAI,GAAG,EAAE;4BACP,OAAO,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;4BACnB,OAAO,MAAM,CAAC,IAAI,KAAK,CAAC,uCAAuC,CAAC,CAAC,CAAC;yBACnE;wBACD,IAAI,CAAC,GAAG,EAAE;4BACR,OAAO,MAAM,CAAC,IAAI,KAAK,CAAC,mCAAmC,CAAC,CAAC,CAAC;yBAC/D;wBACO,IAAoB,kBAAkB,GAAK,mBAAmB,CAAC,SAAS,mBAAlC,CAAmC;wBACjF,IAAM,oBAAoB,GAAG,IAAI,GAAG,EAAE,CAAC,eAAe,CAAC,WAAI,kBAAkB,uCAA6B,kBAAkB,gBAAK,eAAS,CAAC,KAAK,CAAC,SAAS,gBAAK,GAAG,eAAK,kBAAkB,yBAAsB,CAAC,CAAC;wBACjN,IAAM,MAAM,GAAG,UAAU,CAAC,CAAC,CAAC,CAAC,UAAU,CAAC;wBACxC,IAAI,MAAM,EAAE;4BACV,MAAM,CAAC,WAAW,CAAC,oBAAoB,CAAC,CAAC;4BACzC,MAAM,CAAC,WAAW,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC,CAAC;yBACnC;wBACD,OAAO,OAAO,CAAC,iBAAO,CAAC,YAAY,CAAC,GAAG,CAAC,QAAQ,EAAE,CAAC,CAAC,CAAC;oBACvD,CAAC,CAAC,CAAC;iBACJ;qBAAM;oBACL,OAAO,OAAO,CAAC,iBAAO,CAAC,YAAY,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,2BAA2B;iBACvE;YACH,CAAC,CAAC,CAAC;QACL,CAAC;QACD;;;;;;;UAOE;QACF,gBAAgB,YAAC,IAAI,EAAE,SAAiB;YACtC,OAAO,IAAI,OAAO,CAAgB,UAAC,OAAO,EAAE,MAAM;gBAChD,sDAAsD;gBACtD,IAAI,CAAC,SAAS,EAAE;oBACd,OAAO,MAAM,CAAC,IAAI,KAAK,CAAC,yBAAyB,CAAC,CAAC,CAAC;iBACrD;gBACD,2FAA2F;gBAC3F,IAAM,WAAW,GAAG,IAAI,CAAC,aAAa,CAAC;gBACvC,IAAM,GAAG,GAAG,IAAI,GAAG,EAAE,CAAC,eAAe,CAAC,SAAS,CAAC,CAAC;gBACjD,IAAM,mBAAmB,GAAG,IAAA,cAAM,EAAC,8EAA8E,EAAE,GAAG,CAAW,CAAC;gBAClI,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,mBAAmB,CAAC,EAAE;oBACvC,MAAM,IAAI,KAAK,CAAC,mCAAmC,CAAC,CAAC;iBACtD;gBACD,IAAI,mBAAmB,CAAC,MAAM,KAAK,CAAC,EAAE;oBACpC,MAAM,IAAI,KAAK,CAAC,wBAAwB,CAAC,CAAC;iBAC3C;gBACD,OAAO,MAAM,CAAC,OAAO,CAAC,mBAAmB,CAAC,CAAC,CAAC,CAAC,QAAQ,EAAE,EAAE;oBACvD,GAAG,EAAE,iBAAO,CAAC,cAAc,CAAC,WAAW,CAAC,aAAa,EAAE,WAAW,CAAC,iBAAiB,CAAC;iBACtF,EAAE,UAAC,GAAG,EAAE,GAAG;oBACV,IAAI,GAAG,EAAE;wBACP,OAAO,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;wBACnB,OAAO,MAAM,CAAC,IAAI,KAAK,CAAC,uCAAuC,CAAC,CAAC,CAAC;qBACnE;oBACD,IAAI,CAAC,GAAG,EAAE;wBACR,OAAO,MAAM,CAAC,IAAI,KAAK,CAAC,mCAAmC,CAAC,CAAC,CAAC;qBAC/D;oBACD,IAAM,aAAa,GAAG,IAAI,GAAG,EAAE,CAAC,eAAe,CAAC,GAAG,CAAC,CAAC;oBACrD,IAAM,MAAM,GAAG,mBAAmB,CAAC,CAAC,CAAC,CAAC,UAAU,CAAC;oBACjD,IAAI,MAAM,EAAE;wBACV,MAAM,CAAC,WAAW,CAAC,aAAa,CAAC,CAAC;wBAClC,MAAM,CAAC,WAAW,CAAC,mBAAmB,CAAC,CAAC,CAAC,CAAC,CAAC;qBAC5C;oBACD,OAAO,OAAO,CAAC,CAAC,GAAG,CAAC,QAAQ,EAAE,EAAE,GAAG,CAAC,CAAC,CAAC;gBACxC,CAAC,CAAC,CAAC;YACL,CAAC,CAAC,CAAC;QACL,CAAC;QACD;;WAEG;QACG,UAAU,YAAC,KAAa;;;;;;4BAGpB,QAAQ,GAAK,IAAA,gBAAU,GAAE,SAAjB,CAAkB;4BAElC;;;;;+BAKG;4BACH,IAAI,CAAC,QAAQ,EAAE;gCAEb,qCAAqC;gCACrC,sBAAO,OAAO,CAAC,MAAM,CAAC,+LAA+L,CAAC,EAAC;6BAExN;;;;4BAGQ,qBAAM,QAAQ,CAAC,KAAK,CAAC,EAAA;gCAA5B,sBAAO,SAAqB,EAAC;;;4BAE7B,MAAM,GAAC,CAAC;;;;;SAGX;KACF,CAAC;AACJ,CAAC,CAAC;AAEF,kBAAe,OAAO,EAAE,CAAC"} -\ No newline at end of file -diff --git a/node_modules/samlify/src/libsaml.ts b/node_modules/samlify/src/libsaml.ts -index a0e6223..53d133e 100644 ---- a/node_modules/samlify/src/libsaml.ts -+++ b/node_modules/samlify/src/libsaml.ts -@@ -236,7 +236,7 @@ const libSaml = () => { - * @return {string} - */ - function tagging(prefix: string, content: string): string { -- const camelContent = camelCase(content); -+ const camelContent = camelCase(content, {locale: 'en-us'}); - return prefix + camelContent.charAt(0).toUpperCase() + camelContent.slice(1); - } - -@@ -545,7 +545,7 @@ const libSaml = () => { - // Embed with node-rsa module - const decryptedKey = new nrsa( - utility.readPrivateKey(key, passphrase), -- 'private', -+ undefined, - { - signingScheme: getSigningScheme(signingAlgorithm), - } -@@ -634,7 +634,11 @@ const libSaml = () => { - } - const { encryptedAssertion: encAssertionPrefix } = sourceEntitySetting.tagPrefix; - const encryptAssertionNode = new dom().parseFromString(`<${encAssertionPrefix}:EncryptedAssertion xmlns:${encAssertionPrefix}="${namespace.names.assertion}">${res}`); -- doc.replaceChild(encryptAssertionNode, assertions[0]); -+ const parent = assertions[0].parentNode; -+ if (parent) { -+ parent.appendChild(encryptAssertionNode); -+ parent.removeChild(assertions[0]); -+ } - return resolve(utility.base64Encode(doc.toString())); - }); - } else { -@@ -677,7 +681,11 @@ const libSaml = () => { - return reject(new Error('ERR_UNDEFINED_ENCRYPTED_ASSERTION')); - } - const assertionNode = new dom().parseFromString(res); -- xml.replaceChild(assertionNode, encryptedAssertions[0]); -+ const parent = encryptedAssertions[0].parentNode; -+ if (parent) { -+ parent.appendChild(assertionNode); -+ parent.removeChild(encryptedAssertions[0]); -+ } - return resolve([xml.toString(), res]); - }); - }); diff --git a/public/assets/variables.scss b/public/assets/variables.scss deleted file mode 100644 index 0e2b3ae0..00000000 --- a/public/assets/variables.scss +++ /dev/null @@ -1 +0,0 @@ -$body-font-family: 'Nunito', serif; diff --git a/public/components/add-department-menu.vue b/public/components/add-department-menu.vue deleted file mode 100644 index 17da1081..00000000 --- a/public/components/add-department-menu.vue +++ /dev/null @@ -1,94 +0,0 @@ - - - - - diff --git a/public/components/add-member-menu.vue b/public/components/add-member-menu.vue deleted file mode 100644 index 9cccf5e4..00000000 --- a/public/components/add-member-menu.vue +++ /dev/null @@ -1,193 +0,0 @@ - - - - - diff --git a/public/components/add-partner-menu.vue b/public/components/add-partner-menu.vue deleted file mode 100644 index 59dcc056..00000000 --- a/public/components/add-partner-menu.vue +++ /dev/null @@ -1,130 +0,0 @@ - - - - - diff --git a/public/components/auth-providers-login-links.vue b/public/components/auth-providers-login-links.vue deleted file mode 100644 index 38b677c4..00000000 --- a/public/components/auth-providers-login-links.vue +++ /dev/null @@ -1,121 +0,0 @@ - - - - - diff --git a/public/components/cancel-deletion.vue b/public/components/cancel-deletion.vue deleted file mode 100644 index 8e9aed03..00000000 --- a/public/components/cancel-deletion.vue +++ /dev/null @@ -1,38 +0,0 @@ - - - - - diff --git a/public/components/change-host.vue b/public/components/change-host.vue deleted file mode 100644 index f524c6f3..00000000 --- a/public/components/change-host.vue +++ /dev/null @@ -1,81 +0,0 @@ - - - - - diff --git a/public/components/delete-department-menu.vue b/public/components/delete-department-menu.vue deleted file mode 100644 index 06b596d1..00000000 --- a/public/components/delete-department-menu.vue +++ /dev/null @@ -1,95 +0,0 @@ - - - - - diff --git a/public/components/edit-department-menu.vue b/public/components/edit-department-menu.vue deleted file mode 100644 index 54e59ee6..00000000 --- a/public/components/edit-department-menu.vue +++ /dev/null @@ -1,91 +0,0 @@ - - - - - diff --git a/public/components/load-avatar.vue b/public/components/load-avatar.vue deleted file mode 100644 index 0269c086..00000000 --- a/public/components/load-avatar.vue +++ /dev/null @@ -1,146 +0,0 @@ - - - - - diff --git a/public/components/logo.vue b/public/components/logo.vue deleted file mode 100644 index 837be185..00000000 --- a/public/components/logo.vue +++ /dev/null @@ -1,166 +0,0 @@ - - - - - diff --git a/public/components/notify-menu.vue b/public/components/notify-menu.vue deleted file mode 100644 index eab88821..00000000 --- a/public/components/notify-menu.vue +++ /dev/null @@ -1,40 +0,0 @@ - - - - - diff --git a/public/components/organization-departments.vue b/public/components/organization-departments.vue deleted file mode 100644 index 032be684..00000000 --- a/public/components/organization-departments.vue +++ /dev/null @@ -1,204 +0,0 @@ - - - - - diff --git a/public/components/organization-members.vue b/public/components/organization-members.vue deleted file mode 100644 index 6695f9ce..00000000 --- a/public/components/organization-members.vue +++ /dev/null @@ -1,334 +0,0 @@ - - - - - diff --git a/public/components/organization-partners.vue b/public/components/organization-partners.vue deleted file mode 100644 index f8fffea3..00000000 --- a/public/components/organization-partners.vue +++ /dev/null @@ -1,169 +0,0 @@ - - - - - diff --git a/public/components/organization-storage.vue b/public/components/organization-storage.vue deleted file mode 100644 index 4e44e31f..00000000 --- a/public/components/organization-storage.vue +++ /dev/null @@ -1,127 +0,0 @@ - - - - - diff --git a/public/components/partner-invitation.vue b/public/components/partner-invitation.vue deleted file mode 100644 index 9b3b5ce2..00000000 --- a/public/components/partner-invitation.vue +++ /dev/null @@ -1,197 +0,0 @@ - - - - - diff --git a/public/components/resend-partner-invitation.vue b/public/components/resend-partner-invitation.vue deleted file mode 100644 index c0161907..00000000 --- a/public/components/resend-partner-invitation.vue +++ /dev/null @@ -1,118 +0,0 @@ - - - - - diff --git a/public/components/site-patch.vue b/public/components/site-patch.vue deleted file mode 100644 index 27a653e2..00000000 --- a/public/components/site-patch.vue +++ /dev/null @@ -1,107 +0,0 @@ - - - - - diff --git a/public/components/site-post.vue b/public/components/site-post.vue deleted file mode 100644 index 8251f8df..00000000 --- a/public/components/site-post.vue +++ /dev/null @@ -1,109 +0,0 @@ - - - - - diff --git a/public/components/v-jsf.vue b/public/components/v-jsf.vue deleted file mode 100644 index 0d463263..00000000 --- a/public/components/v-jsf.vue +++ /dev/null @@ -1,35 +0,0 @@ - - - - - diff --git a/public/event-bus.js b/public/event-bus.js deleted file mode 100644 index 96d52080..00000000 --- a/public/event-bus.js +++ /dev/null @@ -1,4 +0,0 @@ -// A simple event bus for displaying notifications and stuff. -// Sometimes vuex doesn't match the purpose. -import Vue from 'vue' -export default new Vue() diff --git a/public/layouts/default.vue b/public/layouts/default.vue deleted file mode 100644 index 8b5035a5..00000000 --- a/public/layouts/default.vue +++ /dev/null @@ -1,300 +0,0 @@ - - - - - diff --git a/public/layouts/error.vue b/public/layouts/error.vue deleted file mode 100644 index 5f5d4a25..00000000 --- a/public/layouts/error.vue +++ /dev/null @@ -1,19 +0,0 @@ - - - diff --git a/public/pages/admin/oauth-tokens.vue b/public/pages/admin/oauth-tokens.vue deleted file mode 100644 index 816ba498..00000000 --- a/public/pages/admin/oauth-tokens.vue +++ /dev/null @@ -1,70 +0,0 @@ - - - - - diff --git a/public/pages/admin/organizations.vue b/public/pages/admin/organizations.vue deleted file mode 100644 index 51ae030b..00000000 --- a/public/pages/admin/organizations.vue +++ /dev/null @@ -1,255 +0,0 @@ - - - - - diff --git a/public/pages/admin/sites.vue b/public/pages/admin/sites.vue deleted file mode 100644 index 60ff821f..00000000 --- a/public/pages/admin/sites.vue +++ /dev/null @@ -1,164 +0,0 @@ - - - - - diff --git a/public/pages/admin/users.vue b/public/pages/admin/users.vue deleted file mode 100644 index f8d322b7..00000000 --- a/public/pages/admin/users.vue +++ /dev/null @@ -1,429 +0,0 @@ - - - - - diff --git a/public/pages/api-doc.vue b/public/pages/api-doc.vue deleted file mode 100644 index dc4dfaac..00000000 --- a/public/pages/api-doc.vue +++ /dev/null @@ -1,28 +0,0 @@ -