commit dfa72178d57a6e33243f2de56d8299e69ac859c4 Author: Andrey Sharshov Date: Sun Nov 16 18:45:28 2025 +0100 initial diff --git a/.babelrc b/.babelrc new file mode 100644 index 0000000..5df7e20 --- /dev/null +++ b/.babelrc @@ -0,0 +1,6 @@ +{ + "presets": [ + "@babel/preset-env", + "@babel/preset-typescript" + ] +} diff --git a/.barrelsby.json b/.barrelsby.json new file mode 100644 index 0000000..6588255 --- /dev/null +++ b/.barrelsby.json @@ -0,0 +1,6 @@ +{ + "directory": "./src", + "exclude": ["index.ts","**/stories/**"], + "delete": true, + "exportDefault": false +} diff --git a/.editorconfig b/.editorconfig new file mode 100644 index 0000000..c96df1e --- /dev/null +++ b/.editorconfig @@ -0,0 +1,12 @@ +# This file is for unifying the coding style for different editors and IDEs. +# More information at http://EditorConfig.org +root = true + +[*] +end_of_line = lf +insert_final_newline = true +trim_trailing_whitespace = true +indent_style = space +indent_size = 4 + +[{*.json,bower.json,.travis.yml}] \ No newline at end of file diff --git a/.eslintignore b/.eslintignore new file mode 100644 index 0000000..a207eb2 --- /dev/null +++ b/.eslintignore @@ -0,0 +1,8 @@ +/docs/** +**/dist/** +**/lib/** +**/types/** +temp +docs +dist +node_modules diff --git a/.eslintrc.json b/.eslintrc.json new file mode 100644 index 0000000..a5b4074 --- /dev/null +++ b/.eslintrc.json @@ -0,0 +1,51 @@ +{ + "extends": ["@pixi/eslint-config"], + "plugins": ["jsdoc", "no-mixed-operators"], + "settings": { + "jsdoc": { + "mode": "typescript", + "tagNamePreference": { + "method": "method", + "function": "function", + "extends": "extends", + "typeParam": "typeParam", + "api": "api" + } + } + }, + "rules": { + "@typescript-eslint/no-unused-expressions": [1, {"allowShortCircuit": true, "allowTernary": true}], + "no-mixed-operators": "off", + "no-mixed-operators/no-mixed-operators": 1, + "@typescript-eslint/type-annotation-spacing": 1, + "jsdoc/multiline-blocks": [ + 1, + { "noMultilineBlocks": true, "minimumLengthForMultiline": 115 } + ], + "jsdoc/check-access": 1, + "jsdoc/check-alignment": 1, + "jsdoc/check-param-names": 1, + "jsdoc/check-property-names": 1, + "jsdoc/check-tag-names": 1, + "jsdoc/check-types": 1, + "jsdoc/check-values": 1, + "jsdoc/empty-tags": 1, + "jsdoc/implements-on-classes": 1, + "jsdoc/no-multi-asterisks": [1, { "allowWhitespace": true }], + "jsdoc/require-param": 1, + "jsdoc/require-param-description": 0, + "jsdoc/require-param-name": 1, + "jsdoc/require-param-type": [ + "warn", + { "contexts": ["TSMethodSignature"] } + ], + "jsdoc/require-property": 1, + "jsdoc/require-property-description": 1, + "jsdoc/require-property-name": 1, + "jsdoc/require-property-type": 1, + "jsdoc/require-returns-description": 1, + "jsdoc/tag-lines": 1, + "jsdoc/valid-types": 1, + "max-len": ["warn", { "code": 150 }] + } +} diff --git a/.gitattributes b/.gitattributes new file mode 100644 index 0000000..ef53b35 --- /dev/null +++ b/.gitattributes @@ -0,0 +1,7 @@ + +*.js text eol=lf +*.ts text eol=lf +*.json text eol=lf +*.yml text eol=lf +*.md text eol=lf +*.txt text eol=lf diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..8f7655d --- /dev/null +++ b/.gitignore @@ -0,0 +1,43 @@ +# sublime text files +*.sublime* +*.vscode* +*.*~*.TMP +test/lib + + +# temp files +.DS_Store +Thumbs.db +Desktop.ini +npm-debug.log + +# project files +.project + +# vim swap files +*.sw* + +# emacs temp files +*~ +\#*# + +# project ignores +!.gitkeep +*__temp +node_modules +bin/ +lib/ +dist/ +coverage/ +temp +yarn.lock +pnpm-lock.yaml + +# jetBrains IDE ignores +.idea +.vs-code +.eslintcache +docs/ +example.api.json* + +.npmrc diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml new file mode 100644 index 0000000..b792b5f --- /dev/null +++ b/.gitlab-ci.yml @@ -0,0 +1,4 @@ +include: + - project: infrastructure/gitlab_ci_templates + file: entrypoints/front/npm-entrypoint.gitlab-ci.yml + ref: main diff --git a/.storybook/main.js b/.storybook/main.js new file mode 100644 index 0000000..c98f470 --- /dev/null +++ b/.storybook/main.js @@ -0,0 +1,37 @@ +const path = require('path'); + +module.exports = { + stories: ['../src/stories/**/*.stories.@(ts|tsx|js|jsx|mdx)'], + staticDirs: ['../src/stories/assets'], + output: '../docs/', + logLevel: 'debug', + addons: [ + '@storybook/addon-docs', + '@storybook/addon-actions', + '@storybook/addon-backgrounds', + '@storybook/addon-controls', + '@storybook/addon-viewport', + '@storybook/addon-links', + '@storybook/addon-highlight', + '@storybook/addon-storysource', + '@storybook/addon-webpack5-compiler-babel', + '@chromatic-com/storybook' + ], + core: { + channelOptions: { allowFunction: false, maxDepth: 10 }, + disableTelemetry: true, + }, + features: { + buildStoriesJson: true, + breakingChangesV7: true, + babelModeV7: true, + }, + framework: '@pixi/storybook-webpack5', + webpackFinal: async (config) => { + config.resolve.alias = { + ...config.resolve.alias, + src: path.resolve(__dirname, '../src'), + }; + return config; + }, +}; diff --git a/.storybook/preview.js b/.storybook/preview.js new file mode 100644 index 0000000..b8f2672 --- /dev/null +++ b/.storybook/preview.js @@ -0,0 +1,26 @@ +export const parameters = { + layout: 'fullscreen', + pixi: { + applicationOptions: { + backgroundAlpha: 0, + resolution: 2, + antialias: true, + }, + }, + backgrounds: { + default: 'Dark', + values: [ + { + name: 'Dark', + value: '#1b1c1d', + }, + { + name: 'Light', + value: '#dddddd', + }, + ], + }, + docs: { + iframeHeight: 600, // Устанавливает высоту для всех историй в документации + }, +}; diff --git a/CHANGELOG.md b/CHANGELOG.md new file mode 100644 index 0000000..9b41581 --- /dev/null +++ b/CHANGELOG.md @@ -0,0 +1,61 @@ +# Changelog + +All notable changes to this project will be documented in this file. + +The format is based on Keep a Changelog, and this project adheres to Semantic Versioning. + +## [1.2.2] +### Added +- SingleSlotReelsSpinSystem settings now expose `slotStopDelay` to pause between individual slot stops within a column while `reelStopDelay` continues to pace the first slot in each column, enabling layered timing without manual timers. +- HoldAndWin stories expose `slotStopDelay` as a dedicated control to preview staggered slot timing. +- HoldAndWin stories configure fractional steps for all numeric controls to enable fine-grained tuning during demos. +- Added a stub `MaskingSystem` and wired it into Reels spin stories to prepare future masking orchestration work. +- Introduced `BlurSymbolsSystem` to centralise blur orchestration for reels symbols. +- Added dedicated Storybook demos for `MaskingSystem` and `BlurSymbolsSystem`, now mirroring the reel spin setup while piping Storybook controls through each system's `setSettings` method for live configuration tweaks. + +### Changed +- Reels reel states no longer toggle blur directly; `ReelsSpinSystem` marks blur intent while `BlurSymbolsSystem` applies filters. +- `BlurSymbolsSystem` removes cached filter areas, zeroes padding, and supports runtime velocity/kernel/offset configuration through `setSettings`. +- `MaskingSystem` exposes an `enabled` flag so Storybook demos and games can disable masking without removing the system from st +ates. + +### Fixed +- SingleSlotReelsSpinSystem trims transient slot symbols and collapses each delayed reel to its landed symbol so duplicates cannot appear when `slotStopDelay` is enabled. +- Column stop scheduling now respects `reelStopDelay` for the first slot in each column even while previous columns finish their queued slots, keeping staggered visuals aligned across reels. +- Reel symbols remain visible when blur and masking are enabled together by removing conflicting bitmap caching from the blur toggle. +- Motion blur applied to masked reel symbols now clips to the mask bounds so blur streaks no longer extend beyond the masked area. + +## [1.2.1] - 2025-10-20 +### Added +- Story: DoubleHoldAndWinStory showing two HoldAndWinMachine instances stacked vertically, each with different initMap/screenMap. + +### Changed +- HoldAndWin stories: scaled all MachineContainer instances to 0.5 (half size). In DoubleHoldAndWinStory both containers are scaled; spacing uses containerTop.height and respects scale. centerView alignment remains correct. + +## [1.2.0] - 2025-10-20 +### Added +- Introduced HoldAndWin machine scaffold and Storybook story (features/HoldAndWin). +- Single-slot reels support: + - SingleSlotReelsSpinSystem + - SingleSlotReel +- Hold-and-win demo assets and manifest: + - configs/slotMachine.json + - symbols, anticipation, winline assets, bitmap fonts, textures +- Auto-trigger spin in HoldAndWin story with generated screenMap and applied spin settings. + +### Changed +- ReelsSpinSystem: support preventReelsSpin map to disable start/stop for selected reels; skip prevented reels in the spin flow. +- ReelsMachine: integrate new maps/behavior for single-slot reels and preventReelsSpin handling. +- Reel: adjustments to support single-slot behavior. +- createScreenInputMap: generate maps aligned with the new HoldAndWin config. +- SlotMachineConfig: extended with properties required by HoldAndWin and updated spinning behavior. +- index.ts: export newly added modules. +- ReelsSpinSystem story: updated with example demonstrating disabled first/last reels. + +## [1.1.23] - 2025-10-20 +### Added +- Initialize CHANGELOG for the current branch. + +### Changed +- Bump package version to 1.1.23. + diff --git a/README.md b/README.md new file mode 100644 index 0000000..1a33dbc --- /dev/null +++ b/README.md @@ -0,0 +1,22 @@ +# SlotMachines Framework + +## SingleSlotReelsSpinSystem settings + +`SingleSlotReelsSpinSystem` extends the base reel system with per-slot timing controls. In addition to the common spin settings, it now supports a `slotStopDelay` option that waits after each slot in a column actually stops before triggering the next slot in that same column. Column-to-column pacing continues to use `reelStopDelay`, so the first slot of each column still fires on the familiar cadence while the remaining slots inherit the intra-column delay. This enables sequential stopping visuals without manual timers and keeps the machine symbol map in sync as every slot lands. When a delay is configured the system trims transient filler symbols and collapses each reel to the final landed symbol, so no duplicate entities remain on screen while the column settles. A dedicated `slotStopDelay` knob is now available in `HoldAndWin.stories.ts` to preview the staggered stop cadence directly in Storybook, and every numeric control in that story uses fractional steps for precise tuning. + +## SlotMultipliersSystem + +`SlotMultipliersSystem` renders a configurable overlay entity for every reel cell based on `machine.maps.slotMultipliers`. The default `SlotMultiplierEntity` boots a Spine asset with `in`/`out` animations, injects a centred red label into the `placehoder` slot, and automatically hides itself when the outro finishes. The accompanying Storybook story (`SlotMultipliersSystem.stories.ts`) wires the feature into `HoldAndWinMachine`, generates random multiplier maps on every spin, and demonstrates how to swap the display entity via the system settings. The machine itself does not create or register the system; consumers should instantiate `SlotMultipliersSystem`, push it into the relevant state lists, and supply their preferred entity class when wiring machines together. + +The system now keeps overlays alive across state transitions so multipliers that remain active do not replay their `in` animation. Clear `slotMultipliers` (or unregister the system) when the overlays should disappear entirely. + +## MaskingSystem + +`MaskingSystem` manages a reusable rectangular mask sized through system settings (defaulting to the machine configuration). When active it walks through every child entity each frame and synchronises their `mask` property with their `isMasked` flag: entities opt-in by toggling the flag to `true`, at which point the system applies its mask if no other mask is present; when the flag returns to `false` the system restores the entity's original rendering by clearing its mask. The mask graphic is created once, attached to the machine container, tinted red for easy debugging, and automatically refreshed when the system enters or leaves a state. Set the new `enabled` setting to `false` to globally disable masking without deregistering the system; the Storybook controls mirror this flag so designers can toggle masks while keeping the state machine intact. + +`ReelsSpinSystem` now toggles `isMasked` for each symbol while its reel state is `Spinning` and keeps the flag active through deceleration, clearing it only once the reel enters `Bouncing` or `Stopped`. This keeps the mask in place for every symbol that is still visibly moving and ensures it disappears as soon as the reel finishes its bounce or comes to rest. + +Storybook now ships focused demos for the masking and blur orchestration helpers: + +- `src/stories/MaskingSystem.stories.ts` mirrors the standard spin story boot flow and forwards the enable/size controls straight into `MaskingSystem#setSettings`, making it easy to iterate on viewport dimensions while reels spin. +- `src/stories/BlurSymbolsSystem.stories.ts` reuses the same template but exposes motion blur velocity, kernel size, and offset knobs that feed into `BlurSymbolsSystem#setSettings` for rapid strength tuning. diff --git a/package-lock.json b/package-lock.json new file mode 100644 index 0000000..b2f160c --- /dev/null +++ b/package-lock.json @@ -0,0 +1,24637 @@ +{ + "name": "@popiplay/slot-machines", + "version": "1.2.1", + "lockfileVersion": 3, + "requires": true, + "packages": { + "": { + "name": "@popiplay/slot-machines", + "version": "1.2.1", + "license": "ISC", + "devDependencies": { + "@babel/preset-env": "^7.26.0", + "@babel/preset-react": "^7.25.9", + "@babel/preset-typescript": "^7.26.0", + "@chromatic-com/storybook": "^3.2.1", + "@mdx-js/loader": "^3.1.0", + "@mdx-js/react": "^3.1.0", + "@pixi/extension-scripts": "^2.4.1", + "@pixi/filter-motion-blur": "^5.1.1", + "@pixi/storybook-renderer": "^1.0.0", + "@pixi/storybook-webpack5": "^1.0.0", + "@popiplay/state-machine": "^1.0.5", + "@rollup/plugin-commonjs": "^28.0.1", + "@storybook/addon-docs": "^8.4.0", + "@storybook/addon-essentials": "^8.4.0", + "@storybook/addon-interactions": "^8.4.0", + "@storybook/addon-links": "^8.4.0", + "@storybook/addon-storysource": "^8.4.0", + "@storybook/addon-webpack5-compiler-babel": "^3.0.3", + "@storybook/test": "^8.4.0", + "@storybook/types": "^8.4.0", + "@types/babel__core": "^7.20.5", + "@types/jest": "^29.5.14", + "babel-loader": "^9.2.1", + "eslint": "^8.57.1", + "eslint-plugin-jsdoc": "^50.4.3", + "eslint-plugin-no-mixed-operators": "^1.1.1", + "husky": "^9.1.6", + "jest": "^29.7.0", + "jest-raw-loader": "^1.0.1", + "lint-staged": "^15.2.10", + "pixi-spine": "^4.0.4", + "pixi.js": "^7.4.2", + "storybook": "^8.4.0", + "tsc-alias": "^1.8.10", + "typescript": "^5.6.3" + }, + "peerDependencies": { + "@pixi/filter-motion-blur": "^5.1.1", + "@popiplay/state-machine": "^1.0.6", + "pixi-spine": "^4.0.4", + "pixi.js": "^7.4.2" + } + }, + "node_modules/@adobe/css-tools": { + "version": "4.4.1", + "resolved": "https://registry.npmjs.org/@adobe/css-tools/-/css-tools-4.4.1.tgz", + "integrity": "sha512-12WGKBQzjUAI4ayyF4IAtfw2QR/IDoqk6jTddXDhtYTJF9ASmoE1zst7cVtP0aL/F1jUJL5r+JxKXKEgHNbEUQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/@ampproject/remapping": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/@ampproject/remapping/-/remapping-2.3.0.tgz", + "integrity": "sha512-30iZtAPgz+LTIYoeivqYo853f02jBYSd5uGnGpkFV0M3xOt9aN73erkgYAmZU43x4VfqcnLxW9Kpg3R5LC4YYw==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@jridgewell/gen-mapping": "^0.3.5", + "@jridgewell/trace-mapping": "^0.3.24" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@babel/code-frame": { + "version": "7.26.2", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.26.2.tgz", + "integrity": "sha512-RJlIHRueQgwWitWgF8OdFYGZX328Ax5BCemNGlqHfplnRT9ESi8JkFlvaVYbS+UubVY6dpv87Fs2u5M29iNFVQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-validator-identifier": "^7.25.9", + "js-tokens": "^4.0.0", + "picocolors": "^1.0.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/compat-data": { + "version": "7.26.2", + "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.26.2.tgz", + "integrity": "sha512-Z0WgzSEa+aUcdiJuCIqgujCshpMWgUpgOxXotrYPSA53hA3qopNaqcJpyr0hVb1FeWdnqFA35/fUtXgBK8srQg==", + "dev": true, + "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, + "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/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==", + "dev": true, + "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" + }, + "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==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/types": "^7.25.9" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "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==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/traverse": "^7.25.9", + "@babel/types": "^7.25.9" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-compilation-targets": { + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.25.9.tgz", + "integrity": "sha512-j9Db8Suy6yV/VHa4qzrj9yZfZxhLWQdVnRlXxmKLYlhWUVB1sB2G5sxuWYXk/whHD9iW76PmNzxZ4UCnTQTVEQ==", + "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" + } + }, + "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==", + "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" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.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, + "license": "MIT", + "dependencies": { + "@babel/helper-annotate-as-pure": "^7.25.9", + "regexpu-core": "^6.1.1", + "semver": "^6.3.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.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, + "license": "MIT", + "dependencies": { + "@babel/helper-compilation-targets": "^7.22.6", + "@babel/helper-plugin-utils": "^7.22.5", + "debug": "^4.1.1", + "lodash.debounce": "^4.0.8", + "resolve": "^1.14.2" + }, + "peerDependencies": { + "@babel/core": "^7.4.0 || ^8.0.0-0 <8.0.0" + } + }, + "node_modules/@babel/helper-function-name": { + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.24.7.tgz", + "integrity": "sha512-FyoJTsj/PEUWu1/TYRiXTIHc8lbw+TDYkZuoE43opPS5TrI7MyONBE1oNvfguEXAD9yhQRrVBnXdXzSLQl9XnA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/template": "^7.24.7", + "@babel/types": "^7.24.7" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-member-expression-to-functions": { + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.25.9.tgz", + "integrity": "sha512-wbfdZ9w5vk0C0oyHqAJbc62+vet5prjj01jjJ8sKn3j9h3MQQlflEdXYvuqRWjHnM12coDEqiC1IRCi0U/EKwQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/traverse": "^7.25.9", + "@babel/types": "^7.25.9" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-module-imports": { + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.25.9.tgz", + "integrity": "sha512-tnUA4RsrmflIM6W6RFTLFSXITtl0wKjgpnLgXyowocVPrbYrLUXSBXDgTs8BlbmIzIdlBySRQjINYs2BAkiLtw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/traverse": "^7.25.9", + "@babel/types": "^7.25.9" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-module-transforms": { + "version": "7.26.0", + "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.26.0.tgz", + "integrity": "sha512-xO+xu6B5K2czEnQye6BHA7DolFFmS3LB7stHZFaOLb1pAwO1HWLS8fXA+eh0A2yIvltPVmx3eNNDBJA2SLHXFw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-module-imports": "^7.25.9", + "@babel/helper-validator-identifier": "^7.25.9", + "@babel/traverse": "^7.25.9" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/helper-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==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/types": "^7.25.9" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-plugin-utils": { + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.25.9.tgz", + "integrity": "sha512-kSMlyUVdWe25rEsRGviIgOWnoT/nfABVWlqt9N19/dIPWViAOW2s9wznP5tURbs/IDuNk4gPy3YdYRgH3uxhBw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-remap-async-to-generator": { + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/helper-remap-async-to-generator/-/helper-remap-async-to-generator-7.25.9.tgz", + "integrity": "sha512-IZtukuUeBbhgOcaW2s06OXTzVNJR0ybm4W5xC1opWFFJMZbwRj5LCk+ByYH7WdZPZTt8KnFwA8pvjN2yqcPlgw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-annotate-as-pure": "^7.25.9", + "@babel/helper-wrap-function": "^7.25.9", + "@babel/traverse": "^7.25.9" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/helper-replace-supers": { + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/helper-replace-supers/-/helper-replace-supers-7.25.9.tgz", + "integrity": "sha512-IiDqTOTBQy0sWyeXyGSC5TBJpGFXBkRynjBeXsvbhQFKj2viwJC76Epz35YLU1fpe/Am6Vppb7W7zM4fPQzLsQ==", + "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" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "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==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/traverse": "^7.25.9", + "@babel/types": "^7.25.9" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "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==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/traverse": "^7.25.9", + "@babel/types": "^7.25.9" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-split-export-declaration": { + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.24.7.tgz", + "integrity": "sha512-oy5V7pD+UvfkEATUKvIjvIAH/xCzfsFVw7ygW2SI6NClZzquT+mwdTfgfdbUiceh6iQO0CHtCPsyze/MZ2YbAA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/types": "^7.24.7" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-string-parser": { + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.25.9.tgz", + "integrity": "sha512-4A/SCr/2KLd5jrtOMFzaKjVtAei3+2r/NChoBNoZ3EyP/+GlhoaEGoWOZUmFmoITP7zOJyHIMm+DYRd8o3PvHA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-validator-identifier": { + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.25.9.tgz", + "integrity": "sha512-Ed61U6XJc3CVRfkERJWDz4dJwKe7iLmmJsbOGu9wSloNSFttHV0I8g6UAgb7qnK5ly5bGLPd4oXZlxCdANBOWQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-validator-option": { + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.25.9.tgz", + "integrity": "sha512-e/zv1co8pp55dNdEcCynfj9X7nyUKUXoUEwfXqaZt0omVOmDe9oOTdKStH4GmAw6zxMFs50ZayuMfHDKlO7Tfw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-wrap-function": { + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/helper-wrap-function/-/helper-wrap-function-7.25.9.tgz", + "integrity": "sha512-ETzz9UTjQSTmw39GboatdymDq4XIQbR8ySgVrylRhPOFpsd+JrKHIuF0de7GCWmem+T4uC5z7EZguod7Wj4A4g==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/template": "^7.25.9", + "@babel/traverse": "^7.25.9", + "@babel/types": "^7.25.9" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helpers": { + "version": "7.26.0", + "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.26.0.tgz", + "integrity": "sha512-tbhNuIxNcVb21pInl3ZSjksLCvgdZy9KwJ8brv993QtIVKJBBkYXz4q4ZbAv31GdnC+R90np23L5FbEBlthAEw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/template": "^7.25.9", + "@babel/types": "^7.26.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "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==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/types": "^7.26.0" + }, + "bin": { + "parser": "bin/babel-parser.js" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@babel/plugin-bugfix-firefox-class-in-computed-class-key": { + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-firefox-class-in-computed-class-key/-/plugin-bugfix-firefox-class-in-computed-class-key-7.25.9.tgz", + "integrity": "sha512-ZkRyVkThtxQ/J6nv3JFYv1RYY+JT5BvU0y3k5bWrmuG4woXypRa4PXmm9RhOwodRkYFWqC0C0cqcJ4OqR7kW+g==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.25.9", + "@babel/traverse": "^7.25.9" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/plugin-bugfix-safari-class-field-initializer-scope": { + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-safari-class-field-initializer-scope/-/plugin-bugfix-safari-class-field-initializer-scope-7.25.9.tgz", + "integrity": "sha512-MrGRLZxLD/Zjj0gdU15dfs+HH/OXvnw/U4jJD8vpcP2CJQapPEv1IWwjc/qMg7ItBlPwSv1hRBbb7LeuANdcnw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.25.9" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression": { + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression/-/plugin-bugfix-safari-id-destructuring-collision-in-function-expression-7.25.9.tgz", + "integrity": "sha512-2qUwwfAFpJLZqxd02YW9btUCZHl+RFvdDkNfZwaIJrvB8Tesjsk8pEQkTvGwZXLqXUx/2oyY3ySRhm6HOXuCug==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.25.9" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining": { + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining/-/plugin-bugfix-v8-spread-parameters-in-optional-chaining-7.25.9.tgz", + "integrity": "sha512-6xWgLZTJXwilVjlnV7ospI3xi+sl8lN8rXXbBD6vYn3UYDlGsag8wrZkKcSI8G6KgqKP7vNFaDgeDnfAABq61g==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.25.9", + "@babel/helper-skip-transparent-expression-wrappers": "^7.25.9", + "@babel/plugin-transform-optional-chaining": "^7.25.9" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.13.0" + } + }, + "node_modules/@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly": { + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly/-/plugin-bugfix-v8-static-class-fields-redefine-readonly-7.25.9.tgz", + "integrity": "sha512-aLnMXYPnzwwqhYSCyXfKkIkYgJ8zv9RK+roo9DkTXz38ynIhd9XCbN08s3MGvqL2MYGVUGdRQLL/JqBIeJhJBg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.25.9", + "@babel/traverse": "^7.25.9" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/plugin-proposal-class-properties": { + "version": "7.17.12", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-class-properties/-/plugin-proposal-class-properties-7.17.12.tgz", + "integrity": "sha512-U0mI9q8pW5Q9EaTHFPwSVusPMV/DV9Mm8p7csqROFLtIE9rBF5piLqyrBGigftALrBcsBGu4m38JneAe7ZDLXw==", + "deprecated": "This proposal has been merged to the ECMAScript standard and thus this plugin is no longer maintained. Please use @babel/plugin-transform-class-properties instead.", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-create-class-features-plugin": "^7.17.12", + "@babel/helper-plugin-utils": "^7.17.12" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-proposal-private-property-in-object": { + "version": "7.21.0-placeholder-for-preset-env.2", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-private-property-in-object/-/plugin-proposal-private-property-in-object-7.21.0-placeholder-for-preset-env.2.tgz", + "integrity": "sha512-SOSkfJDddaM7mak6cPEpswyTRnuRltl429hMraQEglW+OkovnCzsiszTmsrlY//qLFjCpQDFRvjdm2wA5pPm9w==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-async-generators": { + "version": "7.8.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-async-generators/-/plugin-syntax-async-generators-7.8.4.tgz", + "integrity": "sha512-tycmZxkGfZaxhMRbXlPXuVFpdWlXpir2W4AMhSJgRKzk/eDlIXOhb2LHWoLpDF7TEHylV5zNhykX6KAgHJmTNw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.8.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-bigint": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-bigint/-/plugin-syntax-bigint-7.8.3.tgz", + "integrity": "sha512-wnTnFlG+YxQm3vDxpGE57Pj0srRU4sHE/mDkt1qv2YJJSeUAec2ma4WLUnUPeKjyrfntVwe/N6dCXpU+zL3Npg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.8.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-class-properties": { + "version": "7.12.13", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-class-properties/-/plugin-syntax-class-properties-7.12.13.tgz", + "integrity": "sha512-fm4idjKla0YahUNgFNLCB0qySdsoPiZP3iQE3rky0mBUtMZ23yDJ9SJdg6dXTSDnulOVqiF3Hgr9nbXvXTQZYA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.12.13" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-class-static-block": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-class-static-block/-/plugin-syntax-class-static-block-7.14.5.tgz", + "integrity": "sha512-b+YyPmr6ldyNnM6sqYeMWE+bgJcJpO6yS4QD7ymxgH34GBPNDM/THBh8iunyvKIZztiwLH4CJZ0RxTk9emgpjw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.14.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-flow": { + "version": "7.26.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-flow/-/plugin-syntax-flow-7.26.0.tgz", + "integrity": "sha512-B+O2DnPc0iG+YXFqOxv2WNuNU97ToWjOomUQ78DouOENWUaM5sVrmet9mcomUGQFwpJd//gvUagXBSdzO1fRKg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.25.9" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-import-assertions": { + "version": "7.26.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-assertions/-/plugin-syntax-import-assertions-7.26.0.tgz", + "integrity": "sha512-QCWT5Hh830hK5EQa7XzuqIkQU9tT/whqbDz7kuaZMHFl1inRRg7JnuAEOQ0Ur0QUl0NufCk1msK2BeY79Aj/eg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.25.9" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-import-attributes": { + "version": "7.26.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-attributes/-/plugin-syntax-import-attributes-7.26.0.tgz", + "integrity": "sha512-e2dttdsJ1ZTpi3B9UYGLw41hifAubg19AtCu/2I/F1QNVclOBr1dYpTdmdyZ84Xiz43BS/tCUkMAZNLv12Pi+A==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.25.9" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-import-meta": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-meta/-/plugin-syntax-import-meta-7.10.4.tgz", + "integrity": "sha512-Yqfm+XDx0+Prh3VSeEQCPU81yC+JWZ2pDPFSS4ZdpfZhp4MkFMaDC1UqseovEKwSUpnIL7+vK+Clp7bfh0iD7g==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.10.4" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-json-strings": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-json-strings/-/plugin-syntax-json-strings-7.8.3.tgz", + "integrity": "sha512-lY6kdGpWHvjoe2vk4WrAapEuBR69EMxZl+RoGRhrFGNYVK8mOPAW8VfbT/ZgrFbXlDNiiaxQnAtgVCZ6jv30EA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.8.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-jsx": { + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.25.9.tgz", + "integrity": "sha512-ld6oezHQMZsZfp6pWtbjaNDF2tiiCYYDqQszHt5VV437lewP9aSi2Of99CK0D0XB21k7FLgnLcmQKyKzynfeAA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.25.9" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-logical-assignment-operators": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-logical-assignment-operators/-/plugin-syntax-logical-assignment-operators-7.10.4.tgz", + "integrity": "sha512-d8waShlpFDinQ5MtvGU9xDAOzKH47+FFoney2baFIoMr952hKOLp1HR7VszoZvOsV/4+RRszNY7D17ba0te0ig==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.10.4" + }, + "peerDependencies": { + "@babel/core": "^7.0.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, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.8.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-numeric-separator": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-numeric-separator/-/plugin-syntax-numeric-separator-7.10.4.tgz", + "integrity": "sha512-9H6YdfkcK/uOnY/K7/aA2xpzaAgkQn37yzWUMRK7OaPOqOpGS1+n0H5hxT9AUw9EsSjPW8SVyMJwYRtWs3X3ug==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.10.4" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-object-rest-spread": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-object-rest-spread/-/plugin-syntax-object-rest-spread-7.8.3.tgz", + "integrity": "sha512-XoqMijGZb9y3y2XskN+P1wUGiVwWZ5JmoDRwx5+3GmEplNyVM2s2Dg8ILFQm8rWM48orGy5YpI5Bl8U1y7ydlA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.8.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-optional-catch-binding": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-optional-catch-binding/-/plugin-syntax-optional-catch-binding-7.8.3.tgz", + "integrity": "sha512-6VPD0Pc1lpTqw0aKoeRTMiB+kWhAoT24PA+ksWSBrFtl5SIRVpZlwN3NNPQjehA2E/91FV3RjLWoVTglWcSV3Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.8.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-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, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.8.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "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", + "dependencies": { + "@babel/helper-plugin-utils": "^7.14.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-top-level-await": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-top-level-await/-/plugin-syntax-top-level-await-7.14.5.tgz", + "integrity": "sha512-hx++upLv5U1rgYfwe1xBQUhRmU41NEvpUvrp8jkrSCdvGSnM5/qdRMtylJ6PG5OFkBaHkbTAKTnd3/YyESRHFw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.14.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-typescript": { + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-typescript/-/plugin-syntax-typescript-7.25.9.tgz", + "integrity": "sha512-hjMgRy5hb8uJJjUcdWunWVcoi9bGpJp8p5Ol1229PoN6aytsLwNMgmdftO23wnCLMfVmTwZDWMPNq/D1SY60JQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.25.9" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-unicode-sets-regex": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-unicode-sets-regex/-/plugin-syntax-unicode-sets-regex-7.18.6.tgz", + "integrity": "sha512-727YkEAPwSIQTv5im8QHz3upqp92JTWhidIC81Tdx4VJYIte/VndKf1qKrfnnhPLiPghStWfvC/iFaMCQu7Nqg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-create-regexp-features-plugin": "^7.18.6", + "@babel/helper-plugin-utils": "^7.18.6" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/plugin-transform-arrow-functions": { + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-arrow-functions/-/plugin-transform-arrow-functions-7.25.9.tgz", + "integrity": "sha512-6jmooXYIwn9ca5/RylZADJ+EnSxVUS5sjeJ9UPk6RWRzXCmOJCy6dqItPJFpw2cuCangPK4OYr5uhGKcmrm5Qg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.25.9" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-async-generator-functions": { + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-async-generator-functions/-/plugin-transform-async-generator-functions-7.25.9.tgz", + "integrity": "sha512-RXV6QAzTBbhDMO9fWwOmwwTuYaiPbggWQ9INdZqAYeSHyG7FzQ+nOZaUUjNwKv9pV3aE4WFqFm1Hnbci5tBCAw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.25.9", + "@babel/helper-remap-async-to-generator": "^7.25.9", + "@babel/traverse": "^7.25.9" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-async-to-generator": { + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-async-to-generator/-/plugin-transform-async-to-generator-7.25.9.tgz", + "integrity": "sha512-NT7Ejn7Z/LjUH0Gv5KsBCxh7BH3fbLTV0ptHvpeMvrt3cPThHfJfst9Wrb7S8EvJ7vRTFI7z+VAvFVEQn/m5zQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-module-imports": "^7.25.9", + "@babel/helper-plugin-utils": "^7.25.9", + "@babel/helper-remap-async-to-generator": "^7.25.9" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-block-scoped-functions": { + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoped-functions/-/plugin-transform-block-scoped-functions-7.25.9.tgz", + "integrity": "sha512-toHc9fzab0ZfenFpsyYinOX0J/5dgJVA2fm64xPewu7CoYHWEivIWKxkK2rMi4r3yQqLnVmheMXRdG+k239CgA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.25.9" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-block-scoping": { + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.25.9.tgz", + "integrity": "sha512-1F05O7AYjymAtqbsFETboN1NvBdcnzMerO+zlMyJBEz6WkMdejvGWw9p05iTSjC85RLlBseHHQpYaM4gzJkBGg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.25.9" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-class-properties": { + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-class-properties/-/plugin-transform-class-properties-7.25.9.tgz", + "integrity": "sha512-bbMAII8GRSkcd0h0b4X+36GksxuheLFjP65ul9w6C3KgAamI3JqErNgSrosX6ZPj+Mpim5VvEbawXxJCyEUV3Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-create-class-features-plugin": "^7.25.9", + "@babel/helper-plugin-utils": "^7.25.9" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-class-static-block": { + "version": "7.26.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-class-static-block/-/plugin-transform-class-static-block-7.26.0.tgz", + "integrity": "sha512-6J2APTs7BDDm+UMqP1useWqhcRAXo0WIoVj26N7kPFB6S73Lgvyka4KTZYIxtgYXiN5HTyRObA72N2iu628iTQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-create-class-features-plugin": "^7.25.9", + "@babel/helper-plugin-utils": "^7.25.9" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.12.0" + } + }, + "node_modules/@babel/plugin-transform-classes": { + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-classes/-/plugin-transform-classes-7.25.9.tgz", + "integrity": "sha512-mD8APIXmseE7oZvZgGABDyM34GUmK45Um2TXiBUt7PnuAxrgoSVf123qUzPxEr/+/BHrRn5NMZCdE2m/1F8DGg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-annotate-as-pure": "^7.25.9", + "@babel/helper-compilation-targets": "^7.25.9", + "@babel/helper-plugin-utils": "^7.25.9", + "@babel/helper-replace-supers": "^7.25.9", + "@babel/traverse": "^7.25.9", + "globals": "^11.1.0" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-computed-properties": { + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-computed-properties/-/plugin-transform-computed-properties-7.25.9.tgz", + "integrity": "sha512-HnBegGqXZR12xbcTHlJ9HGxw1OniltT26J5YpfruGqtUHlz/xKf/G2ak9e+t0rVqrjXa9WOhvYPz1ERfMj23AA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.25.9", + "@babel/template": "^7.25.9" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-destructuring": { + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.25.9.tgz", + "integrity": "sha512-WkCGb/3ZxXepmMiX101nnGiU+1CAdut8oHyEOHxkKuS1qKpU2SMXE2uSvfz8PBuLd49V6LEsbtyPhWC7fnkgvQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.25.9" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-dotall-regex": { + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-dotall-regex/-/plugin-transform-dotall-regex-7.25.9.tgz", + "integrity": "sha512-t7ZQ7g5trIgSRYhI9pIJtRl64KHotutUJsh4Eze5l7olJv+mRSg4/MmbZ0tv1eeqRbdvo/+trvJD/Oc5DmW2cA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-create-regexp-features-plugin": "^7.25.9", + "@babel/helper-plugin-utils": "^7.25.9" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-duplicate-keys": { + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-duplicate-keys/-/plugin-transform-duplicate-keys-7.25.9.tgz", + "integrity": "sha512-LZxhJ6dvBb/f3x8xwWIuyiAHy56nrRG3PeYTpBkkzkYRRQ6tJLu68lEF5VIqMUZiAV7a8+Tb78nEoMCMcqjXBw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.25.9" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-duplicate-named-capturing-groups-regex": { + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-duplicate-named-capturing-groups-regex/-/plugin-transform-duplicate-named-capturing-groups-regex-7.25.9.tgz", + "integrity": "sha512-0UfuJS0EsXbRvKnwcLjFtJy/Sxc5J5jhLHnFhy7u4zih97Hz6tJkLU+O+FMMrNZrosUPxDi6sYxJ/EA8jDiAog==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-create-regexp-features-plugin": "^7.25.9", + "@babel/helper-plugin-utils": "^7.25.9" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/plugin-transform-dynamic-import": { + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-dynamic-import/-/plugin-transform-dynamic-import-7.25.9.tgz", + "integrity": "sha512-GCggjexbmSLaFhqsojeugBpeaRIgWNTcgKVq/0qIteFEqY2A+b9QidYadrWlnbWQUrW5fn+mCvf3tr7OeBFTyg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.25.9" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-exponentiation-operator": { + "version": "7.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, + "license": "MIT", + "dependencies": { + "@babel/helper-builder-binary-assignment-operator-visitor": "^7.25.9", + "@babel/helper-plugin-utils": "^7.25.9" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-export-namespace-from": { + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-export-namespace-from/-/plugin-transform-export-namespace-from-7.25.9.tgz", + "integrity": "sha512-2NsEz+CxzJIVOPx2o9UsW1rXLqtChtLoVnwYHHiB04wS5sgn7mrV45fWMBX0Kk+ub9uXytVYfNP2HjbVbCB3Ww==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.25.9" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-flow-comments": { + "version": "7.17.12", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-flow-comments/-/plugin-transform-flow-comments-7.17.12.tgz", + "integrity": "sha512-H0hZkvKuOmBGN12CqqiiqB7uNGoYUagi8RBdR2KUuAGwGRMfM7IheYPraSX9CHQXDbSriR6QWBq0lQ9d5AKXVw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/generator": "^7.17.12", + "@babel/helper-plugin-utils": "^7.17.12", + "@babel/plugin-syntax-flow": "^7.17.12" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-for-of": { + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-for-of/-/plugin-transform-for-of-7.25.9.tgz", + "integrity": "sha512-LqHxduHoaGELJl2uhImHwRQudhCM50pT46rIBNvtT/Oql3nqiS3wOwP+5ten7NpYSXrrVLgtZU3DZmPtWZo16A==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.25.9", + "@babel/helper-skip-transparent-expression-wrappers": "^7.25.9" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-function-name": { + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-function-name/-/plugin-transform-function-name-7.25.9.tgz", + "integrity": "sha512-8lP+Yxjv14Vc5MuWBpJsoUCd3hD6V9DgBon2FVYL4jJgbnVQ9fTgYmonchzZJOVNgzEgbxp4OwAf6xz6M/14XA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-compilation-targets": "^7.25.9", + "@babel/helper-plugin-utils": "^7.25.9", + "@babel/traverse": "^7.25.9" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-json-strings": { + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-json-strings/-/plugin-transform-json-strings-7.25.9.tgz", + "integrity": "sha512-xoTMk0WXceiiIvsaquQQUaLLXSW1KJ159KP87VilruQm0LNNGxWzahxSS6T6i4Zg3ezp4vA4zuwiNUR53qmQAw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.25.9" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-literals": { + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-literals/-/plugin-transform-literals-7.25.9.tgz", + "integrity": "sha512-9N7+2lFziW8W9pBl2TzaNht3+pgMIRP74zizeCSrtnSKVdUl8mAjjOP2OOVQAfZ881P2cNjDj1uAMEdeD50nuQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.25.9" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-logical-assignment-operators": { + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-logical-assignment-operators/-/plugin-transform-logical-assignment-operators-7.25.9.tgz", + "integrity": "sha512-wI4wRAzGko551Y8eVf6iOY9EouIDTtPb0ByZx+ktDGHwv6bHFimrgJM/2T021txPZ2s4c7bqvHbd+vXG6K948Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.25.9" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-member-expression-literals": { + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-member-expression-literals/-/plugin-transform-member-expression-literals-7.25.9.tgz", + "integrity": "sha512-PYazBVfofCQkkMzh2P6IdIUaCEWni3iYEerAsRWuVd8+jlM1S9S9cz1dF9hIzyoZ8IA3+OwVYIp9v9e+GbgZhA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.25.9" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-modules-amd": { + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-amd/-/plugin-transform-modules-amd-7.25.9.tgz", + "integrity": "sha512-g5T11tnI36jVClQlMlt4qKDLlWnG5pP9CSM4GhdRciTNMRgkfpo5cR6b4rGIOYPgRRuFAvwjPQ/Yk+ql4dyhbw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-module-transforms": "^7.25.9", + "@babel/helper-plugin-utils": "^7.25.9" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "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, + "license": "MIT", + "dependencies": { + "@babel/helper-module-transforms": "^7.25.9", + "@babel/helper-plugin-utils": "^7.25.9", + "@babel/helper-simple-access": "^7.25.9" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-modules-systemjs": { + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.25.9.tgz", + "integrity": "sha512-hyss7iIlH/zLHaehT+xwiymtPOpsiwIIRlCAOwBB04ta5Tt+lNItADdlXw3jAWZ96VJ2jlhl/c+PNIQPKNfvcA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-module-transforms": "^7.25.9", + "@babel/helper-plugin-utils": "^7.25.9", + "@babel/helper-validator-identifier": "^7.25.9", + "@babel/traverse": "^7.25.9" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-modules-umd": { + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-umd/-/plugin-transform-modules-umd-7.25.9.tgz", + "integrity": "sha512-bS9MVObUgE7ww36HEfwe6g9WakQ0KF07mQF74uuXdkoziUPfKyu/nIm663kz//e5O1nPInPFx36z7WJmJ4yNEw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-module-transforms": "^7.25.9", + "@babel/helper-plugin-utils": "^7.25.9" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-named-capturing-groups-regex": { + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-named-capturing-groups-regex/-/plugin-transform-named-capturing-groups-regex-7.25.9.tgz", + "integrity": "sha512-oqB6WHdKTGl3q/ItQhpLSnWWOpjUJLsOCLVyeFgeTktkBSCiurvPOsyt93gibI9CmuKvTUEtWmG5VhZD+5T/KA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-create-regexp-features-plugin": "^7.25.9", + "@babel/helper-plugin-utils": "^7.25.9" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/plugin-transform-new-target": { + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-new-target/-/plugin-transform-new-target-7.25.9.tgz", + "integrity": "sha512-U/3p8X1yCSoKyUj2eOBIx3FOn6pElFOKvAAGf8HTtItuPyB+ZeOqfn+mvTtg9ZlOAjsPdK3ayQEjqHjU/yLeVQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.25.9" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-nullish-coalescing-operator": { + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-nullish-coalescing-operator/-/plugin-transform-nullish-coalescing-operator-7.25.9.tgz", + "integrity": "sha512-ENfftpLZw5EItALAD4WsY/KUWvhUlZndm5GC7G3evUsVeSJB6p0pBeLQUnRnBCBx7zV0RKQjR9kCuwrsIrjWog==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.25.9" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-numeric-separator": { + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-numeric-separator/-/plugin-transform-numeric-separator-7.25.9.tgz", + "integrity": "sha512-TlprrJ1GBZ3r6s96Yq8gEQv82s8/5HnCVHtEJScUj90thHQbwe+E5MLhi2bbNHBEJuzrvltXSru+BUxHDoog7Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.25.9" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-object-rest-spread": { + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-object-rest-spread/-/plugin-transform-object-rest-spread-7.25.9.tgz", + "integrity": "sha512-fSaXafEE9CVHPweLYw4J0emp1t8zYTXyzN3UuG+lylqkvYd7RMrsOQ8TYx5RF231be0vqtFC6jnx3UmpJmKBYg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-compilation-targets": "^7.25.9", + "@babel/helper-plugin-utils": "^7.25.9", + "@babel/plugin-transform-parameters": "^7.25.9" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-object-super": { + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-object-super/-/plugin-transform-object-super-7.25.9.tgz", + "integrity": "sha512-Kj/Gh+Rw2RNLbCK1VAWj2U48yxxqL2x0k10nPtSdRa0O2xnHXalD0s+o1A6a0W43gJ00ANo38jxkQreckOzv5A==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.25.9", + "@babel/helper-replace-supers": "^7.25.9" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-optional-catch-binding": { + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-optional-catch-binding/-/plugin-transform-optional-catch-binding-7.25.9.tgz", + "integrity": "sha512-qM/6m6hQZzDcZF3onzIhZeDHDO43bkNNlOX0i8n3lR6zLbu0GN2d8qfM/IERJZYauhAHSLHy39NF0Ctdvcid7g==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.25.9" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-optional-chaining": { + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-optional-chaining/-/plugin-transform-optional-chaining-7.25.9.tgz", + "integrity": "sha512-6AvV0FsLULbpnXeBjrY4dmWF8F7gf8QnvTEoO/wX/5xm/xE1Xo8oPuD3MPS+KS9f9XBEAWN7X1aWr4z9HdOr7A==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.25.9", + "@babel/helper-skip-transparent-expression-wrappers": "^7.25.9" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-parameters": { + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.25.9.tgz", + "integrity": "sha512-wzz6MKwpnshBAiRmn4jR8LYz/g8Ksg0o80XmwZDlordjwEk9SxBzTWC7F5ef1jhbrbOW2DJ5J6ayRukrJmnr0g==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.25.9" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-private-methods": { + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-private-methods/-/plugin-transform-private-methods-7.25.9.tgz", + "integrity": "sha512-D/JUozNpQLAPUVusvqMxyvjzllRaF8/nSrP1s2YGQT/W4LHK4xxsMcHjhOGTS01mp9Hda8nswb+FblLdJornQw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-create-class-features-plugin": "^7.25.9", + "@babel/helper-plugin-utils": "^7.25.9" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-private-property-in-object": { + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-private-property-in-object/-/plugin-transform-private-property-in-object-7.25.9.tgz", + "integrity": "sha512-Evf3kcMqzXA3xfYJmZ9Pg1OvKdtqsDMSWBDzZOPLvHiTt36E75jLDQo5w1gtRU95Q4E5PDttrTf25Fw8d/uWLw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-annotate-as-pure": "^7.25.9", + "@babel/helper-create-class-features-plugin": "^7.25.9", + "@babel/helper-plugin-utils": "^7.25.9" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-property-literals": { + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-property-literals/-/plugin-transform-property-literals-7.25.9.tgz", + "integrity": "sha512-IvIUeV5KrS/VPavfSM/Iu+RE6llrHrYIKY1yfCzyO/lMXHQ+p7uGhonmGVisv6tSBSVgWzMBohTcvkC9vQcQFA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.25.9" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-react-display-name": { + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-display-name/-/plugin-transform-react-display-name-7.25.9.tgz", + "integrity": "sha512-KJfMlYIUxQB1CJfO3e0+h0ZHWOTLCPP115Awhaz8U0Zpq36Gl/cXlpoyMRnUWlhNUBAzldnCiAZNvCDj7CrKxQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.25.9" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-react-jsx": { + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx/-/plugin-transform-react-jsx-7.25.9.tgz", + "integrity": "sha512-s5XwpQYCqGerXl+Pu6VDL3x0j2d82eiV77UJ8a2mDHAW7j9SWRqQ2y1fNo1Z74CdcYipl5Z41zvjj4Nfzq36rw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-annotate-as-pure": "^7.25.9", + "@babel/helper-module-imports": "^7.25.9", + "@babel/helper-plugin-utils": "^7.25.9", + "@babel/plugin-syntax-jsx": "^7.25.9", + "@babel/types": "^7.25.9" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-react-jsx-development": { + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx-development/-/plugin-transform-react-jsx-development-7.25.9.tgz", + "integrity": "sha512-9mj6rm7XVYs4mdLIpbZnHOYdpW42uoiBCTVowg7sP1thUOiANgMb4UtpRivR0pp5iL+ocvUv7X4mZgFRpJEzGw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/plugin-transform-react-jsx": "^7.25.9" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-react-pure-annotations": { + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-pure-annotations/-/plugin-transform-react-pure-annotations-7.25.9.tgz", + "integrity": "sha512-KQ/Takk3T8Qzj5TppkS1be588lkbTp5uj7w6a0LeQaTMSckU/wK0oJ/pih+T690tkgI5jfmg2TqDJvd41Sj1Cg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-annotate-as-pure": "^7.25.9", + "@babel/helper-plugin-utils": "^7.25.9" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-regenerator": { + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-regenerator/-/plugin-transform-regenerator-7.25.9.tgz", + "integrity": "sha512-vwDcDNsgMPDGP0nMqzahDWE5/MLcX8sv96+wfX7as7LoF/kr97Bo/7fI00lXY4wUXYfVmwIIyG80fGZ1uvt2qg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.25.9", + "regenerator-transform": "^0.15.2" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-regexp-modifiers": { + "version": "7.26.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-regexp-modifiers/-/plugin-transform-regexp-modifiers-7.26.0.tgz", + "integrity": "sha512-vN6saax7lrA2yA/Pak3sCxuD6F5InBjn9IcrIKQPjpsLvuHYLVroTxjdlVRHjjBWxKOqIwpTXDkOssYT4BFdRw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-create-regexp-features-plugin": "^7.25.9", + "@babel/helper-plugin-utils": "^7.25.9" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/plugin-transform-reserved-words": { + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-reserved-words/-/plugin-transform-reserved-words-7.25.9.tgz", + "integrity": "sha512-7DL7DKYjn5Su++4RXu8puKZm2XBPHyjWLUidaPEkCUBbE7IPcsrkRHggAOOKydH1dASWdcUBxrkOGNxUv5P3Jg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.25.9" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-shorthand-properties": { + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-shorthand-properties/-/plugin-transform-shorthand-properties-7.25.9.tgz", + "integrity": "sha512-MUv6t0FhO5qHnS/W8XCbHmiRWOphNufpE1IVxhK5kuN3Td9FT1x4rx4K42s3RYdMXCXpfWkGSbCSd0Z64xA7Ng==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.25.9" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-spread": { + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-spread/-/plugin-transform-spread-7.25.9.tgz", + "integrity": "sha512-oNknIB0TbURU5pqJFVbOOFspVlrpVwo2H1+HUIsVDvp5VauGGDP1ZEvO8Nn5xyMEs3dakajOxlmkNW7kNgSm6A==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.25.9", + "@babel/helper-skip-transparent-expression-wrappers": "^7.25.9" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-sticky-regex": { + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-sticky-regex/-/plugin-transform-sticky-regex-7.25.9.tgz", + "integrity": "sha512-WqBUSgeVwucYDP9U/xNRQam7xV8W5Zf+6Eo7T2SRVUFlhRiMNFdFz58u0KZmCVVqs2i7SHgpRnAhzRNmKfi2uA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.25.9" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-template-literals": { + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-template-literals/-/plugin-transform-template-literals-7.25.9.tgz", + "integrity": "sha512-o97AE4syN71M/lxrCtQByzphAdlYluKPDBzDVzMmfCobUjjhAryZV0AIpRPrxN0eAkxXO6ZLEScmt+PNhj2OTw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.25.9" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-typeof-symbol": { + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-typeof-symbol/-/plugin-transform-typeof-symbol-7.25.9.tgz", + "integrity": "sha512-v61XqUMiueJROUv66BVIOi0Fv/CUuZuZMl5NkRoCVxLAnMexZ0A3kMe7vvZ0nulxMuMp0Mk6S5hNh48yki08ZA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.25.9" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-typescript": { + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-typescript/-/plugin-transform-typescript-7.25.9.tgz", + "integrity": "sha512-7PbZQZP50tzv2KGGnhh82GSyMB01yKY9scIjf1a+GfZCtInOWqUH5+1EBU4t9fyR5Oykkkc9vFTs4OHrhHXljQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-annotate-as-pure": "^7.25.9", + "@babel/helper-create-class-features-plugin": "^7.25.9", + "@babel/helper-plugin-utils": "^7.25.9", + "@babel/helper-skip-transparent-expression-wrappers": "^7.25.9", + "@babel/plugin-syntax-typescript": "^7.25.9" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-unicode-escapes": { + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-escapes/-/plugin-transform-unicode-escapes-7.25.9.tgz", + "integrity": "sha512-s5EDrE6bW97LtxOcGj1Khcx5AaXwiMmi4toFWRDP9/y0Woo6pXC+iyPu/KuhKtfSrNFd7jJB+/fkOtZy6aIC6Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.25.9" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-unicode-property-regex": { + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-property-regex/-/plugin-transform-unicode-property-regex-7.25.9.tgz", + "integrity": "sha512-Jt2d8Ga+QwRluxRQ307Vlxa6dMrYEMZCgGxoPR8V52rxPyldHu3hdlHspxaqYmE7oID5+kB+UKUB/eWS+DkkWg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-create-regexp-features-plugin": "^7.25.9", + "@babel/helper-plugin-utils": "^7.25.9" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-unicode-regex": { + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-regex/-/plugin-transform-unicode-regex-7.25.9.tgz", + "integrity": "sha512-yoxstj7Rg9dlNn9UQxzk4fcNivwv4nUYz7fYXBaKxvw/lnmPuOm/ikoELygbYq68Bls3D/D+NBPHiLwZdZZ4HA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-create-regexp-features-plugin": "^7.25.9", + "@babel/helper-plugin-utils": "^7.25.9" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-unicode-sets-regex": { + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-sets-regex/-/plugin-transform-unicode-sets-regex-7.25.9.tgz", + "integrity": "sha512-8BYqO3GeVNHtx69fdPshN3fnzUNLrWdHhk/icSwigksJGczKSizZ+Z6SBCxTs723Fr5VSNorTIK7a+R2tISvwQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-create-regexp-features-plugin": "^7.25.9", + "@babel/helper-plugin-utils": "^7.25.9" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/preset-env": { + "version": "7.26.0", + "resolved": "https://registry.npmjs.org/@babel/preset-env/-/preset-env-7.26.0.tgz", + "integrity": "sha512-H84Fxq0CQJNdPFT2DrfnylZ3cf5K43rGfWK4LJGPpjKHiZlk0/RzwEus3PDDZZg+/Er7lCA03MVacueUuXdzfw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/compat-data": "^7.26.0", + "@babel/helper-compilation-targets": "^7.25.9", + "@babel/helper-plugin-utils": "^7.25.9", + "@babel/helper-validator-option": "^7.25.9", + "@babel/plugin-bugfix-firefox-class-in-computed-class-key": "^7.25.9", + "@babel/plugin-bugfix-safari-class-field-initializer-scope": "^7.25.9", + "@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression": "^7.25.9", + "@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining": "^7.25.9", + "@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly": "^7.25.9", + "@babel/plugin-proposal-private-property-in-object": "7.21.0-placeholder-for-preset-env.2", + "@babel/plugin-syntax-import-assertions": "^7.26.0", + "@babel/plugin-syntax-import-attributes": "^7.26.0", + "@babel/plugin-syntax-unicode-sets-regex": "^7.18.6", + "@babel/plugin-transform-arrow-functions": "^7.25.9", + "@babel/plugin-transform-async-generator-functions": "^7.25.9", + "@babel/plugin-transform-async-to-generator": "^7.25.9", + "@babel/plugin-transform-block-scoped-functions": "^7.25.9", + "@babel/plugin-transform-block-scoping": "^7.25.9", + "@babel/plugin-transform-class-properties": "^7.25.9", + "@babel/plugin-transform-class-static-block": "^7.26.0", + "@babel/plugin-transform-classes": "^7.25.9", + "@babel/plugin-transform-computed-properties": "^7.25.9", + "@babel/plugin-transform-destructuring": "^7.25.9", + "@babel/plugin-transform-dotall-regex": "^7.25.9", + "@babel/plugin-transform-duplicate-keys": "^7.25.9", + "@babel/plugin-transform-duplicate-named-capturing-groups-regex": "^7.25.9", + "@babel/plugin-transform-dynamic-import": "^7.25.9", + "@babel/plugin-transform-exponentiation-operator": "^7.25.9", + "@babel/plugin-transform-export-namespace-from": "^7.25.9", + "@babel/plugin-transform-for-of": "^7.25.9", + "@babel/plugin-transform-function-name": "^7.25.9", + "@babel/plugin-transform-json-strings": "^7.25.9", + "@babel/plugin-transform-literals": "^7.25.9", + "@babel/plugin-transform-logical-assignment-operators": "^7.25.9", + "@babel/plugin-transform-member-expression-literals": "^7.25.9", + "@babel/plugin-transform-modules-amd": "^7.25.9", + "@babel/plugin-transform-modules-commonjs": "^7.25.9", + "@babel/plugin-transform-modules-systemjs": "^7.25.9", + "@babel/plugin-transform-modules-umd": "^7.25.9", + "@babel/plugin-transform-named-capturing-groups-regex": "^7.25.9", + "@babel/plugin-transform-new-target": "^7.25.9", + "@babel/plugin-transform-nullish-coalescing-operator": "^7.25.9", + "@babel/plugin-transform-numeric-separator": "^7.25.9", + "@babel/plugin-transform-object-rest-spread": "^7.25.9", + "@babel/plugin-transform-object-super": "^7.25.9", + "@babel/plugin-transform-optional-catch-binding": "^7.25.9", + "@babel/plugin-transform-optional-chaining": "^7.25.9", + "@babel/plugin-transform-parameters": "^7.25.9", + "@babel/plugin-transform-private-methods": "^7.25.9", + "@babel/plugin-transform-private-property-in-object": "^7.25.9", + "@babel/plugin-transform-property-literals": "^7.25.9", + "@babel/plugin-transform-regenerator": "^7.25.9", + "@babel/plugin-transform-regexp-modifiers": "^7.26.0", + "@babel/plugin-transform-reserved-words": "^7.25.9", + "@babel/plugin-transform-shorthand-properties": "^7.25.9", + "@babel/plugin-transform-spread": "^7.25.9", + "@babel/plugin-transform-sticky-regex": "^7.25.9", + "@babel/plugin-transform-template-literals": "^7.25.9", + "@babel/plugin-transform-typeof-symbol": "^7.25.9", + "@babel/plugin-transform-unicode-escapes": "^7.25.9", + "@babel/plugin-transform-unicode-property-regex": "^7.25.9", + "@babel/plugin-transform-unicode-regex": "^7.25.9", + "@babel/plugin-transform-unicode-sets-regex": "^7.25.9", + "@babel/preset-modules": "0.1.6-no-external-plugins", + "babel-plugin-polyfill-corejs2": "^0.4.10", + "babel-plugin-polyfill-corejs3": "^0.10.6", + "babel-plugin-polyfill-regenerator": "^0.6.1", + "core-js-compat": "^3.38.1", + "semver": "^6.3.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/preset-modules": { + "version": "0.1.6-no-external-plugins", + "resolved": "https://registry.npmjs.org/@babel/preset-modules/-/preset-modules-0.1.6-no-external-plugins.tgz", + "integrity": "sha512-HrcgcIESLm9aIR842yhJ5RWan/gebQUJ6E/E5+rf0y9o6oj7w0Br+sWuL6kEQ/o/AdfvR1Je9jG18/gnpwjEyA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.0.0", + "@babel/types": "^7.4.4", + "esutils": "^2.0.2" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0 || ^8.0.0-0 <8.0.0" + } + }, + "node_modules/@babel/preset-react": { + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/preset-react/-/preset-react-7.25.9.tgz", + "integrity": "sha512-D3to0uSPiWE7rBrdIICCd0tJSIGpLaaGptna2+w7Pft5xMqLpA1sz99DK5TZ1TjGbdQ/VI1eCSZ06dv3lT4JOw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.25.9", + "@babel/helper-validator-option": "^7.25.9", + "@babel/plugin-transform-react-display-name": "^7.25.9", + "@babel/plugin-transform-react-jsx": "^7.25.9", + "@babel/plugin-transform-react-jsx-development": "^7.25.9", + "@babel/plugin-transform-react-pure-annotations": "^7.25.9" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/preset-typescript": { + "version": "7.26.0", + "resolved": "https://registry.npmjs.org/@babel/preset-typescript/-/preset-typescript-7.26.0.tgz", + "integrity": "sha512-NMk1IGZ5I/oHhoXEElcm+xUnL/szL6xflkFZmoEU9xj1qSJXpiS7rsspYo92B4DRCDvZn2erT5LdsCeXAKNCkg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.25.9", + "@babel/helper-validator-option": "^7.25.9", + "@babel/plugin-syntax-jsx": "^7.25.9", + "@babel/plugin-transform-modules-commonjs": "^7.25.9", + "@babel/plugin-transform-typescript": "^7.25.9" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/runtime": { + "version": "7.26.0", + "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.26.0.tgz", + "integrity": "sha512-FDSOghenHTiToteC/QRlv2q3DhPZ/oOXTBoirfWNx1Cx3TMVcGWQtMMmQcSvb/JjpNeGzx8Pq/b4fKEJuWm1sw==", + "dev": true, + "license": "MIT", + "dependencies": { + "regenerator-runtime": "^0.14.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/template": { + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.25.9.tgz", + "integrity": "sha512-9DGttpmPvIxBb/2uwpVo3dqJ+O6RooAFOS+lB+xDqoE2PVCE8nfoHMdZLpfCQRLwvohzXISPZcgxt80xLfsuwg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/code-frame": "^7.25.9", + "@babel/parser": "^7.25.9", + "@babel/types": "^7.25.9" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/traverse": { + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.25.9.tgz", + "integrity": "sha512-ZCuvfwOwlz/bawvAuvcj8rrithP2/N55Tzz342AkTvq4qaWbGfmCk/tKhNaV2cthijKrPAA8SRJV5WWe7IBMJw==", + "dev": true, + "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" + } + }, + "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==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-string-parser": "^7.25.9", + "@babel/helper-validator-identifier": "^7.25.9" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@bcoe/v8-coverage": { + "version": "0.2.3", + "resolved": "https://registry.npmjs.org/@bcoe/v8-coverage/-/v8-coverage-0.2.3.tgz", + "integrity": "sha512-0hYQ8SB4Db5zvZB4axdMHGwEaQjkZzFjQiN9LVYvIFB2nSUHW9tYpxWriPrWDASIxiaXax83REcLxuSdnGPZtw==", + "dev": true, + "license": "MIT" + }, + "node_modules/@chromatic-com/storybook": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/@chromatic-com/storybook/-/storybook-3.2.2.tgz", + "integrity": "sha512-xmXt/GW0hAPbzNTrxYuVo43Adrtjue4DeVrsoIIEeJdGaPNNeNf+DHMlJKOBdlHmCnFUoe9R/0mLM9zUp5bKWw==", + "dev": true, + "license": "MIT", + "dependencies": { + "chromatic": "^11.15.0", + "filesize": "^10.0.12", + "jsonfile": "^6.1.0", + "react-confetti": "^6.1.0", + "strip-ansi": "^7.1.0" + }, + "engines": { + "node": ">=16.0.0", + "yarn": ">=1.22.18" + }, + "peerDependencies": { + "storybook": "^8.2.0 || ^8.3.0-0 || ^8.4.0-0 || ^8.5.0-0 || ^8.6.0-0" + } + }, + "node_modules/@electron/get": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/@electron/get/-/get-2.0.3.tgz", + "integrity": "sha512-Qkzpg2s9GnVV2I2BjRksUi43U5e6+zaQMcjoJy0C+C5oxaKl+fmckGDQFtRpZpZV0NQekuZZ+tGz7EA9TVnQtQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "debug": "^4.1.1", + "env-paths": "^2.2.0", + "fs-extra": "^8.1.0", + "got": "^11.8.5", + "progress": "^2.0.3", + "semver": "^6.2.0", + "sumchecker": "^3.0.1" + }, + "engines": { + "node": ">=12" + }, + "optionalDependencies": { + "global-agent": "^3.0.0" + } + }, + "node_modules/@electron/get/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==", + "dev": true, + "license": "MIT", + "dependencies": { + "graceful-fs": "^4.2.0", + "jsonfile": "^4.0.0", + "universalify": "^0.1.0" + }, + "engines": { + "node": ">=6 <7 || >=8" + } + }, + "node_modules/@electron/get/node_modules/jsonfile": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-4.0.0.tgz", + "integrity": "sha512-m6F1R3z8jjlf2imQHS2Qez5sjKWQzbuuhuJ/FKYFRZvPE3PuHcSMVZzfsLhGVOkfd20obL5SWEBew5ShlquNxg==", + "dev": true, + "license": "MIT", + "optionalDependencies": { + "graceful-fs": "^4.1.6" + } + }, + "node_modules/@electron/get/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==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 4.0.0" + } + }, + "node_modules/@electron/remote": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/@electron/remote/-/remote-2.1.2.tgz", + "integrity": "sha512-EPwNx+nhdrTBxyCqXt/pftoQg/ybtWDW3DUWHafejvnB1ZGGfMpv6e15D8KeempocjXe78T7WreyGGb3mlZxdA==", + "dev": true, + "license": "MIT", + "peerDependencies": { + "electron": ">= 13.0.0" + } + }, + "node_modules/@es-joy/jsdoccomment": { + "version": "0.49.0", + "resolved": "https://registry.npmjs.org/@es-joy/jsdoccomment/-/jsdoccomment-0.49.0.tgz", + "integrity": "sha512-xjZTSFgECpb9Ohuk5yMX5RhUEbfeQcuOp8IF60e+wyzWEF0M5xeSgqsfLtvPEX8BIyOX9saZqzuGPmZ8oWc+5Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "comment-parser": "1.4.1", + "esquery": "^1.6.0", + "jsdoc-type-pratt-parser": "~4.1.0" + }, + "engines": { + "node": ">=16" + } + }, + "node_modules/@esbuild/aix-ppc64": { + "version": "0.24.0", + "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.24.0.tgz", + "integrity": "sha512-WtKdFM7ls47zkKHFVzMz8opM7LkcsIp9amDUBIAWirg70RM71WRSjdILPsY5Uv1D42ZpUfaPILDlfactHgsRkw==", + "cpu": [ + "ppc64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "aix" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/android-arm": { + "version": "0.24.0", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.24.0.tgz", + "integrity": "sha512-arAtTPo76fJ/ICkXWetLCc9EwEHKaeya4vMrReVlEIUCAUncH7M4bhMQ+M9Vf+FFOZJdTNMXNBrWwW+OXWpSew==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/android-arm64": { + "version": "0.24.0", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.24.0.tgz", + "integrity": "sha512-Vsm497xFM7tTIPYK9bNTYJyF/lsP590Qc1WxJdlB6ljCbdZKU9SY8i7+Iin4kyhV/KV5J2rOKsBQbB77Ab7L/w==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/android-x64": { + "version": "0.24.0", + "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.24.0.tgz", + "integrity": "sha512-t8GrvnFkiIY7pa7mMgJd7p8p8qqYIz1NYiAoKc75Zyv73L3DZW++oYMSHPRarcotTKuSs6m3hTOa5CKHaS02TQ==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/darwin-arm64": { + "version": "0.24.0", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.24.0.tgz", + "integrity": "sha512-CKyDpRbK1hXwv79soeTJNHb5EiG6ct3efd/FTPdzOWdbZZfGhpbcqIpiD0+vwmpu0wTIL97ZRPZu8vUt46nBSw==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/darwin-x64": { + "version": "0.24.0", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.24.0.tgz", + "integrity": "sha512-rgtz6flkVkh58od4PwTRqxbKH9cOjaXCMZgWD905JOzjFKW+7EiUObfd/Kav+A6Gyud6WZk9w+xu6QLytdi2OA==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/freebsd-arm64": { + "version": "0.24.0", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.24.0.tgz", + "integrity": "sha512-6Mtdq5nHggwfDNLAHkPlyLBpE5L6hwsuXZX8XNmHno9JuL2+bg2BX5tRkwjyfn6sKbxZTq68suOjgWqCicvPXA==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/freebsd-x64": { + "version": "0.24.0", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.24.0.tgz", + "integrity": "sha512-D3H+xh3/zphoX8ck4S2RxKR6gHlHDXXzOf6f/9dbFt/NRBDIE33+cVa49Kil4WUjxMGW0ZIYBYtaGCa2+OsQwQ==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-arm": { + "version": "0.24.0", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.24.0.tgz", + "integrity": "sha512-gJKIi2IjRo5G6Glxb8d3DzYXlxdEj2NlkixPsqePSZMhLudqPhtZ4BUrpIuTjJYXxvF9njql+vRjB2oaC9XpBw==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-arm64": { + "version": "0.24.0", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.24.0.tgz", + "integrity": "sha512-TDijPXTOeE3eaMkRYpcy3LarIg13dS9wWHRdwYRnzlwlA370rNdZqbcp0WTyyV/k2zSxfko52+C7jU5F9Tfj1g==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-ia32": { + "version": "0.24.0", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.24.0.tgz", + "integrity": "sha512-K40ip1LAcA0byL05TbCQ4yJ4swvnbzHscRmUilrmP9Am7//0UjPreh4lpYzvThT2Quw66MhjG//20mrufm40mA==", + "cpu": [ + "ia32" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-loong64": { + "version": "0.24.0", + "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.24.0.tgz", + "integrity": "sha512-0mswrYP/9ai+CU0BzBfPMZ8RVm3RGAN/lmOMgW4aFUSOQBjA31UP8Mr6DDhWSuMwj7jaWOT0p0WoZ6jeHhrD7g==", + "cpu": [ + "loong64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-mips64el": { + "version": "0.24.0", + "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.24.0.tgz", + "integrity": "sha512-hIKvXm0/3w/5+RDtCJeXqMZGkI2s4oMUGj3/jM0QzhgIASWrGO5/RlzAzm5nNh/awHE0A19h/CvHQe6FaBNrRA==", + "cpu": [ + "mips64el" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-ppc64": { + "version": "0.24.0", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.24.0.tgz", + "integrity": "sha512-HcZh5BNq0aC52UoocJxaKORfFODWXZxtBaaZNuN3PUX3MoDsChsZqopzi5UupRhPHSEHotoiptqikjN/B77mYQ==", + "cpu": [ + "ppc64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-riscv64": { + "version": "0.24.0", + "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.24.0.tgz", + "integrity": "sha512-bEh7dMn/h3QxeR2KTy1DUszQjUrIHPZKyO6aN1X4BCnhfYhuQqedHaa5MxSQA/06j3GpiIlFGSsy1c7Gf9padw==", + "cpu": [ + "riscv64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-s390x": { + "version": "0.24.0", + "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.24.0.tgz", + "integrity": "sha512-ZcQ6+qRkw1UcZGPyrCiHHkmBaj9SiCD8Oqd556HldP+QlpUIe2Wgn3ehQGVoPOvZvtHm8HPx+bH20c9pvbkX3g==", + "cpu": [ + "s390x" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-x64": { + "version": "0.24.0", + "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.24.0.tgz", + "integrity": "sha512-vbutsFqQ+foy3wSSbmjBXXIJ6PL3scghJoM8zCL142cGaZKAdCZHyf+Bpu/MmX9zT9Q0zFBVKb36Ma5Fzfa8xA==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/netbsd-x64": { + "version": "0.24.0", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.24.0.tgz", + "integrity": "sha512-hjQ0R/ulkO8fCYFsG0FZoH+pWgTTDreqpqY7UnQntnaKv95uP5iW3+dChxnx7C3trQQU40S+OgWhUVwCjVFLvg==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "netbsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/openbsd-arm64": { + "version": "0.24.0", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-arm64/-/openbsd-arm64-0.24.0.tgz", + "integrity": "sha512-MD9uzzkPQbYehwcN583yx3Tu5M8EIoTD+tUgKF982WYL9Pf5rKy9ltgD0eUgs8pvKnmizxjXZyLt0z6DC3rRXg==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "openbsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/openbsd-x64": { + "version": "0.24.0", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.24.0.tgz", + "integrity": "sha512-4ir0aY1NGUhIC1hdoCzr1+5b43mw99uNwVzhIq1OY3QcEwPDO3B7WNXBzaKY5Nsf1+N11i1eOfFcq+D/gOS15Q==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "openbsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/sunos-x64": { + "version": "0.24.0", + "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.24.0.tgz", + "integrity": "sha512-jVzdzsbM5xrotH+W5f1s+JtUy1UWgjU0Cf4wMvffTB8m6wP5/kx0KiaLHlbJO+dMgtxKV8RQ/JvtlFcdZ1zCPA==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "sunos" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/win32-arm64": { + "version": "0.24.0", + "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.24.0.tgz", + "integrity": "sha512-iKc8GAslzRpBytO2/aN3d2yb2z8XTVfNV0PjGlCxKo5SgWmNXx82I/Q3aG1tFfS+A2igVCY97TJ8tnYwpUWLCA==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/win32-ia32": { + "version": "0.24.0", + "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.24.0.tgz", + "integrity": "sha512-vQW36KZolfIudCcTnaTpmLQ24Ha1RjygBo39/aLkM2kmjkWmZGEJ5Gn9l5/7tzXA42QGIoWbICfg6KLLkIw6yw==", + "cpu": [ + "ia32" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/win32-x64": { + "version": "0.24.0", + "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.24.0.tgz", + "integrity": "sha512-7IAFPrjSQIJrGsK6flwg7NFmwBoSTyF3rl7If0hNUFQU4ilTsEPL6GuMuU9BfIWVVGuRnuIidkSMC+c0Otu8IA==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@eslint-community/eslint-utils": { + "version": "4.4.1", + "resolved": "https://registry.npmjs.org/@eslint-community/eslint-utils/-/eslint-utils-4.4.1.tgz", + "integrity": "sha512-s3O3waFUrMV8P/XaF/+ZTp1X9XBZW1a4B97ZnjQF2KYWaFD2A8KyFBsrsfSjEmjn3RGWAIuvlneuZm3CUK3jbA==", + "dev": true, + "license": "MIT", + "dependencies": { + "eslint-visitor-keys": "^3.4.3" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + }, + "peerDependencies": { + "eslint": "^6.0.0 || ^7.0.0 || >=8.0.0" + } + }, + "node_modules/@eslint-community/regexpp": { + "version": "4.12.1", + "resolved": "https://registry.npmjs.org/@eslint-community/regexpp/-/regexpp-4.12.1.tgz", + "integrity": "sha512-CCZCDJuduB9OUkFkY2IgppNZMi2lBQgD2qzwXkEia16cge2pijY/aXi96CJMquDMn3nJdlPV1A5KrJEXwfLNzQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": "^12.0.0 || ^14.0.0 || >=16.0.0" + } + }, + "node_modules/@eslint/eslintrc": { + "version": "2.1.4", + "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-2.1.4.tgz", + "integrity": "sha512-269Z39MS6wVJtsoUl10L60WdkhJVdPG24Q4eZTH3nnF6lpvSShEK3wQjDX9JRWAUPvPh7COouPpU9IrqaZFvtQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "ajv": "^6.12.4", + "debug": "^4.3.2", + "espree": "^9.6.0", + "globals": "^13.19.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": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/@eslint/eslintrc/node_modules/argparse": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", + "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==", + "dev": true, + "license": "Python-2.0" + }, + "node_modules/@eslint/eslintrc/node_modules/brace-expansion": { + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", + "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "dev": true, + "license": "MIT", + "dependencies": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "node_modules/@eslint/eslintrc/node_modules/globals": { + "version": "13.24.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-13.24.0.tgz", + "integrity": "sha512-AhO5QUcj8llrbG09iWhPU2B204J1xnPeL8kQmVorSsy+Sjj1sk8gIyh6cUocGmH4L0UuhAJy+hJMRA4mgA4mFQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "type-fest": "^0.20.2" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@eslint/eslintrc/node_modules/js-yaml": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz", + "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==", + "dev": true, + "license": "MIT", + "dependencies": { + "argparse": "^2.0.1" + }, + "bin": { + "js-yaml": "bin/js-yaml.js" + } + }, + "node_modules/@eslint/eslintrc/node_modules/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/@eslint/eslintrc/node_modules/type-fest": { + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.20.2.tgz", + "integrity": "sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==", + "dev": true, + "license": "(MIT OR CC0-1.0)", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@eslint/js": { + "version": "8.57.1", + "resolved": "https://registry.npmjs.org/@eslint/js/-/js-8.57.1.tgz", + "integrity": "sha512-d9zaMRSTIKDLhctzH12MtXvJKSSUhaHcjV+2Z+GK+EEY7XKpP5yR4x+N3TAcHTcu963nIr+TMcCb4DBCYX1z6Q==", + "dev": true, + "license": "MIT", + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + } + }, + "node_modules/@fork-of/git-branch": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/@fork-of/git-branch/-/git-branch-2.1.1.tgz", + "integrity": "sha512-X4dAtlXMGKYzOsc6W9LhKZh2m8L4KgWr6Im4gOTAhw7Mqekw8PWSGb8cetO3SVejp5gDbv0iMpd24vsks6S2TA==", + "dev": true, + "license": "MIT", + "dependencies": { + "find-git-root": "^1.0.4" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/@humanwhocodes/config-array": { + "version": "0.13.0", + "resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.13.0.tgz", + "integrity": "sha512-DZLEEqFWQFiyK6h5YIeynKx7JlvCYWL0cImfSRXZ9l4Sg2efkFGTuFf6vzXjK1cq6IYkU+Eg/JizXw+TD2vRNw==", + "deprecated": "Use @eslint/config-array instead", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@humanwhocodes/object-schema": "^2.0.3", + "debug": "^4.3.1", + "minimatch": "^3.0.5" + }, + "engines": { + "node": ">=10.10.0" + } + }, + "node_modules/@humanwhocodes/config-array/node_modules/brace-expansion": { + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", + "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "dev": true, + "license": "MIT", + "dependencies": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "node_modules/@humanwhocodes/config-array/node_modules/minimatch": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "dev": true, + "license": "ISC", + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" + } + }, + "node_modules/@humanwhocodes/module-importer": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@humanwhocodes/module-importer/-/module-importer-1.0.1.tgz", + "integrity": "sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": ">=12.22" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/nzakas" + } + }, + "node_modules/@humanwhocodes/object-schema": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/@humanwhocodes/object-schema/-/object-schema-2.0.3.tgz", + "integrity": "sha512-93zYdMES/c1D69yZiKDBj0V24vqNzB/koF26KPaagAfd3P/4gUlh3Dys5ogAK+Exi9QyzlD8x/08Zt7wIKcDcA==", + "deprecated": "Use @eslint/object-schema instead", + "dev": true, + "license": "BSD-3-Clause" + }, + "node_modules/@inquirer/figures": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/@inquirer/figures/-/figures-1.0.8.tgz", + "integrity": "sha512-tKd+jsmhq21AP1LhexC0pPwsCxEhGgAkg28byjJAd+xhmIs8LUX8JbUc3vBf3PhLxWiB5EvyBE5X7JSPAqMAqg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18" + } + }, + "node_modules/@isaacs/cliui": { + "version": "8.0.2", + "resolved": "https://registry.npmjs.org/@isaacs/cliui/-/cliui-8.0.2.tgz", + "integrity": "sha512-O8jcjabXaleOG9DQ0+ARXWZBTfnP4WNAqzuiJK7ll44AmxGKv/J2M4TPjxjY3znBCfvBXFzucm1twdyFybFqEA==", + "dev": true, + "license": "ISC", + "dependencies": { + "string-width": "^5.1.2", + "string-width-cjs": "npm:string-width@^4.2.0", + "strip-ansi": "^7.0.1", + "strip-ansi-cjs": "npm:strip-ansi@^6.0.1", + "wrap-ansi": "^8.1.0", + "wrap-ansi-cjs": "npm:wrap-ansi@^7.0.0" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/@isaacs/cliui/node_modules/ansi-styles": { + "version": "6.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-6.2.1.tgz", + "integrity": "sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/@isaacs/cliui/node_modules/emoji-regex": { + "version": "9.2.2", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-9.2.2.tgz", + "integrity": "sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==", + "dev": true, + "license": "MIT" + }, + "node_modules/@isaacs/cliui/node_modules/string-width": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-5.1.2.tgz", + "integrity": "sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA==", + "dev": true, + "license": "MIT", + "dependencies": { + "eastasianwidth": "^0.2.0", + "emoji-regex": "^9.2.2", + "strip-ansi": "^7.0.1" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@isaacs/cliui/node_modules/wrap-ansi": { + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-8.1.0.tgz", + "integrity": "sha512-si7QWI6zUMq56bESFvagtmzMdGOtoxfR+Sez11Mobfc7tm+VkUckk9bW2UeffTGVUbOksxmSw0AA2gs8g71NCQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-styles": "^6.1.0", + "string-width": "^5.0.1", + "strip-ansi": "^7.0.1" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/wrap-ansi?sponsor=1" + } + }, + "node_modules/@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/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/@jest/console": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/@jest/console/-/console-29.7.0.tgz", + "integrity": "sha512-5Ni4CU7XHQi32IJ398EEP4RrB8eV09sXP2ROqD4bksHrnTree52PsxvX8tpL8LvTZ3pFzXyPbNQReSN41CAhOg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/types": "^29.6.3", + "@types/node": "*", + "chalk": "^4.0.0", + "jest-message-util": "^29.7.0", + "jest-util": "^29.7.0", + "slash": "^3.0.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/@jest/console/node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "license": "MIT", + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/@jest/console/node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/@jest/core": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/@jest/core/-/core-29.7.0.tgz", + "integrity": "sha512-n7aeXWKMnGtDA48y8TLWJPJmLmmZ642Ceo78cYWEpiD7FzDgmNDV/GCVRorPABdXLJZ/9wzzgZAlHjXjxDHGsg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/console": "^29.7.0", + "@jest/reporters": "^29.7.0", + "@jest/test-result": "^29.7.0", + "@jest/transform": "^29.7.0", + "@jest/types": "^29.6.3", + "@types/node": "*", + "ansi-escapes": "^4.2.1", + "chalk": "^4.0.0", + "ci-info": "^3.2.0", + "exit": "^0.1.2", + "graceful-fs": "^4.2.9", + "jest-changed-files": "^29.7.0", + "jest-config": "^29.7.0", + "jest-haste-map": "^29.7.0", + "jest-message-util": "^29.7.0", + "jest-regex-util": "^29.6.3", + "jest-resolve": "^29.7.0", + "jest-resolve-dependencies": "^29.7.0", + "jest-runner": "^29.7.0", + "jest-runtime": "^29.7.0", + "jest-snapshot": "^29.7.0", + "jest-util": "^29.7.0", + "jest-validate": "^29.7.0", + "jest-watcher": "^29.7.0", + "micromatch": "^4.0.4", + "pretty-format": "^29.7.0", + "slash": "^3.0.0", + "strip-ansi": "^6.0.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + }, + "peerDependencies": { + "node-notifier": "^8.0.1 || ^9.0.0 || ^10.0.0" + }, + "peerDependenciesMeta": { + "node-notifier": { + "optional": true + } + } + }, + "node_modules/@jest/core/node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/@jest/core/node_modules/chalk/node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "license": "MIT", + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/@jest/core/node_modules/pretty-format": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-29.7.0.tgz", + "integrity": "sha512-Pdlw/oPxN+aXdmM9R00JVC9WVFoCLTKJvDVLgmJ+qAffBMxsV85l/Lu7sNx4zSzPyoL2euImuEwHhOXdEgNFZQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/schemas": "^29.6.3", + "ansi-styles": "^5.0.0", + "react-is": "^18.0.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/@jest/core/node_modules/react-is": { + "version": "18.3.1", + "resolved": "https://registry.npmjs.org/react-is/-/react-is-18.3.1.tgz", + "integrity": "sha512-/LLMVyas0ljjAtoYiPqYiL8VWXzUUdThrmU5+n20DZv+a+ClRoevUzw5JxU+Ieh5/c87ytoTBV9G1FiKfNJdmg==", + "dev": true, + "license": "MIT" + }, + "node_modules/@jest/core/node_modules/strip-ansi": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/@jest/environment": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/@jest/environment/-/environment-29.7.0.tgz", + "integrity": "sha512-aQIfHDq33ExsN4jP1NWGXhxgQ/wixs60gDiKO+XVMd8Mn0NWPWgc34ZQDTb2jKaUWQ7MuwoitXAsN2XVXNMpAw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/fake-timers": "^29.7.0", + "@jest/types": "^29.6.3", + "@types/node": "*", + "jest-mock": "^29.7.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/@jest/expect": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/@jest/expect/-/expect-29.7.0.tgz", + "integrity": "sha512-8uMeAMycttpva3P1lBHB8VciS9V0XAr3GymPpipdyQXbBcuhkLQOSe8E/p92RyAdToS6ZD1tFkX+CkhoECE0dQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "expect": "^29.7.0", + "jest-snapshot": "^29.7.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/@jest/expect-utils": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/@jest/expect-utils/-/expect-utils-29.7.0.tgz", + "integrity": "sha512-GlsNBWiFQFCVi9QVSx7f5AgMeLxe9YCCs5PuP2O2LdjDAA8Jh9eX7lA1Jq/xdXw3Wb3hyvlFNfZIfcRetSzYcA==", + "dev": true, + "license": "MIT", + "dependencies": { + "jest-get-type": "^29.6.3" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/@jest/fake-timers": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/@jest/fake-timers/-/fake-timers-29.7.0.tgz", + "integrity": "sha512-q4DH1Ha4TTFPdxLsqDXK1d3+ioSL7yL5oCMJZgDYm6i+6CygW5E5xVr/D1HdsGxjt1ZWSfUAs9OxSB/BNelWrQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/types": "^29.6.3", + "@sinonjs/fake-timers": "^10.0.2", + "@types/node": "*", + "jest-message-util": "^29.7.0", + "jest-mock": "^29.7.0", + "jest-util": "^29.7.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/@jest/globals": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/@jest/globals/-/globals-29.7.0.tgz", + "integrity": "sha512-mpiz3dutLbkW2MNFubUGUEVLkTGiqW6yLVTA+JbP6fI6J5iL9Y0Nlg8k95pcF8ctKwCS7WVxteBs29hhfAotzQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/environment": "^29.7.0", + "@jest/expect": "^29.7.0", + "@jest/types": "^29.6.3", + "jest-mock": "^29.7.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/@jest/reporters": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/@jest/reporters/-/reporters-29.7.0.tgz", + "integrity": "sha512-DApq0KJbJOEzAFYjHADNNxAE3KbhxQB1y5Kplb5Waqw6zVbuWatSnMjE5gs8FUgEPmNsnZA3NCWl9NG0ia04Pg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@bcoe/v8-coverage": "^0.2.3", + "@jest/console": "^29.7.0", + "@jest/test-result": "^29.7.0", + "@jest/transform": "^29.7.0", + "@jest/types": "^29.6.3", + "@jridgewell/trace-mapping": "^0.3.18", + "@types/node": "*", + "chalk": "^4.0.0", + "collect-v8-coverage": "^1.0.0", + "exit": "^0.1.2", + "glob": "^7.1.3", + "graceful-fs": "^4.2.9", + "istanbul-lib-coverage": "^3.0.0", + "istanbul-lib-instrument": "^6.0.0", + "istanbul-lib-report": "^3.0.0", + "istanbul-lib-source-maps": "^4.0.0", + "istanbul-reports": "^3.1.3", + "jest-message-util": "^29.7.0", + "jest-util": "^29.7.0", + "jest-worker": "^29.7.0", + "slash": "^3.0.0", + "string-length": "^4.0.1", + "strip-ansi": "^6.0.0", + "v8-to-istanbul": "^9.0.1" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + }, + "peerDependencies": { + "node-notifier": "^8.0.1 || ^9.0.0 || ^10.0.0" + }, + "peerDependenciesMeta": { + "node-notifier": { + "optional": true + } + } + }, + "node_modules/@jest/reporters/node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "license": "MIT", + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/@jest/reporters/node_modules/brace-expansion": { + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", + "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "dev": true, + "license": "MIT", + "dependencies": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "node_modules/@jest/reporters/node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/@jest/reporters/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", + "dev": true, + "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/@jest/reporters/node_modules/istanbul-lib-instrument": { + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/istanbul-lib-instrument/-/istanbul-lib-instrument-6.0.3.tgz", + "integrity": "sha512-Vtgk7L/R2JHyyGW07spoFlB8/lpjiOLTjMdms6AFMraYt3BaJauod/NGrfnVG/y4Ix1JEuMRPDPEj2ua+zz1/Q==", + "dev": true, + "license": "BSD-3-Clause", + "dependencies": { + "@babel/core": "^7.23.9", + "@babel/parser": "^7.23.9", + "@istanbuljs/schema": "^0.1.3", + "istanbul-lib-coverage": "^3.2.0", + "semver": "^7.5.4" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/@jest/reporters/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/@jest/reporters/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/@jest/reporters/node_modules/strip-ansi": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/@jest/schemas": { + "version": "29.6.3", + "resolved": "https://registry.npmjs.org/@jest/schemas/-/schemas-29.6.3.tgz", + "integrity": "sha512-mo5j5X+jIZmJQveBKeS/clAueipV7KgiX1vMgCxam1RNYiqE1w62n0/tJJnHtjW8ZHcQco5gY85jA3mi0L+nSA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@sinclair/typebox": "^0.27.8" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/@jest/source-map": { + "version": "29.6.3", + "resolved": "https://registry.npmjs.org/@jest/source-map/-/source-map-29.6.3.tgz", + "integrity": "sha512-MHjT95QuipcPrpLM+8JMSzFx6eHp5Bm+4XeFDJlwsvVBjmKNiIAvasGK2fxz2WbGRlnvqehFbh07MMa7n3YJnw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jridgewell/trace-mapping": "^0.3.18", + "callsites": "^3.0.0", + "graceful-fs": "^4.2.9" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/@jest/test-result": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/@jest/test-result/-/test-result-29.7.0.tgz", + "integrity": "sha512-Fdx+tv6x1zlkJPcWXmMDAG2HBnaR9XPSd5aDWQVsfrZmLVT3lU1cwyxLgRmXR9yrq4NBoEm9BMsfgFzTQAbJYA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/console": "^29.7.0", + "@jest/types": "^29.6.3", + "@types/istanbul-lib-coverage": "^2.0.0", + "collect-v8-coverage": "^1.0.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/@jest/test-sequencer": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/@jest/test-sequencer/-/test-sequencer-29.7.0.tgz", + "integrity": "sha512-GQwJ5WZVrKnOJuiYiAF52UNUJXgTZx1NHjFSEB0qEMmSZKAkdMoIzw/Cj6x6NF4AvV23AUqDpFzQkN/eYCYTxw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/test-result": "^29.7.0", + "graceful-fs": "^4.2.9", + "jest-haste-map": "^29.7.0", + "slash": "^3.0.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/@jest/transform": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/@jest/transform/-/transform-29.7.0.tgz", + "integrity": "sha512-ok/BTPFzFKVMwO5eOHRrvnBVHdRy9IrsrW1GpMaQ9MCnilNLXQKmAX8s1YXDFaai9xJpac2ySzV0YeRRECr2Vw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/core": "^7.11.6", + "@jest/types": "^29.6.3", + "@jridgewell/trace-mapping": "^0.3.18", + "babel-plugin-istanbul": "^6.1.1", + "chalk": "^4.0.0", + "convert-source-map": "^2.0.0", + "fast-json-stable-stringify": "^2.1.0", + "graceful-fs": "^4.2.9", + "jest-haste-map": "^29.7.0", + "jest-regex-util": "^29.6.3", + "jest-util": "^29.7.0", + "micromatch": "^4.0.4", + "pirates": "^4.0.4", + "slash": "^3.0.0", + "write-file-atomic": "^4.0.2" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/@jest/transform/node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "license": "MIT", + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/@jest/transform/node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/@jest/types": { + "version": "29.6.3", + "resolved": "https://registry.npmjs.org/@jest/types/-/types-29.6.3.tgz", + "integrity": "sha512-u3UPsIilWKOM3F9CXtrG8LEJmNxwoCQC/XVj4IKYXvvpx7QIi/Kg1LI5uDmDpKlac62NUtX7eLjRh+jVZcLOzw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/schemas": "^29.6.3", + "@types/istanbul-lib-coverage": "^2.0.0", + "@types/istanbul-reports": "^3.0.0", + "@types/node": "*", + "@types/yargs": "^17.0.8", + "chalk": "^4.0.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/@jest/types/node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "license": "MIT", + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/@jest/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, + "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/@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==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jridgewell/set-array": "^1.2.1", + "@jridgewell/sourcemap-codec": "^1.4.10", + "@jridgewell/trace-mapping": "^0.3.24" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@jridgewell/resolve-uri": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.2.tgz", + "integrity": "sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@jridgewell/set-array": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/@jridgewell/set-array/-/set-array-1.2.1.tgz", + "integrity": "sha512-R8gLRTZeyp03ymzP/6Lil/28tGeGEzhx1q2k703KGWRAI1VdvPIXdG70VJc2pAMw3NA6JKL5hhFu1sJX0Mnn/A==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@jridgewell/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==", + "dev": true, + "license": "MIT" + }, + "node_modules/@jridgewell/trace-mapping": { + "version": "0.3.25", + "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.25.tgz", + "integrity": "sha512-vNk6aEwybGtawWmy/PzwnGDOjCkLWSD2wqvjGGAgOAwCGWySYXfYoxt00IJkTF+8Lb57DwOb3Aa0o9CApepiYQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jridgewell/resolve-uri": "^3.1.0", + "@jridgewell/sourcemap-codec": "^1.4.14" + } + }, + "node_modules/@kayahr/jest-electron-runner": { + "version": "29.15.0", + "resolved": "https://registry.npmjs.org/@kayahr/jest-electron-runner/-/jest-electron-runner-29.15.0.tgz", + "integrity": "sha512-362Fl0+qoViBFmRq06vjFW+2iQbwq9s69GyLUxtoFRRNXdSM4AdG5kcf/Hj8kp5oGgzmacjf5mJRpR6xv/V7ow==", + "dev": true, + "license": "MIT", + "dependencies": { + "@electron/remote": "^2.1.2", + "@jest/console": "^29.7.0", + "@jest/transform": "^29.7.0", + "electron": "^33.0.1", + "jest": "^29.7.0", + "jest-docblock": "^29.7.0", + "jest-haste-map": "^29.7.0", + "jest-jasmine2": "^29.7.0", + "jest-leak-detector": "^29.7.0", + "jest-message-util": "^29.7.0", + "jest-mock": "^29.7.0", + "jest-resolve": "^29.7.0", + "jest-runtime": "^29.7.0", + "jest-util": "^29.7.0", + "node-ipc": "^10.1.0", + "shell-quote": "^1.8.1", + "source-map-support": "^0.5.21", + "throat": "^6.0.2", + "tslib": "^2.8.0", + "uuid": "^10.0.0" + }, + "funding": { + "url": "https://github.com/kayahr/jest-electron-runner?sponsor=1" + } + }, + "node_modules/@mdx-js/loader": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/@mdx-js/loader/-/loader-3.1.0.tgz", + "integrity": "sha512-xU/lwKdOyfXtQGqn3VnJjlDrmKXEvMi1mgYxVmukEUtVycIz1nh7oQ40bKTd4cA7rLStqu0740pnhGYxGoqsCg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@mdx-js/mdx": "^3.0.0", + "source-map": "^0.7.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + }, + "peerDependencies": { + "webpack": ">=5" + }, + "peerDependenciesMeta": { + "webpack": { + "optional": true + } + } + }, + "node_modules/@mdx-js/mdx": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/@mdx-js/mdx/-/mdx-3.1.0.tgz", + "integrity": "sha512-/QxEhPAvGwbQmy1Px8F899L5Uc2KZ6JtXwlCgJmjSTBedwOZkByYcBG4GceIGPXRDsmfxhHazuS+hlOShRLeDw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/estree": "^1.0.0", + "@types/estree-jsx": "^1.0.0", + "@types/hast": "^3.0.0", + "@types/mdx": "^2.0.0", + "collapse-white-space": "^2.0.0", + "devlop": "^1.0.0", + "estree-util-is-identifier-name": "^3.0.0", + "estree-util-scope": "^1.0.0", + "estree-walker": "^3.0.0", + "hast-util-to-jsx-runtime": "^2.0.0", + "markdown-extensions": "^2.0.0", + "recma-build-jsx": "^1.0.0", + "recma-jsx": "^1.0.0", + "recma-stringify": "^1.0.0", + "rehype-recma": "^1.0.0", + "remark-mdx": "^3.0.0", + "remark-parse": "^11.0.0", + "remark-rehype": "^11.0.0", + "source-map": "^0.7.0", + "unified": "^11.0.0", + "unist-util-position-from-estree": "^2.0.0", + "unist-util-stringify-position": "^4.0.0", + "unist-util-visit": "^5.0.0", + "vfile": "^6.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/@mdx-js/react": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/@mdx-js/react/-/react-3.1.0.tgz", + "integrity": "sha512-QjHtSaoameoalGnKDT3FoIl4+9RwyTmo9ZJGBdLOks/YOiWHoRDI3PUwEzOE7kEmGcV3AFcp9K6dYu9rEuKLAQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/mdx": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + }, + "peerDependencies": { + "@types/react": ">=16", + "react": ">=16" + } + }, + "node_modules/@nodelib/fs.scandir": { + "version": "2.1.5", + "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz", + "integrity": "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==", + "dev": true, + "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==", + "dev": true, + "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==", + "dev": true, + "license": "MIT", + "dependencies": { + "@nodelib/fs.scandir": "2.1.5", + "fastq": "^1.6.0" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/@pixi-spine/base": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/@pixi-spine/base/-/base-4.0.3.tgz", + "integrity": "sha512-0bunaWebaDswLFtYZ6whV+ZvgLQ7oANcvbPmIOoVpS/1pOY3Y/GAnWOFbgp3qt9Q/ntLYqNjGve6xq0IqpsTAA==", + "dev": true, + "peerDependencies": { + "@pixi/core": "^7.0.0", + "@pixi/display": "^7.0.0", + "@pixi/graphics": "^7.0.0", + "@pixi/mesh": "^7.0.0", + "@pixi/mesh-extras": "^7.0.0", + "@pixi/sprite": "^7.0.0" + } + }, + "node_modules/@pixi-spine/loader-base": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/@pixi-spine/loader-base/-/loader-base-4.0.4.tgz", + "integrity": "sha512-Grgu+PxiUpgYWpuMRr3h5jrN3ZTnwyXfu3HuYdFb6mbJTTMub4xBPALeui+O+tw0k9RNRAr99pUzu9Rc9XTbAw==", + "dev": true, + "peerDependencies": { + "@pixi-spine/base": "^4.0.0", + "@pixi/assets": " ^7.0.0", + "@pixi/core": "^7.0.0" + } + }, + "node_modules/@pixi-spine/loader-uni": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/@pixi-spine/loader-uni/-/loader-uni-4.0.3.tgz", + "integrity": "sha512-tfhTJrnuog8ObKbbiSG1wV/nIUc3O98WfwS6lCmewaupoMIKF0ujg21MCqXUXJvljQJzU9tbURI+DWu4w9dnnA==", + "dev": true, + "peerDependencies": { + "@pixi-spine/base": "^4.0.0", + "@pixi-spine/loader-base": "^4.0.0", + "@pixi-spine/runtime-3.7": "^4.0.0", + "@pixi-spine/runtime-3.8": "^4.0.0", + "@pixi-spine/runtime-4.1": "^4.0.0", + "@pixi/assets": " ^7.0.0", + "@pixi/core": "^7.0.0", + "@pixi/display": "^7.0.0", + "@pixi/graphics": "^7.0.0", + "@pixi/mesh": "^7.0.0", + "@pixi/mesh-extras": "^7.0.0", + "@pixi/sprite": "^7.0.0" + } + }, + "node_modules/@pixi-spine/runtime-3.7": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/@pixi-spine/runtime-3.7/-/runtime-3.7-4.0.3.tgz", + "integrity": "sha512-zuopKtSqjRc37wjW5xJ64j9DbiBB7rkPMFeldeWBPCbfZiCcFcwSZwZnrcgC+f4HIGo0NeviAvJGM8Hcf3AyeA==", + "dev": true, + "license": "SEE SPINE-LICENSE", + "peerDependencies": { + "@pixi-spine/base": "^4.0.0", + "@pixi/core": "^7.0.0" + } + }, + "node_modules/@pixi-spine/runtime-3.8": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/@pixi-spine/runtime-3.8/-/runtime-3.8-4.0.3.tgz", + "integrity": "sha512-lIhb4jOTon+FVYLO9AIgcB6jf9hC+RLEn8PesaDRibDocQ1htVCkEIhCIU3Mc00fuqIby7lMBsINeS/Th0q3bw==", + "dev": true, + "license": "SEE SPINE-LICENSE", + "peerDependencies": { + "@pixi-spine/base": "^4.0.0", + "@pixi/core": "^7.0.0" + } + }, + "node_modules/@pixi-spine/runtime-4.0": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/@pixi-spine/runtime-4.0/-/runtime-4.0-4.0.3.tgz", + "integrity": "sha512-2Y8qhxRkg/yH/9VylGsRVAd5W+dXVPhHTjFk0RR9wEUzTCkdZ17pE+56s2nESi2X3sYNKkz8FowfaqIvXnVGxw==", + "dev": true, + "license": "SEE SPINE-LICENSE", + "peerDependencies": { + "@pixi-spine/base": "^4.0.0", + "@pixi/core": "^7.0.0" + } + }, + "node_modules/@pixi-spine/runtime-4.1": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/@pixi-spine/runtime-4.1/-/runtime-4.1-4.0.3.tgz", + "integrity": "sha512-jK433snCQMC4FUPiDgyIcxhiatvRNSxqgs0CgHjjQ0l8GlY6gPpkkdThQ6GsFNme1SUZ4uvnWwawXFIGjW1IpQ==", + "dev": true, + "license": "SEE SPINE-LICENSE", + "peerDependencies": { + "@pixi-spine/base": "^4.0.0", + "@pixi/core": "^7.0.0" + } + }, + "node_modules/@pixi/accessibility": { + "version": "7.4.2", + "resolved": "https://registry.npmjs.org/@pixi/accessibility/-/accessibility-7.4.2.tgz", + "integrity": "sha512-R6VEolm8uyy1FB1F2qaLKxVbzXAFTZCF2ka8fl9lsz7We6ZfO4QpXv9ur7DvzratjCQUQVCKo0/V7xL5q1EV/g==", + "dev": true, + "license": "MIT", + "peerDependencies": { + "@pixi/core": "7.4.2", + "@pixi/display": "7.4.2", + "@pixi/events": "7.4.2" + } + }, + "node_modules/@pixi/app": { + "version": "7.4.2", + "resolved": "https://registry.npmjs.org/@pixi/app/-/app-7.4.2.tgz", + "integrity": "sha512-ugkH3kOgjT8P1mTMY29yCOgEh+KuVMAn8uBxeY0aMqaUgIMysfpnFv+Aepp2CtvI9ygr22NC+OiKl+u+eEaQHw==", + "dev": true, + "license": "MIT", + "peerDependencies": { + "@pixi/core": "7.4.2", + "@pixi/display": "7.4.2" + } + }, + "node_modules/@pixi/assets": { + "version": "7.4.2", + "resolved": "https://registry.npmjs.org/@pixi/assets/-/assets-7.4.2.tgz", + "integrity": "sha512-anxho59H9egZwoaEdM5aLvYyxoz6NCy3CaQIvNHD1bbGg8L16Ih0e26QSBR5fu53jl8OjT6M7s+p6n7uu4+fGA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/css-font-loading-module": "^0.0.12" + }, + "peerDependencies": { + "@pixi/core": "7.4.2" + } + }, + "node_modules/@pixi/color": { + "version": "7.4.2", + "resolved": "https://registry.npmjs.org/@pixi/color/-/color-7.4.2.tgz", + "integrity": "sha512-av1LOvhHsiaW8+T4n/FgnOKHby55/w7VcA1HzPIHRBtEcsmxvSCDanT1HU2LslNhrxLPzyVx18nlmalOyt5OBg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@pixi/colord": "^2.9.6" + } + }, + "node_modules/@pixi/colord": { + "version": "2.9.6", + "resolved": "https://registry.npmjs.org/@pixi/colord/-/colord-2.9.6.tgz", + "integrity": "sha512-nezytU2pw587fQstUu1AsJZDVEynjskwOL+kibwcdxsMBFqPsFFNA7xl0ii/gXuDi6M0xj3mfRJj8pBSc2jCfA==", + "dev": true, + "license": "MIT" + }, + "node_modules/@pixi/compressed-textures": { + "version": "7.4.2", + "resolved": "https://registry.npmjs.org/@pixi/compressed-textures/-/compressed-textures-7.4.2.tgz", + "integrity": "sha512-VJrt7el6O4ZJSWkeOGXwrhJaiLg1UBhHB3fj42VR4YloYkAxpfd9K6s6IcbcVz7n9L48APKBMgHyaB2pX2Ck/A==", + "dev": true, + "license": "MIT", + "peerDependencies": { + "@pixi/assets": "7.4.2", + "@pixi/core": "7.4.2" + } + }, + "node_modules/@pixi/constants": { + "version": "7.4.2", + "resolved": "https://registry.npmjs.org/@pixi/constants/-/constants-7.4.2.tgz", + "integrity": "sha512-N9vn6Wpz5WIQg7ugUg2+SdqD2u2+NM0QthE8YzLJ4tLH2Iz+/TrnPKUJzeyIqbg3sxJG5ZpGGPiacqIBpy1KyA==", + "dev": true, + "license": "MIT" + }, + "node_modules/@pixi/core": { + "version": "7.4.2", + "resolved": "https://registry.npmjs.org/@pixi/core/-/core-7.4.2.tgz", + "integrity": "sha512-UbMtgSEnyCOFPzbE6ThB9qopXxbZ5GCof2ArB4FXOC5Xi/83MOIIYg5kf5M8689C5HJMhg2SrJu3xLKppF+CMg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@pixi/color": "7.4.2", + "@pixi/constants": "7.4.2", + "@pixi/extensions": "7.4.2", + "@pixi/math": "7.4.2", + "@pixi/runner": "7.4.2", + "@pixi/settings": "7.4.2", + "@pixi/ticker": "7.4.2", + "@pixi/utils": "7.4.2" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/pixijs" + } + }, + "node_modules/@pixi/display": { + "version": "7.4.2", + "resolved": "https://registry.npmjs.org/@pixi/display/-/display-7.4.2.tgz", + "integrity": "sha512-DaD0J7gIlNlzO0Fdlby/0OH+tB5LtCY6rgFeCBKVDnzmn8wKW3zYZRenWBSFJ0Psx6vLqXYkSIM/rcokaKviIw==", + "dev": true, + "license": "MIT", + "peerDependencies": { + "@pixi/core": "7.4.2" + } + }, + "node_modules/@pixi/eslint-config": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/@pixi/eslint-config/-/eslint-config-5.1.0.tgz", + "integrity": "sha512-J1/YOGs4tVOleZU1WyoglZQyWHHbZjOyrma2ZbtpLYwmRzAqYesda1RrbMlcWXcAsVqSyothwMuOJxHNBojT1Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "@typescript-eslint/eslint-plugin": "^6.0.0", + "@typescript-eslint/parser": "^6.0.0", + "eslint-plugin-import": "^2.26.0", + "eslint-plugin-simple-import-sort": "^10.0.0" + }, + "peerDependencies": { + "eslint": ">=8", + "typescript": ">=5" + } + }, + "node_modules/@pixi/events": { + "version": "7.4.2", + "resolved": "https://registry.npmjs.org/@pixi/events/-/events-7.4.2.tgz", + "integrity": "sha512-Jw/w57heZjzZShIXL0bxOvKB+XgGIevyezhGtfF2ZSzQoSBWo+Fj1uE0QwKd0RIaXegZw/DhSmiMJSbNmcjifA==", + "dev": true, + "license": "MIT", + "peerDependencies": { + "@pixi/core": "7.4.2", + "@pixi/display": "7.4.2" + } + }, + "node_modules/@pixi/extension-scripts": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/@pixi/extension-scripts/-/extension-scripts-2.4.1.tgz", + "integrity": "sha512-99kPhE3xk4269k3qADtinRf/0FydVcDOBofhffpM8tqwTwqyyJ7NNqbdvIEiKiPFtQhESv+0tWoKVb7/SRmPdg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@kayahr/jest-electron-runner": "^29.3.0", + "@pixi/eslint-config": "^5.1.0", + "@pixi/rollup-plugin-rename-node-modules": "^2.0.0", + "@pixi/webdoc-template": "^1.5.5", + "@rollup/plugin-commonjs": "^24.0.0", + "@rollup/plugin-node-resolve": "^15.0.1", + "@rollup/plugin-replace": "^5.0.2", + "@types/http-server": "^0.12.1", + "@types/jest": "^29.2.4", + "@webdoc/cli": "^2.2.0", + "chalk": "^5.0.0", + "clean-package": "^2.2.0", + "eslint": "^8.30.0", + "gh-pages": "^4.0.0", + "glob": "^10.3.10", + "http-server": "^14.1.1", + "inquirer": "^9.0.0", + "jest": "^29.3.1", + "jest-extended": "^1.2.1", + "jest-raw-loader": "^1.0.1", + "jest-runner": "^29.3.1", + "rimraf": "^3.0.2", + "rollup": "^3.8.1", + "rollup-plugin-esbuild": "^5.0.0", + "rollup-plugin-string": "^3.0.0", + "tree-kill": "^1.2.2", + "ts-jest": "^29.0.3", + "typescript": "^5.3.0" + }, + "bin": { + "extension-scripts": "lib/index.mjs", + "xs": "lib/index.mjs" + } + }, + "node_modules/@pixi/extension-scripts/node_modules/@rollup/plugin-commonjs": { + "version": "24.1.0", + "resolved": "https://registry.npmjs.org/@rollup/plugin-commonjs/-/plugin-commonjs-24.1.0.tgz", + "integrity": "sha512-eSL45hjhCWI0jCCXcNtLVqM5N1JlBGvlFfY0m6oOYnLCJ6N0qEXoZql4sY2MOUArzhH4SA/qBpTxvvZp2Sc+DQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@rollup/pluginutils": "^5.0.1", + "commondir": "^1.0.1", + "estree-walker": "^2.0.2", + "glob": "^8.0.3", + "is-reference": "1.2.1", + "magic-string": "^0.27.0" + }, + "engines": { + "node": ">=14.0.0" + }, + "peerDependencies": { + "rollup": "^2.68.0||^3.0.0" + }, + "peerDependenciesMeta": { + "rollup": { + "optional": true + } + } + }, + "node_modules/@pixi/extension-scripts/node_modules/@rollup/plugin-commonjs/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/@pixi/extension-scripts/node_modules/estree-walker": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-2.0.2.tgz", + "integrity": "sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w==", + "dev": true, + "license": "MIT" + }, + "node_modules/@pixi/extension-scripts/node_modules/magic-string": { + "version": "0.27.0", + "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.27.0.tgz", + "integrity": "sha512-8UnnX2PeRAPZuN12svgR9j7M1uWMovg/CEnIwIG0LFkXSJJe4PdfUGiTGl8V9bsBHFUtfVINcSyYxd7q+kx9fA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jridgewell/sourcemap-codec": "^1.4.13" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/@pixi/extension-scripts/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/@pixi/extensions": { + "version": "7.4.2", + "resolved": "https://registry.npmjs.org/@pixi/extensions/-/extensions-7.4.2.tgz", + "integrity": "sha512-Hmx2+O0yZ8XIvgomHM9GZEGcy9S9Dd8flmtOK5Aa3fXs/8v7xD08+ANQpN9ZqWU2Xs+C6UBlpqlt2BWALvKKKA==", + "dev": true, + "license": "MIT" + }, + "node_modules/@pixi/extract": { + "version": "7.4.2", + "resolved": "https://registry.npmjs.org/@pixi/extract/-/extract-7.4.2.tgz", + "integrity": "sha512-JOX27TRWjVEjauGBbF8PU7/g6LYXnivehdgqS5QlVDv1CNHTOrz/j3MdKcVWOhyZPbH5c9sh7lxyRxvd9AIuTQ==", + "dev": true, + "license": "MIT", + "peerDependencies": { + "@pixi/core": "7.4.2" + } + }, + "node_modules/@pixi/filter-alpha": { + "version": "7.4.2", + "resolved": "https://registry.npmjs.org/@pixi/filter-alpha/-/filter-alpha-7.4.2.tgz", + "integrity": "sha512-9OsKJ+yvY2wIcQXwswj5HQBiwNGymwmqdxfp7mo+nZSBoDmxUqvMZzE9UNJ3eUlswuNvNRO8zNOsQvwdz7WFww==", + "dev": true, + "license": "MIT", + "peerDependencies": { + "@pixi/core": "7.4.2" + } + }, + "node_modules/@pixi/filter-blur": { + "version": "7.4.2", + "resolved": "https://registry.npmjs.org/@pixi/filter-blur/-/filter-blur-7.4.2.tgz", + "integrity": "sha512-gOXBbIUx6CRZP1fmsis2wLzzSsofrqmIHhbf1gIkZMIQaLsc9T7brj+PaLTTiOiyJgnvGN5j20RZnkERWWKV0Q==", + "dev": true, + "license": "MIT", + "peerDependencies": { + "@pixi/core": "7.4.2" + } + }, + "node_modules/@pixi/filter-color-matrix": { + "version": "7.4.2", + "resolved": "https://registry.npmjs.org/@pixi/filter-color-matrix/-/filter-color-matrix-7.4.2.tgz", + "integrity": "sha512-ykZiR59Gvj80UKs9qm7jeUTKvn+wWk6HBVJOmJbK9jFK5juakDWp7BbH26U78Q61EWj97kI1FdfcbMkuQ7rqkA==", + "dev": true, + "license": "MIT", + "peerDependencies": { + "@pixi/core": "7.4.2" + } + }, + "node_modules/@pixi/filter-displacement": { + "version": "7.4.2", + "resolved": "https://registry.npmjs.org/@pixi/filter-displacement/-/filter-displacement-7.4.2.tgz", + "integrity": "sha512-QS/eWp/ivsxef3xapNeGwpPX7vrqQQeo99Fux4k5zsvplnNEsf91t6QYJLG776AbZEu/qh8VYRBA5raIVY/REw==", + "dev": true, + "license": "MIT", + "peerDependencies": { + "@pixi/core": "7.4.2" + } + }, + "node_modules/@pixi/filter-fxaa": { + "version": "7.4.2", + "resolved": "https://registry.npmjs.org/@pixi/filter-fxaa/-/filter-fxaa-7.4.2.tgz", + "integrity": "sha512-U/ptJgDsfs/r8y2a6gCaiPfDu2IFAxpQ4wtfmBpz6vRhqeE4kI8yNIUx5dZbui57zlsJaW0BNacOQxHU0vLkyQ==", + "dev": true, + "license": "MIT", + "peerDependencies": { + "@pixi/core": "7.4.2" + } + }, + "node_modules/@pixi/filter-motion-blur": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/@pixi/filter-motion-blur/-/filter-motion-blur-5.1.1.tgz", + "integrity": "sha512-I94s3pW2GutjCyXiKQ/dI4Vl9JKne+Q8QgGRn1mrk0Uwg6DDO/OQI3jqv01S+SCTU3LZqhR/p8AQyxeDmOhr2w==", + "dev": true, + "license": "MIT", + "peerDependencies": { + "@pixi/core": "^7.0.0-X" + } + }, + "node_modules/@pixi/filter-noise": { + "version": "7.4.2", + "resolved": "https://registry.npmjs.org/@pixi/filter-noise/-/filter-noise-7.4.2.tgz", + "integrity": "sha512-Vy9ViBFhZEGh6xKkd3kFWErolZTwv1Y5Qb1bV7qPIYbvBECYsqzlR4uCrrjBV6KKm0PufpG/+NKC5vICZaqKzg==", + "dev": true, + "license": "MIT", + "peerDependencies": { + "@pixi/core": "7.4.2" + } + }, + "node_modules/@pixi/graphics": { + "version": "7.4.2", + "resolved": "https://registry.npmjs.org/@pixi/graphics/-/graphics-7.4.2.tgz", + "integrity": "sha512-jH4/Tum2RqWzHGzvlwEr7HIVduoLO57Ze705N2zQPkUD57TInn5911aGUeoua7f/wK8cTLGzgB9BzSo2kTdcHw==", + "dev": true, + "license": "MIT", + "peerDependencies": { + "@pixi/core": "7.4.2", + "@pixi/display": "7.4.2", + "@pixi/sprite": "7.4.2" + } + }, + "node_modules/@pixi/math": { + "version": "7.4.2", + "resolved": "https://registry.npmjs.org/@pixi/math/-/math-7.4.2.tgz", + "integrity": "sha512-7jHmCQoYk6e0rfSKjdNFOPl0wCcdgoraxgteXJTTHv3r0bMNx2pHD9FJ0VvocEUG7XHfj55O3+u7yItOAx0JaQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/@pixi/mesh": { + "version": "7.4.2", + "resolved": "https://registry.npmjs.org/@pixi/mesh/-/mesh-7.4.2.tgz", + "integrity": "sha512-mEkKyQvvMrYXC3pahvH5WBIKtrtB63WixRr91ANFI7zXD+ESG6Ap6XtxMCJmXDQPwBDNk7SWVMiCflYuchG7kA==", + "dev": true, + "license": "MIT", + "peerDependencies": { + "@pixi/core": "7.4.2", + "@pixi/display": "7.4.2" + } + }, + "node_modules/@pixi/mesh-extras": { + "version": "7.4.2", + "resolved": "https://registry.npmjs.org/@pixi/mesh-extras/-/mesh-extras-7.4.2.tgz", + "integrity": "sha512-vNR/7wjxjs7sv9fGoKkHyU91ZAD+7EnMHBS5F3CVISlOIFxLi96NNZCB81oUIdky/90pHw40johd/4izR5zTyw==", + "dev": true, + "license": "MIT", + "peerDependencies": { + "@pixi/core": "7.4.2", + "@pixi/mesh": "7.4.2" + } + }, + "node_modules/@pixi/mixin-cache-as-bitmap": { + "version": "7.4.2", + "resolved": "https://registry.npmjs.org/@pixi/mixin-cache-as-bitmap/-/mixin-cache-as-bitmap-7.4.2.tgz", + "integrity": "sha512-6dgthi2ruUT/lervSrFDQ7vXkEsHo6CxdgV7W/wNdW1dqgQlKfDvO6FhjXzyIMRLSooUf5FoeluVtfsjkUIYrw==", + "dev": true, + "license": "MIT", + "peerDependencies": { + "@pixi/core": "7.4.2", + "@pixi/display": "7.4.2", + "@pixi/sprite": "7.4.2" + } + }, + "node_modules/@pixi/mixin-get-child-by-name": { + "version": "7.4.2", + "resolved": "https://registry.npmjs.org/@pixi/mixin-get-child-by-name/-/mixin-get-child-by-name-7.4.2.tgz", + "integrity": "sha512-0Cfw8JpQhsixprxiYph4Lj+B5n83Kk4ftNMXgM5xtZz+tVLz5s91qR0MqcdzwTGTJ7utVygiGmS4/3EfR/duRQ==", + "dev": true, + "license": "MIT", + "peerDependencies": { + "@pixi/display": "7.4.2" + } + }, + "node_modules/@pixi/mixin-get-global-position": { + "version": "7.4.2", + "resolved": "https://registry.npmjs.org/@pixi/mixin-get-global-position/-/mixin-get-global-position-7.4.2.tgz", + "integrity": "sha512-LcsahbVdX4DFS2IcGfNp4KaXuu7SjAwUp/flZSGIfstyKOKb5FWFgihtqcc9ZT4coyri3gs2JbILZub/zPZj1w==", + "dev": true, + "license": "MIT", + "peerDependencies": { + "@pixi/core": "7.4.2", + "@pixi/display": "7.4.2" + } + }, + "node_modules/@pixi/particle-container": { + "version": "7.4.2", + "resolved": "https://registry.npmjs.org/@pixi/particle-container/-/particle-container-7.4.2.tgz", + "integrity": "sha512-B78Qq86kt0lEa5WtB2YFIm3+PjhKfw9La9R++GBSgABl+g13s2UaZ6BIPxvY3JxWMdxPm4iPrQPFX1QWRN68mw==", + "dev": true, + "license": "MIT", + "peerDependencies": { + "@pixi/core": "7.4.2", + "@pixi/display": "7.4.2", + "@pixi/sprite": "7.4.2" + } + }, + "node_modules/@pixi/prepare": { + "version": "7.4.2", + "resolved": "https://registry.npmjs.org/@pixi/prepare/-/prepare-7.4.2.tgz", + "integrity": "sha512-PugyMzReCHXUzc3so9PPJj2OdHwibpUNWyqG4mWY2UUkb6c8NAGK1AnAPiscOvLilJcv/XQSFoNhX+N1jrvJEg==", + "dev": true, + "license": "MIT", + "peerDependencies": { + "@pixi/core": "7.4.2", + "@pixi/display": "7.4.2", + "@pixi/graphics": "7.4.2", + "@pixi/text": "7.4.2" + } + }, + "node_modules/@pixi/rollup-plugin-rename-node-modules": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/@pixi/rollup-plugin-rename-node-modules/-/rollup-plugin-rename-node-modules-2.0.0.tgz", + "integrity": "sha512-ACwFfE5PwywBl2HSt1B+lffVQJBoAOfpqbBU6Eh+RxX5uIe0m9lUFXPNA5j4c0439LQzRml5oX7LU0/kHYpMqQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "estree-walker": "^2.0.1", + "magic-string": "^0.25.7" + }, + "peerDependencies": { + "rollup": "^3.2.5" + } + }, + "node_modules/@pixi/rollup-plugin-rename-node-modules/node_modules/estree-walker": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-2.0.2.tgz", + "integrity": "sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w==", + "dev": true, + "license": "MIT" + }, + "node_modules/@pixi/runner": { + "version": "7.4.2", + "resolved": "https://registry.npmjs.org/@pixi/runner/-/runner-7.4.2.tgz", + "integrity": "sha512-LPBpwym4vdyyDY5ucF4INQccaGyxztERyLTY1YN6aqJyyMmnc7iqXlIKt+a0euMBtNoLoxy6MWMvIuZj0JfFPA==", + "dev": true, + "license": "MIT" + }, + "node_modules/@pixi/settings": { + "version": "7.4.2", + "resolved": "https://registry.npmjs.org/@pixi/settings/-/settings-7.4.2.tgz", + "integrity": "sha512-pMN+L6aWgvUbwhFIL/BTHKe2ShYGPZ8h9wlVBnFHMtUcJcFLMF1B3lzuvCayZRepOphs6RY0TqvnDvVb585JhQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@pixi/constants": "7.4.2", + "@types/css-font-loading-module": "^0.0.12", + "ismobilejs": "^1.1.0" + } + }, + "node_modules/@pixi/sprite": { + "version": "7.4.2", + "resolved": "https://registry.npmjs.org/@pixi/sprite/-/sprite-7.4.2.tgz", + "integrity": "sha512-Ccf/OVQsB+HQV0Fyf5lwD+jk1jeU7uSIqEjbxenNNssmEdB7S5qlkTBV2EJTHT83+T6Z9OMOHsreJZerydpjeg==", + "dev": true, + "license": "MIT", + "peerDependencies": { + "@pixi/core": "7.4.2", + "@pixi/display": "7.4.2" + } + }, + "node_modules/@pixi/sprite-animated": { + "version": "7.4.2", + "resolved": "https://registry.npmjs.org/@pixi/sprite-animated/-/sprite-animated-7.4.2.tgz", + "integrity": "sha512-QPT6yxCUGOBN+98H3pyIZ1ZO6Y7BN1o0Q2IMZEsD1rNfZJrTYS3Q8VlCG5t2YlFlcB8j5iBo24bZb6FUxLOmsQ==", + "dev": true, + "license": "MIT", + "peerDependencies": { + "@pixi/core": "7.4.2", + "@pixi/sprite": "7.4.2" + } + }, + "node_modules/@pixi/sprite-tiling": { + "version": "7.4.2", + "resolved": "https://registry.npmjs.org/@pixi/sprite-tiling/-/sprite-tiling-7.4.2.tgz", + "integrity": "sha512-Z8PP6ewy3nuDYL+NeEdltHAhuucVgia33uzAitvH3OqqRSx6a6YRBFbNLUM9Sx+fBO2Lk3PpV1g6QZX+NE5LOg==", + "dev": true, + "license": "MIT", + "peerDependencies": { + "@pixi/core": "7.4.2", + "@pixi/display": "7.4.2", + "@pixi/sprite": "7.4.2" + } + }, + "node_modules/@pixi/spritesheet": { + "version": "7.4.2", + "resolved": "https://registry.npmjs.org/@pixi/spritesheet/-/spritesheet-7.4.2.tgz", + "integrity": "sha512-YIvHdpXW+AYp8vD0NkjJmrdnVHTZKidCnx6k8ATSuuvCT6O5Tuh2N/Ul2oDj4/QaePy0lVhyhAbZpJW00Jr7mQ==", + "dev": true, + "license": "MIT", + "peerDependencies": { + "@pixi/assets": "7.4.2", + "@pixi/core": "7.4.2" + } + }, + "node_modules/@pixi/storybook-preset-webpack": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/@pixi/storybook-preset-webpack/-/storybook-preset-webpack-1.0.0.tgz", + "integrity": "sha512-rM5IcRhT1zGAi92GxXHg37kUuBiVIr79PnxTkZAoZXRWM845YAXUXU9KeuvYoFKRkQWawh++QHvgI2sJRoEw5A==", + "dev": true, + "license": "MIT", + "dependencies": { + "@storybook/core-webpack": "^8.0.0", + "@types/node": "^18.0.0", + "webpack": "5" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "@babel/core": "*" + } + }, + "node_modules/@pixi/storybook-preset-webpack/node_modules/@types/node": { + "version": "18.19.66", + "resolved": "https://registry.npmjs.org/@types/node/-/node-18.19.66.tgz", + "integrity": "sha512-14HmtUdGxFUalGRfLLn9Gc1oNWvWh5zNbsyOLo5JV6WARSeN1QcEBKRnZm9QqNfrutgsl/hY4eJW63aZ44aBCg==", + "dev": true, + "license": "MIT", + "dependencies": { + "undici-types": "~5.26.4" + } + }, + "node_modules/@pixi/storybook-preset-webpack/node_modules/undici-types": { + "version": "5.26.5", + "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-5.26.5.tgz", + "integrity": "sha512-JlCMO+ehdEIKqlFxk6IfVoAUVmgz7cU7zD/h9XZ0qzeosSHmUJVOzSQvvYSYWXkFXC+IfLKSIffhv0sVZup6pA==", + "dev": true, + "license": "MIT" + }, + "node_modules/@pixi/storybook-renderer": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/@pixi/storybook-renderer/-/storybook-renderer-1.0.0.tgz", + "integrity": "sha512-vA8enqGEz1yVCWSmysieOMb2CnzNx8HbvhHhpxd0IGwNamaUE+/pM4HVSwugjTYgpQ0KjAmvv2jhWfD509nlpQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@storybook/csf": "~0.1.2", + "@storybook/docs-tools": "^8.0.0", + "@storybook/manager-api": "^8.0.0", + "@storybook/preview-api": "^8.0.0", + "deep-equal": "^2.2.3", + "global": "^4.4.0", + "ts-dedent": "^2.2.0" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "@babel/core": "*", + "pixi.js": "^7.0.0 || ^8.0.0" + } + }, + "node_modules/@pixi/storybook-webpack5": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/@pixi/storybook-webpack5/-/storybook-webpack5-1.0.0.tgz", + "integrity": "sha512-kiGJ4lW1hqXvksYrw5euDDKF97BVeCIdq6MPbjmxOpRptLRZJ0PWTBlB/SoD5DHHCPYeWe+AG1+ieEBY17smtQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@pixi/storybook-preset-webpack": "^1.0.0", + "@pixi/storybook-renderer": "^1.0.0", + "@storybook/addon-webpack5-compiler-babel": "^3.0.0", + "@storybook/builder-webpack5": "^8.0.0", + "@storybook/core-common": "^8.0.0", + "@types/node": "^18.0.0", + "@types/offscreencanvas": "^2019.7.3", + "global": "^4.4.0" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "@babel/core": "*" + } + }, + "node_modules/@pixi/storybook-webpack5/node_modules/@types/node": { + "version": "18.19.66", + "resolved": "https://registry.npmjs.org/@types/node/-/node-18.19.66.tgz", + "integrity": "sha512-14HmtUdGxFUalGRfLLn9Gc1oNWvWh5zNbsyOLo5JV6WARSeN1QcEBKRnZm9QqNfrutgsl/hY4eJW63aZ44aBCg==", + "dev": true, + "license": "MIT", + "dependencies": { + "undici-types": "~5.26.4" + } + }, + "node_modules/@pixi/storybook-webpack5/node_modules/undici-types": { + "version": "5.26.5", + "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-5.26.5.tgz", + "integrity": "sha512-JlCMO+ehdEIKqlFxk6IfVoAUVmgz7cU7zD/h9XZ0qzeosSHmUJVOzSQvvYSYWXkFXC+IfLKSIffhv0sVZup6pA==", + "dev": true, + "license": "MIT" + }, + "node_modules/@pixi/text": { + "version": "7.4.2", + "resolved": "https://registry.npmjs.org/@pixi/text/-/text-7.4.2.tgz", + "integrity": "sha512-rZZWpJNsIQ8WoCWrcVg8Gi6L/PDakB941clo6dO3XjoII2ucoOUcnpe5HIkudxi2xPvS/8Bfq990gFEx50TP5A==", + "dev": true, + "license": "MIT", + "peerDependencies": { + "@pixi/core": "7.4.2", + "@pixi/sprite": "7.4.2" + } + }, + "node_modules/@pixi/text-bitmap": { + "version": "7.4.2", + "resolved": "https://registry.npmjs.org/@pixi/text-bitmap/-/text-bitmap-7.4.2.tgz", + "integrity": "sha512-lPBMJ83JnpFVL+6ckQ8KO8QmwdPm0z9Zs/M0NgFKH2F+BcjelRNnk80NI3O0qBDYSEDQIE+cFbKoZ213kf7zwA==", + "dev": true, + "license": "MIT", + "peerDependencies": { + "@pixi/assets": "7.4.2", + "@pixi/core": "7.4.2", + "@pixi/display": "7.4.2", + "@pixi/mesh": "7.4.2", + "@pixi/text": "7.4.2" + } + }, + "node_modules/@pixi/text-html": { + "version": "7.4.2", + "resolved": "https://registry.npmjs.org/@pixi/text-html/-/text-html-7.4.2.tgz", + "integrity": "sha512-duOu8oDYeDNuyPozj2DAsQ5VZBbRiwIXy78Gn7H2pCiEAefw/Uv5jJYwdgneKME0e1tOxz1eOUGKPcI6IJnZjw==", + "dev": true, + "license": "MIT", + "peerDependencies": { + "@pixi/core": "7.4.2", + "@pixi/display": "7.4.2", + "@pixi/sprite": "7.4.2", + "@pixi/text": "7.4.2" + } + }, + "node_modules/@pixi/ticker": { + "version": "7.4.2", + "resolved": "https://registry.npmjs.org/@pixi/ticker/-/ticker-7.4.2.tgz", + "integrity": "sha512-cAvxCh/KI6IW4m3tp2b+GQIf+DoSj9NNmPJmsOeEJ7LzvruG8Ps7SKI6CdjQob5WbceL1apBTDbqZ/f77hFDiQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@pixi/extensions": "7.4.2", + "@pixi/settings": "7.4.2", + "@pixi/utils": "7.4.2" + } + }, + "node_modules/@pixi/utils": { + "version": "7.4.2", + "resolved": "https://registry.npmjs.org/@pixi/utils/-/utils-7.4.2.tgz", + "integrity": "sha512-aU/itcyMC4TxFbmdngmak6ey4kC5c16Y5ntIYob9QnjNAfD/7GTsYIBnP6FqEAyO1eq0MjkAALxdONuay1BG3g==", + "dev": true, + "license": "MIT", + "dependencies": { + "@pixi/color": "7.4.2", + "@pixi/constants": "7.4.2", + "@pixi/settings": "7.4.2", + "@types/earcut": "^2.1.0", + "earcut": "^2.2.4", + "eventemitter3": "^4.0.0", + "url": "^0.11.0" + } + }, + "node_modules/@pixi/webdoc-template": { + "version": "1.5.5", + "resolved": "https://registry.npmjs.org/@pixi/webdoc-template/-/webdoc-template-1.5.5.tgz", + "integrity": "sha512-li38YBDw4/GYWDksT5xDrZEZfsC8sPtS+no3OuNFmqPNoi4/64ZTEnTM8XByrtt/NLljDLlpySANATFbLjSPEg==", + "dev": true, + "license": "MIT", + "dependencies": { + "code-prettify": "^0.1.0", + "color-themes-for-google-code-prettify": "^2.0.4", + "common-path-prefix": "^3.0.0", + "fs-extra": "^9.0.1", + "klaw-sync": "^6.0.0", + "lodash": "*", + "markdown-it": "^12.3.2", + "markdown-it-highlightjs": "^3.6.0", + "missionlog": "^1.6.0", + "open-sans-fonts": "^1.6.2", + "taffydb": "^2.7.3" + }, + "engines": { + "node": ">= 12", + "npm": ">= 6", + "pnpm": "please-use-npm", + "yarn": "please-use-npm" + }, + "peerDependencies": { + "@webdoc/model": "^1.2.1", + "@webdoc/template-library": "^1.2.1" + } + }, + "node_modules/@pkgjs/parseargs": { + "version": "0.11.0", + "resolved": "https://registry.npmjs.org/@pkgjs/parseargs/-/parseargs-0.11.0.tgz", + "integrity": "sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg==", + "dev": true, + "license": "MIT", + "optional": true, + "engines": { + "node": ">=14" + } + }, + "node_modules/@pkgr/core": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/@pkgr/core/-/core-0.1.1.tgz", + "integrity": "sha512-cq8o4cWH0ibXh9VGi5P20Tu9XF/0fFXl9EUinr9QfTM7a7p0oTA4iJRCQWppXR1Pg8dSM0UCItCkPwsk9qWWYA==", + "dev": true, + "license": "MIT", + "engines": { + "node": "^12.20.0 || ^14.18.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/unts" + } + }, + "node_modules/@popiplay/state-machine": { + "version": "1.0.5", + "resolved": "https://gitlab.popiplay.dev/api/v4/projects/254/packages/npm/@popiplay/state-machine/-/@popiplay/state-machine-1.0.5.tgz", + "integrity": "sha1-D06ZSUrt9Zt7gb7df1oamdY4UL4=", + "dev": true, + "peerDependencies": { + "@pixi/filter-motion-blur": "^5.1.1", + "@popiplay/state-machine": "^1.0.0", + "pixi-spine": "^4.0.4", + "pixi.js": "^7.4.2" + } + }, + "node_modules/@rollup/plugin-commonjs": { + "version": "28.0.1", + "resolved": "https://registry.npmjs.org/@rollup/plugin-commonjs/-/plugin-commonjs-28.0.1.tgz", + "integrity": "sha512-+tNWdlWKbpB3WgBN7ijjYkq9X5uhjmcvyjEght4NmH5fAU++zfQzAJ6wumLS+dNcvwEZhKx2Z+skY8m7v0wGSA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@rollup/pluginutils": "^5.0.1", + "commondir": "^1.0.1", + "estree-walker": "^2.0.2", + "fdir": "^6.2.0", + "is-reference": "1.2.1", + "magic-string": "^0.30.3", + "picomatch": "^4.0.2" + }, + "engines": { + "node": ">=16.0.0 || 14 >= 14.17" + }, + "peerDependencies": { + "rollup": "^2.68.0||^3.0.0||^4.0.0" + }, + "peerDependenciesMeta": { + "rollup": { + "optional": true + } + } + }, + "node_modules/@rollup/plugin-commonjs/node_modules/estree-walker": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-2.0.2.tgz", + "integrity": "sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w==", + "dev": true, + "license": "MIT" + }, + "node_modules/@rollup/plugin-commonjs/node_modules/magic-string": { + "version": "0.30.14", + "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.30.14.tgz", + "integrity": "sha512-5c99P1WKTed11ZC0HMJOj6CDIue6F8ySu+bJL+85q1zBEIY8IklrJ1eiKC2NDRh3Ct3FcvmJPyQHb9erXMTJNw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jridgewell/sourcemap-codec": "^1.5.0" + } + }, + "node_modules/@rollup/plugin-node-resolve": { + "version": "15.3.0", + "resolved": "https://registry.npmjs.org/@rollup/plugin-node-resolve/-/plugin-node-resolve-15.3.0.tgz", + "integrity": "sha512-9eO5McEICxMzJpDW9OnMYSv4Sta3hmt7VtBFz5zR9273suNOydOyq/FrGeGy+KsTRFm8w0SLVhzig2ILFT63Ag==", + "dev": true, + "license": "MIT", + "dependencies": { + "@rollup/pluginutils": "^5.0.1", + "@types/resolve": "1.20.2", + "deepmerge": "^4.2.2", + "is-module": "^1.0.0", + "resolve": "^1.22.1" + }, + "engines": { + "node": ">=14.0.0" + }, + "peerDependencies": { + "rollup": "^2.78.0||^3.0.0||^4.0.0" + }, + "peerDependenciesMeta": { + "rollup": { + "optional": true + } + } + }, + "node_modules/@rollup/plugin-replace": { + "version": "5.0.7", + "resolved": "https://registry.npmjs.org/@rollup/plugin-replace/-/plugin-replace-5.0.7.tgz", + "integrity": "sha512-PqxSfuorkHz/SPpyngLyg5GCEkOcee9M1bkxiVDr41Pd61mqP1PLOoDPbpl44SB2mQGKwV/In74gqQmGITOhEQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@rollup/pluginutils": "^5.0.1", + "magic-string": "^0.30.3" + }, + "engines": { + "node": ">=14.0.0" + }, + "peerDependencies": { + "rollup": "^1.20.0||^2.0.0||^3.0.0||^4.0.0" + }, + "peerDependenciesMeta": { + "rollup": { + "optional": true + } + } + }, + "node_modules/@rollup/plugin-replace/node_modules/magic-string": { + "version": "0.30.14", + "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.30.14.tgz", + "integrity": "sha512-5c99P1WKTed11ZC0HMJOj6CDIue6F8ySu+bJL+85q1zBEIY8IklrJ1eiKC2NDRh3Ct3FcvmJPyQHb9erXMTJNw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jridgewell/sourcemap-codec": "^1.5.0" + } + }, + "node_modules/@rollup/pluginutils": { + "version": "5.1.3", + "resolved": "https://registry.npmjs.org/@rollup/pluginutils/-/pluginutils-5.1.3.tgz", + "integrity": "sha512-Pnsb6f32CD2W3uCaLZIzDmeFyQ2b8UWMFI7xtwUezpcGBDVDW6y9XgAWIlARiGAo6eNF5FK5aQTr0LFyNyqq5A==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/estree": "^1.0.0", + "estree-walker": "^2.0.2", + "picomatch": "^4.0.2" + }, + "engines": { + "node": ">=14.0.0" + }, + "peerDependencies": { + "rollup": "^1.20.0||^2.0.0||^3.0.0||^4.0.0" + }, + "peerDependenciesMeta": { + "rollup": { + "optional": true + } + } + }, + "node_modules/@rollup/pluginutils/node_modules/estree-walker": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-2.0.2.tgz", + "integrity": "sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w==", + "dev": true, + "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/@sentry/core": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/@sentry/core/-/core-7.2.0.tgz", + "integrity": "sha512-9amsbB9/ePkJRgc0cVXCVW2hQUPImgTqBbnKu4frBXBza+9MBC5W3S8ZyZt2InCK22kuhNVo3z61a8mzCgXoCA==", + "dev": true, + "license": "BSD-3-Clause", + "dependencies": { + "@sentry/hub": "7.2.0", + "@sentry/types": "7.2.0", + "@sentry/utils": "7.2.0", + "tslib": "^1.9.3" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/@sentry/core/node_modules/tslib": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", + "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==", + "dev": true, + "license": "0BSD" + }, + "node_modules/@sentry/hub": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/@sentry/hub/-/hub-7.2.0.tgz", + "integrity": "sha512-uzd+GzD++Z4QopRh3AyRc4jz4AzomMnrXTOmdXgud1BH/Du9AYutVlBc5ZYwqCuJH7QPuAW3ySU3P+16UCinIg==", + "dev": true, + "license": "BSD-3-Clause", + "dependencies": { + "@sentry/types": "7.2.0", + "@sentry/utils": "7.2.0", + "tslib": "^1.9.3" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/@sentry/hub/node_modules/tslib": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", + "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==", + "dev": true, + "license": "0BSD" + }, + "node_modules/@sentry/integrations": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/@sentry/integrations/-/integrations-7.2.0.tgz", + "integrity": "sha512-plOD3tTEUqLpu/VNo5bE4ojSm86sYPk6PPxIBQKfKUNOMpJGSqxsLOJesVz5v/jcIW/CYXuMTHqgculovr7t/Q==", + "dev": true, + "license": "BSD-3-Clause", + "dependencies": { + "@sentry/types": "7.2.0", + "@sentry/utils": "7.2.0", + "localforage": "^1.8.1", + "tslib": "^1.9.3" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/@sentry/integrations/node_modules/tslib": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", + "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==", + "dev": true, + "license": "0BSD" + }, + "node_modules/@sentry/node": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/@sentry/node/-/node-7.2.0.tgz", + "integrity": "sha512-dSI+2DrT98+eqSAv3QG3jMrq4YefBaxRbSCR9Ok7oLQW2/eskbRWH4mgYssrDXEx319SBYHh90qq/EwCOEkHtw==", + "dev": true, + "license": "BSD-3-Clause", + "dependencies": { + "@sentry/core": "7.2.0", + "@sentry/hub": "7.2.0", + "@sentry/types": "7.2.0", + "@sentry/utils": "7.2.0", + "cookie": "^0.4.1", + "https-proxy-agent": "^5.0.0", + "lru_map": "^0.3.3", + "tslib": "^1.9.3" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/@sentry/node/node_modules/tslib": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", + "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==", + "dev": true, + "license": "0BSD" + }, + "node_modules/@sentry/types": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/@sentry/types/-/types-7.2.0.tgz", + "integrity": "sha512-e6w62C2AmE5ULr9w/BuVaKTRpKUMGWyw4PhcBlSdDRoS47QgURGgDFIvr3VlaDwkUfCbASwSv49fDhKRX3aoew==", + "dev": true, + "license": "BSD-3-Clause", + "engines": { + "node": ">=8" + } + }, + "node_modules/@sentry/utils": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/@sentry/utils/-/utils-7.2.0.tgz", + "integrity": "sha512-uUKIsIXyb6ZXBbl/L8UwG4gy8PBXZl5pGCUFRPbns+vi0U6vtmDRDYa1A/7E17VkBJNRPVNJQr9Pq5Yd0I0MRA==", + "dev": true, + "license": "BSD-3-Clause", + "dependencies": { + "@sentry/types": "7.2.0", + "tslib": "^1.9.3" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/@sentry/utils/node_modules/tslib": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", + "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==", + "dev": true, + "license": "0BSD" + }, + "node_modules/@sinclair/typebox": { + "version": "0.27.8", + "resolved": "https://registry.npmjs.org/@sinclair/typebox/-/typebox-0.27.8.tgz", + "integrity": "sha512-+Fj43pSMwJs4KRrH/938Uf+uAELIgVBmQzg/q1YG10djyfA3TnrU8N8XzqCh/okZdszqBQTZf96idMfE5lnwTA==", + "dev": true, + "license": "MIT" + }, + "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/@sinonjs/commons": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/@sinonjs/commons/-/commons-3.0.1.tgz", + "integrity": "sha512-K3mCHKQ9sVh8o1C9cxkwxaOmXoAMlDxC1mYyHrjqOWEcBjYr76t96zL2zlj5dUGZ3HSw240X1qgH3Mjf1yJWpQ==", + "dev": true, + "license": "BSD-3-Clause", + "dependencies": { + "type-detect": "4.0.8" + } + }, + "node_modules/@sinonjs/fake-timers": { + "version": "10.3.0", + "resolved": "https://registry.npmjs.org/@sinonjs/fake-timers/-/fake-timers-10.3.0.tgz", + "integrity": "sha512-V4BG07kuYSUkTCSBHG8G8TNhM+F19jXFWnQtzj+we8DrkpSBCee9Z3Ms8yiGer/dlmhe35/Xdgyo3/0rQKg7YA==", + "dev": true, + "license": "BSD-3-Clause", + "dependencies": { + "@sinonjs/commons": "^3.0.0" + } + }, + "node_modules/@storybook/addon-actions": { + "version": "8.4.5", + "resolved": "https://registry.npmjs.org/@storybook/addon-actions/-/addon-actions-8.4.5.tgz", + "integrity": "sha512-rbB19uiGJ61XHbKIbS1a9bUS6re5L8rT5NMNeEJhCxXRpFUPrlTXMSoD/Pgcn3ENeEMVZsm8/eCzxAVgAP3Mgg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@storybook/global": "^5.0.0", + "@types/uuid": "^9.0.1", + "dequal": "^2.0.2", + "polished": "^4.2.2", + "uuid": "^9.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/storybook" + }, + "peerDependencies": { + "storybook": "^8.4.5" + } + }, + "node_modules/@storybook/addon-actions/node_modules/uuid": { + "version": "9.0.1", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-9.0.1.tgz", + "integrity": "sha512-b+1eJOlsR9K8HJpow9Ok3fiWOWSIcIzXodvv0rQjVoOVNpWMpxf1wZNpt4y9h10odCNrqnYp1OBzRktckBe3sA==", + "dev": true, + "funding": [ + "https://github.com/sponsors/broofa", + "https://github.com/sponsors/ctavan" + ], + "license": "MIT", + "bin": { + "uuid": "dist/bin/uuid" + } + }, + "node_modules/@storybook/addon-backgrounds": { + "version": "8.4.5", + "resolved": "https://registry.npmjs.org/@storybook/addon-backgrounds/-/addon-backgrounds-8.4.5.tgz", + "integrity": "sha512-FeMt4qHCMYDQiLGGDKiRuSPXFup2WXOaZSdL137v1W36wEL/vGkK1A5iQt1qJ8MZzL5WZQuedox8rSybFy7eow==", + "dev": true, + "license": "MIT", + "dependencies": { + "@storybook/global": "^5.0.0", + "memoizerific": "^1.11.3", + "ts-dedent": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/storybook" + }, + "peerDependencies": { + "storybook": "^8.4.5" + } + }, + "node_modules/@storybook/addon-controls": { + "version": "8.4.5", + "resolved": "https://registry.npmjs.org/@storybook/addon-controls/-/addon-controls-8.4.5.tgz", + "integrity": "sha512-RVTtDDuESLYc1+SJQv2kI7wzBddzAS9uoEe8P75quN6S4pC0GxAB6xirWZ2+WOcba4eHosY+PxMwuBXQfH78Ew==", + "dev": true, + "license": "MIT", + "dependencies": { + "@storybook/global": "^5.0.0", + "dequal": "^2.0.2", + "ts-dedent": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/storybook" + }, + "peerDependencies": { + "storybook": "^8.4.5" + } + }, + "node_modules/@storybook/addon-docs": { + "version": "8.4.5", + "resolved": "https://registry.npmjs.org/@storybook/addon-docs/-/addon-docs-8.4.5.tgz", + "integrity": "sha512-zPELIl7wXormOylVaaSpkUIuuCCxrO+OFPMKZnlENt6zSReyy0dJu4V0tzfV8FCw+V4D6Y4wrLRk/TIG951Ojw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@mdx-js/react": "^3.0.0", + "@storybook/blocks": "8.4.5", + "@storybook/csf-plugin": "8.4.5", + "@storybook/react-dom-shim": "8.4.5", + "react": "^16.8.0 || ^17.0.0 || ^18.0.0", + "react-dom": "^16.8.0 || ^17.0.0 || ^18.0.0", + "ts-dedent": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/storybook" + }, + "peerDependencies": { + "storybook": "^8.4.5" + } + }, + "node_modules/@storybook/addon-essentials": { + "version": "8.4.5", + "resolved": "https://registry.npmjs.org/@storybook/addon-essentials/-/addon-essentials-8.4.5.tgz", + "integrity": "sha512-AxetQo/zSPIu3RZqWG2opwAz22Bb+jpf1nWbHp0kEpCrBemcWd8X2gonVmXNOC1PDKNl3jcWyc3lmg/+3mxjYg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@storybook/addon-actions": "8.4.5", + "@storybook/addon-backgrounds": "8.4.5", + "@storybook/addon-controls": "8.4.5", + "@storybook/addon-docs": "8.4.5", + "@storybook/addon-highlight": "8.4.5", + "@storybook/addon-measure": "8.4.5", + "@storybook/addon-outline": "8.4.5", + "@storybook/addon-toolbars": "8.4.5", + "@storybook/addon-viewport": "8.4.5", + "ts-dedent": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/storybook" + }, + "peerDependencies": { + "storybook": "^8.4.5" + } + }, + "node_modules/@storybook/addon-highlight": { + "version": "8.4.5", + "resolved": "https://registry.npmjs.org/@storybook/addon-highlight/-/addon-highlight-8.4.5.tgz", + "integrity": "sha512-sMA7v+4unaKY+5RDhow6lLncJqNX9ZLUnBIt3vzY1ntUsOYVwykAY1Hq4Ysj0luCBXjJJdJ6223ylrycnb7Ilw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@storybook/global": "^5.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/storybook" + }, + "peerDependencies": { + "storybook": "^8.4.5" + } + }, + "node_modules/@storybook/addon-interactions": { + "version": "8.4.5", + "resolved": "https://registry.npmjs.org/@storybook/addon-interactions/-/addon-interactions-8.4.5.tgz", + "integrity": "sha512-s6R8XVD8LTp+LQTDbhtDjDLE6S44I7FtMLxPdMNwN9VEJjBk01NONLDuGDpNq5o/0bnybA3rMHk9+3afsgzidQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@storybook/global": "^5.0.0", + "@storybook/instrumenter": "8.4.5", + "@storybook/test": "8.4.5", + "polished": "^4.2.2", + "ts-dedent": "^2.2.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/storybook" + }, + "peerDependencies": { + "storybook": "^8.4.5" + } + }, + "node_modules/@storybook/addon-links": { + "version": "8.4.5", + "resolved": "https://registry.npmjs.org/@storybook/addon-links/-/addon-links-8.4.5.tgz", + "integrity": "sha512-ac3OtplFdrPw/2jtLnteuVllwu2yCe3sgKJS9AbdYMT/65OW47M7oDnzcpRPsDGufrKlDMBJXXEv4SfTtlT+rg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@storybook/csf": "^0.1.11", + "@storybook/global": "^5.0.0", + "ts-dedent": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/storybook" + }, + "peerDependencies": { + "react": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0-beta", + "storybook": "^8.4.5" + }, + "peerDependenciesMeta": { + "react": { + "optional": true + } + } + }, + "node_modules/@storybook/addon-measure": { + "version": "8.4.5", + "resolved": "https://registry.npmjs.org/@storybook/addon-measure/-/addon-measure-8.4.5.tgz", + "integrity": "sha512-+sNjew991YaoXQyWWloFybjEGrDO40Jk6w8BgZs2X7oc3D5t/6oFzvyC862U++LGqKFA3quXDeBjEb92CI9cRA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@storybook/global": "^5.0.0", + "tiny-invariant": "^1.3.1" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/storybook" + }, + "peerDependencies": { + "storybook": "^8.4.5" + } + }, + "node_modules/@storybook/addon-outline": { + "version": "8.4.5", + "resolved": "https://registry.npmjs.org/@storybook/addon-outline/-/addon-outline-8.4.5.tgz", + "integrity": "sha512-XlpN98AUDnWQWNFSFVm+HkRUzm3xIUMjBGTkv6HsL6zt6XoJ+LsQMca+PPtYqlBJA+5CU41xMDaG8HC/p+sd3A==", + "dev": true, + "license": "MIT", + "dependencies": { + "@storybook/global": "^5.0.0", + "ts-dedent": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/storybook" + }, + "peerDependencies": { + "storybook": "^8.4.5" + } + }, + "node_modules/@storybook/addon-storysource": { + "version": "8.4.5", + "resolved": "https://registry.npmjs.org/@storybook/addon-storysource/-/addon-storysource-8.4.5.tgz", + "integrity": "sha512-hDPzFf/i5BAXeodfRKtzBX8BFS2cvXNFdv2tYaln4m7ZUIeRddKb6dps3augkgwhOc52rNlDqL920tv6rLFxAQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@storybook/source-loader": "8.4.5", + "estraverse": "^5.2.0", + "tiny-invariant": "^1.3.1" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/storybook" + }, + "peerDependencies": { + "storybook": "^8.4.5" + } + }, + "node_modules/@storybook/addon-toolbars": { + "version": "8.4.5", + "resolved": "https://registry.npmjs.org/@storybook/addon-toolbars/-/addon-toolbars-8.4.5.tgz", + "integrity": "sha512-hOq5560ONOU/qrslrwosWzxnC4nrF8HZWD43ciKwtethm8HuptU2M+Jrui1CRsMScEZLopWWVE9o0vJMdKpIFQ==", + "dev": true, + "license": "MIT", + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/storybook" + }, + "peerDependencies": { + "storybook": "^8.4.5" + } + }, + "node_modules/@storybook/addon-viewport": { + "version": "8.4.5", + "resolved": "https://registry.npmjs.org/@storybook/addon-viewport/-/addon-viewport-8.4.5.tgz", + "integrity": "sha512-l7Y41gIbJAsIN/QCg1QJ9sr61FLz1C/imUotcDej41tOHxUTSQOlXpNtVnfhUM1vGQc0yNpP3pVxj8BpXi0cAw==", + "dev": true, + "license": "MIT", + "dependencies": { + "memoizerific": "^1.11.3" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/storybook" + }, + "peerDependencies": { + "storybook": "^8.4.5" + } + }, + "node_modules/@storybook/addon-webpack5-compiler-babel": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/@storybook/addon-webpack5-compiler-babel/-/addon-webpack5-compiler-babel-3.0.3.tgz", + "integrity": "sha512-rVQTTw+oxJltbVKaejIWSHwVKOBJs3au21f/pYXhV0aiNgNhxEa3vr79t/j0j8ox8uJtzM8XYOb7FlkvGfHlwQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/core": "^7.23.7", + "babel-loader": "^9.1.3" + }, + "engines": { + "node": ">=18" + } + }, + "node_modules/@storybook/blocks": { + "version": "8.4.5", + "resolved": "https://registry.npmjs.org/@storybook/blocks/-/blocks-8.4.5.tgz", + "integrity": "sha512-Z+LHauSqm3A4HBR9pUEf9KQhD3/3xYMt0FXgA+GHCAyDa6lFeD1C6r9Y2nlT+9dt8gv9B9oygTZvV6GqFVyRSQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@storybook/csf": "^0.1.11", + "@storybook/icons": "^1.2.12", + "ts-dedent": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/storybook" + }, + "peerDependencies": { + "react": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0-beta", + "react-dom": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0-beta", + "storybook": "^8.4.5" + }, + "peerDependenciesMeta": { + "react": { + "optional": true + }, + "react-dom": { + "optional": true + } + } + }, + "node_modules/@storybook/builder-webpack5": { + "version": "8.4.5", + "resolved": "https://registry.npmjs.org/@storybook/builder-webpack5/-/builder-webpack5-8.4.5.tgz", + "integrity": "sha512-5TSpirK2LIL4Wultpowlkrv3iAje57HTw92Hy6c4Zn64tAs30123mkdE6MoJcXMBfD4JwX9I2K2Q+ofZXblJPg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@storybook/core-webpack": "8.4.5", + "@types/node": "^22.0.0", + "@types/semver": "^7.3.4", + "browser-assert": "^1.2.1", + "case-sensitive-paths-webpack-plugin": "^2.4.0", + "cjs-module-lexer": "^1.2.3", + "constants-browserify": "^1.0.0", + "css-loader": "^6.7.1", + "es-module-lexer": "^1.5.0", + "fork-ts-checker-webpack-plugin": "^8.0.0", + "html-webpack-plugin": "^5.5.0", + "magic-string": "^0.30.5", + "path-browserify": "^1.0.1", + "process": "^0.11.10", + "semver": "^7.3.7", + "style-loader": "^3.3.1", + "terser-webpack-plugin": "^5.3.1", + "ts-dedent": "^2.0.0", + "url": "^0.11.0", + "util": "^0.12.4", + "util-deprecate": "^1.0.2", + "webpack": "5", + "webpack-dev-middleware": "^6.1.2", + "webpack-hot-middleware": "^2.25.1", + "webpack-virtual-modules": "^0.6.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/storybook" + }, + "peerDependencies": { + "storybook": "^8.4.5" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "node_modules/@storybook/builder-webpack5/node_modules/magic-string": { + "version": "0.30.14", + "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.30.14.tgz", + "integrity": "sha512-5c99P1WKTed11ZC0HMJOj6CDIue6F8ySu+bJL+85q1zBEIY8IklrJ1eiKC2NDRh3Ct3FcvmJPyQHb9erXMTJNw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jridgewell/sourcemap-codec": "^1.5.0" + } + }, + "node_modules/@storybook/builder-webpack5/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/@storybook/core": { + "version": "8.4.5", + "resolved": "https://registry.npmjs.org/@storybook/core/-/core-8.4.5.tgz", + "integrity": "sha512-aB1sQNX5nRoUAqg5u1py0MuR/VPd6c6PhECa4rW6pmr7kZcfyP4PP6UFpXuN71ypTQlkRE3Vc5PQZ3gLhE9o3g==", + "dev": true, + "license": "MIT", + "dependencies": { + "@storybook/csf": "^0.1.11", + "better-opn": "^3.0.2", + "browser-assert": "^1.2.1", + "esbuild": "^0.18.0 || ^0.19.0 || ^0.20.0 || ^0.21.0 || ^0.22.0 || ^0.23.0 || ^0.24.0", + "esbuild-register": "^3.5.0", + "jsdoc-type-pratt-parser": "^4.0.0", + "process": "^0.11.10", + "recast": "^0.23.5", + "semver": "^7.6.2", + "util": "^0.12.5", + "ws": "^8.2.3" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/storybook" + }, + "peerDependencies": { + "prettier": "^2 || ^3" + }, + "peerDependenciesMeta": { + "prettier": { + "optional": true + } + } + }, + "node_modules/@storybook/core-common": { + "version": "8.4.5", + "resolved": "https://registry.npmjs.org/@storybook/core-common/-/core-common-8.4.5.tgz", + "integrity": "sha512-YVzgTOk26i8u5JGX4A1ghDxfwz15ShOl2jem9doVIu4IQFiYWmPeBcl7HbpsZFAx8TwNFibx74ROkiE1lFl5CQ==", + "dev": true, + "license": "MIT", + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/storybook" + }, + "peerDependencies": { + "storybook": "^8.2.0 || ^8.3.0-0 || ^8.4.0-0 || ^8.5.0-0 || ^8.6.0-0" + } + }, + "node_modules/@storybook/core-webpack": { + "version": "8.4.5", + "resolved": "https://registry.npmjs.org/@storybook/core-webpack/-/core-webpack-8.4.5.tgz", + "integrity": "sha512-IpK/3fM+l2WjRNplTtP+MtnRf/394GcBwyemZknUCzFFDJWNYAN1+meEZmOaZKzJ3tQyRYiErrJLHzd1+UH6Dw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/node": "^22.0.0", + "ts-dedent": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/storybook" + }, + "peerDependencies": { + "storybook": "^8.4.5" + } + }, + "node_modules/@storybook/core/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/@storybook/csf": { + "version": "0.1.11", + "resolved": "https://registry.npmjs.org/@storybook/csf/-/csf-0.1.11.tgz", + "integrity": "sha512-dHYFQH3mA+EtnCkHXzicbLgsvzYjcDJ1JWsogbItZogkPHgSJM/Wr71uMkcvw8v9mmCyP4NpXJuu6bPoVsOnzg==", + "dev": true, + "license": "MIT", + "dependencies": { + "type-fest": "^2.19.0" + } + }, + "node_modules/@storybook/csf-plugin": { + "version": "8.4.5", + "resolved": "https://registry.npmjs.org/@storybook/csf-plugin/-/csf-plugin-8.4.5.tgz", + "integrity": "sha512-qd2rQTglOTS+phQmTbNTXNjNyxdGvolaqHqDNMw3Vf6h9o3U+mLkwnDWNVnQ9oqvOoUEAqpBthgwzU9FhkIk+A==", + "dev": true, + "license": "MIT", + "dependencies": { + "unplugin": "^1.3.1" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/storybook" + }, + "peerDependencies": { + "storybook": "^8.4.5" + } + }, + "node_modules/@storybook/docs-tools": { + "version": "8.4.5", + "resolved": "https://registry.npmjs.org/@storybook/docs-tools/-/docs-tools-8.4.5.tgz", + "integrity": "sha512-WhAyGGyGYTdHTLE/Lt2g+cPtfeYdGRgbLpZ8gsit/ArJtni29/w7zxo1PfzLshDxIO82wvmIQFWLPZ2kFro84g==", + "dev": true, + "license": "MIT", + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/storybook" + }, + "peerDependencies": { + "storybook": "^8.2.0 || ^8.3.0-0 || ^8.4.0-0 || ^8.5.0-0 || ^8.6.0-0" + } + }, + "node_modules/@storybook/global": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/@storybook/global/-/global-5.0.0.tgz", + "integrity": "sha512-FcOqPAXACP0I3oJ/ws6/rrPT9WGhu915Cg8D02a9YxLo0DE9zI+a9A5gRGvmQ09fiWPukqI8ZAEoQEdWUKMQdQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/@storybook/icons": { + "version": "1.2.12", + "resolved": "https://registry.npmjs.org/@storybook/icons/-/icons-1.2.12.tgz", + "integrity": "sha512-UxgyK5W3/UV4VrI3dl6ajGfHM4aOqMAkFLWe2KibeQudLf6NJpDrDMSHwZj+3iKC4jFU7dkKbbtH2h/al4sW3Q==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=14.0.0" + }, + "peerDependencies": { + "react": "^16.8.0 || ^17.0.0 || ^18.0.0", + "react-dom": "^16.8.0 || ^17.0.0 || ^18.0.0" + } + }, + "node_modules/@storybook/instrumenter": { + "version": "8.4.5", + "resolved": "https://registry.npmjs.org/@storybook/instrumenter/-/instrumenter-8.4.5.tgz", + "integrity": "sha512-8qM35FkueuRpJr0zA6ENvhQICbo+iKL1ln450DwV1kKJtc41KdbA3CuCvtZ/FnoPsFnwdtPjhhICFtRt8LRTSg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@storybook/global": "^5.0.0", + "@vitest/utils": "^2.1.1" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/storybook" + }, + "peerDependencies": { + "storybook": "^8.4.5" + } + }, + "node_modules/@storybook/manager-api": { + "version": "8.4.5", + "resolved": "https://registry.npmjs.org/@storybook/manager-api/-/manager-api-8.4.5.tgz", + "integrity": "sha512-t39JaMy3UX4StbUH/tIDcaflBDxTcyIq853wQtBMhVL3e1+Dw3MIiiG/5bw79HU4R7kSmPVLXIIbV3FmXkq7KQ==", + "dev": true, + "license": "MIT", + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/storybook" + }, + "peerDependencies": { + "storybook": "^8.2.0 || ^8.3.0-0 || ^8.4.0-0 || ^8.5.0-0 || ^8.6.0-0" + } + }, + "node_modules/@storybook/preview-api": { + "version": "8.4.5", + "resolved": "https://registry.npmjs.org/@storybook/preview-api/-/preview-api-8.4.5.tgz", + "integrity": "sha512-MKIZ2jQO/3cUdsT57eq8jRgB6inALo9BxrQ88f7mqzltOkMvADvTAY6y8JZqTUoDzWTH/ny/8SGGdtpqlxRuiQ==", + "dev": true, + "license": "MIT", + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/storybook" + }, + "peerDependencies": { + "storybook": "^8.2.0 || ^8.3.0-0 || ^8.4.0-0 || ^8.5.0-0 || ^8.6.0-0" + } + }, + "node_modules/@storybook/react-dom-shim": { + "version": "8.4.5", + "resolved": "https://registry.npmjs.org/@storybook/react-dom-shim/-/react-dom-shim-8.4.5.tgz", + "integrity": "sha512-YTWTfPagptEYXJsnxAl3zP97Ev0zebtaEV0WgjGaEeumr+zsfgKKwzzHxgrtumBmDzwkuKlzFwlQB5A8keOIGA==", + "dev": true, + "license": "MIT", + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/storybook" + }, + "peerDependencies": { + "react": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0-beta", + "react-dom": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0-beta", + "storybook": "^8.4.5" + } + }, + "node_modules/@storybook/source-loader": { + "version": "8.4.5", + "resolved": "https://registry.npmjs.org/@storybook/source-loader/-/source-loader-8.4.5.tgz", + "integrity": "sha512-KJvxxStxajaoX54jJdmgHo0xSPBn2ZXj8WOBOKs6C94OsMFyryohfQMTDZudR/ipyNzrTHwC0yKgMJQyGtHyaQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@storybook/csf": "^0.1.11", + "es-toolkit": "^1.22.0", + "estraverse": "^5.2.0", + "prettier": "^3.1.1" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/storybook" + }, + "peerDependencies": { + "storybook": "^8.4.5" + } + }, + "node_modules/@storybook/test": { + "version": "8.4.5", + "resolved": "https://registry.npmjs.org/@storybook/test/-/test-8.4.5.tgz", + "integrity": "sha512-mHsRc6m60nfcEBsjvUkKz+Jnz0or4WH5jmJ1VL2pGKO4VzESCPqAwDnwDqP2YyeSQ0b/MAKUT5kdoLE2RE2eVw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@storybook/csf": "^0.1.11", + "@storybook/global": "^5.0.0", + "@storybook/instrumenter": "8.4.5", + "@testing-library/dom": "10.4.0", + "@testing-library/jest-dom": "6.5.0", + "@testing-library/user-event": "14.5.2", + "@vitest/expect": "2.0.5", + "@vitest/spy": "2.0.5" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/storybook" + }, + "peerDependencies": { + "storybook": "^8.4.5" + } + }, + "node_modules/@storybook/types": { + "version": "8.4.5", + "resolved": "https://registry.npmjs.org/@storybook/types/-/types-8.4.5.tgz", + "integrity": "sha512-1hlSq7sPYyU9QT++7qytxtY53ARtKGq2cYEr92pOPt6uinCbStmtQ5BoKOFB6vyHoXWgIbhZJKAXZq+tGTz7Qw==", + "dev": true, + "license": "MIT", + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/storybook" + }, + "peerDependencies": { + "storybook": "^8.2.0 || ^8.3.0-0 || ^8.4.0-0 || ^8.5.0-0 || ^8.6.0-0" + } + }, + "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/@testing-library/dom": { + "version": "10.4.0", + "resolved": "https://registry.npmjs.org/@testing-library/dom/-/dom-10.4.0.tgz", + "integrity": "sha512-pemlzrSESWbdAloYml3bAJMEfNh1Z7EduzqPKprCH5S341frlpYnUEW0H72dLxa6IsYr+mPno20GiSm+h9dEdQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/code-frame": "^7.10.4", + "@babel/runtime": "^7.12.5", + "@types/aria-query": "^5.0.1", + "aria-query": "5.3.0", + "chalk": "^4.1.0", + "dom-accessibility-api": "^0.5.9", + "lz-string": "^1.5.0", + "pretty-format": "^27.0.2" + }, + "engines": { + "node": ">=18" + } + }, + "node_modules/@testing-library/dom/node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "license": "MIT", + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/@testing-library/dom/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/@testing-library/jest-dom": { + "version": "6.5.0", + "resolved": "https://registry.npmjs.org/@testing-library/jest-dom/-/jest-dom-6.5.0.tgz", + "integrity": "sha512-xGGHpBXYSHUUr6XsKBfs85TWlYKpTc37cSBBVrXcib2MkHLboWlkClhWF37JKlDb9KEq3dHs+f2xR7XJEWGBxA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@adobe/css-tools": "^4.4.0", + "aria-query": "^5.0.0", + "chalk": "^3.0.0", + "css.escape": "^1.5.1", + "dom-accessibility-api": "^0.6.3", + "lodash": "^4.17.21", + "redent": "^3.0.0" + }, + "engines": { + "node": ">=14", + "npm": ">=6", + "yarn": ">=1" + } + }, + "node_modules/@testing-library/jest-dom/node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "license": "MIT", + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/@testing-library/jest-dom/node_modules/chalk": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-3.0.0.tgz", + "integrity": "sha512-4D3B6Wf41KOYRFdszmDqMCGq5VV/uMAB273JILmO+3jAlh8X4qDtdtgCR3fxtbLEMzSx22QdhnDcJvu2u1fVwg==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/@testing-library/jest-dom/node_modules/dom-accessibility-api": { + "version": "0.6.3", + "resolved": "https://registry.npmjs.org/dom-accessibility-api/-/dom-accessibility-api-0.6.3.tgz", + "integrity": "sha512-7ZgogeTnjuHbo+ct10G9Ffp0mif17idi0IyWNVA/wcwcm7NPOD/WEHVP3n7n3MhXqxoIYm8d6MuZohYWIZ4T3w==", + "dev": true, + "license": "MIT" + }, + "node_modules/@testing-library/user-event": { + "version": "14.5.2", + "resolved": "https://registry.npmjs.org/@testing-library/user-event/-/user-event-14.5.2.tgz", + "integrity": "sha512-YAh82Wh4TIrxYLmfGcixwD18oIjyC1pFQC2Y01F2lzV2HTMiYrI0nze0FD0ocB//CKS/7jIUgae+adPqxK5yCQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12", + "npm": ">=6" + }, + "peerDependencies": { + "@testing-library/dom": ">=7.21.4" + } + }, + "node_modules/@types/acorn": { + "version": "4.0.6", + "resolved": "https://registry.npmjs.org/@types/acorn/-/acorn-4.0.6.tgz", + "integrity": "sha512-veQTnWP+1D/xbxVrPC3zHnCZRjSrKfhbMUlEA43iMZLu7EsnTtkJklIuwrCPbOi8YkvDQAiW05VQQFvvz9oieQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/estree": "*" + } + }, + "node_modules/@types/aria-query": { + "version": "5.0.4", + "resolved": "https://registry.npmjs.org/@types/aria-query/-/aria-query-5.0.4.tgz", + "integrity": "sha512-rfT93uj5s0PRL7EzccGMs3brplhcrghnDoV26NqKhCAS1hVo+WdNsPvE/yb6ilfr5hi2MEk6d5EWJTKdxg8jVw==", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/babel__core": { + "version": "7.20.5", + "resolved": "https://registry.npmjs.org/@types/babel__core/-/babel__core-7.20.5.tgz", + "integrity": "sha512-qoQprZvz5wQFJwMDqeseRXWv3rqMvhgpbXFfVyWhbx9X47POIA6i/+dXefEmZKoAgOaTdaIgNSMqMIU61yRyzA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/parser": "^7.20.7", + "@babel/types": "^7.20.7", + "@types/babel__generator": "*", + "@types/babel__template": "*", + "@types/babel__traverse": "*" + } + }, + "node_modules/@types/babel__generator": { + "version": "7.6.8", + "resolved": "https://registry.npmjs.org/@types/babel__generator/-/babel__generator-7.6.8.tgz", + "integrity": "sha512-ASsj+tpEDsEiFr1arWrlN6V3mdfjRMZt6LtK/Vp/kreFLnr5QH5+DhvD5nINYZXzwJvXeGq+05iUXcAzVrqWtw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/types": "^7.0.0" + } + }, + "node_modules/@types/babel__template": { + "version": "7.4.4", + "resolved": "https://registry.npmjs.org/@types/babel__template/-/babel__template-7.4.4.tgz", + "integrity": "sha512-h/NUaSyG5EyxBIp8YRxo4RMe2/qQgvyowRwVMzhYhBCONbW8PUsg4lkFMrhgZhUe5z3L3MiLDuvyJ/CaPa2A8A==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/parser": "^7.1.0", + "@babel/types": "^7.0.0" + } + }, + "node_modules/@types/babel__traverse": { + "version": "7.20.6", + "resolved": "https://registry.npmjs.org/@types/babel__traverse/-/babel__traverse-7.20.6.tgz", + "integrity": "sha512-r1bzfrm0tomOI8g1SzvCaQHo6Lcv6zu0EA+W2kHrt8dyrHQxGzBBL4kdkzIS+jBMV+EYcMAEAqXqYaLJq5rOZg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/types": "^7.20.7" + } + }, + "node_modules/@types/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==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/@types/css-font-loading-module": { + "version": "0.0.12", + "resolved": "https://registry.npmjs.org/@types/css-font-loading-module/-/css-font-loading-module-0.0.12.tgz", + "integrity": "sha512-x2tZZYkSxXqWvTDgveSynfjq/T2HyiZHXb00j/+gy19yp70PHCizM48XFdjBCWH7eHBD0R5i/pw9yMBP/BH5uA==", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/debug": { + "version": "4.1.12", + "resolved": "https://registry.npmjs.org/@types/debug/-/debug-4.1.12.tgz", + "integrity": "sha512-vIChWdVG3LG1SMxEvI/AK+FWJthlrqlTu7fbrlywTkkaONwk/UAGaULXRlf8vkzFBLVm0zkMdCquhL5aOjhXPQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/ms": "*" + } + }, + "node_modules/@types/earcut": { + "version": "2.1.4", + "resolved": "https://registry.npmjs.org/@types/earcut/-/earcut-2.1.4.tgz", + "integrity": "sha512-qp3m9PPz4gULB9MhjGID7wpo3gJ4bTGXm7ltNDsmOvsPduTeHp8wSW9YckBj3mljeOh4F0m2z/0JKAALRKbmLQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/eslint": { + "version": "9.6.1", + "resolved": "https://registry.npmjs.org/@types/eslint/-/eslint-9.6.1.tgz", + "integrity": "sha512-FXx2pKgId/WyYo2jXw63kk7/+TY7u7AziEJxJAnSFzHlqTAS3Ync6SvgYAN/k4/PQpnnVuzoMuVnByKK2qp0ag==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/estree": "*", + "@types/json-schema": "*" + } + }, + "node_modules/@types/eslint-scope": { + "version": "3.7.7", + "resolved": "https://registry.npmjs.org/@types/eslint-scope/-/eslint-scope-3.7.7.tgz", + "integrity": "sha512-MzMFlSLBqNF2gcHWO0G1vP/YQyfvrxZ0bF+u7mzUdZ1/xK4A4sru+nraZz5i3iEIk1l1uyicaDVTB4QbbEkAYg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/eslint": "*", + "@types/estree": "*" + } + }, + "node_modules/@types/estree": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.6.tgz", + "integrity": "sha512-AYnb1nQyY49te+VRAVgmzfcgjYS91mY5P0TKUDCLEM+gNnA+3T6rWITXRLYCpahpqSQbN5cE+gHpnPyXjHWxcw==", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/estree-jsx": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/@types/estree-jsx/-/estree-jsx-1.0.5.tgz", + "integrity": "sha512-52CcUVNFyfb1A2ALocQw/Dd1BQFNmSdkuC3BkZ6iqhdMfQz7JWOFRuJFloOzjk+6WijU56m9oKXFAXc7o3Towg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/estree": "*" + } + }, + "node_modules/@types/graceful-fs": { + "version": "4.1.9", + "resolved": "https://registry.npmjs.org/@types/graceful-fs/-/graceful-fs-4.1.9.tgz", + "integrity": "sha512-olP3sd1qOEe5dXTSaFvQG+02VdRXcdytWLAZsAq1PecU8uqQAhkrnbli7DagjtXKW/Bl7YJbUsa8MPcuc8LHEQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/@types/hast": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/@types/hast/-/hast-3.0.4.tgz", + "integrity": "sha512-WPs+bbQw5aCj+x6laNGWLH3wviHtoCv/P3+otBhbOhJgG8qtpdAMlTCxLtsTWA7LH1Oh/bFCHsBn0TPS5m30EQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/unist": "*" + } + }, + "node_modules/@types/html-minifier-terser": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/@types/html-minifier-terser/-/html-minifier-terser-6.1.0.tgz", + "integrity": "sha512-oh/6byDPnL1zeNXFrDXFLyZjkr1MsBG667IM792caf1L2UPOOMf65NFzjUH/ltyfwjAGfs1rsX1eftK0jC/KIg==", + "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-server": { + "version": "0.12.4", + "resolved": "https://registry.npmjs.org/@types/http-server/-/http-server-0.12.4.tgz", + "integrity": "sha512-vsn4pvP2oRFALLuM5Rca6qUmSPG7u0VNjOuqvL57l3bKldQRWdUZPeSiARhzagDxgfNCHn/o8WlWk4KinBauUg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/connect": "*" + } + }, + "node_modules/@types/istanbul-lib-coverage": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/@types/istanbul-lib-coverage/-/istanbul-lib-coverage-2.0.6.tgz", + "integrity": "sha512-2QF/t/auWm0lsy8XtKVPG19v3sSOQlJe/YHZgfjb/KBBHOGSV+J2q/S671rcq9uTBrLAXmZpqJiaQbMT+zNU1w==", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/istanbul-lib-report": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/@types/istanbul-lib-report/-/istanbul-lib-report-3.0.3.tgz", + "integrity": "sha512-NQn7AHQnk/RSLOxrBbGyJM/aVQ+pjj5HCgasFxc0K/KhoATfQ/47AyUl15I2yBUpihjmas+a+VJBOqecrFH+uA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/istanbul-lib-coverage": "*" + } + }, + "node_modules/@types/istanbul-reports": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/@types/istanbul-reports/-/istanbul-reports-3.0.4.tgz", + "integrity": "sha512-pk2B1NWalF9toCRu6gjBzR69syFjP4Od8WRAX+0mmf9lAjCRicLOWc+ZrxZHx/0XRjotgkF9t6iaMJ+aXcOdZQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/istanbul-lib-report": "*" + } + }, + "node_modules/@types/jest": { + "version": "29.5.14", + "resolved": "https://registry.npmjs.org/@types/jest/-/jest-29.5.14.tgz", + "integrity": "sha512-ZN+4sdnLUbo8EVvVc2ao0GFW6oVrQRPn4K2lglySj7APvSrgzxHiNNK99us4WDMi57xxA2yggblIAMNhXOotLQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "expect": "^29.0.0", + "pretty-format": "^29.0.0" + } + }, + "node_modules/@types/jest/node_modules/pretty-format": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-29.7.0.tgz", + "integrity": "sha512-Pdlw/oPxN+aXdmM9R00JVC9WVFoCLTKJvDVLgmJ+qAffBMxsV85l/Lu7sNx4zSzPyoL2euImuEwHhOXdEgNFZQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/schemas": "^29.6.3", + "ansi-styles": "^5.0.0", + "react-is": "^18.0.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/@types/jest/node_modules/react-is": { + "version": "18.3.1", + "resolved": "https://registry.npmjs.org/react-is/-/react-is-18.3.1.tgz", + "integrity": "sha512-/LLMVyas0ljjAtoYiPqYiL8VWXzUUdThrmU5+n20DZv+a+ClRoevUzw5JxU+Ieh5/c87ytoTBV9G1FiKfNJdmg==", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/json-schema": { + "version": "7.0.15", + "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.15.tgz", + "integrity": "sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA==", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/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/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/mdast": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/@types/mdast/-/mdast-4.0.4.tgz", + "integrity": "sha512-kGaNbPh1k7AFzgpud/gMdvIm5xuECykRR+JnWKQno9TAXVa6WIVCGTPvYGekIDL4uwCZQSYbUxNBSb1aUo79oA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/unist": "*" + } + }, + "node_modules/@types/mdx": { + "version": "2.0.13", + "resolved": "https://registry.npmjs.org/@types/mdx/-/mdx-2.0.13.tgz", + "integrity": "sha512-+OWZQfAYyio6YkJb3HLxDrvnx6SWWDbC0zVPfBRzUk0/nqoDyf6dNxQi3eArPe8rJ473nobTMQ/8Zk+LxJ+Yuw==", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/ms": { + "version": "0.7.34", + "resolved": "https://registry.npmjs.org/@types/ms/-/ms-0.7.34.tgz", + "integrity": "sha512-nG96G3Wp6acyAgJqGasjODb+acrI7KltPiRxzHPXnP3NgI28bpQDRv53olbqGXbfcgF5aiiHmO3xpwEpS5Ld9g==", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/node": { + "version": "22.10.0", + "resolved": "https://registry.npmjs.org/@types/node/-/node-22.10.0.tgz", + "integrity": "sha512-XC70cRZVElFHfIUB40FgZOBbgJYFKKMa5nb9lxcwYstFG/Mi+/Y0bGS+rs6Dmhmkpq4pnNiLiuZAbc02YCOnmA==", + "dev": true, + "license": "MIT", + "dependencies": { + "undici-types": "~6.20.0" + } + }, + "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/offscreencanvas": { + "version": "2019.7.3", + "resolved": "https://registry.npmjs.org/@types/offscreencanvas/-/offscreencanvas-2019.7.3.tgz", + "integrity": "sha512-ieXiYmgSRXUDeOntE1InxjWyvEelZGP63M+cGuquuRLuIKKT1osnkXjxev9B7d1nXSug5vpunx+gNlbVxMlC9A==", + "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/prop-types": { + "version": "15.7.13", + "resolved": "https://registry.npmjs.org/@types/prop-types/-/prop-types-15.7.13.tgz", + "integrity": "sha512-hCZTSvwbzWGvhqxp/RqVqwU999pBf2vp7hzIjiYOsl8wqOmUxkQ6ddw1cV3l8811+kdUFus/q4d1Y3E3SyEifA==", + "dev": true, + "license": "MIT", + "peer": true + }, + "node_modules/@types/react": { + "version": "18.3.12", + "resolved": "https://registry.npmjs.org/@types/react/-/react-18.3.12.tgz", + "integrity": "sha512-D2wOSq/d6Agt28q7rSI3jhU7G6aiuzljDGZ2hTZHIkrTLUI+AF3WMeKkEZ9nN2fkBAlcktT6vcZjDFiIhMYEQw==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "@types/prop-types": "*", + "csstype": "^3.0.2" + } + }, + "node_modules/@types/resolve": { + "version": "1.20.2", + "resolved": "https://registry.npmjs.org/@types/resolve/-/resolve-1.20.2.tgz", + "integrity": "sha512-60BCwRFOZCQhDncwQdxxeOEEkbc5dIMccYLwbxsS4TUNeVECQ/pBJ0j09mrHOl/JJvpRPGwO9SvE4nR2Nb/a4Q==", + "dev": true, + "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/semver": { + "version": "7.5.8", + "resolved": "https://registry.npmjs.org/@types/semver/-/semver-7.5.8.tgz", + "integrity": "sha512-I8EUhyrgfLrcTkzV3TSsGyl1tSuPrEDzr0yd5m90UgNxQkyDXULk3b6MlQqTCpZpNtWe1K0hzclnZkTcLBe2UQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/stack-utils": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/@types/stack-utils/-/stack-utils-2.0.3.tgz", + "integrity": "sha512-9aEbYZ3TbYMznPdcdr3SmIrLXwC/AKZXQeCf9Pgao5CKb8CyHuEX5jzWPTkvregvhRJHcpRO6BFoGW9ycaOkYw==", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/unist": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/@types/unist/-/unist-3.0.3.tgz", + "integrity": "sha512-ko/gIFJRv177XgZsZcBwnqJN5x/Gien8qNOn0D5bQU/zAzVf9Zt3BlcUiLqhV9y4ARk0GbT3tnUiPNgnTXzc/Q==", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/uuid": { + "version": "9.0.8", + "resolved": "https://registry.npmjs.org/@types/uuid/-/uuid-9.0.8.tgz", + "integrity": "sha512-jg+97EGIcY9AGHJJRaaPVgetKDsrTgbRjQ5Msgjh/DQKEFl0DtyRr/VCOyD1T2R1MNeWPK/u7JoGhlDZnKBAfA==", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/yargs": { + "version": "17.0.33", + "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-17.0.33.tgz", + "integrity": "sha512-WpxBCKWPLr4xSsHgz511rFJAM+wS28w2zEO1QDNY5zM/S8ok70NNfztH0xwhqKyaK0OHCbN98LDAZuy1ctxDkA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/yargs-parser": "*" + } + }, + "node_modules/@types/yargs-parser": { + "version": "21.0.3", + "resolved": "https://registry.npmjs.org/@types/yargs-parser/-/yargs-parser-21.0.3.tgz", + "integrity": "sha512-I4q9QU9MQv4oEOz4tAHJtNz1cwuLxn2F3xcc2iV5WdqLPpUnj30aUuxt1mAxYTG+oe8CZMV/+6rU4S4gRDzqtQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/yauzl": { + "version": "2.10.3", + "resolved": "https://registry.npmjs.org/@types/yauzl/-/yauzl-2.10.3.tgz", + "integrity": "sha512-oJoftv0LSuaDZE3Le4DbKX+KS9G36NzOeSap90UIK0yMA/NhKJhqlSGtNDORNRaIbQfzjXDrQa0ytJ6mNRGz/Q==", + "dev": true, + "license": "MIT", + "optional": true, + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/@typescript-eslint/eslint-plugin": { + "version": "6.21.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-6.21.0.tgz", + "integrity": "sha512-oy9+hTPCUFpngkEZUSzbf9MxI65wbKFoQYsgPdILTfbUldp5ovUuphZVe4i30emU9M/kP+T64Di0mxl7dSw3MA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@eslint-community/regexpp": "^4.5.1", + "@typescript-eslint/scope-manager": "6.21.0", + "@typescript-eslint/type-utils": "6.21.0", + "@typescript-eslint/utils": "6.21.0", + "@typescript-eslint/visitor-keys": "6.21.0", + "debug": "^4.3.4", + "graphemer": "^1.4.0", + "ignore": "^5.2.4", + "natural-compare": "^1.4.0", + "semver": "^7.5.4", + "ts-api-utils": "^1.0.1" + }, + "engines": { + "node": "^16.0.0 || >=18.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "@typescript-eslint/parser": "^6.0.0 || ^6.0.0-alpha", + "eslint": "^7.0.0 || ^8.0.0" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "node_modules/@typescript-eslint/eslint-plugin/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/@typescript-eslint/parser": { + "version": "6.21.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-6.21.0.tgz", + "integrity": "sha512-tbsV1jPne5CkFQCgPBcDOt30ItF7aJoZL997JSF7MhGQqOeT3svWRYxiqlfA5RUdlHN6Fi+EI9bxqbdyAUZjYQ==", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "@typescript-eslint/scope-manager": "6.21.0", + "@typescript-eslint/types": "6.21.0", + "@typescript-eslint/typescript-estree": "6.21.0", + "@typescript-eslint/visitor-keys": "6.21.0", + "debug": "^4.3.4" + }, + "engines": { + "node": "^16.0.0 || >=18.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "eslint": "^7.0.0 || ^8.0.0" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "node_modules/@typescript-eslint/scope-manager": { + "version": "6.21.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-6.21.0.tgz", + "integrity": "sha512-OwLUIWZJry80O99zvqXVEioyniJMa+d2GrqpUTqi5/v5D5rOrppJVBPa0yKCblcigC0/aYAzxxqQ1B+DS2RYsg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@typescript-eslint/types": "6.21.0", + "@typescript-eslint/visitor-keys": "6.21.0" + }, + "engines": { + "node": "^16.0.0 || >=18.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "node_modules/@typescript-eslint/type-utils": { + "version": "6.21.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-6.21.0.tgz", + "integrity": "sha512-rZQI7wHfao8qMX3Rd3xqeYSMCL3SoiSQLBATSiVKARdFGCYSRvmViieZjqc58jKgs8Y8i9YvVVhRbHSTA4VBag==", + "dev": true, + "license": "MIT", + "dependencies": { + "@typescript-eslint/typescript-estree": "6.21.0", + "@typescript-eslint/utils": "6.21.0", + "debug": "^4.3.4", + "ts-api-utils": "^1.0.1" + }, + "engines": { + "node": "^16.0.0 || >=18.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "eslint": "^7.0.0 || ^8.0.0" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "node_modules/@typescript-eslint/types": { + "version": "6.21.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-6.21.0.tgz", + "integrity": "sha512-1kFmZ1rOm5epu9NZEZm1kckCDGj5UJEf7P1kliH4LKu/RkwpsfqqGmY2OOcUs18lSlQBKLDYBOGxRVtrMN5lpg==", + "dev": true, + "license": "MIT", + "engines": { + "node": "^16.0.0 || >=18.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "node_modules/@typescript-eslint/typescript-estree": { + "version": "6.21.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-6.21.0.tgz", + "integrity": "sha512-6npJTkZcO+y2/kr+z0hc4HwNfrrP4kNYh57ek7yCNlrBjWQ1Y0OS7jiZTkgumrvkX5HkEKXFZkkdFNkaW2wmUQ==", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "@typescript-eslint/types": "6.21.0", + "@typescript-eslint/visitor-keys": "6.21.0", + "debug": "^4.3.4", + "globby": "^11.1.0", + "is-glob": "^4.0.3", + "minimatch": "9.0.3", + "semver": "^7.5.4", + "ts-api-utils": "^1.0.1" + }, + "engines": { + "node": "^16.0.0 || >=18.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "node_modules/@typescript-eslint/typescript-estree/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/@typescript-eslint/utils": { + "version": "6.21.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-6.21.0.tgz", + "integrity": "sha512-NfWVaC8HP9T8cbKQxHcsJBY5YE1O33+jpMwN45qzWWaPDZgLIbo12toGMWnmhvCpd3sIxkpDw3Wv1B3dYrbDQQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@eslint-community/eslint-utils": "^4.4.0", + "@types/json-schema": "^7.0.12", + "@types/semver": "^7.5.0", + "@typescript-eslint/scope-manager": "6.21.0", + "@typescript-eslint/types": "6.21.0", + "@typescript-eslint/typescript-estree": "6.21.0", + "semver": "^7.5.4" + }, + "engines": { + "node": "^16.0.0 || >=18.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "eslint": "^7.0.0 || ^8.0.0" + } + }, + "node_modules/@typescript-eslint/utils/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/@typescript-eslint/visitor-keys": { + "version": "6.21.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-6.21.0.tgz", + "integrity": "sha512-JJtkDduxLi9bivAB+cYOVMtbkqdPOhZ+ZI5LC47MIRrDV4Yn2o+ZnW10Nkmr28xRpSpdJ6Sm42Hjf2+REYXm0A==", + "dev": true, + "license": "MIT", + "dependencies": { + "@typescript-eslint/types": "6.21.0", + "eslint-visitor-keys": "^3.4.1" + }, + "engines": { + "node": "^16.0.0 || >=18.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "node_modules/@ungap/structured-clone": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/@ungap/structured-clone/-/structured-clone-1.2.0.tgz", + "integrity": "sha512-zuVdFrMJiuCDQUMCzQaD6KL28MjnqqN8XnAqiEq9PNm/hCPTSGfrXCOfwj1ow4LFb/tNymJPwsNbVePc1xFqrQ==", + "dev": true, + "license": "ISC" + }, + "node_modules/@vitest/expect": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/@vitest/expect/-/expect-2.0.5.tgz", + "integrity": "sha512-yHZtwuP7JZivj65Gxoi8upUN2OzHTi3zVfjwdpu2WrvCZPLwsJ2Ey5ILIPccoW23dd/zQBlJ4/dhi7DWNyXCpA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@vitest/spy": "2.0.5", + "@vitest/utils": "2.0.5", + "chai": "^5.1.1", + "tinyrainbow": "^1.2.0" + }, + "funding": { + "url": "https://opencollective.com/vitest" + } + }, + "node_modules/@vitest/expect/node_modules/@vitest/pretty-format": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/@vitest/pretty-format/-/pretty-format-2.0.5.tgz", + "integrity": "sha512-h8k+1oWHfwTkyTkb9egzwNMfJAEx4veaPSnMeKbVSjp4euqGSbQlm5+6VHwTr7u4FJslVVsUG5nopCaAYdOmSQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "tinyrainbow": "^1.2.0" + }, + "funding": { + "url": "https://opencollective.com/vitest" + } + }, + "node_modules/@vitest/expect/node_modules/@vitest/utils": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/@vitest/utils/-/utils-2.0.5.tgz", + "integrity": "sha512-d8HKbqIcya+GR67mkZbrzhS5kKhtp8dQLcmRZLGTscGVg7yImT82cIrhtn2L8+VujWcy6KZweApgNmPsTAO/UQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@vitest/pretty-format": "2.0.5", + "estree-walker": "^3.0.3", + "loupe": "^3.1.1", + "tinyrainbow": "^1.2.0" + }, + "funding": { + "url": "https://opencollective.com/vitest" + } + }, + "node_modules/@vitest/pretty-format": { + "version": "2.1.6", + "resolved": "https://registry.npmjs.org/@vitest/pretty-format/-/pretty-format-2.1.6.tgz", + "integrity": "sha512-exZyLcEnHgDMKc54TtHca4McV4sKT+NKAe9ix/yhd/qkYb/TP8HTyXRFDijV19qKqTZM0hPL4753zU/U8L/gAA==", + "dev": true, + "license": "MIT", + "dependencies": { + "tinyrainbow": "^1.2.0" + }, + "funding": { + "url": "https://opencollective.com/vitest" + } + }, + "node_modules/@vitest/spy": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/@vitest/spy/-/spy-2.0.5.tgz", + "integrity": "sha512-c/jdthAhvJdpfVuaexSrnawxZz6pywlTPe84LUB2m/4t3rl2fTo9NFGBG4oWgaD+FTgDDV8hJ/nibT7IfH3JfA==", + "dev": true, + "license": "MIT", + "dependencies": { + "tinyspy": "^3.0.0" + }, + "funding": { + "url": "https://opencollective.com/vitest" + } + }, + "node_modules/@vitest/utils": { + "version": "2.1.6", + "resolved": "https://registry.npmjs.org/@vitest/utils/-/utils-2.1.6.tgz", + "integrity": "sha512-ixNkFy3k4vokOUTU2blIUvOgKq/N2PW8vKIjZZYsGJCMX69MRa9J2sKqX5hY/k5O5Gty3YJChepkqZ3KM9LyIQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@vitest/pretty-format": "2.1.6", + "loupe": "^3.1.2", + "tinyrainbow": "^1.2.0" + }, + "funding": { + "url": "https://opencollective.com/vitest" + } + }, + "node_modules/@webassemblyjs/ast": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/ast/-/ast-1.14.1.tgz", + "integrity": "sha512-nuBEDgQfm1ccRp/8bCQrx1frohyufl4JlbMMZ4P1wpeOfDhF6FQkxZJ1b/e+PLwr6X1Nhw6OLme5usuBWYBvuQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@webassemblyjs/helper-numbers": "1.13.2", + "@webassemblyjs/helper-wasm-bytecode": "1.13.2" + } + }, + "node_modules/@webassemblyjs/floating-point-hex-parser": { + "version": "1.13.2", + "resolved": "https://registry.npmjs.org/@webassemblyjs/floating-point-hex-parser/-/floating-point-hex-parser-1.13.2.tgz", + "integrity": "sha512-6oXyTOzbKxGH4steLbLNOu71Oj+C8Lg34n6CqRvqfS2O71BxY6ByfMDRhBytzknj9yGUPVJ1qIKhRlAwO1AovA==", + "dev": true, + "license": "MIT" + }, + "node_modules/@webassemblyjs/helper-api-error": { + "version": "1.13.2", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-api-error/-/helper-api-error-1.13.2.tgz", + "integrity": "sha512-U56GMYxy4ZQCbDZd6JuvvNV/WFildOjsaWD3Tzzvmw/mas3cXzRJPMjP83JqEsgSbyrmaGjBfDtV7KDXV9UzFQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/@webassemblyjs/helper-buffer": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-buffer/-/helper-buffer-1.14.1.tgz", + "integrity": "sha512-jyH7wtcHiKssDtFPRB+iQdxlDf96m0E39yb0k5uJVhFGleZFoNw1c4aeIcVUPPbXUVJ94wwnMOAqUHyzoEPVMA==", + "dev": true, + "license": "MIT" + }, + "node_modules/@webassemblyjs/helper-numbers": { + "version": "1.13.2", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-numbers/-/helper-numbers-1.13.2.tgz", + "integrity": "sha512-FE8aCmS5Q6eQYcV3gI35O4J789wlQA+7JrqTTpJqn5emA4U2hvwJmvFRC0HODS+3Ye6WioDklgd6scJ3+PLnEA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@webassemblyjs/floating-point-hex-parser": "1.13.2", + "@webassemblyjs/helper-api-error": "1.13.2", + "@xtuc/long": "4.2.2" + } + }, + "node_modules/@webassemblyjs/helper-wasm-bytecode": { + "version": "1.13.2", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-bytecode/-/helper-wasm-bytecode-1.13.2.tgz", + "integrity": "sha512-3QbLKy93F0EAIXLh0ogEVR6rOubA9AoZ+WRYhNbFyuB70j3dRdwH9g+qXhLAO0kiYGlg3TxDV+I4rQTr/YNXkA==", + "dev": true, + "license": "MIT" + }, + "node_modules/@webassemblyjs/helper-wasm-section": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-section/-/helper-wasm-section-1.14.1.tgz", + "integrity": "sha512-ds5mXEqTJ6oxRoqjhWDU83OgzAYjwsCV8Lo/N+oRsNDmx/ZDpqalmrtgOMkHwxsG0iI//3BwWAErYRHtgn0dZw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@webassemblyjs/ast": "1.14.1", + "@webassemblyjs/helper-buffer": "1.14.1", + "@webassemblyjs/helper-wasm-bytecode": "1.13.2", + "@webassemblyjs/wasm-gen": "1.14.1" + } + }, + "node_modules/@webassemblyjs/ieee754": { + "version": "1.13.2", + "resolved": "https://registry.npmjs.org/@webassemblyjs/ieee754/-/ieee754-1.13.2.tgz", + "integrity": "sha512-4LtOzh58S/5lX4ITKxnAK2USuNEvpdVV9AlgGQb8rJDHaLeHciwG4zlGr0j/SNWlr7x3vO1lDEsuePvtcDNCkw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@xtuc/ieee754": "^1.2.0" + } + }, + "node_modules/@webassemblyjs/leb128": { + "version": "1.13.2", + "resolved": "https://registry.npmjs.org/@webassemblyjs/leb128/-/leb128-1.13.2.tgz", + "integrity": "sha512-Lde1oNoIdzVzdkNEAWZ1dZ5orIbff80YPdHx20mrHwHrVNNTjNr8E3xz9BdpcGqRQbAEa+fkrCb+fRFTl/6sQw==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@xtuc/long": "4.2.2" + } + }, + "node_modules/@webassemblyjs/utf8": { + "version": "1.13.2", + "resolved": "https://registry.npmjs.org/@webassemblyjs/utf8/-/utf8-1.13.2.tgz", + "integrity": "sha512-3NQWGjKTASY1xV5m7Hr0iPeXD9+RDobLll3T9d2AO+g3my8xy5peVyjSag4I50mR1bBSN/Ct12lo+R9tJk0NZQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/@webassemblyjs/wasm-edit": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-edit/-/wasm-edit-1.14.1.tgz", + "integrity": "sha512-RNJUIQH/J8iA/1NzlE4N7KtyZNHi3w7at7hDjvRNm5rcUXa00z1vRz3glZoULfJ5mpvYhLybmVcwcjGrC1pRrQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@webassemblyjs/ast": "1.14.1", + "@webassemblyjs/helper-buffer": "1.14.1", + "@webassemblyjs/helper-wasm-bytecode": "1.13.2", + "@webassemblyjs/helper-wasm-section": "1.14.1", + "@webassemblyjs/wasm-gen": "1.14.1", + "@webassemblyjs/wasm-opt": "1.14.1", + "@webassemblyjs/wasm-parser": "1.14.1", + "@webassemblyjs/wast-printer": "1.14.1" + } + }, + "node_modules/@webassemblyjs/wasm-gen": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-gen/-/wasm-gen-1.14.1.tgz", + "integrity": "sha512-AmomSIjP8ZbfGQhumkNvgC33AY7qtMCXnN6bL2u2Js4gVCg8fp735aEiMSBbDR7UQIj90n4wKAFUSEd0QN2Ukg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@webassemblyjs/ast": "1.14.1", + "@webassemblyjs/helper-wasm-bytecode": "1.13.2", + "@webassemblyjs/ieee754": "1.13.2", + "@webassemblyjs/leb128": "1.13.2", + "@webassemblyjs/utf8": "1.13.2" + } + }, + "node_modules/@webassemblyjs/wasm-opt": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-opt/-/wasm-opt-1.14.1.tgz", + "integrity": "sha512-PTcKLUNvBqnY2U6E5bdOQcSM+oVP/PmrDY9NzowJjislEjwP/C4an2303MCVS2Mg9d3AJpIGdUFIQQWbPds0Sw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@webassemblyjs/ast": "1.14.1", + "@webassemblyjs/helper-buffer": "1.14.1", + "@webassemblyjs/wasm-gen": "1.14.1", + "@webassemblyjs/wasm-parser": "1.14.1" + } + }, + "node_modules/@webassemblyjs/wasm-parser": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-parser/-/wasm-parser-1.14.1.tgz", + "integrity": "sha512-JLBl+KZ0R5qB7mCnud/yyX08jWFw5MsoalJ1pQ4EdFlgj9VdXKGuENGsiCIjegI1W7p91rUlcB/LB5yRJKNTcQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@webassemblyjs/ast": "1.14.1", + "@webassemblyjs/helper-api-error": "1.13.2", + "@webassemblyjs/helper-wasm-bytecode": "1.13.2", + "@webassemblyjs/ieee754": "1.13.2", + "@webassemblyjs/leb128": "1.13.2", + "@webassemblyjs/utf8": "1.13.2" + } + }, + "node_modules/@webassemblyjs/wast-printer": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wast-printer/-/wast-printer-1.14.1.tgz", + "integrity": "sha512-kPSSXE6De1XOR820C90RIo2ogvZG+c3KiHzqUoO/F34Y2shGzesfqv7o57xrxovZJH/MetF5UjroJ/R/3isoiw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@webassemblyjs/ast": "1.14.1", + "@xtuc/long": "4.2.2" + } + }, + "node_modules/@webdoc/cli": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/@webdoc/cli/-/cli-2.2.0.tgz", + "integrity": "sha512-RlGgXu5FVPjnwbQbhuevW9J3SpqdKrVq84LpuugijsfjXOkXY+krHwHmnkIw03Hl9I+gQCdXkzsXYZGQk7FcXA==", + "dev": true, + "license": "The Prosperity Public License 3.0.0", + "dependencies": { + "@babel/plugin-proposal-class-properties": "7.17.12", + "@babel/plugin-transform-flow-comments": "7.17.12", + "@sentry/integrations": "7.2.0", + "@sentry/node": "7.2.0", + "@webdoc/default-template": "^2.2.0", + "@webdoc/externalize": "^2.2.0", + "@webdoc/language-babel": "^2.2.0", + "@webdoc/language-parser": "^2.2.0", + "@webdoc/legacy-template": "^2.2.0", + "@webdoc/model": "^2.2.0", + "@webdoc/plugin-format": "^2.2.0", + "@webdoc/plugin-markdown": "^2.2.0", + "@webdoc/template-library": "^2.2.0", + "@webdoc/types": "^2.2.0", + "array.prototype.flatmap": "~1.2.3", + "fs-extra": "^9.0.1", + "globby": "11.0.0", + "gunzip-maybe": "1.4.2", + "highlight.js": "~10.7.2", + "inquirer": "9.0.0", + "lodash.merge": "4.6.2", + "markdown-it": "13.0.1", + "missionlog": "1.6.0", + "object.fromentries": "^2.0.2", + "perf_hooks": "~0.0.1", + "pkg-up": "~3.1.0", + "read-pkg-up": "~7.0.1", + "tar-stream": "2.2.0", + "yargs": "^16.2.0" + }, + "bin": { + "webdoc": "cli.js" + } + }, + "node_modules/@webdoc/cli/node_modules/@webdoc/model": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/@webdoc/model/-/model-2.2.0.tgz", + "integrity": "sha512-I/7ry+sB5ywJkGQ0a+eR1KlrXnzh5kjn4ET6pjfYFnkqJxtafTwNusfpSC4guHyPEm0mdWr/YeBtFJomVx1Dug==", + "dev": true, + "license": "The Prosperity Public License 3.0.0", + "dependencies": { + "@babel/plugin-proposal-class-properties": "7.17.12", + "@babel/plugin-transform-flow-comments": "7.17.12", + "@webdoc/types": "^2.2.0", + "catharsis": "0.8.11", + "nanoid": "~3.1.16", + "taffydb": "2.7.3" + } + }, + "node_modules/@webdoc/cli/node_modules/@webdoc/template-library": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/@webdoc/template-library/-/template-library-2.2.0.tgz", + "integrity": "sha512-FrvDXOlrCPHQoKKBA8SSmx6NsXLFRnDi59Mh7ZiYJpCZaqU7B2p+gpajMkScDU4H1/blMTVAu9M3B9e6/j7EhQ==", + "dev": true, + "license": "The Prosperity Public License 3.0.0", + "dependencies": { + "@babel/plugin-proposal-class-properties": "7.17.12", + "@babel/plugin-transform-flow-comments": "7.17.12", + "@fork-of/git-branch": "2.1.1", + "@webdoc/externalize": "^2.2.0", + "@webdoc/model": "^2.2.0", + "@webdoc/types": "^2.2.0", + "catharsis": "0.8.11", + "fs-extra": "^9.0.1", + "lodash": "^4.17.20", + "missionlog": "1.6.0", + "nanoid": "~3.1.16", + "node-fetch": "~2.6.1", + "parse-github-url": "1.0.2" + } + }, + "node_modules/@webdoc/cli/node_modules/ansi-escapes": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-5.0.0.tgz", + "integrity": "sha512-5GFMVX8HqE/TB+FuBJGuO5XG0WrsA6ptUqoODaT/n9mmUaZFkqnBueB4leqGBCmrUHnCnC4PCZTCd0E7QQ83bA==", + "dev": true, + "license": "MIT", + "dependencies": { + "type-fest": "^1.0.2" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@webdoc/cli/node_modules/ansi-styles": { + "version": "6.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-6.2.1.tgz", + "integrity": "sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/@webdoc/cli/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/@webdoc/cli/node_modules/cli-cursor": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-4.0.0.tgz", + "integrity": "sha512-VGtlMu3x/4DOtIUwEkRezxUZ2lBacNJCHash0N0WeZDBS+7Ux1dm3XWAgWYxLJFMMdOeXMHXorshEFhbMSGelg==", + "dev": true, + "license": "MIT", + "dependencies": { + "restore-cursor": "^4.0.0" + }, + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@webdoc/cli/node_modules/emoji-regex": { + "version": "9.2.2", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-9.2.2.tgz", + "integrity": "sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==", + "dev": true, + "license": "MIT" + }, + "node_modules/@webdoc/cli/node_modules/entities": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/entities/-/entities-3.0.1.tgz", + "integrity": "sha512-WiyBqoomrwMdFG1e0kqvASYfnlb0lp8M5o5Fw2OFq1hNZxxcNk8Ik0Xm7LxzBhuidnZB/UtBqVCgUz3kBOP51Q==", + "dev": true, + "license": "BSD-2-Clause", + "engines": { + "node": ">=0.12" + }, + "funding": { + "url": "https://github.com/fb55/entities?sponsor=1" + } + }, + "node_modules/@webdoc/cli/node_modules/globby": { + "version": "11.0.0", + "resolved": "https://registry.npmjs.org/globby/-/globby-11.0.0.tgz", + "integrity": "sha512-iuehFnR3xu5wBBtm4xi0dMe92Ob87ufyu/dHwpDYfbcpYpIbrO5OnS8M1vWvrBhSGEJ3/Ecj7gnX76P8YxpPEg==", + "dev": true, + "license": "MIT", + "dependencies": { + "array-union": "^2.1.0", + "dir-glob": "^3.0.1", + "fast-glob": "^3.1.1", + "ignore": "^5.1.4", + "merge2": "^1.3.0", + "slash": "^3.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@webdoc/cli/node_modules/inquirer": { + "version": "9.0.0", + "resolved": "https://registry.npmjs.org/inquirer/-/inquirer-9.0.0.tgz", + "integrity": "sha512-eYTDdTYr/YPwRenOzLZTvaJUDXDW8GQgxvzBppuXLj/kauTRLfV8bCPVbGh2staP7edrqL+rGwjaOa+JVxBWsg==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-escapes": "^5.0.0", + "chalk": "^5.0.1", + "cli-cursor": "^4.0.0", + "cli-width": "^4.0.0", + "external-editor": "^3.0.3", + "figures": "^4.0.1", + "lodash": "^4.17.21", + "mute-stream": "0.0.8", + "ora": "^6.1.0", + "run-async": "^2.4.0", + "rxjs": "^7.5.5", + "string-width": "^5.1.2", + "strip-ansi": "^7.0.1", + "through": "^2.3.6", + "wrap-ansi": "^8.0.1" + }, + "engines": { + "node": ">=12.0.0" + } + }, + "node_modules/@webdoc/cli/node_modules/is-interactive": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/is-interactive/-/is-interactive-2.0.0.tgz", + "integrity": "sha512-qP1vozQRI+BMOPcjFzrjXuQvdak2pHNUMZoeG2eRbiSqyvbEf/wQtEOTOX1guk6E3t36RkaqiSt8A/6YElNxLQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@webdoc/cli/node_modules/is-unicode-supported": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/is-unicode-supported/-/is-unicode-supported-1.3.0.tgz", + "integrity": "sha512-43r2mRvz+8JRIKnWJ+3j8JtjRKZ6GmjzfaE/qiBJnikNnYv/6bagRJ1kUhNk8R5EX/GkobD+r+sfxCPJsiKBLQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@webdoc/cli/node_modules/linkify-it": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/linkify-it/-/linkify-it-4.0.1.tgz", + "integrity": "sha512-C7bfi1UZmoj8+PQx22XyeXCuBlokoyWQL5pWSP+EI6nzRylyThouddufc2c1NDIcP9k5agmN9fLpA7VNJfIiqw==", + "dev": true, + "license": "MIT", + "dependencies": { + "uc.micro": "^1.0.1" + } + }, + "node_modules/@webdoc/cli/node_modules/log-symbols": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/log-symbols/-/log-symbols-5.1.0.tgz", + "integrity": "sha512-l0x2DvrW294C9uDCoQe1VSU4gf529FkSZ6leBl4TiqZH/e+0R7hSfHQBNut2mNygDgHwvYHfFLn6Oxb3VWj2rA==", + "dev": true, + "license": "MIT", + "dependencies": { + "chalk": "^5.0.0", + "is-unicode-supported": "^1.1.0" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@webdoc/cli/node_modules/markdown-it": { + "version": "13.0.1", + "resolved": "https://registry.npmjs.org/markdown-it/-/markdown-it-13.0.1.tgz", + "integrity": "sha512-lTlxriVoy2criHP0JKRhO2VDG9c2ypWCsT237eDiLqi09rmbKoUetyGHq2uOIRoRS//kfoJckS0eUzzkDR+k2Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "argparse": "^2.0.1", + "entities": "~3.0.1", + "linkify-it": "^4.0.1", + "mdurl": "^1.0.1", + "uc.micro": "^1.0.5" + }, + "bin": { + "markdown-it": "bin/markdown-it.js" + } + }, + "node_modules/@webdoc/cli/node_modules/missionlog": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/missionlog/-/missionlog-1.6.0.tgz", + "integrity": "sha512-E7I0ePiUvh9Su4JnWcJaegek0fEU0OsQhatoqoYKRkJOkOWy5v2JjU6HKawxqcootHr/EtNSkyaUJM0ictCDZQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/runtime": "^7.8.4", + "core-js": "^3.6.4" + }, + "engines": { + "node": ">=8.0.0" + } + }, + "node_modules/@webdoc/cli/node_modules/mute-stream": { + "version": "0.0.8", + "resolved": "https://registry.npmjs.org/mute-stream/-/mute-stream-0.0.8.tgz", + "integrity": "sha512-nnbWWOkoWyUsTjKrhgD0dcz22mdkSnpYqbEjIm2nhwhuxlSkpywJmBo8h0ZqJdkp73mb90SssHkN4rsRaBAfAA==", + "dev": true, + "license": "ISC" + }, + "node_modules/@webdoc/cli/node_modules/ora": { + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/ora/-/ora-6.3.1.tgz", + "integrity": "sha512-ERAyNnZOfqM+Ao3RAvIXkYh5joP220yf59gVe2X/cI6SiCxIdi4c9HZKZD8R6q/RDXEje1THBju6iExiSsgJaQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "chalk": "^5.0.0", + "cli-cursor": "^4.0.0", + "cli-spinners": "^2.6.1", + "is-interactive": "^2.0.0", + "is-unicode-supported": "^1.1.0", + "log-symbols": "^5.1.0", + "stdin-discarder": "^0.1.0", + "strip-ansi": "^7.0.1", + "wcwidth": "^1.0.1" + }, + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@webdoc/cli/node_modules/restore-cursor": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-4.0.0.tgz", + "integrity": "sha512-I9fPXU9geO9bHOt9pHHOhOkYerIMsmVaWB0rA2AI9ERh/+x/i7MV5HKBNrg+ljO5eoPVgCcnFuRjJ9uH6I/3eg==", + "dev": true, + "license": "MIT", + "dependencies": { + "onetime": "^5.1.0", + "signal-exit": "^3.0.2" + }, + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@webdoc/cli/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==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.12.0" + } + }, + "node_modules/@webdoc/cli/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/@webdoc/cli/node_modules/string-width": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-5.1.2.tgz", + "integrity": "sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA==", + "dev": true, + "license": "MIT", + "dependencies": { + "eastasianwidth": "^0.2.0", + "emoji-regex": "^9.2.2", + "strip-ansi": "^7.0.1" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@webdoc/cli/node_modules/type-fest": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-1.4.0.tgz", + "integrity": "sha512-yGSza74xk0UG8k+pLh5oeoYirvIiWo5t0/o3zHHAO2tRDiZcxWP7fywNlXhqb6/r6sWvwi+RsyQMWhVLe4BVuA==", + "dev": true, + "license": "(MIT OR CC0-1.0)", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@webdoc/cli/node_modules/wrap-ansi": { + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-8.1.0.tgz", + "integrity": "sha512-si7QWI6zUMq56bESFvagtmzMdGOtoxfR+Sez11Mobfc7tm+VkUckk9bW2UeffTGVUbOksxmSw0AA2gs8g71NCQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-styles": "^6.1.0", + "string-width": "^5.0.1", + "strip-ansi": "^7.0.1" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/wrap-ansi?sponsor=1" + } + }, + "node_modules/@webdoc/default-template": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/@webdoc/default-template/-/default-template-2.2.0.tgz", + "integrity": "sha512-B6Y3I56mdpEkgQQyXeG23ToM4A/WosnG7bK3AjW6U36vzBuwFet8S2iH9hAvguem4fV+wY4J/zdZYKxqL5qw8w==", + "dev": true, + "license": "The Prosperity Public License 3.0.0", + "dependencies": { + "@babel/core": "7.18.5", + "@babel/plugin-proposal-class-properties": "7.17.12", + "@babel/plugin-transform-flow-comments": "7.17.12", + "@babel/preset-react": "^7.10.1", + "@webdoc/model": "^2.2.0", + "@webdoc/template-library": "^2.2.0", + "@webdoc/types": "^2.2.0", + "code-prettify": "^0.1.0", + "fs-extra": "^9.0.1", + "highlight.js": "~10.7.2", + "markdown-it": "13.0.1" + } + }, + "node_modules/@webdoc/default-template/node_modules/@babel/core": { + "version": "7.18.5", + "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.18.5.tgz", + "integrity": "sha512-MGY8vg3DxMnctw0LdvSEojOsumc70g0t18gNyUdAZqB1Rpd1Bqo/svHGvt+UJ6JcGX+DIekGFDxxIWofBxLCnQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@ampproject/remapping": "^2.1.0", + "@babel/code-frame": "^7.16.7", + "@babel/generator": "^7.18.2", + "@babel/helper-compilation-targets": "^7.18.2", + "@babel/helper-module-transforms": "^7.18.0", + "@babel/helpers": "^7.18.2", + "@babel/parser": "^7.18.5", + "@babel/template": "^7.16.7", + "@babel/traverse": "^7.18.5", + "@babel/types": "^7.18.4", + "convert-source-map": "^1.7.0", + "debug": "^4.1.0", + "gensync": "^1.0.0-beta.2", + "json5": "^2.2.1", + "semver": "^6.3.0" + }, + "engines": { + "node": ">=6.9.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/babel" + } + }, + "node_modules/@webdoc/default-template/node_modules/@webdoc/model": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/@webdoc/model/-/model-2.2.0.tgz", + "integrity": "sha512-I/7ry+sB5ywJkGQ0a+eR1KlrXnzh5kjn4ET6pjfYFnkqJxtafTwNusfpSC4guHyPEm0mdWr/YeBtFJomVx1Dug==", + "dev": true, + "license": "The Prosperity Public License 3.0.0", + "dependencies": { + "@babel/plugin-proposal-class-properties": "7.17.12", + "@babel/plugin-transform-flow-comments": "7.17.12", + "@webdoc/types": "^2.2.0", + "catharsis": "0.8.11", + "nanoid": "~3.1.16", + "taffydb": "2.7.3" + } + }, + "node_modules/@webdoc/default-template/node_modules/@webdoc/template-library": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/@webdoc/template-library/-/template-library-2.2.0.tgz", + "integrity": "sha512-FrvDXOlrCPHQoKKBA8SSmx6NsXLFRnDi59Mh7ZiYJpCZaqU7B2p+gpajMkScDU4H1/blMTVAu9M3B9e6/j7EhQ==", + "dev": true, + "license": "The Prosperity Public License 3.0.0", + "dependencies": { + "@babel/plugin-proposal-class-properties": "7.17.12", + "@babel/plugin-transform-flow-comments": "7.17.12", + "@fork-of/git-branch": "2.1.1", + "@webdoc/externalize": "^2.2.0", + "@webdoc/model": "^2.2.0", + "@webdoc/types": "^2.2.0", + "catharsis": "0.8.11", + "fs-extra": "^9.0.1", + "lodash": "^4.17.20", + "missionlog": "1.6.0", + "nanoid": "~3.1.16", + "node-fetch": "~2.6.1", + "parse-github-url": "1.0.2" + } + }, + "node_modules/@webdoc/default-template/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/@webdoc/default-template/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/@webdoc/default-template/node_modules/entities": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/entities/-/entities-3.0.1.tgz", + "integrity": "sha512-WiyBqoomrwMdFG1e0kqvASYfnlb0lp8M5o5Fw2OFq1hNZxxcNk8Ik0Xm7LxzBhuidnZB/UtBqVCgUz3kBOP51Q==", + "dev": true, + "license": "BSD-2-Clause", + "engines": { + "node": ">=0.12" + }, + "funding": { + "url": "https://github.com/fb55/entities?sponsor=1" + } + }, + "node_modules/@webdoc/default-template/node_modules/linkify-it": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/linkify-it/-/linkify-it-4.0.1.tgz", + "integrity": "sha512-C7bfi1UZmoj8+PQx22XyeXCuBlokoyWQL5pWSP+EI6nzRylyThouddufc2c1NDIcP9k5agmN9fLpA7VNJfIiqw==", + "dev": true, + "license": "MIT", + "dependencies": { + "uc.micro": "^1.0.1" + } + }, + "node_modules/@webdoc/default-template/node_modules/markdown-it": { + "version": "13.0.1", + "resolved": "https://registry.npmjs.org/markdown-it/-/markdown-it-13.0.1.tgz", + "integrity": "sha512-lTlxriVoy2criHP0JKRhO2VDG9c2ypWCsT237eDiLqi09rmbKoUetyGHq2uOIRoRS//kfoJckS0eUzzkDR+k2Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "argparse": "^2.0.1", + "entities": "~3.0.1", + "linkify-it": "^4.0.1", + "mdurl": "^1.0.1", + "uc.micro": "^1.0.5" + }, + "bin": { + "markdown-it": "bin/markdown-it.js" + } + }, + "node_modules/@webdoc/default-template/node_modules/missionlog": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/missionlog/-/missionlog-1.6.0.tgz", + "integrity": "sha512-E7I0ePiUvh9Su4JnWcJaegek0fEU0OsQhatoqoYKRkJOkOWy5v2JjU6HKawxqcootHr/EtNSkyaUJM0ictCDZQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/runtime": "^7.8.4", + "core-js": "^3.6.4" + }, + "engines": { + "node": ">=8.0.0" + } + }, + "node_modules/@webdoc/externalize": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/@webdoc/externalize/-/externalize-2.2.0.tgz", + "integrity": "sha512-IcRgvwXGH7anwqwIbv+96AFs2It5LJZBwbvrBZu2ThXmC1hgU7w8wIdv/UaMdY4HUhB65u2HvQclSfN553md8w==", + "dev": true, + "license": "The Prosperity Public License 3.0.0", + "dependencies": { + "@babel/core": "7.18.5", + "@babel/plugin-proposal-class-properties": "7.17.12", + "@babel/plugin-transform-flow-comments": "7.17.12", + "@webdoc/model": "^2.2.0", + "@webdoc/types": "^2.2.0", + "lodash": "^4.17.20" + } + }, + "node_modules/@webdoc/externalize/node_modules/@babel/core": { + "version": "7.18.5", + "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.18.5.tgz", + "integrity": "sha512-MGY8vg3DxMnctw0LdvSEojOsumc70g0t18gNyUdAZqB1Rpd1Bqo/svHGvt+UJ6JcGX+DIekGFDxxIWofBxLCnQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@ampproject/remapping": "^2.1.0", + "@babel/code-frame": "^7.16.7", + "@babel/generator": "^7.18.2", + "@babel/helper-compilation-targets": "^7.18.2", + "@babel/helper-module-transforms": "^7.18.0", + "@babel/helpers": "^7.18.2", + "@babel/parser": "^7.18.5", + "@babel/template": "^7.16.7", + "@babel/traverse": "^7.18.5", + "@babel/types": "^7.18.4", + "convert-source-map": "^1.7.0", + "debug": "^4.1.0", + "gensync": "^1.0.0-beta.2", + "json5": "^2.2.1", + "semver": "^6.3.0" + }, + "engines": { + "node": ">=6.9.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/babel" + } + }, + "node_modules/@webdoc/externalize/node_modules/@webdoc/model": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/@webdoc/model/-/model-2.2.0.tgz", + "integrity": "sha512-I/7ry+sB5ywJkGQ0a+eR1KlrXnzh5kjn4ET6pjfYFnkqJxtafTwNusfpSC4guHyPEm0mdWr/YeBtFJomVx1Dug==", + "dev": true, + "license": "The Prosperity Public License 3.0.0", + "dependencies": { + "@babel/plugin-proposal-class-properties": "7.17.12", + "@babel/plugin-transform-flow-comments": "7.17.12", + "@webdoc/types": "^2.2.0", + "catharsis": "0.8.11", + "nanoid": "~3.1.16", + "taffydb": "2.7.3" + } + }, + "node_modules/@webdoc/externalize/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/@webdoc/language-babel": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/@webdoc/language-babel/-/language-babel-2.2.0.tgz", + "integrity": "sha512-PjK7lmI7Yx8Ufun06TD7LCvtTzM97d2Gro5yWhKRkqTcIHbsL7xyuI8rTa0lX5fSjDvZJ5oRnrk2APkuvAvpfQ==", + "dev": true, + "license": "The Prosperity Public License 3.0.0", + "dependencies": { + "@babel/parser": "^7.9.4", + "@babel/traverse": "7.9.5", + "@babel/types": "7.9.5", + "@webdoc/language-library": "^2.2.0", + "@webdoc/model": "^2.2.0", + "@webdoc/types": "^2.2.0", + "lodash": "^4.17.20", + "missionlog": "1.6.0", + "nanoid": "~3.1.16" + }, + "peerDependencies": { + "@sentry/node": "7.2.0" + } + }, + "node_modules/@webdoc/language-babel/node_modules/@babel/traverse": { + "version": "7.9.5", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.9.5.tgz", + "integrity": "sha512-c4gH3jsvSuGUezlP6rzSJ6jf8fYjLj3hsMZRx/nX0h+fmHN0w+ekubRrHPqnMec0meycA2nwCsJ7dC8IPem2FQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/code-frame": "^7.8.3", + "@babel/generator": "^7.9.5", + "@babel/helper-function-name": "^7.9.5", + "@babel/helper-split-export-declaration": "^7.8.3", + "@babel/parser": "^7.9.0", + "@babel/types": "^7.9.5", + "debug": "^4.1.0", + "globals": "^11.1.0", + "lodash": "^4.17.13" + } + }, + "node_modules/@webdoc/language-babel/node_modules/@babel/types": { + "version": "7.9.5", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.9.5.tgz", + "integrity": "sha512-XjnvNqenk818r5zMaba+sLQjnbda31UfUURv3ei0qPQw4u+j2jMyJ5b11y8ZHYTRSI3NnInQkkkRT4fLqqPdHg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-validator-identifier": "^7.9.5", + "lodash": "^4.17.13", + "to-fast-properties": "^2.0.0" + } + }, + "node_modules/@webdoc/language-babel/node_modules/@webdoc/model": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/@webdoc/model/-/model-2.2.0.tgz", + "integrity": "sha512-I/7ry+sB5ywJkGQ0a+eR1KlrXnzh5kjn4ET6pjfYFnkqJxtafTwNusfpSC4guHyPEm0mdWr/YeBtFJomVx1Dug==", + "dev": true, + "license": "The Prosperity Public License 3.0.0", + "dependencies": { + "@babel/plugin-proposal-class-properties": "7.17.12", + "@babel/plugin-transform-flow-comments": "7.17.12", + "@webdoc/types": "^2.2.0", + "catharsis": "0.8.11", + "nanoid": "~3.1.16", + "taffydb": "2.7.3" + } + }, + "node_modules/@webdoc/language-babel/node_modules/missionlog": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/missionlog/-/missionlog-1.6.0.tgz", + "integrity": "sha512-E7I0ePiUvh9Su4JnWcJaegek0fEU0OsQhatoqoYKRkJOkOWy5v2JjU6HKawxqcootHr/EtNSkyaUJM0ictCDZQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/runtime": "^7.8.4", + "core-js": "^3.6.4" + }, + "engines": { + "node": ">=8.0.0" + } + }, + "node_modules/@webdoc/language-library": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/@webdoc/language-library/-/language-library-2.2.0.tgz", + "integrity": "sha512-AbD6D4ujLk87EBipuJTyE1rc+D11SnwbmIqZX5SuP7CQF2nho6CBaJhMG/+ve9kWVarMGj8K5vrMLaoPyXO79g==", + "dev": true, + "license": "The Prosperity Public License 3.0.0", + "dependencies": { + "@babel/parser": "^7.9.4", + "@babel/traverse": "7.9.5", + "@babel/types": "7.9.5", + "@webdoc/model": "^2.2.0", + "@webdoc/types": "^2.2.0", + "lodash": "^4.17.20", + "missionlog": "1.6.0", + "nanoid": "~3.1.16" + }, + "peerDependencies": { + "@sentry/node": "7.2.0" + } + }, + "node_modules/@webdoc/language-library/node_modules/@babel/traverse": { + "version": "7.9.5", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.9.5.tgz", + "integrity": "sha512-c4gH3jsvSuGUezlP6rzSJ6jf8fYjLj3hsMZRx/nX0h+fmHN0w+ekubRrHPqnMec0meycA2nwCsJ7dC8IPem2FQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/code-frame": "^7.8.3", + "@babel/generator": "^7.9.5", + "@babel/helper-function-name": "^7.9.5", + "@babel/helper-split-export-declaration": "^7.8.3", + "@babel/parser": "^7.9.0", + "@babel/types": "^7.9.5", + "debug": "^4.1.0", + "globals": "^11.1.0", + "lodash": "^4.17.13" + } + }, + "node_modules/@webdoc/language-library/node_modules/@babel/types": { + "version": "7.9.5", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.9.5.tgz", + "integrity": "sha512-XjnvNqenk818r5zMaba+sLQjnbda31UfUURv3ei0qPQw4u+j2jMyJ5b11y8ZHYTRSI3NnInQkkkRT4fLqqPdHg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-validator-identifier": "^7.9.5", + "lodash": "^4.17.13", + "to-fast-properties": "^2.0.0" + } + }, + "node_modules/@webdoc/language-library/node_modules/@webdoc/model": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/@webdoc/model/-/model-2.2.0.tgz", + "integrity": "sha512-I/7ry+sB5ywJkGQ0a+eR1KlrXnzh5kjn4ET6pjfYFnkqJxtafTwNusfpSC4guHyPEm0mdWr/YeBtFJomVx1Dug==", + "dev": true, + "license": "The Prosperity Public License 3.0.0", + "dependencies": { + "@babel/plugin-proposal-class-properties": "7.17.12", + "@babel/plugin-transform-flow-comments": "7.17.12", + "@webdoc/types": "^2.2.0", + "catharsis": "0.8.11", + "nanoid": "~3.1.16", + "taffydb": "2.7.3" + } + }, + "node_modules/@webdoc/language-library/node_modules/missionlog": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/missionlog/-/missionlog-1.6.0.tgz", + "integrity": "sha512-E7I0ePiUvh9Su4JnWcJaegek0fEU0OsQhatoqoYKRkJOkOWy5v2JjU6HKawxqcootHr/EtNSkyaUJM0ictCDZQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/runtime": "^7.8.4", + "core-js": "^3.6.4" + }, + "engines": { + "node": ">=8.0.0" + } + }, + "node_modules/@webdoc/language-parser": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/@webdoc/language-parser/-/language-parser-2.2.0.tgz", + "integrity": "sha512-sos8i6a/J14S6AtnqxZv31TF5gnudKzJicXEl0AZvmxfX+VHWw9FGI4ibKeKTG/EYNPxq3CWbwCejgpbW/cYtA==", + "dev": true, + "license": "The Prosperity Public License 3.0.0", + "dependencies": { + "@babel/parser": "^7.9.4", + "@babel/plugin-proposal-class-properties": "7.17.12", + "@babel/plugin-transform-flow-comments": "7.17.12", + "@babel/traverse": "7.9.5", + "@babel/types": "7.9.5", + "@webdoc/language-library": "^2.2.0", + "@webdoc/model": "^2.2.0", + "@webdoc/types": "^2.2.0", + "lodash": "^4.17.20", + "missionlog": "1.6.0", + "nanoid": "~3.1.16" + }, + "peerDependencies": { + "@sentry/node": "7.2.0" + } + }, + "node_modules/@webdoc/language-parser/node_modules/@babel/traverse": { + "version": "7.9.5", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.9.5.tgz", + "integrity": "sha512-c4gH3jsvSuGUezlP6rzSJ6jf8fYjLj3hsMZRx/nX0h+fmHN0w+ekubRrHPqnMec0meycA2nwCsJ7dC8IPem2FQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/code-frame": "^7.8.3", + "@babel/generator": "^7.9.5", + "@babel/helper-function-name": "^7.9.5", + "@babel/helper-split-export-declaration": "^7.8.3", + "@babel/parser": "^7.9.0", + "@babel/types": "^7.9.5", + "debug": "^4.1.0", + "globals": "^11.1.0", + "lodash": "^4.17.13" + } + }, + "node_modules/@webdoc/language-parser/node_modules/@babel/types": { + "version": "7.9.5", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.9.5.tgz", + "integrity": "sha512-XjnvNqenk818r5zMaba+sLQjnbda31UfUURv3ei0qPQw4u+j2jMyJ5b11y8ZHYTRSI3NnInQkkkRT4fLqqPdHg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-validator-identifier": "^7.9.5", + "lodash": "^4.17.13", + "to-fast-properties": "^2.0.0" + } + }, + "node_modules/@webdoc/language-parser/node_modules/@webdoc/model": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/@webdoc/model/-/model-2.2.0.tgz", + "integrity": "sha512-I/7ry+sB5ywJkGQ0a+eR1KlrXnzh5kjn4ET6pjfYFnkqJxtafTwNusfpSC4guHyPEm0mdWr/YeBtFJomVx1Dug==", + "dev": true, + "license": "The Prosperity Public License 3.0.0", + "dependencies": { + "@babel/plugin-proposal-class-properties": "7.17.12", + "@babel/plugin-transform-flow-comments": "7.17.12", + "@webdoc/types": "^2.2.0", + "catharsis": "0.8.11", + "nanoid": "~3.1.16", + "taffydb": "2.7.3" + } + }, + "node_modules/@webdoc/language-parser/node_modules/missionlog": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/missionlog/-/missionlog-1.6.0.tgz", + "integrity": "sha512-E7I0ePiUvh9Su4JnWcJaegek0fEU0OsQhatoqoYKRkJOkOWy5v2JjU6HKawxqcootHr/EtNSkyaUJM0ictCDZQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/runtime": "^7.8.4", + "core-js": "^3.6.4" + }, + "engines": { + "node": ">=8.0.0" + } + }, + "node_modules/@webdoc/legacy-template": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/@webdoc/legacy-template/-/legacy-template-2.2.0.tgz", + "integrity": "sha512-O3nVj+bFv4mG4ATk1yFKEYC6MlhTV/qffRSLeyyPevGtVtJPd4KoOZOjrLra+rLV5uxFLoMUeq0Ci0tV/uk9iA==", + "dev": true, + "license": "The Prosperity Public License 3.0.0", + "dependencies": { + "@babel/plugin-proposal-class-properties": "7.17.12", + "@babel/plugin-transform-flow-comments": "7.17.12", + "@webdoc/model": "^2.2.0", + "@webdoc/template-library": "^2.2.0", + "bluebird": "^3.7.2", + "code-prettify": "^0.1.0", + "color-themes-for-google-code-prettify": "^2.0.4", + "common-path-prefix": "^3.0.0", + "escape-string-regexp": "^3.0.0", + "fs-extra": "^9.0.1", + "klaw-sync": "6.0.0", + "lodash": "^4.17.20", + "markdown-it": "13.0.1", + "markdown-it-highlightjs": "^3.1.0", + "missionlog": "1.6.0", + "open-sans-fonts": "^1.6.2" + } + }, + "node_modules/@webdoc/legacy-template/node_modules/@webdoc/model": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/@webdoc/model/-/model-2.2.0.tgz", + "integrity": "sha512-I/7ry+sB5ywJkGQ0a+eR1KlrXnzh5kjn4ET6pjfYFnkqJxtafTwNusfpSC4guHyPEm0mdWr/YeBtFJomVx1Dug==", + "dev": true, + "license": "The Prosperity Public License 3.0.0", + "dependencies": { + "@babel/plugin-proposal-class-properties": "7.17.12", + "@babel/plugin-transform-flow-comments": "7.17.12", + "@webdoc/types": "^2.2.0", + "catharsis": "0.8.11", + "nanoid": "~3.1.16", + "taffydb": "2.7.3" + } + }, + "node_modules/@webdoc/legacy-template/node_modules/@webdoc/template-library": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/@webdoc/template-library/-/template-library-2.2.0.tgz", + "integrity": "sha512-FrvDXOlrCPHQoKKBA8SSmx6NsXLFRnDi59Mh7ZiYJpCZaqU7B2p+gpajMkScDU4H1/blMTVAu9M3B9e6/j7EhQ==", + "dev": true, + "license": "The Prosperity Public License 3.0.0", + "dependencies": { + "@babel/plugin-proposal-class-properties": "7.17.12", + "@babel/plugin-transform-flow-comments": "7.17.12", + "@fork-of/git-branch": "2.1.1", + "@webdoc/externalize": "^2.2.0", + "@webdoc/model": "^2.2.0", + "@webdoc/types": "^2.2.0", + "catharsis": "0.8.11", + "fs-extra": "^9.0.1", + "lodash": "^4.17.20", + "missionlog": "1.6.0", + "nanoid": "~3.1.16", + "node-fetch": "~2.6.1", + "parse-github-url": "1.0.2" + } + }, + "node_modules/@webdoc/legacy-template/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/@webdoc/legacy-template/node_modules/entities": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/entities/-/entities-3.0.1.tgz", + "integrity": "sha512-WiyBqoomrwMdFG1e0kqvASYfnlb0lp8M5o5Fw2OFq1hNZxxcNk8Ik0Xm7LxzBhuidnZB/UtBqVCgUz3kBOP51Q==", + "dev": true, + "license": "BSD-2-Clause", + "engines": { + "node": ">=0.12" + }, + "funding": { + "url": "https://github.com/fb55/entities?sponsor=1" + } + }, + "node_modules/@webdoc/legacy-template/node_modules/linkify-it": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/linkify-it/-/linkify-it-4.0.1.tgz", + "integrity": "sha512-C7bfi1UZmoj8+PQx22XyeXCuBlokoyWQL5pWSP+EI6nzRylyThouddufc2c1NDIcP9k5agmN9fLpA7VNJfIiqw==", + "dev": true, + "license": "MIT", + "dependencies": { + "uc.micro": "^1.0.1" + } + }, + "node_modules/@webdoc/legacy-template/node_modules/markdown-it": { + "version": "13.0.1", + "resolved": "https://registry.npmjs.org/markdown-it/-/markdown-it-13.0.1.tgz", + "integrity": "sha512-lTlxriVoy2criHP0JKRhO2VDG9c2ypWCsT237eDiLqi09rmbKoUetyGHq2uOIRoRS//kfoJckS0eUzzkDR+k2Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "argparse": "^2.0.1", + "entities": "~3.0.1", + "linkify-it": "^4.0.1", + "mdurl": "^1.0.1", + "uc.micro": "^1.0.5" + }, + "bin": { + "markdown-it": "bin/markdown-it.js" + } + }, + "node_modules/@webdoc/legacy-template/node_modules/missionlog": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/missionlog/-/missionlog-1.6.0.tgz", + "integrity": "sha512-E7I0ePiUvh9Su4JnWcJaegek0fEU0OsQhatoqoYKRkJOkOWy5v2JjU6HKawxqcootHr/EtNSkyaUJM0ictCDZQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/runtime": "^7.8.4", + "core-js": "^3.6.4" + }, + "engines": { + "node": ">=8.0.0" + } + }, + "node_modules/@webdoc/model": { + "version": "1.6.6", + "resolved": "https://registry.npmjs.org/@webdoc/model/-/model-1.6.6.tgz", + "integrity": "sha512-Ul27xoMOvSyoHNLNDAtFz74xY+rCCUEl15I6MnbUk8zTD8kG1tucycION4u0MVUr12OOgFUvuGzpWYvZ52CT5A==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "@webdoc/types": "^1.6.6", + "catharsis": "0.8.11", + "nanoid": "~3.1.16", + "taffydb": "2.7.3" + } + }, + "node_modules/@webdoc/model/node_modules/@webdoc/types": { + "version": "1.6.6", + "resolved": "https://registry.npmjs.org/@webdoc/types/-/types-1.6.6.tgz", + "integrity": "sha512-GrXtaUIkrXS80zIDIXpU8XrDmlci5S0+TE2fR3L9cM4v/I6ySn52/i6PWwR2pZbr0dih7ao/qirkv8ygfW0B/Q==", + "dev": true, + "license": "MIT", + "peer": true + }, + "node_modules/@webdoc/plugin-format": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/@webdoc/plugin-format/-/plugin-format-2.2.0.tgz", + "integrity": "sha512-fbiTb+NrPZftzYCInsGwJVKo7qmfkgqQ0pA0SE8f2jKJO/qZvRu9/+nUla49AOvfX0hr8WGHcxz8LwPmaJmBpg==", + "dev": true, + "license": "The Prosperity Public License 3.0.0", + "dependencies": { + "@babel/core": "7.18.5", + "@babel/plugin-proposal-class-properties": "7.17.12", + "@babel/plugin-transform-flow-comments": "7.17.12", + "@webdoc/model": "^2.2.0", + "@webdoc/types": "^2.2.0" + } + }, + "node_modules/@webdoc/plugin-format/node_modules/@babel/core": { + "version": "7.18.5", + "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.18.5.tgz", + "integrity": "sha512-MGY8vg3DxMnctw0LdvSEojOsumc70g0t18gNyUdAZqB1Rpd1Bqo/svHGvt+UJ6JcGX+DIekGFDxxIWofBxLCnQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@ampproject/remapping": "^2.1.0", + "@babel/code-frame": "^7.16.7", + "@babel/generator": "^7.18.2", + "@babel/helper-compilation-targets": "^7.18.2", + "@babel/helper-module-transforms": "^7.18.0", + "@babel/helpers": "^7.18.2", + "@babel/parser": "^7.18.5", + "@babel/template": "^7.16.7", + "@babel/traverse": "^7.18.5", + "@babel/types": "^7.18.4", + "convert-source-map": "^1.7.0", + "debug": "^4.1.0", + "gensync": "^1.0.0-beta.2", + "json5": "^2.2.1", + "semver": "^6.3.0" + }, + "engines": { + "node": ">=6.9.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/babel" + } + }, + "node_modules/@webdoc/plugin-format/node_modules/@webdoc/model": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/@webdoc/model/-/model-2.2.0.tgz", + "integrity": "sha512-I/7ry+sB5ywJkGQ0a+eR1KlrXnzh5kjn4ET6pjfYFnkqJxtafTwNusfpSC4guHyPEm0mdWr/YeBtFJomVx1Dug==", + "dev": true, + "license": "The Prosperity Public License 3.0.0", + "dependencies": { + "@babel/plugin-proposal-class-properties": "7.17.12", + "@babel/plugin-transform-flow-comments": "7.17.12", + "@webdoc/types": "^2.2.0", + "catharsis": "0.8.11", + "nanoid": "~3.1.16", + "taffydb": "2.7.3" + } + }, + "node_modules/@webdoc/plugin-format/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/@webdoc/plugin-markdown": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/@webdoc/plugin-markdown/-/plugin-markdown-2.2.0.tgz", + "integrity": "sha512-reA38r9rPugOU/iULCINx7fwOZdh9gKVU3NeOJ9dkSaGcvIgx+O55fD9DyK8GoNJJREkSgjitmswy4PYrzf/2w==", + "dev": true, + "license": "The Prosperity Public License 3.0.0", + "dependencies": { + "@babel/plugin-proposal-class-properties": "7.17.12", + "@babel/plugin-transform-flow-comments": "7.17.12", + "highlight.js": "~10.7.2", + "markdown-it": "13.0.1" + } + }, + "node_modules/@webdoc/plugin-markdown/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/@webdoc/plugin-markdown/node_modules/entities": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/entities/-/entities-3.0.1.tgz", + "integrity": "sha512-WiyBqoomrwMdFG1e0kqvASYfnlb0lp8M5o5Fw2OFq1hNZxxcNk8Ik0Xm7LxzBhuidnZB/UtBqVCgUz3kBOP51Q==", + "dev": true, + "license": "BSD-2-Clause", + "engines": { + "node": ">=0.12" + }, + "funding": { + "url": "https://github.com/fb55/entities?sponsor=1" + } + }, + "node_modules/@webdoc/plugin-markdown/node_modules/linkify-it": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/linkify-it/-/linkify-it-4.0.1.tgz", + "integrity": "sha512-C7bfi1UZmoj8+PQx22XyeXCuBlokoyWQL5pWSP+EI6nzRylyThouddufc2c1NDIcP9k5agmN9fLpA7VNJfIiqw==", + "dev": true, + "license": "MIT", + "dependencies": { + "uc.micro": "^1.0.1" + } + }, + "node_modules/@webdoc/plugin-markdown/node_modules/markdown-it": { + "version": "13.0.1", + "resolved": "https://registry.npmjs.org/markdown-it/-/markdown-it-13.0.1.tgz", + "integrity": "sha512-lTlxriVoy2criHP0JKRhO2VDG9c2ypWCsT237eDiLqi09rmbKoUetyGHq2uOIRoRS//kfoJckS0eUzzkDR+k2Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "argparse": "^2.0.1", + "entities": "~3.0.1", + "linkify-it": "^4.0.1", + "mdurl": "^1.0.1", + "uc.micro": "^1.0.5" + }, + "bin": { + "markdown-it": "bin/markdown-it.js" + } + }, + "node_modules/@webdoc/template-library": { + "version": "1.6.6", + "resolved": "https://registry.npmjs.org/@webdoc/template-library/-/template-library-1.6.6.tgz", + "integrity": "sha512-AsCf3WOTAPBDwTVwqnYy6TFitMirsAEsrnQOxsTBCc09C6Mb0eDxcEc8PVeuvQMxK/zW2xyze7uLVa60/rRQ4Q==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "@webdoc/externalize": "^1.6.6", + "@webdoc/model": "^1.6.6", + "@webdoc/types": "^1.6.6", + "catharsis": "0.8.11", + "fs-extra": "^9.0.1", + "git-branch": "2.0.1", + "lodash": "^4.17.20", + "missionlog": "1.6.0", + "nanoid": "~3.1.16", + "node-fetch": "~2.6.1", + "parse-github-url": "1.0.2" + } + }, + "node_modules/@webdoc/template-library/node_modules/@webdoc/externalize": { + "version": "1.6.6", + "resolved": "https://registry.npmjs.org/@webdoc/externalize/-/externalize-1.6.6.tgz", + "integrity": "sha512-TY4zrfX07PE0thf1U23AhH2F3GulpYKNjeGey6KDiyUgkyCFwsy6HKkCL0WzjRTT9D7oEuxX1vOh/Yq85OBqXA==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "@babel/core": "^7.9.0", + "@webdoc/model": "^1.6.6", + "@webdoc/types": "^1.6.6", + "lodash": "^4.17.20" + } + }, + "node_modules/@webdoc/template-library/node_modules/@webdoc/types": { + "version": "1.6.6", + "resolved": "https://registry.npmjs.org/@webdoc/types/-/types-1.6.6.tgz", + "integrity": "sha512-GrXtaUIkrXS80zIDIXpU8XrDmlci5S0+TE2fR3L9cM4v/I6ySn52/i6PWwR2pZbr0dih7ao/qirkv8ygfW0B/Q==", + "dev": true, + "license": "MIT", + "peer": true + }, + "node_modules/@webdoc/template-library/node_modules/missionlog": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/missionlog/-/missionlog-1.6.0.tgz", + "integrity": "sha512-E7I0ePiUvh9Su4JnWcJaegek0fEU0OsQhatoqoYKRkJOkOWy5v2JjU6HKawxqcootHr/EtNSkyaUJM0ictCDZQ==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "@babel/runtime": "^7.8.4", + "core-js": "^3.6.4" + }, + "engines": { + "node": ">=8.0.0" + } + }, + "node_modules/@webdoc/types": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/@webdoc/types/-/types-2.2.0.tgz", + "integrity": "sha512-3RIjQndh4o42+vxC8yEqWzlopjx3aE0XYYuekAJfGrHS+RmPizy4Lh5liCZAGh59fFfkhTug7dth8SB0iwyeqw==", + "dev": true, + "license": "The Prosperity Public License 3.0.0", + "dependencies": { + "@babel/plugin-proposal-class-properties": "7.17.12", + "@babel/plugin-transform-flow-comments": "7.17.12" + } + }, + "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/acorn": { + "version": "8.14.0", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.14.0.tgz", + "integrity": "sha512-cl669nCJTZBsL97OF4kUQm5g5hC2uihk0NxY3WENAC0TYdILVkAyHymAntgxGkl7K+t0cXIrH5siy5S4XkFycA==", + "dev": true, + "license": "MIT", + "bin": { + "acorn": "bin/acorn" + }, + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/acorn-jsx": { + "version": "5.3.2", + "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.2.tgz", + "integrity": "sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==", + "dev": true, + "license": "MIT", + "peerDependencies": { + "acorn": "^6.0.0 || ^7.0.0 || ^8.0.0" + } + }, + "node_modules/agent-base": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-6.0.2.tgz", + "integrity": "sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "debug": "4" + }, + "engines": { + "node": ">= 6.0.0" + } + }, + "node_modules/ajv": { + "version": "6.12.6", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", + "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", + "dev": true, + "license": "MIT", + "dependencies": { + "fast-deep-equal": "^3.1.1", + "fast-json-stable-stringify": "^2.0.0", + "json-schema-traverse": "^0.4.1", + "uri-js": "^4.2.2" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/epoberezkin" + } + }, + "node_modules/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", + "dependencies": { + "ajv": "^8.0.0" + }, + "peerDependencies": { + "ajv": "^8.0.0" + }, + "peerDependenciesMeta": { + "ajv": { + "optional": true + } + } + }, + "node_modules/ajv-formats/node_modules/ajv": { + "version": "8.17.1", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.17.1.tgz", + "integrity": "sha512-B/gBuNg5SiMTrPkC+A2+cW0RszwxYmn6VYxB/inlBStS5nx6xHIt/ehKRhIMhqusl7a8LjQoZnjCs5vhwxOQ1g==", + "dev": true, + "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-formats/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==", + "dev": true, + "license": "MIT" + }, + "node_modules/ajv-keywords": { + "version": "3.5.2", + "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-3.5.2.tgz", + "integrity": "sha512-5p6WTN0DdTGVQk6VjcEju19IgaHudalcfabD7yhDGeA6bcQnmL+CpveLJq/3hvfwd1aof6L386Ougkx6RfyMIQ==", + "dev": true, + "license": "MIT", + "peerDependencies": { + "ajv": "^6.9.1" + } + }, + "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==", + "dev": true, + "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==", + "dev": true, + "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==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/ansi-styles": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-5.2.0.tgz", + "integrity": "sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/anymatch": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.3.tgz", + "integrity": "sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==", + "dev": true, + "license": "ISC", + "dependencies": { + "normalize-path": "^3.0.0", + "picomatch": "^2.0.4" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/anymatch/node_modules/picomatch": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", + "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8.6" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, + "node_modules/are-docs-informative": { + "version": "0.0.2", + "resolved": "https://registry.npmjs.org/are-docs-informative/-/are-docs-informative-0.0.2.tgz", + "integrity": "sha512-ixiS0nLNNG5jNQzgZJNoUpBKdo9yTYZMGJ+QgT2jmjR7G7+QHRCc4v6LQ3NgE7EBJq+o0ams3waJwkrlBom8Ig==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=14" + } + }, + "node_modules/argparse": { + "version": "1.0.10", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", + "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", + "dev": true, + "license": "MIT", + "dependencies": { + "sprintf-js": "~1.0.2" + } + }, + "node_modules/aria-query": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/aria-query/-/aria-query-5.3.0.tgz", + "integrity": "sha512-b0P0sZPKtyu8HkeRAfCq0IfURZK+SuwMjY1UXGBU27wpAiTwQAIlq56IbIO+ytk/JjS1fMR14ee5WBBfKi5J6A==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "dequal": "^2.0.3" + } + }, + "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", + "peer": true, + "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", + "peer": true, + "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", + "peer": true, + "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-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-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==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/array-uniq": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/array-uniq/-/array-uniq-1.0.3.tgz", + "integrity": "sha512-MNha4BWQ6JbwhFhj03YK552f7cb3AzoE8SzeljgChvL1dl3IcvggXVz1DilzySZkCja+CXuZbdW7yATchWn8/Q==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "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", + "peer": true, + "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.2.5", + "resolved": "https://registry.npmjs.org/array.prototype.flatmap/-/array.prototype.flatmap-1.2.5.tgz", + "integrity": "sha512-08u6rVyi1Lj7oqWbS9nUxliETrtIROT4XGTA4D/LWGten6E3ocm7cy9SIrmNHOL5XVbVuckUp3X6Xyg8/zpvHA==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.0", + "define-properties": "^1.1.3", + "es-abstract": "^1.19.0" + }, + "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/assertion-error": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/assertion-error/-/assertion-error-2.0.1.tgz", + "integrity": "sha512-Izi8RQcffqCeNVgFigKli1ssklIbpHnCYc6AknXGYoB6grJqyeby7jv12JUQgmTAnIDnbck1uxksT4dzN3PWBA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12" + } + }, + "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", + "peer": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/ast-types": { + "version": "0.16.1", + "resolved": "https://registry.npmjs.org/ast-types/-/ast-types-0.16.1.tgz", + "integrity": "sha512-6t10qk83GOG8p0vKmaCr8eiilZwO171AvbROMtvvNiwrTly62t+7XkA8RdIIVbpMhCASAsxgAzdRSwh6nw/5Dg==", + "dev": true, + "license": "MIT", + "dependencies": { + "tslib": "^2.0.1" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/astring": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/astring/-/astring-1.9.0.tgz", + "integrity": "sha512-LElXdjswlqjWrPpJFg1Fx4wpkOCxj1TDHlSV4PlaRxHGWko024xICaa97ZkMfs6DRKlCguiAI+rbXv5GWwXIkg==", + "dev": true, + "license": "MIT", + "bin": { + "astring": "bin/astring" + } + }, + "node_modules/async": { + "version": "2.6.4", + "resolved": "https://registry.npmjs.org/async/-/async-2.6.4.tgz", + "integrity": "sha512-mzo5dfJYwAn29PeiJ0zvwTo04zj8HDJj0Mn8TD7sno7q12prdbnasKJHhkm2c1LgrhlJ0teaea8860oxi51mGA==", + "dev": true, + "license": "MIT", + "dependencies": { + "lodash": "^4.17.14" + } + }, + "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)", + "peer": true, + "bin": { + "atob": "bin/atob.js" + }, + "engines": { + "node": ">= 4.5.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/babel-jest": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/babel-jest/-/babel-jest-29.7.0.tgz", + "integrity": "sha512-BrvGY3xZSwEcCzKvKsCi2GgHqDqsYkOP4/by5xCgIwGXQxIEh+8ew3gmrE1y7XRR6LHZIj6yLYnUi/mm2KXKBg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/transform": "^29.7.0", + "@types/babel__core": "^7.1.14", + "babel-plugin-istanbul": "^6.1.1", + "babel-preset-jest": "^29.6.3", + "chalk": "^4.0.0", + "graceful-fs": "^4.2.9", + "slash": "^3.0.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + }, + "peerDependencies": { + "@babel/core": "^7.8.0" + } + }, + "node_modules/babel-jest/node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "license": "MIT", + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/babel-jest/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/babel-loader": { + "version": "9.2.1", + "resolved": "https://registry.npmjs.org/babel-loader/-/babel-loader-9.2.1.tgz", + "integrity": "sha512-fqe8naHt46e0yIdkjUZYqddSXfej3AHajX+CSO5X7oy0EmPc6o5Xh+RClNoHjnieWz9AW4kZxW9yyFMhVB1QLA==", + "dev": true, + "license": "MIT", + "dependencies": { + "find-cache-dir": "^4.0.0", + "schema-utils": "^4.0.0" + }, + "engines": { + "node": ">= 14.15.0" + }, + "peerDependencies": { + "@babel/core": "^7.12.0", + "webpack": ">=5" + } + }, + "node_modules/babel-plugin-istanbul": { + "version": "6.1.1", + "resolved": "https://registry.npmjs.org/babel-plugin-istanbul/-/babel-plugin-istanbul-6.1.1.tgz", + "integrity": "sha512-Y1IQok9821cC9onCx5otgFfRm7Lm+I+wwxOx738M/WLPZ9Q42m4IG5W0FNX8WLL2gYMZo3JkuXIH2DOpWM+qwA==", + "dev": true, + "license": "BSD-3-Clause", + "dependencies": { + "@babel/helper-plugin-utils": "^7.0.0", + "@istanbuljs/load-nyc-config": "^1.0.0", + "@istanbuljs/schema": "^0.1.2", + "istanbul-lib-instrument": "^5.0.4", + "test-exclude": "^6.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/babel-plugin-jest-hoist": { + "version": "29.6.3", + "resolved": "https://registry.npmjs.org/babel-plugin-jest-hoist/-/babel-plugin-jest-hoist-29.6.3.tgz", + "integrity": "sha512-ESAc/RJvGTFEzRwOTT4+lNDk/GNHMkKbNzsvT0qKRfDyyYTskxB5rnU2njIDYVxXCBHHEI1c0YwHob3WaYujOg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/template": "^7.3.3", + "@babel/types": "^7.3.3", + "@types/babel__core": "^7.1.14", + "@types/babel__traverse": "^7.0.6" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.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-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/babel-preset-current-node-syntax": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/babel-preset-current-node-syntax/-/babel-preset-current-node-syntax-1.1.0.tgz", + "integrity": "sha512-ldYss8SbBlWva1bs28q78Ju5Zq1F+8BrqBZZ0VFhLBvhh6lCpC2o3gDJi/5DRLs9FgYZCnmPYIVFU4lRXCkyUw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/plugin-syntax-async-generators": "^7.8.4", + "@babel/plugin-syntax-bigint": "^7.8.3", + "@babel/plugin-syntax-class-properties": "^7.12.13", + "@babel/plugin-syntax-class-static-block": "^7.14.5", + "@babel/plugin-syntax-import-attributes": "^7.24.7", + "@babel/plugin-syntax-import-meta": "^7.10.4", + "@babel/plugin-syntax-json-strings": "^7.8.3", + "@babel/plugin-syntax-logical-assignment-operators": "^7.10.4", + "@babel/plugin-syntax-nullish-coalescing-operator": "^7.8.3", + "@babel/plugin-syntax-numeric-separator": "^7.10.4", + "@babel/plugin-syntax-object-rest-spread": "^7.8.3", + "@babel/plugin-syntax-optional-catch-binding": "^7.8.3", + "@babel/plugin-syntax-optional-chaining": "^7.8.3", + "@babel/plugin-syntax-private-property-in-object": "^7.14.5", + "@babel/plugin-syntax-top-level-await": "^7.14.5" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/babel-preset-jest": { + "version": "29.6.3", + "resolved": "https://registry.npmjs.org/babel-preset-jest/-/babel-preset-jest-29.6.3.tgz", + "integrity": "sha512-0B3bhxR6snWXJZtR/RliHTDPRgn1sNHOR0yVtq/IiQFyuOVjFS+wuio/R4gSNkyYmKmJB4wGZv2NZanmKmTnNA==", + "dev": true, + "license": "MIT", + "dependencies": { + "babel-plugin-jest-hoist": "^29.6.3", + "babel-preset-current-node-syntax": "^1.0.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/bail": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/bail/-/bail-2.0.2.tgz", + "integrity": "sha512-0xO6mYd7JB2YesxDKplafRpsiOzPt9V02ddPCLbY1xYGPOX24NTyN50qnUxgCPcSoYMhKpAuBTjQoRZCAkUDRw==", + "dev": true, + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/balanced-match": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", + "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", + "dev": true, + "license": "MIT" + }, + "node_modules/base": { + "version": "0.11.2", + "resolved": "https://registry.npmjs.org/base/-/base-0.11.2.tgz", + "integrity": "sha512-5T6P4xPgpp0YDFvSWwEZ4NoE3aM4QBQXDzmVbraCkFj8zHM+mba8SyqB5DbZWyR7mYHo6Y7BdQo3MoA4m0TeQg==", + "dev": true, + "license": "MIT", + "peer": true, + "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", + "peer": true, + "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==", + "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/basic-auth": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/basic-auth/-/basic-auth-2.0.1.tgz", + "integrity": "sha512-NF+epuEdnUYVlGuhaxbbq+dvJttwLnGY+YixlXlME5KpQ5W3CnXA5cVTneY3SPbPDRkcjMbifrwmFYcClgOZeg==", + "dev": true, + "license": "MIT", + "dependencies": { + "safe-buffer": "5.1.2" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/better-opn": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/better-opn/-/better-opn-3.0.2.tgz", + "integrity": "sha512-aVNobHnJqLiUelTaHat9DZ1qM2w0C0Eym4LPI/3JxOnSokGVdsl1T1kN7TFvsEAD8G47A6VKQ0TVHqbBnYMJlQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "open": "^8.0.4" + }, + "engines": { + "node": ">=12.0.0" + } + }, + "node_modules/binary-extensions": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.3.0.tgz", + "integrity": "sha512-Ceh+7ox5qe7LJuLHoY0feh3pHuUDHAcRUeyL2VYghZwfpkNIy/+8Ocg0a3UuSoYzavmylwuLWQOf3hl0jjMMIw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/bl": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/bl/-/bl-4.1.0.tgz", + "integrity": "sha512-1W07cM9gS6DcLperZfFSj+bWLtaPGSOHWhPiGzXmvVJbRLdG82sH/Kn8EtW1VqWVA54AKf2h5k5BbnIbwF3h6w==", + "dev": true, + "license": "MIT", + "dependencies": { + "buffer": "^5.5.0", + "inherits": "^2.0.4", + "readable-stream": "^3.4.0" + } + }, + "node_modules/bl/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, + "license": "MIT", + "dependencies": { + "inherits": "^2.0.3", + "string_decoder": "^1.1.1", + "util-deprecate": "^1.0.1" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/bl/node_modules/safe-buffer": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", + "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "license": "MIT" + }, + "node_modules/bl/node_modules/string_decoder": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz", + "integrity": "sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==", + "dev": true, + "license": "MIT", + "dependencies": { + "safe-buffer": "~5.2.0" + } + }, + "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/boolbase": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/boolbase/-/boolbase-1.0.0.tgz", + "integrity": "sha512-JZOSA7Mo9sNGB8+UjSgzdLtokWAky1zbztM3WRLCbZ70/3cTANmQmOdR7y2g+J0e2WXywy1yS468tY+IruqEww==", + "dev": true, + "license": "ISC" + }, + "node_modules/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.", + "dev": true, + "license": "MIT", + "optional": true + }, + "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/braces": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.3.tgz", + "integrity": "sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==", + "dev": true, + "license": "MIT", + "dependencies": { + "fill-range": "^7.1.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/browser-assert": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/browser-assert/-/browser-assert-1.2.1.tgz", + "integrity": "sha512-nfulgvOR6S4gt9UKCeGJOuSGBPGiFT6oQ/2UBnvTY/5aQ1PnksW72fhZkM30DzoRRv2WpwZf1vHHEr3mtuXIWQ==", + "dev": true + }, + "node_modules/browserify-zlib": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/browserify-zlib/-/browserify-zlib-0.1.4.tgz", + "integrity": "sha512-19OEpq7vWgsH6WkvkBJQDFvJS1uPcbFOQ4v9CU839dO+ZZXUZO6XpE6hNCqvlIIj+4fZvRiJ6DsAQ382GwiyTQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "pako": "~0.2.0" + } + }, + "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/bs-logger": { + "version": "0.2.6", + "resolved": "https://registry.npmjs.org/bs-logger/-/bs-logger-0.2.6.tgz", + "integrity": "sha512-pd8DCoxmbgc7hyPKOvxtqNcjYoOsABPQdcCUjGp3d42VR2CX1ORhk2A87oqqu5R1kk+76nsxZupkmyd+MVtCog==", + "dev": true, + "license": "MIT", + "dependencies": { + "fast-json-stable-stringify": "2.x" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/bser": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/bser/-/bser-2.1.1.tgz", + "integrity": "sha512-gQxTNE/GAfIIrmHLUE3oJyp5FO6HRBfhjnw4/wMmA63ZGDJnWBmgY/lyQBpnDUkGmAhbSe39tx2d/iTOAfglwQ==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "node-int64": "^0.4.0" + } + }, + "node_modules/buffer": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/buffer/-/buffer-5.7.1.tgz", + "integrity": "sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "license": "MIT", + "dependencies": { + "base64-js": "^1.3.1", + "ieee754": "^1.1.13" + } + }, + "node_modules/buffer-crc32": { + "version": "0.2.13", + "resolved": "https://registry.npmjs.org/buffer-crc32/-/buffer-crc32-0.2.13.tgz", + "integrity": "sha512-VO9Ht/+p3SN7SKWqcrgEzjGbRSJYTx+Q1pTQC0wrWqHx0vpJraQ6GtHx8tvcg1rlK1byhU5gccxgOgj7B0TDkQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": "*" + } + }, + "node_modules/buffer-from": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.2.tgz", + "integrity": "sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==", + "dev": true, + "license": "MIT" + }, + "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", + "peer": true, + "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/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/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/call-bind": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.7.tgz", + "integrity": "sha512-GHTSNSYICQ7scH7sZ+M2rFopRoLh8t2bLSW6BbgrtLsahOIB5iyAVJf9GjWK3cYTDaMj4XdBpM1cA6pIS0Kv2w==", + "dev": true, + "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/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": "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/camelcase": { + "version": "5.3.1", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz", + "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/caniuse-lite": { + "version": "1.0.30001684", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001684.tgz", + "integrity": "sha512-G1LRwLIQjBQoyq0ZJGqGIJUXzJ8irpbjHLpVRXDvBEScFJ9b17sgK6vlx0GAJFE21okD7zXl08rRRUfq6HdoEQ==", + "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/case-sensitive-paths-webpack-plugin": { + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/case-sensitive-paths-webpack-plugin/-/case-sensitive-paths-webpack-plugin-2.4.0.tgz", + "integrity": "sha512-roIFONhcxog0JSSWbvVAh3OocukmSgpqOH6YpMkCvav/ySIV3JKg4Dc8vYtQjYi/UxpNE36r/9v+VqTQqgkYmw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "node_modules/catharsis": { + "version": "0.8.11", + "resolved": "https://registry.npmjs.org/catharsis/-/catharsis-0.8.11.tgz", + "integrity": "sha512-a+xUyMV7hD1BrDQA/3iPV7oc+6W26BgVJO05PGEoatMyIuPScQKsde6i3YorWX1qs+AZjnJ18NqdKoCtKiNh1g==", + "dev": true, + "license": "MIT", + "dependencies": { + "lodash": "^4.17.14" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/ccount": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/ccount/-/ccount-2.0.1.tgz", + "integrity": "sha512-eyrF0jiFpY+3drT6383f1qhkbGsLSifNAjA61IUjZjmLCWjItY6LB9ft9YhoDgwfmclB2zhu51Lc7+95b8NRAg==", + "dev": true, + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/chai": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/chai/-/chai-5.1.2.tgz", + "integrity": "sha512-aGtmf24DW6MLHHG5gCx4zaI3uBq3KRtxeVs0DjFH6Z0rDNbsvTxFASFvdj79pxjxZ8/5u3PIiN3IwEIQkiiuPw==", + "dev": true, + "license": "MIT", + "dependencies": { + "assertion-error": "^2.0.1", + "check-error": "^2.1.1", + "deep-eql": "^5.0.1", + "loupe": "^3.1.0", + "pathval": "^2.0.0" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/chalk": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-5.3.0.tgz", + "integrity": "sha512-dLitG79d+GV1Nb/VYcCDFivJeK1hiukt9QjRNVOsUtTy1rR1YJsmpGGTZ3qJos+uw7WmWF4wUwBd9jxjocFC2w==", + "dev": true, + "license": "MIT", + "engines": { + "node": "^12.17.0 || ^14.13 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/char-regex": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/char-regex/-/char-regex-1.0.2.tgz", + "integrity": "sha512-kWWXztvZ5SBQV+eRgKFeh8q5sLuZY2+8WUIzlxWVTg+oGwY14qylx1KbKzHd8P6ZYkAg0xyIDU9JMHhyJMZ1jw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10" + } + }, + "node_modules/character-entities": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/character-entities/-/character-entities-2.0.2.tgz", + "integrity": "sha512-shx7oQ0Awen/BRIdkjkvz54PnEEI/EjwXDSIZp86/KKdbafHh1Df/RYGBhn4hbe2+uKC9FnT5UCEdyPz3ai9hQ==", + "dev": true, + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/character-entities-html4": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/character-entities-html4/-/character-entities-html4-2.1.0.tgz", + "integrity": "sha512-1v7fgQRj6hnSwFpq1Eu0ynr/CDEw0rXo2B61qXrLNdHZmPKgb7fqS1a2JwF0rISo9q77jDI8VMEHoApn8qDoZA==", + "dev": true, + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/character-entities-legacy": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/character-entities-legacy/-/character-entities-legacy-3.0.0.tgz", + "integrity": "sha512-RpPp0asT/6ufRm//AJVwpViZbGM/MkjQFxJccQRHmISF/22NBtsHqAWmL+/pmkPWoIUJdWyeVleTl1wydHATVQ==", + "dev": true, + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/character-reference-invalid": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/character-reference-invalid/-/character-reference-invalid-2.0.1.tgz", + "integrity": "sha512-iBZ4F4wRbyORVsu0jPV7gXkOsGYjGHPmAyv+HiHG8gi5PtC9KI2j1+v8/tlibRvjoWX027ypmG/n0HtO5t7unw==", + "dev": true, + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/chardet": { + "version": "0.7.0", + "resolved": "https://registry.npmjs.org/chardet/-/chardet-0.7.0.tgz", + "integrity": "sha512-mT8iDcrh03qDGRRmoA2hmBJnxpllMR+0/0qlzjqZES6NdiWDcZkCNAk4rPFZ9Q85r27unkiNNg8ZOiwZXBHwcA==", + "dev": true, + "license": "MIT" + }, + "node_modules/check-error": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/check-error/-/check-error-2.1.1.tgz", + "integrity": "sha512-OAlb+T7V4Op9OwdkjmguYRqncdlx5JiofwOAUkmTF+jNdHwzTaTs4sRAGpzLF3oOz5xAyDGrPgeIDFQmDOTiJw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 16" + } + }, + "node_modules/chokidar": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.6.0.tgz", + "integrity": "sha512-7VT13fmjotKpGipCW9JEQAusEPE+Ei8nl6/g4FBAmIm0GOOLMua9NDDo/DWp0ZAxCr3cPq5ZpBqmPAQgDda2Pw==", + "dev": true, + "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/chokidar/node_modules/glob-parent": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", + "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", + "dev": true, + "license": "ISC", + "dependencies": { + "is-glob": "^4.0.1" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/chromatic": { + "version": "11.19.0", + "resolved": "https://registry.npmjs.org/chromatic/-/chromatic-11.19.0.tgz", + "integrity": "sha512-3JZ1Tt26N2uDok6nXApsvHmTnkrgE0HClq1bmfF5WmCJ61bMN80CObhuFc7kiBCv5QbE7GOe3rpy3MiuZ4h9IA==", + "dev": true, + "license": "MIT", + "bin": { + "chroma": "dist/bin.js", + "chromatic": "dist/bin.js", + "chromatic-cli": "dist/bin.js" + }, + "peerDependencies": { + "@chromatic-com/cypress": "^0.*.* || ^1.0.0", + "@chromatic-com/playwright": "^0.*.* || ^1.0.0" + }, + "peerDependenciesMeta": { + "@chromatic-com/cypress": { + "optional": true + }, + "@chromatic-com/playwright": { + "optional": true + } + } + }, + "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==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/sibiraj-s" + } + ], + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/cjs-module-lexer": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/cjs-module-lexer/-/cjs-module-lexer-1.4.1.tgz", + "integrity": "sha512-cuSVIHi9/9E/+821Qjdvngor+xpnlwnuwIyZOaLmHBVdXL+gP+I6QQB9VkO7RI77YIcTV+S1W9AreJ5eN63JBA==", + "dev": true, + "license": "MIT" + }, + "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", + "peer": true, + "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", + "peer": true, + "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", + "peer": true, + "dependencies": { + "is-accessor-descriptor": "^1.0.1", + "is-data-descriptor": "^1.0.1" + }, + "engines": { + "node": ">= 0.4" + } + }, + "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/clean-css/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==", + "dev": true, + "license": "BSD-3-Clause", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/clean-package": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/clean-package/-/clean-package-2.2.0.tgz", + "integrity": "sha512-vLv8kRqvh4smPDpqAYFPLEijTppAd/cfCz4yBcUGoVl/JKu6ZWKhlo+G/cAmwlSa29RudfBeuyiNEzas8bTwEQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "dot-prop": "^6.0.1" + }, + "bin": { + "clean-package": "bin/main.js" + } + }, + "node_modules/cli-cursor": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-5.0.0.tgz", + "integrity": "sha512-aCj4O5wKyszjMmDT4tZj93kxyydN/K5zPWSCe6/0AV/AA1pqe5ZBIw0a2ZfPQV7lL5/yb5HsUreJ6UFAF1tEQw==", + "dev": true, + "license": "MIT", + "dependencies": { + "restore-cursor": "^5.0.0" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/cli-spinners": { + "version": "2.9.2", + "resolved": "https://registry.npmjs.org/cli-spinners/-/cli-spinners-2.9.2.tgz", + "integrity": "sha512-ywqV+5MmyL4E7ybXgKys4DugZbX0FC6LnwrhjuykIjnK9k8OQacQ7axGKnjDXWNhns0xot3bZI5h55H8yo9cJg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/cli-truncate": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/cli-truncate/-/cli-truncate-4.0.0.tgz", + "integrity": "sha512-nPdaFdQ0h/GEigbPClz11D0v/ZJEwxmeVZGeMo3Z5StPtUTkA9o1lD6QwoirYiSDzbcwn2XcjwmCp68W1IS4TA==", + "dev": true, + "license": "MIT", + "dependencies": { + "slice-ansi": "^5.0.0", + "string-width": "^7.0.0" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/cli-truncate/node_modules/emoji-regex": { + "version": "10.4.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-10.4.0.tgz", + "integrity": "sha512-EC+0oUMY1Rqm4O6LLrgjtYDvcVYTy7chDnM4Q7030tP4Kwj3u/pR6gP9ygnp2CJMK5Gq+9Q2oqmrFJAz01DXjw==", + "dev": true, + "license": "MIT" + }, + "node_modules/cli-truncate/node_modules/string-width": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-7.2.0.tgz", + "integrity": "sha512-tsaTIkKW9b4N+AEj+SVA+WhJzV7/zMhcSu78mLKWSk7cXMOSHsBKFWUs0fWwq8QyK3MgJBQRX6Gbi4kYbdvGkQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "emoji-regex": "^10.3.0", + "get-east-asian-width": "^1.0.0", + "strip-ansi": "^7.1.0" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/cli-width": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/cli-width/-/cli-width-4.1.0.tgz", + "integrity": "sha512-ouuZd4/dm2Sw5Gmqy6bGyNNNe1qt9RpmxveLSO7KcgsTnU7RXfsw+/bukWGo1abgBiMAic068rclZsO4IWmmxQ==", + "dev": true, + "license": "ISC", + "engines": { + "node": ">= 12" + } + }, + "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/cliui/node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "license": "MIT", + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/cliui/node_modules/strip-ansi": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/cliui/node_modules/wrap-ansi": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", + "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-styles": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/wrap-ansi?sponsor=1" + } + }, + "node_modules/clone": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/clone/-/clone-1.0.4.tgz", + "integrity": "sha512-JQHZ2QMW6l3aH/j6xCqQThY/9OH4D/9ls34cgkUBiEeocRTU04tHfKPBsUK1PqZCUQM7GiA0IIXJSuXHI64Kbg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.8" + } + }, + "node_modules/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/co": { + "version": "4.6.0", + "resolved": "https://registry.npmjs.org/co/-/co-4.6.0.tgz", + "integrity": "sha512-QVb0dM5HvG+uaxitm8wONl7jltx8dqhfU33DcqtOZcLSVIKSDDLDi7+0LbAKiyI8hD9u42m2YxXSkMGWThaecQ==", + "dev": true, + "license": "MIT", + "engines": { + "iojs": ">= 1.0.0", + "node": ">= 0.12.0" + } + }, + "node_modules/code-prettify": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/code-prettify/-/code-prettify-0.1.0.tgz", + "integrity": "sha512-tNOWwXoF3ycqtvLCGPLYds2hKekmZfsPWinbRcLk6BBHBaSf+v+HJOvfg33VfVzYzvQ6zmVq+WO88oKweiJSQg==", + "dev": true, + "license": "Apache-2.0" + }, + "node_modules/collapse-white-space": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/collapse-white-space/-/collapse-white-space-2.1.0.tgz", + "integrity": "sha512-loKTxY1zCOuG4j9f6EPnuyyYkf58RnhhWTvRoZEokgB+WbdXehfjFviyOVYkqzEWz1Q5kRiZdBYS5SwxbQYwzw==", + "dev": true, + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/collect-v8-coverage": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/collect-v8-coverage/-/collect-v8-coverage-1.0.2.tgz", + "integrity": "sha512-lHl4d5/ONEbLlJvaJNtsF/Lz+WvB07u2ycqTYbdrq7UypDXailES4valYb2eWiJFxZlVmpGekfqoxQhzyFdT4Q==", + "dev": true, + "license": "MIT" + }, + "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", + "peer": true, + "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==", + "dev": true, + "license": "MIT", + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true, + "license": "MIT" + }, + "node_modules/color-themes-for-google-code-prettify": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/color-themes-for-google-code-prettify/-/color-themes-for-google-code-prettify-2.0.4.tgz", + "integrity": "sha512-4iwgVWCPDR1hVy/Og+ubHXu2FRZGqyUkdTWEb0oR/ZoBgbebQBl1xaebJh2wNo9vy+mKYANDDP5B1gQOC2mGvQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=5.9.0" + } + }, + "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/comma-separated-tokens": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/comma-separated-tokens/-/comma-separated-tokens-2.0.3.tgz", + "integrity": "sha512-Fu4hJdvzeylCfQPp9SGWidpzrMs7tTrlu6Vb8XGaRGck8QSNZJJp538Wrb60Lax4fPwR64ViY468OIUTbRlGZg==", + "dev": true, + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "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/comment-parser": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/comment-parser/-/comment-parser-1.4.1.tgz", + "integrity": "sha512-buhp5kePrmda3vhc5B9t7pUQXAb2Tnd0qgpkIhPhkHXxJpiPJ11H0ZEU0oBpJ2QztSbzG/ZxMj/CHsYJqRHmyg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 12.0.0" + } + }, + "node_modules/common-path-prefix": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/common-path-prefix/-/common-path-prefix-3.0.0.tgz", + "integrity": "sha512-QE33hToZseCH3jS0qN96O/bSh3kaw/h+Tq7ngyY9eWDUnTlTNUyqfqvCXioLe5Na5jFsL78ra/wuBU4iuEgd4w==", + "dev": true, + "license": "ISC" + }, + "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/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", + "peer": true, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/concat-map": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", + "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==", + "dev": true, + "license": "MIT" + }, + "node_modules/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/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.4.2", + "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.4.2.tgz", + "integrity": "sha512-aSWTXFzaKWkvHO1Ny/s+ePFpvKsPnjc551iI41v3ny/ow6tBG5Vd+FuqGNhh1LxOmVzOlGUriIlOaokOvhaStA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "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", + "peer": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/copyfiles": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/copyfiles/-/copyfiles-2.4.1.tgz", + "integrity": "sha512-fereAvAvxDrQDOXybk3Qu3dPbOoKoysFMWtkY3mv5BsL8//OSZVL5DCLYqgRfY5cWirgRzlC+WSrxp6Bo3eNZg==", + "dev": true, + "license": "MIT", + "dependencies": { + "glob": "^7.0.5", + "minimatch": "^3.0.3", + "mkdirp": "^1.0.4", + "noms": "0.0.0", + "through2": "^2.0.1", + "untildify": "^4.0.0", + "yargs": "^16.1.0" + }, + "bin": { + "copyfiles": "copyfiles", + "copyup": "copyfiles" + } + }, + "node_modules/copyfiles/node_modules/brace-expansion": { + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", + "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "dev": true, + "license": "MIT", + "dependencies": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "node_modules/copyfiles/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", + "dev": true, + "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/copyfiles/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/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==", + "dev": true, + "license": "MIT" + }, + "node_modules/corser": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/corser/-/corser-2.0.1.tgz", + "integrity": "sha512-utCYNzRSQIZNPIcGZdQc92UVJYAhtGAteCFg0yRaFm8f0P+CPtyGyHXJcGXnffjCybUCEx3FQ2G7U3/o9eIkVQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4.0" + } + }, + "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" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/create-jest": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/create-jest/-/create-jest-29.7.0.tgz", + "integrity": "sha512-Adz2bdH0Vq3F53KEMJOoftQFutWCukm6J24wbPWRO4k1kMY7gS7ds/uoJkNuV8wDCtWWnuwGcJwpWcih+zEW1Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/types": "^29.6.3", + "chalk": "^4.0.0", + "exit": "^0.1.2", + "graceful-fs": "^4.2.9", + "jest-config": "^29.7.0", + "jest-util": "^29.7.0", + "prompts": "^2.0.1" + }, + "bin": { + "create-jest": "bin/create-jest.js" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/create-jest/node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "license": "MIT", + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/create-jest/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/cross-spawn": { + "version": "7.0.6", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.6.tgz", + "integrity": "sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==", + "dev": true, + "license": "MIT", + "dependencies": { + "path-key": "^3.1.0", + "shebang-command": "^2.0.0", + "which": "^2.0.1" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/css-loader": { + "version": "6.11.0", + "resolved": "https://registry.npmjs.org/css-loader/-/css-loader-6.11.0.tgz", + "integrity": "sha512-CTJ+AEQJjq5NzLga5pE39qdiSV56F8ywCIsqNIRF0r7BDgWsN25aazToqAFg7ZrtA/U016xudB3ffgweORxX7g==", + "dev": true, + "license": "MIT", + "dependencies": { + "icss-utils": "^5.1.0", + "postcss": "^8.4.33", + "postcss-modules-extract-imports": "^3.1.0", + "postcss-modules-local-by-default": "^4.0.5", + "postcss-modules-scope": "^3.2.0", + "postcss-modules-values": "^4.0.0", + "postcss-value-parser": "^4.2.0", + "semver": "^7.5.4" + }, + "engines": { + "node": ">= 12.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + }, + "peerDependencies": { + "@rspack/core": "0.x || 1.x", + "webpack": "^5.0.0" + }, + "peerDependenciesMeta": { + "@rspack/core": { + "optional": true + }, + "webpack": { + "optional": true + } + } + }, + "node_modules/css-loader/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/css-select": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/css-select/-/css-select-4.3.0.tgz", + "integrity": "sha512-wPpOYtnsVontu2mODhA19JrqWxNsfdatRKd64kmpRbQgh1KtItko5sTnEpPdpSaJszTOhEMlF/RPz28qj4HqhQ==", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "boolbase": "^1.0.0", + "css-what": "^6.0.1", + "domhandler": "^4.3.1", + "domutils": "^2.8.0", + "nth-check": "^2.0.1" + }, + "funding": { + "url": "https://github.com/sponsors/fb55" + } + }, + "node_modules/css-what": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/css-what/-/css-what-6.1.0.tgz", + "integrity": "sha512-HTUrgRJ7r4dsZKU6GjmpfRK1O76h97Z8MfS1G0FozR+oF2kG6Vfe8JE6zwrkbxigziPHinCJ+gCPjA9EaBDtRw==", + "dev": true, + "license": "BSD-2-Clause", + "engines": { + "node": ">= 6" + }, + "funding": { + "url": "https://github.com/sponsors/fb55" + } + }, + "node_modules/css.escape": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/css.escape/-/css.escape-1.5.1.tgz", + "integrity": "sha512-YUifsXXuknHlUsmlgyY0PKzgPOr7/FjCePfHNt0jxm83wHZi44VDMQ7/fGNkjY3/jV1MC+1CmZbaHzugyeRtpg==", + "dev": true, + "license": "MIT" + }, + "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/csstype": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/csstype/-/csstype-3.1.3.tgz", + "integrity": "sha512-M1uQkMl8rQK/szD0LNhtqxIPLpimGm8sOBwU7lLnCpSbTyY3yeU1Vc7l4KT5zT4s/yOxHH5O7tIuuLOCnLADRw==", + "dev": true, + "license": "MIT", + "peer": true + }, + "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/debug": { + "version": "4.3.7", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.7.tgz", + "integrity": "sha512-Er2nc/H7RrMXZBFCEim6TCmMk02Z8vLC2Rbi1KEBggpo0fS6l0S1nnapwmIi3yW/+GOJap1Krg4w0Hg80oCqgQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "ms": "^2.1.3" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/decode-named-character-reference": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/decode-named-character-reference/-/decode-named-character-reference-1.0.2.tgz", + "integrity": "sha512-O8x12RzrUF8xyVcY0KJowWsmaJxQbmy0/EtnNtHRpsOcT7dFk5W598coHqBVpmWo1oQQfsCqfCmkZN5DJrZVdg==", + "dev": true, + "license": "MIT", + "dependencies": { + "character-entities": "^2.0.0" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "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", + "peer": true, + "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/dedent": { + "version": "1.5.3", + "resolved": "https://registry.npmjs.org/dedent/-/dedent-1.5.3.tgz", + "integrity": "sha512-NHQtfOOW68WD8lgypbLA5oT+Bt0xXJhiYvoR6SmmNXZfpzOGXwdKWmcwG8N7PwVVWV3eF/68nmD9BaJSsTBhyQ==", + "dev": true, + "license": "MIT", + "peerDependencies": { + "babel-plugin-macros": "^3.1.0" + }, + "peerDependenciesMeta": { + "babel-plugin-macros": { + "optional": true + } + } + }, + "node_modules/deep-eql": { + "version": "5.0.2", + "resolved": "https://registry.npmjs.org/deep-eql/-/deep-eql-5.0.2.tgz", + "integrity": "sha512-h5k/5U50IJJFpzfL6nO9jaaumfjO/f2NjK/oYB2Djzm4p9L+3T9qWpZqZ2hAbLPuuYq9wrU08WQyBTL5GbPk5Q==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/deep-equal": { + "version": "2.2.3", + "resolved": "https://registry.npmjs.org/deep-equal/-/deep-equal-2.2.3.tgz", + "integrity": "sha512-ZIwpnevOurS8bpT4192sqAowWM76JDKSHYzMLty3BZGSswgq6pBaH3DhCSW5xVAZICZyKdOBPjwww5wfgT/6PA==", + "dev": true, + "license": "MIT", + "dependencies": { + "array-buffer-byte-length": "^1.0.0", + "call-bind": "^1.0.5", + "es-get-iterator": "^1.1.3", + "get-intrinsic": "^1.2.2", + "is-arguments": "^1.1.1", + "is-array-buffer": "^3.0.2", + "is-date-object": "^1.0.5", + "is-regex": "^1.1.4", + "is-shared-array-buffer": "^1.0.2", + "isarray": "^2.0.5", + "object-is": "^1.1.5", + "object-keys": "^1.1.1", + "object.assign": "^4.1.4", + "regexp.prototype.flags": "^1.5.1", + "side-channel": "^1.0.4", + "which-boxed-primitive": "^1.0.2", + "which-collection": "^1.0.1", + "which-typed-array": "^1.1.13" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "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==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/defaults": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/defaults/-/defaults-1.0.4.tgz", + "integrity": "sha512-eFuaLoy/Rxalv2kr+lqMlUnrDWV+3j4pljOIJgLIhI058IQfWJ7vXhyEIHu+HtC738klGALYxOKDO0bQP3tg8A==", + "dev": true, + "license": "MIT", + "dependencies": { + "clone": "^1.0.2" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/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==", + "dev": true, + "license": "MIT", + "dependencies": { + "es-define-property": "^1.0.0", + "es-errors": "^1.3.0", + "gopd": "^1.0.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/define-lazy-prop": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/define-lazy-prop/-/define-lazy-prop-2.0.0.tgz", + "integrity": "sha512-Ds09qNh8yw3khSjiJjiUInaGX9xlqZDY7JVryGxdxV7NPeuqQfplOpQ66yJFZut3jLa5zOwkXw1g9EI2uKh4Og==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "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", + "peer": true, + "dependencies": { + "is-descriptor": "^1.0.2", + "isobject": "^3.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/dequal": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/dequal/-/dequal-2.0.3.tgz", + "integrity": "sha512-0je+qPKHEMohvfRTCEo3CrPG6cAzAYgmzKyxRiYSSDkS6eGJdyVJm7WaYA5ECaAD9wLB2T4EEeymA5aFVcYXCA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/detect-file": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/detect-file/-/detect-file-1.0.0.tgz", + "integrity": "sha512-DtCOLG98P007x7wiiOmfI0fi3eIKyWiLTGJ2MDnVi/E04lWGbf+JzrRHMm0rgIIZJGtHpKpbVgLWHrv8xXpc3Q==", + "dev": true, + "license": "MIT", + "peer": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/detect-newline": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/detect-newline/-/detect-newline-3.1.0.tgz", + "integrity": "sha512-TLz+x/vEXm/Y7P7wn1EJFNLxYpUD4TgMosxY6fAVJUnJMbupHBOncxyWUG9OpTaH9EBD7uFI5LfEgmMOc54DsA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "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==", + "dev": true, + "license": "MIT", + "optional": true + }, + "node_modules/devlop": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/devlop/-/devlop-1.1.0.tgz", + "integrity": "sha512-RWmIqhcFf1lRYBvNmr7qTNuyCt/7/ns2jbpp1+PalgE/rDQcBT0fioSMUpJ93irlUhC5hrg4cYqe6U+0ImW0rA==", + "dev": true, + "license": "MIT", + "dependencies": { + "dequal": "^2.0.0" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/diff-sequences": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/diff-sequences/-/diff-sequences-27.5.1.tgz", + "integrity": "sha512-k1gCAXAsNgLwEL+Y8Wvl+M6oEFj5bgazfZULpS5CneoPPXRaCCW7dm+q21Ky2VEE5X+VeRDBVg1Pcvvsr4TtNQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + } + }, + "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==", + "dev": true, + "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-accessibility-api": { + "version": "0.5.16", + "resolved": "https://registry.npmjs.org/dom-accessibility-api/-/dom-accessibility-api-0.5.16.tgz", + "integrity": "sha512-X7BJ2yElsnOJ30pZF4uIIDfBEVgF4XEBxL9Bxhy6dnrm5hkzqmsWHGTiHqRiITNhMyFLyAiWndIJP7Z1NTteDg==", + "dev": true, + "license": "MIT" + }, + "node_modules/dom-converter": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/dom-converter/-/dom-converter-0.2.0.tgz", + "integrity": "sha512-gd3ypIPfOMr9h5jIKq8E3sHOTCjeirnl0WK5ZdS1AW0Odt0b1PaWaHdJ4Qk4klv+YB9aJBS7mESXjFoDQPu6DA==", + "dev": true, + "license": "MIT", + "dependencies": { + "utila": "~0.4" + } + }, + "node_modules/dom-serializer": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-1.4.1.tgz", + "integrity": "sha512-VHwB3KfrcOOkelEG2ZOfxqLZdfkil8PtJi4P8N2MMXucZq2yLp75ClViUlOVwyoHEDjYU433Aq+5zWP61+RGag==", + "dev": true, + "license": "MIT", + "dependencies": { + "domelementtype": "^2.0.1", + "domhandler": "^4.2.0", + "entities": "^2.0.0" + }, + "funding": { + "url": "https://github.com/cheeriojs/dom-serializer?sponsor=1" + } + }, + "node_modules/dom-walk": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/dom-walk/-/dom-walk-0.1.2.tgz", + "integrity": "sha512-6QvTW9mrGeIegrFXdtQi9pk7O/nSK6lSdXW2eqUspN5LWD7UTji2Fqw5V2YLjBpHEoU9Xl/eUWNpDeZvoyOv2w==", + "dev": true + }, + "node_modules/domelementtype": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-2.3.0.tgz", + "integrity": "sha512-OLETBj6w0OsagBwdXnPdN0cnMfF9opN69co+7ZrbfPGrdpPVNBUj02spi6B1N7wChLQiPn4CSH/zJvXw56gmHw==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/fb55" + } + ], + "license": "BSD-2-Clause" + }, + "node_modules/domhandler": { + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/domhandler/-/domhandler-4.3.1.tgz", + "integrity": "sha512-GrwoxYN+uWlzO8uhUXRl0P+kHE4GtVPfYzVLcUxPL7KNdHKj66vvlhiweIHqYYXWlw+T8iLMp42Lm67ghw4WMQ==", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "domelementtype": "^2.2.0" + }, + "engines": { + "node": ">= 4" + }, + "funding": { + "url": "https://github.com/fb55/domhandler?sponsor=1" + } + }, + "node_modules/domutils": { + "version": "2.8.0", + "resolved": "https://registry.npmjs.org/domutils/-/domutils-2.8.0.tgz", + "integrity": "sha512-w96Cjofp72M5IIhpjgobBimYEfoPjx1Vx0BSX9P30WBdZW2WIKU0T1Bd0kz2eNZ9ikjKgHbEyKx8BB6H1L3h3A==", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "dom-serializer": "^1.0.1", + "domelementtype": "^2.2.0", + "domhandler": "^4.2.0" + }, + "funding": { + "url": "https://github.com/fb55/domutils?sponsor=1" + } + }, + "node_modules/dot-case": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/dot-case/-/dot-case-3.0.4.tgz", + "integrity": "sha512-Kv5nKlh6yRrdrGvxeJ2e5y2eRUpkUosIW4A2AS38zwSz27zu7ufDwQPi5Jhs3XAlGNetl3bmnGhQsMtkKJnj3w==", + "dev": true, + "license": "MIT", + "dependencies": { + "no-case": "^3.0.4", + "tslib": "^2.0.3" + } + }, + "node_modules/dot-prop": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/dot-prop/-/dot-prop-6.0.1.tgz", + "integrity": "sha512-tE7ztYzXHIeyvc7N+hR3oi7FIbf/NIjVP9hmAt3yMXzrQ072/fpjGLx2GxNxGxUl5V73MEqYzioOMoVhGMJ5cA==", + "dev": true, + "license": "MIT", + "dependencies": { + "is-obj": "^2.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "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/duplexify/node_modules/isarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", + "integrity": "sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/duplexify/node_modules/readable-stream": { + "version": "2.3.8", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.8.tgz", + "integrity": "sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==", + "dev": true, + "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" + } + }, + "node_modules/duplexify/node_modules/string_decoder": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", + "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", + "dev": true, + "license": "MIT", + "dependencies": { + "safe-buffer": "~5.1.0" + } + }, + "node_modules/earcut": { + "version": "2.2.4", + "resolved": "https://registry.npmjs.org/earcut/-/earcut-2.2.4.tgz", + "integrity": "sha512-/pjZsA1b4RPHbeWZQn66SWS8nZZWLQQ23oE3Eam7aroEFGEvwKAsJfZ9ytiEMycfzXWpca4FA9QIOehf7PocBQ==", + "dev": true, + "license": "ISC" + }, + "node_modules/eastasianwidth": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/eastasianwidth/-/eastasianwidth-0.2.0.tgz", + "integrity": "sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==", + "dev": true, + "license": "MIT" + }, + "node_modules/easy-stack": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/easy-stack/-/easy-stack-1.0.1.tgz", + "integrity": "sha512-wK2sCs4feiiJeFXn3zvY0p41mdU5VUgbgs1rNsc/y5ngFUijdWd+iIN8eoyuZHKB8xN6BL4PdWmzqFmxNg6V2w==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/ejs": { + "version": "3.1.10", + "resolved": "https://registry.npmjs.org/ejs/-/ejs-3.1.10.tgz", + "integrity": "sha512-UeJmFfOrAQS8OJWPZ4qtgHyWExa088/MtK5UEyoJGFH67cDEXkZSviOiKRCZ4Xij0zxI3JECgYs3oKx+AizQBA==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "jake": "^10.8.5" + }, + "bin": { + "ejs": "bin/cli.js" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/electron": { + "version": "33.2.0", + "resolved": "https://registry.npmjs.org/electron/-/electron-33.2.0.tgz", + "integrity": "sha512-PVw1ICAQDPsnnsmpNFX/b1i/49h67pbSPxuIENd9K9WpGO1tsRaQt+K2bmXqTuoMJsbzIc75Ce8zqtuwBPqawA==", + "dev": true, + "hasInstallScript": true, + "license": "MIT", + "dependencies": { + "@electron/get": "^2.0.0", + "@types/node": "^20.9.0", + "extract-zip": "^2.0.1" + }, + "bin": { + "electron": "cli.js" + }, + "engines": { + "node": ">= 12.20.55" + } + }, + "node_modules/electron-to-chromium": { + "version": "1.5.65", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.65.tgz", + "integrity": "sha512-PWVzBjghx7/wop6n22vS2MLU8tKGd4Q91aCEGhG/TYmW6PP5OcSXcdnxTe1NNt0T66N8D6jxh4kC8UsdzOGaIw==", + "dev": true, + "license": "ISC" + }, + "node_modules/electron/node_modules/@types/node": { + "version": "20.17.8", + "resolved": "https://registry.npmjs.org/@types/node/-/node-20.17.8.tgz", + "integrity": "sha512-ahz2g6/oqbKalW9sPv6L2iRbhLnojxjYWspAqhjvqSWBgGebEJT5GvRmk0QXPj3sbC6rU0GTQjPLQkmR8CObvA==", + "dev": true, + "license": "MIT", + "dependencies": { + "undici-types": "~6.19.2" + } + }, + "node_modules/electron/node_modules/undici-types": { + "version": "6.19.8", + "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-6.19.8.tgz", + "integrity": "sha512-ve2KP6f/JnbPBFyobGHuerC9g1FYGn/F8n1LWTwNxCEzd6IfqTwUQcNXgEtmmQ6DlRrC1hrSrBnCZPokRrDHjw==", + "dev": true, + "license": "MIT" + }, + "node_modules/email-addresses": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/email-addresses/-/email-addresses-3.1.0.tgz", + "integrity": "sha512-k0/r7GrWVL32kZlGwfPNgB2Y/mMXVTq/decgLczm/j34whdaspNrZO8CnXPf1laaHxI6ptUlsnAxN+UAPw+fzg==", + "dev": true, + "license": "MIT" + }, + "node_modules/emittery": { + "version": "0.13.1", + "resolved": "https://registry.npmjs.org/emittery/-/emittery-0.13.1.tgz", + "integrity": "sha512-DeWwawk6r5yR9jFgnDKYt4sLS0LmHJJi3ZOnb5/JdbYwj3nW+FxQnHIjhBKz8YLC7oRNPVM9NQ47I3CVx34eqQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sindresorhus/emittery?sponsor=1" + } + }, + "node_modules/emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", + "dev": true, + "license": "MIT" + }, + "node_modules/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": "5.17.1", + "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-5.17.1.tgz", + "integrity": "sha512-LMHl3dXhTcfv8gM4kEzIUeTQ+7fpdA0l2tUf34BddXPkz2A5xJ5L/Pchd5BL6rdccM9QGvu0sWZzK1Z1t4wwyg==", + "dev": true, + "license": "MIT", + "dependencies": { + "graceful-fs": "^4.2.4", + "tapable": "^2.2.0" + }, + "engines": { + "node": ">=10.13.0" + } + }, + "node_modules/entities": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/entities/-/entities-2.1.0.tgz", + "integrity": "sha512-hCx1oky9PFrJ611mf0ifBLBRW8lUUVRlFolb5gWRfIELabBlbp9xZvrqZLZAs+NxFnbfQoeGd8wDkygjg7U85w==", + "dev": true, + "license": "BSD-2-Clause", + "funding": { + "url": "https://github.com/fb55/entities?sponsor=1" + } + }, + "node_modules/env-paths": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/env-paths/-/env-paths-2.2.1.tgz", + "integrity": "sha512-+h1lkLKhZMTYjog1VEpJNG7NZJWcuc2DDk/qsqSTRRCOXiLjeQ1d1/udrUGhqMxUgAlwKNZ0cf2uqan5GLuS2A==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/environment": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/environment/-/environment-1.1.0.tgz", + "integrity": "sha512-xUtoPkMggbz0MPyPiIWr1Kp4aeWJjDZ6SMvURhimjdZgsRuDplF5/s9hcgGhyXMhs+6vpnuoiZ2kFiu3FMnS8Q==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "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/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-define-property": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/es-define-property/-/es-define-property-1.0.0.tgz", + "integrity": "sha512-jxayLKShrEqqzJ0eumQbVhTYQM27CfT1T35+gCgDFoL82JLsXqTJ76zv6A0YLOgEnLUMvLzsDsGIrl8NFpT2gQ==", + "dev": true, + "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==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/es-get-iterator": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/es-get-iterator/-/es-get-iterator-1.1.3.tgz", + "integrity": "sha512-sPZmqHBe6JIiTfN5q2pEi//TwxmAFHwj/XEuYjTuse78i8KxaqMTTzxPoFKuzRpDpTJ+0NAbpfenkmH2rePtuw==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.2", + "get-intrinsic": "^1.1.3", + "has-symbols": "^1.0.3", + "is-arguments": "^1.1.1", + "is-map": "^2.0.2", + "is-set": "^2.0.2", + "is-string": "^1.0.7", + "isarray": "^2.0.5", + "stop-iteration-iterator": "^1.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/es-module-lexer": { + "version": "1.5.4", + "resolved": "https://registry.npmjs.org/es-module-lexer/-/es-module-lexer-1.5.4.tgz", + "integrity": "sha512-MVNK56NiMrOwitFB7cqDwq0CQutbw+0BvLshJSse0MUNU+y1FC3bUS/AQg7oUng+/wKrrki7JfmwtVHkVfPLlw==", + "dev": true, + "license": "MIT" + }, + "node_modules/es-object-atoms": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/es-object-atoms/-/es-object-atoms-1.0.0.tgz", + "integrity": "sha512-MZ4iQ6JwHOBQjahnjwaC1ZtIBH+2ohjamzAO3oaHcXYup7qxjF2fixyH+Q71voWHeOkI2q/TnJao/KfXYIZWbw==", + "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.3.0", + "resolved": "https://registry.npmjs.org/es-to-primitive/-/es-to-primitive-1.3.0.tgz", + "integrity": "sha512-w+5mJ3GuFL+NjVtJlvydShqE1eN3h3PbI7/5LAsYJP/2qtuMXjfL2LpHSRqo4b4eSF5K/DH1JXKUAHSB2UW50g==", + "dev": true, + "license": "MIT", + "dependencies": { + "is-callable": "^1.2.7", + "is-date-object": "^1.0.5", + "is-symbol": "^1.0.4" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/es-toolkit": { + "version": "1.27.0", + "resolved": "https://registry.npmjs.org/es-toolkit/-/es-toolkit-1.27.0.tgz", + "integrity": "sha512-ETSFA+ZJArcuSCpzD2TjAy6UHpx4E4uqFsoDg9F/nTLogrLmVVZQ+zNxco5h7cWnA1nNak07IXsLcaSMih+ZPQ==", + "dev": true, + "license": "MIT", + "workspaces": [ + "docs", + "benchmarks" + ] + }, + "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", + "optional": true + }, + "node_modules/esast-util-from-estree": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/esast-util-from-estree/-/esast-util-from-estree-2.0.0.tgz", + "integrity": "sha512-4CyanoAudUSBAn5K13H4JhsMH6L9ZP7XbLVe/dKybkxMO7eDyLsT8UHl9TRNrU2Gr9nz+FovfSIjuXWJ81uVwQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/estree-jsx": "^1.0.0", + "devlop": "^1.0.0", + "estree-util-visit": "^2.0.0", + "unist-util-position-from-estree": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/esast-util-from-js": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/esast-util-from-js/-/esast-util-from-js-2.0.1.tgz", + "integrity": "sha512-8Ja+rNJ0Lt56Pcf3TAmpBZjmx8ZcK5Ts4cAzIOjsjevg9oSXJnl6SUQ2EevU8tv3h6ZLWmoKL5H4fgWvdvfETw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/estree-jsx": "^1.0.0", + "acorn": "^8.0.0", + "esast-util-from-estree": "^2.0.0", + "vfile-message": "^4.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/esbuild": { + "version": "0.24.0", + "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.24.0.tgz", + "integrity": "sha512-FuLPevChGDshgSicjisSooU0cemp/sGXR841D5LHMB7mTVOmsEHcAxaH3irL53+8YDIeVNQEySh4DaYU/iuPqQ==", + "dev": true, + "hasInstallScript": true, + "license": "MIT", + "bin": { + "esbuild": "bin/esbuild" + }, + "engines": { + "node": ">=18" + }, + "optionalDependencies": { + "@esbuild/aix-ppc64": "0.24.0", + "@esbuild/android-arm": "0.24.0", + "@esbuild/android-arm64": "0.24.0", + "@esbuild/android-x64": "0.24.0", + "@esbuild/darwin-arm64": "0.24.0", + "@esbuild/darwin-x64": "0.24.0", + "@esbuild/freebsd-arm64": "0.24.0", + "@esbuild/freebsd-x64": "0.24.0", + "@esbuild/linux-arm": "0.24.0", + "@esbuild/linux-arm64": "0.24.0", + "@esbuild/linux-ia32": "0.24.0", + "@esbuild/linux-loong64": "0.24.0", + "@esbuild/linux-mips64el": "0.24.0", + "@esbuild/linux-ppc64": "0.24.0", + "@esbuild/linux-riscv64": "0.24.0", + "@esbuild/linux-s390x": "0.24.0", + "@esbuild/linux-x64": "0.24.0", + "@esbuild/netbsd-x64": "0.24.0", + "@esbuild/openbsd-arm64": "0.24.0", + "@esbuild/openbsd-x64": "0.24.0", + "@esbuild/sunos-x64": "0.24.0", + "@esbuild/win32-arm64": "0.24.0", + "@esbuild/win32-ia32": "0.24.0", + "@esbuild/win32-x64": "0.24.0" + } + }, + "node_modules/esbuild-register": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/esbuild-register/-/esbuild-register-3.6.0.tgz", + "integrity": "sha512-H2/S7Pm8a9CL1uhp9OvjwrBh5Pvx0H8qVOxNu8Wed9Y7qv56MPtq+GGM8RJpq6glYJn9Wspr8uw7l55uyinNeg==", + "dev": true, + "license": "MIT", + "dependencies": { + "debug": "^4.3.4" + }, + "peerDependencies": { + "esbuild": ">=0.12 <1" + } + }, + "node_modules/escalade": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.2.0.tgz", + "integrity": "sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/escape-string-regexp": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-3.0.0.tgz", + "integrity": "sha512-11dXIUC3umvzEViLP117d0KN6LJzZxh5+9F4E/7WLAAw7GrHk8NpUR+g9iJi/pe9C0py4F8rs0hreyRCwlAuZg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/eslint": { + "version": "8.57.1", + "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.57.1.tgz", + "integrity": "sha512-ypowyDxpVSYpkXr9WPv2PAZCtNip1Mv5KTW0SCurXv/9iOpcrH9PaqUElksqEB6pChqHGDRCFTyrZlGhnLNGiA==", + "deprecated": "This version is no longer supported. Please see https://eslint.org/version-support for other options.", + "dev": true, + "license": "MIT", + "dependencies": { + "@eslint-community/eslint-utils": "^4.2.0", + "@eslint-community/regexpp": "^4.6.1", + "@eslint/eslintrc": "^2.1.4", + "@eslint/js": "8.57.1", + "@humanwhocodes/config-array": "^0.13.0", + "@humanwhocodes/module-importer": "^1.0.1", + "@nodelib/fs.walk": "^1.2.8", + "@ungap/structured-clone": "^1.2.0", + "ajv": "^6.12.4", + "chalk": "^4.0.0", + "cross-spawn": "^7.0.2", + "debug": "^4.3.2", + "doctrine": "^3.0.0", + "escape-string-regexp": "^4.0.0", + "eslint-scope": "^7.2.2", + "eslint-visitor-keys": "^3.4.3", + "espree": "^9.6.1", + "esquery": "^1.4.2", + "esutils": "^2.0.2", + "fast-deep-equal": "^3.1.3", + "file-entry-cache": "^6.0.1", + "find-up": "^5.0.0", + "glob-parent": "^6.0.2", + "globals": "^13.19.0", + "graphemer": "^1.4.0", + "ignore": "^5.2.0", + "imurmurhash": "^0.1.4", + "is-glob": "^4.0.0", + "is-path-inside": "^3.0.3", + "js-yaml": "^4.1.0", + "json-stable-stringify-without-jsonify": "^1.0.1", + "levn": "^0.4.1", + "lodash.merge": "^4.6.2", + "minimatch": "^3.1.2", + "natural-compare": "^1.4.0", + "optionator": "^0.9.3", + "strip-ansi": "^6.0.1", + "text-table": "^0.2.0" + }, + "bin": { + "eslint": "bin/eslint.js" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "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-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/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/eslint-plugin-import/node_modules/brace-expansion": { + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", + "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "dev": true, + "license": "MIT", + "dependencies": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "node_modules/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/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/eslint-plugin-jsdoc": { + "version": "50.6.0", + "resolved": "https://registry.npmjs.org/eslint-plugin-jsdoc/-/eslint-plugin-jsdoc-50.6.0.tgz", + "integrity": "sha512-tCNp4fR79Le3dYTPB0dKEv7yFyvGkUCa+Z3yuTrrNGGOxBlXo9Pn0PEgroOZikUQOGjxoGMVKNjrOHcYEdfszg==", + "dev": true, + "license": "BSD-3-Clause", + "dependencies": { + "@es-joy/jsdoccomment": "~0.49.0", + "are-docs-informative": "^0.0.2", + "comment-parser": "1.4.1", + "debug": "^4.3.6", + "escape-string-regexp": "^4.0.0", + "espree": "^10.1.0", + "esquery": "^1.6.0", + "parse-imports": "^2.1.1", + "semver": "^7.6.3", + "spdx-expression-parse": "^4.0.0", + "synckit": "^0.9.1" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "eslint": "^7.0.0 || ^8.0.0 || ^9.0.0" + } + }, + "node_modules/eslint-plugin-jsdoc/node_modules/escape-string-regexp": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz", + "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/eslint-plugin-jsdoc/node_modules/eslint-visitor-keys": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-4.2.0.tgz", + "integrity": "sha512-UyLnSehNt62FFhSwjZlHmeokpRK59rcz29j+F1/aDgbkbRTk7wIc9XzdoasMUbRNKDM0qQt/+BJ4BrpFeABemw==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/eslint-plugin-jsdoc/node_modules/espree": { + "version": "10.3.0", + "resolved": "https://registry.npmjs.org/espree/-/espree-10.3.0.tgz", + "integrity": "sha512-0QYC8b24HWY8zjRnDTL6RiHfDbAWn63qb4LMj1Z4b076A4une81+z03Kg7l7mn/48PUTqoLptSXez8oknU8Clg==", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "acorn": "^8.14.0", + "acorn-jsx": "^5.3.2", + "eslint-visitor-keys": "^4.2.0" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/eslint-plugin-jsdoc/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/eslint-plugin-no-mixed-operators": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/eslint-plugin-no-mixed-operators/-/eslint-plugin-no-mixed-operators-1.1.1.tgz", + "integrity": "sha512-KN4xHa+yZnsfsdmjCP8eCcfdAMXDaphn5Mdnre3b6pRDfAJc3pGXq0Wbl+RfrpjkxA3KlGku1BVwTvHlG5KNpA==", + "dev": true, + "license": "MIT", + "peerDependencies": { + "eslint": ">=3" + } + }, + "node_modules/eslint-plugin-simple-import-sort": { + "version": "10.0.0", + "resolved": "https://registry.npmjs.org/eslint-plugin-simple-import-sort/-/eslint-plugin-simple-import-sort-10.0.0.tgz", + "integrity": "sha512-AeTvO9UCMSNzIHRkg8S6c3RPy5YEwKWSQPx3DYghLedo2ZQxowPFLGDN1AZ2evfg6r6mjBSZSLxLFsWSu3acsw==", + "dev": true, + "license": "MIT", + "peerDependencies": { + "eslint": ">=5.0.0" + } + }, + "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", + "dependencies": { + "esrecurse": "^4.3.0", + "estraverse": "^5.2.0" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/eslint-visitor-keys": { + "version": "3.4.3", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.4.3.tgz", + "integrity": "sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/eslint/node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "license": "MIT", + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/eslint/node_modules/argparse": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", + "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==", + "dev": true, + "license": "Python-2.0" + }, + "node_modules/eslint/node_modules/brace-expansion": { + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", + "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "dev": true, + "license": "MIT", + "dependencies": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "node_modules/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/escape-string-regexp": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz", + "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/eslint/node_modules/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/eslint/node_modules/globals": { + "version": "13.24.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-13.24.0.tgz", + "integrity": "sha512-AhO5QUcj8llrbG09iWhPU2B204J1xnPeL8kQmVorSsy+Sjj1sk8gIyh6cUocGmH4L0UuhAJy+hJMRA4mgA4mFQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "type-fest": "^0.20.2" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/eslint/node_modules/js-yaml": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz", + "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==", + "dev": true, + "license": "MIT", + "dependencies": { + "argparse": "^2.0.1" + }, + "bin": { + "js-yaml": "bin/js-yaml.js" + } + }, + "node_modules/eslint/node_modules/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/eslint/node_modules/minimatch": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "dev": true, + "license": "ISC", + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" + } + }, + "node_modules/eslint/node_modules/p-locate": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-5.0.0.tgz", + "integrity": "sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==", + "dev": true, + "license": "MIT", + "dependencies": { + "p-limit": "^3.0.2" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/eslint/node_modules/strip-ansi": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "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/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", + "dependencies": { + "acorn": "^8.9.0", + "acorn-jsx": "^5.3.2", + "eslint-visitor-keys": "^3.4.1" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/esprima": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz", + "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==", + "dev": true, + "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/esrecurse": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.3.0.tgz", + "integrity": "sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "estraverse": "^5.2.0" + }, + "engines": { + "node": ">=4.0" + } + }, + "node_modules/estraverse": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", + "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", + "dev": true, + "license": "BSD-2-Clause", + "engines": { + "node": ">=4.0" + } + }, + "node_modules/estree-util-attach-comments": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/estree-util-attach-comments/-/estree-util-attach-comments-3.0.0.tgz", + "integrity": "sha512-cKUwm/HUcTDsYh/9FgnuFqpfquUbwIqwKM26BVCGDPVgvaCl/nDCCjUfiLlx6lsEZ3Z4RFxNbOQ60pkaEwFxGw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/estree": "^1.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/estree-util-build-jsx": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/estree-util-build-jsx/-/estree-util-build-jsx-3.0.1.tgz", + "integrity": "sha512-8U5eiL6BTrPxp/CHbs2yMgP8ftMhR5ww1eIKoWRMlqvltHF8fZn5LRDvTKuxD3DUn+shRbLGqXemcP51oFCsGQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/estree-jsx": "^1.0.0", + "devlop": "^1.0.0", + "estree-util-is-identifier-name": "^3.0.0", + "estree-walker": "^3.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/estree-util-is-identifier-name": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/estree-util-is-identifier-name/-/estree-util-is-identifier-name-3.0.0.tgz", + "integrity": "sha512-hFtqIDZTIUZ9BXLb8y4pYGyk6+wekIivNVTcmvk8NoOh+VeRn5y6cEHzbURrWbfp1fIqdVipilzj+lfaadNZmg==", + "dev": true, + "license": "MIT", + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/estree-util-scope": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/estree-util-scope/-/estree-util-scope-1.0.0.tgz", + "integrity": "sha512-2CAASclonf+JFWBNJPndcOpA8EMJwa0Q8LUFJEKqXLW6+qBvbFZuF5gItbQOs/umBUkjviCSDCbBwU2cXbmrhQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/estree": "^1.0.0", + "devlop": "^1.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/estree-util-to-js": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/estree-util-to-js/-/estree-util-to-js-2.0.0.tgz", + "integrity": "sha512-WDF+xj5rRWmD5tj6bIqRi6CkLIXbbNQUcxQHzGysQzvHmdYG2G7p/Tf0J0gpxGgkeMZNTIjT/AoSvC9Xehcgdg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/estree-jsx": "^1.0.0", + "astring": "^1.8.0", + "source-map": "^0.7.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/estree-util-visit": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/estree-util-visit/-/estree-util-visit-2.0.0.tgz", + "integrity": "sha512-m5KgiH85xAhhW8Wta0vShLcUvOsh3LLPI2YVwcbio1l7E09NTLL1EyMZFM1OyWowoH0skScNbhOPl4kcBgzTww==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/estree-jsx": "^1.0.0", + "@types/unist": "^3.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/estree-walker": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-3.0.3.tgz", + "integrity": "sha512-7RUKfXgSMMkzt6ZuXmqapOurLGPPfgj6l9uRZ7lRGolvk0y2yocc35LdcxKC5PQZdn2DMqioAQ2NoWcrTKmm6g==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/estree": "^1.0.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/event-pubsub": { + "version": "5.0.3", + "resolved": "https://registry.npmjs.org/event-pubsub/-/event-pubsub-5.0.3.tgz", + "integrity": "sha512-2QiHxshejKgJrYMzSI9MEHrvhmzxBL+eLyiM5IiyjDBySkgwS2+tdtnO3gbx8pEisu/yOFCIhfCb63gCEu0yBQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "copyfiles": "^2.4.0", + "strong-type": "^0.1.3" + }, + "engines": { + "node": ">=13.0.0" + } + }, + "node_modules/event-pubsub/node_modules/strong-type": { + "version": "0.1.6", + "resolved": "https://registry.npmjs.org/strong-type/-/strong-type-0.1.6.tgz", + "integrity": "sha512-eJe5caH6Pi5oMMeQtIoBPpvNu/s4jiyb63u5tkHNnQXomK+puyQ5i+Z5iTLBr/xUz/pIcps0NSfzzFI34+gAXg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12.0.0" + } + }, + "node_modules/eventemitter3": { + "version": "4.0.7", + "resolved": "https://registry.npmjs.org/eventemitter3/-/eventemitter3-4.0.7.tgz", + "integrity": "sha512-8guHBZCwKnFhYdHr2ysuRWErTwhoN2X8XELRlrRwpmfeY2jjuUN4taQMsULKUVo1K4DvZl+0pgfyoysHxvmvEw==", + "dev": true, + "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/execa": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/execa/-/execa-5.1.1.tgz", + "integrity": "sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg==", + "dev": true, + "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/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==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "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==", + "dev": true, + "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==", + "dev": true, + "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", + "peer": true, + "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", + "peer": true, + "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", + "peer": true, + "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", + "peer": true, + "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", + "peer": true, + "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", + "peer": true, + "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", + "peer": true + }, + "node_modules/expand-tilde": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/expand-tilde/-/expand-tilde-2.0.2.tgz", + "integrity": "sha512-A5EmesHW6rfnZ9ysHQjPdJRni0SRar0tjtG5MNtm9n5TUvsYU8oozprtRD4AqHxcZWWlVuAmQo2nWKfN9oyjTw==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "homedir-polyfill": "^1.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/expect": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/expect/-/expect-29.7.0.tgz", + "integrity": "sha512-2Zks0hf1VLFYI1kbh0I5jP3KHHyCHpkfyHBzsSXRFgl/Bg9mWYfMW8oD+PdMPlEwy5HNsR9JutYy6pMeOh61nw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/expect-utils": "^29.7.0", + "jest-get-type": "^29.6.3", + "jest-matcher-utils": "^29.7.0", + "jest-message-util": "^29.7.0", + "jest-util": "^29.7.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/extend": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.2.tgz", + "integrity": "sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==", + "dev": true, + "license": "MIT" + }, + "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", + "peer": true, + "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==", + "dev": true, + "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", + "peer": true, + "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", + "peer": true, + "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", + "peer": true, + "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", + "peer": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/extract-zip": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extract-zip/-/extract-zip-2.0.1.tgz", + "integrity": "sha512-GDhU9ntwuKyGXdZBUgTIe+vXnWj0fppUEtMDL0+idd5Sta8TGpHssn/eusA9mrPr9qNDym6SxAYZjNvCn/9RBg==", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "debug": "^4.1.1", + "get-stream": "^5.1.0", + "yauzl": "^2.10.0" + }, + "bin": { + "extract-zip": "cli.js" + }, + "engines": { + "node": ">= 10.17.0" + }, + "optionalDependencies": { + "@types/yauzl": "^2.9.1" + } + }, + "node_modules/fast-deep-equal": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", + "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==", + "dev": true, + "license": "MIT" + }, + "node_modules/fast-glob": { + "version": "3.3.2", + "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.3.2.tgz", + "integrity": "sha512-oX2ruAFQwf/Orj8m737Y5adxDQO0LAB7/S5MnxCdTNDd4p6BsyIVsv9JQsATbTSq8KHRpLwIHbVlUNatxd+1Ow==", + "dev": true, + "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-glob/node_modules/glob-parent": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", + "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", + "dev": true, + "license": "ISC", + "dependencies": { + "is-glob": "^4.0.1" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/fast-json-stable-stringify": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz", + "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==", + "dev": true, + "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-uri": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/fast-uri/-/fast-uri-3.0.3.tgz", + "integrity": "sha512-aLrHthzCjH5He4Z2H9YZ+v6Ujb9ocRuW6ZzkJQOrTxleEijANq4v1TsaPaVG1PZcuurEzrLcWRyYBYXD5cEiaw==", + "dev": true, + "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==", + "dev": true, + "license": "ISC", + "dependencies": { + "reusify": "^1.0.4" + } + }, + "node_modules/fb-watchman": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/fb-watchman/-/fb-watchman-2.0.2.tgz", + "integrity": "sha512-p5161BqbuCaSnB8jIbzQHOlpgsPmK5rJVDfDKO91Axs5NC1uu3HRQm6wt9cd9/+GtQQIO53JdGXXoyDpTAsgYA==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "bser": "2.1.1" + } + }, + "node_modules/fd-slicer": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/fd-slicer/-/fd-slicer-1.1.0.tgz", + "integrity": "sha512-cE1qsB/VwyQozZ+q1dGxR8LBYNZeofhEdUNGSMbQD3Gw2lAzX9Zb3uIU6Ebc/Fmyjo9AWWfnn0AUCHqtevs/8g==", + "dev": true, + "license": "MIT", + "dependencies": { + "pend": "~1.2.0" + } + }, + "node_modules/fdir": { + "version": "6.4.2", + "resolved": "https://registry.npmjs.org/fdir/-/fdir-6.4.2.tgz", + "integrity": "sha512-KnhMXsKSPZlAhp7+IjUkRZKPb4fUyccpDrdFXbi4QL1qkmFh9kVY09Yox+n4MaOb3lHZ1Tv829C3oaaXoMYPDQ==", + "dev": true, + "license": "MIT", + "peerDependencies": { + "picomatch": "^3 || ^4" + }, + "peerDependenciesMeta": { + "picomatch": { + "optional": true + } + } + }, + "node_modules/figures": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/figures/-/figures-4.0.1.tgz", + "integrity": "sha512-rElJwkA/xS04Vfg+CaZodpso7VqBknOYbzi6I76hI4X80RUjkSxO2oAyPmGbuXUppywjqndOrQDl817hDnI++w==", + "dev": true, + "license": "MIT", + "dependencies": { + "escape-string-regexp": "^5.0.0", + "is-unicode-supported": "^1.2.0" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/figures/node_modules/escape-string-regexp": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-5.0.0.tgz", + "integrity": "sha512-/veY75JbMK4j1yjvuUxuVsiS/hr/4iHs9FTT6cgTexxdE0Ly/glccBAkloH/DofkjRbZU3bnoj38mOmhkZ0lHw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/figures/node_modules/is-unicode-supported": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/is-unicode-supported/-/is-unicode-supported-1.3.0.tgz", + "integrity": "sha512-43r2mRvz+8JRIKnWJ+3j8JtjRKZ6GmjzfaE/qiBJnikNnYv/6bagRJ1kUhNk8R5EX/GkobD+r+sfxCPJsiKBLQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "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/filelist": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/filelist/-/filelist-1.0.4.tgz", + "integrity": "sha512-w1cEuf3S+DrLCQL7ET6kz+gmlJdbq9J7yXCSjK/OZCPA+qEN1WyF4ZAf0YYJa4/shHJra2t/d/r8SV4Ji+x+8Q==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "minimatch": "^5.0.1" + } + }, + "node_modules/filelist/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/filename-reserved-regex": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/filename-reserved-regex/-/filename-reserved-regex-2.0.0.tgz", + "integrity": "sha512-lc1bnsSr4L4Bdif8Xb/qrtokGbq5zlsms/CYH8PP+WtCkGNF65DPiQY8vG3SakEdRn8Dlnm+gW/qWKKjS5sZzQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "node_modules/filenamify": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/filenamify/-/filenamify-4.3.0.tgz", + "integrity": "sha512-hcFKyUG57yWGAzu1CMt/dPzYZuv+jAJUT85bL8mrXvNe6hWj6yEHEc4EdcgiA6Z3oi1/9wXJdZPXF2dZNgwgOg==", + "dev": true, + "license": "MIT", + "dependencies": { + "filename-reserved-regex": "^2.0.0", + "strip-outer": "^1.0.1", + "trim-repeated": "^1.0.0" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/filesize": { + "version": "10.1.6", + "resolved": "https://registry.npmjs.org/filesize/-/filesize-10.1.6.tgz", + "integrity": "sha512-sJslQKU2uM33qH5nqewAwVB2QgR6w1aMNsYUp3aN5rMRyXEwJGmZvaWzeJFNTOXWlHQyBFCWrdj3fV/fsTOX8w==", + "dev": true, + "license": "BSD-3-Clause", + "engines": { + "node": ">= 10.4.0" + } + }, + "node_modules/fill-range": { + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.1.1.tgz", + "integrity": "sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==", + "dev": true, + "license": "MIT", + "dependencies": { + "to-regex-range": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/find-cache-dir": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/find-cache-dir/-/find-cache-dir-4.0.0.tgz", + "integrity": "sha512-9ZonPT4ZAK4a+1pUPVPZJapbi7O5qbbJPdYw/NOQWZZbVLdDTYM3A4R9z/DpAM08IDaFGsvPgiGZ82WEwUDWjg==", + "dev": true, + "license": "MIT", + "dependencies": { + "common-path-prefix": "^3.0.0", + "pkg-dir": "^7.0.0" + }, + "engines": { + "node": ">=14.16" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/find-git-root": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/find-git-root/-/find-git-root-1.0.4.tgz", + "integrity": "sha512-468fmirKKgcrqfZfPn0xIpwZUUsZQcYXfx0RC2/jX39GPz83TwutQNZZhDrI6HqjO8cRejxQVaUY8GQdXopFfA==", + "dev": true, + "license": "MIT" + }, + "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/findup-sync": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/findup-sync/-/findup-sync-2.0.0.tgz", + "integrity": "sha512-vs+3unmJT45eczmcAZ6zMJtxN3l/QXeccaXQx5cu/MeJMhewVfoWZqibRkOxPnmoR59+Zy5hjabfQc6JLSah4g==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "detect-file": "^1.0.0", + "is-glob": "^3.1.0", + "micromatch": "^3.0.4", + "resolve-dir": "^1.0.1" + }, + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/findup-sync/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", + "peer": 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" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/findup-sync/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, + "license": "MIT", + "peer": true, + "dependencies": { + "is-extendable": "^0.1.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/findup-sync/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, + "license": "MIT", + "peer": 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_modules/findup-sync/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", + "peer": true, + "dependencies": { + "is-extendable": "^0.1.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/findup-sync/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", + "peer": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/findup-sync/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, + "license": "MIT", + "peer": true, + "dependencies": { + "is-extglob": "^2.1.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/findup-sync/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", + "peer": true, + "dependencies": { + "kind-of": "^3.0.2" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/findup-sync/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", + "peer": true, + "dependencies": { + "is-buffer": "^1.1.5" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/findup-sync/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, + "license": "MIT", + "peer": 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" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/findup-sync/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, + "license": "MIT", + "peer": true, + "dependencies": { + "is-number": "^3.0.0", + "repeat-string": "^1.6.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "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/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/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==", + "dev": true, + "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", + "peer": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/foreground-child": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/foreground-child/-/foreground-child-3.3.0.tgz", + "integrity": "sha512-Ld2g8rrAyMYFXBhEqMz8ZAHBi4J4uS1i/CxGMDnjyFWddMXLVcDp051DZfu+t7+ab7Wv6SMqpWmyFIj5UbfFvg==", + "dev": true, + "license": "ISC", + "dependencies": { + "cross-spawn": "^7.0.0", + "signal-exit": "^4.0.1" + }, + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/fork-ts-checker-webpack-plugin": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/fork-ts-checker-webpack-plugin/-/fork-ts-checker-webpack-plugin-8.0.0.tgz", + "integrity": "sha512-mX3qW3idpueT2klaQXBzrIM/pHw+T0B/V9KHEvNrqijTq9NFnMZU6oreVxDYcf33P8a5cW+67PjodNHthGnNVg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/code-frame": "^7.16.7", + "chalk": "^4.1.2", + "chokidar": "^3.5.3", + "cosmiconfig": "^7.0.1", + "deepmerge": "^4.2.2", + "fs-extra": "^10.0.0", + "memfs": "^3.4.1", + "minimatch": "^3.0.4", + "node-abort-controller": "^3.0.1", + "schema-utils": "^3.1.1", + "semver": "^7.3.5", + "tapable": "^2.2.1" + }, + "engines": { + "node": ">=12.13.0", + "yarn": ">=1.0.0" + }, + "peerDependencies": { + "typescript": ">3.6.0", + "webpack": "^5.11.0" + } + }, + "node_modules/fork-ts-checker-webpack-plugin/node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "license": "MIT", + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/fork-ts-checker-webpack-plugin/node_modules/brace-expansion": { + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", + "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "dev": true, + "license": "MIT", + "dependencies": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "node_modules/fork-ts-checker-webpack-plugin/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/fork-ts-checker-webpack-plugin/node_modules/fs-extra": { + "version": "10.1.0", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-10.1.0.tgz", + "integrity": "sha512-oRXApq54ETRj4eMiFzGnHWGy+zo5raudjuxN0b8H7s/RU2oW0Wvsx9O0ACRN/kRq9E8Vu/ReskGB5o3ji+FzHQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "graceful-fs": "^4.2.0", + "jsonfile": "^6.0.1", + "universalify": "^2.0.0" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/fork-ts-checker-webpack-plugin/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/fork-ts-checker-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==", + "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/fork-ts-checker-webpack-plugin/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/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", + "peer": true, + "dependencies": { + "map-cache": "^0.2.2" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/fs-constants": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/fs-constants/-/fs-constants-1.0.0.tgz", + "integrity": "sha512-y6OAwoSIf7FyjMIv94u+b5rdheZEjzR63GTyZJm5qh4Bi+2YgwLCcI/fPFZkL5PSixOt6ZNKm+w+Hfp/Bciwow==", + "dev": true, + "license": "MIT" + }, + "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/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.realpath": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", + "integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==", + "dev": true, + "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==", + "dev": true, + "hasInstallScript": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": "^8.16.0 || ^10.6.0 || >=11.0.0" + } + }, + "node_modules/function-bind": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz", + "integrity": "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==", + "dev": true, + "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/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==", + "dev": true, + "license": "ISC", + "engines": { + "node": "6.* || 8.* || >= 10.*" + } + }, + "node_modules/get-east-asian-width": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/get-east-asian-width/-/get-east-asian-width-1.3.0.tgz", + "integrity": "sha512-vpeMIQKxczTD/0s2CdEWHcb0eeJe6TFjxb+J5xgX7hScxqrGuyjmv4c1D4A/gelKfyox0gJJwIHF+fLjeaM8kQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/get-intrinsic": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.2.4.tgz", + "integrity": "sha512-5uYhsJH8VJBTv7oslg4BznJYhDoRI6waYCxMmCdnTrcCrHA/fCFKoTFz2JKKE0HdDFUF7/oQuhzumXJK7paBRQ==", + "dev": true, + "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-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/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", + "peer": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/gh-pages": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/gh-pages/-/gh-pages-4.0.0.tgz", + "integrity": "sha512-p8S0T3aGJc68MtwOcZusul5qPSNZCalap3NWbhRUZYu1YOdp+EjZ+4kPmRM8h3NNRdqw00yuevRjlkuSzCn7iQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "async": "^2.6.1", + "commander": "^2.18.0", + "email-addresses": "^3.0.1", + "filenamify": "^4.3.0", + "find-cache-dir": "^3.3.1", + "fs-extra": "^8.1.0", + "globby": "^6.1.0" + }, + "bin": { + "gh-pages": "bin/gh-pages.js", + "gh-pages-clean": "bin/gh-pages-clean.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/gh-pages/node_modules/array-union": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/array-union/-/array-union-1.0.2.tgz", + "integrity": "sha512-Dxr6QJj/RdU/hCaBjOfxW+q6lyuVE6JFWIrAUpuOOhoJJoQ99cUn3igRaHVB5P9WrgFVN0FfArM3x0cueOU8ng==", + "dev": true, + "license": "MIT", + "dependencies": { + "array-uniq": "^1.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/gh-pages/node_modules/brace-expansion": { + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", + "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "dev": true, + "license": "MIT", + "dependencies": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "node_modules/gh-pages/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/gh-pages/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==", + "dev": true, + "license": "MIT", + "dependencies": { + "graceful-fs": "^4.2.0", + "jsonfile": "^4.0.0", + "universalify": "^0.1.0" + }, + "engines": { + "node": ">=6 <7 || >=8" + } + }, + "node_modules/gh-pages/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", + "dev": true, + "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/gh-pages/node_modules/globby": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/globby/-/globby-6.1.0.tgz", + "integrity": "sha512-KVbFv2TQtbzCoxAnfD6JcHZTYCzyliEaaeM/gH8qQdkKr5s0OP9scEgvdcngyk7AVdY6YVW/TJHd+lQ/Df3Daw==", + "dev": true, + "license": "MIT", + "dependencies": { + "array-union": "^1.0.1", + "glob": "^7.0.3", + "object-assign": "^4.0.1", + "pify": "^2.0.0", + "pinkie-promise": "^2.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/gh-pages/node_modules/jsonfile": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-4.0.0.tgz", + "integrity": "sha512-m6F1R3z8jjlf2imQHS2Qez5sjKWQzbuuhuJ/FKYFRZvPE3PuHcSMVZzfsLhGVOkfd20obL5SWEBew5ShlquNxg==", + "dev": true, + "license": "MIT", + "optionalDependencies": { + "graceful-fs": "^4.1.6" + } + }, + "node_modules/gh-pages/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/gh-pages/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/gh-pages/node_modules/pkg-dir": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-4.2.0.tgz", + "integrity": "sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "find-up": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/gh-pages/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==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 4.0.0" + } + }, + "node_modules/git-branch": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/git-branch/-/git-branch-2.0.1.tgz", + "integrity": "sha512-jMCT1kjXvsUdZKQd2p8E1uZhKsIuR1pnHgcDYQpQiXBtzE9cmYGvOcCSGqqi58x0B9CPS0lUSu/yti866est8g==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "findup-sync": "^2.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/glob": { + "version": "10.4.5", + "resolved": "https://registry.npmjs.org/glob/-/glob-10.4.5.tgz", + "integrity": "sha512-7Bv8RF0k6xjo7d4A/PxYLbUCfb6c+Vpd2/mB2yRDlew7Jb5hEXiCD9ibfO7wpk8i4sevK6DFny9h7EYbM3/sHg==", + "dev": true, + "license": "ISC", + "dependencies": { + "foreground-child": "^3.1.0", + "jackspeak": "^3.1.2", + "minimatch": "^9.0.4", + "minipass": "^7.1.2", + "package-json-from-dist": "^1.0.0", + "path-scurry": "^1.11.1" + }, + "bin": { + "glob": "dist/esm/bin.mjs" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/glob-parent": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-6.0.2.tgz", + "integrity": "sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==", + "dev": true, + "license": "ISC", + "dependencies": { + "is-glob": "^4.0.3" + }, + "engines": { + "node": ">=10.13.0" + } + }, + "node_modules/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/glob/node_modules/minimatch": { + "version": "9.0.5", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.5.tgz", + "integrity": "sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==", + "dev": true, + "license": "ISC", + "dependencies": { + "brace-expansion": "^2.0.1" + }, + "engines": { + "node": ">=16 || 14 >=14.17" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/global": { + "version": "4.4.0", + "resolved": "https://registry.npmjs.org/global/-/global-4.4.0.tgz", + "integrity": "sha512-wv/LAoHdRE3BeTGz53FAamhGlPLhlssK45usmGFThIi4XqnBmjKQ16u+RNbP7WvigRZDxUsM0J3gcQ5yicaL0w==", + "dev": true, + "license": "MIT", + "dependencies": { + "min-document": "^2.19.0", + "process": "^0.11.10" + } + }, + "node_modules/global-agent": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/global-agent/-/global-agent-3.0.0.tgz", + "integrity": "sha512-PT6XReJ+D07JvGoxQMkT6qji/jVNfX/h364XHZOWeRzy64sSFr+xJ5OX7LI3b4MPQzdL4H8Y8M0xzPpsVMwA8Q==", + "dev": true, + "license": "BSD-3-Clause", + "optional": true, + "dependencies": { + "boolean": "^3.0.1", + "es6-error": "^4.1.1", + "matcher": "^3.0.0", + "roarr": "^2.15.3", + "semver": "^7.3.2", + "serialize-error": "^7.0.1" + }, + "engines": { + "node": ">=10.0" + } + }, + "node_modules/global-agent/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", + "optional": true, + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/global-modules": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/global-modules/-/global-modules-1.0.0.tgz", + "integrity": "sha512-sKzpEkf11GpOFuw0Zzjzmt4B4UZwjOcG757PPvrfhxcLFbq0wpsgpOqxpxtxFiCG4DtG93M6XRVbF2oGdev7bg==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "global-prefix": "^1.0.1", + "is-windows": "^1.0.1", + "resolve-dir": "^1.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/global-prefix": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/global-prefix/-/global-prefix-1.0.2.tgz", + "integrity": "sha512-5lsx1NUDHtSjfg0eHlmYvZKv8/nVqX4ckFbM+FrGcQ+04KWcWFo9P5MxPZYSzUvyzmdTbI7Eix8Q4IbELDqzKg==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "expand-tilde": "^2.0.2", + "homedir-polyfill": "^1.0.1", + "ini": "^1.3.4", + "is-windows": "^1.0.1", + "which": "^1.2.14" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/global-prefix/node_modules/which": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz", + "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==", + "dev": true, + "license": "ISC", + "peer": true, + "dependencies": { + "isexe": "^2.0.0" + }, + "bin": { + "which": "bin/which" + } + }, + "node_modules/globals": { + "version": "11.12.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-11.12.0.tgz", + "integrity": "sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "node_modules/globalthis": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/globalthis/-/globalthis-1.0.4.tgz", + "integrity": "sha512-DpLKbNU4WylpxJykQujfCcwYWiV/Jhm50Goo0wrVILAv5jOr9d+H+UR3PhSCD2rCCEIg0uc+G+muBTwD54JhDQ==", + "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==", + "dev": true, + "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/gopd": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.0.1.tgz", + "integrity": "sha512-d65bNlIadxvpb/A2abVdlqKqV563juRnZ1Wtk6s1sIR8uNsXR70xqIzVqxVf1eTqDunwT2MkczEeaezCKTZhwA==", + "dev": true, + "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/graceful-fs": { + "version": "4.2.11", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.11.tgz", + "integrity": "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==", + "dev": true, + "license": "ISC" + }, + "node_modules/graphemer": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/graphemer/-/graphemer-1.4.0.tgz", + "integrity": "sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag==", + "dev": true, + "license": "MIT" + }, + "node_modules/gunzip-maybe": { + "version": "1.4.2", + "resolved": "https://registry.npmjs.org/gunzip-maybe/-/gunzip-maybe-1.4.2.tgz", + "integrity": "sha512-4haO1M4mLO91PW57BMsDFf75UmwoRX0GkdD+Faw+Lr+r/OZrOCS0pIBwOL1xCKQqnQzbNFGgK2V2CpBUPeFNTw==", + "dev": true, + "license": "MIT", + "dependencies": { + "browserify-zlib": "^0.1.4", + "is-deflate": "^1.0.0", + "is-gzip": "^1.0.0", + "peek-stream": "^1.1.0", + "pumpify": "^1.3.3", + "through2": "^2.0.3" + }, + "bin": { + "gunzip-maybe": "bin.js" + } + }, + "node_modules/has-bigints": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/has-bigints/-/has-bigints-1.0.2.tgz", + "integrity": "sha512-tSvCKtBr9lkF0Ex0aQiP9N+OpV4zi2r/Nee5VkRDbaqv35RLYMzbwQfFSZZH0kR+Rd6302UJZ2p/bJCEoR3VoQ==", + "dev": true, + "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==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/has-property-descriptors": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/has-property-descriptors/-/has-property-descriptors-1.0.2.tgz", + "integrity": "sha512-55JNKuIW+vq4Ke1BjOTjM2YctQIvCT7GFzHwmfZPGo5wnrgkid0YQtnAleFSqumZm4az3n2BS+erby5ipJdgrg==", + "dev": true, + "license": "MIT", + "dependencies": { + "es-define-property": "^1.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/has-proto": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/has-proto/-/has-proto-1.0.3.tgz", + "integrity": "sha512-SJ1amZAJUiZS+PhsVLf5tGydlaVB8EdFpaSO4gmiUKUOxk8qzn5AIy4ZeJUmh22znIdk/uMAUT2pl3FxzVUH+Q==", + "dev": true, + "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==", + "dev": true, + "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", + "peer": true, + "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", + "peer": true, + "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", + "peer": true, + "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", + "peer": true, + "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", + "peer": true, + "dependencies": { + "is-buffer": "^1.1.5" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/hasown": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.2.tgz", + "integrity": "sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "function-bind": "^1.1.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/hast-util-to-estree": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/hast-util-to-estree/-/hast-util-to-estree-3.1.0.tgz", + "integrity": "sha512-lfX5g6hqVh9kjS/B9E2gSkvHH4SZNiQFiqWS0x9fENzEl+8W12RqdRxX6d/Cwxi30tPQs3bIO+aolQJNp1bIyw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/estree": "^1.0.0", + "@types/estree-jsx": "^1.0.0", + "@types/hast": "^3.0.0", + "comma-separated-tokens": "^2.0.0", + "devlop": "^1.0.0", + "estree-util-attach-comments": "^3.0.0", + "estree-util-is-identifier-name": "^3.0.0", + "hast-util-whitespace": "^3.0.0", + "mdast-util-mdx-expression": "^2.0.0", + "mdast-util-mdx-jsx": "^3.0.0", + "mdast-util-mdxjs-esm": "^2.0.0", + "property-information": "^6.0.0", + "space-separated-tokens": "^2.0.0", + "style-to-object": "^0.4.0", + "unist-util-position": "^5.0.0", + "zwitch": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/hast-util-to-estree/node_modules/inline-style-parser": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/inline-style-parser/-/inline-style-parser-0.1.1.tgz", + "integrity": "sha512-7NXolsK4CAS5+xvdj5OMMbI962hU/wvwoxk+LWR9Ek9bVtyuuYScDN6eS0rUm6TxApFpw7CX1o4uJzcd4AyD3Q==", + "dev": true, + "license": "MIT" + }, + "node_modules/hast-util-to-estree/node_modules/style-to-object": { + "version": "0.4.4", + "resolved": "https://registry.npmjs.org/style-to-object/-/style-to-object-0.4.4.tgz", + "integrity": "sha512-HYNoHZa2GorYNyqiCaBgsxvcJIn7OHq6inEga+E6Ke3m5JkoqpQbnFssk4jwe+K7AhGa2fcha4wSOf1Kn01dMg==", + "dev": true, + "license": "MIT", + "dependencies": { + "inline-style-parser": "0.1.1" + } + }, + "node_modules/hast-util-to-jsx-runtime": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/hast-util-to-jsx-runtime/-/hast-util-to-jsx-runtime-2.3.2.tgz", + "integrity": "sha512-1ngXYb+V9UT5h+PxNRa1O1FYguZK/XL+gkeqvp7EdHlB9oHUG0eYRo/vY5inBdcqo3RkPMC58/H94HvkbfGdyg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/estree": "^1.0.0", + "@types/hast": "^3.0.0", + "@types/unist": "^3.0.0", + "comma-separated-tokens": "^2.0.0", + "devlop": "^1.0.0", + "estree-util-is-identifier-name": "^3.0.0", + "hast-util-whitespace": "^3.0.0", + "mdast-util-mdx-expression": "^2.0.0", + "mdast-util-mdx-jsx": "^3.0.0", + "mdast-util-mdxjs-esm": "^2.0.0", + "property-information": "^6.0.0", + "space-separated-tokens": "^2.0.0", + "style-to-object": "^1.0.0", + "unist-util-position": "^5.0.0", + "vfile-message": "^4.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/hast-util-whitespace": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/hast-util-whitespace/-/hast-util-whitespace-3.0.0.tgz", + "integrity": "sha512-88JUN06ipLwsnv+dVn+OIYOvAuvBMy/Qoi6O7mQHxdPXpjy+Cd6xRkWwux7DKO+4sYILtLBRIKgsdpS2gQc7qw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/hast": "^3.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/he": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/he/-/he-1.2.0.tgz", + "integrity": "sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw==", + "dev": true, + "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/homedir-polyfill": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/homedir-polyfill/-/homedir-polyfill-1.0.3.tgz", + "integrity": "sha512-eSmmWE5bZTK2Nou4g0AI3zZ9rswp7GRKoKXS1BLUkvPviOqs4YTN1djQIqrXy9k5gEtdLPy86JjRwsNM9tnDcA==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "parse-passwd": "^1.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "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/html-encoding-sniffer": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/html-encoding-sniffer/-/html-encoding-sniffer-3.0.0.tgz", + "integrity": "sha512-oWv4T4yJ52iKrufjnyZPkrN0CH3QnrUqdB6In1g5Fe1mia8GmF36gnfNySxoZtxD5+NmYw1EElVXiBk93UeskA==", + "dev": true, + "license": "MIT", + "dependencies": { + "whatwg-encoding": "^2.0.0" + }, + "engines": { + "node": ">=12" + } + }, + "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-terser": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/html-minifier-terser/-/html-minifier-terser-6.1.0.tgz", + "integrity": "sha512-YXxSlJBZTP7RS3tWnQw74ooKa6L9b9i9QYXY21eUEvhZ3u9XLfv6OnFsQq6RxkhHygsaUMvYsZRV5rU/OVNZxw==", + "dev": true, + "license": "MIT", + "dependencies": { + "camel-case": "^4.1.2", + "clean-css": "^5.2.2", + "commander": "^8.3.0", + "he": "^1.2.0", + "param-case": "^3.0.4", + "relateurl": "^0.2.7", + "terser": "^5.10.0" + }, + "bin": { + "html-minifier-terser": "cli.js" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/html-minifier-terser/node_modules/commander": { + "version": "8.3.0", + "resolved": "https://registry.npmjs.org/commander/-/commander-8.3.0.tgz", + "integrity": "sha512-OkTL9umf+He2DZkUq8f8J9of7yL6RJKI24dVITBmNfZBmri9zYZQrKkuXiKhyfPSu8tUhnVBB1iKXevvnlR4Ww==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 12" + } + }, + "node_modules/html-webpack-plugin": { + "version": "5.6.3", + "resolved": "https://registry.npmjs.org/html-webpack-plugin/-/html-webpack-plugin-5.6.3.tgz", + "integrity": "sha512-QSf1yjtSAsmf7rYBV7XX86uua4W/vkhIt0xNXKbsi2foEeW7vjJQz4bhnpL3xH+l1ryl1680uNv968Z+X6jSYg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/html-minifier-terser": "^6.0.0", + "html-minifier-terser": "^6.0.2", + "lodash": "^4.17.21", + "pretty-error": "^4.0.0", + "tapable": "^2.0.0" + }, + "engines": { + "node": ">=10.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/html-webpack-plugin" + }, + "peerDependencies": { + "@rspack/core": "0.x || 1.x", + "webpack": "^5.20.0" + }, + "peerDependenciesMeta": { + "@rspack/core": { + "optional": true + }, + "webpack": { + "optional": true + } + } + }, + "node_modules/htmlparser2": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/htmlparser2/-/htmlparser2-6.1.0.tgz", + "integrity": "sha512-gyyPk6rgonLFEDGoeRgQNaEUvdJ4ktTmmUh/h2t7s+M8oPpIPxgNACWa+6ESR57kXstwqPiCut0V8NRpcwgU7A==", + "dev": true, + "funding": [ + "https://github.com/fb55/htmlparser2?sponsor=1", + { + "type": "github", + "url": "https://github.com/sponsors/fb55" + } + ], + "license": "MIT", + "dependencies": { + "domelementtype": "^2.0.1", + "domhandler": "^4.0.0", + "domutils": "^2.5.2", + "entities": "^2.0.0" + } + }, + "node_modules/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-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==", + "dev": true, + "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-server": { + "version": "14.1.1", + "resolved": "https://registry.npmjs.org/http-server/-/http-server-14.1.1.tgz", + "integrity": "sha512-+cbxadF40UXd9T01zUHgA+rlo2Bg1Srer4+B4NwIHdaGxAGGv59nYRnGGDJ9LBk7alpS0US+J+bLLdQOOkJq4A==", + "dev": true, + "license": "MIT", + "dependencies": { + "basic-auth": "^2.0.1", + "chalk": "^4.1.2", + "corser": "^2.0.1", + "he": "^1.2.0", + "html-encoding-sniffer": "^3.0.0", + "http-proxy": "^1.18.1", + "mime": "^1.6.0", + "minimist": "^1.2.6", + "opener": "^1.5.1", + "portfinder": "^1.0.28", + "secure-compare": "3.0.1", + "union": "~0.5.0", + "url-join": "^4.0.1" + }, + "bin": { + "http-server": "bin/http-server" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/http-server/node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "license": "MIT", + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/http-server/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/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-proxy-agent": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-5.0.1.tgz", + "integrity": "sha512-dFcAjpTQFgoLMzC2VwU+C/CbS7uRL0lWmxDITmqm7C+7F0Odmj6s9l6alZc6AELXhrnggM2CeWSXHGOdX2YtwA==", + "dev": true, + "license": "MIT", + "dependencies": { + "agent-base": "6", + "debug": "4" + }, + "engines": { + "node": ">= 6" + } + }, + "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==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": ">=10.17.0" + } + }, + "node_modules/husky": { + "version": "9.1.7", + "resolved": "https://registry.npmjs.org/husky/-/husky-9.1.7.tgz", + "integrity": "sha512-5gs5ytaNjBrh5Ow3zrvdUUY+0VxIuWVL4i9irt6friV+BqdCfmV11CQTWMiBYWHbXhco+J1kHfTOUkePhCDvMA==", + "dev": true, + "license": "MIT", + "bin": { + "husky": "bin.js" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/typicode" + } + }, + "node_modules/iconv-lite": { + "version": "0.4.24", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", + "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", + "dev": true, + "license": "MIT", + "dependencies": { + "safer-buffer": ">= 2.1.2 < 3" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/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==", + "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": "BSD-3-Clause" + }, + "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/immediate": { + "version": "3.0.6", + "resolved": "https://registry.npmjs.org/immediate/-/immediate-3.0.6.tgz", + "integrity": "sha512-XXOFtyqDjNDAQxVfYxuF7g9Il/IbWmmlQg2MYKOH8ExIT1qg6xc4zyS3HaEEATgs1btfzxq15ciUiY7gjSXRGQ==", + "dev": true, + "license": "MIT" + }, + "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/import-local": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/import-local/-/import-local-3.2.0.tgz", + "integrity": "sha512-2SPlun1JUPWoM6t3F0dw0FkCF/jWY8kttcY4f599GLTSjh2OCuuhdTkJQsEcZzBqbXZGKMK2OqW1oZsjtf/gQA==", + "dev": true, + "license": "MIT", + "dependencies": { + "pkg-dir": "^4.2.0", + "resolve-cwd": "^3.0.0" + }, + "bin": { + "import-local-fixture": "fixtures/cli.js" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/import-local/node_modules/pkg-dir": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-4.2.0.tgz", + "integrity": "sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "find-up": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/imurmurhash": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", + "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/inflight": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", + "integrity": "sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==", + "deprecated": "This module is not supported, and leaks memory. Do not use it. Check out lru-cache if you want a good and tested way to coalesce async requests by a key value, which is much more comprehensive and powerful.", + "dev": true, + "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==", + "dev": true, + "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==", + "dev": true, + "license": "ISC", + "peer": true + }, + "node_modules/inline-style-parser": { + "version": "0.2.4", + "resolved": "https://registry.npmjs.org/inline-style-parser/-/inline-style-parser-0.2.4.tgz", + "integrity": "sha512-0aO8FkhNZlj/ZIbNi7Lxxr12obT7cL1moPfE4tg1LkX7LlLfC6DeX4l2ZEud1ukP9jNQyNnfzQVqwbwmAATY4Q==", + "dev": true, + "license": "MIT" + }, + "node_modules/inquirer": { + "version": "9.3.7", + "resolved": "https://registry.npmjs.org/inquirer/-/inquirer-9.3.7.tgz", + "integrity": "sha512-LJKFHCSeIRq9hanN14IlOtPSTe3lNES7TYDTE2xxdAy1LS5rYphajK1qtwvj3YmQXvvk0U2Vbmcni8P9EIQW9w==", + "dev": true, + "license": "MIT", + "dependencies": { + "@inquirer/figures": "^1.0.3", + "ansi-escapes": "^4.3.2", + "cli-width": "^4.1.0", + "external-editor": "^3.1.0", + "mute-stream": "1.0.0", + "ora": "^5.4.1", + "run-async": "^3.0.0", + "rxjs": "^7.8.1", + "string-width": "^4.2.3", + "strip-ansi": "^6.0.1", + "wrap-ansi": "^6.2.0", + "yoctocolors-cjs": "^2.1.2" + }, + "engines": { + "node": ">=18" + } + }, + "node_modules/inquirer/node_modules/strip-ansi": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "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/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", + "peer": true, + "dependencies": { + "hasown": "^2.0.0" + }, + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/is-alphabetical": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/is-alphabetical/-/is-alphabetical-2.0.1.tgz", + "integrity": "sha512-FWyyY60MeTNyeSRpkM2Iry0G9hpr7/9kD40mD/cGQEuilcZYS4okz8SN2Q6rLCJ8gbCt6fN+rC+6tMGS99LaxQ==", + "dev": true, + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/is-alphanumerical": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/is-alphanumerical/-/is-alphanumerical-2.0.1.tgz", + "integrity": "sha512-hmbYhX/9MUMF5uh7tOXyK/n0ZvWpad5caBA17GsC6vyuCqaWliRG5K1qS9inmUhEMaOBIW7/whAnSwveW/LtZw==", + "dev": true, + "license": "MIT", + "dependencies": { + "is-alphabetical": "^2.0.0", + "is-decimal": "^2.0.0" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/is-arguments": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/is-arguments/-/is-arguments-1.1.1.tgz", + "integrity": "sha512-8Q7EARjzEnKpt/PCD7e1cgUS0a6X8u5tdSiMqXhojOdoV9TsMsiO+9VLC5vAmO8N7/GmXn7yjR8qnA6bVAEzfA==", + "dev": true, + "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-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-async-function": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/is-async-function/-/is-async-function-2.0.0.tgz", + "integrity": "sha512-Y1JXKrfykRJGdlDwdKlLpLyMIiWqWvuSd17TvZk68PLAOGOoF4Xyav1z0Xhoi+gCYjZVeC5SI+hYFOfvXmGRCA==", + "dev": true, + "license": "MIT", + "dependencies": { + "has-tostringtag": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-bigint": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/is-bigint/-/is-bigint-1.0.4.tgz", + "integrity": "sha512-zB9CruMamjym81i2JZ3UMn54PKGsQzsJeo6xvN3HJJ4CAsQNB6iRutp2To77OfCNuoxspsIhzaPoO1zyCEhFOg==", + "dev": true, + "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==", + "dev": true, + "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", + "peer": true + }, + "node_modules/is-callable": { + "version": "1.2.7", + "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.2.7.tgz", + "integrity": "sha512-1BC0BVFhS/p0qtw6enp8e+8OD0UrK0oFLztSjNzhcKA3WDuJxxAPXzPuPtKkjEY9UUoEWlX/8fgKeu2S8i9JTA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-core-module": { + "version": "2.15.1", + "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.15.1.tgz", + "integrity": "sha512-z0vtXSwucUJtANQWldhbtbt7BnL0vxiFjIdDLAatwhDYty2bad6s+rijD6Ri4YuYJubLzIJLUidCh09e1djEVQ==", + "dev": true, + "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", + "peer": true, + "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-decimal": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/is-decimal/-/is-decimal-2.0.1.tgz", + "integrity": "sha512-AAB9hiomQs5DXWcRB1rqsxGUstbRroFOPPVAomNk/3XHR5JyEZChOyTWe2oayKnsSsr/kcGqF+z6yuH6HHpN0A==", + "dev": true, + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/is-deflate": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-deflate/-/is-deflate-1.0.0.tgz", + "integrity": "sha512-YDoFpuZWu1VRXlsnlYMzKyVRITXj7Ej/V9gXQ2/pAe7X1J7M/RNOqaIYi6qUn+B7nGyB9pDXrv02dsB58d2ZAQ==", + "dev": true, + "license": "MIT" + }, + "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", + "peer": true, + "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", + "peer": true, + "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==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-finalizationregistry": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-finalizationregistry/-/is-finalizationregistry-1.1.0.tgz", + "integrity": "sha512-qfMdqbAQEwBw78ZyReKnlA8ezmPdb9BemzIIip/JkjaZUhitfXDkkr+3QTboW0JrSXT1QWyYShpvnNHGZ4c4yA==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.7" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-fullwidth-code-point": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-4.0.0.tgz", + "integrity": "sha512-O4L094N2/dZ7xqVdrXhh9r1KODPJpFms8B5sGdJLPy664AgvXsreZUyCQQNItZRDlYug4xStLjNp/sz3HvBowQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/is-generator-fn": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-generator-fn/-/is-generator-fn-2.1.0.tgz", + "integrity": "sha512-cTIB4yPYL/Grw0EaSzASzg6bBy9gqCofvWN8okThAYIxKJZC+udlRAmGbM0XLeniEJSs8uEgHPGuHSe1XsOLSQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/is-generator-function": { + "version": "1.0.10", + "resolved": "https://registry.npmjs.org/is-generator-function/-/is-generator-function-1.0.10.tgz", + "integrity": "sha512-jsEjy9l3yiXEQ+PsXdmBwEPcOxaXWLspKdplFUVI9vq1iZgIekeC0L167qeu86czQaxed3q/Uzuw0swL0irL8A==", + "dev": true, + "license": "MIT", + "dependencies": { + "has-tostringtag": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-glob": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", + "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", + "dev": true, + "license": "MIT", + "dependencies": { + "is-extglob": "^2.1.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-gzip": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-gzip/-/is-gzip-1.0.0.tgz", + "integrity": "sha512-rcfALRIb1YewtnksfRIHGcIY93QnK8BIQ/2c9yDYcG/Y6+vRoJuTWBmmSEbyLLYtXm7q35pHOHbZFQBaLrhlWQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-hexadecimal": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/is-hexadecimal/-/is-hexadecimal-2.0.1.tgz", + "integrity": "sha512-DgZQp241c8oO6cA1SbTEWiXeoxV42vlcJxgH+B3hi1AiqqKruZR3ZGF8In3fj4+/y/7rHvlOZLZtgJ/4ttYGZg==", + "dev": true, + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/is-interactive": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-interactive/-/is-interactive-1.0.0.tgz", + "integrity": "sha512-2HvIEKRoqS62guEC+qBjpvRubdX910WCMuJTZ+I9yvqKU2/12eSL549HMwtabb4oupdj2sMP50k+XJfB/8JE6w==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/is-map": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/is-map/-/is-map-2.0.3.tgz", + "integrity": "sha512-1Qed0/Hr2m+YqxnM09CjA2d/i6YZNfF6R2oRAOj36eUdS6qIV/huPJNSEpKbupewFs+ZsJlxsjjPbc0/afW6Lw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-module": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-module/-/is-module-1.0.0.tgz", + "integrity": "sha512-51ypPSPCoTEIN9dy5Oy+h4pShgJmPCygKfyRCISBI+JoWT/2oJvK8QPxmwv7b/p239jXrm9M1mlQbyKJ5A152g==", + "dev": true, + "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==", + "dev": true, + "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-path-inside": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/is-path-inside/-/is-path-inside-3.0.3.tgz", + "integrity": "sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/is-plain-obj": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-4.1.0.tgz", + "integrity": "sha512-+Pgi+vMuUNkJyExiMBt5IlFoMyKnr5zhJ4Uspz58WOhBF5QoIZkFyNHIbBAtHwzVAgk5RtndVNsDRN61/mmDqg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12" + }, + "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", + "peer": true, + "dependencies": { + "isobject": "^3.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-reference": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/is-reference/-/is-reference-1.2.1.tgz", + "integrity": "sha512-U82MsXXiFIrjCK4otLT+o2NA2Cd2g5MLoOVXUZjIOhLurrRxpEXzI8O0KZHr3IjLvlAH1kTPYSuqer5T9ZVBKQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/estree": "*" + } + }, + "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-set": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/is-set/-/is-set-2.0.3.tgz", + "integrity": "sha512-iPAjerrse27/ygGLxw+EBR9agv9Y6uLeYVJMu+QNCoouJ1/1ri0mGrcWpfCqFZuzzx3WjtwxG098X+n4OuRkPg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-shared-array-buffer": { + "version": "1.0.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-stream": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-2.0.1.tgz", + "integrity": "sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==", + "dev": true, + "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-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-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-weakmap": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/is-weakmap/-/is-weakmap-2.0.2.tgz", + "integrity": "sha512-K5pXYOm9wqY1RgjpL3YTkF39tni1XajUIkawTLUo9EZEVUFga5gSQJF8nNS7ZwJQ02y+1YCNYcMh+HIf1ZqE+w==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-weakref": { + "version": "1.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-weakset": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/is-weakset/-/is-weakset-2.0.3.tgz", + "integrity": "sha512-LvIm3/KWzS9oRFHugab7d+M/GcBXuXX5xZkzPmN+NxihdQlZUQ4dWuSV1xR/sq6upL1TJEDrfBgRepHFdBtSNQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.7", + "get-intrinsic": "^1.2.4" + }, + "engines": { + "node": ">= 0.4" + }, + "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", + "peer": true, + "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": "2.0.5", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-2.0.5.tgz", + "integrity": "sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw==", + "dev": true, + "license": "MIT" + }, + "node_modules/isexe": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", + "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==", + "dev": true, + "license": "ISC" + }, + "node_modules/ismobilejs": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/ismobilejs/-/ismobilejs-1.1.1.tgz", + "integrity": "sha512-VaFW53yt8QO61k2WJui0dHf4SlL8lxBofUuUmwBo0ljPk0Drz2TiuDW4jo3wDcv41qy/SxrJ+VAzJ/qYqsmzRw==", + "dev": true, + "license": "MIT" + }, + "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", + "peer": true, + "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-instrument": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/istanbul-lib-instrument/-/istanbul-lib-instrument-5.2.1.tgz", + "integrity": "sha512-pzqtp31nLv/XFOzXGuvhCb8qhjmTVo5vjVk19XE4CRlSWz0KoeJ3bw9XsA7nOp9YBf4qHjwBxkDzKcME/J29Yg==", + "dev": true, + "license": "BSD-3-Clause", + "dependencies": { + "@babel/core": "^7.12.3", + "@babel/parser": "^7.14.7", + "@istanbuljs/schema": "^0.1.2", + "istanbul-lib-coverage": "^3.2.0", + "semver": "^6.3.0" + }, + "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-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-lib-source-maps/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==", + "dev": true, + "license": "BSD-3-Clause", + "engines": { + "node": ">=0.10.0" + } + }, + "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==", + "dev": true, + "license": "BlueOak-1.0.0", + "dependencies": { + "@isaacs/cliui": "^8.0.2" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + }, + "optionalDependencies": { + "@pkgjs/parseargs": "^0.11.0" + } + }, + "node_modules/jake": { + "version": "10.9.2", + "resolved": "https://registry.npmjs.org/jake/-/jake-10.9.2.tgz", + "integrity": "sha512-2P4SQ0HrLQ+fw6llpLnOaGAvN2Zu6778SJMrCUwns4fOoG9ayrTiZk3VV8sCPkVZF8ab0zksVpS8FDY5pRCNBA==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "async": "^3.2.3", + "chalk": "^4.0.2", + "filelist": "^1.0.4", + "minimatch": "^3.1.2" + }, + "bin": { + "jake": "bin/cli.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/jake/node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "license": "MIT", + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/jake/node_modules/async": { + "version": "3.2.6", + "resolved": "https://registry.npmjs.org/async/-/async-3.2.6.tgz", + "integrity": "sha512-htCUDlxyyCLMgaM3xXg0C0LW2xqfuQ6p05pCEIsXuyQ+a1koYKTuBMzRNwmybfLgvJDMd0r1LTn4+E0Ti6C2AA==", + "dev": true, + "license": "MIT" + }, + "node_modules/jake/node_modules/brace-expansion": { + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", + "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "dev": true, + "license": "MIT", + "dependencies": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "node_modules/jake/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/jake/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/jest": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest/-/jest-29.7.0.tgz", + "integrity": "sha512-NIy3oAFp9shda19hy4HK0HRTWKtPJmGdnvywu01nOqNC2vZg+Z+fvJDxpMQA88eb2I9EcafcdjYgsDthnYTvGw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/core": "^29.7.0", + "@jest/types": "^29.6.3", + "import-local": "^3.0.2", + "jest-cli": "^29.7.0" + }, + "bin": { + "jest": "bin/jest.js" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + }, + "peerDependencies": { + "node-notifier": "^8.0.1 || ^9.0.0 || ^10.0.0" + }, + "peerDependenciesMeta": { + "node-notifier": { + "optional": true + } + } + }, + "node_modules/jest-changed-files": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-changed-files/-/jest-changed-files-29.7.0.tgz", + "integrity": "sha512-fEArFiwf1BpQ+4bXSprcDc3/x4HSzL4al2tozwVpDFpsxALjLYdyiIK4e5Vz66GQJIbXJ82+35PtysofptNX2w==", + "dev": true, + "license": "MIT", + "dependencies": { + "execa": "^5.0.0", + "jest-util": "^29.7.0", + "p-limit": "^3.1.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-circus": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-circus/-/jest-circus-29.7.0.tgz", + "integrity": "sha512-3E1nCMgipcTkCocFwM90XXQab9bS+GMsjdpmPrlelaxwD93Ad8iVEjX/vvHPdLPnFf+L40u+5+iutRdA1N9myw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/environment": "^29.7.0", + "@jest/expect": "^29.7.0", + "@jest/test-result": "^29.7.0", + "@jest/types": "^29.6.3", + "@types/node": "*", + "chalk": "^4.0.0", + "co": "^4.6.0", + "dedent": "^1.0.0", + "is-generator-fn": "^2.0.0", + "jest-each": "^29.7.0", + "jest-matcher-utils": "^29.7.0", + "jest-message-util": "^29.7.0", + "jest-runtime": "^29.7.0", + "jest-snapshot": "^29.7.0", + "jest-util": "^29.7.0", + "p-limit": "^3.1.0", + "pretty-format": "^29.7.0", + "pure-rand": "^6.0.0", + "slash": "^3.0.0", + "stack-utils": "^2.0.3" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-circus/node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/jest-circus/node_modules/chalk/node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "license": "MIT", + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/jest-circus/node_modules/pretty-format": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-29.7.0.tgz", + "integrity": "sha512-Pdlw/oPxN+aXdmM9R00JVC9WVFoCLTKJvDVLgmJ+qAffBMxsV85l/Lu7sNx4zSzPyoL2euImuEwHhOXdEgNFZQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/schemas": "^29.6.3", + "ansi-styles": "^5.0.0", + "react-is": "^18.0.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-circus/node_modules/react-is": { + "version": "18.3.1", + "resolved": "https://registry.npmjs.org/react-is/-/react-is-18.3.1.tgz", + "integrity": "sha512-/LLMVyas0ljjAtoYiPqYiL8VWXzUUdThrmU5+n20DZv+a+ClRoevUzw5JxU+Ieh5/c87ytoTBV9G1FiKfNJdmg==", + "dev": true, + "license": "MIT" + }, + "node_modules/jest-cli": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-cli/-/jest-cli-29.7.0.tgz", + "integrity": "sha512-OVVobw2IubN/GSYsxETi+gOe7Ka59EFMR/twOU3Jb2GnKKeMGJB5SGUUrEz3SFVmJASUdZUzy83sLNNQ2gZslg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/core": "^29.7.0", + "@jest/test-result": "^29.7.0", + "@jest/types": "^29.6.3", + "chalk": "^4.0.0", + "create-jest": "^29.7.0", + "exit": "^0.1.2", + "import-local": "^3.0.2", + "jest-config": "^29.7.0", + "jest-util": "^29.7.0", + "jest-validate": "^29.7.0", + "yargs": "^17.3.1" + }, + "bin": { + "jest": "bin/jest.js" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + }, + "peerDependencies": { + "node-notifier": "^8.0.1 || ^9.0.0 || ^10.0.0" + }, + "peerDependenciesMeta": { + "node-notifier": { + "optional": true + } + } + }, + "node_modules/jest-cli/node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "license": "MIT", + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/jest-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==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/jest-cli/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==", + "dev": true, + "license": "ISC", + "dependencies": { + "string-width": "^4.2.0", + "strip-ansi": "^6.0.1", + "wrap-ansi": "^7.0.0" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/jest-cli/node_modules/strip-ansi": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/jest-cli/node_modules/wrap-ansi": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", + "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-styles": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/wrap-ansi?sponsor=1" + } + }, + "node_modules/jest-cli/node_modules/yargs": { + "version": "17.7.2", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-17.7.2.tgz", + "integrity": "sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w==", + "dev": true, + "license": "MIT", + "dependencies": { + "cliui": "^8.0.1", + "escalade": "^3.1.1", + "get-caller-file": "^2.0.5", + "require-directory": "^2.1.1", + "string-width": "^4.2.3", + "y18n": "^5.0.5", + "yargs-parser": "^21.1.1" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/jest-config": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-config/-/jest-config-29.7.0.tgz", + "integrity": "sha512-uXbpfeQ7R6TZBqI3/TxCU4q4ttk3u0PJeC+E0zbfSoSjq6bJ7buBPxzQPL0ifrkY4DNu4JUdk0ImlBUYi840eQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/core": "^7.11.6", + "@jest/test-sequencer": "^29.7.0", + "@jest/types": "^29.6.3", + "babel-jest": "^29.7.0", + "chalk": "^4.0.0", + "ci-info": "^3.2.0", + "deepmerge": "^4.2.2", + "glob": "^7.1.3", + "graceful-fs": "^4.2.9", + "jest-circus": "^29.7.0", + "jest-environment-node": "^29.7.0", + "jest-get-type": "^29.6.3", + "jest-regex-util": "^29.6.3", + "jest-resolve": "^29.7.0", + "jest-runner": "^29.7.0", + "jest-util": "^29.7.0", + "jest-validate": "^29.7.0", + "micromatch": "^4.0.4", + "parse-json": "^5.2.0", + "pretty-format": "^29.7.0", + "slash": "^3.0.0", + "strip-json-comments": "^3.1.1" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + }, + "peerDependencies": { + "@types/node": "*", + "ts-node": ">=9.0.0" + }, + "peerDependenciesMeta": { + "@types/node": { + "optional": true + }, + "ts-node": { + "optional": true + } + } + }, + "node_modules/jest-config/node_modules/brace-expansion": { + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", + "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "dev": true, + "license": "MIT", + "dependencies": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "node_modules/jest-config/node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/jest-config/node_modules/chalk/node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "license": "MIT", + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/jest-config/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", + "dev": true, + "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/jest-config/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/jest-config/node_modules/pretty-format": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-29.7.0.tgz", + "integrity": "sha512-Pdlw/oPxN+aXdmM9R00JVC9WVFoCLTKJvDVLgmJ+qAffBMxsV85l/Lu7sNx4zSzPyoL2euImuEwHhOXdEgNFZQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/schemas": "^29.6.3", + "ansi-styles": "^5.0.0", + "react-is": "^18.0.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-config/node_modules/react-is": { + "version": "18.3.1", + "resolved": "https://registry.npmjs.org/react-is/-/react-is-18.3.1.tgz", + "integrity": "sha512-/LLMVyas0ljjAtoYiPqYiL8VWXzUUdThrmU5+n20DZv+a+ClRoevUzw5JxU+Ieh5/c87ytoTBV9G1FiKfNJdmg==", + "dev": true, + "license": "MIT" + }, + "node_modules/jest-diff": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/jest-diff/-/jest-diff-27.5.1.tgz", + "integrity": "sha512-m0NvkX55LDt9T4mctTEgnZk3fmEg3NRYutvMPWM/0iPnkFj2wIeF45O1718cMSOFO1vINkqmxqD8vE37uTEbqw==", + "dev": true, + "license": "MIT", + "dependencies": { + "chalk": "^4.0.0", + "diff-sequences": "^27.5.1", + "jest-get-type": "^27.5.1", + "pretty-format": "^27.5.1" + }, + "engines": { + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + } + }, + "node_modules/jest-diff/node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "license": "MIT", + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/jest-diff/node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/jest-diff/node_modules/jest-get-type": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/jest-get-type/-/jest-get-type-27.5.1.tgz", + "integrity": "sha512-2KY95ksYSaK7DMBWQn6dQz3kqAf3BB64y2udeG+hv4KfSOb9qwcYQstTJc1KCbsix+wLZWZYN8t7nwX3GOBLRw==", + "dev": true, + "license": "MIT", + "engines": { + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + } + }, + "node_modules/jest-docblock": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-docblock/-/jest-docblock-29.7.0.tgz", + "integrity": "sha512-q617Auw3A612guyaFgsbFeYpNP5t2aoUNLwBUbc/0kD1R4t9ixDbyFTHd1nok4epoVFpr7PmeWHrhvuV3XaJ4g==", + "dev": true, + "license": "MIT", + "dependencies": { + "detect-newline": "^3.0.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-each": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-each/-/jest-each-29.7.0.tgz", + "integrity": "sha512-gns+Er14+ZrEoC5fhOfYCY1LOHHr0TI+rQUHZS8Ttw2l7gl+80eHc/gFf2Ktkw0+SIACDTeWvpFcv3B04VembQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/types": "^29.6.3", + "chalk": "^4.0.0", + "jest-get-type": "^29.6.3", + "jest-util": "^29.7.0", + "pretty-format": "^29.7.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-each/node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/jest-each/node_modules/chalk/node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "license": "MIT", + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/jest-each/node_modules/pretty-format": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-29.7.0.tgz", + "integrity": "sha512-Pdlw/oPxN+aXdmM9R00JVC9WVFoCLTKJvDVLgmJ+qAffBMxsV85l/Lu7sNx4zSzPyoL2euImuEwHhOXdEgNFZQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/schemas": "^29.6.3", + "ansi-styles": "^5.0.0", + "react-is": "^18.0.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-each/node_modules/react-is": { + "version": "18.3.1", + "resolved": "https://registry.npmjs.org/react-is/-/react-is-18.3.1.tgz", + "integrity": "sha512-/LLMVyas0ljjAtoYiPqYiL8VWXzUUdThrmU5+n20DZv+a+ClRoevUzw5JxU+Ieh5/c87ytoTBV9G1FiKfNJdmg==", + "dev": true, + "license": "MIT" + }, + "node_modules/jest-environment-node": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-environment-node/-/jest-environment-node-29.7.0.tgz", + "integrity": "sha512-DOSwCRqXirTOyheM+4d5YZOrWcdu0LNZ87ewUoywbcb2XR4wKgqiG8vNeYwhjFMbEkfju7wx2GYH0P2gevGvFw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/environment": "^29.7.0", + "@jest/fake-timers": "^29.7.0", + "@jest/types": "^29.6.3", + "@types/node": "*", + "jest-mock": "^29.7.0", + "jest-util": "^29.7.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-extended": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/jest-extended/-/jest-extended-1.2.1.tgz", + "integrity": "sha512-eKZR5iDpyTkcDesj16FpIPnjAWQNUB81ZFQW08EIddM6iqO7DjRIi39td9qol+1dpJS4Mqr9Qzp8ZMhanbSeug==", + "dev": true, + "license": "MIT", + "dependencies": { + "expect": "^26.6.2", + "jest-diff": "^27.2.5", + "jest-get-type": "^27.0.6", + "jest-matcher-utils": "^27.2.4" + }, + "engines": { + "node": "^12.13.0 || ^14.15.0 || >=16.0.0" + } + }, + "node_modules/jest-extended/node_modules/@jest/types": { + "version": "26.6.2", + "resolved": "https://registry.npmjs.org/@jest/types/-/types-26.6.2.tgz", + "integrity": "sha512-fC6QCp7Sc5sX6g8Tvbmj4XUTbyrik0akgRy03yjXbQaBWWNWGE7SGtJk98m0N8nzegD/7SggrUlivxo5ax4KWQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/istanbul-lib-coverage": "^2.0.0", + "@types/istanbul-reports": "^3.0.0", + "@types/node": "*", + "@types/yargs": "^15.0.0", + "chalk": "^4.0.0" + }, + "engines": { + "node": ">= 10.14.2" + } + }, + "node_modules/jest-extended/node_modules/@types/yargs": { + "version": "15.0.19", + "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-15.0.19.tgz", + "integrity": "sha512-2XUaGVmyQjgyAZldf0D0c14vvo/yv0MhQBSTJcejMMaitsn3nxCB6TmH4G0ZQf+uxROOa9mpanoSm8h6SG/1ZA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/yargs-parser": "*" + } + }, + "node_modules/jest-extended/node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "license": "MIT", + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/jest-extended/node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/jest-extended/node_modules/diff-sequences": { + "version": "26.6.2", + "resolved": "https://registry.npmjs.org/diff-sequences/-/diff-sequences-26.6.2.tgz", + "integrity": "sha512-Mv/TDa3nZ9sbc5soK+OoA74BsS3mL37yixCvUAQkiuA4Wz6YtwP/K47n2rv2ovzHZvoiQeA5FTQOschKkEwB0Q==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 10.14.2" + } + }, + "node_modules/jest-extended/node_modules/expect": { + "version": "26.6.2", + "resolved": "https://registry.npmjs.org/expect/-/expect-26.6.2.tgz", + "integrity": "sha512-9/hlOBkQl2l/PLHJx6JjoDF6xPKcJEsUlWKb23rKE7KzeDqUZKXKNMW27KIue5JMdBV9HgmoJPcc8HtO85t9IA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/types": "^26.6.2", + "ansi-styles": "^4.0.0", + "jest-get-type": "^26.3.0", + "jest-matcher-utils": "^26.6.2", + "jest-message-util": "^26.6.2", + "jest-regex-util": "^26.0.0" + }, + "engines": { + "node": ">= 10.14.2" + } + }, + "node_modules/jest-extended/node_modules/expect/node_modules/jest-diff": { + "version": "26.6.2", + "resolved": "https://registry.npmjs.org/jest-diff/-/jest-diff-26.6.2.tgz", + "integrity": "sha512-6m+9Z3Gv9wN0WFVasqjCL/06+EFCMTqDEUl/b87HYK2rAPTyfz4ZIuSlPhY51PIQRWx5TaxeF1qmXKe9gfN3sA==", + "dev": true, + "license": "MIT", + "dependencies": { + "chalk": "^4.0.0", + "diff-sequences": "^26.6.2", + "jest-get-type": "^26.3.0", + "pretty-format": "^26.6.2" + }, + "engines": { + "node": ">= 10.14.2" + } + }, + "node_modules/jest-extended/node_modules/expect/node_modules/jest-get-type": { + "version": "26.3.0", + "resolved": "https://registry.npmjs.org/jest-get-type/-/jest-get-type-26.3.0.tgz", + "integrity": "sha512-TpfaviN1R2pQWkIihlfEanwOXK0zcxrKEE4MlU6Tn7keoXdN6/3gK/xl0yEh8DOunn5pOVGKf8hB4R9gVh04ig==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 10.14.2" + } + }, + "node_modules/jest-extended/node_modules/expect/node_modules/jest-matcher-utils": { + "version": "26.6.2", + "resolved": "https://registry.npmjs.org/jest-matcher-utils/-/jest-matcher-utils-26.6.2.tgz", + "integrity": "sha512-llnc8vQgYcNqDrqRDXWwMr9i7rS5XFiCwvh6DTP7Jqa2mqpcCBBlpCbn+trkG0KNhPu/h8rzyBkriOtBstvWhw==", + "dev": true, + "license": "MIT", + "dependencies": { + "chalk": "^4.0.0", + "jest-diff": "^26.6.2", + "jest-get-type": "^26.3.0", + "pretty-format": "^26.6.2" + }, + "engines": { + "node": ">= 10.14.2" + } + }, + "node_modules/jest-extended/node_modules/expect/node_modules/pretty-format": { + "version": "26.6.2", + "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-26.6.2.tgz", + "integrity": "sha512-7AeGuCYNGmycyQbCqd/3PWH4eOoX/OiCa0uphp57NVTeAGdJGaAliecxwBDHYQCIvrW7aDBZCYeNTP/WX69mkg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/types": "^26.6.2", + "ansi-regex": "^5.0.0", + "ansi-styles": "^4.0.0", + "react-is": "^17.0.1" + }, + "engines": { + "node": ">= 10" + } + }, + "node_modules/jest-extended/node_modules/jest-get-type": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/jest-get-type/-/jest-get-type-27.5.1.tgz", + "integrity": "sha512-2KY95ksYSaK7DMBWQn6dQz3kqAf3BB64y2udeG+hv4KfSOb9qwcYQstTJc1KCbsix+wLZWZYN8t7nwX3GOBLRw==", + "dev": true, + "license": "MIT", + "engines": { + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + } + }, + "node_modules/jest-extended/node_modules/jest-matcher-utils": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/jest-matcher-utils/-/jest-matcher-utils-27.5.1.tgz", + "integrity": "sha512-z2uTx/T6LBaCoNWNFWwChLBKYxTMcGBRjAt+2SbP929/Fflb9aa5LGma654Rz8z9HLxsrUaYzxE9T/EFIL/PAw==", + "dev": true, + "license": "MIT", + "dependencies": { + "chalk": "^4.0.0", + "jest-diff": "^27.5.1", + "jest-get-type": "^27.5.1", + "pretty-format": "^27.5.1" + }, + "engines": { + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + } + }, + "node_modules/jest-extended/node_modules/jest-message-util": { + "version": "26.6.2", + "resolved": "https://registry.npmjs.org/jest-message-util/-/jest-message-util-26.6.2.tgz", + "integrity": "sha512-rGiLePzQ3AzwUshu2+Rn+UMFk0pHN58sOG+IaJbk5Jxuqo3NYO1U2/MIR4S1sKgsoYSXSzdtSa0TgrmtUwEbmA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/code-frame": "^7.0.0", + "@jest/types": "^26.6.2", + "@types/stack-utils": "^2.0.0", + "chalk": "^4.0.0", + "graceful-fs": "^4.2.4", + "micromatch": "^4.0.2", + "pretty-format": "^26.6.2", + "slash": "^3.0.0", + "stack-utils": "^2.0.2" + }, + "engines": { + "node": ">= 10.14.2" + } + }, + "node_modules/jest-extended/node_modules/jest-message-util/node_modules/pretty-format": { + "version": "26.6.2", + "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-26.6.2.tgz", + "integrity": "sha512-7AeGuCYNGmycyQbCqd/3PWH4eOoX/OiCa0uphp57NVTeAGdJGaAliecxwBDHYQCIvrW7aDBZCYeNTP/WX69mkg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/types": "^26.6.2", + "ansi-regex": "^5.0.0", + "ansi-styles": "^4.0.0", + "react-is": "^17.0.1" + }, + "engines": { + "node": ">= 10" + } + }, + "node_modules/jest-extended/node_modules/jest-regex-util": { + "version": "26.0.0", + "resolved": "https://registry.npmjs.org/jest-regex-util/-/jest-regex-util-26.0.0.tgz", + "integrity": "sha512-Gv3ZIs/nA48/Zvjrl34bf+oD76JHiGDUxNOVgUjh3j890sblXryjY4rss71fPtD/njchl6PSE2hIhvyWa1eT0A==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 10.14.2" + } + }, + "node_modules/jest-get-type": { + "version": "29.6.3", + "resolved": "https://registry.npmjs.org/jest-get-type/-/jest-get-type-29.6.3.tgz", + "integrity": "sha512-zrteXnqYxfQh7l5FHyL38jL39di8H8rHoecLH3JNxH3BwOrBsNeabdap5e0I23lD4HHI8W5VFBZqG4Eaq5LNcw==", + "dev": true, + "license": "MIT", + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-haste-map": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-haste-map/-/jest-haste-map-29.7.0.tgz", + "integrity": "sha512-fP8u2pyfqx0K1rGn1R9pyE0/KTn+G7PxktWidOBTqFPLYX0b9ksaMFkhK5vrS3DVun09pckLdlx90QthlW7AmA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/types": "^29.6.3", + "@types/graceful-fs": "^4.1.3", + "@types/node": "*", + "anymatch": "^3.0.3", + "fb-watchman": "^2.0.0", + "graceful-fs": "^4.2.9", + "jest-regex-util": "^29.6.3", + "jest-util": "^29.7.0", + "jest-worker": "^29.7.0", + "micromatch": "^4.0.4", + "walker": "^1.0.8" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + }, + "optionalDependencies": { + "fsevents": "^2.3.2" + } + }, + "node_modules/jest-jasmine2": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-jasmine2/-/jest-jasmine2-29.7.0.tgz", + "integrity": "sha512-N3nRpBVTM5erHtMi6ODBUEqG/LpVgSJC8qk14duw88d9Eigx2vL+n4LF1d8eV8pegnnzKyNHdTGxa/NsIKj0Zw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/environment": "^29.7.0", + "@jest/expect": "^29.7.0", + "@jest/source-map": "^29.6.3", + "@jest/test-result": "^29.7.0", + "@jest/types": "^29.6.3", + "@types/node": "*", + "chalk": "^4.0.0", + "co": "^4.6.0", + "is-generator-fn": "^2.0.0", + "jest-each": "^29.7.0", + "jest-matcher-utils": "^29.7.0", + "jest-message-util": "^29.7.0", + "jest-runtime": "^29.7.0", + "jest-snapshot": "^29.7.0", + "jest-util": "^29.7.0", + "p-limit": "^3.1.0", + "pretty-format": "^29.7.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-jasmine2/node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/jest-jasmine2/node_modules/chalk/node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "license": "MIT", + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/jest-jasmine2/node_modules/pretty-format": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-29.7.0.tgz", + "integrity": "sha512-Pdlw/oPxN+aXdmM9R00JVC9WVFoCLTKJvDVLgmJ+qAffBMxsV85l/Lu7sNx4zSzPyoL2euImuEwHhOXdEgNFZQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/schemas": "^29.6.3", + "ansi-styles": "^5.0.0", + "react-is": "^18.0.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-jasmine2/node_modules/react-is": { + "version": "18.3.1", + "resolved": "https://registry.npmjs.org/react-is/-/react-is-18.3.1.tgz", + "integrity": "sha512-/LLMVyas0ljjAtoYiPqYiL8VWXzUUdThrmU5+n20DZv+a+ClRoevUzw5JxU+Ieh5/c87ytoTBV9G1FiKfNJdmg==", + "dev": true, + "license": "MIT" + }, + "node_modules/jest-leak-detector": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-leak-detector/-/jest-leak-detector-29.7.0.tgz", + "integrity": "sha512-kYA8IJcSYtST2BY9I+SMC32nDpBT3J2NvWJx8+JCuCdl/CR1I4EKUJROiP8XtCcxqgTTBGJNdbB1A8XRKbTetw==", + "dev": true, + "license": "MIT", + "dependencies": { + "jest-get-type": "^29.6.3", + "pretty-format": "^29.7.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-leak-detector/node_modules/pretty-format": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-29.7.0.tgz", + "integrity": "sha512-Pdlw/oPxN+aXdmM9R00JVC9WVFoCLTKJvDVLgmJ+qAffBMxsV85l/Lu7sNx4zSzPyoL2euImuEwHhOXdEgNFZQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/schemas": "^29.6.3", + "ansi-styles": "^5.0.0", + "react-is": "^18.0.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-leak-detector/node_modules/react-is": { + "version": "18.3.1", + "resolved": "https://registry.npmjs.org/react-is/-/react-is-18.3.1.tgz", + "integrity": "sha512-/LLMVyas0ljjAtoYiPqYiL8VWXzUUdThrmU5+n20DZv+a+ClRoevUzw5JxU+Ieh5/c87ytoTBV9G1FiKfNJdmg==", + "dev": true, + "license": "MIT" + }, + "node_modules/jest-matcher-utils": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-matcher-utils/-/jest-matcher-utils-29.7.0.tgz", + "integrity": "sha512-sBkD+Xi9DtcChsI3L3u0+N0opgPYnCRPtGcQYrgXmR+hmt/fYfWAL0xRXYU8eWOdfuLgBe0YCW3AFtnRLagq/g==", + "dev": true, + "license": "MIT", + "dependencies": { + "chalk": "^4.0.0", + "jest-diff": "^29.7.0", + "jest-get-type": "^29.6.3", + "pretty-format": "^29.7.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-matcher-utils/node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/jest-matcher-utils/node_modules/chalk/node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "license": "MIT", + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/jest-matcher-utils/node_modules/diff-sequences": { + "version": "29.6.3", + "resolved": "https://registry.npmjs.org/diff-sequences/-/diff-sequences-29.6.3.tgz", + "integrity": "sha512-EjePK1srD3P08o2j4f0ExnylqRs5B9tJjcp9t1krH2qRi8CCdsYfwe9JgSLurFBWwq4uOlipzfk5fHNvwFKr8Q==", + "dev": true, + "license": "MIT", + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-matcher-utils/node_modules/jest-diff": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-diff/-/jest-diff-29.7.0.tgz", + "integrity": "sha512-LMIgiIrhigmPrs03JHpxUh2yISK3vLFPkAodPeo0+BuF7wA2FoQbkEg1u8gBYBThncu7e1oEDUfIXVuTqLRUjw==", + "dev": true, + "license": "MIT", + "dependencies": { + "chalk": "^4.0.0", + "diff-sequences": "^29.6.3", + "jest-get-type": "^29.6.3", + "pretty-format": "^29.7.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-matcher-utils/node_modules/pretty-format": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-29.7.0.tgz", + "integrity": "sha512-Pdlw/oPxN+aXdmM9R00JVC9WVFoCLTKJvDVLgmJ+qAffBMxsV85l/Lu7sNx4zSzPyoL2euImuEwHhOXdEgNFZQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/schemas": "^29.6.3", + "ansi-styles": "^5.0.0", + "react-is": "^18.0.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-matcher-utils/node_modules/react-is": { + "version": "18.3.1", + "resolved": "https://registry.npmjs.org/react-is/-/react-is-18.3.1.tgz", + "integrity": "sha512-/LLMVyas0ljjAtoYiPqYiL8VWXzUUdThrmU5+n20DZv+a+ClRoevUzw5JxU+Ieh5/c87ytoTBV9G1FiKfNJdmg==", + "dev": true, + "license": "MIT" + }, + "node_modules/jest-message-util": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-message-util/-/jest-message-util-29.7.0.tgz", + "integrity": "sha512-GBEV4GRADeP+qtB2+6u61stea8mGcOT4mCtrYISZwfu9/ISHFJ/5zOMXYbpBE9RsS5+Gb63DW4FgmnKJ79Kf6w==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/code-frame": "^7.12.13", + "@jest/types": "^29.6.3", + "@types/stack-utils": "^2.0.0", + "chalk": "^4.0.0", + "graceful-fs": "^4.2.9", + "micromatch": "^4.0.4", + "pretty-format": "^29.7.0", + "slash": "^3.0.0", + "stack-utils": "^2.0.3" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-message-util/node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/jest-message-util/node_modules/chalk/node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "license": "MIT", + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/jest-message-util/node_modules/pretty-format": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-29.7.0.tgz", + "integrity": "sha512-Pdlw/oPxN+aXdmM9R00JVC9WVFoCLTKJvDVLgmJ+qAffBMxsV85l/Lu7sNx4zSzPyoL2euImuEwHhOXdEgNFZQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/schemas": "^29.6.3", + "ansi-styles": "^5.0.0", + "react-is": "^18.0.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-message-util/node_modules/react-is": { + "version": "18.3.1", + "resolved": "https://registry.npmjs.org/react-is/-/react-is-18.3.1.tgz", + "integrity": "sha512-/LLMVyas0ljjAtoYiPqYiL8VWXzUUdThrmU5+n20DZv+a+ClRoevUzw5JxU+Ieh5/c87ytoTBV9G1FiKfNJdmg==", + "dev": true, + "license": "MIT" + }, + "node_modules/jest-mock": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-mock/-/jest-mock-29.7.0.tgz", + "integrity": "sha512-ITOMZn+UkYS4ZFh83xYAOzWStloNzJFO2s8DWrE4lhtGD+AorgnbkiKERe4wQVBydIGPx059g6riW5Btp6Llnw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/types": "^29.6.3", + "@types/node": "*", + "jest-util": "^29.7.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-pnp-resolver": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/jest-pnp-resolver/-/jest-pnp-resolver-1.2.3.tgz", + "integrity": "sha512-+3NpwQEnRoIBtx4fyhblQDPgJI0H1IEIkX7ShLUjPGA7TtUTvI1oiKi3SR4oBR0hQhQR80l4WAe5RrXBwWMA8w==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + }, + "peerDependencies": { + "jest-resolve": "*" + }, + "peerDependenciesMeta": { + "jest-resolve": { + "optional": true + } + } + }, + "node_modules/jest-raw-loader": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/jest-raw-loader/-/jest-raw-loader-1.0.1.tgz", + "integrity": "sha512-g9oaAjeC4/rIJk1Wd3RxVbOfMizowM7LSjEJqa4R9qDX0OjQNABXOhH+GaznUp+DjTGVPi2vPPbQXyX87DOnYg==", + "dev": true, + "license": "MIT" + }, + "node_modules/jest-regex-util": { + "version": "29.6.3", + "resolved": "https://registry.npmjs.org/jest-regex-util/-/jest-regex-util-29.6.3.tgz", + "integrity": "sha512-KJJBsRCyyLNWCNBOvZyRDnAIfUiRJ8v+hOBQYGn8gDyF3UegwiP4gwRR3/SDa42g1YbVycTidUF3rKjyLFDWbg==", + "dev": true, + "license": "MIT", + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-resolve": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-resolve/-/jest-resolve-29.7.0.tgz", + "integrity": "sha512-IOVhZSrg+UvVAshDSDtHyFCCBUl/Q3AAJv8iZ6ZjnZ74xzvwuzLXid9IIIPgTnY62SJjfuupMKZsZQRsCvxEgA==", + "dev": true, + "license": "MIT", + "dependencies": { + "chalk": "^4.0.0", + "graceful-fs": "^4.2.9", + "jest-haste-map": "^29.7.0", + "jest-pnp-resolver": "^1.2.2", + "jest-util": "^29.7.0", + "jest-validate": "^29.7.0", + "resolve": "^1.20.0", + "resolve.exports": "^2.0.0", + "slash": "^3.0.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-resolve-dependencies": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-resolve-dependencies/-/jest-resolve-dependencies-29.7.0.tgz", + "integrity": "sha512-un0zD/6qxJ+S0et7WxeI3H5XSe9lTBBR7bOHCHXkKR6luG5mwDDlIzVQ0V5cZCuoTgEdcdwzTghYkTWfubi+nA==", + "dev": true, + "license": "MIT", + "dependencies": { + "jest-regex-util": "^29.6.3", + "jest-snapshot": "^29.7.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-resolve/node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "license": "MIT", + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/jest-resolve/node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/jest-runner": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-runner/-/jest-runner-29.7.0.tgz", + "integrity": "sha512-fsc4N6cPCAahybGBfTRcq5wFR6fpLznMg47sY5aDpsoejOcVYFb07AHuSnR0liMcPTgBsA3ZJL6kFOjPdoNipQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/console": "^29.7.0", + "@jest/environment": "^29.7.0", + "@jest/test-result": "^29.7.0", + "@jest/transform": "^29.7.0", + "@jest/types": "^29.6.3", + "@types/node": "*", + "chalk": "^4.0.0", + "emittery": "^0.13.1", + "graceful-fs": "^4.2.9", + "jest-docblock": "^29.7.0", + "jest-environment-node": "^29.7.0", + "jest-haste-map": "^29.7.0", + "jest-leak-detector": "^29.7.0", + "jest-message-util": "^29.7.0", + "jest-resolve": "^29.7.0", + "jest-runtime": "^29.7.0", + "jest-util": "^29.7.0", + "jest-watcher": "^29.7.0", + "jest-worker": "^29.7.0", + "p-limit": "^3.1.0", + "source-map-support": "0.5.13" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-runner/node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "license": "MIT", + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/jest-runner/node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/jest-runner/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==", + "dev": true, + "license": "BSD-3-Clause", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/jest-runner/node_modules/source-map-support": { + "version": "0.5.13", + "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.13.tgz", + "integrity": "sha512-SHSKFHadjVA5oR4PPqhtAVdcBWwRYVd6g6cAXnIbRiIwc2EhPrTuKUBdSLvlEKyIP3GCf89fltvcZiP9MMFA1w==", + "dev": true, + "license": "MIT", + "dependencies": { + "buffer-from": "^1.0.0", + "source-map": "^0.6.0" + } + }, + "node_modules/jest-runtime": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-runtime/-/jest-runtime-29.7.0.tgz", + "integrity": "sha512-gUnLjgwdGqW7B4LvOIkbKs9WGbn+QLqRQQ9juC6HndeDiezIwhDP+mhMwHWCEcfQ5RUXa6OPnFF8BJh5xegwwQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/environment": "^29.7.0", + "@jest/fake-timers": "^29.7.0", + "@jest/globals": "^29.7.0", + "@jest/source-map": "^29.6.3", + "@jest/test-result": "^29.7.0", + "@jest/transform": "^29.7.0", + "@jest/types": "^29.6.3", + "@types/node": "*", + "chalk": "^4.0.0", + "cjs-module-lexer": "^1.0.0", + "collect-v8-coverage": "^1.0.0", + "glob": "^7.1.3", + "graceful-fs": "^4.2.9", + "jest-haste-map": "^29.7.0", + "jest-message-util": "^29.7.0", + "jest-mock": "^29.7.0", + "jest-regex-util": "^29.6.3", + "jest-resolve": "^29.7.0", + "jest-snapshot": "^29.7.0", + "jest-util": "^29.7.0", + "slash": "^3.0.0", + "strip-bom": "^4.0.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-runtime/node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "license": "MIT", + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/jest-runtime/node_modules/brace-expansion": { + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", + "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "dev": true, + "license": "MIT", + "dependencies": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "node_modules/jest-runtime/node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/jest-runtime/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", + "dev": true, + "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/jest-runtime/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/jest-snapshot": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-snapshot/-/jest-snapshot-29.7.0.tgz", + "integrity": "sha512-Rm0BMWtxBcioHr1/OX5YCP8Uov4riHvKPknOGs804Zg9JGZgmIBkbtlxJC/7Z4msKYVbIJtfU+tKb8xlYNfdkw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/core": "^7.11.6", + "@babel/generator": "^7.7.2", + "@babel/plugin-syntax-jsx": "^7.7.2", + "@babel/plugin-syntax-typescript": "^7.7.2", + "@babel/types": "^7.3.3", + "@jest/expect-utils": "^29.7.0", + "@jest/transform": "^29.7.0", + "@jest/types": "^29.6.3", + "babel-preset-current-node-syntax": "^1.0.0", + "chalk": "^4.0.0", + "expect": "^29.7.0", + "graceful-fs": "^4.2.9", + "jest-diff": "^29.7.0", + "jest-get-type": "^29.6.3", + "jest-matcher-utils": "^29.7.0", + "jest-message-util": "^29.7.0", + "jest-util": "^29.7.0", + "natural-compare": "^1.4.0", + "pretty-format": "^29.7.0", + "semver": "^7.5.3" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-snapshot/node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/jest-snapshot/node_modules/chalk/node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "license": "MIT", + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/jest-snapshot/node_modules/diff-sequences": { + "version": "29.6.3", + "resolved": "https://registry.npmjs.org/diff-sequences/-/diff-sequences-29.6.3.tgz", + "integrity": "sha512-EjePK1srD3P08o2j4f0ExnylqRs5B9tJjcp9t1krH2qRi8CCdsYfwe9JgSLurFBWwq4uOlipzfk5fHNvwFKr8Q==", + "dev": true, + "license": "MIT", + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-snapshot/node_modules/jest-diff": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-diff/-/jest-diff-29.7.0.tgz", + "integrity": "sha512-LMIgiIrhigmPrs03JHpxUh2yISK3vLFPkAodPeo0+BuF7wA2FoQbkEg1u8gBYBThncu7e1oEDUfIXVuTqLRUjw==", + "dev": true, + "license": "MIT", + "dependencies": { + "chalk": "^4.0.0", + "diff-sequences": "^29.6.3", + "jest-get-type": "^29.6.3", + "pretty-format": "^29.7.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-snapshot/node_modules/pretty-format": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-29.7.0.tgz", + "integrity": "sha512-Pdlw/oPxN+aXdmM9R00JVC9WVFoCLTKJvDVLgmJ+qAffBMxsV85l/Lu7sNx4zSzPyoL2euImuEwHhOXdEgNFZQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/schemas": "^29.6.3", + "ansi-styles": "^5.0.0", + "react-is": "^18.0.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-snapshot/node_modules/react-is": { + "version": "18.3.1", + "resolved": "https://registry.npmjs.org/react-is/-/react-is-18.3.1.tgz", + "integrity": "sha512-/LLMVyas0ljjAtoYiPqYiL8VWXzUUdThrmU5+n20DZv+a+ClRoevUzw5JxU+Ieh5/c87ytoTBV9G1FiKfNJdmg==", + "dev": true, + "license": "MIT" + }, + "node_modules/jest-snapshot/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/jest-util": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-29.7.0.tgz", + "integrity": "sha512-z6EbKajIpqGKU56y5KBUgy1dt1ihhQJgWzUlZHArA/+X2ad7Cb5iF+AK1EWVL/Bo7Rz9uurpqw6SiBCefUbCGA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/types": "^29.6.3", + "@types/node": "*", + "chalk": "^4.0.0", + "ci-info": "^3.2.0", + "graceful-fs": "^4.2.9", + "picomatch": "^2.2.3" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-util/node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "license": "MIT", + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/jest-util/node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/jest-util/node_modules/picomatch": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", + "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8.6" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, + "node_modules/jest-validate": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-validate/-/jest-validate-29.7.0.tgz", + "integrity": "sha512-ZB7wHqaRGVw/9hST/OuFUReG7M8vKeq0/J2egIGLdvjHCmYqGARhzXmtgi+gVeZ5uXFF219aOc3Ls2yLg27tkw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/types": "^29.6.3", + "camelcase": "^6.2.0", + "chalk": "^4.0.0", + "jest-get-type": "^29.6.3", + "leven": "^3.1.0", + "pretty-format": "^29.7.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-validate/node_modules/camelcase": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-6.3.0.tgz", + "integrity": "sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/jest-validate/node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/jest-validate/node_modules/chalk/node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "license": "MIT", + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/jest-validate/node_modules/pretty-format": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-29.7.0.tgz", + "integrity": "sha512-Pdlw/oPxN+aXdmM9R00JVC9WVFoCLTKJvDVLgmJ+qAffBMxsV85l/Lu7sNx4zSzPyoL2euImuEwHhOXdEgNFZQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/schemas": "^29.6.3", + "ansi-styles": "^5.0.0", + "react-is": "^18.0.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-validate/node_modules/react-is": { + "version": "18.3.1", + "resolved": "https://registry.npmjs.org/react-is/-/react-is-18.3.1.tgz", + "integrity": "sha512-/LLMVyas0ljjAtoYiPqYiL8VWXzUUdThrmU5+n20DZv+a+ClRoevUzw5JxU+Ieh5/c87ytoTBV9G1FiKfNJdmg==", + "dev": true, + "license": "MIT" + }, + "node_modules/jest-watcher": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-watcher/-/jest-watcher-29.7.0.tgz", + "integrity": "sha512-49Fg7WXkU3Vl2h6LbLtMQ/HyB6rXSIX7SqvBLQmssRBGN9I0PNvPmAmCWSOY6SOvrjhI/F7/bGAv9RtnsPA03g==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/test-result": "^29.7.0", + "@jest/types": "^29.6.3", + "@types/node": "*", + "ansi-escapes": "^4.2.1", + "chalk": "^4.0.0", + "emittery": "^0.13.1", + "jest-util": "^29.7.0", + "string-length": "^4.0.1" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-watcher/node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "license": "MIT", + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/jest-watcher/node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/jest-worker": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-29.7.0.tgz", + "integrity": "sha512-eIz2msL/EzL9UFTFFx7jBTkeZfku0yUAyZZZmJ93H2TYEiroIx2PQjEXcwYtYl8zXCxb+PAmA2hLIt/6ZEkPHw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/node": "*", + "jest-util": "^29.7.0", + "merge-stream": "^2.0.0", + "supports-color": "^8.0.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-worker/node_modules/supports-color": { + "version": "8.1.1", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz", + "integrity": "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/supports-color?sponsor=1" + } + }, + "node_modules/joycon": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/joycon/-/joycon-3.1.1.tgz", + "integrity": "sha512-34wB/Y7MW7bzjKRjUKTa46I2Z7eV62Rkhva+KkopW7Qvv/OSWBqvkSY7vusOPrNuZcUG3tApvdVgNB8POj3SPw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10" + } + }, + "node_modules/js-message": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/js-message/-/js-message-1.0.7.tgz", + "integrity": "sha512-efJLHhLjIyKRewNS9EGZ4UpI8NguuL6fKkhRxVuMmrGV2xN/0APGdQYwLFky5w9naebSZ0OwAGp0G6/2Cg90rA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.6.0" + } + }, + "node_modules/js-queue": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/js-queue/-/js-queue-2.0.2.tgz", + "integrity": "sha512-pbKLsbCfi7kriM3s1J4DDCo7jQkI58zPLHi0heXPzPlj0hjUsm+FesPUbE0DSbIVIK503A36aUBoCN7eMFedkA==", + "dev": true, + "license": "MIT", + "dependencies": { + "easy-stack": "^1.0.1" + }, + "engines": { + "node": ">=1.0.0" + } + }, + "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==", + "dev": true, + "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==", + "dev": true, + "license": "MIT", + "dependencies": { + "argparse": "^1.0.7", + "esprima": "^4.0.0" + }, + "bin": { + "js-yaml": "bin/js-yaml.js" + } + }, + "node_modules/jsdoc-type-pratt-parser": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/jsdoc-type-pratt-parser/-/jsdoc-type-pratt-parser-4.1.0.tgz", + "integrity": "sha512-Hicd6JK5Njt2QB6XYFS7ok9e37O8AYk3jTcppG4YVQnYjOemymvTcmc7OWsmq/Qqj5TdRFO5/x/tIPmBeRtGHg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12.0.0" + } + }, + "node_modules/jsesc": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-3.0.2.tgz", + "integrity": "sha512-xKqzzWXDttJuOcawBt4KnKHHIf5oQ/Cxax+0PWFG+DFDgHNAdi+TXECADI+RYiFUMmx8792xsMbbgXj4CwnP4g==", + "dev": true, + "license": "MIT", + "bin": { + "jsesc": "bin/jsesc" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/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-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-traverse": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", + "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", + "dev": true, + "license": "MIT" + }, + "node_modules/json-stable-stringify-without-jsonify": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz", + "integrity": "sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==", + "dev": true, + "license": "MIT" + }, + "node_modules/json-stringify-safe": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz", + "integrity": "sha512-ZClg6AaYvamvYEE82d3Iyd3vSSIjQ+odgjaTzRuO3s7toCdFKczob2i0zCh7JE8kWn17yvAWhUVxvqGwUalsRA==", + "dev": true, + "license": "ISC", + "optional": true + }, + "node_modules/json5": { + "version": "2.2.3", + "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.3.tgz", + "integrity": "sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==", + "dev": true, + "license": "MIT", + "bin": { + "json5": "lib/cli.js" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/jsonc-parser": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/jsonc-parser/-/jsonc-parser-3.3.1.tgz", + "integrity": "sha512-HUgH65KyejrUFPvHFPbqOY0rsFip3Bo5wb4ngvdi1EpCYWUQDC5V+Y7mZws+DLkr4M//zQJoanu1SP+87Dv1oQ==", + "dev": true, + "license": "MIT" + }, + "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/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", + "peer": true, + "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/kleur": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/kleur/-/kleur-3.0.3.tgz", + "integrity": "sha512-eTIzlVOSUR+JxdDFepEYcBMtZ9Qqdef+rnzWdRZuMbOywu5tO2w2N7rqjoANZ5k9vywhL6Br1VRjUIgTQx4E8w==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/leven": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/leven/-/leven-3.1.0.tgz", + "integrity": "sha512-qsda+H8jTaUaN/x5vzW2rzc+8Rw4TAQ/4KjB46IwK5VH+IlVeeeje/EoZRpiXvIqjFgK84QffqPztGI3VBLG1A==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/levn": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/levn/-/levn-0.4.1.tgz", + "integrity": "sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "prelude-ls": "^1.2.1", + "type-check": "~0.4.0" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/lie": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/lie/-/lie-3.1.1.tgz", + "integrity": "sha512-RiNhHysUjhrDQntfYSfY4MU24coXXdEOgw9WGcKHNeEwffDYbF//u87M1EWaMGzuFoSbqW0C9C6lEEhDOAswfw==", + "dev": true, + "license": "MIT", + "dependencies": { + "immediate": "~3.0.5" + } + }, + "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/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", + "dependencies": { + "uc.micro": "^1.0.1" + } + }, + "node_modules/lint-staged": { + "version": "15.2.10", + "resolved": "https://registry.npmjs.org/lint-staged/-/lint-staged-15.2.10.tgz", + "integrity": "sha512-5dY5t743e1byO19P9I4b3x8HJwalIznL5E1FWYnU6OWw33KxNBSLAc6Cy7F2PsFEO8FKnLwjwm5hx7aMF0jzZg==", + "dev": true, + "license": "MIT", + "dependencies": { + "chalk": "~5.3.0", + "commander": "~12.1.0", + "debug": "~4.3.6", + "execa": "~8.0.1", + "lilconfig": "~3.1.2", + "listr2": "~8.2.4", + "micromatch": "~4.0.8", + "pidtree": "~0.6.0", + "string-argv": "~0.3.2", + "yaml": "~2.5.0" + }, + "bin": { + "lint-staged": "bin/lint-staged.js" + }, + "engines": { + "node": ">=18.12.0" + }, + "funding": { + "url": "https://opencollective.com/lint-staged" + } + }, + "node_modules/lint-staged/node_modules/commander": { + "version": "12.1.0", + "resolved": "https://registry.npmjs.org/commander/-/commander-12.1.0.tgz", + "integrity": "sha512-Vw8qHK3bZM9y/P10u3Vib8o/DdkvA2OtPtZvD871QKjy74Wj1WSKFILMPRPSdUSx5RFK1arlJzEtA4PkFgnbuA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18" + } + }, + "node_modules/lint-staged/node_modules/execa": { + "version": "8.0.1", + "resolved": "https://registry.npmjs.org/execa/-/execa-8.0.1.tgz", + "integrity": "sha512-VyhnebXciFV2DESc+p6B+y0LjSm0krU4OgJN44qFAhBY0TJ+1V61tYD2+wHusZ6F9n5K+vl8k0sTy7PEfV4qpg==", + "dev": true, + "license": "MIT", + "dependencies": { + "cross-spawn": "^7.0.3", + "get-stream": "^8.0.1", + "human-signals": "^5.0.0", + "is-stream": "^3.0.0", + "merge-stream": "^2.0.0", + "npm-run-path": "^5.1.0", + "onetime": "^6.0.0", + "signal-exit": "^4.1.0", + "strip-final-newline": "^3.0.0" + }, + "engines": { + "node": ">=16.17" + }, + "funding": { + "url": "https://github.com/sindresorhus/execa?sponsor=1" + } + }, + "node_modules/lint-staged/node_modules/get-stream": { + "version": "8.0.1", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-8.0.1.tgz", + "integrity": "sha512-VaUJspBffn/LMCJVoMvSAdmscJyS1auj5Zulnn5UoYcY531UWmdwhRWkcGKnGU93m5HSXP9LP2usOryrBtQowA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=16" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/lint-staged/node_modules/human-signals": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-5.0.0.tgz", + "integrity": "sha512-AXcZb6vzzrFAUE61HnN4mpLqd/cSIwNQjtNWR0euPm6y0iqx3G4gOXaIDdtdDwZmhwe82LA6+zinmW4UBWVePQ==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": ">=16.17.0" + } + }, + "node_modules/lint-staged/node_modules/is-stream": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-3.0.0.tgz", + "integrity": "sha512-LnQR4bZ9IADDRSkvpqMGvt/tEJWclzklNgSw48V5EAaAeDd6qGvN8ei6k5p0tvxSR171VmGyHuTiAOfxAbr8kA==", + "dev": true, + "license": "MIT", + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/lint-staged/node_modules/mimic-fn": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-4.0.0.tgz", + "integrity": "sha512-vqiC06CuhBTUdZH+RYl8sFrL096vA45Ok5ISO6sE/Mr1jRbGH4Csnhi8f3wKVl7x8mO4Au7Ir9D3Oyv1VYMFJw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/lint-staged/node_modules/npm-run-path": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-5.3.0.tgz", + "integrity": "sha512-ppwTtiJZq0O/ai0z7yfudtBpWIoxM8yE6nHi1X47eFR2EWORqfbu6CnPlNsjeN683eT0qG6H/Pyf9fCcvjnnnQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "path-key": "^4.0.0" + }, + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/lint-staged/node_modules/onetime": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/onetime/-/onetime-6.0.0.tgz", + "integrity": "sha512-1FlR+gjXK7X+AsAHso35MnyN5KqGwJRi/31ft6x0M194ht7S+rWAvd7PHss9xSKMzE0asv1pyIHaJYq+BbacAQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "mimic-fn": "^4.0.0" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/lint-staged/node_modules/path-key": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/path-key/-/path-key-4.0.0.tgz", + "integrity": "sha512-haREypq7xkM7ErfgIyA0z+Bj4AGKlMSdlQE2jvJo6huWD1EdkKYV+G/T4nq0YEF2vgTT8kqMFKo1uHn950r4SQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/lint-staged/node_modules/strip-final-newline": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/strip-final-newline/-/strip-final-newline-3.0.0.tgz", + "integrity": "sha512-dOESqjYr96iWYylGObzd39EuNTa5VJxyvVAEm5Jnh7KGo75V43Hk1odPQkNDyXNmUR6k+gEiDVXnjB8HJ3crXw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/lint-staged/node_modules/yaml": { + "version": "2.5.1", + "resolved": "https://registry.npmjs.org/yaml/-/yaml-2.5.1.tgz", + "integrity": "sha512-bLQOjaX/ADgQ20isPJRvF0iRUHIxVhYvr53Of7wGcWlO2jvtUlH5m87DsmulFVxRpNLOnI4tB6p/oh8D7kpn9Q==", + "dev": true, + "license": "ISC", + "bin": { + "yaml": "bin.mjs" + }, + "engines": { + "node": ">= 14" + } + }, + "node_modules/listr2": { + "version": "8.2.5", + "resolved": "https://registry.npmjs.org/listr2/-/listr2-8.2.5.tgz", + "integrity": "sha512-iyAZCeyD+c1gPyE9qpFu8af0Y+MRtmKOncdGoA2S5EY8iFq99dmmvkNnHiWo+pj0s7yH7l3KPIgee77tKpXPWQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "cli-truncate": "^4.0.0", + "colorette": "^2.0.20", + "eventemitter3": "^5.0.1", + "log-update": "^6.1.0", + "rfdc": "^1.4.1", + "wrap-ansi": "^9.0.0" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/listr2/node_modules/ansi-styles": { + "version": "6.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-6.2.1.tgz", + "integrity": "sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/listr2/node_modules/emoji-regex": { + "version": "10.4.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-10.4.0.tgz", + "integrity": "sha512-EC+0oUMY1Rqm4O6LLrgjtYDvcVYTy7chDnM4Q7030tP4Kwj3u/pR6gP9ygnp2CJMK5Gq+9Q2oqmrFJAz01DXjw==", + "dev": true, + "license": "MIT" + }, + "node_modules/listr2/node_modules/eventemitter3": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/eventemitter3/-/eventemitter3-5.0.1.tgz", + "integrity": "sha512-GWkBvjiSZK87ELrYOSESUYeVIc9mvLLf/nXalMOS5dYrgZq9o5OVkbZAVM06CVxYsCwH9BDZFPlQTlPA1j4ahA==", + "dev": true, + "license": "MIT" + }, + "node_modules/listr2/node_modules/string-width": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-7.2.0.tgz", + "integrity": "sha512-tsaTIkKW9b4N+AEj+SVA+WhJzV7/zMhcSu78mLKWSk7cXMOSHsBKFWUs0fWwq8QyK3MgJBQRX6Gbi4kYbdvGkQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "emoji-regex": "^10.3.0", + "get-east-asian-width": "^1.0.0", + "strip-ansi": "^7.1.0" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/listr2/node_modules/wrap-ansi": { + "version": "9.0.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-9.0.0.tgz", + "integrity": "sha512-G8ura3S+3Z2G+mkgNRq8dqaFZAuxfsxpBB8OCTGRTCtp+l/v9nbFNmCUP1BZMts3G1142MsZfn6eeUKrr4PD1Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-styles": "^6.2.1", + "string-width": "^7.0.0", + "strip-ansi": "^7.1.0" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/chalk/wrap-ansi?sponsor=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/localforage": { + "version": "1.10.0", + "resolved": "https://registry.npmjs.org/localforage/-/localforage-1.10.0.tgz", + "integrity": "sha512-14/H1aX7hzBBmmh7sGPd+AOMkkIrHM3Z1PAyGgZigA1H1p5O5ANnMyWzvpAETtG68/dC4pC0ncy3+PPGzXZHPg==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "lie": "3.1.1" + } + }, + "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/lodash": { + "version": "4.17.21", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz", + "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==", + "dev": true, + "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.flow": { + "version": "3.5.0", + "resolved": "https://registry.npmjs.org/lodash.flow/-/lodash.flow-3.5.0.tgz", + "integrity": "sha512-ff3BX/tSioo+XojX4MOsOMhJw0nZoUEF011LX8g8d3gvjVbxd89cCio4BCXronjxcTUIJUoqKEUA+n4CqvvRPw==", + "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==", + "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/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "license": "MIT", + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/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-update": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/log-update/-/log-update-6.1.0.tgz", + "integrity": "sha512-9ie8ItPR6tjY5uYJh8K/Zrv/RMZ5VOlOWvtZdEHYSTFKZfIBPQa9tOAEeAWhd+AnIneLJ22w5fjOYtoutpWq5w==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-escapes": "^7.0.0", + "cli-cursor": "^5.0.0", + "slice-ansi": "^7.1.0", + "strip-ansi": "^7.1.0", + "wrap-ansi": "^9.0.0" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/log-update/node_modules/ansi-escapes": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-7.0.0.tgz", + "integrity": "sha512-GdYO7a61mR0fOlAsvC9/rIHf7L96sBc6dEWzeOu+KAea5bZyQRPIpojrVoI4AXGJS/ycu/fBTdLrUkA4ODrvjw==", + "dev": true, + "license": "MIT", + "dependencies": { + "environment": "^1.0.0" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/log-update/node_modules/ansi-styles": { + "version": "6.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-6.2.1.tgz", + "integrity": "sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/log-update/node_modules/emoji-regex": { + "version": "10.4.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-10.4.0.tgz", + "integrity": "sha512-EC+0oUMY1Rqm4O6LLrgjtYDvcVYTy7chDnM4Q7030tP4Kwj3u/pR6gP9ygnp2CJMK5Gq+9Q2oqmrFJAz01DXjw==", + "dev": true, + "license": "MIT" + }, + "node_modules/log-update/node_modules/is-fullwidth-code-point": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-5.0.0.tgz", + "integrity": "sha512-OVa3u9kkBbw7b8Xw5F9P+D/T9X+Z4+JruYVNapTjPYZYUznQ5YfWeFkOj606XYYW8yugTfC8Pj0hYqvi4ryAhA==", + "dev": true, + "license": "MIT", + "dependencies": { + "get-east-asian-width": "^1.0.0" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/log-update/node_modules/slice-ansi": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-7.1.0.tgz", + "integrity": "sha512-bSiSngZ/jWeX93BqeIAbImyTbEihizcwNjFoRUIY/T1wWQsfsm2Vw1agPKylXvQTU7iASGdHhyqRlqQzfz+Htg==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-styles": "^6.2.1", + "is-fullwidth-code-point": "^5.0.0" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/chalk/slice-ansi?sponsor=1" + } + }, + "node_modules/log-update/node_modules/string-width": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-7.2.0.tgz", + "integrity": "sha512-tsaTIkKW9b4N+AEj+SVA+WhJzV7/zMhcSu78mLKWSk7cXMOSHsBKFWUs0fWwq8QyK3MgJBQRX6Gbi4kYbdvGkQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "emoji-regex": "^10.3.0", + "get-east-asian-width": "^1.0.0", + "strip-ansi": "^7.1.0" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/log-update/node_modules/wrap-ansi": { + "version": "9.0.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-9.0.0.tgz", + "integrity": "sha512-G8ura3S+3Z2G+mkgNRq8dqaFZAuxfsxpBB8OCTGRTCtp+l/v9nbFNmCUP1BZMts3G1142MsZfn6eeUKrr4PD1Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-styles": "^6.2.1", + "string-width": "^7.0.0", + "strip-ansi": "^7.1.0" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/chalk/wrap-ansi?sponsor=1" + } + }, + "node_modules/longest-streak": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/longest-streak/-/longest-streak-3.1.0.tgz", + "integrity": "sha512-9Ri+o0JYgehTaVBBDoMqIl8GXtbWg711O3srftcHhZ0dqnETqLaoIK0x17fUw9rFSlK/0NlsKe0Ahhyl5pXE2g==", + "dev": true, + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/loose-envify": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/loose-envify/-/loose-envify-1.4.0.tgz", + "integrity": "sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "js-tokens": "^3.0.0 || ^4.0.0" + }, + "bin": { + "loose-envify": "cli.js" + } + }, + "node_modules/loupe": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/loupe/-/loupe-3.1.2.tgz", + "integrity": "sha512-23I4pFZHmAemUnz8WZXbYRSKYj801VDaNv9ETuMh7IrMc7VuVVSo+Z9iLE3ni30+U48iDWfi30d3twAXBYmnCg==", + "dev": true, + "license": "MIT" + }, + "node_modules/lower-case": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/lower-case/-/lower-case-2.0.2.tgz", + "integrity": "sha512-7fm3l3NAF9WfN6W3JOmf5drwpVqX78JtoGJ3A6W0a6ZnldM41w2fV5D490psKFTpMds8TJse/eHLFFsNHHjHgg==", + "dev": true, + "license": "MIT", + "dependencies": { + "tslib": "^2.0.3" + } + }, + "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_map": { + "version": "0.3.3", + "resolved": "https://registry.npmjs.org/lru_map/-/lru_map-0.3.3.tgz", + "integrity": "sha512-Pn9cox5CsMYngeDbmChANltQl+5pi6XmTrraMSzhPmMBbmgcxmqWry0U3PGapCU1yB4/LqCcom7qhHZiF/jGfQ==", + "dev": true, + "license": "MIT" + }, + "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/lz-string": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/lz-string/-/lz-string-1.5.0.tgz", + "integrity": "sha512-h5bgJWpxJNswbU7qCrV0tIKQCaS3blPDrqKWx+QxzuzL1zGUzij9XCWLrSLsJPu5t+eWA/ycetzYAO5IOMcWAQ==", + "dev": true, + "license": "MIT", + "bin": { + "lz-string": "bin/bin.js" + } + }, + "node_modules/magic-string": { + "version": "0.25.9", + "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.25.9.tgz", + "integrity": "sha512-RmF0AsMzgt25qzqqLc1+MbHmhdx0ojF2Fvs4XnOqz2ZOBXzzkEwc/dJQZCYHAn7v1jbVOjAZfK8msRn4BxO4VQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "sourcemap-codec": "^1.4.8" + } + }, + "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/make-dir/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/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/makeerror": { + "version": "1.0.12", + "resolved": "https://registry.npmjs.org/makeerror/-/makeerror-1.0.12.tgz", + "integrity": "sha512-JmqCvUhmt43madlpFzG4BQzG2Z3m6tvQDNKdClZnO3VbIudJYmxsT0FNJMeiB2+JTSlTQTSbU8QdesVmwJcmLg==", + "dev": true, + "license": "BSD-3-Clause", + "dependencies": { + "tmpl": "1.0.5" + } + }, + "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", + "peer": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/map-or-similar": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/map-or-similar/-/map-or-similar-1.5.0.tgz", + "integrity": "sha512-0aF7ZmVon1igznGI4VS30yugpduQW3y3GkcgGJOp7d8x8QrizhigUxjI/m2UojsXXto+jLAH3KSz+xOJTiORjg==", + "dev": true, + "license": "MIT" + }, + "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", + "peer": true, + "dependencies": { + "object-visit": "^1.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/markdown-extensions": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/markdown-extensions/-/markdown-extensions-2.0.0.tgz", + "integrity": "sha512-o5vL7aDWatOTX8LzaS1WMoaoxIiLRQJuIKKe2wAw6IeULDHaqbiqiggmx+pKvZDb1Sj+pE46Sn1T7lCqfFtg1Q==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=16" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "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", + "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-highlightjs": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/markdown-it-highlightjs/-/markdown-it-highlightjs-3.6.0.tgz", + "integrity": "sha512-ex+Lq3cVkprh0GpGwFyc53A/rqY6GGzopPCG1xMsf8Ya3XtGC8Uw9tChN1rWbpyDae7tBBhVHVcMM29h4Btamw==", + "dev": true, + "license": "Unlicense", + "dependencies": { + "highlight.js": "^11.3.1", + "lodash.flow": "^3.5.0" + } + }, + "node_modules/markdown-it-highlightjs/node_modules/highlight.js": { + "version": "11.10.0", + "resolved": "https://registry.npmjs.org/highlight.js/-/highlight.js-11.10.0.tgz", + "integrity": "sha512-SYVnVFswQER+zu1laSya563s+F8VDGt7o35d4utbamowvUNLLMovFqwCLSocpZTz3MgaSRA1IbqRWZv97dtErQ==", + "dev": true, + "license": "BSD-3-Clause", + "engines": { + "node": ">=12.0.0" + } + }, + "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" + }, + "node_modules/matcher": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/matcher/-/matcher-3.0.0.tgz", + "integrity": "sha512-OkeDaAZ/bQCxeFAozM55PKcKU0yJMPGifLwV4Qgjitu+5MoAfSQN4lsLJeXZ1b8w0x+/Emda6MZgXS1jvsapng==", + "dev": true, + "license": "MIT", + "optional": true, + "dependencies": { + "escape-string-regexp": "^4.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/matcher/node_modules/escape-string-regexp": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz", + "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==", + "dev": true, + "license": "MIT", + "optional": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/mdast-util-from-markdown": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/mdast-util-from-markdown/-/mdast-util-from-markdown-2.0.2.tgz", + "integrity": "sha512-uZhTV/8NBuw0WHkPTrCqDOl0zVe1BIng5ZtHoDk49ME1qqcjYmmLmOf0gELgcRMxN4w2iuIeVso5/6QymSrgmA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/mdast": "^4.0.0", + "@types/unist": "^3.0.0", + "decode-named-character-reference": "^1.0.0", + "devlop": "^1.0.0", + "mdast-util-to-string": "^4.0.0", + "micromark": "^4.0.0", + "micromark-util-decode-numeric-character-reference": "^2.0.0", + "micromark-util-decode-string": "^2.0.0", + "micromark-util-normalize-identifier": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0", + "unist-util-stringify-position": "^4.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/mdast-util-mdx": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/mdast-util-mdx/-/mdast-util-mdx-3.0.0.tgz", + "integrity": "sha512-JfbYLAW7XnYTTbUsmpu0kdBUVe+yKVJZBItEjwyYJiDJuZ9w4eeaqks4HQO+R7objWgS2ymV60GYpI14Ug554w==", + "dev": true, + "license": "MIT", + "dependencies": { + "mdast-util-from-markdown": "^2.0.0", + "mdast-util-mdx-expression": "^2.0.0", + "mdast-util-mdx-jsx": "^3.0.0", + "mdast-util-mdxjs-esm": "^2.0.0", + "mdast-util-to-markdown": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/mdast-util-mdx-expression": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/mdast-util-mdx-expression/-/mdast-util-mdx-expression-2.0.1.tgz", + "integrity": "sha512-J6f+9hUp+ldTZqKRSg7Vw5V6MqjATc+3E4gf3CFNcuZNWD8XdyI6zQ8GqH7f8169MM6P7hMBRDVGnn7oHB9kXQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/estree-jsx": "^1.0.0", + "@types/hast": "^3.0.0", + "@types/mdast": "^4.0.0", + "devlop": "^1.0.0", + "mdast-util-from-markdown": "^2.0.0", + "mdast-util-to-markdown": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/mdast-util-mdx-jsx": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/mdast-util-mdx-jsx/-/mdast-util-mdx-jsx-3.1.3.tgz", + "integrity": "sha512-bfOjvNt+1AcbPLTFMFWY149nJz0OjmewJs3LQQ5pIyVGxP4CdOqNVJL6kTaM5c68p8q82Xv3nCyFfUnuEcH3UQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/estree-jsx": "^1.0.0", + "@types/hast": "^3.0.0", + "@types/mdast": "^4.0.0", + "@types/unist": "^3.0.0", + "ccount": "^2.0.0", + "devlop": "^1.1.0", + "mdast-util-from-markdown": "^2.0.0", + "mdast-util-to-markdown": "^2.0.0", + "parse-entities": "^4.0.0", + "stringify-entities": "^4.0.0", + "unist-util-stringify-position": "^4.0.0", + "vfile-message": "^4.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/mdast-util-mdxjs-esm": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/mdast-util-mdxjs-esm/-/mdast-util-mdxjs-esm-2.0.1.tgz", + "integrity": "sha512-EcmOpxsZ96CvlP03NghtH1EsLtr0n9Tm4lPUJUBccV9RwUOneqSycg19n5HGzCf+10LozMRSObtVr3ee1WoHtg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/estree-jsx": "^1.0.0", + "@types/hast": "^3.0.0", + "@types/mdast": "^4.0.0", + "devlop": "^1.0.0", + "mdast-util-from-markdown": "^2.0.0", + "mdast-util-to-markdown": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/mdast-util-phrasing": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/mdast-util-phrasing/-/mdast-util-phrasing-4.1.0.tgz", + "integrity": "sha512-TqICwyvJJpBwvGAMZjj4J2n0X8QWp21b9l0o7eXyVJ25YNWYbJDVIyD1bZXE6WtV6RmKJVYmQAKWa0zWOABz2w==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/mdast": "^4.0.0", + "unist-util-is": "^6.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/mdast-util-to-hast": { + "version": "13.2.0", + "resolved": "https://registry.npmjs.org/mdast-util-to-hast/-/mdast-util-to-hast-13.2.0.tgz", + "integrity": "sha512-QGYKEuUsYT9ykKBCMOEDLsU5JRObWQusAolFMeko/tYPufNkRffBAQjIE+99jbA87xv6FgmjLtwjh9wBWajwAA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/hast": "^3.0.0", + "@types/mdast": "^4.0.0", + "@ungap/structured-clone": "^1.0.0", + "devlop": "^1.0.0", + "micromark-util-sanitize-uri": "^2.0.0", + "trim-lines": "^3.0.0", + "unist-util-position": "^5.0.0", + "unist-util-visit": "^5.0.0", + "vfile": "^6.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/mdast-util-to-markdown": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/mdast-util-to-markdown/-/mdast-util-to-markdown-2.1.2.tgz", + "integrity": "sha512-xj68wMTvGXVOKonmog6LwyJKrYXZPvlwabaryTjLh9LuvovB/KAH+kvi8Gjj+7rJjsFi23nkUxRQv1KqSroMqA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/mdast": "^4.0.0", + "@types/unist": "^3.0.0", + "longest-streak": "^3.0.0", + "mdast-util-phrasing": "^4.0.0", + "mdast-util-to-string": "^4.0.0", + "micromark-util-classify-character": "^2.0.0", + "micromark-util-decode-string": "^2.0.0", + "unist-util-visit": "^5.0.0", + "zwitch": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/mdast-util-to-string": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/mdast-util-to-string/-/mdast-util-to-string-4.0.0.tgz", + "integrity": "sha512-0H44vDimn51F0YwvxSJSm0eCDOJTRlmN0R1yBh4HLj9wiV1Dn0QoXGbvFAWj2hSItVTlCmBF1hqKlIyUBVFLPg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/mdast": "^4.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "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/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/memoizerific": { + "version": "1.11.3", + "resolved": "https://registry.npmjs.org/memoizerific/-/memoizerific-1.11.3.tgz", + "integrity": "sha512-/EuHYwAPdLtXwAwSZkh/Gutery6pD2KYd44oQLhAvQp/50mpyduZh8Q7PYHXTCJ+wuXxt7oij2LXyIJOOYFPog==", + "dev": true, + "license": "MIT", + "dependencies": { + "map-or-similar": "^1.5.0" + } + }, + "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==", + "dev": true, + "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==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 8" + } + }, + "node_modules/micromark": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/micromark/-/micromark-4.0.1.tgz", + "integrity": "sha512-eBPdkcoCNvYcxQOAKAlceo5SNdzZWfF+FcSupREAzdAh9rRmE239CEQAiTwIgblwnoM8zzj35sZ5ZwvSEOF6Kw==", + "dev": true, + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "@types/debug": "^4.0.0", + "debug": "^4.0.0", + "decode-named-character-reference": "^1.0.0", + "devlop": "^1.0.0", + "micromark-core-commonmark": "^2.0.0", + "micromark-factory-space": "^2.0.0", + "micromark-util-character": "^2.0.0", + "micromark-util-chunked": "^2.0.0", + "micromark-util-combine-extensions": "^2.0.0", + "micromark-util-decode-numeric-character-reference": "^2.0.0", + "micromark-util-encode": "^2.0.0", + "micromark-util-normalize-identifier": "^2.0.0", + "micromark-util-resolve-all": "^2.0.0", + "micromark-util-sanitize-uri": "^2.0.0", + "micromark-util-subtokenize": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/micromark-core-commonmark": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/micromark-core-commonmark/-/micromark-core-commonmark-2.0.2.tgz", + "integrity": "sha512-FKjQKbxd1cibWMM1P9N+H8TwlgGgSkWZMmfuVucLCHaYqeSvJ0hFeHsIa65pA2nYbes0f8LDHPMrd9X7Ujxg9w==", + "dev": true, + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "decode-named-character-reference": "^1.0.0", + "devlop": "^1.0.0", + "micromark-factory-destination": "^2.0.0", + "micromark-factory-label": "^2.0.0", + "micromark-factory-space": "^2.0.0", + "micromark-factory-title": "^2.0.0", + "micromark-factory-whitespace": "^2.0.0", + "micromark-util-character": "^2.0.0", + "micromark-util-chunked": "^2.0.0", + "micromark-util-classify-character": "^2.0.0", + "micromark-util-html-tag-name": "^2.0.0", + "micromark-util-normalize-identifier": "^2.0.0", + "micromark-util-resolve-all": "^2.0.0", + "micromark-util-subtokenize": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/micromark-extension-mdx-expression": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/micromark-extension-mdx-expression/-/micromark-extension-mdx-expression-3.0.0.tgz", + "integrity": "sha512-sI0nwhUDz97xyzqJAbHQhp5TfaxEvZZZ2JDqUo+7NvyIYG6BZ5CPPqj2ogUoPJlmXHBnyZUzISg9+oUmU6tUjQ==", + "dev": true, + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "@types/estree": "^1.0.0", + "devlop": "^1.0.0", + "micromark-factory-mdx-expression": "^2.0.0", + "micromark-factory-space": "^2.0.0", + "micromark-util-character": "^2.0.0", + "micromark-util-events-to-acorn": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/micromark-extension-mdx-jsx": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/micromark-extension-mdx-jsx/-/micromark-extension-mdx-jsx-3.0.1.tgz", + "integrity": "sha512-vNuFb9czP8QCtAQcEJn0UJQJZA8Dk6DXKBqx+bg/w0WGuSxDxNr7hErW89tHUY31dUW4NqEOWwmEUNhjTFmHkg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/acorn": "^4.0.0", + "@types/estree": "^1.0.0", + "devlop": "^1.0.0", + "estree-util-is-identifier-name": "^3.0.0", + "micromark-factory-mdx-expression": "^2.0.0", + "micromark-factory-space": "^2.0.0", + "micromark-util-character": "^2.0.0", + "micromark-util-events-to-acorn": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0", + "vfile-message": "^4.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/micromark-extension-mdx-md": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/micromark-extension-mdx-md/-/micromark-extension-mdx-md-2.0.0.tgz", + "integrity": "sha512-EpAiszsB3blw4Rpba7xTOUptcFeBFi+6PY8VnJ2hhimH+vCQDirWgsMpz7w1XcZE7LVrSAUGb9VJpG9ghlYvYQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "micromark-util-types": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/micromark-extension-mdxjs": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/micromark-extension-mdxjs/-/micromark-extension-mdxjs-3.0.0.tgz", + "integrity": "sha512-A873fJfhnJ2siZyUrJ31l34Uqwy4xIFmvPY1oj+Ean5PHcPBYzEsvqvWGaWcfEIr11O5Dlw3p2y0tZWpKHDejQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "acorn": "^8.0.0", + "acorn-jsx": "^5.0.0", + "micromark-extension-mdx-expression": "^3.0.0", + "micromark-extension-mdx-jsx": "^3.0.0", + "micromark-extension-mdx-md": "^2.0.0", + "micromark-extension-mdxjs-esm": "^3.0.0", + "micromark-util-combine-extensions": "^2.0.0", + "micromark-util-types": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/micromark-extension-mdxjs-esm": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/micromark-extension-mdxjs-esm/-/micromark-extension-mdxjs-esm-3.0.0.tgz", + "integrity": "sha512-DJFl4ZqkErRpq/dAPyeWp15tGrcrrJho1hKK5uBS70BCtfrIFg81sqcTVu3Ta+KD1Tk5vAtBNElWxtAa+m8K9A==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/estree": "^1.0.0", + "devlop": "^1.0.0", + "micromark-core-commonmark": "^2.0.0", + "micromark-util-character": "^2.0.0", + "micromark-util-events-to-acorn": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0", + "unist-util-position-from-estree": "^2.0.0", + "vfile-message": "^4.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/micromark-factory-destination": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-factory-destination/-/micromark-factory-destination-2.0.1.tgz", + "integrity": "sha512-Xe6rDdJlkmbFRExpTOmRj9N3MaWmbAgdpSrBQvCFqhezUn4AHqJHbaEnfbVYYiexVSs//tqOdY/DxhjdCiJnIA==", + "dev": true, + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "micromark-util-character": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/micromark-factory-label": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-factory-label/-/micromark-factory-label-2.0.1.tgz", + "integrity": "sha512-VFMekyQExqIW7xIChcXn4ok29YE3rnuyveW3wZQWWqF4Nv9Wk5rgJ99KzPvHjkmPXF93FXIbBp6YdW3t71/7Vg==", + "dev": true, + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "devlop": "^1.0.0", + "micromark-util-character": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/micromark-factory-mdx-expression": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/micromark-factory-mdx-expression/-/micromark-factory-mdx-expression-2.0.2.tgz", + "integrity": "sha512-5E5I2pFzJyg2CtemqAbcyCktpHXuJbABnsb32wX2U8IQKhhVFBqkcZR5LRm1WVoFqa4kTueZK4abep7wdo9nrw==", + "dev": true, + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "@types/estree": "^1.0.0", + "devlop": "^1.0.0", + "micromark-factory-space": "^2.0.0", + "micromark-util-character": "^2.0.0", + "micromark-util-events-to-acorn": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0", + "unist-util-position-from-estree": "^2.0.0", + "vfile-message": "^4.0.0" + } + }, + "node_modules/micromark-factory-space": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-factory-space/-/micromark-factory-space-2.0.1.tgz", + "integrity": "sha512-zRkxjtBxxLd2Sc0d+fbnEunsTj46SWXgXciZmHq0kDYGnck/ZSGj9/wULTV95uoeYiK5hRXP2mJ98Uo4cq/LQg==", + "dev": true, + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "micromark-util-character": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/micromark-factory-title": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-factory-title/-/micromark-factory-title-2.0.1.tgz", + "integrity": "sha512-5bZ+3CjhAd9eChYTHsjy6TGxpOFSKgKKJPJxr293jTbfry2KDoWkhBb6TcPVB4NmzaPhMs1Frm9AZH7OD4Cjzw==", + "dev": true, + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "micromark-factory-space": "^2.0.0", + "micromark-util-character": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/micromark-factory-whitespace": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-factory-whitespace/-/micromark-factory-whitespace-2.0.1.tgz", + "integrity": "sha512-Ob0nuZ3PKt/n0hORHyvoD9uZhr+Za8sFoP+OnMcnWK5lngSzALgQYKMr9RJVOWLqQYuyn6ulqGWSXdwf6F80lQ==", + "dev": true, + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "micromark-factory-space": "^2.0.0", + "micromark-util-character": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/micromark-util-character": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/micromark-util-character/-/micromark-util-character-2.1.1.tgz", + "integrity": "sha512-wv8tdUTJ3thSFFFJKtpYKOYiGP2+v96Hvk4Tu8KpCAsTMs6yi+nVmGh1syvSCsaxz45J6Jbw+9DD6g97+NV67Q==", + "dev": true, + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/micromark-util-chunked": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-util-chunked/-/micromark-util-chunked-2.0.1.tgz", + "integrity": "sha512-QUNFEOPELfmvv+4xiNg2sRYeS/P84pTW0TCgP5zc9FpXetHY0ab7SxKyAQCNCc1eK0459uoLI1y5oO5Vc1dbhA==", + "dev": true, + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "micromark-util-symbol": "^2.0.0" + } + }, + "node_modules/micromark-util-classify-character": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-util-classify-character/-/micromark-util-classify-character-2.0.1.tgz", + "integrity": "sha512-K0kHzM6afW/MbeWYWLjoHQv1sgg2Q9EccHEDzSkxiP/EaagNzCm7T/WMKZ3rjMbvIpvBiZgwR3dKMygtA4mG1Q==", + "dev": true, + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "micromark-util-character": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/micromark-util-combine-extensions": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-util-combine-extensions/-/micromark-util-combine-extensions-2.0.1.tgz", + "integrity": "sha512-OnAnH8Ujmy59JcyZw8JSbK9cGpdVY44NKgSM7E9Eh7DiLS2E9RNQf0dONaGDzEG9yjEl5hcqeIsj4hfRkLH/Bg==", + "dev": true, + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "micromark-util-chunked": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/micromark-util-decode-numeric-character-reference": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/micromark-util-decode-numeric-character-reference/-/micromark-util-decode-numeric-character-reference-2.0.2.tgz", + "integrity": "sha512-ccUbYk6CwVdkmCQMyr64dXz42EfHGkPQlBj5p7YVGzq8I7CtjXZJrubAYezf7Rp+bjPseiROqe7G6foFd+lEuw==", + "dev": true, + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "micromark-util-symbol": "^2.0.0" + } + }, + "node_modules/micromark-util-decode-string": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-util-decode-string/-/micromark-util-decode-string-2.0.1.tgz", + "integrity": "sha512-nDV/77Fj6eH1ynwscYTOsbK7rR//Uj0bZXBwJZRfaLEJ1iGBR6kIfNmlNqaqJf649EP0F3NWNdeJi03elllNUQ==", + "dev": true, + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "decode-named-character-reference": "^1.0.0", + "micromark-util-character": "^2.0.0", + "micromark-util-decode-numeric-character-reference": "^2.0.0", + "micromark-util-symbol": "^2.0.0" + } + }, + "node_modules/micromark-util-encode": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-util-encode/-/micromark-util-encode-2.0.1.tgz", + "integrity": "sha512-c3cVx2y4KqUnwopcO9b/SCdo2O67LwJJ/UyqGfbigahfegL9myoEFoDYZgkT7f36T0bLrM9hZTAaAyH+PCAXjw==", + "dev": true, + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT" + }, + "node_modules/micromark-util-events-to-acorn": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/micromark-util-events-to-acorn/-/micromark-util-events-to-acorn-2.0.2.tgz", + "integrity": "sha512-Fk+xmBrOv9QZnEDguL9OI9/NQQp6Hz4FuQ4YmCb/5V7+9eAh1s6AYSvL20kHkD67YIg7EpE54TiSlcsf3vyZgA==", + "dev": true, + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "@types/acorn": "^4.0.0", + "@types/estree": "^1.0.0", + "@types/unist": "^3.0.0", + "devlop": "^1.0.0", + "estree-util-visit": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0", + "vfile-message": "^4.0.0" + } + }, + "node_modules/micromark-util-html-tag-name": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-util-html-tag-name/-/micromark-util-html-tag-name-2.0.1.tgz", + "integrity": "sha512-2cNEiYDhCWKI+Gs9T0Tiysk136SnR13hhO8yW6BGNyhOC4qYFnwF1nKfD3HFAIXA5c45RrIG1ub11GiXeYd1xA==", + "dev": true, + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT" + }, + "node_modules/micromark-util-normalize-identifier": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-util-normalize-identifier/-/micromark-util-normalize-identifier-2.0.1.tgz", + "integrity": "sha512-sxPqmo70LyARJs0w2UclACPUUEqltCkJ6PhKdMIDuJ3gSf/Q+/GIe3WKl0Ijb/GyH9lOpUkRAO2wp0GVkLvS9Q==", + "dev": true, + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "micromark-util-symbol": "^2.0.0" + } + }, + "node_modules/micromark-util-resolve-all": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-util-resolve-all/-/micromark-util-resolve-all-2.0.1.tgz", + "integrity": "sha512-VdQyxFWFT2/FGJgwQnJYbe1jjQoNTS4RjglmSjTUlpUMa95Htx9NHeYW4rGDJzbjvCsl9eLjMQwGeElsqmzcHg==", + "dev": true, + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/micromark-util-sanitize-uri": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-util-sanitize-uri/-/micromark-util-sanitize-uri-2.0.1.tgz", + "integrity": "sha512-9N9IomZ/YuGGZZmQec1MbgxtlgougxTodVwDzzEouPKo3qFWvymFHWcnDi2vzV1ff6kas9ucW+o3yzJK9YB1AQ==", + "dev": true, + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "micromark-util-character": "^2.0.0", + "micromark-util-encode": "^2.0.0", + "micromark-util-symbol": "^2.0.0" + } + }, + "node_modules/micromark-util-subtokenize": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/micromark-util-subtokenize/-/micromark-util-subtokenize-2.0.3.tgz", + "integrity": "sha512-VXJJuNxYWSoYL6AJ6OQECCFGhIU2GGHMw8tahogePBrjkG8aCCas3ibkp7RnVOSTClg2is05/R7maAhF1XyQMg==", + "dev": true, + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "devlop": "^1.0.0", + "micromark-util-chunked": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/micromark-util-symbol": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-util-symbol/-/micromark-util-symbol-2.0.1.tgz", + "integrity": "sha512-vs5t8Apaud9N28kgCrRUdEed4UJ+wWNvicHLPxCa9ENlYuAY31M0ETy5y1vA33YoNPDFTghEbnh6efaE8h4x0Q==", + "dev": true, + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT" + }, + "node_modules/micromark-util-types": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-util-types/-/micromark-util-types-2.0.1.tgz", + "integrity": "sha512-534m2WhVTddrcKVepwmVEVnUAmtrx9bfIjNoQHRqfnvdaHQiFytEhJoTgpWJvDEXCO5gLTQh3wYC1PgOJA4NSQ==", + "dev": true, + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT" + }, + "node_modules/micromatch": { + "version": "4.0.8", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.8.tgz", + "integrity": "sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA==", + "dev": true, + "license": "MIT", + "dependencies": { + "braces": "^3.0.3", + "picomatch": "^2.3.1" + }, + "engines": { + "node": ">=8.6" + } + }, + "node_modules/micromatch/node_modules/picomatch": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", + "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8.6" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, + "node_modules/mime": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/mime/-/mime-1.6.0.tgz", + "integrity": "sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==", + "dev": true, + "license": "MIT", + "bin": { + "mime": "cli.js" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/mime-db": { + "version": "1.52.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", + "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==", + "dev": true, + "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==", + "dev": true, + "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==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/mimic-function": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/mimic-function/-/mimic-function-5.0.1.tgz", + "integrity": "sha512-VP79XUPxV2CigYP3jWwAUFSku2aKqBH7uTAapFWCBqutsbmDo96KY5o8uh6U+/YSIn5OxJnXp73beVkpqMIGhA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "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-document": { + "version": "2.19.0", + "resolved": "https://registry.npmjs.org/min-document/-/min-document-2.19.0.tgz", + "integrity": "sha512-9Wy1B3m3f66bPPmU5hdA4DR4PB2OfDU/+GS3yAB7IQozE3tqXaVv2zOjgla7MEGSRv95+ILmOuvhLkOK6wJtCQ==", + "dev": true, + "dependencies": { + "dom-walk": "^0.1.0" + } + }, + "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/minimatch": { + "version": "9.0.3", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.3.tgz", + "integrity": "sha512-RHiac9mvaRw0x3AYRgDC1CxAP7HTcNrrECeA8YYJeWnpo+2Q5CegtZjaotWTWxDG3UeGA1coE05iH1mPjT/2mg==", + "dev": true, + "license": "ISC", + "dependencies": { + "brace-expansion": "^2.0.1" + }, + "engines": { + "node": ">=16 || 14 >=14.17" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/minimist": { + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.8.tgz", + "integrity": "sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==", + "dev": true, + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/minipass": { + "version": "7.1.2", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-7.1.2.tgz", + "integrity": "sha512-qOOzS1cBTWYF4BH8fVePDBOO9iptMnGUEZwNc/cMWnTV2nVLZ7VoNWEPHkYczZA0pdoA7dl6e7FL659nX9S2aw==", + "dev": true, + "license": "ISC", + "engines": { + "node": ">=16 || 14 >=14.17" + } + }, + "node_modules/missionlog": { + "version": "1.8.8", + "resolved": "https://registry.npmjs.org/missionlog/-/missionlog-1.8.8.tgz", + "integrity": "sha512-93Hqh1xZjx8niupjcLky8mtap6D1t4vU62iutH6xe4MxTUQFitZd5AlMuTWOvkTOg06ttMhLPu572kLg/QX1+Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/runtime": "^7.22.5", + "core-js": "^3.31.0" + }, + "engines": { + "node": ">=16.0.0" + } + }, + "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", + "peer": true, + "dependencies": { + "for-in": "^1.0.2", + "is-extendable": "^1.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/mkdirp": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.4.tgz", + "integrity": "sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==", + "dev": true, + "license": "MIT", + "bin": { + "mkdirp": "bin/cmd.js" + }, + "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==", + "dev": true, + "license": "MIT" + }, + "node_modules/mute-stream": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/mute-stream/-/mute-stream-1.0.0.tgz", + "integrity": "sha512-avsJQhyd+680gKXyG/sQc0nXaC6rBkPOfyHYcFb9+hdkqQkR9bdnkJ0AMZhke0oesPqIO+mFFJ+IdBc7mst4IA==", + "dev": true, + "license": "ISC", + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, + "node_modules/mylas": { + "version": "2.1.13", + "resolved": "https://registry.npmjs.org/mylas/-/mylas-2.1.13.tgz", + "integrity": "sha512-+MrqnJRtxdF+xngFfUUkIMQrUUL0KsxbADUkn23Z/4ibGg192Q+z+CQyiYwvWTsYjJygmMR8+w3ZDa98Zh6ESg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12.0.0" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/raouldeheer" + } + }, + "node_modules/nanoid": { + "version": "3.1.32", + "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.1.32.tgz", + "integrity": "sha512-F8mf7R3iT9bvThBoW4tGXhXFHCctyCiUUPrWF8WaTqa3h96d9QybkSeba43XVOOE3oiLfkVDe4bT8MeGmkrTxw==", + "dev": true, + "license": "MIT", + "bin": { + "nanoid": "bin/nanoid.cjs" + }, + "engines": { + "node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1" + } + }, + "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", + "peer": true, + "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/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/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/node-abort-controller": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/node-abort-controller/-/node-abort-controller-3.1.1.tgz", + "integrity": "sha512-AGK2yQKIjRuqnc6VkX2Xj5d+QW8xZ87pa1UK6yA6ouUyuxfHuMP6umE5QK7UmTeOAymo+Zx1Fxiuw9rVx8taHQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/node-fetch": { + "version": "2.6.13", + "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.6.13.tgz", + "integrity": "sha512-StxNAxh15zr77QvvkmveSQ8uCQ4+v5FkvNTj0OESmiHu+VRi/gXArXtkWMElOsOUNLtUEvI4yS+rdtOHZTwlQA==", + "dev": true, + "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-int64": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/node-int64/-/node-int64-0.4.0.tgz", + "integrity": "sha512-O5lz91xSOeoXP6DulyHfllpq+Eg00MWitZIbtPfoSEvqIHdl5gfcY6hYzDWnj0qD5tz52PI08u9qUvSVeUBeHw==", + "dev": true, + "license": "MIT" + }, + "node_modules/node-ipc": { + "version": "10.1.0", + "resolved": "https://registry.npmjs.org/node-ipc/-/node-ipc-10.1.0.tgz", + "integrity": "sha512-JBHRlMU8xAoo1kPtcvlBAa/6OBi/FUZoO/NbZf63q5Fe8q2aDhVJFryBFSq5T3E7EM13NnAUyEYk1b0IF6QV3Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "event-pubsub": "5.0.3", + "js-message": "1.0.7", + "js-queue": "2.0.2", + "strong-type": "^1.0.1" + }, + "engines": { + "node": ">=14" + } + }, + "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/noms": { + "version": "0.0.0", + "resolved": "https://registry.npmjs.org/noms/-/noms-0.0.0.tgz", + "integrity": "sha512-lNDU9VJaOPxUmXcLb+HQFeUgQQPtMI24Gt6hgfuMHRJgMRHMF/qZ4HJD3GDru4sSw9IQl2jPjAYnQrdIeLbwow==", + "dev": true, + "license": "ISC", + "dependencies": { + "inherits": "^2.0.1", + "readable-stream": "~1.0.31" + } + }, + "node_modules/normalize-package-data": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-2.5.0.tgz", + "integrity": "sha512-/5CMN3T0R4XTj4DcGaexo+roZSdSFW/0AOOTROrjxzCG1wrWXEsGbRKevjlIL+ZDE4sZlJr5ED4YW0yqmkK+eA==", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "hosted-git-info": "^2.1.4", + "resolve": "^1.10.0", + "semver": "2 || 3 || 4 || 5", + "validate-npm-package-license": "^3.0.1" + } + }, + "node_modules/normalize-package-data/node_modules/semver": { + "version": "5.7.2", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.2.tgz", + "integrity": "sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g==", + "dev": true, + "license": "ISC", + "bin": { + "semver": "bin/semver" + } + }, + "node_modules/normalize-path": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", + "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", + "dev": true, + "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==", + "dev": true, + "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==", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "boolbase": "^1.0.0" + }, + "funding": { + "url": "https://github.com/fb55/nth-check?sponsor=1" + } + }, + "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==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.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, + "license": "MIT", + "peer": true, + "dependencies": { + "copy-descriptor": "^0.1.0", + "define-property": "^0.2.5", + "kind-of": "^3.0.3" + }, + "engines": { + "node": ">=0.10.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, + "license": "MIT", + "peer": true, + "dependencies": { + "is-descriptor": "^0.1.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "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, + "license": "MIT", + "peer": true, + "dependencies": { + "is-accessor-descriptor": "^1.0.1", + "is-data-descriptor": "^1.0.1" + }, + "engines": { + "node": ">= 0.4" + } + }, + "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, + "license": "MIT", + "peer": true, + "dependencies": { + "is-buffer": "^1.1.5" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/object-inspect": { + "version": "1.13.3", + "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.13.3.tgz", + "integrity": "sha512-kDCGIbxkDSXE3euJZZXzc6to7fCrKHNI/hSRQnRuQ+BWjFNzZwiFF8fj/6o2t2G9/jTj8PSIYTfCLelLZEeRpA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/object-is": { + "version": "1.1.6", + "resolved": "https://registry.npmjs.org/object-is/-/object-is-1.1.6.tgz", + "integrity": "sha512-F8cZ+KfGlSGi09lJT7/Nd6KJZ9ygtvYC0/UYYLI9nmQKLMnydpB9yvbv9K1uSkEu7FU9vYPmVwLg328tX+ot3Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.7", + "define-properties": "^1.2.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/object-keys": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.1.1.tgz", + "integrity": "sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + } + }, + "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, + "license": "MIT", + "peer": true, + "dependencies": { + "isobject": "^3.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "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", + "dependencies": { + "call-bind": "^1.0.5", + "define-properties": "^1.2.1", + "has-symbols": "^1.0.3", + "object-keys": "^1.1.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/object.fromentries": { + "version": "2.0.8", + "resolved": "https://registry.npmjs.org/object.fromentries/-/object.fromentries-2.0.8.tgz", + "integrity": "sha512-k6E21FzySsSK5a21KRADBd/NGneRegFO5pLHfdQLpRDETUNJueLXs3WCzyQ3tFRDYgbq3KHGXfTbi2bs8WQ6rQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.7", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.2", + "es-object-atoms": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/object.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/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, + "license": "MIT", + "peer": true, + "dependencies": { + "isobject": "^3.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "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==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.7", + "define-properties": "^1.2.1", + "es-object-atoms": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/once": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", + "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==", + "dev": true, + "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==", + "dev": true, + "license": "MIT", + "dependencies": { + "mimic-fn": "^2.1.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/open": { + "version": "8.4.2", + "resolved": "https://registry.npmjs.org/open/-/open-8.4.2.tgz", + "integrity": "sha512-7x81NCL719oNbsq/3mh+hVrAWmFuEYUqrq/Iw3kUzH8ReypT9QQ0BLoJS7/G9k6N81XjW4qHWtjWwe/9eLy1EQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "define-lazy-prop": "^2.0.0", + "is-docker": "^2.1.1", + "is-wsl": "^2.2.0" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/open-sans-fonts": { + "version": "1.6.2", + "resolved": "https://registry.npmjs.org/open-sans-fonts/-/open-sans-fonts-1.6.2.tgz", + "integrity": "sha512-vsJ6/Mm0TdUKQJqxfkXJy+0K2X0QeRuTmxQq9YE1ycziw6CbDPolDsHhQ6+ImoV/7OTh8K8ZTGklY1Z5nUAwug==", + "deprecated": "Package no longer supported. Contact Support at https://www.npmjs.com/support for more info.", + "dev": true, + "license": "Apache-2.0" + }, + "node_modules/opener": { + "version": "1.5.2", + "resolved": "https://registry.npmjs.org/opener/-/opener-1.5.2.tgz", + "integrity": "sha512-ur5UIdyw5Y7yEj9wLzhqXiy6GZ3Mwx0yGI+5sMn2r0N0v3cKJvUmFH5yPP+WXh9e0xfyzyJX95D8l088DNFj7A==", + "dev": true, + "license": "(WTFPL OR MIT)", + "bin": { + "opener": "bin/opener-bin.js" + } + }, + "node_modules/optionator": { + "version": "0.9.4", + "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.9.4.tgz", + "integrity": "sha512-6IpQ7mKUxRcZNLIObR0hz7lxsapSSIYNZJwXPGeF0mTVqGKFIXj1DQcMoT22S3ROcLyY/rz0PWaWZ9ayWmad9g==", + "dev": true, + "license": "MIT", + "dependencies": { + "deep-is": "^0.1.3", + "fast-levenshtein": "^2.0.6", + "levn": "^0.4.1", + "prelude-ls": "^1.2.1", + "type-check": "^0.4.0", + "word-wrap": "^1.2.5" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/ora": { + "version": "5.4.1", + "resolved": "https://registry.npmjs.org/ora/-/ora-5.4.1.tgz", + "integrity": "sha512-5b6Y85tPxZZ7QytO+BQzysW31HJku27cRIlkbAXaNx+BdcVi+LlRFmVXzeF6a7JCwJpyw5c4b+YSVImQIrBpuQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "bl": "^4.1.0", + "chalk": "^4.1.0", + "cli-cursor": "^3.1.0", + "cli-spinners": "^2.5.0", + "is-interactive": "^1.0.0", + "is-unicode-supported": "^0.1.0", + "log-symbols": "^4.1.0", + "strip-ansi": "^6.0.0", + "wcwidth": "^1.0.1" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/ora/node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "license": "MIT", + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/ora/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/ora/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==", + "dev": true, + "license": "MIT", + "dependencies": { + "restore-cursor": "^3.1.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/ora/node_modules/restore-cursor": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-3.1.0.tgz", + "integrity": "sha512-l+sSefzHpj5qimhFSE5a8nufZYAM3sBSVMAPtYkmC+4EH2anSGaEMXSD0izRQbu9nfyQ9y5JrVmp7E8oZrUjvA==", + "dev": true, + "license": "MIT", + "dependencies": { + "onetime": "^5.1.0", + "signal-exit": "^3.0.2" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/ora/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/ora/node_modules/strip-ansi": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "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==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "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, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/p-limit": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz", + "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "yocto-queue": "^0.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/p-locate": { + "version": "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/p-locate/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/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==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/package-json-from-dist": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/package-json-from-dist/-/package-json-from-dist-1.0.1.tgz", + "integrity": "sha512-UEZIS3/by4OC8vL3P2dTXRETpebLI2NiI5vIrjaD/5UtrkFX/tNbwjTSRAGC/+7CAo2pIcBaRgWmcBBHcsaCIw==", + "dev": true, + "license": "BlueOak-1.0.0" + }, + "node_modules/pako": { + "version": "0.2.9", + "resolved": "https://registry.npmjs.org/pako/-/pako-0.2.9.tgz", + "integrity": "sha512-NUcwaKxUxWrZLpDG+z/xZaCgQITkA/Dv4V/T6bw7VON6l1Xz/VnrBqrYjZQ12TamKHzITTfOEIYUj48y2KXImA==", + "dev": true, + "license": "MIT" + }, + "node_modules/param-case": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/param-case/-/param-case-3.0.4.tgz", + "integrity": "sha512-RXlj7zCYokReqWpOPH9oYivUzLYZ5vAPIfEmCTNViosC78F8F0H9y7T7gG2M39ymgutxF5gcFEsyZQSph9Bp3A==", + "dev": true, + "license": "MIT", + "dependencies": { + "dot-case": "^3.0.4", + "tslib": "^2.0.3" + } + }, + "node_modules/parent-module": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz", + "integrity": "sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==", + "dev": true, + "license": "MIT", + "dependencies": { + "callsites": "^3.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/parse-entities": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/parse-entities/-/parse-entities-4.0.1.tgz", + "integrity": "sha512-SWzvYcSJh4d/SGLIOQfZ/CoNv6BTlI6YEQ7Nj82oDVnRpwe/Z/F1EMx42x3JAOwGBlCjeCH0BRJQbQ/opHL17w==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/unist": "^2.0.0", + "character-entities": "^2.0.0", + "character-entities-legacy": "^3.0.0", + "character-reference-invalid": "^2.0.0", + "decode-named-character-reference": "^1.0.0", + "is-alphanumerical": "^2.0.0", + "is-decimal": "^2.0.0", + "is-hexadecimal": "^2.0.0" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/parse-entities/node_modules/@types/unist": { + "version": "2.0.11", + "resolved": "https://registry.npmjs.org/@types/unist/-/unist-2.0.11.tgz", + "integrity": "sha512-CmBKiL6NNo/OqgmMn95Fk9Whlp2mtvIv+KNpQKN2F4SjvrEesubTRWGYSg+BnWZOnlCaSTU1sMpsBOzgbYhnsA==", + "dev": true, + "license": "MIT" + }, + "node_modules/parse-github-url": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/parse-github-url/-/parse-github-url-1.0.2.tgz", + "integrity": "sha512-kgBf6avCbO3Cn6+RnzRGLkUsv4ZVqv/VfAYkRsyBcgkshNvVBkRn1FEZcW0Jb+npXQWm2vHPnnOqFteZxRRGNw==", + "dev": true, + "license": "MIT", + "bin": { + "parse-github-url": "cli.js" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/parse-imports": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/parse-imports/-/parse-imports-2.2.1.tgz", + "integrity": "sha512-OL/zLggRp8mFhKL0rNORUTR4yBYujK/uU+xZL+/0Rgm2QE4nLO9v8PzEweSJEbMGKmDRjJE4R3IMJlL2di4JeQ==", + "dev": true, + "license": "Apache-2.0 AND MIT", + "dependencies": { + "es-module-lexer": "^1.5.3", + "slashes": "^3.0.12" + }, + "engines": { + "node": ">= 18" + } + }, + "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", + "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" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/parse-passwd": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/parse-passwd/-/parse-passwd-1.0.0.tgz", + "integrity": "sha512-1Y1A//QUXEZK7YKz+rD9WydcE1+EuPr6ZBgKecAB8tmoW6UFv0NREVJe1p+jRxtThkcbbKkfwIbWJe/IeE6m2Q==", + "dev": true, + "license": "MIT", + "peer": true, + "engines": { + "node": ">=0.10.0" + } + }, + "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==", + "dev": true, + "license": "MIT", + "dependencies": { + "no-case": "^3.0.4", + "tslib": "^2.0.3" + } + }, + "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, + "license": "MIT", + "peer": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/path-browserify": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/path-browserify/-/path-browserify-1.0.1.tgz", + "integrity": "sha512-b7uo2UCUOYZcnF/3ID0lulOJi/bafxa1xPe7ZPsammBSpjSWQkjNxlt635YGS2MiR9GjvuXCtz2emr3jbsz98g==", + "dev": true, + "license": "MIT" + }, + "node_modules/path-exists": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", + "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/path-is-absolute": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", + "integrity": "sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/path-key": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", + "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/path-parse": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz", + "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==", + "dev": true, + "license": "MIT" + }, + "node_modules/path-scurry": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/path-scurry/-/path-scurry-1.11.1.tgz", + "integrity": "sha512-Xa4Nw17FS9ApQFJ9umLiJS4orGjm7ZzwUrwamcGQuHSzDyth9boKDaycYdDcZDuqYATXw4HFXgaqWTctW/v1HA==", + "dev": true, + "license": "BlueOak-1.0.0", + "dependencies": { + "lru-cache": "^10.2.0", + "minipass": "^5.0.0 || ^6.0.2 || ^7.0.0" + }, + "engines": { + "node": ">=16 || 14 >=14.18" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/path-scurry/node_modules/lru-cache": { + "version": "10.4.3", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-10.4.3.tgz", + "integrity": "sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ==", + "dev": true, + "license": "ISC" + }, + "node_modules/path-type": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/path-type/-/path-type-4.0.0.tgz", + "integrity": "sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/pathval": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/pathval/-/pathval-2.0.0.tgz", + "integrity": "sha512-vE7JKRyES09KiunauX7nd2Q9/L7lhok4smP9RZTDeD4MVs72Dp2qNFVz39Nz5a0FVEW0BJR6C0DYrq6unoziZA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 14.16" + } + }, + "node_modules/peek-stream": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/peek-stream/-/peek-stream-1.1.3.tgz", + "integrity": "sha512-FhJ+YbOSBb9/rIl2ZeE/QHEsWn7PqNYt8ARAY3kIgNGOk13g9FGyIY6JIl/xB/3TFRVoTv5as0l11weORrTekA==", + "dev": true, + "license": "MIT", + "dependencies": { + "buffer-from": "^1.0.0", + "duplexify": "^3.5.0", + "through2": "^2.0.3" + } + }, + "node_modules/pend": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/pend/-/pend-1.2.0.tgz", + "integrity": "sha512-F3asv42UuXchdzt+xXqfW1OGlVBe+mxa2mqI0pg5yAHZPvFmY3Y6drSf/GQ1A86WgWEN9Kzh/WrgKa6iGcHXLg==", + "dev": true, + "license": "MIT" + }, + "node_modules/perf_hooks": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/perf_hooks/-/perf_hooks-0.0.1.tgz", + "integrity": "sha512-qG/D9iA4KDme+KF4vCObJy6Bouu3BlQnmJ8jPydVPm32NJBD9ZK1ZNgXSYaZKHkVC1sKSqUiLgFvAZPUiIEnBw==", + "dev": true, + "license": "MIT" + }, + "node_modules/picocolors": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.1.1.tgz", + "integrity": "sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==", + "dev": true, + "license": "ISC" + }, + "node_modules/picomatch": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.2.tgz", + "integrity": "sha512-M7BAV6Rlcy5u+m6oPhAPFgJTzAioX/6B0DxyvDlo9l8+T3nLKbrczg2WLUyzd45L8RqfUMyGPzekbMvX2Ldkwg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, + "node_modules/pidtree": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/pidtree/-/pidtree-0.6.0.tgz", + "integrity": "sha512-eG2dWTVw5bzqGRztnHExczNxt5VGsE6OwTeCG3fdUf9KBsZzO3R5OIIIzWR+iZA0NtZ+RDVdaoE2dK1cn6jH4g==", + "dev": true, + "license": "MIT", + "bin": { + "pidtree": "bin/pidtree.js" + }, + "engines": { + "node": ">=0.10" + } + }, + "node_modules/pify": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", + "integrity": "sha512-udgsAY+fTnvv7kI7aaxbqwWNb0AHiB0qBO89PZKPkoTmGOgdbrHDKD+0B2X4uTfJ/FT1R09r9gTsjUjNJotuog==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/pinkie": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/pinkie/-/pinkie-2.0.4.tgz", + "integrity": "sha512-MnUuEycAemtSaeFSjXKW/aroV7akBbY+Sv+RkyqFjgAe73F+MR0TBWKBRDkmfWq/HiFmdavfZ1G7h4SPZXaCSg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/pinkie-promise": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/pinkie-promise/-/pinkie-promise-2.0.1.tgz", + "integrity": "sha512-0Gni6D4UcLTbv9c57DfxDGdr41XfgUjqWZu492f0cIGr16zDU06BWP/RAEvOuo7CQ0CNjHaLlM59YJJFm3NWlw==", + "dev": true, + "license": "MIT", + "dependencies": { + "pinkie": "^2.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/pirates": { + "version": "4.0.6", + "resolved": "https://registry.npmjs.org/pirates/-/pirates-4.0.6.tgz", + "integrity": "sha512-saLsH7WeYYPiD25LDuLRRY/i+6HaPYr6G1OUlN39otzkSTxKnubR9RTxS3/Kk50s1g2JTgFwWQDQyplC5/SHZg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 6" + } + }, + "node_modules/pixi-spine": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/pixi-spine/-/pixi-spine-4.0.4.tgz", + "integrity": "sha512-XRq1yARVoi4av7RXnd9+P37SWI9+e4/f5yTScZPJGB+sY5VcRYN6BYkBQ+y8nUKI1aJIjlms9z+pGxqikm+eFQ==", + "dev": true, + "license": "SEE SPINE-LICENSE", + "dependencies": { + "@pixi-spine/base": "^4.0.3", + "@pixi-spine/loader-base": "^4.0.4", + "@pixi-spine/loader-uni": "^4.0.3", + "@pixi-spine/runtime-3.7": "^4.0.3", + "@pixi-spine/runtime-3.8": "^4.0.3", + "@pixi-spine/runtime-4.0": "^4.0.3", + "@pixi-spine/runtime-4.1": "^4.0.3" + }, + "peerDependencies": { + "@pixi/assets": "^7.0.0", + "@pixi/core": "^7.0.0", + "@pixi/display": "^7.0.0", + "@pixi/graphics": "^7.0.0", + "@pixi/mesh": "^7.0.0", + "@pixi/mesh-extras": "^7.0.0", + "@pixi/sprite": "^7.0.0" + } + }, + "node_modules/pixi.js": { + "version": "7.4.2", + "resolved": "https://registry.npmjs.org/pixi.js/-/pixi.js-7.4.2.tgz", + "integrity": "sha512-TifqgHGNofO7UCEbdZJOpUu7dUnpu4YZ0o76kfCqxDa4RS8ITc9zjECCbtalmuNXkVhSEZmBKQvE7qhHMqw/xg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@pixi/accessibility": "7.4.2", + "@pixi/app": "7.4.2", + "@pixi/assets": "7.4.2", + "@pixi/compressed-textures": "7.4.2", + "@pixi/core": "7.4.2", + "@pixi/display": "7.4.2", + "@pixi/events": "7.4.2", + "@pixi/extensions": "7.4.2", + "@pixi/extract": "7.4.2", + "@pixi/filter-alpha": "7.4.2", + "@pixi/filter-blur": "7.4.2", + "@pixi/filter-color-matrix": "7.4.2", + "@pixi/filter-displacement": "7.4.2", + "@pixi/filter-fxaa": "7.4.2", + "@pixi/filter-noise": "7.4.2", + "@pixi/graphics": "7.4.2", + "@pixi/mesh": "7.4.2", + "@pixi/mesh-extras": "7.4.2", + "@pixi/mixin-cache-as-bitmap": "7.4.2", + "@pixi/mixin-get-child-by-name": "7.4.2", + "@pixi/mixin-get-global-position": "7.4.2", + "@pixi/particle-container": "7.4.2", + "@pixi/prepare": "7.4.2", + "@pixi/sprite": "7.4.2", + "@pixi/sprite-animated": "7.4.2", + "@pixi/sprite-tiling": "7.4.2", + "@pixi/spritesheet": "7.4.2", + "@pixi/text": "7.4.2", + "@pixi/text-bitmap": "7.4.2", + "@pixi/text-html": "7.4.2" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/pixijs" + } + }, + "node_modules/pkg-dir": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-7.0.0.tgz", + "integrity": "sha512-Ie9z/WINcxxLp27BKOCHGde4ITq9UklYKDzVo1nhk5sqGEXU3FpkwP5GM2voTGJkGd9B3Otl+Q4uwSOeSUtOBA==", + "dev": true, + "license": "MIT", + "dependencies": { + "find-up": "^6.3.0" + }, + "engines": { + "node": ">=14.16" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/pkg-dir/node_modules/find-up": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-6.3.0.tgz", + "integrity": "sha512-v2ZsoEuVHYy8ZIlYqwPe/39Cy+cFDzp4dXPaxNvkEuouymu+2Jbz0PxpKarJHYJTmv2HWT3O382qY8l4jMWthw==", + "dev": true, + "license": "MIT", + "dependencies": { + "locate-path": "^7.1.0", + "path-exists": "^5.0.0" + }, + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/pkg-dir/node_modules/locate-path": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-7.2.0.tgz", + "integrity": "sha512-gvVijfZvn7R+2qyPX8mAuKcFGDf6Nc61GdvGafQsHL0sBIxfKzA+usWn4GFC/bk+QdwPUD4kWFJLhElipq+0VA==", + "dev": true, + "license": "MIT", + "dependencies": { + "p-locate": "^6.0.0" + }, + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/pkg-dir/node_modules/p-limit": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-4.0.0.tgz", + "integrity": "sha512-5b0R4txpzjPWVw/cXXUResoD4hb6U/x9BH08L7nw+GN1sezDzPdxeRvpc9c433fZhBan/wusjbCsqwqm4EIBIQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "yocto-queue": "^1.0.0" + }, + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/pkg-dir/node_modules/p-locate": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-6.0.0.tgz", + "integrity": "sha512-wPrq66Llhl7/4AGC6I+cqxT07LhXvWL08LNXz1fENOw0Ap4sRZZ/gZpTTJ5jpurzzzfS2W/Ge9BY3LgLjCShcw==", + "dev": true, + "license": "MIT", + "dependencies": { + "p-limit": "^4.0.0" + }, + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/pkg-dir/node_modules/path-exists": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-5.0.0.tgz", + "integrity": "sha512-RjhtfwJOxzcFmNOi6ltcbcu4Iu+FL3zEj83dk4kAS+fVpTxXLO1b38RvJgT/0QwvV/L3aY9TAnyv0EOqW4GoMQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + } + }, + "node_modules/pkg-dir/node_modules/yocto-queue": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-1.1.1.tgz", + "integrity": "sha512-b4JR1PFR10y1mKjhHY9LaGo6tmrgjit7hxVIeAmyMw3jegXR4dhYqLaQF5zMXZxY7tLpMyJeLjr1C4rLmkVe8g==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12.20" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/pkg-up": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/pkg-up/-/pkg-up-3.1.0.tgz", + "integrity": "sha512-nDywThFk1i4BQK4twPQ6TA4RT8bDY96yeuCVBWL3ePARCiEKDRSrNGbFIgUJpLp+XeIR65v8ra7WuJOFUBtkMA==", + "dev": true, + "license": "MIT", + "dependencies": { + "find-up": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/pkg-up/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/pkg-up/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/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==", + "dev": true, + "license": "MIT", + "dependencies": { + "p-try": "^2.0.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/pkg-up/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/pkg-up/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/plimit-lit": { + "version": "1.6.1", + "resolved": "https://registry.npmjs.org/plimit-lit/-/plimit-lit-1.6.1.tgz", + "integrity": "sha512-B7+VDyb8Tl6oMJT9oSO2CW8XC/T4UcJGrwOVoNGwOQsQYhlpfajmrMj5xeejqaASq3V/EqThyOeATEOMuSEXiA==", + "dev": true, + "license": "MIT", + "dependencies": { + "queue-lit": "^1.5.1" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/polished": { + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/polished/-/polished-4.3.1.tgz", + "integrity": "sha512-OBatVyC/N7SCW/FaDHrSd+vn0o5cS855TOmYi4OkdWUMSJCET/xip//ch8xGUvtr3i44X9LVyWwQlRMTN3pwSA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/runtime": "^7.17.8" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/portfinder": { + "version": "1.0.32", + "resolved": "https://registry.npmjs.org/portfinder/-/portfinder-1.0.32.tgz", + "integrity": "sha512-on2ZJVVDXRADWE6jnQaX0ioEylzgBpQk8r55NE4wjXW1ZxO+BgDlY6DXwj20i0V8eB4SenDQ00WEaxfiIQPcxg==", + "dev": true, + "license": "MIT", + "dependencies": { + "async": "^2.6.4", + "debug": "^3.2.7", + "mkdirp": "^0.5.6" + }, + "engines": { + "node": ">= 0.12.0" + } + }, + "node_modules/portfinder/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/portfinder/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/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", + "peer": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/possible-typed-array-names": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/possible-typed-array-names/-/possible-typed-array-names-1.0.0.tgz", + "integrity": "sha512-d7Uw+eZoloe0EHDIYoe+bQ5WXnGMOpmiZFTuMWCwpjzzkL2nTjcKiAk4hh8TjnGye2TwWOk3UXucZ+3rbmBa8Q==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/postcss": { + "version": "8.4.49", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.49.tgz", + "integrity": "sha512-OCVPnIObs4N29kxTjzLfUryOkvZEq+pf8jTF0lg8E7uETuWHA+v7j3c/xJmiqpX450191LlmZfUKkXxkTry7nA==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/postcss" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", + "dependencies": { + "nanoid": "^3.3.7", + "picocolors": "^1.1.1", + "source-map-js": "^1.2.1" + }, + "engines": { + "node": "^10 || ^12 || >=14" + } + }, + "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", + "engines": { + "node": "^10 || ^12 || >= 14" + }, + "peerDependencies": { + "postcss": "^8.1.0" + } + }, + "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, + "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" + } + }, + "node_modules/postcss-modules-scope": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/postcss-modules-scope/-/postcss-modules-scope-3.2.1.tgz", + "integrity": "sha512-m9jZstCVaqGjTAuny8MdgE88scJnCiQSlSrOWcTQgM2t32UBe+MUmFSO5t7VMSfAf/FJKImAxBav8ooCHJXCJA==", + "dev": true, + "license": "ISC", + "dependencies": { + "postcss-selector-parser": "^7.0.0" + }, + "engines": { + "node": "^10 || ^12 || >= 14" + }, + "peerDependencies": { + "postcss": "^8.1.0" + } + }, + "node_modules/postcss-modules-values": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/postcss-modules-values/-/postcss-modules-values-4.0.0.tgz", + "integrity": "sha512-RDxHkAiEGI78gS2ofyvCsu7iycRv7oqw5xMWn9iMoR0N/7mf9D50ecQqUo5BZ9Zh2vH4bCUR/ktCqbB9m8vJjQ==", + "dev": true, + "license": "ISC", + "dependencies": { + "icss-utils": "^5.0.0" + }, + "engines": { + "node": "^10 || ^12 || >= 14" + }, + "peerDependencies": { + "postcss": "^8.1.0" + } + }, + "node_modules/postcss-selector-parser": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-7.0.0.tgz", + "integrity": "sha512-9RbEr1Y7FFfptd/1eEdntyjMwLeghW1bHX9GWjXo19vx4ytPQhANltvVxDggzJl7mnWM+dX28kb6cyS/4iQjlQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "cssesc": "^3.0.0", + "util-deprecate": "^1.0.2" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/postcss-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.8", + "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.8.tgz", + "integrity": "sha512-WNLf5Sd8oZxOm+TzppcYk8gVOgP+l58xNy58D0nbUnOxOWRWvlcCV4kUF7ltmI6PsrLl/BgKEyS4mqsGChFN0w==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", + "bin": { + "nanoid": "bin/nanoid.cjs" + }, + "engines": { + "node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1" + } + }, + "node_modules/prelude-ls": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.2.1.tgz", + "integrity": "sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/prettier": { + "version": "3.4.1", + "resolved": "https://registry.npmjs.org/prettier/-/prettier-3.4.1.tgz", + "integrity": "sha512-G+YdqtITVZmOJje6QkXQWzl3fSfMxFwm1tjTyo9exhkmWSqC4Yhd1+lug++IlR2mvRVAxEDDWYkQdeSztajqgg==", + "dev": true, + "license": "MIT", + "bin": { + "prettier": "bin/prettier.cjs" + }, + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/prettier/prettier?sponsor=1" + } + }, + "node_modules/pretty-error": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/pretty-error/-/pretty-error-4.0.0.tgz", + "integrity": "sha512-AoJ5YMAcXKYxKhuJGdcvse+Voc6v1RgnsR3nWcYU7q4t6z0Q6T86sv5Zq8VIRbOWWFpvdGE83LtdSMNd+6Y0xw==", + "dev": true, + "license": "MIT", + "dependencies": { + "lodash": "^4.17.20", + "renderkid": "^3.0.0" + } + }, + "node_modules/pretty-format": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-27.5.1.tgz", + "integrity": "sha512-Qb1gy5OrP5+zDf2Bvnzdl3jsTf1qXVMazbvCoKhtKqVs4/YK4ozX4gKQJJVyNe+cajNPn0KoC0MC3FUmaHWEmQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-regex": "^5.0.1", + "ansi-styles": "^5.0.0", + "react-is": "^17.0.1" + }, + "engines": { + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + } + }, + "node_modules/process": { + "version": "0.11.10", + "resolved": "https://registry.npmjs.org/process/-/process-0.11.10.tgz", + "integrity": "sha512-cdGef/drWFoydD1JsMzuFf8100nZl+GT+yacc2bEced5f9Rjk4z+WtFUTBu9PhOi9j/jfmBPu0mMEY4wIdAF8A==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.6.0" + } + }, + "node_modules/process-nextick-args": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz", + "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==", + "dev": true, + "license": "MIT" + }, + "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/prompts": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/prompts/-/prompts-2.4.2.tgz", + "integrity": "sha512-NxNv/kLguCA7p3jE8oL2aEBsrJWgAakBpgmgK6lpPWV+WuOmY6r2/zbAVnP+T8bQlA0nzHXSJSJW0Hq7ylaD2Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "kleur": "^3.0.3", + "sisteransi": "^1.0.5" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/property-information": { + "version": "6.5.0", + "resolved": "https://registry.npmjs.org/property-information/-/property-information-6.5.0.tgz", + "integrity": "sha512-PgTgs/BlvHxOu8QuEN7wi5A0OmXaBcHpmCSTehcs6Uuu9IkDIEo13Hy7n898RHfrQ49vKCoGeWZSaAK01nwVig==", + "dev": true, + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "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, + "license": "MIT", + "dependencies": { + "end-of-stream": "^1.1.0", + "once": "^1.3.1" + } + }, + "node_modules/pumpify": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/pumpify/-/pumpify-1.5.1.tgz", + "integrity": "sha512-oClZI37HvuUJJxSKKrC17bZ9Cu0ZYhEAGPsPUy9KlMUmv9dKX2o77RUmq7f3XjIxbwyGwYzbzQ1L2Ks8sIradQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "duplexify": "^3.6.0", + "inherits": "^2.0.3", + "pump": "^2.0.0" + } + }, + "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", + "dependencies": { + "end-of-stream": "^1.1.0", + "once": "^1.3.1" + } + }, + "node_modules/punycode": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.1.tgz", + "integrity": "sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/pure-rand": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/pure-rand/-/pure-rand-6.1.0.tgz", + "integrity": "sha512-bVWawvoZoBYpp6yIoQtQXHZjmz35RSVHnUOTefl8Vcjr8snTPY1wnpSPMWekcFwbxI6gtmT7rSYPFvz71ldiOA==", + "dev": true, + "funding": [ + { + "type": "individual", + "url": "https://github.com/sponsors/dubzzz" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/fast-check" + } + ], + "license": "MIT" + }, + "node_modules/qs": { + "version": "6.13.1", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.13.1.tgz", + "integrity": "sha512-EJPeIn0CYrGu+hli1xilKAPXODtJ12T0sP63Ijx2/khC2JtuaN3JyNIpvmnkmaEtha9ocbG4A4cMcr+TvqvwQg==", + "dev": true, + "license": "BSD-3-Clause", + "dependencies": { + "side-channel": "^1.0.6" + }, + "engines": { + "node": ">=0.6" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/queue-lit": { + "version": "1.5.2", + "resolved": "https://registry.npmjs.org/queue-lit/-/queue-lit-1.5.2.tgz", + "integrity": "sha512-tLc36IOPeMAubu8BkW8YDBV+WyIgKlYU7zUNs0J5Vk9skSZ4JfGlPOqplP0aHdfv7HL0B2Pg6nwiq60Qc6M2Hw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12" + } + }, + "node_modules/queue-microtask": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz", + "integrity": "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "license": "MIT" + }, + "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==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/randombytes": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/randombytes/-/randombytes-2.1.0.tgz", + "integrity": "sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "safe-buffer": "^5.1.0" + } + }, + "node_modules/range-parser": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.1.tgz", + "integrity": "sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/react": { + "version": "18.3.1", + "resolved": "https://registry.npmjs.org/react/-/react-18.3.1.tgz", + "integrity": "sha512-wS+hAgJShR0KhEvPJArfuPVN1+Hz1t0Y6n5jLrGQbkb4urgPE/0Rve+1kMB1v/oWgHgm4WIcV+i7F2pTVj+2iQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "loose-envify": "^1.1.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/react-confetti": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/react-confetti/-/react-confetti-6.1.0.tgz", + "integrity": "sha512-7Ypx4vz0+g8ECVxr88W9zhcQpbeujJAVqL14ZnXJ3I23mOI9/oBVTQ3dkJhUmB0D6XOtCZEM6N0Gm9PMngkORw==", + "dev": true, + "license": "MIT", + "dependencies": { + "tween-functions": "^1.2.0" + }, + "engines": { + "node": ">=10.18" + }, + "peerDependencies": { + "react": "^16.3.0 || ^17.0.1 || ^18.0.0" + } + }, + "node_modules/react-dom": { + "version": "18.3.1", + "resolved": "https://registry.npmjs.org/react-dom/-/react-dom-18.3.1.tgz", + "integrity": "sha512-5m4nQKp+rZRb09LNH59GM4BxTh9251/ylbKIbpe7TpGxfJ+9kv6BLkLBXIjjspbgbnIBNqlI23tRnTWT0snUIw==", + "dev": true, + "license": "MIT", + "dependencies": { + "loose-envify": "^1.1.0", + "scheduler": "^0.23.2" + }, + "peerDependencies": { + "react": "^18.3.1" + } + }, + "node_modules/react-is": { + "version": "17.0.2", + "resolved": "https://registry.npmjs.org/react-is/-/react-is-17.0.2.tgz", + "integrity": "sha512-w2GsyukL62IJnlaff/nRegPQR94C/XXamvMWmSHRJ4y7Ts/4ocGRmTHvOs8PSE6pB3dWOrD/nueuU5sduBsQ4w==", + "dev": true, + "license": "MIT" + }, + "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, + "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" + }, + "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==", + "dev": true, + "license": "MIT", + "dependencies": { + "find-up": "^4.1.0", + "read-pkg": "^5.2.0", + "type-fest": "^0.8.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "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)", + "engines": { + "node": ">=8" + } + }, + "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)", + "engines": { + "node": ">=8" + } + }, + "node_modules/readable-stream": { + "version": "1.0.34", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-1.0.34.tgz", + "integrity": "sha512-ok1qVCJuRkNmvebYikljxJA/UEsKwLl2nI1OmaqAu4/UE+h0wKCHok4XkL/gvi39OacXvw59RJUOFUkDib2rHg==", + "dev": true, + "license": "MIT", + "dependencies": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.1", + "isarray": "0.0.1", + "string_decoder": "~0.10.x" + } + }, + "node_modules/readable-stream/node_modules/isarray": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz", + "integrity": "sha512-D2S+3GLxWH+uhrNEcoh/fnmYeP8E8/zHl644d/jdA0g2uyXvy3sb0qxotE+ne0LtccHknQzWwZEzhak7oJ0COQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/readdirp": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz", + "integrity": "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==", + "dev": true, + "license": "MIT", + "dependencies": { + "picomatch": "^2.2.1" + }, + "engines": { + "node": ">=8.10.0" + } + }, + "node_modules/readdirp/node_modules/picomatch": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", + "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8.6" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, + "node_modules/recast": { + "version": "0.23.9", + "resolved": "https://registry.npmjs.org/recast/-/recast-0.23.9.tgz", + "integrity": "sha512-Hx/BGIbwj+Des3+xy5uAtAbdCyqK9y9wbBcDFDYanLS9JnMqf7OeF87HQwUimE87OEc72mr6tkKUKMBBL+hF9Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "ast-types": "^0.16.1", + "esprima": "~4.0.0", + "source-map": "~0.6.1", + "tiny-invariant": "^1.3.3", + "tslib": "^2.0.1" + }, + "engines": { + "node": ">= 4" + } + }, + "node_modules/recast/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==", + "dev": true, + "license": "BSD-3-Clause", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/recma-build-jsx": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/recma-build-jsx/-/recma-build-jsx-1.0.0.tgz", + "integrity": "sha512-8GtdyqaBcDfva+GUKDr3nev3VpKAhup1+RvkMvUxURHpW7QyIvk9F5wz7Vzo06CEMSilw6uArgRqhpiUcWp8ew==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/estree": "^1.0.0", + "estree-util-build-jsx": "^3.0.0", + "vfile": "^6.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/recma-jsx": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/recma-jsx/-/recma-jsx-1.0.0.tgz", + "integrity": "sha512-5vwkv65qWwYxg+Atz95acp8DMu1JDSqdGkA2Of1j6rCreyFUE/gp15fC8MnGEuG1W68UKjM6x6+YTWIh7hZM/Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "acorn-jsx": "^5.0.0", + "estree-util-to-js": "^2.0.0", + "recma-parse": "^1.0.0", + "recma-stringify": "^1.0.0", + "unified": "^11.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/recma-parse": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/recma-parse/-/recma-parse-1.0.0.tgz", + "integrity": "sha512-OYLsIGBB5Y5wjnSnQW6t3Xg7q3fQ7FWbw/vcXtORTnyaSFscOtABg+7Pnz6YZ6c27fG1/aN8CjfwoUEUIdwqWQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/estree": "^1.0.0", + "esast-util-from-js": "^2.0.0", + "unified": "^11.0.0", + "vfile": "^6.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/recma-stringify": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/recma-stringify/-/recma-stringify-1.0.0.tgz", + "integrity": "sha512-cjwII1MdIIVloKvC9ErQ+OgAtwHBmcZ0Bg4ciz78FtbT8In39aAYbaA7zvxQ61xVMSPE8WxhLwLbhif4Js2C+g==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/estree": "^1.0.0", + "estree-util-to-js": "^2.0.0", + "unified": "^11.0.0", + "vfile": "^6.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/redent": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/redent/-/redent-3.0.0.tgz", + "integrity": "sha512-6tDA8g98We0zd0GvVeMT9arEOnTw9qM03L9cJXaCjrip1OO764RDBLBfrB4cwzNGDj5OA5ioymC9GkizgWJDUg==", + "dev": true, + "license": "MIT", + "dependencies": { + "indent-string": "^4.0.0", + "strip-indent": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/reflect.getprototypeof": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/reflect.getprototypeof/-/reflect.getprototypeof-1.0.7.tgz", + "integrity": "sha512-bMvFGIUKlc/eSfXNX+aZ+EL95/EgZzuwA0OBPTbZZDEJw/0AkentjMuM1oiRfwHrshqk4RzdgiTg5CcDalXN5g==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.7", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.5", + "es-errors": "^1.3.0", + "get-intrinsic": "^1.2.4", + "gopd": "^1.0.1", + "which-builtin-type": "^1.1.4" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/regenerate": { + "version": "1.4.2", + "resolved": "https://registry.npmjs.org/regenerate/-/regenerate-1.4.2.tgz", + "integrity": "sha512-zrceR/XhGYU/d/opr2EKO7aRHUeiBI8qjtfHqADTwZd6Szfy16la6kqD0MIUs5z5hx6AaKa+PixpPrR289+I0A==", + "dev": true, + "license": "MIT" + }, + "node_modules/regenerate-unicode-properties": { + "version": "10.2.0", + "resolved": "https://registry.npmjs.org/regenerate-unicode-properties/-/regenerate-unicode-properties-10.2.0.tgz", + "integrity": "sha512-DqHn3DwbmmPVzeKj9woBadqmXxLvQoQIwu7nopMc72ztvxVmVk2SBhSnx67zuye5TP+lJsb/TBQsjLKhnDf3MA==", + "dev": true, + "license": "MIT", + "dependencies": { + "regenerate": "^1.4.2" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/regenerator-runtime": { + "version": "0.14.1", + "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.14.1.tgz", + "integrity": "sha512-dYnhHh0nJoMfnkZs6GmmhFknAGRrLznOu5nc9ML+EJxGvrx6H7teuevqVqCuPcPK//3eDrrjQhehXVx9cnkGdw==", + "dev": true, + "license": "MIT" + }, + "node_modules/regenerator-transform": { + "version": "0.15.2", + "resolved": "https://registry.npmjs.org/regenerator-transform/-/regenerator-transform-0.15.2.tgz", + "integrity": "sha512-hfMp2BoF0qOk3uc5V20ALGDS2ddjQaLrdl7xrGXvAIow7qeWRM2VA2HuCHkUKk9slq3VwEwLNK3DFBqDfPGYtg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/runtime": "^7.8.4" + } + }, + "node_modules/regex-not": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/regex-not/-/regex-not-1.0.2.tgz", + "integrity": "sha512-J6SDjUgDxQj5NusnOtdFxDwN/+HWykR8GELwctJ7mdqhcyy1xEc4SRFHUXvxTp661YaVKAjfRLZ9cCqS6tn32A==", + "dev": true, + "license": "MIT", + "peer": true, + "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==", + "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": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/regexpu-core": { + "version": "6.2.0", + "resolved": "https://registry.npmjs.org/regexpu-core/-/regexpu-core-6.2.0.tgz", + "integrity": "sha512-H66BPQMrv+V16t8xtmq+UC0CBpiTBA60V8ibS1QVReIp8T1z8hwFxqcGzm9K6lgsN7sB5edVH8a+ze6Fqm4weA==", + "dev": true, + "license": "MIT", + "dependencies": { + "regenerate": "^1.4.2", + "regenerate-unicode-properties": "^10.2.0", + "regjsgen": "^0.8.0", + "regjsparser": "^0.12.0", + "unicode-match-property-ecmascript": "^2.0.0", + "unicode-match-property-value-ecmascript": "^2.1.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/regjsgen": { + "version": "0.8.0", + "resolved": "https://registry.npmjs.org/regjsgen/-/regjsgen-0.8.0.tgz", + "integrity": "sha512-RvwtGe3d7LvWiDQXeQw8p5asZUmfU1G/l6WbUXeHta7Y2PEIvBTwH6E2EfmYUK8pxcxEdEmaomqyp0vZZ7C+3Q==", + "dev": true, + "license": "MIT" + }, + "node_modules/regjsparser": { + "version": "0.12.0", + "resolved": "https://registry.npmjs.org/regjsparser/-/regjsparser-0.12.0.tgz", + "integrity": "sha512-cnE+y8bz4NhMjISKbgeVJtqNbtf5QpjZP+Bslo+UqkIt9QPnX9q095eiRRASJG1/tz6dlNr6Z5NsBiWYokp6EQ==", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "jsesc": "~3.0.2" + }, + "bin": { + "regjsparser": "bin/parser" + } + }, + "node_modules/rehype-recma": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/rehype-recma/-/rehype-recma-1.0.0.tgz", + "integrity": "sha512-lqA4rGUf1JmacCNWWZx0Wv1dHqMwxzsDWYMTowuplHF3xH0N/MmrZ/G3BDZnzAkRmxDadujCjaKM2hqYdCBOGw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/estree": "^1.0.0", + "@types/hast": "^3.0.0", + "hast-util-to-estree": "^3.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/relateurl": { + "version": "0.2.7", + "resolved": "https://registry.npmjs.org/relateurl/-/relateurl-0.2.7.tgz", + "integrity": "sha512-G08Dxvm4iDN3MLM0EsP62EDV9IuhXPR6blNz6Utcp7zyV3tr4HVNINt6MpaRWbxoOHT3Q7YN2P+jaHX8vUbgog==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/remark-mdx": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/remark-mdx/-/remark-mdx-3.1.0.tgz", + "integrity": "sha512-Ngl/H3YXyBV9RcRNdlYsZujAmhsxwzxpDzpDEhFBVAGthS4GDgnctpDjgFl/ULx5UEDzqtW1cyBSNKqYYrqLBA==", + "dev": true, + "license": "MIT", + "dependencies": { + "mdast-util-mdx": "^3.0.0", + "micromark-extension-mdxjs": "^3.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/remark-parse": { + "version": "11.0.0", + "resolved": "https://registry.npmjs.org/remark-parse/-/remark-parse-11.0.0.tgz", + "integrity": "sha512-FCxlKLNGknS5ba/1lmpYijMUzX2esxW5xQqjWxw2eHFfS2MSdaHVINFmhjo+qN1WhZhNimq0dZATN9pH0IDrpA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/mdast": "^4.0.0", + "mdast-util-from-markdown": "^2.0.0", + "micromark-util-types": "^2.0.0", + "unified": "^11.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/remark-rehype": { + "version": "11.1.1", + "resolved": "https://registry.npmjs.org/remark-rehype/-/remark-rehype-11.1.1.tgz", + "integrity": "sha512-g/osARvjkBXb6Wo0XvAeXQohVta8i84ACbenPpoSsxTOQH/Ae0/RGP4WZgnMH5pMLpsj4FG7OHmcIcXxpza8eQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/hast": "^3.0.0", + "@types/mdast": "^4.0.0", + "mdast-util-to-hast": "^13.0.0", + "unified": "^11.0.0", + "vfile": "^6.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/renderkid": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/renderkid/-/renderkid-3.0.0.tgz", + "integrity": "sha512-q/7VIQA8lmM1hF+jn+sFSPWGlMkSAeNYcPLmDQx2zzuiDfaLrOmumR8iaUKlenFgh0XRPIUeSPlH3A+AW3Z5pg==", + "dev": true, + "license": "MIT", + "dependencies": { + "css-select": "^4.1.3", + "dom-converter": "^0.2.0", + "htmlparser2": "^6.1.0", + "lodash": "^4.17.21", + "strip-ansi": "^6.0.1" + } + }, + "node_modules/renderkid/node_modules/strip-ansi": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "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, + "license": "MIT", + "peer": true, + "engines": { + "node": ">=0.10.0" + } + }, + "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", + "peer": true, + "engines": { + "node": ">=0.10" + } + }, + "node_modules/require-directory": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", + "integrity": "sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "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==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "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==", + "dev": true, + "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==", + "dev": true, + "license": "MIT", + "dependencies": { + "is-core-module": "^2.13.0", + "path-parse": "^1.0.7", + "supports-preserve-symlinks-flag": "^1.0.0" + }, + "bin": { + "resolve": "bin/resolve" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/resolve-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-cwd": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/resolve-cwd/-/resolve-cwd-3.0.0.tgz", + "integrity": "sha512-OrZaX2Mb+rJCpH/6CpSqt9xFVpN++x01XnN2ie9g6P5/3xelLAkXWVADpdz1IHD/KFfEXyE6V0U01OQ3UO2rEg==", + "dev": true, + "license": "MIT", + "dependencies": { + "resolve-from": "^5.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/resolve-dir": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/resolve-dir/-/resolve-dir-1.0.1.tgz", + "integrity": "sha512-R7uiTjECzvOsWSfdM0QKFNBVFcK27aHOUwdvK53BcW8zqnGdYp0Fbj82cy54+2A4P2tFM22J5kRfe1R+lM/1yg==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "expand-tilde": "^2.0.0", + "global-modules": "^1.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "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_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", + "peer": true + }, + "node_modules/resolve.exports": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/resolve.exports/-/resolve.exports-2.0.2.tgz", + "integrity": "sha512-X2UW6Nw3n/aMgDVy+0rSqgHlv39WZAlZrXCdnbyEiKm17DSqHX4MmQMaST3FbeWR5FTuRcUwYAziZajji0Y7mg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10" + } + }, + "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/restore-cursor": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-5.1.0.tgz", + "integrity": "sha512-oMA2dcrw6u0YfxJQXm342bFKX/E4sG9rbTzO9ptUcR/e8A33cHuvStiYOwH7fszkZlZ1z/ta9AAoPk2F4qIOHA==", + "dev": true, + "license": "MIT", + "dependencies": { + "onetime": "^7.0.0", + "signal-exit": "^4.1.0" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/restore-cursor/node_modules/onetime": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/onetime/-/onetime-7.0.0.tgz", + "integrity": "sha512-VXJjc87FScF88uafS3JllDgvAm+c/Slfz06lorj2uAY34rlUu0Nt+v8wreiImcrgAjjIHp1rXpTDlLOGw29WwQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "mimic-function": "^5.0.0" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "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, + "license": "MIT", + "peer": true, + "engines": { + "node": ">=0.12" + } + }, + "node_modules/reusify": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.0.4.tgz", + "integrity": "sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==", + "dev": true, + "license": "MIT", + "engines": { + "iojs": ">=1.0.0", + "node": ">=0.10.0" + } + }, + "node_modules/rfdc": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/rfdc/-/rfdc-1.4.1.tgz", + "integrity": "sha512-q1b3N5QkRUWUl7iyylaaj3kOpIT0N2i9MqIEQXP73GVsN9cw3fdx8X63cEmWhJGi2PPCF23Ijp7ktmd39rawIA==", + "dev": true, + "license": "MIT" + }, + "node_modules/rimraf": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", + "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" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/rimraf/node_modules/brace-expansion": { + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", + "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "dev": true, + "license": "MIT", + "dependencies": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "node_modules/rimraf/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", + "dev": true, + "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/rimraf/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/roarr": { + "version": "2.15.4", + "resolved": "https://registry.npmjs.org/roarr/-/roarr-2.15.4.tgz", + "integrity": "sha512-CHhPh+UNHD2GTXNYhPWLnU8ONHdI+5DI+4EYIAOaiD63rHeYlZvyh8P+in5999TTSFgUYuKUAjzRI4mdh/p+2A==", + "dev": true, + "license": "BSD-3-Clause", + "optional": true, + "dependencies": { + "boolean": "^3.0.1", + "detect-node": "^2.0.4", + "globalthis": "^1.0.1", + "json-stringify-safe": "^5.0.1", + "semver-compare": "^1.0.0", + "sprintf-js": "^1.1.2" + }, + "engines": { + "node": ">=8.0" + } + }, + "node_modules/roarr/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==", + "dev": true, + "license": "BSD-3-Clause", + "optional": true + }, + "node_modules/rollup": { + "version": "3.29.5", + "resolved": "https://registry.npmjs.org/rollup/-/rollup-3.29.5.tgz", + "integrity": "sha512-GVsDdsbJzzy4S/v3dqWPJ7EfvZJfCHiDqe80IyrF59LYuP+e6U1LJoUqeuqRbwAWoMNoXivMNeNAOf5E22VA1w==", + "dev": true, + "license": "MIT", + "bin": { + "rollup": "dist/bin/rollup" + }, + "engines": { + "node": ">=14.18.0", + "npm": ">=8.0.0" + }, + "optionalDependencies": { + "fsevents": "~2.3.2" + } + }, + "node_modules/rollup-plugin-esbuild": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/rollup-plugin-esbuild/-/rollup-plugin-esbuild-5.0.0.tgz", + "integrity": "sha512-1cRIOHAPh8WQgdQQyyvFdeOdxuiyk+zB5zJ5+YOwrZP4cJ0MT3Fs48pQxrZeyZHcn+klFherytILVfE4aYrneg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@rollup/pluginutils": "^5.0.1", + "debug": "^4.3.4", + "es-module-lexer": "^1.0.5", + "joycon": "^3.1.1", + "jsonc-parser": "^3.2.0" + }, + "engines": { + "node": ">=14.18.0", + "npm": ">=8.0.0" + }, + "peerDependencies": { + "esbuild": ">=0.10.1", + "rollup": "^1.20.0 || ^2.0.0 || ^3.0.0" + } + }, + "node_modules/rollup-plugin-string": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/rollup-plugin-string/-/rollup-plugin-string-3.0.0.tgz", + "integrity": "sha512-vqyzgn9QefAgeKi+Y4A7jETeIAU1zQmS6VotH6bzm/zmUQEnYkpIGRaOBPY41oiWYV4JyBoGAaBjYMYuv+6wVw==", + "dev": true, + "license": "MIT", + "dependencies": { + "rollup-pluginutils": "^2.4.1" + } + }, + "node_modules/rollup-pluginutils": { + "version": "2.8.2", + "resolved": "https://registry.npmjs.org/rollup-pluginutils/-/rollup-pluginutils-2.8.2.tgz", + "integrity": "sha512-EEp9NhnUkwY8aif6bxgovPHMoMoNr2FulJziTndpt5H9RdwC47GSGuII9XxpSdzVGM0GWrNPHV6ie1LTNJPaLQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "estree-walker": "^0.6.1" + } + }, + "node_modules/rollup-pluginutils/node_modules/estree-walker": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-0.6.1.tgz", + "integrity": "sha512-SqmZANLWS0mnatqbSfRP5g8OXZC12Fgg1IwNtLsyHDzJizORW4khDfjPqJZsemPWBB2uqykUah5YpQ6epsqC/w==", + "dev": true, + "license": "MIT" + }, + "node_modules/run-async": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/run-async/-/run-async-3.0.0.tgz", + "integrity": "sha512-540WwVDOMxA6dN6We19EcT9sc3hkXPw5mzRNGM3FkdN/vtE9NFvj5lFAPNwUDmJjXidm3v7TC1cTE7t17Ulm1Q==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.12.0" + } + }, + "node_modules/run-parallel": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz", + "integrity": "sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "license": "MIT", + "dependencies": { + "queue-microtask": "^1.2.2" + } + }, + "node_modules/rxjs": { + "version": "7.8.1", + "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-7.8.1.tgz", + "integrity": "sha512-AA3TVj+0A2iuIoQkWEK/tqFjBq2j+6PO6Y0zJcvzLAFhEFIO3HL0vls9hWLncZbAAbK0mar7oZ4V079I/qPMxg==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "tslib": "^2.1.0" + } + }, + "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, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.7", + "get-intrinsic": "^1.2.4", + "has-symbols": "^1.0.3", + "isarray": "^2.0.5" + }, + "engines": { + "node": ">=0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/safe-buffer": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", + "dev": true, + "license": "MIT" + }, + "node_modules/safe-regex": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/safe-regex/-/safe-regex-1.1.0.tgz", + "integrity": "sha512-aJXcif4xnaNUzvUuC5gcb46oTS7zvg4jpMTnuqtrEPlR3vFr4pxtdTwaF1Qs3Enjn9HK+ZlwQui+a7z0SywIzg==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "ret": "~0.1.10" + } + }, + "node_modules/safe-regex-test": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/safe-regex-test/-/safe-regex-test-1.0.3.tgz", + "integrity": "sha512-CdASjNJPvRa7roO6Ra/gLYBTzYzzPyyBXxIMdGW3USQLyjWEls2RgW5UBTXaQVp+OrpeCK3bLem8smtmheoRuw==", + "dev": true, + "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" + } + }, + "node_modules/safer-buffer": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", + "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==", + "dev": true, + "license": "MIT" + }, + "node_modules/scheduler": { + "version": "0.23.2", + "resolved": "https://registry.npmjs.org/scheduler/-/scheduler-0.23.2.tgz", + "integrity": "sha512-UOShsPwz7NrMUqhR6t0hWjFduvOzbtv7toDH1/hIrfRNIDBnnBWd0CwJTGvTpngVlmwGCdP9/Zl/tVrDqcuYzQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "loose-envify": "^1.1.0" + } + }, + "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, + "license": "MIT", + "dependencies": { + "@types/json-schema": "^7.0.9", + "ajv": "^8.9.0", + "ajv-formats": "^2.1.1", + "ajv-keywords": "^5.1.0" + }, + "engines": { + "node": ">= 12.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + } + }, + "node_modules/schema-utils/node_modules/ajv": { + "version": "8.17.1", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.17.1.tgz", + "integrity": "sha512-B/gBuNg5SiMTrPkC+A2+cW0RszwxYmn6VYxB/inlBStS5nx6xHIt/ehKRhIMhqusl7a8LjQoZnjCs5vhwxOQ1g==", + "dev": true, + "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/schema-utils/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/schema-utils/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==", + "dev": true, + "license": "MIT" + }, + "node_modules/secure-compare": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/secure-compare/-/secure-compare-3.0.1.tgz", + "integrity": "sha512-AckIIV90rPDcBcglUwXPF3kg0P0qmPsPXAj6BBEENQE1p5yA1xfmDJzfi1Tappj37Pv2mVbKpL3Z1T+Nn7k1Qw==", + "dev": true, + "license": "MIT" + }, + "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/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==", + "dev": true, + "license": "MIT", + "optional": true + }, + "node_modules/serialize-error": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/serialize-error/-/serialize-error-7.0.1.tgz", + "integrity": "sha512-8I8TjW5KMOKsZQTvoxjuSIa7foAwPWGOts+6o7sgjz41/qMD9VQHEDxi6PBvK2l0MXUmqZyNpUK+T2tQaaElvw==", + "dev": true, + "license": "MIT", + "optional": true, + "dependencies": { + "type-fest": "^0.13.1" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/serialize-error/node_modules/type-fest": { + "version": "0.13.1", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.13.1.tgz", + "integrity": "sha512-34R7HTnG0XIJcBSn5XhDd7nNFPRcXYRZrBB2O2jdKqYODldSzBAqzsWoZYYvduky73toYS/ESqxPvkDf/F0XMg==", + "dev": true, + "license": "(MIT OR CC0-1.0)", + "optional": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/serialize-javascript": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-6.0.2.tgz", + "integrity": "sha512-Saa1xPByTTq2gdeFZYLLo+RFE35NHZkAbqZeWNd3BpzppeVisAqpDjcp8dyf6uIvEqJRd46jemmyA4iFIeVk8g==", + "dev": true, + "license": "BSD-3-Clause", + "dependencies": { + "randombytes": "^2.1.0" + } + }, + "node_modules/set-function-length": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/set-function-length/-/set-function-length-1.2.2.tgz", + "integrity": "sha512-pgRc4hJ4/sNjWCSS9AmnS40x3bNMDTknHgL5UaMBTMyJnU90EgWh1Rz+MC9eFu4BuN/UwZjKQuY/1v3rM7HMfg==", + "dev": true, + "license": "MIT", + "dependencies": { + "define-data-property": "^1.1.4", + "es-errors": "^1.3.0", + "function-bind": "^1.1.2", + "get-intrinsic": "^1.2.4", + "gopd": "^1.0.1", + "has-property-descriptors": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/set-function-name": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/set-function-name/-/set-function-name-2.0.2.tgz", + "integrity": "sha512-7PGFlmtwsEADb0WYyvCMa1t+yke6daIG4Wirafur5kcf+MhUnPms1UeR0CKQdTZD81yESwMHbtn+TR+dMviakQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "define-data-property": "^1.1.4", + "es-errors": "^1.3.0", + "functions-have-names": "^1.2.3", + "has-property-descriptors": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/set-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, + "license": "MIT", + "peer": true, + "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" + } + }, + "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, + "license": "MIT", + "peer": true, + "dependencies": { + "is-extendable": "^0.1.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "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, + "license": "MIT", + "peer": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/shebang-command": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", + "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", + "dev": true, + "license": "MIT", + "dependencies": { + "shebang-regex": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/shebang-regex": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", + "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/shell-quote": { + "version": "1.8.1", + "resolved": "https://registry.npmjs.org/shell-quote/-/shell-quote-1.8.1.tgz", + "integrity": "sha512-6j1W9l1iAs/4xYBI1SYOVZyFcCis9b4KCLQ8fgAGG07QvzaRLVVRQvAy85yNmmZSjYjg4MWh4gNvlPujU/5LpA==", + "dev": true, + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/side-channel": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.0.6.tgz", + "integrity": "sha512-fDW/EZ6Q9RiO8eFG8Hj+7u/oW+XrPTIChwCOM2+th2A6OblDtYYIpve9m+KvI9Z4C9qSEXlaGR6bTEYHReuglA==", + "dev": true, + "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==", + "dev": true, + "license": "ISC", + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/sisteransi": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/sisteransi/-/sisteransi-1.0.5.tgz", + "integrity": "sha512-bLGGlR1QxBcynn2d5YmDX4MGjlZvy2MRBDRNHLJ8VI6l6+9FUiyTFNJ0IveOSP0bcXgVDPRcfGqA0pjaqUpfVg==", + "dev": true, + "license": "MIT" + }, + "node_modules/slash": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", + "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/slashes": { + "version": "3.0.12", + "resolved": "https://registry.npmjs.org/slashes/-/slashes-3.0.12.tgz", + "integrity": "sha512-Q9VME8WyGkc7pJf6QEkj3wE+2CnvZMI+XJhwdTPR8Z/kWQRXi7boAWLDibRPyHRTUTPx5FaU7MsyrjI3yLB4HA==", + "dev": true, + "license": "ISC" + }, + "node_modules/slice-ansi": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-5.0.0.tgz", + "integrity": "sha512-FC+lgizVPfie0kkhqUScwRu1O/lF6NOgJmlCgK+/LYxDCTk8sGelYaHDhFcDN+Sn3Cv+3VSa4Byeo+IMCzpMgQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-styles": "^6.0.0", + "is-fullwidth-code-point": "^4.0.0" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/slice-ansi?sponsor=1" + } + }, + "node_modules/slice-ansi/node_modules/ansi-styles": { + "version": "6.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-6.2.1.tgz", + "integrity": "sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "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, + "license": "MIT", + "peer": true, + "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" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "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, + "license": "MIT", + "peer": true, + "dependencies": { + "define-property": "^1.0.0", + "isobject": "^3.0.0", + "snapdragon-util": "^3.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "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, + "license": "MIT", + "peer": true, + "dependencies": { + "is-descriptor": "^1.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "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, + "license": "MIT", + "peer": true, + "dependencies": { + "kind-of": "^3.2.0" + }, + "engines": { + "node": ">=0.10.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, + "license": "MIT", + "peer": true, + "dependencies": { + "is-buffer": "^1.1.5" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "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, + "license": "MIT", + "peer": true, + "dependencies": { + "ms": "2.0.0" + } + }, + "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, + "license": "MIT", + "peer": true, + "dependencies": { + "is-descriptor": "^0.1.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "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, + "license": "MIT", + "peer": true, + "dependencies": { + "is-extendable": "^0.1.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "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, + "license": "MIT", + "peer": true, + "dependencies": { + "is-accessor-descriptor": "^1.0.1", + "is-data-descriptor": "^1.0.1" + }, + "engines": { + "node": ">= 0.4" + } + }, + "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, + "license": "MIT", + "peer": true, + "engines": { + "node": ">=0.10.0" + } + }, + "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", + "peer": true + }, + "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", + "peer": true, + "engines": { + "node": ">=0.10.0" + } + }, + "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/source-map-js": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.2.1.tgz", + "integrity": "sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==", + "dev": true, + "license": "BSD-3-Clause", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/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", + "peer": true, + "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" + } + }, + "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/source-map-support/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==", + "dev": true, + "license": "BSD-3-Clause", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/source-map-url": { + "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", + "peer": true + }, + "node_modules/sourcemap-codec": { + "version": "1.4.8", + "resolved": "https://registry.npmjs.org/sourcemap-codec/-/sourcemap-codec-1.4.8.tgz", + "integrity": "sha512-9NykojV5Uih4lgo5So5dtw+f0JgJX30KCNI8gwhz2J9A15wD0Ml6tjHKwf6fTSa6fAdVBdZeNOs9eJ71qCk8vA==", + "deprecated": "Please use @jridgewell/sourcemap-codec instead", + "dev": true, + "license": "MIT" + }, + "node_modules/space-separated-tokens": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/space-separated-tokens/-/space-separated-tokens-2.0.2.tgz", + "integrity": "sha512-PEGlAwrG8yXGXRjW32fGbg66JAlOAwbObuqVoJpv/mRgoWDQfgH1wDPvtzWyUSNAXBGSk8h755YDbbcEy3SH2Q==", + "dev": true, + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "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/spdx-correct/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, + "license": "MIT", + "dependencies": { + "spdx-exceptions": "^2.1.0", + "spdx-license-ids": "^3.0.0" + } + }, + "node_modules/spdx-exceptions": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/spdx-exceptions/-/spdx-exceptions-2.5.0.tgz", + "integrity": "sha512-PiU42r+xO4UbUS1buo3LPJkjlO7430Xn5SVAhdpzzsPHsjbYVflnnFdATgabnLude+Cqu25p6N+g2lw/PFsa4w==", + "dev": true, + "license": "CC-BY-3.0" + }, + "node_modules/spdx-expression-parse": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/spdx-expression-parse/-/spdx-expression-parse-4.0.0.tgz", + "integrity": "sha512-Clya5JIij/7C6bRR22+tnGXbc4VKlibKSVj2iHvVeX5iMW7s1SIQlqu699JkODJJIhh/pUu8L0/VLh8xflD+LQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "spdx-exceptions": "^2.1.0", + "spdx-license-ids": "^3.0.0" + } + }, + "node_modules/spdx-license-ids": { + "version": "3.0.20", + "resolved": "https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-3.0.20.tgz", + "integrity": "sha512-jg25NiDV/1fLtSgEgyvVyDunvaNHbuwF9lfNV17gSmPFAlYzdfNBlLtLzXTevwkPj7DhGbmN9VnmJIgLnhvaBw==", + "dev": true, + "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, + "license": "MIT", + "peer": true, + "dependencies": { + "extend-shallow": "^3.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/sprintf-js": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", + "integrity": "sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g==", + "dev": true, + "license": "BSD-3-Clause" + }, + "node_modules/stack-utils": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/stack-utils/-/stack-utils-2.0.6.tgz", + "integrity": "sha512-XlkWvfIm6RmsWtNJx+uqtKLS8eqFbxUg0ZzLXqY0caEy9l7hruX8IpiDnjsLavoBgqCCR71TqWO8MaXYheJ3RQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "escape-string-regexp": "^2.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/stack-utils/node_modules/escape-string-regexp": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-2.0.0.tgz", + "integrity": "sha512-UpzcLCXolUWcNu5HtVMHYdXJjArjsF9C0aNnquZYY4uW/Vu0miy5YoWvbV345HauVvcAUnpRuhMMcqTcGOY2+w==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "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==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "define-property": "^0.2.5", + "object-copy": "^0.1.0" + }, + "engines": { + "node": ">=0.10.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==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "is-descriptor": "^0.1.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "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, + "license": "MIT", + "peer": true, + "dependencies": { + "is-accessor-descriptor": "^1.0.1", + "is-data-descriptor": "^1.0.1" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/stdin-discarder": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/stdin-discarder/-/stdin-discarder-0.1.0.tgz", + "integrity": "sha512-xhV7w8S+bUwlPTb4bAOUQhv8/cSS5offJuX8GQGq32ONF0ZtDWKfkdomM3HMRA+LhX6um/FZ0COqlwsjD53LeQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "bl": "^5.0.0" + }, + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/stdin-discarder/node_modules/bl": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/bl/-/bl-5.1.0.tgz", + "integrity": "sha512-tv1ZJHLfTDnXE6tMHv73YgSJaWR2AFuPwMntBe7XL/GBFHnT0CLnsHMogfk5+GzCDC5ZWarSCYaIGATZt9dNsQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "buffer": "^6.0.3", + "inherits": "^2.0.4", + "readable-stream": "^3.4.0" + } + }, + "node_modules/stdin-discarder/node_modules/buffer": { + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/buffer/-/buffer-6.0.3.tgz", + "integrity": "sha512-FTiCpNxtwiZZHEZbcbTIcZjERVICn9yq/pDFkTl95/AxzD1naBctN7YO68riM/gLSDY7sdrMby8hofADYuuqOA==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "license": "MIT", + "dependencies": { + "base64-js": "^1.3.1", + "ieee754": "^1.2.1" + } + }, + "node_modules/stdin-discarder/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, + "license": "MIT", + "dependencies": { + "inherits": "^2.0.3", + "string_decoder": "^1.1.1", + "util-deprecate": "^1.0.1" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/stdin-discarder/node_modules/safe-buffer": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", + "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "license": "MIT" + }, + "node_modules/stdin-discarder/node_modules/string_decoder": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz", + "integrity": "sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==", + "dev": true, + "license": "MIT", + "dependencies": { + "safe-buffer": "~5.2.0" + } + }, + "node_modules/stop-iteration-iterator": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/stop-iteration-iterator/-/stop-iteration-iterator-1.0.0.tgz", + "integrity": "sha512-iCGQj+0l0HOdZ2AEeBADlsRC+vsnDsZsbdSiH1yNSjcfKM7fdpCMfqAL/dwF5BLiw/XhRft/Wax6zQbhq2BcjQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "internal-slot": "^1.0.4" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/storybook": { + "version": "8.4.5", + "resolved": "https://registry.npmjs.org/storybook/-/storybook-8.4.5.tgz", + "integrity": "sha512-9tfgabXnMibYp3SvoaJXXMD63Pw0SA9Hnf5v6TxysCYZs4DZ/04fAkK+9RW+K4C5JkV83qXMMlrsPj766R47fg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@storybook/core": "8.4.5" + }, + "bin": { + "getstorybook": "bin/index.cjs", + "sb": "bin/index.cjs", + "storybook": "bin/index.cjs" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/storybook" + }, + "peerDependencies": { + "prettier": "^2 || ^3" + }, + "peerDependenciesMeta": { + "prettier": { + "optional": true + } + } + }, + "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/string_decoder": { + "version": "0.10.31", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz", + "integrity": "sha512-ev2QzSzWPYmy9GuqfIVildA4OdcGLeFZQrq5ys6RtiuF+RQQiZWr8TZNyAcuVXyQRYfEO+MsoB/1BuQVhOJuoQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/string-argv": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/string-argv/-/string-argv-0.3.2.tgz", + "integrity": "sha512-aqD2Q0144Z+/RqG52NeHEkZauTAUWJO8c6yTftGJKO3Tja5tUgIfmIl6kExvhtxSDP7fXB6DvzkfMpCd/F3G+Q==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.6.19" + } + }, + "node_modules/string-length": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/string-length/-/string-length-4.0.2.tgz", + "integrity": "sha512-+l6rNN5fYHNhZZy41RXsYptCjA2Igmq4EG7kZAYFQI1E1VTXarr6ZPXBg6eq7Y6eK4FEhY6AJlyuFIb/v/S0VQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "char-regex": "^1.0.2", + "strip-ansi": "^6.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/string-length/node_modules/strip-ansi": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/string-width": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "dev": true, + "license": "MIT", + "dependencies": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/string-width-cjs": { + "name": "string-width", + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "dev": true, + "license": "MIT", + "dependencies": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/string-width-cjs/node_modules/is-fullwidth-code-point": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", + "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/string-width-cjs/node_modules/strip-ansi": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/string-width/node_modules/is-fullwidth-code-point": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", + "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/string-width/node_modules/strip-ansi": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/string.prototype.trim": { + "version": "1.2.9", + "resolved": "https://registry.npmjs.org/string.prototype.trim/-/string.prototype.trim-1.2.9.tgz", + "integrity": "sha512-klHuCNxiMZ8MlsOihJhJEBJAiMVqU3Z2nEXWfWnIqjN0gEFS9J9+IxKozWWtQGcgoa1WUZzLjKPTr4ZHNFTFxw==", + "dev": true, + "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" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/string.prototype.trimend": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/string.prototype.trimend/-/string.prototype.trimend-1.0.8.tgz", + "integrity": "sha512-p73uL5VCHCO2BZZ6krwwQE3kCzM7NKmis8S//xEC6fQonchbum4eP6kR4DLEjQFO3Wnj3Fuo8NM0kOSjVdHjZQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.7", + "define-properties": "^1.2.1", + "es-object-atoms": "^1.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/string.prototype.trimstart": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/string.prototype.trimstart/-/string.prototype.trimstart-1.0.8.tgz", + "integrity": "sha512-UXSH262CSZY1tfu3G3Secr6uGLCFVPMhIqHjlgCUtCCcgihYc/xKs9djMTMUOb2j1mVSeU8EU6NWc/iQKU6Gfg==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.7", + "define-properties": "^1.2.1", + "es-object-atoms": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/stringify-entities": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/stringify-entities/-/stringify-entities-4.0.4.tgz", + "integrity": "sha512-IwfBptatlO+QCJUo19AqvrPNqlVMpW9YEL2LIVY+Rpv2qsjCGxaDLNRgeGsQWJhfItebuJhsGSLjaBbNSQ+ieg==", + "dev": true, + "license": "MIT", + "dependencies": { + "character-entities-html4": "^2.0.0", + "character-entities-legacy": "^3.0.0" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/strip-ansi": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.0.tgz", + "integrity": "sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-regex": "^6.0.1" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/strip-ansi?sponsor=1" + } + }, + "node_modules/strip-ansi-cjs": { + "name": "strip-ansi", + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/strip-ansi/node_modules/ansi-regex": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.1.0.tgz", + "integrity": "sha512-7HSX4QQb4CspciLpVFwyRe79O3xsIZDDLER21kERQ71oaPodF8jL725AgJMFAYbooIqolJoRLuM81SpeUkpkvA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/ansi-regex?sponsor=1" + } + }, + "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==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=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==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=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==", + "dev": true, + "license": "MIT", + "dependencies": { + "min-indent": "^1.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/strip-json-comments": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz", + "integrity": "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/strip-outer": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/strip-outer/-/strip-outer-1.0.1.tgz", + "integrity": "sha512-k55yxKHwaXnpYGsOzg4Vl8+tDrWylxDEpknGjhTiZB8dFRU5rTo9CAzeycivxV3s+zlTKwrs6WxMxR95n26kwg==", + "dev": true, + "license": "MIT", + "dependencies": { + "escape-string-regexp": "^1.0.2" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/strip-outer/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/strong-type": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/strong-type/-/strong-type-1.1.0.tgz", + "integrity": "sha512-X5Z6riticuH5GnhUyzijfDi1SoXas8ODDyN7K8lJeQK+Jfi4dKdoJGL4CXTskY/ATBcN+rz5lROGn1tAUkOX7g==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12.21.0" + } + }, + "node_modules/style-loader": { + "version": "3.3.4", + "resolved": "https://registry.npmjs.org/style-loader/-/style-loader-3.3.4.tgz", + "integrity": "sha512-0WqXzrsMTyb8yjZJHDqwmnwRJvhALK9LfRtRc6B4UTWe8AijYLZYZ9thuJTZc2VfQWINADW/j+LiJnfy2RoC1w==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 12.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + }, + "peerDependencies": { + "webpack": "^5.0.0" + } + }, + "node_modules/style-to-object": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/style-to-object/-/style-to-object-1.0.8.tgz", + "integrity": "sha512-xT47I/Eo0rwJmaXC4oilDGDWLohVhR6o/xAQcPQN8q6QBuZVL8qMYL85kLmST5cPjAorwvqIA4qXTRQoYHaL6g==", + "dev": true, + "license": "MIT", + "dependencies": { + "inline-style-parser": "0.2.4" + } + }, + "node_modules/sumchecker": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/sumchecker/-/sumchecker-3.0.1.tgz", + "integrity": "sha512-MvjXzkz/BOfyVDkG0oFOtBxHX2u3gKbMHIF/dXblZsgD3BWOFLmHovIpZY7BykJdAjcqRCBi1WYBNdEC9yI7vg==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "debug": "^4.1.0" + }, + "engines": { + "node": ">= 8.0" + } + }, + "node_modules/supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, + "license": "MIT", + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/supports-preserve-symlinks-flag": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz", + "integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/synckit": { + "version": "0.9.2", + "resolved": "https://registry.npmjs.org/synckit/-/synckit-0.9.2.tgz", + "integrity": "sha512-vrozgXDQwYO72vHjUb/HnFbQx1exDjoKzqx23aXEg2a9VIg2TSFZ8FmeZpTjUCFMYw7mpX4BE2SFu8wI7asYsw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@pkgr/core": "^0.1.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": "^14.18.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/unts" + } + }, + "node_modules/taffydb": { + "version": "2.7.3", + "resolved": "https://registry.npmjs.org/taffydb/-/taffydb-2.7.3.tgz", + "integrity": "sha512-GQ3gtYFSOAxSMN/apGtDKKkbJf+8izz5YfbGqIsUc7AMiQOapARZ76dhilRY2h39cynYxBFdafQo5HUL5vgkrg==", + "dev": true, + "license": "BSD-2-Clause" + }, + "node_modules/tapable": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/tapable/-/tapable-2.2.1.tgz", + "integrity": "sha512-GNzQvQTOIP6RyTfE2Qxb8ZVlNmw0n88vp1szwWRimP02mnTsx3Wtn5qRdqY9w2XduFNUgvOwhNnQsjwCp+kqaQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/tar-stream": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/tar-stream/-/tar-stream-2.2.0.tgz", + "integrity": "sha512-ujeqbceABgwMZxEJnk2HDY2DlnUZ+9oEcb1KzTVfYHio0UE6dG71n60d8D2I4qNvleWrrXpmjpt7vZeF1LnMZQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "bl": "^4.0.3", + "end-of-stream": "^1.4.1", + "fs-constants": "^1.0.0", + "inherits": "^2.0.3", + "readable-stream": "^3.1.1" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/tar-stream/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, + "license": "MIT", + "dependencies": { + "inherits": "^2.0.3", + "string_decoder": "^1.1.1", + "util-deprecate": "^1.0.1" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/tar-stream/node_modules/safe-buffer": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", + "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "license": "MIT" + }, + "node_modules/tar-stream/node_modules/string_decoder": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz", + "integrity": "sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==", + "dev": true, + "license": "MIT", + "dependencies": { + "safe-buffer": "~5.2.0" + } + }, + "node_modules/terser": { + "version": "5.36.0", + "resolved": "https://registry.npmjs.org/terser/-/terser-5.36.0.tgz", + "integrity": "sha512-IYV9eNMuFAV4THUspIRXkLakHnV6XO7FEdtKjf/mDyrnqUg9LnlOn6/RwRvM9SZjR4GUq8Nk8zj67FzVARr74w==", + "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" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/terser-webpack-plugin": { + "version": "5.3.10", + "resolved": "https://registry.npmjs.org/terser-webpack-plugin/-/terser-webpack-plugin-5.3.10.tgz", + "integrity": "sha512-BKFPWlPDndPs+NGGCr1U59t0XScL5317Y0UReNrHaw9/FwhPENlq6bfgs+4yPfyP51vqC1bQ4rp1EfXW5ZSH9w==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jridgewell/trace-mapping": "^0.3.20", + "jest-worker": "^27.4.5", + "schema-utils": "^3.1.1", + "serialize-javascript": "^6.0.1", + "terser": "^5.26.0" + }, + "engines": { + "node": ">= 10.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + }, + "peerDependencies": { + "webpack": "^5.1.0" + }, + "peerDependenciesMeta": { + "@swc/core": { + "optional": true + }, + "esbuild": { + "optional": true + }, + "uglify-js": { + "optional": true + } + } + }, + "node_modules/terser-webpack-plugin/node_modules/jest-worker": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-27.5.1.tgz", + "integrity": "sha512-7vuh85V5cdDofPyxn58nrPjBktZo0u9x1g8WtjQol+jZDaE+fhN+cIvTj11GndBnMnyfrUOG1sZQxCdjKh+DKg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/node": "*", + "merge-stream": "^2.0.0", + "supports-color": "^8.0.0" + }, + "engines": { + "node": ">= 10.13.0" + } + }, + "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==", + "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/terser-webpack-plugin/node_modules/supports-color": { + "version": "8.1.1", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz", + "integrity": "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/supports-color?sponsor=1" + } + }, + "node_modules/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, + "license": "ISC", + "dependencies": { + "@istanbuljs/schema": "^0.1.2", + "glob": "^7.1.4", + "minimatch": "^3.0.4" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/test-exclude/node_modules/brace-expansion": { + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", + "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "dev": true, + "license": "MIT", + "dependencies": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "node_modules/test-exclude/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", + "dev": true, + "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/test-exclude/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/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/throat": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/throat/-/throat-6.0.2.tgz", + "integrity": "sha512-WKexMoJj3vEuK0yFEapj8y64V0A6xcuPuK9Gt1d0R+dzCSJc0lHqQytAbSB4cDAK0dWh4T0E2ETkoLE2WZ41OQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/through": { + "version": "2.3.8", + "resolved": "https://registry.npmjs.org/through/-/through-2.3.8.tgz", + "integrity": "sha512-w89qg7PI8wAdvX60bMDP+bFoD5Dvhm9oLheFp5O4a2QF0cSBGsBX4qZmadPMvVqlLJBBci+WqGGOAPvcDeNSVg==", + "dev": true, + "license": "MIT" + }, + "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/through2/node_modules/isarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", + "integrity": "sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/through2/node_modules/readable-stream": { + "version": "2.3.8", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.8.tgz", + "integrity": "sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==", + "dev": true, + "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" + } + }, + "node_modules/through2/node_modules/string_decoder": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", + "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", + "dev": true, + "license": "MIT", + "dependencies": { + "safe-buffer": "~5.1.0" + } + }, + "node_modules/tiny-invariant": { + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/tiny-invariant/-/tiny-invariant-1.3.3.tgz", + "integrity": "sha512-+FbBPE1o9QAYvviau/qC5SE3caw21q3xkvWKBtja5vgqOWIHHJ3ioaq1VPfn/Szqctz2bU/oYeKd9/z5BL+PVg==", + "dev": true, + "license": "MIT" + }, + "node_modules/tinyrainbow": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/tinyrainbow/-/tinyrainbow-1.2.0.tgz", + "integrity": "sha512-weEDEq7Z5eTHPDh4xjX789+fHfF+P8boiFB+0vbWzpbnbsEr/GRaohi/uMKxg8RZMXnl1ItAi/IUHWMsjDV7kQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/tinyspy": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/tinyspy/-/tinyspy-3.0.2.tgz", + "integrity": "sha512-n1cw8k1k0x4pgA2+9XrOkFydTerNcJ1zWCO5Nn9scWHTD+5tp8dghT2x1uduQePZTZgd3Tupf+x9BxJjeJi77Q==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/tmp": { + "version": "0.0.33", + "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.0.33.tgz", + "integrity": "sha512-jRCJlojKnZ3addtTOjdIqoRuPEKBvNXcGYqzO6zWZX8KfKEpnGY5jfggJQ3EjKuu8D4bJRr0y+cYJFmYbImXGw==", + "dev": true, + "license": "MIT", + "dependencies": { + "os-tmpdir": "~1.0.2" + }, + "engines": { + "node": ">=0.6.0" + } + }, + "node_modules/tmpl": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/tmpl/-/tmpl-1.0.5.tgz", + "integrity": "sha512-3f0uOEAQwIqGuWW2MVzYg8fV/QNnc/IpuJNG837rLuczAaLVHslWHZQj4IGiEl5Hs3kkbhwL9Ab7Hrsmuj+Smw==", + "dev": true, + "license": "BSD-3-Clause" + }, + "node_modules/to-fast-properties": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-2.0.0.tgz", + "integrity": "sha512-/OaKK0xYrs3DmxRYqL/yDc+FxFUVYhDlXMhRmv3z915w2HF1tnN1omB354j8VUGO/hbRzyD6Y3sA7v7GS/ceog==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "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, + "license": "MIT", + "peer": true, + "dependencies": { + "kind-of": "^3.0.2" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "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, + "license": "MIT", + "peer": true, + "dependencies": { + "is-buffer": "^1.1.5" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "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==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "define-property": "^2.0.2", + "extend-shallow": "^3.0.2", + "regex-not": "^1.0.2", + "safe-regex": "^1.1.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/to-regex-range": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", + "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "is-number": "^7.0.0" + }, + "engines": { + "node": ">=8.0" + } + }, + "node_modules/tr46": { + "version": "0.0.3", + "resolved": "https://registry.npmjs.org/tr46/-/tr46-0.0.3.tgz", + "integrity": "sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==", + "dev": true, + "license": "MIT" + }, + "node_modules/tree-kill": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/tree-kill/-/tree-kill-1.2.2.tgz", + "integrity": "sha512-L0Orpi8qGpRG//Nd+H90vFB+3iHnue1zSSGmNOOCh1GLJ7rUKVwV2HvijphGQS2UmhUZewS9VgvxYIdgr+fG1A==", + "dev": true, + "license": "MIT", + "bin": { + "tree-kill": "cli.js" + } + }, + "node_modules/trim-lines": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/trim-lines/-/trim-lines-3.0.1.tgz", + "integrity": "sha512-kRj8B+YHZCc9kQYdWfJB2/oUl9rA99qbowYYBtr4ui4mZyAQ2JpvVBd/6U2YloATfqBhBTSMhTpgBHtU0Mf3Rg==", + "dev": true, + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/trim-repeated": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/trim-repeated/-/trim-repeated-1.0.0.tgz", + "integrity": "sha512-pkonvlKk8/ZuR0D5tLW8ljt5I8kmxp2XKymhepUeOdCEfKpZaktSArkLHZt76OB1ZvO9bssUsDty4SWhLvZpLg==", + "dev": true, + "license": "MIT", + "dependencies": { + "escape-string-regexp": "^1.0.2" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/trim-repeated/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/trough": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/trough/-/trough-2.2.0.tgz", + "integrity": "sha512-tmMpK00BjZiUyVyvrBK7knerNgmgvcV/KLVyuma/SC+TQN167GrMRciANTz09+k3zW8L8t60jWO1GpfkZdjTaw==", + "dev": true, + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/ts-api-utils": { + "version": "1.4.2", + "resolved": "https://registry.npmjs.org/ts-api-utils/-/ts-api-utils-1.4.2.tgz", + "integrity": "sha512-ZF5gQIQa/UmzfvxbHZI3JXN0/Jt+vnAfAviNRAMc491laiK6YCLpCW9ft8oaCRFOTxCZtUTE6XB0ZQAe3olntw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=16" + }, + "peerDependencies": { + "typescript": ">=4.2.0" + } + }, + "node_modules/ts-dedent": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/ts-dedent/-/ts-dedent-2.2.0.tgz", + "integrity": "sha512-q5W7tVM71e2xjHZTlgfTDoPF/SmqKG5hddq9SzR49CH2hayqRKJtQ4mtRlSxKaJlR/+9rEM+mnBHf7I2/BQcpQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.10" + } + }, + "node_modules/ts-jest": { + "version": "29.2.5", + "resolved": "https://registry.npmjs.org/ts-jest/-/ts-jest-29.2.5.tgz", + "integrity": "sha512-KD8zB2aAZrcKIdGk4OwpJggeLcH1FgrICqDSROWqlnJXGCXK4Mn6FcdK2B6670Xr73lHMG1kHw8R87A0ecZ+vA==", + "dev": true, + "license": "MIT", + "dependencies": { + "bs-logger": "^0.2.6", + "ejs": "^3.1.10", + "fast-json-stable-stringify": "^2.1.0", + "jest-util": "^29.0.0", + "json5": "^2.2.3", + "lodash.memoize": "^4.1.2", + "make-error": "^1.3.6", + "semver": "^7.6.3", + "yargs-parser": "^21.1.1" + }, + "bin": { + "ts-jest": "cli.js" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || ^18.0.0 || >=20.0.0" + }, + "peerDependencies": { + "@babel/core": ">=7.0.0-beta.0 <8", + "@jest/transform": "^29.0.0", + "@jest/types": "^29.0.0", + "babel-jest": "^29.0.0", + "jest": "^29.0.0", + "typescript": ">=4.3 <6" + }, + "peerDependenciesMeta": { + "@babel/core": { + "optional": true + }, + "@jest/transform": { + "optional": true + }, + "@jest/types": { + "optional": true + }, + "babel-jest": { + "optional": true + }, + "esbuild": { + "optional": true + } + } + }, + "node_modules/ts-jest/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/tsc-alias": { + "version": "1.8.10", + "resolved": "https://registry.npmjs.org/tsc-alias/-/tsc-alias-1.8.10.tgz", + "integrity": "sha512-Ibv4KAWfFkFdKJxnWfVtdOmB0Zi1RJVxcbPGiCDsFpCQSsmpWyuzHG3rQyI5YkobWwxFPEyQfu1hdo4qLG2zPw==", + "dev": true, + "license": "MIT", + "dependencies": { + "chokidar": "^3.5.3", + "commander": "^9.0.0", + "globby": "^11.0.4", + "mylas": "^2.1.9", + "normalize-path": "^3.0.0", + "plimit-lit": "^1.2.6" + }, + "bin": { + "tsc-alias": "dist/bin/index.js" + } + }, + "node_modules/tsc-alias/node_modules/commander": { + "version": "9.5.0", + "resolved": "https://registry.npmjs.org/commander/-/commander-9.5.0.tgz", + "integrity": "sha512-KRs7WVDKg86PWiuAqhDrAQnTXZKraVcCc6vFdL14qrZ/DcWwuRo7VoiYXalXO7S5GKpqYiVEwCbgFDfxNHKJBQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": "^12.20.0 || >=14" + } + }, + "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, + "license": "MIT", + "dependencies": { + "@types/json5": "^0.0.29", + "json5": "^1.0.2", + "minimist": "^1.2.6", + "strip-bom": "^3.0.0" + } + }, + "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", + "dependencies": { + "minimist": "^1.2.0" + }, + "bin": { + "json5": "lib/cli.js" + } + }, + "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==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "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/tween-functions": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/tween-functions/-/tween-functions-1.2.0.tgz", + "integrity": "sha512-PZBtLYcCLtEcjL14Fzb1gSxPBeL7nWvGhO5ZFPGqziCcr8uvHp0NDmdjBchp6KHL+tExcg0m3NISmKxhU394dA==", + "dev": true, + "license": "BSD" + }, + "node_modules/type-check": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.4.0.tgz", + "integrity": "sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==", + "dev": true, + "license": "MIT", + "dependencies": { + "prelude-ls": "^1.2.1" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/type-detect": { + "version": "4.0.8", + "resolved": "https://registry.npmjs.org/type-detect/-/type-detect-4.0.8.tgz", + "integrity": "sha512-0fr/mIH1dlO+x7TlcMy+bIDqKPsw/70tVyeHW787goQjhmqaZe10uwLujubK9q9Lg6Fiho1KUKDYz0Z7k7g5/g==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "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==", + "dev": true, + "license": "(MIT OR CC0-1.0)", + "engines": { + "node": ">=12.20" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "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, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.7", + "es-errors": "^1.3.0", + "is-typed-array": "^1.1.13" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/typed-array-byte-length": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/typed-array-byte-length/-/typed-array-byte-length-1.0.1.tgz", + "integrity": "sha512-3iMJ9q0ao7WE9tWcaYKIptkNBuOIcZCCT0d4MRvuuH88fEoEH62IuQe0OtraD3ebQEoTRk8XCBoknUNc1Y67pw==", + "dev": true, + "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" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/typed-array-byte-offset": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/typed-array-byte-offset/-/typed-array-byte-offset-1.0.3.tgz", + "integrity": "sha512-GsvTyUHTriq6o/bHcTd0vM7OQ9JEdlvluu9YISaA7+KzDzPaIzEeDFNkTfhdE3MYcNhNi0vq/LlegYgIs5yPAw==", + "dev": true, + "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", + "reflect.getprototypeof": "^1.0.6" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/typed-array-length": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/typed-array-length/-/typed-array-length-1.0.7.tgz", + "integrity": "sha512-3KS2b+kL7fsuk/eJZ7EQdnEmQoaho/r6KUef7hxvltNA5DR8NAUM+8wJMbJyZ4G9/7i3v5zPBIMN5aybAh2/Jg==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.7", + "for-each": "^0.3.3", + "gopd": "^1.0.1", + "is-typed-array": "^1.1.13", + "possible-typed-array-names": "^1.0.0", + "reflect.getprototypeof": "^1.0.6" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/typescript": { + "version": "5.7.2", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.7.2.tgz", + "integrity": "sha512-i5t66RHxDvVN40HfDd1PsEThGNnlMCMT3jMUuoh9/0TaqWevNontacunWyN02LA9/fIbEWlcHZcgTKb9QoaLfg==", + "dev": true, + "license": "Apache-2.0", + "bin": { + "tsc": "bin/tsc", + "tsserver": "bin/tsserver" + }, + "engines": { + "node": ">=14.17" + } + }, + "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/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, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.2", + "has-bigints": "^1.0.2", + "has-symbols": "^1.0.3", + "which-boxed-primitive": "^1.0.2" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/undici-types": { + "version": "6.20.0", + "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-6.20.0.tgz", + "integrity": "sha512-Ny6QZ2Nju20vw1SRHe3d9jVu6gJ+4e3+MMpqu7pqE5HT6WsTSlce++GQmK5UXS8mzV8DSYHrQH+Xrf2jVcuKNg==", + "dev": true, + "license": "MIT" + }, + "node_modules/unicode-canonical-property-names-ecmascript": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/unicode-canonical-property-names-ecmascript/-/unicode-canonical-property-names-ecmascript-2.0.1.tgz", + "integrity": "sha512-dA8WbNeb2a6oQzAQ55YlT5vQAWGV9WXOsi3SskE3bcCdM0P4SDd+24zS/OCacdRq5BkdsRj9q3Pg6YyQoxIGqg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "node_modules/unicode-match-property-ecmascript": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/unicode-match-property-ecmascript/-/unicode-match-property-ecmascript-2.0.0.tgz", + "integrity": "sha512-5kaZCrbp5mmbz5ulBkDkbY0SsPOjKqVS35VpL9ulMPfSl0J0Xsm+9Evphv9CoIZFwre7aJoa94AY6seMKGVN5Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "unicode-canonical-property-names-ecmascript": "^2.0.0", + "unicode-property-aliases-ecmascript": "^2.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/unicode-match-property-value-ecmascript": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/unicode-match-property-value-ecmascript/-/unicode-match-property-value-ecmascript-2.2.0.tgz", + "integrity": "sha512-4IehN3V/+kkr5YeSSDDQG8QLqO26XpL2XP3GQtqwlT/QYSECAwFztxVHjlbh0+gjJ3XmNLS0zDsbgs9jWKExLg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "node_modules/unicode-property-aliases-ecmascript": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/unicode-property-aliases-ecmascript/-/unicode-property-aliases-ecmascript-2.1.0.tgz", + "integrity": "sha512-6t3foTQI9qne+OZoVQB/8x8rk2k1eVy1gRXhV3oFQ5T6R1dqQ1xtin3XqSlx3+ATBkliTaR/hHyJBm+LVPNM8w==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "node_modules/unified": { + "version": "11.0.5", + "resolved": "https://registry.npmjs.org/unified/-/unified-11.0.5.tgz", + "integrity": "sha512-xKvGhPWw3k84Qjh8bI3ZeJjqnyadK+GEFtazSfZv/rKeTkTjOJho6mFqh2SM96iIcZokxiOpg78GazTSg8+KHA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/unist": "^3.0.0", + "bail": "^2.0.0", + "devlop": "^1.0.0", + "extend": "^3.0.0", + "is-plain-obj": "^4.0.0", + "trough": "^2.0.0", + "vfile": "^6.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/union": { + "version": "0.5.0", + "resolved": "https://registry.npmjs.org/union/-/union-0.5.0.tgz", + "integrity": "sha512-N6uOhuW6zO95P3Mel2I2zMsbsanvvtgn6jVqJv4vbVcz/JN0OkL9suomjQGmWtxJQXOCqUJvquc1sMeNz/IwlA==", + "dev": true, + "dependencies": { + "qs": "^6.4.0" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "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, + "license": "MIT", + "peer": true, + "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, + "license": "MIT", + "peer": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/unist-util-is": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/unist-util-is/-/unist-util-is-6.0.0.tgz", + "integrity": "sha512-2qCTHimwdxLfz+YzdGfkqNlH0tLi9xjTnHddPmJwtIG9MGsdbutfTc4P+haPD7l7Cjxf/WZj+we5qfVPvvxfYw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/unist": "^3.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/unist-util-position": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/unist-util-position/-/unist-util-position-5.0.0.tgz", + "integrity": "sha512-fucsC7HjXvkB5R3kTCO7kUjRdrS0BJt3M/FPxmHMBOm8JQi2BsHAHFsy27E0EolP8rp0NzXsJ+jNPyDWvOJZPA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/unist": "^3.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/unist-util-position-from-estree": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/unist-util-position-from-estree/-/unist-util-position-from-estree-2.0.0.tgz", + "integrity": "sha512-KaFVRjoqLyF6YXCbVLNad/eS4+OfPQQn2yOd7zF/h5T/CSL2v8NpN6a5TPvtbXthAGw5nG+PuTtq+DdIZr+cRQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/unist": "^3.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/unist-util-stringify-position": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/unist-util-stringify-position/-/unist-util-stringify-position-4.0.0.tgz", + "integrity": "sha512-0ASV06AAoKCDkS2+xw5RXJywruurpbC4JZSm7nr7MOt1ojAzvyyaO+UxZf18j8FCF6kmzCZKcAgN/yu2gm2XgQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/unist": "^3.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/unist-util-visit": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/unist-util-visit/-/unist-util-visit-5.0.0.tgz", + "integrity": "sha512-MR04uvD+07cwl/yhVuVWAtw+3GOR/knlL55Nd/wAdblk27GCVt3lqpTivy/tkJcZoNPzTwS1Y+KMojlLDhoTzg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/unist": "^3.0.0", + "unist-util-is": "^6.0.0", + "unist-util-visit-parents": "^6.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/unist-util-visit-parents": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/unist-util-visit-parents/-/unist-util-visit-parents-6.0.1.tgz", + "integrity": "sha512-L/PqWzfTP9lzzEa6CKs0k2nARxTdZduw3zyh8d2NVBnsyvHjSX4TWse388YrrQKbvI8w20fGjGlhgT96WwKykw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/unist": "^3.0.0", + "unist-util-is": "^6.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "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/unplugin": { + "version": "1.16.0", + "resolved": "https://registry.npmjs.org/unplugin/-/unplugin-1.16.0.tgz", + "integrity": "sha512-5liCNPuJW8dqh3+DM6uNM2EI3MLLpCKp/KY+9pB5M2S2SR2qvvDHhKgBOaTWEbZTAws3CXfB0rKTIolWKL05VQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "acorn": "^8.14.0", + "webpack-virtual-modules": "^0.6.2" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "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, + "license": "MIT", + "peer": true, + "dependencies": { + "has-value": "^0.3.1", + "isobject": "^3.0.0" + }, + "engines": { + "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", + "peer": true, + "dependencies": { + "get-value": "^2.0.3", + "has-values": "^0.1.4", + "isobject": "^2.0.0" + }, + "engines": { + "node": ">=0.10.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, + "license": "MIT", + "peer": true, + "dependencies": { + "isarray": "1.0.0" + }, + "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", + "peer": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/unset-value/node_modules/isarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", + "integrity": "sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==", + "dev": true, + "license": "MIT", + "peer": true + }, + "node_modules/untildify": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/untildify/-/untildify-4.0.0.tgz", + "integrity": "sha512-KK8xQ1mkzZeg9inewmFVDNkg3l5LUhoq9kN6iWYB/CC9YMG8HA+c1Q8HwDe6dEX7kErrEVNVBO3fWsVq5iDgtw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "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, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/browserslist" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", + "dependencies": { + "escalade": "^3.2.0", + "picocolors": "^1.1.0" + }, + "bin": { + "update-browserslist-db": "cli.js" + }, + "peerDependencies": { + "browserslist": ">= 4.21.0" + } + }, + "node_modules/uri-js": { + "version": "4.4.1", + "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz", + "integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "punycode": "^2.1.0" + } + }, + "node_modules/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, + "license": "MIT", + "peer": true + }, + "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/url-join": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/url-join/-/url-join-4.0.1.tgz", + "integrity": "sha512-jk1+QP6ZJqyOiuEI9AEWQfju/nB2Pw466kbA0LEZljHwKeMgd9WrAEgEGxjPDD2+TNbbb37rTyhEfrCXfuKXnA==", + "dev": true, + "license": "MIT" + }, + "node_modules/url/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/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", + "peer": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/util": { + "version": "0.12.5", + "resolved": "https://registry.npmjs.org/util/-/util-0.12.5.tgz", + "integrity": "sha512-kZf/K6hEIrWHI6XqOFUiiMa+79wE/D8Q+NCNAWclkyg3b4d2k7s0QGepNjiABc+aR3N1PAyHL7p6UcLY6LmrnA==", + "dev": true, + "license": "MIT", + "dependencies": { + "inherits": "^2.0.3", + "is-arguments": "^1.0.4", + "is-generator-function": "^1.0.7", + "is-typed-array": "^1.1.3", + "which-typed-array": "^1.1.2" + } + }, + "node_modules/util-deprecate": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", + "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==", + "dev": true, + "license": "MIT" + }, + "node_modules/utila": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/utila/-/utila-0.4.0.tgz", + "integrity": "sha512-Z0DbgELS9/L/75wZbro8xAnT50pBVFQZ+hUEueGDU5FN51YSCYM+jdxsfCiHjwNP/4LCDD0i/graKpeBnOXKRA==", + "dev": true, + "license": "MIT" + }, + "node_modules/uuid": { + "version": "10.0.0", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-10.0.0.tgz", + "integrity": "sha512-8XkAphELsDnEGrDxUOHB3RGvXz6TeuYSGEZBOjtTtPm2lwhGBjLgOzLHB63IUWfBpNucQjND6d3AOudO+H3RWQ==", + "dev": true, + "funding": [ + "https://github.com/sponsors/broofa", + "https://github.com/sponsors/ctavan" + ], + "license": "MIT", + "bin": { + "uuid": "dist/bin/uuid" + } + }, + "node_modules/v8-to-istanbul": { + "version": "9.3.0", + "resolved": "https://registry.npmjs.org/v8-to-istanbul/-/v8-to-istanbul-9.3.0.tgz", + "integrity": "sha512-kiGUalWN+rgBJ/1OHZsBtU4rXZOfj/7rKQxULKlIzwzQSvMJUUNgPwJEEh7gU6xEVxC0ahoOBvN2YI8GH6FNgA==", + "dev": true, + "license": "ISC", + "dependencies": { + "@jridgewell/trace-mapping": "^0.3.12", + "@types/istanbul-lib-coverage": "^2.0.1", + "convert-source-map": "^2.0.0" + }, + "engines": { + "node": ">=10.12.0" + } + }, + "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", + "dependencies": { + "spdx-correct": "^3.0.0", + "spdx-expression-parse": "^3.0.0" + } + }, + "node_modules/validate-npm-package-license/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, + "license": "MIT", + "dependencies": { + "spdx-exceptions": "^2.1.0", + "spdx-license-ids": "^3.0.0" + } + }, + "node_modules/vfile": { + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/vfile/-/vfile-6.0.3.tgz", + "integrity": "sha512-KzIbH/9tXat2u30jf+smMwFCsno4wHVdNmzFyL+T/L3UGqqk6JKfVqOFOZEpZSHADH1k40ab6NUIXZq422ov3Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/unist": "^3.0.0", + "vfile-message": "^4.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/vfile-message": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/vfile-message/-/vfile-message-4.0.2.tgz", + "integrity": "sha512-jRDZ1IMLttGj41KcZvlrYAaI3CfqpLpfpf+Mfig13viT6NKvRzWZ+lXz0Y5D60w6uJIBAOGq9mSHf0gktF0duw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/unist": "^3.0.0", + "unist-util-stringify-position": "^4.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/walker": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/walker/-/walker-1.0.8.tgz", + "integrity": "sha512-ts/8E8l5b7kY0vlWLewOkDXMmPdLcVV4GmOQLyxuSswIJsweeFZtAsMF7k1Nszz+TYBQrlYRmzOnr398y1JemQ==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "makeerror": "1.0.12" + } + }, + "node_modules/watchpack": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/watchpack/-/watchpack-2.4.2.tgz", + "integrity": "sha512-TnbFSbcOCcDgjZ4piURLCbJ3nJhznVh9kw6F6iokjiFPl8ONxe9A6nMDVXDiNbrSfLILs6vB07F7wLBrwPYzJw==", + "dev": true, + "license": "MIT", + "dependencies": { + "glob-to-regexp": "^0.4.1", + "graceful-fs": "^4.1.2" + }, + "engines": { + "node": ">=10.13.0" + } + }, + "node_modules/wcwidth": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/wcwidth/-/wcwidth-1.0.1.tgz", + "integrity": "sha512-XHPEwS0q6TaxcvG85+8EYkbiCux2XtWG2mkc47Ng2A77BQu9+DqIOJldST4HgPkuea7dvKSj5VgX3P1d4rW8Tg==", + "dev": true, + "license": "MIT", + "dependencies": { + "defaults": "^1.0.3" + } + }, + "node_modules/webidl-conversions": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-3.0.1.tgz", + "integrity": "sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ==", + "dev": true, + "license": "BSD-2-Clause" + }, + "node_modules/webpack": { + "version": "5.96.1", + "resolved": "https://registry.npmjs.org/webpack/-/webpack-5.96.1.tgz", + "integrity": "sha512-l2LlBSvVZGhL4ZrPwyr8+37AunkcYj5qh8o6u2/2rzoPc8gxFJkLj1WxNgooi9pnoc06jh0BjuXnamM4qlujZA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/eslint-scope": "^3.7.7", + "@types/estree": "^1.0.6", + "@webassemblyjs/ast": "^1.12.1", + "@webassemblyjs/wasm-edit": "^1.12.1", + "@webassemblyjs/wasm-parser": "^1.12.1", + "acorn": "^8.14.0", + "browserslist": "^4.24.0", + "chrome-trace-event": "^1.0.2", + "enhanced-resolve": "^5.17.1", + "es-module-lexer": "^1.2.1", + "eslint-scope": "5.1.1", + "events": "^3.2.0", + "glob-to-regexp": "^0.4.1", + "graceful-fs": "^4.2.11", + "json-parse-even-better-errors": "^2.3.1", + "loader-runner": "^4.2.0", + "mime-types": "^2.1.27", + "neo-async": "^2.6.2", + "schema-utils": "^3.2.0", + "tapable": "^2.1.1", + "terser-webpack-plugin": "^5.3.10", + "watchpack": "^2.4.1", + "webpack-sources": "^3.2.3" + }, + "bin": { + "webpack": "bin/webpack.js" + }, + "engines": { + "node": ">=10.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + }, + "peerDependenciesMeta": { + "webpack-cli": { + "optional": true + } + } + }, + "node_modules/webpack-dev-middleware": { + "version": "6.1.3", + "resolved": "https://registry.npmjs.org/webpack-dev-middleware/-/webpack-dev-middleware-6.1.3.tgz", + "integrity": "sha512-A4ChP0Qj8oGociTs6UdlRUGANIGrCDL3y+pmQMc+dSsraXHCatFpmMey4mYELA+juqwUqwQsUgJJISXl1KWmiw==", + "dev": true, + "license": "MIT", + "dependencies": { + "colorette": "^2.0.10", + "memfs": "^3.4.12", + "mime-types": "^2.1.31", + "range-parser": "^1.2.1", + "schema-utils": "^4.0.0" + }, + "engines": { + "node": ">= 14.15.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + }, + "peerDependencies": { + "webpack": "^5.0.0" + }, + "peerDependenciesMeta": { + "webpack": { + "optional": true + } + } + }, + "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-hot-middleware/node_modules/strip-ansi": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/webpack-sources": { + "version": "3.2.3", + "resolved": "https://registry.npmjs.org/webpack-sources/-/webpack-sources-3.2.3.tgz", + "integrity": "sha512-/DyMEOrDgLKKIG0fmvtz+4dUX/3Ghozwgm6iPp8KRhvn+eQf9+Q7GWxVNMk3+uCPWfdXYC4ExGBckIXdFEfH1w==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10.13.0" + } + }, + "node_modules/webpack-virtual-modules": { + "version": "0.6.2", + "resolved": "https://registry.npmjs.org/webpack-virtual-modules/-/webpack-virtual-modules-0.6.2.tgz", + "integrity": "sha512-66/V2i5hQanC51vBQKPH4aI8NMAcBW59FVBs+rC7eGHupMyfn34q7rZIE+ETlJ+XTevqfUhVVBgSUNSW2flEUQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/webpack/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/webpack/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/webpack/node_modules/schema-utils": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-3.3.0.tgz", + "integrity": "sha512-pN/yOAvcC+5rQ5nERGuwrjLlYvLTbCibnZ1I7B1LaiAz9BRBlE9GMgE/eqV30P7aJQUf7Ddimy/RsbYO/GrVGg==", + "dev": true, + "license": "MIT", + "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/whatwg-encoding": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/whatwg-encoding/-/whatwg-encoding-2.0.0.tgz", + "integrity": "sha512-p41ogyeMUrw3jWclHWTQg1k05DSVXPLcVxRTYsXUk+ZooOCZLcoYgPZ/HL/D/N+uQPOtcp1me1WhBEaX02mhWg==", + "dev": true, + "license": "MIT", + "dependencies": { + "iconv-lite": "0.6.3" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/whatwg-encoding/node_modules/iconv-lite": { + "version": "0.6.3", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.6.3.tgz", + "integrity": "sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==", + "dev": true, + "license": "MIT", + "dependencies": { + "safer-buffer": ">= 2.1.2 < 3.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "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==", + "dev": true, + "license": "MIT", + "dependencies": { + "tr46": "~0.0.3", + "webidl-conversions": "^3.0.0" + } + }, + "node_modules/which": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", + "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", + "dev": true, + "license": "ISC", + "dependencies": { + "isexe": "^2.0.0" + }, + "bin": { + "node-which": "bin/node-which" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/which-boxed-primitive": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/which-boxed-primitive/-/which-boxed-primitive-1.0.2.tgz", + "integrity": "sha512-bwZdv0AKLpplFY2KZRX6TvyuN7ojjr7lwkg6ml0roIy9YeuSr7JS372qlNW18UQYzgYK9ziGcerWqZOmEn9VNg==", + "dev": true, + "license": "MIT", + "dependencies": { + "is-bigint": "^1.0.1", + "is-boolean-object": "^1.1.0", + "is-number-object": "^1.0.4", + "is-string": "^1.0.5", + "is-symbol": "^1.0.3" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/which-builtin-type": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/which-builtin-type/-/which-builtin-type-1.2.0.tgz", + "integrity": "sha512-I+qLGQ/vucCby4tf5HsLmGueEla4ZhwTBSqaooS+Y0BuxN4Cp+okmGuV+8mXZ84KDI9BA+oklo+RzKg0ONdSUA==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.7", + "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.1.0", + "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", + "resolved": "https://registry.npmjs.org/which-collection/-/which-collection-1.0.2.tgz", + "integrity": "sha512-K4jVyjnBdgvc86Y6BkaLZEN933SwYOuBFkdmBu9ZfkcAbdVbpITnDmjvZ/aQjRXQrv5EPkTnD1s39GiiqbngCw==", + "dev": true, + "license": "MIT", + "dependencies": { + "is-map": "^2.0.3", + "is-set": "^2.0.3", + "is-weakmap": "^2.0.2", + "is-weakset": "^2.0.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/which-typed-array": { + "version": "1.1.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": { + "available-typed-arrays": "^1.0.7", + "call-bind": "^1.0.7", + "for-each": "^0.3.3", + "gopd": "^1.0.1", + "has-tostringtag": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/word-wrap": { + "version": "1.2.5", + "resolved": "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.5.tgz", + "integrity": "sha512-BN22B5eaMMI9UMtjrGd5g5eCYPpCPDUy0FJXbYsaT5zYxjFOckS53SQDE3pWkVoWpHXVb3BrYcEN4Twa55B5cA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "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/wrap-ansi-cjs": { + "name": "wrap-ansi", + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", + "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-styles": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/wrap-ansi?sponsor=1" + } + }, + "node_modules/wrap-ansi-cjs/node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "license": "MIT", + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/wrap-ansi-cjs/node_modules/strip-ansi": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/wrap-ansi/node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "license": "MIT", + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/wrap-ansi/node_modules/strip-ansi": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/wrappy": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", + "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==", + "dev": true, + "license": "ISC" + }, + "node_modules/write-file-atomic": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-4.0.2.tgz", + "integrity": "sha512-7KxauUdBmSdWnmpaGFg+ppNjKF8uNLry8LyzjauQDOVONfFLNKrKvQOxZ/VuTIcS/gge/YNahf5RIIQWTSarlg==", + "dev": true, + "license": "ISC", + "dependencies": { + "imurmurhash": "^0.1.4", + "signal-exit": "^3.0.7" + }, + "engines": { + "node": "^12.13.0 || ^14.15.0 || >=16.0.0" + } + }, + "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/ws": { + "version": "8.18.0", + "resolved": "https://registry.npmjs.org/ws/-/ws-8.18.0.tgz", + "integrity": "sha512-8VbfWfHLbbwu3+N6OKsOMpBdT4kXPDDB9cJk2bJ6mh9ucxdlnNvH1e+roYkKmN9Nxw2yjz7VzeO9oOz2zJ04Pw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10.0.0" + }, + "peerDependencies": { + "bufferutil": "^4.0.1", + "utf-8-validate": ">=5.0.2" + }, + "peerDependenciesMeta": { + "bufferutil": { + "optional": true + }, + "utf-8-validate": { + "optional": true + } + } + }, + "node_modules/xtend": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.2.tgz", + "integrity": "sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.4" + } + }, + "node_modules/y18n": { + "version": "5.0.8", + "resolved": "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz", + "integrity": "sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==", + "dev": true, + "license": "ISC", + "engines": { + "node": ">=10" + } + }, + "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/yaml": { + "version": "1.10.2", + "resolved": "https://registry.npmjs.org/yaml/-/yaml-1.10.2.tgz", + "integrity": "sha512-r3vXyErRCYJ7wg28yvBY5VSoAF8ZvlcW9/BwUzEtUsjvX/DKs24dIkuwjtuprwJJHsbyUbLApepYTR1BN4uHrg==", + "dev": true, + "license": "ISC", + "engines": { + "node": ">= 6" + } + }, + "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/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==", + "dev": true, + "license": "ISC", + "engines": { + "node": ">=12" + } + }, + "node_modules/yargs/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, + "license": "ISC", + "engines": { + "node": ">=10" + } + }, + "node_modules/yauzl": { + "version": "2.10.0", + "resolved": "https://registry.npmjs.org/yauzl/-/yauzl-2.10.0.tgz", + "integrity": "sha512-p4a9I6X6nu6IhoGmBqAcbJy1mlC4j27vEPZX9F4L4/vZT3Lyq1VkFHw/V/PUcB9Buo+DG3iHkT0x3Qya58zc3g==", + "dev": true, + "license": "MIT", + "dependencies": { + "buffer-crc32": "~0.2.3", + "fd-slicer": "~1.1.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" + } + }, + "node_modules/yoctocolors-cjs": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/yoctocolors-cjs/-/yoctocolors-cjs-2.1.2.tgz", + "integrity": "sha512-cYVsTjKl8b+FrnidjibDWskAv7UKOfcwaVZdp/it9n1s9fU3IkgDbhdIRKCW4JDsAlECJY0ytoVPT3sK6kideA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/zwitch": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/zwitch/-/zwitch-2.0.4.tgz", + "integrity": "sha512-bXE4cR/kVZhKZX/RjPEflHaKVhUVl85noU3v6b8apfQEc1x4A+zBxjZ4lN8LqGd6WZ3dl98pY4o717VFmoPp+A==", + "dev": true, + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + } + } +} diff --git a/package.json b/package.json new file mode 100644 index 0000000..7f15e62 --- /dev/null +++ b/package.json @@ -0,0 +1,115 @@ +{ + "name": "@popiplay/slot-machines", + "version": "1.2.1", + "description": "It is a library that contains slot machines and their components, that are extensible to allow them to be used in any project", + "homepage": "https://gitlab.popiplay.dev/fe/npm/slot-machines#readme", + "bugs": "https://gitlab.popiplay.dev/fe/npm/slot-machines/issues", + "repository": { + "type": "git", + "url": "git+https://gitlab.popiplay.dev/fe/npm/slot-machines.git" + }, + "license": "ISC", + "author": "Andrey Sharshov ", + "sideEffects": false, + "exports": { + ".": { + "import": "./lib/index.mjs", + "require": "./lib/index.js" + }, + "./*": "./lib/*" + }, + "main": "./lib/index.js", + "module": "./lib/index.mjs", + "types": "./lib/index.d.ts", + "files": [ + "lib", + "dist/" + ], + "scripts": { + "start": "npm i && npm run storybook", + "build": "xs build", + "clean": "xs clean", + "deploy": "xs deploy", + "docs": "xs docs && npm run storybook:build", + "lint": "xs lint --max-warnings 0", + "lint:fix": "xs lint --fix", + "prepare": "husky install", + "release": "npm i && xs bump,build,docs,publish,git-push", + "serve": "xs serve", + "storybook": "storybook dev -p 6006", + "storybook:build": "storybook build --output-dir docs/storybook", + "types": "xs types", + "watch": "xs watch", + "generate-barrels": "barrelsby --directory ./src --exclude index.ts, stories --delete --exportDefault false --singleQuotes" + }, + "husky": { + "hooks": { + "pre-commit": "lint-staged" + } + }, + "lint-staged": { + "*.{ts,js,mjs}": [ + "npm run lint:fix --" + ] + }, + "extensionConfig": { + "lint": [ + "src" + ], + "docsName": "Popiplay Slot Machines", + "docsTitle": "Popiplay Slot Machines", + "docsDescription": "API Documentation for Slot Machines components made with PixiJS", + "docsKeyword": "PixiJS, SlotMachine, components" + }, + "keywords": [ + "state", + "machine" + ], + "peerDependencies": { + "@pixi/filter-motion-blur": "^5.1.1", + "@popiplay/state-machine": "^1.0.6", + "pixi-spine": "^4.0.4", + "pixi.js": "^7.4.2" + }, + "devDependencies": { + "@babel/preset-env": "^7.26.0", + "@babel/preset-react": "^7.25.9", + "@babel/preset-typescript": "^7.26.0", + "@chromatic-com/storybook": "^3.2.1", + "@mdx-js/loader": "^3.1.0", + "@mdx-js/react": "^3.1.0", + "@pixi/extension-scripts": "^2.4.1", + "@pixi/filter-motion-blur": "^5.1.1", + "@pixi/storybook-renderer": "^1.0.0", + "@pixi/storybook-webpack5": "^1.0.0", + "@popiplay/state-machine": "^1.0.5", + "@rollup/plugin-commonjs": "^28.0.1", + "@storybook/addon-docs": "^8.4.0", + "@storybook/addon-essentials": "^8.4.0", + "@storybook/addon-interactions": "^8.4.0", + "@storybook/addon-links": "^8.4.0", + "@storybook/addon-storysource": "^8.4.0", + "@storybook/addon-webpack5-compiler-babel": "^3.0.3", + "@storybook/test": "^8.4.0", + "@storybook/types": "^8.4.0", + "@types/babel__core": "^7.20.5", + "@types/jest": "^29.5.14", + "babel-loader": "^9.2.1", + "eslint": "^8.57.1", + "eslint-plugin-jsdoc": "^50.4.3", + "eslint-plugin-no-mixed-operators": "^1.1.1", + "husky": "^9.1.6", + "jest": "^29.7.0", + "jest-raw-loader": "^1.0.1", + "lint-staged": "^15.2.10", + "storybook": "^8.4.0", + "tsc-alias": "^1.8.10", + "typescript": "^5.6.3", + "pixi-spine": "^4.0.4", + "pixi.js": "^7.4.2" + }, + "publishConfig": { + "@popiplay:registry": "https://gitlab.popiplay.dev/api/v4/projects/fe%2Fnpm%2Fslot-machines/packages/npm/" + }, + "dependencies": {} +} diff --git a/src/entities/AnticipationBack.ts b/src/entities/AnticipationBack.ts new file mode 100644 index 0000000..002ac63 --- /dev/null +++ b/src/entities/AnticipationBack.ts @@ -0,0 +1,12 @@ +import {Spine} from "pixi-spine"; +import {Assets} from "pixi.js"; +import AnticipationFrame from "./AnticipationFrame"; + + +export default class AnticipationBack extends AnticipationFrame { + public override create() { + this.spine = new Spine(Assets.get("anticipation_back").spineData); + this.addChild(this.spine); + this.spine.autoUpdate = false; + } +} diff --git a/src/entities/AnticipationFrame.ts b/src/entities/AnticipationFrame.ts new file mode 100644 index 0000000..57d9085 --- /dev/null +++ b/src/entities/AnticipationFrame.ts @@ -0,0 +1,37 @@ +import { Assets, Container } from 'pixi.js'; +import { ITrackEntry, Spine } from 'pixi-spine'; + +export default class AnticipationFrame extends Container +{ + protected spine: Spine; + constructor() + { + super(); + this.create(); + } + + protected create() + { + this.spine = new Spine(Assets.get('anticipation').spineData); + this.addChild(this.spine); + this.spine.autoUpdate = false; + } + + update(dt: number): void + { + this.spine.update(dt * 0.001); + } + + show(): ITrackEntry + { + this.spine.state.setEmptyAnimation(0, 0.1); + this.spine.state.addAnimation(0, 'in', false, 0); + + return this.spine.state.addAnimation(0, 'idle', true, 0); + } + + hide(): ITrackEntry + { + return this.spine.state.setAnimation(0, 'out', false); + } +} diff --git a/src/entities/AnticipationFront.ts b/src/entities/AnticipationFront.ts new file mode 100644 index 0000000..fbad94c --- /dev/null +++ b/src/entities/AnticipationFront.ts @@ -0,0 +1,12 @@ +import {Spine} from "pixi-spine"; +import {Assets} from "pixi.js"; +import AnticipationFrame from "./AnticipationFrame"; + + +export default class AnticipationFront extends AnticipationFrame { + public override create() { + this.spine = new Spine(Assets.get("anticipation_front").spineData); + this.addChild(this.spine); + this.spine.autoUpdate = false; + } +} diff --git a/src/entities/BasicWin.ts b/src/entities/BasicWin.ts new file mode 100644 index 0000000..a820b6d --- /dev/null +++ b/src/entities/BasicWin.ts @@ -0,0 +1,74 @@ +import { Container, Text } from 'pixi.js'; +import { Spine } from 'pixi-spine'; + +export default class BasicWin extends Container +{ + spine: Spine; + betValueText: Text; + isShown: boolean; + + constructor() + { + super(); + + this._create(); + } + + _create() + { + this.betValueText = new Text(); + this.betValueText.style = { + fill: 0xffffff, + stroke: 0x000000, + strokeThickness: 3, + fontSize: 40, + fontFamily: 'Arial', + letterSpacing: 0, + }; + this.betValueText.anchor.set(0.5); + this.addChild(this.betValueText); + this.value = ''; + this.isShown = false; + this.betValueText.visible = false; + } + + get value(): string + { + return this.betValueText.text; + } + + set value(formattedValue: string) + { + this.betValueText.text = formattedValue; + } + + update(_dt:number) + { + + } + + show() + { + if (this.isShown) return; + this.betValueText.visible = true; + this.isShown = true; + } + + hide() + { + if (!this.isShown) return; + this.isShown = false; + this.betValueText.visible = false; + } + + hidden() + { + this.isShown = false; + this.betValueText.visible = false; + } + + override destroy(_options?: object) + { + super.destroy(_options); + } +} diff --git a/src/entities/CascadeSymbol.ts b/src/entities/CascadeSymbol.ts new file mode 100644 index 0000000..8093894 --- /dev/null +++ b/src/entities/CascadeSymbol.ts @@ -0,0 +1,45 @@ +import { ITrackEntry } from 'pixi-spine'; +import { CanBeBlocked, CanPlayBouncing, CanPlayFalling, CanPlayIdle, CanPlayWin } from '../types/Entity'; +import Symbol from './Symbol'; + +export default class CascadeSymbol extends Symbol implements + CanPlayIdle, CanPlayBouncing, CanBeBlocked, CanPlayWin, CanPlayFalling +{ + public isBlocked: boolean = false; + + /** + * Triggers the idle animation for the symbol and returns track entry. + * @returns A function to check the animation progress. + */ + idle(): ITrackEntry + { + return this.spine.state.setAnimation(0, 'idle', false); + } + + /** + * Triggers the bounce animation and returns track entry. + * @returns A function to check the animation progress. + */ + bounce(): ITrackEntry + { + return this.spine.state.setAnimation(0, 'bounce', false); + } + + /** + * Triggers the win animation and returns track entry. + * @returns A function to check the animation progress. + */ + win(): ITrackEntry + { + return this.spine.state.setAnimation(0, 'win', false); + } + + /** + * Triggers the falling animation and returns track entry. + * @returns A function to check the animation progress. + */ + falling(): ITrackEntry + { + return this.spine.state.setAnimation(0, 'falling', false); + } +} diff --git a/src/entities/ExpandedSymbol.ts b/src/entities/ExpandedSymbol.ts new file mode 100644 index 0000000..43190cc --- /dev/null +++ b/src/entities/ExpandedSymbol.ts @@ -0,0 +1,43 @@ +import { CanPlayIn, CanPlayOut, CanPlaySpin, CanPlayWin } from '../types/Entity'; +import { ITrackEntry } from '../types/ITrackEntry'; +import ReelSymbol from './ReelSymbol'; + +/** + * @class ExpandedSymbol + * @extends ReelSymbol + * @implements CanPlayWin + * @implements CanPlayIn + * @implements CanPlayOut + * @implements CanPlaySpin + * @description Represents an expanded symbol in a slot machine game that can play various animations such as spin, in, and out. + */ +export default class ExpandedSymbol extends ReelSymbol implements CanPlayWin, CanPlayIn, CanPlayOut, CanPlaySpin +{ + reelIndex: number; + /** + * Triggers the spin animation for the symbol. + * @returns {ITrackEntry} The track entry of the animation. + */ + public spin(): ITrackEntry + { + return this.spine.state.setAnimation(0, 'spin', false); + } + + /** + * Sets the animation state to 'in' and returns the track entry. + * @returns {ITrackEntry} The track entry for the 'in' animation. + */ + public in(): ITrackEntry + { + return this.spine.state.setAnimation(0, 'in', false); + } + + /** + * Sets the animation state to 'out' and returns the track entry. + * @returns {ITrackEntry} The track entry of the animation. + */ + public out(): ITrackEntry + { + return this.spine.state.setAnimation(0, 'out', false); + } +} diff --git a/src/entities/ReelSymbol.ts b/src/entities/ReelSymbol.ts new file mode 100644 index 0000000..6cdae94 --- /dev/null +++ b/src/entities/ReelSymbol.ts @@ -0,0 +1,92 @@ +import { ITrackEntry } from 'pixi-spine'; +import { MaskData, Rectangle } from 'pixi.js'; +import { CanBeBlocked, CanBeBlurred, CanBeLanded, CanBeMasked, CanPlayBouncing, CanPlayIdle, CanPlayWin } from '../types/Entity'; +import Symbol from './Symbol'; + +export default class ReelSymbol extends Symbol implements + CanPlayIdle, CanPlayBouncing, CanBeBlocked, CanPlayWin, CanBeBlurred, CanBeLanded, CanBeMasked +{ + public isBlocked: boolean = false; + public isLanded: boolean = false; + public isBlurred: boolean = false; + public blurEnabled: boolean = false; + public isMasked: boolean = false; + private filterAreaRect?: Rectangle; + + /** + * Triggers the idle animation for the symbol and returns a function to check its progress. + * @returns A function to check the animation progress. + */ + public idle(): ITrackEntry + { + return this.spine.state.setAnimation(0, 'idle', false); + } + + /** + * Triggers the bounce animation and returns a function to check its progress. + * @returns A function to check the animation progress. + */ + public bounce(): ITrackEntry + { + return this.spine.state.setAnimation(0, 'bounce', false); + } + + /** + * Triggers the win animation and returns a function to check its progress. + * @returns A function to check the animation progress. + */ + public win(): ITrackEntry + { + return this.spine.state.setAnimation(0, 'win', false); + } + + public anticipate() + { + return this.spine.state.setAnimation(0, 'anticipation', false); + } + + /** Updates the blur clipping area to match the applied mask bounds. */ + private updateBlurClipping(): void + { + if (!this.blurEnabled || !this.isMasked) + { + this.filterArea = null; + this.filterAreaRect = undefined; + return; + } + + const mask = this.mask; + + if (!mask || mask instanceof MaskData) + { + this.filterArea = null; + return; + } + + const maskBounds = mask.getBounds(true); + + if (!maskBounds.width || !maskBounds.height) + { + this.filterArea = null; + return; + } + + if (!this.filterAreaRect) + { + this.filterAreaRect = maskBounds.clone(); + } + else + { + this.filterAreaRect.copyFrom(maskBounds); + } + + this.filterArea = this.filterAreaRect; + } + + /** @inheritdoc */ + public override update(dt: number): void + { + super.update(dt); + this.updateBlurClipping(); + } +} diff --git a/src/entities/SlotMultiplierEntity.ts b/src/entities/SlotMultiplierEntity.ts new file mode 100644 index 0000000..4f416aa --- /dev/null +++ b/src/entities/SlotMultiplierEntity.ts @@ -0,0 +1,155 @@ +import { Assets, Container, Text } from 'pixi.js'; +import { Spine } from 'pixi-spine'; +import { CanPlayIn, CanPlayOut, Updatable } from '../types/Entity'; +import { ITrackEntry } from '../types/ITrackEntry'; + +/** + * Lightweight overlay entity for slot multipliers backed by a Spine animation. + */ +export default class SlotMultiplierEntity extends Container implements Updatable, CanPlayIn, CanPlayOut +{ + private spine: Spine; + private assetKey: string; + private shown: boolean; + private label: Text; + private valueInternal = 0; + + constructor(assetKey: string = 'slot_multiplier') + { + super(); + this.assetKey = assetKey; + this.shown = false; + this.spine = this.createSpine(); + this.visible = false; + this.addChild(this.spine); + this.label = this.createLabel(); + this.attachLabel(); + this.registerOutListener(); + } + + /** + * Exposes current visibility state used by systems to prevent redundant transitions. + */ + public isShown(): boolean + { + return this.shown; + } + + /** + * Plays the "in" animation and reveals the entity. + */ + public in(): ITrackEntry + { + this.visible = true; + this.shown = true; + + return this.spine.state.setAnimation(0, 'in', false); + } + + /** + * Plays the "out" animation and keeps the entity visible until completion. + */ + public out(): ITrackEntry + { + this.shown = false; + + return this.spine.state.setAnimation(0, 'out', false); + } + + /** + * Current multiplier value displayed by the overlay text. + */ + public get value(): number + { + return this.valueInternal; + } + + /** + * Updates the overlay text with the provided multiplier value. + */ + public set value(value: number) + { + this.valueInternal = value; + this.label.text = Number.isFinite(value) ? value.toString() + "x" : ''; + } + + /** + * Updates the underlying Spine animation. + */ + public update(dt: number): void + { + this.spine.update(dt * 0.001); + } + + /** + * Creates the Spine instance for the multiplier overlay. + */ + private createSpine(): Spine + { + const asset = Assets.get(this.assetKey); + const spine = new Spine(asset.spineData); + spine.autoUpdate = false; + + return spine; + } + + /** + * Creates a red, centred text label for displaying the multiplier value. + */ + private createLabel(): Text + { + const text = new Text('', { + fill: 0xffffff, + fontSize: 24, + }); + text.anchor.set(0.5); + text.scale.set(1, -1) + + return text; + } + + /** + * Attaches the label to the Spine placeholder slot container. + */ + private attachLabel(): void + { + const placeholderIndex = this.findPlaceholderSlotIndex(); + if (placeholderIndex < 0) + { + this.addChild(this.label); + return; + } + + const container = this.spine.slotContainers[placeholderIndex]; + if (!container) + { + this.addChild(this.label); + return; + } + + container.addChild(this.label); + } + + /** + * Resolves the placeholder slot index from the Spine skeleton. + */ + private findPlaceholderSlotIndex(): number + { + return this.spine.skeleton.findSlotIndex('placeholder'); + } + + /** + * Hides the container once the "out" animation completes. + */ + private registerOutListener(): void + { + this.spine.state.addListener({ + complete: (entry: ITrackEntry) => + { + if (entry.animation.name !== 'out') return; + + this.visible = false; + }, + }); + } +} diff --git a/src/entities/StaticSymbol.ts b/src/entities/StaticSymbol.ts new file mode 100644 index 0000000..f5cc2f4 --- /dev/null +++ b/src/entities/StaticSymbol.ts @@ -0,0 +1,63 @@ +import { ITrackEntry } from 'pixi-spine'; +import { + CanBeBlocked, + CanPlayBouncing, + CanPlayFalling, + CanPlayIdle, + CanPlayIn, + CanPlayOut, + CanPlayWin +} from '../types/Entity'; +import Symbol from './Symbol'; + +export default class StaticSymbol extends Symbol implements + CanPlayIdle, CanPlayBouncing, CanBeBlocked, CanPlayWin, CanPlayFalling, CanPlayIn, CanPlayOut +{ + public isBlocked: boolean = false; + + /** + * Triggers the idle animation for the symbol and returns track entry. + * @returns A function to check the animation progress. + */ + idle(): ITrackEntry + { + return this.spine.state.setAnimation(0, 'idle', false); + } + + /** + * Triggers the bounce animation and returns track entry. + * @returns A function to check the animation progress. + */ + bounce(): ITrackEntry + { + return this.spine.state.setAnimation(0, 'bounce', false); + } + + /** + * Triggers the win animation and returns track entry. + * @returns A function to check the animation progress. + */ + win(): ITrackEntry + { + return this.spine.state.setAnimation(0, 'win', false); + } + + /** + * Triggers the falling animation and returns track entry. + * @returns A function to check the animation progress. + */ + falling(): ITrackEntry + { + return this.spine.state.setAnimation(0, 'falling', false); + } + + in(delay = 0) + { + return this.spine.state.addAnimation(0, 'in', false, delay); + } + + out(delay = 0) + { + return this.spine.state.addAnimation(0, 'out', false, delay); + } +} diff --git a/src/entities/Symbol.ts b/src/entities/Symbol.ts new file mode 100644 index 0000000..8e57d43 --- /dev/null +++ b/src/entities/Symbol.ts @@ -0,0 +1,89 @@ +import { Assets, Container } from 'pixi.js'; +import { Spine } from 'pixi-spine'; +import { Entity, Updatable } from '../types/Entity'; +import { SymbolConfig } from '../types/SlotMachineConfig'; +import { getUniqueId } from '../utils/getUniqueId'; + +/** + * @class Symbol + * @extends Container + * @description Represents a symbol in the slot machine with various animations and states. + */ +export default class Symbol extends Container implements Entity, Updatable +{ + protected config: SymbolConfig; + private _id?: string; + protected spine: Spine; + + /** Returns a unique identifier for the symbol instance. */ + override get name(): string + { + if (!this._id) + { + this._id = getUniqueId(); + } + + return this._id; + } + + /** Gets or sets the animation time scale for the symbol's spine animation. */ + get timeScale(): number + { + return this.spine.state.timeScale; + } + + set timeScale(timeScale: number) + { + this.spine.state.timeScale = timeScale; + } + + /** Returns the key associated with the symbol configuration. */ + get key(): string + { + return this.config.key; + } + + /** + * Initializes a symbol with the provided configuration. + * @class + * @param config - Configuration settings for the symbol, including spine asset and skin. + */ + constructor(config: SymbolConfig) + { + super(); + this.config = config; + this._create(); + } + + /** + * Creates and initializes the spine animation for the symbol based on its configuration. + * @private + */ + private _create(): void + { + this.spine = new Spine(Assets.get(this.config.spine).spineData); + this.spine.autoUpdate = false; + this.spine.skeleton.setSkinByName(this.config.skin); + this.spine.stateData.defaultMix = 0.5; + this.addChild(this.spine); + } + + /** + * Updates the spine animation based on delta time. + * @param dt - Delta time in milliseconds since the last update. + */ + update(dt: number): void + { + this.spine.update(dt * 0.001); + } + + public tint(hexColor: number): void + { + this.spine.tint = hexColor; + } + + public reset() + { + this.spine.state.setEmptyAnimation(0, 0.1); + } +} diff --git a/src/entities/ValuableExpandedSymbol.ts b/src/entities/ValuableExpandedSymbol.ts new file mode 100644 index 0000000..4229221 --- /dev/null +++ b/src/entities/ValuableExpandedSymbol.ts @@ -0,0 +1,43 @@ +import { CanPlayIn, CanPlayOut, CanPlaySpin, CanPlayWin } from '../types/Entity'; +import { ITrackEntry } from '../types/ITrackEntry'; +import ValuableReelSymbol from './ValuableReelSymbol'; + +/** + * @class ValuableExpandedSymbol + * @extends ValuableReelSymbol + * @implements CanPlayWin + * @implements CanPlayIn + * @implements CanPlayOut + * @implements CanPlaySpin + * @description Represents an expanded symbol in a slot machine game that can play various animations such as spin, in, and out. + */ +export default class ValuableExpandedSymbol extends ValuableReelSymbol implements CanPlayWin, CanPlayIn, CanPlayOut, CanPlaySpin +{ + reelIndex: number; + /** + * Triggers the spin animation for the symbol. + * @returns {ITrackEntry} The track entry of the animation. + */ + public spin(): ITrackEntry + { + return this.spine.state.setAnimation(0, 'spin', false); + } + + /** + * Sets the animation state to 'in' and returns the track entry. + * @returns {ITrackEntry} The track entry for the 'in' animation. + */ + public in(): ITrackEntry + { + return this.spine.state.setAnimation(0, 'in', false); + } + + /** + * Sets the animation state to 'out' and returns the track entry. + * @returns {ITrackEntry} The track entry of the animation. + */ + public out(): ITrackEntry + { + return this.spine.state.setAnimation(0, 'out', false); + } +} diff --git a/src/entities/ValuableReelSymbol.ts b/src/entities/ValuableReelSymbol.ts new file mode 100644 index 0000000..d86c897 --- /dev/null +++ b/src/entities/ValuableReelSymbol.ts @@ -0,0 +1,48 @@ +import {BitmapText} from 'pixi.js'; +import { SymbolConfig } from '../types/SlotMachineConfig'; +import ReelSymbol from './ReelSymbol'; + +export default class ValuableReelSymbol extends ReelSymbol +{ + private textObj: BitmapText; + private _value: number; + constructor(config: SymbolConfig) + { + super(config); + } + + public set value(v: number) + { + if (v <= 0) return; + !this.textObj && this.createValueText(); + this._value = v; + if (this.textObj) { + this.textObj.text = `X${v}`; + } + } + + public get value(): number + { + return this._value; + } + + private createValueText() + { + if (!this.config.fontStyle || !this.config.fontStyle.fontName) return; + this.textObj = new BitmapText(`X${this.config.value}`, this.config.fontStyle); + this.textObj.anchor.set(0.5); + this.textObj.scale.set(1, -1); + const slotIndex = this.spine.skeleton.findSlotIndex('value'); + + this.spine.slotContainers[slotIndex].addChild(this.textObj); + } + + public override tint(hexColor: number): void + { + super.tint(hexColor); + if (this.textObj) + { + this.textObj.tint = hexColor; + } + } +} diff --git a/src/entities/WebGLWinLine.ts b/src/entities/WebGLWinLine.ts new file mode 100644 index 0000000..fd56464 --- /dev/null +++ b/src/entities/WebGLWinLine.ts @@ -0,0 +1,439 @@ +import { + Container, + Geometry, + Mesh, + MeshMaterial, + MIPMAP_MODES, + Point, + Program, + Texture, + WRAP_MODES, +} from 'pixi.js'; + +class ScrollingMeshMaterial extends MeshMaterial +{ + constructor(texture: Texture) + { + const vertexSrc = ` + precision mediump float; + attribute vec2 aVertexPosition; + attribute vec2 aTextureCoord; + uniform mat3 translationMatrix; + uniform mat3 projectionMatrix; + varying vec2 vTextureCoord; + void main(void) { + gl_Position = vec4((projectionMatrix * translationMatrix * vec3(aVertexPosition, 1.0)).xy, 0.0, 1.0); + vTextureCoord = aTextureCoord; + } + `; + + const fragmentSrc = ` + precision mediump float; + varying vec2 vTextureCoord; + uniform sampler2D uSampler; + uniform float uTextureOffset; + void main(void) { + vec2 uv = vec2(vTextureCoord.x + uTextureOffset, vTextureCoord.y); + gl_FragColor = texture2D(uSampler, uv); + } + `; + + const program = Program.from(vertexSrc, fragmentSrc); + + super(texture, { + program, + uniforms: { uTextureOffset: 0 }, + }); + + // Важно: разрешить повтор, иначе при смещении по U появятся швы + if (texture?.baseTexture) + { + texture.baseTexture.wrapMode = WRAP_MODES.REPEAT; + texture.baseTexture.mipmap = MIPMAP_MODES.ON; + } + } +} + +/** Extend this class and override getters: texture, filletRadius, lineThickness, duration. */ +export default class WebGLWinLine extends Container +{ + private readonly mesh: Mesh; + private time: number = 0; + public state: 'stopped' | 'animating' = 'stopped'; + + get texture(): Texture + { + return Texture.from('textures/win_line.png'); + } + + get filletRadius() + { + return 30; + } + + get lineThickness() + { + return 30; + } + + /** duration in seconds */ + get duration() + { + return 1; + } + + constructor(points: number[][], slotWidth: number = 100, slotHeight: number = 100) + { + super(); + + const centers = points.map(([reel, row]) => + new Point((reel * slotWidth) + (slotWidth / 2), (row * slotHeight) + (slotHeight / 2)) + ); + + const centerCurveRaw = this.computeFilletCurve(centers, this.filletRadius); + const centerCurve = dedupeAndColinearCull(centerCurveRaw); + + this.mesh = this.createThickLineMesh(centerCurve, this.lineThickness, this.texture); + this.addChild(this.mesh); + } + + private computeFilletCurve(points: Point[], radius: number): Point[] + { + // Без филета/на острых углах важно не плодить нулевые сегменты + const result: Point[] = []; + + if (points.length < 2) return [...points]; + if (points.length === 2) return [points[0], points[1]]; + const sampleArc = (center: Point, startAngle: number, endAngle: number, segments: number): Point[] => + { + const arcPoints: Point[] = []; + + segments = Math.max(2, segments); + const delta = (endAngle - startAngle) / (segments - 1); + + for (let i = 0; i < segments; i++) + { + const a = startAngle + (delta * i); + + arcPoints.push(new Point(center.x + (radius * Math.cos(a)), center.y + (radius * Math.sin(a)))); + } + + return arcPoints; + }; + + let prevT2: Point | null = null; + + // --- первый узел --- + { + const [p0, p1, p2] = [points[0], points[1], points[2]]; + const d1 = normalizeVector(p0.x - p1.x, p0.y - p1.y); + const d2 = normalizeVector(p2.x - p1.x, p2.y - p1.y); + const dot = clamp((d1[0] * d2[0]) + (d1[1] * d2[1]), -1, 1); + const theta = Math.acos(dot); + + // если угол ≈ 0 (прямая), не создаём псевдо-дугу + if (theta < 1e-4) + { + result.push(p0, p1); + prevT2 = p1; + } + else + { + const offset = radius / Math.tan(theta / 2); + const T1 = new Point(p1.x + (d1[0] * offset), p1.y + (d1[1] * offset)); + const T2 = new Point(p1.x + (d2[0] * offset), p1.y + (d2[1] * offset)); + + result.push(p0, T1); + + const bisector = new Point(d1[0] + d2[0], d1[1] + d2[1]); + const bisectorLen = Math.hypot(bisector.x, bisector.y); + + if (bisectorLen > 0) + { + const bisectorNorm = new Point(bisector.x / bisectorLen, bisector.y / bisectorLen); + const centerDistance = radius / Math.sin(theta / 2); + const C = new Point(p1.x + (bisectorNorm.x * centerDistance), p1.y + (bisectorNorm.y * centerDistance)); + const startAngle = Math.atan2(T1.y - C.y, T1.x - C.x); + const arcSweep = Math.PI - theta; + const endAngle = startAngle + (cross2(T1, T2, C) < 0 ? -arcSweep : arcSweep); + const arcPoints = sampleArc(C, startAngle, endAngle, 10); + + result.push(...arcPoints.slice(1)); + prevT2 = T2; + } + else + { + // почти 180°: просто соединяем через вершину + result.push(p1); + prevT2 = p1; + } + } + } + + // --- внутренние узлы --- + for (let i = 2; i < points.length - 1; i++) + { + const pPrev = points[i - 1]; + const pCurr = points[i]; + const pNext = points[i + 1]; + + const v1 = normalizeVector(pPrev.x - pCurr.x, pPrev.y - pCurr.y); + const v2 = normalizeVector(pNext.x - pCurr.x, pNext.y - pCurr.y); + const dot = clamp((v1[0] * v2[0]) + (v1[1] * v2[1]), -1, 1); + const theta = Math.acos(dot); + + if (theta < 1e-4) + { + // прямая — не вставляем T1/T2 + if (prevT2) result.push(pCurr); + prevT2 = pCurr; + continue; + } + + const offset = radius / Math.tan(theta / 2); + const T1 = new Point(pCurr.x + (v1[0] * offset), pCurr.y + (v1[1] * offset)); + const T2 = new Point(pCurr.x + (v2[0] * offset), pCurr.y + (v2[1] * offset)); + + if (prevT2) result.push(T1); + + const bisector = new Point(v1[0] + v2[0], v1[1] + v2[1]); + const bisectorLen = Math.hypot(bisector.x, bisector.y); + + if (bisectorLen > 0) + { + const bisectorNorm = new Point(bisector.x / bisectorLen, bisector.y / bisectorLen); + const centerDistance = radius / Math.sin(theta / 2); + const C = new Point(pCurr.x + (bisectorNorm.x * centerDistance), pCurr.y + (bisectorNorm.y * centerDistance)); + const startAngle = Math.atan2(T1.y - C.y, T1.x - C.x); + const arcSweep = Math.PI - theta; + const endAngle = startAngle + (cross2(T1, T2, C) < 0 ? -arcSweep : arcSweep); + const arcPoints = sampleArc(C, startAngle, endAngle, 10); + + result.push(...arcPoints.slice(1)); + } + else + { + result.push(pCurr); + } + prevT2 = T2; + } + + // --- хвост --- + const lastPoint = points[points.length - 1]; + + if (prevT2) + { + result.push(prevT2, lastPoint); + } + else + { + result.push(lastPoint); + } + + return result; + } + + /** + * Создает Mesh c толщиной по центральной кривой. + * Митер-нормали с ограничением устраняют «ломы» на острых углах без обязательного скругления. + * @param curvePoints + * @param thickness + * @param texture + */ + private createThickLineMesh(curvePoints: Point[], thickness: number, texture: Texture): Mesh + { + const vertices: number[] = []; + const uvs: number[] = []; + const indices: number[] = []; + const n = curvePoints.length; + const halfThickness = thickness / 2; + + // накопленные длины для UV + let totalLength = 0; + const lengths: number[] = [0]; + + for (let i = 1; i < n; i++) + { + const dx = curvePoints[i].x - curvePoints[i - 1].x; + const dy = curvePoints[i].y - curvePoints[i - 1].y; + const seg = Math.hypot(dx, dy); + + totalLength += seg; + lengths.push(totalLength); + } + + // —— митер-нормали —— + const MITER_LIMIT = 4; + + function unit(x: number, y: number) + { + const l = Math.hypot(x, y); + + return l > 0 ? { x: x / l, y: y / l } : { x: 0, y: 0 }; + } + function perp(v: {x: number;y: number}) { return { x: -v.y, y: v.x }; } + + function computeNormal(i: number): { x: number; y: number } + { + if (n === 1) return { x: 0, y: 0 }; + if (i === 0) + { + const d = unit(curvePoints[1].x - curvePoints[0].x, curvePoints[1].y - curvePoints[0].y); + + return perp(d); + } + if (i === n - 1) + { + const d = unit(curvePoints[n - 1].x - curvePoints[n - 2].x, curvePoints[n - 1].y - curvePoints[n - 2].y); + + return perp(d); + } + const dPrev = unit(curvePoints[i].x - curvePoints[i - 1].x, curvePoints[i].y - curvePoints[i - 1].y); + const dNext = unit(curvePoints[i + 1].x - curvePoints[i].x, curvePoints[i + 1].y - curvePoints[i].y); + + const sum = { x: dPrev.x + dNext.x, y: dPrev.y + dNext.y }; + const sumLen = Math.hypot(sum.x, sum.y); + + if (sumLen < 1e-6) + { + // угол ~180° + return perp(dNext); + } + const t = { x: sum.x / sumLen, y: sum.y / sumLen }; // усреднённая касательная + const nAvg = perp(t); + + // miter scale = 1 / dot(nAvg, nNext) + const nNext = perp(dNext); + const denom = (nAvg.x * nNext.x) + (nAvg.y * nNext.y); + let miterScale = 1 / Math.max(denom, 1e-4); + + miterScale = Math.min(miterScale, MITER_LIMIT); + + return { x: nAvg.x * miterScale, y: nAvg.y * miterScale }; + } + + // вершины + UV + for (let i = 0; i < n; i++) + { + const p = curvePoints[i]; + const normal = computeNormal(i); + + vertices.push(p.x - (normal.x * halfThickness), p.y - (normal.y * halfThickness)); + vertices.push(p.x + (normal.x * halfThickness), p.y + (normal.y * halfThickness)); + + const u = totalLength > 0 ? lengths[i] / totalLength : 0; + + uvs.push(u, 0); + uvs.push(u, 1); + } + + // индексы (два треугольника на сегмент) + for (let i = 0; i < n - 1; i++) + { + const idx = i * 2; + + indices.push(idx, idx + 1, idx + 2); + indices.push(idx + 1, idx + 3, idx + 2); + } + + const geometry = new Geometry() + .addAttribute('aVertexPosition', vertices, 2) + .addAttribute('aTextureCoord', uvs, 2) + .addIndex(indices); + + return new Mesh(geometry, new ScrollingMeshMaterial(texture)); + } + + public update(dt: number) + { + this.time += dt * 0.001; + if (this.state === 'stopped') + { + this.visible = false; + + return; + } + + if (this.state === 'animating') + { + this.visible = true; + const material = this.mesh.material as ScrollingMeshMaterial; + + material.uniforms.uTextureOffset = 1 - (2 * this.time / this.duration); + if (material.uniforms.uTextureOffset <= -1) + { + material.uniforms.uTextureOffset = 1; + this.state = 'stopped'; + } + } + } + + public play() + { + this.state = 'animating'; + this.time = 0; + const material = this.mesh.material as ScrollingMeshMaterial; + + material.uniforms.uTextureOffset = 1; + } +} + +/* ---------- utils ---------- */ + +function normalizeVector(x: number, y: number): [number, number] +{ + const length = Math.hypot(x, y); + + return length === 0 ? [0, 0] : [x / length, y / length]; +} + +function clamp(v: number, a: number, b: number) +{ + return Math.max(a, Math.min(b, v)); +} + +function cross2(a: Point, b: Point, c: Point) +{ + // cross( (A-C), (B-C) ) + return ((a.x - c.x) * (b.y - c.y)) - ((a.y - c.y) * (b.x - c.x)); +} + +/** + * Удаляет дубликаты / почти-нулевые сегменты и промежуточные строго коллинеарные точки + * @param points + * @param eps + */ +function dedupeAndColinearCull(points: Point[], eps = 1e-4): Point[] +{ + if (points.length <= 1) return [...points]; + + const out: Point[] = []; + + for (const p of points) + { + const last = out[out.length - 1]; + + if (!last || Math.hypot(p.x - last.x, p.y - last.y) > eps) out.push(p); + } + + if (out.length < 3) return out; + + const pruned: Point[] = [out[0]]; + + for (let i = 1; i < out.length - 1; i++) + { + const a = out[i - 1]; + const b = out[i]; + const c = out[i + 1]; + const abx = b.x - a.x; + const aby = b.y - a.y; + const bcx = c.x - b.x; + const bcy = c.y - b.y; + const cross = (abx * bcy) - (aby * bcx); + + if (Math.abs(cross) > eps) pruned.push(b); + } + pruned.push(out[out.length - 1]); + + return pruned; +} diff --git a/src/entities/Winline.ts b/src/entities/Winline.ts new file mode 100644 index 0000000..dc43d0c --- /dev/null +++ b/src/entities/Winline.ts @@ -0,0 +1,98 @@ +import { Assets, Container } from 'pixi.js'; +import { IBone, Spine } from 'pixi-spine'; +import { Updatable } from '../types/Entity'; +import { ITrackEntry } from '../types/ITrackEntry'; + +interface IBoneExtended extends IBone +{ + x: number; + y: number; +} + +/** + * @class WinLine + * @extends Container + * @implements Updatable + * @description + * The `WinLine` class represents a visual line in a slot machine game that can be animated to show winning lines. + * It extends the `Container` class and implements the `Updatable` interface. + * The class uses Spine animations to display the win line and provides methods to set the line's position, + * update the animation state, and trigger idle and win animations. + */ +export default class WinLine extends Container implements Updatable +{ + spine: Spine; + slotSize: { x: number, y: number }; + + constructor() + { + super(); + this.spine = new Spine(Assets.get('win_line').spineData); + this.spine.autoUpdate = false; + this.spine.state.timeScale = 1; + this.spine.alpha = 0.8; + this.idle(); + this.addChild(this.spine); + + this.spine.state.addListener({ + event: (_, event) => + { + if (event.data.name === 'end') + { + this.idle(); + } + } + }); + + this.zIndex = 10100; + this.slotSize = { x: 200, y: 200 }; + this.scale.set(0.52); + this.position.set(0, this.slotSize.y * 0.5 * this.scale.y); + } + + /** + * Sets the positions of the control bones based on the provided line map. + * @param lineMap - An array of numbers representing the slot indices for each reel. + * @returns void + */ + set(lineMap: number[]): void + { + (this.spine.skeleton.findBone('control_0') as IBoneExtended).y = -lineMap[0] * this.slotSize.y; + (this.spine.skeleton.findBone('control_6') as IBoneExtended).y = -lineMap[lineMap.length - 1] * this.slotSize.y; + lineMap.forEach((slotIndex: number, reelIndex: number) => + { + const control = this.spine.skeleton.findBone(`control_${reelIndex + 1}`) as IBoneExtended; + + if (!control) return; + control.y = -slotIndex * this.slotSize.y; + }); + } + + /** + * Updates the spine animation with the given delta time. + * @param dt - The delta time in milliseconds. + * @returns void + */ + update(dt: number): void + { + this.spine.update(dt * 0.001); + } + + /** + * Sets the animation to 'idle' on the spine state. + * @returns {ITrackEntry} The track entry of the animation. + */ + idle(): ITrackEntry + { + return this.spine.state.setAnimation(0, 'idle', false); + } + + /** + * Triggers the 'win' animation on the spine state. + * @returns {ITrackEntry} The track entry of the animation. + */ + win(): ITrackEntry + { + return this.spine.state.setAnimation(0, 'win', false); + } +} diff --git a/src/events/Events.ts b/src/events/Events.ts new file mode 100644 index 0000000..8d886f0 --- /dev/null +++ b/src/events/Events.ts @@ -0,0 +1,92 @@ +/** + * @class Events + * @description A basic event handling system that supports adding events, listeners, and emitting events. + */ +export default class Events +{ + /** Stores events and associated data. */ + private _events: Record>; + + /** Stores listeners for specific events. */ + private _listeners: Record void; context: any }>>; + + /** Initializes an empty events storage and listeners storage. */ + constructor() + { + this._events = {}; + this._listeners = {}; + } + + /** + * Adds an event with associated data to be emitted later. + * @param event + * @param data + */ + addEvent(event: string, data?: any): void + { + if (!this._events[event]) + { + this._events[event] = []; + } + this._events[event].push(data); + } + + /** + * Registers a listener for a specific event. + * @param event + * @param fn + * @param context + */ + addListener(event: string, fn: (data?: any) => void, context: any): void + { + if (!this._listeners[event]) + { + this._listeners[event] = []; + } + this._listeners[event].push({ event, fn, context }); + } + + /** + * Removes a specific listener for an event. + * @param event + * @param fn + * @param context + */ + removeEventListener(event: string, fn: (data?: any) => void, context: any): void + { + if (!this._listeners[event]) return; + this._listeners[event] = this._listeners[event].filter( + (listener) => listener.fn !== fn || listener.context !== context + ); + } + + /** Clears all stored events. */ + clearEvents(): void + { + this._events = {}; + } + + /** + * Emits all stored events, invoking associated listeners with the event data. + * The listeners for each event receive each piece of data associated with that event. + */ + emitEvents(): void + { + for (const eventName in this._events) + { + const dataObjects = this._events[eventName]; + const listeners = this._listeners[eventName]; + + if (!listeners) continue; + + dataObjects.forEach((data) => + { + listeners.forEach((listener) => + { + listener.fn.call(listener.context, data); + }); + }); + delete this._events[eventName]; + } + } +} diff --git a/src/index.ts b/src/index.ts new file mode 100644 index 0000000..e086f62 --- /dev/null +++ b/src/index.ts @@ -0,0 +1,153 @@ +export { default as AnticipationFrame } from './entities/AnticipationFrame'; +export * from './entities/AnticipationFrame'; +export { default as CascadeSymbol } from './entities/CascadeSymbol'; +export * from './entities/CascadeSymbol'; +export { default as ExpandedSymbol } from './entities/ExpandedSymbol'; +export * from './entities/ExpandedSymbol'; +export { default as ReelSymbol } from './entities/ReelSymbol'; +export * from './entities/ReelSymbol'; +export { default as StaticSymbol } from './entities/StaticSymbol'; +export * from './entities/StaticSymbol'; +export { default as SlotMultiplierEntity } from './entities/SlotMultiplierEntity'; +export * from './entities/SlotMultiplierEntity'; +export { default as Symbol } from './entities/Symbol'; +export * from './entities/Symbol'; +export { default as ValuableExpandedSymbol } from './entities/ValuableExpandedSymbol'; +export * from './entities/ValuableExpandedSymbol'; +export { default as ValuableReelSymbol } from './entities/ValuableReelSymbol'; +export * from './entities/ValuableReelSymbol'; +export { default as Winline } from './entities/Winline'; +export * from './entities/Winline'; +export { default as Events } from './events/Events'; +export * from './events/Events'; +export { default as BaseMachine } from './slotMachines/BaseMachine'; +export * from './slotMachines/BaseMachine'; +export { default as CascadeMachine } from './slotMachines/CascadeMachine'; +export * from './slotMachines/CascadeMachine'; +export { default as ReelsMachine } from './slotMachines/ReelsMachine'; +export * from './slotMachines/ReelsMachine'; +export { default as StaticReelsMachine } from './slotMachines/StaticReelsMachine'; +export * from './slotMachines/StaticReelsMachine'; +export { default as HoldAndWinMachine } from './slotMachines/HoldAndWinMachine'; +export * from './slotMachines/HoldAndWinMachine'; +export { default as SpeedModes } from './speedModes/SpeedModes'; +export { default as BasicStateMachine } from './states/BasicStateMachine'; +export * from './states/BasicStateMachine'; +export { default as AnticipationAnimationsSystem } from './systems/AnticipationAnimationsSystem'; +export * from './systems/AnticipationAnimationsSystem'; +export { default as AnticipationSymbolsSystem } from './systems/AnticipationSymbolsSystem'; +export * from './systems/AnticipationSymbolsSystem'; +export { default as AnticipationSystem } from './systems/AnticipationSystem'; +export * from './systems/AnticipationSystem'; +export { default as AnticipationTintingSystem } from './systems/AnticipationTintingSystem'; +export * from './systems/AnticipationTintingSystem'; +export { default as BaseSystem } from './systems/BaseSystem'; +export * from './systems/BaseSystem'; +export { default as CascadeRefillSystems } from './systems/CascadeRefillSystems'; +export * from './systems/CascadeRefillSystems'; +export { default as CascadeSpinSystem } from './systems/CascadeSpinSystem'; +export * from './systems/CascadeSpinSystem'; +export { default as AnimatedExpandedSymbolsSystem } from './systems/AnimatedExpandedSymbolsSystem'; +export * from './systems/AnimatedExpandedSymbolsSystem'; +export { default as SpinningExpandedSymbolsSystem } from './systems/SpinningExpandedSymbolsSystem'; +export * from './systems/SpinningExpandedSymbolsSystem'; +export { default as InitSpinningExpandedSymbolsSystem } from './systems/InitSpinningExpandedSymbolsSystem'; +export * from './systems/InitSpinningExpandedSymbolsSystem'; +export { default as GridSystem } from './systems/GridSystem'; +export * from './systems/GridSystem'; +export { default as HighlightLandedSymbolSystem } from './systems/HighlightLandedSymbolSystem'; +export * from './systems/HighlightLandedSymbolSystem'; +export { default as IdleSystem } from './systems/IdleSystem'; +export * from './systems/IdleSystem'; +export { default as InitSystem } from './systems/InitSystem'; +export * from './systems/InitSystem'; +export { default as InteractiveGridSystem } from './systems/InteractiveGridSystem'; +export * from './systems/InteractiveGridSystem'; +export { default as BlurSymbolsSystem } from './systems/BlurSymbolsSystem'; +export * from './systems/BlurSymbolsSystem'; +export { default as LayeringSystem } from './systems/LayeringSystem'; +export * from './systems/LayeringSystem'; +export { default as Acceleration } from './systems/reels/Acceleration'; +export * from './systems/reels/Acceleration'; +export { default as Bouncing } from './systems/reels/Bouncing'; +export * from './systems/reels/Bouncing'; +export { default as Deceleration } from './systems/reels/Deceleration'; +export * from './systems/reels/Deceleration'; +export { default as Reel } from './systems/reels/Reel'; +export * from './systems/reels/Reel'; +export { default as Spinning } from './systems/reels/Spinning'; +export * from './systems/reels/Spinning'; +export * from './systems/reels/states'; +export { default as Stopped } from './systems/reels/Stopped'; +export * from './systems/reels/Stopped'; +export { default as ReelsSpinSystem } from './systems/ReelsSpinSystem'; +export * from './systems/ReelsSpinSystem'; +export { default as StaticReelsSpinSystem } from './systems/StaticReelsSpinSystem'; +export * from './systems/StaticReelsSpinSystem'; +export { default as SingleSlotReelsSpinSystem } from './systems/SingleSlotReelsSpinSystem'; +export * from './systems/SingleSlotReelsSpinSystem'; +export { default as SingleSlotReelsSystem } from './systems/SingleSlotReelsSpinSystem'; +export { default as SingleSlotReel } from './systems/reels/SingleSlotReel'; +export * from './systems/reels/SingleSlotReel'; +export { default as StickySymbolsSystem } from './systems/StickySymbolsSystem'; +export * from './systems/StickySymbolsSystem'; +export { default as SlotMultipliersSystem } from './systems/SlotMultipliersSystem'; +export * from './systems/SlotMultipliersSystem'; +export { default as TintingSymbolsSystem } from './systems/TintingSymbolsSystem'; +export * from './systems/TintingSymbolsSystem'; +export { default as WinningSymbolAnimationsSystem } from './systems/WinningSymbolAnimationsSystem'; +export * from './systems/WinningSymbolAnimationsSystem'; +export { default as WinningSymbolTintingSystem } from './systems/WinningSymbolTintingSystem'; +export * from './systems/WinningSymbolTintingSystem'; +export * from './types/Entity'; +export * from './types/ITrackEntry'; +export * from './types/ScreenInputMap'; +export * from './types/SlotMachineConfig'; +export * from './utils/easing/easeInOutBack'; +export * from './utils/getUniqueId'; +export { default as GridUtils } from './utils/GridUtils'; +export * from './utils/GridUtils'; +export { default as AnimationProgressHook } from './utils/hooks/AnimationProgressHook'; +export * from './utils/hooks/AnimationProgressHook'; +export { default as DelayHook } from './utils/hooks/DelayHook'; +export * from './utils/hooks/DelayHook'; +export { default as GravityHook } from './utils/hooks/GravityHook'; +export * from './utils/hooks/GravityHook'; +export { default as Hook } from './utils/hooks/Hook'; +export * from './utils/hooks/Hook'; +export { default as HooksChain } from './utils/hooks/HooksChain'; +export * from './utils/hooks/HooksChain'; +export { default as ImmediateHook } from './utils/hooks/ImmediateHook'; +export * from './utils/hooks/ImmediateHook'; +export { default as Pool } from './utils/Pool'; +export * from './utils/Pool'; +export { default as AllWinSymbolSystem } from './systems/AllWinningSymbolSystem'; +export * from './systems/AllWinningSymbolSystem'; +export { default as ResetTintSystem } from './systems/ResetTintSystem'; +export * from './systems/ResetTintSystem'; +export { default as ResetWinningSymbolsSystem } from './systems/ResetWinningSymbolsSystem'; +export * from './systems/ResetWinningSymbolsSystem'; +export { default as SetAllWinLinesSystem } from './systems/SetAllWinLinesSystem'; +export * from './systems/SetAllWinLinesSystem'; +export { default as SetCurrentWinLinesSystem } from './systems/SetCurrentWinLinesSystem'; +export * from './systems/SetCurrentWinLinesSystem'; +export { default as SetWinningLineSymbolsSystem } from './systems/SetWinningLineSymbolsSystem'; +export * from './systems/SetWinningLineSymbolsSystem'; +export { default as WinLinesAnimationsSystem } from './systems/WinLinesAnimationsSystem'; +export * from './systems/WinLinesAnimationsSystem'; +export { default as WinningLinesIncrementSystem } from './systems/WinningLinesIncrementSystem'; +export * from './systems/WinningLinesIncrementSystem'; +export { default as WinningLinesResetIncrementSystem } from './systems/WinningLinesResetIncrementSystem'; +export * from './systems/WinningLinesResetIncrementSystem'; +export { default as DisplayTotalLinesWinSystem } from './systems/DisplayTotalLinesWinSystem'; +export * from './systems/DisplayTotalLinesWinSystem'; +export { default as DisplayLineWinValueSystem } from './systems/DisplayLineWinValueSystem'; +export * from './systems/DisplayLineWinValueSystem'; +export { default as BlockExitStateSystem } from './systems/BlockExitStateSystem'; +export * from './systems/BlockExitStateSystem'; +export { default as WebGLWinLine } from './entities/WebGLWinLine'; +export * from './entities/WebGLWinLine'; +export { default as WinningExpandedSymbolsAnimationSystem } from './systems/WinningExpandedSymbolsAnimationSystem'; +export * from './systems/WinningExpandedSymbolsAnimationSystem'; +export { default as MockSystem } from './systems/MockSystem'; +export * from './systems/MockSystem'; diff --git a/src/slotMachines/BaseMachine.ts b/src/slotMachines/BaseMachine.ts new file mode 100644 index 0000000..71590ff --- /dev/null +++ b/src/slotMachines/BaseMachine.ts @@ -0,0 +1,192 @@ +import { Container, DisplayObject } from 'pixi.js'; +import Events from '../events/Events'; +import SpeedModes from '../speedModes/SpeedModes'; +import { Updatable } from '../types/Entity'; +import { SlotMachineConfig } from '../types/SlotMachineConfig'; +import GridUtils from '../utils/GridUtils'; + +/** + * @interface MachineInputs + * @description Interface for machine inputs. + */ +interface MachineInputs +{ + [key: string]: any; +} + +/** + * @interface MachineFlags + * @description Interface for machine flags. + */ +interface MachineFlags +{ + [key: string]: boolean; +} + +/** + * @interface MachineMaps + * @description Interface for machine maps. + */ +interface MachineMaps +{ + [key: string]: any; +} + +/** + * @interface MachineUtils + * @description Interface for machine utility objects. + */ +interface MachineUtils +{ + [key: string]: any; +} + +/** + * @class BaseMachine + * @extends Container + * @description A base class for creating a stateful machine with various customizable properties and systems. + */ +export default abstract class BaseMachine extends Container +{ + public config: SlotMachineConfig; + public timeScale: number; + public events!: Events; + public inputs: MachineInputs; + public flags: MachineFlags; + public maps: MachineMaps; + public utils: MachineUtils; + public systems: Record; + public sharedSystemData: Record; + public speedModes: SpeedModes; + + /** + * @class + * @param {SlotMachineConfig} config - Configuration object for the BaseMachine instance. + */ + protected constructor(config: SlotMachineConfig) + { + super(); + this.config = config; + this.sortableChildren = true; + this.timeScale = 1; + + this.inputs = {}; + this.flags = {}; + this.maps = {}; + this.utils = { + grid: new GridUtils(this.config), + }; + this.systems = {}; + } + + /** + * Core initialization method to set up various components. + * Subclasses should override create methods if customization is needed. + */ + protected initialize(): void + { + this.createSharedData(); + this.createEvents(); + this.createInputs(); + this.createFlags(); + this.createMaps(); + this.createUtils(); + this.createSystems(); + this.createStateMachine(); + this.createSpeedModes(); + } + + protected createEvents(): void + { + this.events = new Events(); + } + + protected createInputs(): void + { + this.inputs = {}; + } + + protected createFlags(): void + { + this.flags = {}; + } + + protected createMaps(): void + { + this.maps = {}; + } + + protected createUtils(): void + { + this.utils = { + grid: new GridUtils(this.config), + }; + } + + protected createSystems(): void + { + this.systems = {}; + } + + protected createSharedData(): void + { + this.sharedSystemData = {}; + } + + /** + Initializes the state machine (to be implemented by subclass). + * @throws {Error} Must be implemented in subclass. + */ + protected abstract createStateMachine(): void; + + /** + Initializes different speed modes (to be implemented by subclass). + * @throws {Error} Must be implemented in subclass. + */ + protected createSpeedModes(): void + { + this.speedModes = new SpeedModes(this); + } + + /** + * Creates a symbol based on the provided key (to be implemented by subclass). + * @param {string} key - The unique identifier for the symbol. + * @throws {Error} Must be implemented in subclass. + */ + public abstract createSymbol(key: string): any; + + /** + * Updates the machine and its child entities based on a time delta. + * @param {number} dt - The delta time for the update cycle. + */ + public update(dt: number): void + { + this.speedModes.handleInput(this.inputs); + this._updateEntities(dt); + } + + /** + * @private + * @param {number} dt - The delta time to pass to each child entity's update. + */ + private _updateEntities(dt: number): void + { + this.children.forEach((child) => + { + if ((child as DisplayObject & Updatable).update) + { + (child as DisplayObject & Updatable).update(dt); + } + }); + } + + /** + * Clears the specified map by setting all elements to null. + * @param {string} mapName - The name of the map to clear. + */ + public nullMap(mapName: string): void + { + if (!this.maps[mapName]) return; + this.maps[mapName].fill(null); + } +} diff --git a/src/slotMachines/CascadeMachine.ts b/src/slotMachines/CascadeMachine.ts new file mode 100644 index 0000000..f209f3d --- /dev/null +++ b/src/slotMachines/CascadeMachine.ts @@ -0,0 +1,121 @@ +import CascadeSymbol from '../entities/CascadeSymbol'; +import BasicStateMachine from '../states/BasicStateMachine'; +import CascadeSpinSystem from '../systems/CascadeSpinSystem'; +import GridSystem from '../systems/GridSystem'; +import IdleSystem from '../systems/IdleSystem'; +import InitSystem from '../systems/InitSystem'; +import InteractiveGridSystem from '../systems/InteractiveGridSystem'; +import LayeringSystem from '../systems/LayeringSystem'; +import GridUtils from '../utils/GridUtils'; +import BaseMachine from './BaseMachine'; + +/** + * @class CascadeMachine + * @extends BaseMachine + * @description The main class for managing slot machine reels. Initializes and maintains state, systems, + * and utilities to control the reel behavior, from initialization to spinning and stopping. + */ +export default class CascadeMachine extends BaseMachine +{ + public stateMachine: BasicStateMachine; + + /** + * Initializes the reel machine with configuration settings. + * Sets up inputs, flags, maps, utilities, systems, and the state machine. + * @param {object} config - Configuration settings for the machine. + */ + constructor(config: any) + { + super(config); + this.initialize(); + this.stateMachine.init(); + } + + /** + * Initializes the inputs required for the reel machine. + * `initMap` is used for initial symbol mapping, `spin` for triggering spins, + * and `screenMap` for tracking symbol positions on the screen. + */ + protected override createInputs(): void + { + this.inputs = { + initMap: null, + spin: false, + screenMap: null, + turbo: false, + fastStop: false, + turboForced: false + }; + } + + /** Sets up flags to track the machine's state, such as whether initialization has completed. */ + protected override createFlags(): void + { + this.flags = { + init: false, + isSpinning: false + }; + } + + /** Sets up maps used by the machine, including `symbols`, which holds the names of the symbols on reels. */ + protected override createMaps(): void + { + this.maps = { + symbols: [], + stickySymbols: [] + }; + } + + /** Sets up utilities for the machine, such as grid utilities used for positioning symbols. */ + protected override createUtils(): void + { + this.utils = { + grid: new GridUtils(this.config), + }; + } + + /** + * Initializes and registers systems for the reel machine, including initialization, + * idle, grid, and spin systems, which manage various aspects of the reel behavior. + */ + protected override createSystems(): void + { + this.systems = { + init: new InitSystem(this), + idle: new IdleSystem(this), + grid: new GridSystem(this), + spin: new CascadeSpinSystem(this), + layering: new LayeringSystem(this), + interactive: new InteractiveGridSystem(this), + }; + } + + /** Initializes the state machine for managing reel states and transitions. */ + protected createStateMachine(): void + { + this.stateMachine = new BasicStateMachine(this); + } + + /** + * Updates the reel machine and its state based on the delta time. + * Processes inputs, updates the state machine, and triggers system updates. + * @param {number} dt - Time delta in milliseconds since the last update. + */ + override update(dt: number): void + { + this.stateMachine.handleInput(this); + this.stateMachine.update(dt); + super.update(dt); + } + + /** + * Creates and returns a new Symbol instance based on the provided key. + * The symbol is retrieved from the machine's configuration. + * @param {string} key - The unique key for the symbol configuration. + * @returns {symbol} The newly created Symbol instance. + */ + createSymbol(key: string): CascadeSymbol + { + return new CascadeSymbol(this.config.symbols[key]); + } +} diff --git a/src/slotMachines/HoldAndWinMachine.ts b/src/slotMachines/HoldAndWinMachine.ts new file mode 100644 index 0000000..f9033de --- /dev/null +++ b/src/slotMachines/HoldAndWinMachine.ts @@ -0,0 +1,91 @@ +import ValuableReelSymbol from '../entities/ValuableReelSymbol'; +import BasicStateMachine from '../states/BasicStateMachine'; +import GridSystem from '../systems/GridSystem'; +import IdleSystem from '../systems/IdleSystem'; +import InitSystem from '../systems/InitSystem'; +import InteractiveGridSystem from '../systems/InteractiveGridSystem'; +import LayeringSystem from '../systems/LayeringSystem'; +import GridUtils from '../utils/GridUtils'; +import BaseMachine from './BaseMachine'; +import SingleSlotReelsSpinSystem from '../systems/SingleSlotReelsSpinSystem'; + +/** + * @class HoldAndWinMachine + * @extends BaseMachine + * @description Minimal Hold & Win machine scaffold extending BaseMachine. + */ +export default class HoldAndWinMachine extends BaseMachine { + public stateMachine: BasicStateMachine; + + constructor(config: any) { + super(config); + this.initialize(); + this.stateMachine.init(); + } + + protected override createInputs(): void { + this.inputs = { + initMap: null, + spin: false, + screenMap: null, + turbo: false, + fastStop: false, + turboForced: false, + }; + } + + protected override createFlags(): void { + this.flags = { + init: false, + isSpinning: false, + }; + } + + protected override createSharedData(): void { + this.sharedSystemData = { + spinSystemState: 'stopped', + currentStoppingReel: 0, + }; + } + + protected override createMaps(): void { + this.maps = { + symbols: [], + stickySymbols: [], + preventReelStop: [], + preventReelsSpin: [], + slotMultipliers: [], + }; + } + + protected override createUtils(): void { + this.utils = { + grid: new GridUtils(this.config), + }; + } + + protected override createSystems(): void { + this.systems = { + init: new InitSystem(this), + idle: new IdleSystem(this), + grid: new GridSystem(this), + spin: new SingleSlotReelsSpinSystem(this), + layering: new LayeringSystem(this), + interactive: new InteractiveGridSystem(this), + }; + } + + protected createStateMachine(): void { + this.stateMachine = new BasicStateMachine(this); + } + + override update(dt: number): void { + this.stateMachine.handleInput(this); + this.stateMachine.update(dt); + super.update(dt); + } + + createSymbol(key: string): ValuableReelSymbol { + return new ValuableReelSymbol(this.config.symbols[key]); + } +} diff --git a/src/slotMachines/ReelsMachine.ts b/src/slotMachines/ReelsMachine.ts new file mode 100644 index 0000000..411985a --- /dev/null +++ b/src/slotMachines/ReelsMachine.ts @@ -0,0 +1,182 @@ +import AllWinningSymbolSystem from '../systems/AllWinningSymbolSystem'; +import ValuableReelSymbol from '../entities/ValuableReelSymbol'; +import ClassicReelsStateMachine from '../states/ClassicReelsStateMachine'; +import CelebrateSystem from '../systems/CelebrateSystem'; +import GridSystem from '../systems/GridSystem'; +import IdleSystem from '../systems/IdleSystem'; +import InitSystem from '../systems/InitSystem'; +import InteractiveGridSystem from '../systems/InteractiveGridSystem'; +import LayeringSystem from '../systems/LayeringSystem'; +import ReelsSpinSystem from '../systems/ReelsSpinSystem'; +import ResetTintSystem from '../systems/ResetTintSystem'; +import ResetWinningSymbolsSystem from '../systems/ResetWinningSymbolsSystem'; +import SetAllWinLinesSystem from '../systems/SetAllWinLinesSystem'; +import SetCurrentWinLinesSystem from '../systems/SetCurrentWinLinesSystem'; +import SetWinningLineSymbolsSystem from '../systems/SetWinningLineSymbolsSystem'; +import TintingSymbolsSystem from '../systems/TintingSymbolsSystem'; +import WinLinesAnimationsSystem from '../systems/WinLinesAnimationsSystem'; +import WinningLinesIncrementSystem from '../systems/WinningLinesIncrementSystem'; +import WinningLinesResetIncrementSystem from '../systems/WinningLinesResetIncrementSystem'; +import WinningSymbolAnimationsSystem from '../systems/WinningSymbolAnimationsSystem'; +import WinningSymbolTintingSystem from '../systems/WinningSymbolTintingSystem'; +import GridUtils from '../utils/GridUtils'; +import BaseMachine from './BaseMachine'; +import DisplayTotalLinesWinSystem from "../systems/DisplayTotalLinesWinSystem"; +import DisplayLineWinValueSystem from "../systems/DisplayLineWinValueSystem"; +import BlockExitStateSystem from "../systems/BlockExitStateSystem"; +import MaskingSystem from '../systems/MaskingSystem'; +import BlurSymbolsSystem from '../systems/BlurSymbolsSystem'; + +/** + * @class ReelsMachine + * @extends BaseMachine + * @description The main class for managing slot machine reels. Initializes and maintains state, systems, + * and utilities to control the reel behavior, from initialization to spinning and stopping. + */ +export default class ReelsMachine extends BaseMachine +{ + public stateMachine: ClassicReelsStateMachine; + + /** + * Initializes the reel machine with configuration settings. + * Sets up inputs, flags, maps, utilities, systems, and the state machine. + * @param {object} config - Configuration settings for the machine. + */ + constructor(config: any) + { + super(config); + this.initialize(); + this.stateMachine.init(); + } + + /** + * Initializes the inputs required for the reel machine. + * `initMap` is used for initial symbol mapping, `spin` for triggering spins, + * and `screenMap` for tracking symbol positions on the screen. + */ + protected override createInputs(): void + { + this.inputs = { + initMap: null, + spin: false, + screenMap: null, + turbo: false, + fastStop: false, + turboForced: false, + wins: null, + blockExitState: false, + }; + } + + /** Sets up flags to track the machine's state, such as whether initialization has completed. */ + protected override createFlags(): void + { + this.flags = { + init: false, + isSpinning: false, + }; + } + + protected override createSharedData(): void + { + this.sharedSystemData = { + spinSystemState: 'stopped', + currentStoppingReel: 0, + reelsStates: [], + currentWinIndex: 0, + animateLines: [], + anticipatingSymbolsTests: [], + }; + } + + /** Sets up maps used by the machine, including `symbols`, which holds the names of the symbols on reels. */ + protected override createMaps(): void + { + this.maps = { + symbols: [], + stickySymbols: [], + preventReelStop: [], + preventReelsSpin: [], + anticipatingReels: [], + winningSymbols: [], + tinting: [] + }; + } + + /** Sets up utilities for the machine, such as grid utilities used for positioning symbols. */ + protected override createUtils(): void + { + this.utils = { + grid: new GridUtils(this.config), + }; + } + + /** + * Initializes and registers systems for the reel machine, including initialization, + * idle, grid, and spin systems, which manage various aspects of the reel behavior. + */ + protected override createSystems(): void + { + this.systems = { + init: new InitSystem(this), + idle: new IdleSystem(this), + grid: new GridSystem(this), + spin: new ReelsSpinSystem(this), + layering: new LayeringSystem(this), + resetWinningSymbols: new ResetWinningSymbolsSystem(this), + allWinSymbols: new AllWinningSymbolSystem(this), + allWinLinesSet: new SetAllWinLinesSystem(this), + winLinesResetIncrement: new WinningLinesResetIncrementSystem(this), + winLinesIncrementing: new WinningLinesIncrementSystem(this), + setWinLineSymbols: new SetWinningLineSymbolsSystem(this), + setWinLine: new SetCurrentWinLinesSystem(this), + winLinesAnimations: new WinLinesAnimationsSystem(this), + celebrateSymbols: new CelebrateSystem(this), + winningSymbolsAnim: new WinningSymbolAnimationsSystem(this), + tintWinningSymbolsAnim: new WinningSymbolTintingSystem(this), + tinting: new TintingSymbolsSystem(this), + resetTinting: new ResetTintSystem(this), + displayTotalLinesWin: new DisplayTotalLinesWinSystem(this), + displayLineWin: new DisplayLineWinValueSystem(this), + interactive: new InteractiveGridSystem(this), + blockExitState: new BlockExitStateSystem(this), + masking: new MaskingSystem(this), + blurSymbols: new BlurSymbolsSystem(this), + }; + } + + /** Initializes the state machine for managing reel states and transitions. */ + protected createStateMachine(): void + { + this.stateMachine = new ClassicReelsStateMachine(this); + } + + /** + * Updates the reel machine and its state based on the delta time. + * Processes inputs, updates the state machine, and triggers system updates. + * @param {number} dt - Time delta in milliseconds since the last update. + */ + override update(dt: number): void + { + this.stateMachine.handleInput(this); + this.stateMachine.update(dt); + super.update(dt); + } + + /** + * Creates and returns a new Symbol instance based on the provided key. + * The symbol is retrieved from the machine's configuration. + * @param {string} key - The unique key for the symbol configuration. + * @returns {symbol} The newly created Symbol instance. + */ + createSymbol(key: string): ValuableReelSymbol + { + return new ValuableReelSymbol(this.config.symbols[key]); + } + + override destroy() { + Object.values(this.systems).forEach((system) => { + system.destroy() + }) + } +} diff --git a/src/slotMachines/StaticReelsMachine.ts b/src/slotMachines/StaticReelsMachine.ts new file mode 100644 index 0000000..54fdf96 --- /dev/null +++ b/src/slotMachines/StaticReelsMachine.ts @@ -0,0 +1,121 @@ +import StaticSymbol from '../entities/StaticSymbol'; +import BasicStateMachine from '../states/BasicStateMachine'; +import GridSystem from '../systems/GridSystem'; +import IdleSystem from '../systems/IdleSystem'; +import InitSystem from '../systems/InitSystem'; +import InteractiveGridSystem from '../systems/InteractiveGridSystem'; +import LayeringSystem from '../systems/LayeringSystem'; +import StaticReelsSpinSystem from '../systems/StaticReelsSpinSystem'; +import GridUtils from '../utils/GridUtils'; +import BaseMachine from './BaseMachine'; + +/** + * @class StaticReelsMachine + * @extends BaseMachine + * @description The main class for managing slot machine reels. Initializes and maintains state, systems, + * and utilities to control the reel behavior, from initialization to spinning and stopping. + */ +export default class StaticReelsMachine extends BaseMachine +{ + public stateMachine: BasicStateMachine; + + /** + * Initializes the reel machine with configuration settings. + * Sets up inputs, flags, maps, utilities, systems, and the state machine. + * @param {object} config - Configuration settings for the machine. + */ + constructor(config: any) + { + super(config); + this.initialize(); + this.stateMachine.init(); + } + + /** + * Initializes the inputs required for the reel machine. + * `initMap` is used for initial symbol mapping, `spin` for triggering spins, + * and `screenMap` for tracking symbol positions on the screen. + */ + protected override createInputs(): void + { + this.inputs = { + initMap: null, + spin: false, + screenMap: null, + turbo: false, + fastStop: false, + turboForced: false + }; + } + + /** Sets up flags to track the machine's state, such as whether initialization has completed. */ + protected override createFlags(): void + { + this.flags = { + init: false, + isSpinning: false + }; + } + + /** Sets up maps used by the machine, including `symbols`, which holds the names of the symbols on reels. */ + protected override createMaps(): void + { + this.maps = { + symbols: [], + stickySymbols: [] + }; + } + + /** Sets up utilities for the machine, such as grid utilities used for positioning symbols. */ + protected override createUtils(): void + { + this.utils = { + grid: new GridUtils(this.config), + }; + } + + /** + * Initializes and registers systems for the reel machine, including initialization, + * idle, grid, and spin systems, which manage various aspects of the reel behavior. + */ + protected override createSystems(): void + { + this.systems = { + init: new InitSystem(this), + idle: new IdleSystem(this), + grid: new GridSystem(this), + spin: new StaticReelsSpinSystem(this), + layering: new LayeringSystem(this), + interactive: new InteractiveGridSystem(this), + }; + } + + /** Initializes the state machine for managing reel states and transitions. */ + protected createStateMachine(): void + { + this.stateMachine = new BasicStateMachine(this); + } + + /** + * Updates the reel machine and its state based on the delta time. + * Processes inputs, updates the state machine, and triggers system updates. + * @param {number} dt - Time delta in milliseconds since the last update. + */ + override update(dt: number): void + { + this.stateMachine.handleInput(this); + this.stateMachine.update(dt); + super.update(dt); + } + + /** + * Creates and returns a new Symbol instance based on the provided key. + * The symbol is retrieved from the machine's configuration. + * @param {string} key - The unique key for the symbol configuration. + * @returns {symbol} The newly created Symbol instance. + */ + createSymbol(key: string): StaticSymbol + { + return new StaticSymbol(this.config.symbols[key]); + } +} diff --git a/src/speedModes/SpeedModes.ts b/src/speedModes/SpeedModes.ts new file mode 100644 index 0000000..788f5a0 --- /dev/null +++ b/src/speedModes/SpeedModes.ts @@ -0,0 +1,107 @@ +import BaseMachine from '../slotMachines/BaseMachine'; +import { State, StateMachine } from '@popiplay/state-machine'; + +const SPEED_MODES = { + NORMAL: 0, + TURBO: 1 +}; + +export type SpeedModesInput = { + turbo: boolean, + fastStop: boolean + turboForced: boolean; +}; + +export default class SpeedModes extends StateMachine +{ + constructor(slotMachine: BaseMachine) + { + super(slotMachine); + this.provideStates([ + new NormalMode(this), + new TurboMode(this), + ]); + this.checkDependencies(slotMachine); + this.setState(SPEED_MODES.NORMAL); + } + + applyNormalModeSettings() + { + // add settings logic in an extended class + } + + applyTurboModeSettings() + { + // add settings logic in an extended class + } + + private checkDependencies(slotMachine: BaseMachine): void + { + if (!slotMachine.inputs.hasOwnProperty('turbo')) + { + throw new Error('\'turbo\' property is required in the inputs'); + } + if (!slotMachine.inputs.hasOwnProperty('fastStop')) + { + throw new Error('\'fastStop\' property is required in the inputs'); + } + if (!slotMachine.inputs.hasOwnProperty('turboForced')) + { + throw new Error('\'fastStop\' property is required in the inputs'); + } + } +} + +class NormalMode extends State +{ + machine: SpeedModes; + constructor(machine: SpeedModes) + { + super('NormalSpeedMode'); + this.machine = machine; + } + + override enter() + { + this.machine.applyNormalModeSettings(); + } + + override handleInput(input: SpeedModesInput) + { + if (input.turbo) + { + this.machine.setState(SPEED_MODES.TURBO); + } + else if (input.fastStop) + { + this.machine.setState(SPEED_MODES.TURBO); + } + else if (input.turboForced) + { + this.machine.setState(SPEED_MODES.TURBO); + } + } +} + +class TurboMode extends State +{ + machine: SpeedModes; + constructor(machine: SpeedModes) + { + super('TurboSpeedMode'); + this.machine = machine; + } + + override enter() + { + this.machine.applyTurboModeSettings(); + } + + override handleInput(input: SpeedModesInput) + { + if (!input.turbo && !input.fastStop && !input.turboForced) + { + this.machine.setState(SPEED_MODES.NORMAL); + } + } +} diff --git a/src/states/BasicStateMachine.ts b/src/states/BasicStateMachine.ts new file mode 100644 index 0000000..6d3cfee --- /dev/null +++ b/src/states/BasicStateMachine.ts @@ -0,0 +1,140 @@ +import BaseMachine from '../slotMachines/BaseMachine'; +import { State, StateMachine } from '@popiplay/state-machine'; + +export enum STATES +{ + INIT, + IDLE, + SPINNING +} + +type BasicStateMachineStates = InitState | IdleState | SpinningState; + +export default class BasicStateMachine extends StateMachine +{ + constructor(target: BaseMachine) + { + super(target); + this.provideStates([ + new InitState(this), + new IdleState(this), + new SpinningState(this), + ]); + } + + override update(dt: number) + { + super.update(dt); + this.currentState.systems.forEach((systemId) => + { + this.target.systems[systemId].update(dt); + }); + } + + onEnter() + { + this.currentState.systems.forEach((systemId) => + { + this.target.systems[systemId].onEnter(); + }); + } + + onLeave() + { + this.currentState.systems.forEach((systemId) => + { + this.target.systems[systemId].onLeave(); + }); + } + + init() + { + this.setState(STATES.INIT); + } +} + +class InitState extends State +{ + private machine: BasicStateMachine; + public systems: string[]; + constructor(machine: BasicStateMachine) + { + super('InitState'); + this.machine = machine; + this.systems = ['init', 'grid']; + } + + override enter() + { + this.machine.onEnter(); + } + + override handleInput(input: any) + { + if (!input.flags.init) return; + this.machine.setState(STATES.IDLE); + } + + override leave() + { + this.machine.onLeave(); + } +} + +class IdleState extends State +{ + private machine: BasicStateMachine; + public systems: string[]; + constructor(machine: BasicStateMachine) + { + super('IdleState'); + this.machine = machine; + this.systems = ['grid', 'idle', 'layering', 'interactive']; + } + + override enter() + { + this.machine.onEnter(); + } + + override handleInput(target: BaseMachine) + { + if (target.inputs.spin === true) + { + this.machine.setState(STATES.SPINNING); + } + } + + override leave() + { + this.machine.onLeave(); + } +} + +class SpinningState extends State +{ + private machine: BasicStateMachine; + public systems: string[]; + constructor(machine: BasicStateMachine) + { + super('SpinningState'); + this.machine = machine; + this.systems = ['spin', 'layering']; + } + + override enter() + { + this.machine.onEnter(); + } + + override handleInput(target: BaseMachine) + { + if (!this.systems.every((key) => target.systems[key].state === 'stopped')) return; + this.machine.setState(STATES.IDLE); + } + + override leave() + { + this.machine.onLeave(); + } +} diff --git a/src/states/ClassicReelsStateMachine.ts b/src/states/ClassicReelsStateMachine.ts new file mode 100644 index 0000000..dfbcbea --- /dev/null +++ b/src/states/ClassicReelsStateMachine.ts @@ -0,0 +1,345 @@ +import BaseMachine from '../slotMachines/BaseMachine'; +import { State, StateMachine } from '@popiplay/state-machine'; + +export enum STATES +{ + INIT, + IDLE, + SPINNING, + ALL_WINNING_SYMBOLS, + CELEBRATE_SYMBOLS, + ENDING_ROUND, + WINNING_LINES_LOOP, +} + +type ClassicReelsStateMachineStates = InitState | IdleState | SpinningState | AllWinningSymbolsState | CelebrateSymbolsState | EndingRoundState | WinningLinesLoopState; + +export default class ClassicReelsStateMachine extends StateMachine +{ + constructor(target: BaseMachine) + { + super(target); + this.provideStates([ + new InitState(this), + new IdleState(this), + new SpinningState(this), + new AllWinningSymbolsState(this), + new CelebrateSymbolsState(this), + new EndingRoundState(this), + new WinningLinesLoopState(this), + ]); + } + + override update(dt: number) + { + super.update(dt); + this.currentState.systems.forEach((systemId) => + { + this.target.systems[systemId].update(dt); + }); + } + + onEnter() + { + console.log("Enter: ", this.currentState.name) + this.currentState.systems.forEach((systemId) => + { + this.target.systems[systemId].onEnter(); + }); + } + + onLeave() + { + this.currentState.systems.forEach((systemId) => + { + this.target.systems[systemId].onLeave(); + }); + } + + init() + { + this.setState(STATES.INIT); + } +} + +class InitState extends State +{ + private machine: ClassicReelsStateMachine; + public systems: string[]; + constructor(machine: ClassicReelsStateMachine) + { + super('InitState'); + this.machine = machine; + this.systems = ['init', 'grid', 'blurSymbols']; + } + + override enter() + { + this.machine.onEnter(); + } + + override handleInput(input: any) + { + if (!input.flags.init) return; + if (input.inputs.wins) + { + this.machine.setState(STATES.ALL_WINNING_SYMBOLS); + } + else if (input.inputs.celebrateSymbolIndexes?.length > 0) + { + this.machine.setState(STATES.CELEBRATE_SYMBOLS); + } + else + { + this.machine.setState(STATES.ENDING_ROUND); + } + } + + override leave() + { + this.machine.onLeave(); + } +} + +class IdleState extends State +{ + private machine: ClassicReelsStateMachine; + public systems: string[]; + constructor(machine: ClassicReelsStateMachine) + { + super('IdleState'); + this.machine = machine; + this.systems = [ + 'grid', + 'idle', + 'layering', + 'interactive', + 'resetWinningSymbols', + 'resetTinting', + 'tinting', + 'winLinesResetIncrement', + 'blurSymbols' + ]; + } + + override enter() + { + this.machine.onEnter(); + } + + override handleInput(target: BaseMachine) + { + if (target.inputs.spin === true) + { + this.machine.setState(STATES.SPINNING); + } + } + + override leave() + { + this.machine.onLeave(); + } +} + +class SpinningState extends State +{ + private machine: ClassicReelsStateMachine; + public systems: string[]; + constructor(machine: ClassicReelsStateMachine) + { + super('SpinningState'); + this.machine = machine; + this.systems = [ + 'spin', + 'layering', + 'resetWinningSymbols', + 'resetTinting', + 'tinting', + 'winLinesResetIncrement', + 'blurSymbols' + ]; + } + + override enter() + { + this.machine.onEnter(); + } + + override handleInput(target: BaseMachine) + { + if (!this.systems.every((key) => target.systems[key].state === 'stopped')) return; + if (target.inputs.wins) + { + this.machine.setState(STATES.ALL_WINNING_SYMBOLS); + } + else if (target.inputs.celebrateSymbolIndexes?.length > 0) + { + this.machine.setState(STATES.CELEBRATE_SYMBOLS); + } + else + { + this.machine.setState(STATES.ENDING_ROUND); + } + } + + override leave() + { + this.machine.onLeave(); + } +} + +class AllWinningSymbolsState extends State +{ + private machine: ClassicReelsStateMachine; + public systems: string[]; + constructor(machine: ClassicReelsStateMachine) + { + super('AllWinningSymbolsState'); + this.machine = machine; + this.systems = [ + 'resetWinningSymbols', + 'allWinSymbols', + 'allWinLinesSet', + 'winningSymbolsAnim', + 'tintWinningSymbolsAnim', + 'tinting', + 'winLinesAnimations', + 'displayTotalLinesWin', + 'blurSymbols' + ]; + } + + override enter() + { + this.machine.onEnter(); + } + + override handleInput(target: BaseMachine) + { + if (!this.systems.every((key) => target.systems[key].state === 'stopped')) return; + if (target.inputs.celebrateSymbolIndexes?.length > 0) + { + this.machine.setState(STATES.CELEBRATE_SYMBOLS); + } else + { + this.machine.setState(STATES.ENDING_ROUND); + } + } + + override leave() + { + this.machine.onLeave(); + } +} + +class CelebrateSymbolsState extends State +{ + private machine: ClassicReelsStateMachine; + public systems: string[]; + constructor(machine: ClassicReelsStateMachine) + { + super('CelebrateSymbolsState'); + this.machine = machine; + this.systems = ['celebrateSymbols', 'tinting', 'blurSymbols']; + } + + override enter() + { + this.machine.onEnter(); + } + + override handleInput(target: BaseMachine) + { + if (!this.systems.every((key) => target.systems[key].state === 'stopped')) return; + this.machine.setState(STATES.ENDING_ROUND); + } + + override leave() + { + this.machine.onLeave(); + } +} + +class EndingRoundState extends State +{ + private machine: ClassicReelsStateMachine; + public systems: string[]; + constructor(machine: ClassicReelsStateMachine) + { + super('EndingRoundState'); + this.machine = machine; + this.systems = ['blockExitState', 'blurSymbols']; + } + + override enter() + { + this.machine.onEnter(); + } + + override handleInput(target: BaseMachine) + { + if (!this.systems.every((key) => target.systems[key].state === 'stopped')) return; + if (target.inputs.spin) { + this.machine.setState(STATES.SPINNING); + } + else if (target.inputs.wins) + { + this.machine.setState(STATES.WINNING_LINES_LOOP); + } else + { + this.machine.setState(STATES.IDLE); + } + } + + override leave() + { + this.machine.onLeave(); + } +} + +class WinningLinesLoopState extends State +{ + private machine: ClassicReelsStateMachine; + public systems: string[]; + constructor(machine: ClassicReelsStateMachine) + { + super('WinningLinesLoopState'); + this.machine = machine; + this.systems = [ + 'resetWinningSymbols', + 'winLinesIncrementing', + 'setWinLineSymbols', + 'setWinLine', + 'winningSymbolsAnim', + 'tintWinningSymbolsAnim', + 'tinting', + 'interactive', + 'winLinesAnimations', + 'displayLineWin', + 'blurSymbols' + ]; + } + + override enter() + { + this.machine.onEnter(); + } + + override handleInput(target: BaseMachine) + { + if (target.inputs.spin === true) + { + this.machine.setState(STATES.SPINNING); + + return; + } + + if (!this.systems.every((key) => target.systems[key].state === 'stopped')) return; + this.machine.setState(STATES.WINNING_LINES_LOOP); + } + + override leave() + { + this.machine.onLeave(); + } +} diff --git a/src/stories/AnimatedExpandedSymbolsSystem.stories.ts b/src/stories/AnimatedExpandedSymbolsSystem.stories.ts new file mode 100644 index 0000000..b9b3205 --- /dev/null +++ b/src/stories/AnimatedExpandedSymbolsSystem.stories.ts @@ -0,0 +1,70 @@ +import { Assets, Ticker } from 'pixi.js'; +import ReelsMachine from 'src/slotMachines/ReelsMachine'; +import { STATES } from 'src/states/BasicStateMachine'; +import { argTypes, getDefaultArgs } from 'src/stories/utils/argTypes'; +import { createScreenInputMap } from 'src/stories/utils/createScreenInputMap'; +import MachineContainer from 'src/stories/utils/MachineContainer'; +import { centerView } from 'src/stories/utils/resize'; +import AnimatedExpandedSymbolsSystem from 'src/systems/AnimatedExpandedSymbolsSystem'; +import { SlotMachineConfig } from 'src/types/SlotMachineConfig'; +import { Meta, PixiStory, StoryFn } from '@pixi/storybook-renderer'; +import MockSystem from "src/systems/MockSystem"; + +const args = { + key: 'K', + zIndex: 4, +}; + +const meta: Meta = { + title: 'Systems/ExpandingSpinSystem', + tags: ['autodocs'], + parameters: { + docs: { + story: { + height: 600 + }, + description: { + component: 'Expanding symbols mechanics.' + }, + } + }, + argTypes: argTypes(args), + args: getDefaultArgs(args), +}; + +export default meta; + +export const ReelsMachineStory: StoryFn = (_params, context) => new PixiStory({ + context, init: async (view) => + { + Assets.reset(); + await Assets.init({ + manifest: 'area69/manifest.json', + }); + await Assets.loadBundle('configs'); + await Assets.loadBundle('symbols'); + const config: SlotMachineConfig = Assets.get('slot_machine_config'); + const machine = new ReelsMachine(config); + const container = new MachineContainer(machine); + machine.systems.blockExitState = new MockSystem(machine) + view.addChild(container); + context.machine = machine; + machine.systems.expanding = new AnimatedExpandedSymbolsSystem(machine); + machine.stateMachine.states[STATES.SPINNING].systems = ['layering', 'spin', 'expanding']; + machine.inputs.initMap = createScreenInputMap(config); + machine.inputs.screenMap = machine.inputs.initMap; + machine.systems.expanding.setSettings(_params); + machine.inputs.spin = true; + + machine.inputs.blockExitState = true; + setTimeout(() => { + machine.inputs.blockExitState = false; + }, 250); + centerView(view); + }, + resize: centerView, + update: () => + { + context.machine && context.machine.update(Ticker.shared.deltaMS); + } +}); diff --git a/src/stories/AnticipationSystem.stories.ts b/src/stories/AnticipationSystem.stories.ts new file mode 100644 index 0000000..d38bd82 --- /dev/null +++ b/src/stories/AnticipationSystem.stories.ts @@ -0,0 +1,97 @@ +import { Assets, Ticker } from 'pixi.js'; +import { argTypes, getDefaultArgs } from 'src/stories/utils/argTypes'; +import { createScreenInputMap } from 'src/stories/utils/createScreenInputMap'; +import MachineContainer from 'src/stories/utils/MachineContainer'; +import { centerView } from 'src/stories/utils/resize'; +import ReelsSpinSystem from 'src/systems/ReelsSpinSystem'; +import { SlotMachineConfig } from 'src/types/SlotMachineConfig'; +import { Meta, PixiStory, StoryFn } from '@pixi/storybook-renderer'; +import ReelsMachine from '../slotMachines/ReelsMachine'; +import { STATES } from '../states/ClassicReelsStateMachine'; +import AnticipationSystem from '../systems/AnticipationSystem'; +import AnticipationAnimationsSystem from "../systems/AnticipationAnimationsSystem"; +import AnticipationBack from "../entities/AnticipationBack"; +import AnticipationFront from "../entities/AnticipationFront"; +import MockSystem from "src/systems/MockSystem"; + +const args = { + accelerationTime: 1, + backCoef: 1.1, + maxSpeed: 40, + reelStartDelay: 0.2, + reelStopDelay: 0.5, + spinningDuration: 2, + blur: true, + bounce: true +}; + +const meta: Meta = { + title: 'Systems/AnticipationSystem', // Путь для отображения в Storybook + tags: ['autodocs'], // Включает автоматическую генерацию документации + parameters: { + docs: { + story: { + height: 600 + }, + description: { + component: 'Anticipation of landing symbols', + }, + } + }, + argTypes: argTypes(args), + args: getDefaultArgs(args), +}; + +export default meta; + +export const AnticipationSystemStory: StoryFn = (_params, context) => new PixiStory({ + context, init: async (view) => + { + Assets.reset(); + await Assets.init({ + manifest: 'area69/manifest.json', + }); + await Assets.loadBundle('configs'); + await Assets.loadBundle('symbols'); + const config: SlotMachineConfig = Assets.get('slot_machine_config'); + const machine = new ReelsMachine(config); + const container = new MachineContainer(machine); + machine.systems.blockExitState = new MockSystem(machine) + view.addChild(container); + context.machine = machine; + machine.systems.spin.setSettings(_params); + machine.systems.anticipation1 = new AnticipationSystem(machine); + machine.systems.anticipationAnim = new AnticipationAnimationsSystem(machine); + machine.systems.anticipationAnim.setSettings({ + entityClass: AnticipationBack, + zIndex: 0 + }); + machine.systems.anticipationAnimFront = new AnticipationAnimationsSystem(machine); + machine.systems.anticipationAnimFront.setSettings({ + entityClass: AnticipationFront, + zIndex: 10 + }); + machine.inputs.initMap = createScreenInputMap(config); + machine.inputs.screenMap = createScreenInputMap(config) + .map((record, index) => ([0, 1].includes(index) ? { ...record, key: 'A' } : record)) + .map((record, index) => ([5].includes(index) ? { ...record, key: 'B' } : record)); + + // machine.systems.anticipation1.setSettings({ anticipatingSymbolKey: 'A', preventReelStopIndex: 0 }); + // machine.systems.anticipation2 = new AnticipationSystem(machine); + // machine.systems.anticipation2.setSettings({ anticipatingSymbolKey: ['B', 'C'], preventReelStopIndex: 1 }); + // machine.stateMachine.states[STATES.SPINNING].systems = ['anticipation1', 'anticipation2', 'spin',]; + machine.stateMachine.states[STATES.SPINNING].systems = ['anticipation1', "anticipationAnim", "anticipationAnimFront", 'spin']; + machine.inputs.spin = true; + machine.inputs.blockExitState = true; + setTimeout(() => { + machine.inputs.blockExitState = false; + }, 250); + centerView(view); + centerView(view); + }, + resize: centerView, + update: () => + { + context.machine && context.machine.update(Ticker.shared.deltaMS); + } +}); diff --git a/src/stories/BlurSymbolsSystem.stories.ts b/src/stories/BlurSymbolsSystem.stories.ts new file mode 100644 index 0000000..6049d16 --- /dev/null +++ b/src/stories/BlurSymbolsSystem.stories.ts @@ -0,0 +1,84 @@ +import { Assets, Ticker } from 'pixi.js'; +import { Meta, PixiStory, StoryFn } from '@pixi/storybook-renderer'; +import ReelsMachine from 'src/slotMachines/ReelsMachine'; +import { argTypes, getDefaultArgs } from 'src/stories/utils/argTypes'; +import { createScreenInputMap } from 'src/stories/utils/createScreenInputMap'; +import MachineContainer from 'src/stories/utils/MachineContainer'; +import { centerView } from 'src/stories/utils/resize'; +import MockSystem from 'src/systems/MockSystem'; +import BlurSymbolsSystem, { BlurSymbolsSystemSettings } from 'src/systems/BlurSymbolsSystem'; +import MaskingSystem from 'src/systems/MaskingSystem'; +import { STATES } from 'src/states/ClassicReelsStateMachine'; +import { SlotMachineConfig } from 'src/types/SlotMachineConfig'; + +const args = { + velocityX: 0, + velocityY: -50, + kernelSize: 15, + offset: 7, +}; + +const meta: Meta = { + title: 'Systems/BlurSymbolsSystem', + tags: ['autodocs'], + parameters: { + docs: { + story: { + height: 600, + }, + description: { + component: 'Adjust the blur filter velocity, kernel size, and offset to preview motion blur strength while the reels spin. The story mirrors the standard machine boot flow and calls `setSettings` so designers can iterate on blur intensity in real time.', + }, + }, + }, + argTypes: argTypes(args), + args: getDefaultArgs(args), +}; + +export default meta; + +export const BlurSymbolsSystemStory: StoryFn = (_params, context) => new PixiStory({ + context, + init: async (view) => + { + Assets.reset(); + await Assets.init({ + manifest: 'area69/manifest.json', + }); + await Assets.loadBundle('configs'); + await Assets.loadBundle('symbols'); + + const config: SlotMachineConfig = Assets.get('slot_machine_config'); + const machine = new ReelsMachine(config); + machine.systems.masking = new MaskingSystem(machine); + machine.stateMachine.states[STATES.SPINNING].systems.push('masking'); + const container = new MachineContainer(machine, false); + + view.addChild(container); + context.machine = machine; + machine.systems.blockExitState = new MockSystem(machine); + machine.inputs.initMap = createScreenInputMap(config); + machine.inputs.screenMap = createScreenInputMap(config); + + const blurSettings: Partial = { + velocity: [_params.velocityX, _params.velocityY], + kernelSize: _params.kernelSize, + offset: _params.offset, + }; + (machine.systems.blurSymbols as BlurSymbolsSystem).setSettings(blurSettings); + + machine.inputs.spin = true; + + machine.inputs.blockExitState = true; + setTimeout(() => + { + machine.inputs.blockExitState = false; + }, 250); + centerView(view); + }, + resize: centerView, + update: () => + { + context.machine && context.machine.update(Ticker.shared.deltaMS); + } +}); diff --git a/src/stories/CascadeSpinSystem.stories.ts b/src/stories/CascadeSpinSystem.stories.ts new file mode 100644 index 0000000..391ae09 --- /dev/null +++ b/src/stories/CascadeSpinSystem.stories.ts @@ -0,0 +1,64 @@ +import { Assets, Ticker } from 'pixi.js'; +import CascadeMachine from 'src/slotMachines/CascadeMachine'; +import { argTypes, getDefaultArgs } from 'src/stories/utils/argTypes'; +import { createScreenInputMap } from 'src/stories/utils/createScreenInputMap'; +import MachineContainer from 'src/stories/utils/MachineContainer'; +import { centerView } from 'src/stories/utils/resize'; +import CascadeSpinSystem from 'src/systems/CascadeSpinSystem'; +import { SlotMachineConfig } from 'src/types/SlotMachineConfig'; +import { Meta, PixiStory, StoryFn } from '@pixi/storybook-renderer'; +import MockSystem from "src/systems/MockSystem"; + +const args = { + gravity: 4000, + reelDelay: 0.12, + slotDelay: 0.03, + refillDelay: 0.5, +}; + +const meta: Meta = { + title: 'Systems/CascadeSpinSystem', // Путь для отображения в Storybook + tags: ['autodocs'], // Включает автоматическую генерацию документации + parameters: { + docs: { + story: { + height: 600 + }, + description: { + component: 'Manages the cascade spinning effect in the slot machine. Handles dropping, refilling, and bouncing symbols with gravity effects.' + }, + } + }, + argTypes: argTypes(args), + args: getDefaultArgs(args), +}; + +export default meta; + +export const CascadeSpinSystemStory: StoryFn = (_params, context) => new PixiStory({ + context, init: async (view) => + { + Assets.reset(); + await Assets.init({ + manifest: 'bubblex/manifest.json', + }); + await Assets.loadBundle('configs'); + await Assets.loadBundle('symbols'); + const config: SlotMachineConfig = Assets.get('slot_machine_config'); + const machine = new CascadeMachine(config); + const container = new MachineContainer(machine); + machine.systems.blockExitState = new MockSystem(machine) + view.addChild(container); + context.machine = machine; + machine.inputs.initMap = createScreenInputMap(config); + machine.inputs.screenMap = createScreenInputMap(config); + machine.systems.spin.setSettings(_params); + machine.inputs.spin = true; + centerView(view); + }, + resize: centerView, + update: () => + { + context.machine && context.machine.update(Ticker.shared.deltaMS); + } +}); diff --git a/src/stories/CelebrateSystem.stories.ts b/src/stories/CelebrateSystem.stories.ts new file mode 100644 index 0000000..309217f --- /dev/null +++ b/src/stories/CelebrateSystem.stories.ts @@ -0,0 +1,70 @@ +import { Assets, Ticker } from 'pixi.js'; +import { argTypes, getDefaultArgs } from 'src/stories/utils/argTypes'; +import { createScreenInputMap } from 'src/stories/utils/createScreenInputMap'; +import MachineContainer from 'src/stories/utils/MachineContainer'; +import { centerView } from 'src/stories/utils/resize'; +import ReelsSpinSystem from 'src/systems/ReelsSpinSystem'; +import { SlotMachineConfig } from 'src/types/SlotMachineConfig'; +import { Meta, PixiStory, StoryFn } from '@pixi/storybook-renderer'; +import ReelsMachine from '../slotMachines/ReelsMachine'; +import MockSystem from "src/systems/MockSystem"; + +const args = { + accelerationTime: 1, + backCoef: 1.1, + maxSpeed: 40, + reelStartDelay: 0.2, + reelStopDelay: 0.5, + spinningDuration: 2, + blur: true, + bounce: true +}; + +const meta: Meta = { + title: 'Systems/CelebrateSystem', // Путь для отображения в Storybook + tags: ['autodocs'], // Включает автоматическую генерацию документации + parameters: { + docs: { + story: { + height: 600 + }, + description: { + component: 'Celebrate symbols', + }, + } + }, + argTypes: argTypes(args), + args: getDefaultArgs(args), +}; + +export default meta; + +export const CelebrateSystemStory: StoryFn = (_params, context) => new PixiStory({ + context, init: async (view) => + { + Assets.reset(); + await Assets.init({ + manifest: 'area69/manifest.json', + }); + await Assets.loadBundle('configs'); + await Assets.loadBundle('symbols'); + const config: SlotMachineConfig = Assets.get('slot_machine_config'); + const machine = new ReelsMachine(config); + const container = new MachineContainer(machine); + machine.systems.blockExitState = new MockSystem(machine) + view.addChild(container); + context.machine = machine; + machine.inputs.initMap = createScreenInputMap(config); + machine.inputs.screenMap = createScreenInputMap(config) + .map((record, index) => ([0, 1].includes(index) ? { ...record, key: 'A' } : record)) + .map((record, index) => ([5].includes(index) ? { ...record, key: 'A' } : record)); + machine.inputs.celebrateSymbolIndexes = [0, 1, 5]; + machine.inputs.spin = true; + centerView(view); + }, + resize: centerView, + update: () => + { + context.machine && context.machine.update(Ticker.shared.deltaMS); + } +}); diff --git a/src/stories/GridSystem.stories.ts b/src/stories/GridSystem.stories.ts new file mode 100644 index 0000000..4720c32 --- /dev/null +++ b/src/stories/GridSystem.stories.ts @@ -0,0 +1,56 @@ +import { Assets, Ticker } from 'pixi.js'; +import ReelsMachine from 'src/slotMachines/ReelsMachine'; +import { createScreenInputMap } from 'src/stories/utils/createScreenInputMap'; +import MachineContainer from 'src/stories/utils/MachineContainer'; +import { centerView } from 'src/stories/utils/resize'; +import GridSystem from 'src/systems/GridSystem'; +import { SlotMachineConfig } from 'src/types/SlotMachineConfig'; +import { Meta, PixiStory, StoryFn } from '@pixi/storybook-renderer'; +import MockSystem from "src/systems/MockSystem"; + +const args = { + +}; + +const meta: Meta = { + title: 'Systems/GridSystem', // Путь для отображения в Storybook + tags: ['autodocs'], // Включает автоматическую генерацию документации + parameters: { + docs: { + story: { + height: 600 + }, + description: { + component: 'Manages the positioning of symbols on a grid for a slot machine' + }, + } + }, +}; + +export default meta; + +export const GridSystemStory: StoryFn = (_params, context) => new PixiStory({ + context, init: async (view) => + { + Assets.reset(); + await Assets.init({ + manifest: 'area69/manifest.json', + }); + await Assets.loadBundle('configs'); + await Assets.loadBundle('symbols'); + const config: SlotMachineConfig = Assets.get('slot_machine_config'); + const machine = new ReelsMachine(config); + const container = new MachineContainer(machine); + machine.systems.blockExitState = new MockSystem(machine) + view.addChild(container); + context.machine = machine; + machine.inputs.initMap = createScreenInputMap(config); + machine.systems.idle.setSettings(_params); + centerView(view); + }, + resize: centerView, + update: () => + { + context.machine && context.machine.update(Ticker.shared.deltaMS); + } +}); diff --git a/src/stories/HoldAndWin.stories.ts b/src/stories/HoldAndWin.stories.ts new file mode 100644 index 0000000..6d176b6 --- /dev/null +++ b/src/stories/HoldAndWin.stories.ts @@ -0,0 +1,225 @@ +import { Assets, Ticker } from 'pixi.js'; +import HoldAndWinMachine from 'src/slotMachines/HoldAndWinMachine'; +import { argTypes, getDefaultArgs } from 'src/stories/utils/argTypes'; +import { createScreenInputMap } from 'src/stories/utils/createScreenInputMap'; +import MachineContainer from 'src/stories/utils/MachineContainer'; +import { centerView } from 'src/stories/utils/resize'; +import { SlotMachineConfig } from 'src/types/SlotMachineConfig'; +import { Meta, PixiStory, StoryFn } from '@pixi/storybook-renderer'; +import IdleSystem from '../systems/IdleSystem'; +import StickySymbolsSystem from 'src/systems/StickySymbolsSystem'; +import { STATES } from 'src/states/BasicStateMachine'; + +const args = { + accelerationTime: 1, + backCoef: 1.1, + maxSpeed: 15, + reelStartDelay: 0.2, + reelStopDelay: 0.5, + slotStopDelay: 0, + spinningDuration: 2, + blur: false, + bounce: true +}; + +/** + * Creates argTypes with fractional range steps for finer Hold & Win tuning. + */ +const createHoldAndWinArgTypes = (initialArgs: typeof args): ReturnType => { + const baseArgTypes = argTypes(initialArgs); + + Object.keys(initialArgs).forEach((key) => { + + const descriptor = baseArgTypes[key]; + const control = descriptor?.control; + + if (!control || control.type !== 'range') return; + + baseArgTypes[key] = { + ...descriptor, + control: { + ...control, + step: control.step && control.step < 1 ? control.step : 0.1, + }, + }; + }); + + return baseArgTypes; +}; + +const meta: Meta = { + title: 'features/HoldAndWin', // Путь для отображения в Storybook + tags: ['autodocs'], // Включает автоматическую генерацию документации + parameters: { + docs: { + story: { + height: 600 + }, + description: { + component: 'Manages idle animations for random symbols in the slot machine. When the system is idle, it triggers an idle animation on a randomly chosen symbol.' + }, + } + }, + argTypes: createHoldAndWinArgTypes(args), + args: getDefaultArgs(args), +}; + +export default meta; + +export const SingleSlotReelsStory: StoryFn = (_params, context) => new PixiStory({ + context, + init: async (view) => { + Assets.reset(); + await Assets.init({ manifest: 'hold-and-win/manifest.json' }); + await Assets.loadBundle('configs'); + await Assets.loadBundle('symbols'); + const config: SlotMachineConfig = Assets.get('slot_machine_config'); + const machine = new HoldAndWinMachine(config); + const container = new MachineContainer(machine); + container.scale.set(0.5); + view.addChild(container); + context.machine = machine; + // Prepare input maps for screen and initialization + machine.inputs.initMap = createScreenInputMap(config); + machine.inputs.screenMap = createScreenInputMap(config); + // Apply story args to spin system and trigger spin + machine.systems.spin.setSettings(_params as any); + machine.inputs.spin = true; + centerView(view); + }, + resize: centerView, + update: () => { + const dt = Ticker.shared.deltaMS; + if (context.machine) context.machine.update(dt); + } +}); + +export const StickSystemStory: StoryFn = (_params, context) => new PixiStory({ + context, + init: async (view) => { + Assets.reset(); + await Assets.init({ manifest: 'hold-and-win/manifest.json' }); + await Assets.loadBundle('configs'); + await Assets.loadBundle('symbols'); + const config: SlotMachineConfig = Assets.get('slot_machine_config'); + const machine = new HoldAndWinMachine(config); + const container = new MachineContainer(machine); + container.scale.set(0.5); + view.addChild(container); + context.machine = machine; + + // Attach StickySymbolsSystem to HoldAndWinMachine + machine.systems.stick = new StickySymbolsSystem(machine as any); + // Ensure stick system runs during all states where needed + machine.stateMachine.states[STATES.SPINNING].systems = ['spin', 'layering']; + machine.stateMachine.states.forEach((state) => { + if (!state.systems.includes('stick')) state.systems.push('stick'); + }); + + // Prepare input maps for screen and initialization + machine.inputs.initMap = createScreenInputMap(config); + machine.inputs.screenMap = machine.inputs.initMap; + + // Mark which symbols should become sticky; example: stick wilds L/M/N + // This ensures only those cells are hidden behind stickies; others remain visible during spin + machine.maps.stickySymbols = machine.inputs.screenMap.map((s: any) => ['L', 'M', 'N'].includes(s.key)); + + // Configure systems + if ((machine.systems as any).stick?.setSettings) (machine.systems as any).stick.setSettings({ zIndex: 5 }); + machine.systems.spin.setSettings(_params as any); + + // Trigger spin + machine.inputs.spin = true; + centerView(view); + }, + resize: centerView, + update: () => { + const dt = Ticker.shared.deltaMS; + if (context.machine) context.machine.update(dt); + } +}); + +export const SingleSlotReelsPreventSpinStory: StoryFn = (_params, context) => new PixiStory({ + context, + init: async (view) => { + Assets.reset(); + await Assets.init({ manifest: 'hold-and-win/manifest.json' }); + await Assets.loadBundle('configs'); + await Assets.loadBundle('symbols'); + const config: SlotMachineConfig = Assets.get('slot_machine_config'); + const machine = new HoldAndWinMachine(config); + const container = new MachineContainer(machine); + container.scale.set(0.5); + view.addChild(container); + context.machine = machine; + // Prepare input maps for screen and initialization + machine.inputs.initMap = createScreenInputMap(config); + machine.maps.preventReelsSpin = machine.inputs.initMap.map((s: any) => s?.key === 'K'); + machine.inputs.screenMap = machine.inputs.initMap + // Apply story args to spin system and trigger spin + machine.systems.spin.setSettings(_params as any); + machine.inputs.spin = true; + centerView(view); + }, + resize: centerView, + update: () => { + const dt = Ticker.shared.deltaMS; + if (context.machine) context.machine.update(dt); + } +}); + +export const DoubleHoldAndWinStory: StoryFn = (_params, context) => new PixiStory({ + context, + init: async (view) => { + Assets.reset(); + await Assets.init({ manifest: 'hold-and-win/manifest.json' }); + await Assets.loadBundle('configs'); + await Assets.loadBundle('symbols'); + const config: SlotMachineConfig = Assets.get('slot_machine_config'); + + // Create two machines + const machineTop = new HoldAndWinMachine(config); + const containerTop = new MachineContainer(machineTop); + const machineBottom = new HoldAndWinMachine(config); + const containerBottom = new MachineContainer(machineBottom); + + // Scale both machines to half size + containerTop.scale.set(0.5); + containerBottom.scale.set(0.5); + + // Add to view + view.addChild(containerTop); + view.addChild(containerBottom); + + // Keep references for update loop + (context as any).machines = [machineTop, machineBottom]; + + // Prepare input maps (different for each machine) + const initMapTop = createScreenInputMap(config); + const initMapBottom = [...createScreenInputMap(config)].reverse(); // make it different + + machineTop.inputs.initMap = initMapTop; + machineTop.inputs.screenMap = initMapTop; + + machineBottom.inputs.initMap = initMapBottom; + machineBottom.inputs.screenMap = initMapBottom; + + // Apply story args to both spin systems and trigger spin + machineTop.systems.spin.setSettings(_params as any); + machineBottom.systems.spin.setSettings(_params as any); + + machineTop.inputs.spin = true; + machineBottom.inputs.spin = true; + + // Layout: one above the other + containerBottom.y = containerTop.height + 50; // spacing between machines + + centerView(view); + }, + resize: centerView, + update: () => { + const dt = Ticker.shared.deltaMS; + const machines = (context as any).machines as any[] | undefined; + if (machines) machines.forEach((m: any) => m.update(dt)); + } +}); diff --git a/src/stories/IdleSystem.stories.ts b/src/stories/IdleSystem.stories.ts new file mode 100644 index 0000000..214945a --- /dev/null +++ b/src/stories/IdleSystem.stories.ts @@ -0,0 +1,65 @@ +import { Assets, Ticker } from 'pixi.js'; +import ReelsMachine from 'src/slotMachines/ReelsMachine'; +import { argTypes, getDefaultArgs } from 'src/stories/utils/argTypes'; +import { createScreenInputMap } from 'src/stories/utils/createScreenInputMap'; +import MachineContainer from 'src/stories/utils/MachineContainer'; +import { centerView } from 'src/stories/utils/resize'; +import { SlotMachineConfig } from 'src/types/SlotMachineConfig'; +import { Meta, PixiStory, StoryFn } from '@pixi/storybook-renderer'; +import IdleSystem from '../systems/IdleSystem'; +import MockSystem from "src/systems/MockSystem"; + +const args = { + maxAnimatedSymbols: 5 +}; + +const meta: Meta = { + title: 'Systems/IdleSystem', // Путь для отображения в Storybook + tags: ['autodocs'], // Включает автоматическую генерацию документации + parameters: { + docs: { + story: { + height: 600 + }, + description: { + component: 'Manages idle animations for random symbols in the slot machine. When the system is idle, it triggers an idle animation on a randomly chosen symbol.' + }, + } + }, + argTypes: argTypes(args), + args: getDefaultArgs(args), +}; + +export default meta; + +export const IdleSystemStory: StoryFn = (_params, context) => new PixiStory({ + context, init: async (view) => + { + Assets.reset(); + await Assets.init({ + manifest: 'area69/manifest.json', + }); + await Assets.loadBundle('configs'); + await Assets.loadBundle('symbols'); + const config: SlotMachineConfig = Assets.get('slot_machine_config'); + const machine = new ReelsMachine(config); + const container = new MachineContainer(machine); + + view.addChild(container); + context.machine = machine; + machine.inputs.initMap = createScreenInputMap(config); + machine.systems.idle.setSettings(_params); + machine.systems.blockExitState = new MockSystem(machine) + machine.inputs.blockExitState = true; + setTimeout(() => { + machine.inputs.blockExitState = false; + }, 250); + centerView(view); + }, + resize: centerView, + update: () => + { + context.machine && context.machine.update(Ticker.shared.deltaMS); + context.machine.systems.idle.setSettings(_params); + } +}); diff --git a/src/stories/InitSystem.stories.ts b/src/stories/InitSystem.stories.ts new file mode 100644 index 0000000..5eedab7 --- /dev/null +++ b/src/stories/InitSystem.stories.ts @@ -0,0 +1,57 @@ +import { Assets, Ticker } from 'pixi.js'; +import ReelsMachine from 'src/slotMachines/ReelsMachine'; +import { createScreenInputMap } from 'src/stories/utils/createScreenInputMap'; +import MachineContainer from 'src/stories/utils/MachineContainer'; +import { centerView } from 'src/stories/utils/resize'; +import GridSystem from 'src/systems/GridSystem'; +import { SlotMachineConfig } from 'src/types/SlotMachineConfig'; +import { Meta, PixiStory, StoryFn } from '@pixi/storybook-renderer'; +import MockSystem from "src/systems/MockSystem"; + +const args = { + +}; + +const meta: Meta = { + title: 'Systems/InitSystem', // Путь для отображения в Storybook + tags: ['autodocs'], // Включает автоматическую генерацию документации + parameters: { + docs: { + story: { + height: 600 + }, + description: { + component: 'A system responsible for initializing symbols in the slot machine. It only runs once, adding symbols based on `initMap` data to the main scene and marking initialization as complete.' + }, + } + }, +}; + +export default meta; + +export const GridSystemStory: StoryFn = (_params, context) => new PixiStory({ + context, init: async (view) => + { + Assets.reset(); + await Assets.init({ + manifest: 'area69/manifest.json', + }); + await Assets.loadBundle('configs'); + await Assets.loadBundle('symbols'); + const config: SlotMachineConfig = Assets.get('slot_machine_config'); + const machine = new ReelsMachine(config); + const container = new MachineContainer(machine); + machine.systems.blockExitState = new MockSystem(machine) + view.addChild(container); + context.machine = machine; + machine.inputs.initMap = createScreenInputMap(config); + machine.systems.idle.setSettings(_params); + centerView(view); + }, + resize: centerView, + update: () => + { + context.machine && context.machine.update(Ticker.shared.deltaMS); + context.machine.systems.idle.setSettings(_params); + } +}); diff --git a/src/stories/LayeringSystem.stories.ts b/src/stories/LayeringSystem.stories.ts new file mode 100644 index 0000000..d7e11f5 --- /dev/null +++ b/src/stories/LayeringSystem.stories.ts @@ -0,0 +1,61 @@ +import { Assets, Ticker } from 'pixi.js'; +import ReelsMachine from 'src/slotMachines/ReelsMachine'; +import { argTypes, getDefaultArgs } from 'src/stories/utils/argTypes'; +import { createScreenInputMap } from 'src/stories/utils/createScreenInputMap'; +import MachineContainer from 'src/stories/utils/MachineContainer'; +import { centerView } from 'src/stories/utils/resize'; +import ReelsSpinSystem from 'src/systems/ReelsSpinSystem'; +import { SlotMachineConfig } from 'src/types/SlotMachineConfig'; +import { Meta, PixiStory, StoryFn } from '@pixi/storybook-renderer'; +import MockSystem from "src/systems/MockSystem"; + +const args = { + +}; + +const meta: Meta = { + title: 'Systems/LayeringSystem', // Путь для отображения в Storybook + tags: ['autodocs'], // Включает автоматическую генерацию документации + parameters: { + docs: { + story: { + height: 600 + }, + description: { + component: 'Add doc' + }, + } + }, + argTypes: argTypes(args), + args: getDefaultArgs(args), +}; + +export default meta; + +export const LayeringSystemStory: StoryFn = (_params, context) => new PixiStory({ + context, init: async (view) => + { + Assets.reset(); + await Assets.init({ + manifest: 'area69/manifest.json', + }); + await Assets.loadBundle('configs'); + await Assets.loadBundle('symbols'); + const config: SlotMachineConfig = Assets.get('slot_machine_config'); + const machine = new ReelsMachine(config); + const container = new MachineContainer(machine); + machine.systems.blockExitState = new MockSystem(machine) + view.addChild(container); + context.machine = machine; + machine.inputs.initMap = createScreenInputMap(config); + machine.inputs.screenMap = createScreenInputMap(config); + machine.systems.spin.setSettings(_params); + machine.inputs.spin = false; + centerView(view); + }, + resize: centerView, + update: () => + { + context.machine && context.machine.update(Ticker.shared.deltaMS); + } +}); diff --git a/src/stories/MaskingSystem.stories.ts b/src/stories/MaskingSystem.stories.ts new file mode 100644 index 0000000..0812c6f --- /dev/null +++ b/src/stories/MaskingSystem.stories.ts @@ -0,0 +1,86 @@ +import { Assets, Ticker } from 'pixi.js'; +import { Meta, PixiStory, StoryFn } from '@pixi/storybook-renderer'; +import ReelsMachine from 'src/slotMachines/ReelsMachine'; +import { argTypes, getDefaultArgs } from 'src/stories/utils/argTypes'; +import { createScreenInputMap } from 'src/stories/utils/createScreenInputMap'; +import MachineContainer from 'src/stories/utils/MachineContainer'; +import { centerView } from 'src/stories/utils/resize'; +import MockSystem from 'src/systems/MockSystem'; +import MaskingSystem, { MaskingSystemSettings } from 'src/systems/MaskingSystem'; +import { STATES } from 'src/states/ClassicReelsStateMachine'; +import { SlotMachineConfig } from 'src/types/SlotMachineConfig'; + +const args = { + enabled: true, + width: 1920, + height: 1080, +}; + +const meta: Meta = { + title: 'Systems/MaskingSystem', + tags: ['autodocs'], + parameters: { + docs: { + story: { + height: 600, + }, + description: { + component: 'Preview the rectangular reel viewport mask and toggle it with the provided controls. The story mirrors the base reel setup and forwards the knob values into `setSettings` so you can iterate on mask dimensions without leaving Storybook.', + }, + }, + }, + argTypes: argTypes(args), + args: getDefaultArgs(args), +}; + +export default meta; + +export const MaskingSystemStory: StoryFn = (_params, context) => new PixiStory({ + context, + init: async (view) => + { + Assets.reset(); + await Assets.init({ + manifest: 'area69/manifest.json', + }); + await Assets.loadBundle('configs'); + await Assets.loadBundle('symbols'); + + const config: SlotMachineConfig = Assets.get('slot_machine_config'); + const machine = new ReelsMachine(config); + machine.systems.masking = new MaskingSystem(machine); + const spinningState = machine.stateMachine.states[STATES.SPINNING]; + if (!spinningState.systems.includes('masking')) + { + spinningState.systems.push('masking'); + } + const container = new MachineContainer(machine, false); + + view.addChild(container); + context.machine = machine; + machine.systems.blockExitState = new MockSystem(machine); + machine.inputs.initMap = createScreenInputMap(config); + machine.inputs.screenMap = createScreenInputMap(config); + + const maskSettings: Partial = { + enabled: _params.enabled, + width: _params.width, + height: _params.height, + }; + (machine.systems.masking as MaskingSystem).setSettings(maskSettings); + + machine.inputs.spin = true; + + machine.inputs.blockExitState = true; + setTimeout(() => + { + machine.inputs.blockExitState = false; + }, 250); + centerView(view); + }, + resize: centerView, + update: () => + { + context.machine && context.machine.update(Ticker.shared.deltaMS); + } +}); diff --git a/src/stories/ReelsSpinSystem.stories.ts b/src/stories/ReelsSpinSystem.stories.ts new file mode 100644 index 0000000..7465f24 --- /dev/null +++ b/src/stories/ReelsSpinSystem.stories.ts @@ -0,0 +1,119 @@ +import { Assets, Ticker } from 'pixi.js'; +import ReelsMachine from 'src/slotMachines/ReelsMachine'; +import { argTypes, getDefaultArgs } from 'src/stories/utils/argTypes'; +import { createScreenInputMap } from 'src/stories/utils/createScreenInputMap'; +import MachineContainer from 'src/stories/utils/MachineContainer'; +import { centerView } from 'src/stories/utils/resize'; +import ReelsSpinSystem from 'src/systems/ReelsSpinSystem'; +import { SlotMachineConfig } from 'src/types/SlotMachineConfig'; +import { Meta, PixiStory, StoryFn } from '@pixi/storybook-renderer'; +import MockSystem from 'src/systems/MockSystem'; +import MaskingSystem from 'src/systems/MaskingSystem'; +import { STATES } from 'src/states/ClassicReelsStateMachine'; + +const args = { + accelerationTime: 1, + backCoef: 1.1, + maxSpeed: 40, + reelStartDelay: 0.2, + reelStopDelay: 0.5, + spinningDuration: 2, + blur: true, + bounce: true +}; + +const meta: Meta = { + title: 'Systems/ReelsSpinSystem', // Путь для отображения в Storybook + tags: ['autodocs'], // Включает автоматическую генерацию документации + parameters: { + docs: { + story: { + height: 600 + }, + description: { + component: 'Controls the spinning behavior of slot machine reels, including acceleration, sustained spinning, and deceleration. This class manages reel state transitions, timing for each stage of the spin, and the display of symbols on each reel.' + }, + } + }, + argTypes: argTypes(args), + args: getDefaultArgs(args), +}; + +export default meta; + +export const ReelsSpinSystemStory: StoryFn = (_params, context) => new PixiStory({ + context, init: async (view) => + { + Assets.reset(); + await Assets.init({ + manifest: 'area69/manifest.json', + }); + await Assets.loadBundle('configs'); + await Assets.loadBundle('symbols'); + const config: SlotMachineConfig = Assets.get('slot_machine_config'); + const machine = new ReelsMachine(config); + machine.systems.masking = new MaskingSystem(machine); + machine.stateMachine.states[STATES.SPINNING].systems.push('masking'); + const container = new MachineContainer(machine, false); + + view.addChild(container); + context.machine = machine; + machine.systems.blockExitState = new MockSystem(machine); + machine.inputs.initMap = createScreenInputMap(config); + machine.inputs.screenMap = createScreenInputMap(config); + machine.systems.spin.setSettings(_params); + machine.inputs.spin = true; + + machine.inputs.blockExitState = true; + setTimeout(() => { + machine.inputs.blockExitState = false; + }, 250); + centerView(view); + }, + resize: centerView, + update: () => + { + context.machine && context.machine.update(Ticker.shared.deltaMS); + } +}); + +export const ReelsSpinSystemPreventedReelsStory: StoryFn = (_params, context) => new PixiStory({ + context, init: async (view) => + { + Assets.reset(); + await Assets.init({ + manifest: 'area69/manifest.json', + }); + await Assets.loadBundle('configs'); + await Assets.loadBundle('symbols'); + const config: SlotMachineConfig = Assets.get('slot_machine_config'); + const machine = new ReelsMachine(config); + machine.systems.masking = new MaskingSystem(machine); + machine.stateMachine.states[STATES.SPINNING].systems.push('masking'); + const container = new MachineContainer(machine, false); + + view.addChild(container); + context.machine = machine; + machine.systems.blockExitState = new MockSystem(machine); + machine.inputs.initMap = createScreenInputMap(config); + machine.inputs.screenMap = createScreenInputMap(config); + machine.systems.spin.setSettings(_params); + + // Disable first and last reels from spinning + const reelsCount = config.reels; + machine.maps.preventReelsSpin = Array.from({ length: reelsCount }, (_, i) => i === 0 || i === reelsCount - 1); + + machine.inputs.spin = true; + + machine.inputs.blockExitState = true; + setTimeout(() => { + machine.inputs.blockExitState = false; + }, 250); + centerView(view); + }, + resize: centerView, + update: () => + { + context.machine && context.machine.update(Ticker.shared.deltaMS); + } +}); diff --git a/src/stories/SlotMultipliersSystem.stories.ts b/src/stories/SlotMultipliersSystem.stories.ts new file mode 100644 index 0000000..7455741 --- /dev/null +++ b/src/stories/SlotMultipliersSystem.stories.ts @@ -0,0 +1,161 @@ +import { Assets, Ticker } from 'pixi.js'; +import { Meta, PixiStory, StoryFn } from '@pixi/storybook-renderer'; +import HoldAndWinMachine from 'src/slotMachines/HoldAndWinMachine'; +import { SlotMachineConfig } from 'src/types/SlotMachineConfig'; +import { centerView } from 'src/stories/utils/resize'; +import MachineContainer from 'src/stories/utils/MachineContainer'; +import { createScreenInputMap } from 'src/stories/utils/createScreenInputMap'; +import SlotMultipliersSystem from 'src/systems/SlotMultipliersSystem'; +import SlotMultiplierEntity from 'src/entities/SlotMultiplierEntity'; +import { STATES } from 'src/states/BasicStateMachine'; +import {argTypes, getDefaultArgs} from "src/stories/utils/argTypes"; + +const args = { + accelerationTime: 1, + backCoef: 1.1, + maxSpeed: 15, + reelStartDelay: 0.2, + reelStopDelay: 0.5, + slotStopDelay: 0, + spinningDuration: 2, + blur: false, + bounce: true +}; + +/** + * Creates argTypes with fractional range steps for finer Hold & Win tuning. + */ +const createHoldAndWinArgTypes = (initialArgs: typeof args): ReturnType => { + const baseArgTypes = argTypes(initialArgs); + + Object.keys(initialArgs).forEach((key) => { + + const descriptor = baseArgTypes[key]; + const control = descriptor?.control; + + if (!control || control.type !== 'range') return; + + baseArgTypes[key] = { + ...descriptor, + control: { + ...control, + step: control.step && control.step < 1 ? control.step : 0.1, + }, + }; + }); + + return baseArgTypes; +}; + +const meta: Meta = { + title: 'systems/SlotMultipliersSystem', + tags: ['autodocs'], + parameters: { + docs: { + description: { + component: 'Displays Spine-based multiplier overlays for every slot based on the slotMultipliers map.', + }, + }, + }, + argTypes: createHoldAndWinArgTypes(args), + args: getDefaultArgs(args), +}; + +export default meta; + + +/** + * Updates the multiplier map with random positive values and zeroed blanks. + */ +function randomiseMultipliers(machine: HoldAndWinMachine): void +{ + const total = machine.config.reels * machine.config.slots; + machine.maps.slotMultipliers = Array.from({ length: total }, () => + (Math.random() > 0.6 ? Math.ceil(Math.random() * 10) : 0)); +} + +export const HoldAndWinMultipliers: StoryFn = (_params, context) => new PixiStory({ + context, + init: async (view) => { + Assets.reset(); + await Assets.init({ manifest: 'hold-and-win/manifest.json' }); + await Assets.loadBundle('configs'); + await Assets.loadBundle('symbols'); + await Assets.loadBundle('addons'); + + const config: SlotMachineConfig = Assets.get('slot_machine_config'); + const machine = new HoldAndWinMachine(config); + const container = new MachineContainer(machine); + container.scale.set(1); + view.addChild(container); + + context.machine = machine; + context.prevSpinState = machine.systems.spin.state; + + machine.inputs.initMap = createScreenInputMap(config); + machine.inputs.screenMap = machine.inputs.initMap; + + const slotMultipliersSystem = new SlotMultipliersSystem(machine); + slotMultipliersSystem.setSettings({ entityClass: SlotMultiplierEntity }); + machine.systems.slotMultipliers = slotMultipliersSystem; + // Apply story args to spin system and trigger spin + machine.systems.spin.setSettings(_params as any); + + const idleState = machine.stateMachine.states[STATES.IDLE]; + if (idleState && !idleState.systems.includes('slotMultipliers')) + { + idleState.systems.push('slotMultipliers'); + } + + const spinningState = machine.stateMachine.states[STATES.SPINNING]; + if (spinningState && !spinningState.systems.includes('slotMultipliers')) + { + spinningState.systems.push('slotMultipliers'); + } + + randomiseMultipliers(machine); + machine.inputs.spin = true; + + context.spinDelayMs = 0; + + centerView(view); + }, + resize: centerView, + update: () => { + const machine: HoldAndWinMachine | undefined = context.machine; + if (!machine) return; + + const dt = Ticker.shared.deltaMS; + machine.update(dt); + + const spinSystem = machine.systems.spin; + const prevState = context.prevSpinState ?? spinSystem.state; + + if (prevState !== spinSystem.state) + { + if (spinSystem.state === 'starting') + { + machine.inputs.spin = false; + } + + if (spinSystem.state === 'stopped') + { + context.spinDelayMs = 500; + } + + context.prevSpinState = spinSystem.state; + } + + if ((context.spinDelayMs ?? 0) > 0) + { + context.spinDelayMs -= dt; + + if (context.spinDelayMs <= 0) + { + randomiseMultipliers(machine); + machine.inputs.spin = true; + context.spinDelayMs = 0; + } + } + }, +}); diff --git a/src/stories/StaticReelSpinSystem.stories.ts b/src/stories/StaticReelSpinSystem.stories.ts new file mode 100644 index 0000000..eea0140 --- /dev/null +++ b/src/stories/StaticReelSpinSystem.stories.ts @@ -0,0 +1,69 @@ +import { Assets, Ticker } from 'pixi.js'; +import { Meta, PixiStory, StoryFn } from '@pixi/storybook-renderer'; +import StaticReelsMachine from '../slotMachines/StaticReelsMachine'; +import { argTypes, getDefaultArgs } from '../stories/utils/argTypes'; +import { createScreenInputMap } from '../stories/utils/createScreenInputMap'; +import MachineContainer from '../stories/utils/MachineContainer'; +import { centerView } from '../stories/utils/resize'; +import StaticReelsSpinSystem from '../systems/StaticReelsSpinSystem'; +import { SlotMachineConfig } from '../types/SlotMachineConfig'; +import MockSystem from "src/systems/MockSystem"; + +const args = { + reelDelay: 0.1, + slotDelay: 0.03, + refillDelay: 0.15, +}; + +const meta: Meta = { + title: 'Systems/StaticReelsSpinSystem', + tags: ['autodocs'], + parameters: { + docs: { + story: { + height: 600 + }, + description: { + component: 'Add doc' + }, + } + }, + argTypes: argTypes(args), + args: getDefaultArgs(args), +}; + +export default meta; + +export const StaticReelsSpinSystemStory: StoryFn = (_params, context) => new PixiStory({ + context, init: async (view) => + { + Assets.reset(); + await Assets.init({ + manifest: 'bubblex/manifest.json', + }); + await Assets.loadBundle('configs'); + await Assets.loadBundle('symbols'); + const config: SlotMachineConfig = Assets.get('slot_machine_config'); + const machine = new StaticReelsMachine(config); + const container = new MachineContainer(machine); + + view.addChild(container); + context.machine = machine; + machine.systems.blockExitState = new MockSystem(machine) + machine.inputs.initMap = createScreenInputMap(config); + machine.inputs.screenMap = createScreenInputMap(config); + machine.systems.spin.setSettings(_params); + machine.inputs.spin = true; + + machine.inputs.blockExitState = true; + setTimeout(() => { + machine.inputs.blockExitState = false; + }, 250); + centerView(view); + }, + resize: centerView, + update: () => + { + context.machine && context.machine.update(Ticker.shared.deltaMS); + } +}); diff --git a/src/stories/StickySymbolsSystem.stories.ts b/src/stories/StickySymbolsSystem.stories.ts new file mode 100644 index 0000000..5824344 --- /dev/null +++ b/src/stories/StickySymbolsSystem.stories.ts @@ -0,0 +1,137 @@ +import { Assets, Ticker } from 'pixi.js'; +import CascadeMachine from 'src/slotMachines/CascadeMachine'; +import ReelsMachine from 'src/slotMachines/ReelsMachine'; +import StaticReelsMachine from 'src/slotMachines/StaticReelsMachine'; +import { STATES } from 'src/states/BasicStateMachine'; +import { argTypes, getDefaultArgs } from 'src/stories/utils/argTypes'; +import { createScreenInputMap } from 'src/stories/utils/createScreenInputMap'; +import MachineContainer from 'src/stories/utils/MachineContainer'; +import { centerView } from 'src/stories/utils/resize'; +import StickySymbolsSystem from 'src/systems/StickySymbolsSystem'; +import { SlotMachineConfig } from 'src/types/SlotMachineConfig'; +import { Meta, PixiStory, StoryFn } from '@pixi/storybook-renderer'; +import MockSystem from "src/systems/MockSystem"; + +const args = { + zIndex: 5, +}; + +const meta: Meta = { + title: 'Systems/StickySpinSystem', + tags: ['autodocs'], + parameters: { + docs: { + story: { + height: 600 + }, + description: { + component: 'Controls the spinning behavior of slot machine reels, including acceleration, sustained spinning, and deceleration. This class manages reel state transitions, timing for each stage of the spin, and the display of symbols on each reel.' + }, + } + }, + argTypes: argTypes(args), + args: getDefaultArgs(args), +}; + +export default meta; + +export const ReelsMachineStory: StoryFn = (_params, context) => new PixiStory({ + context, init: async (view) => + { + Assets.reset(); + await Assets.init({ + manifest: 'area69/manifest.json', + }); + await Assets.loadBundle('configs'); + await Assets.loadBundle('symbols'); + const config: SlotMachineConfig = Assets.get('slot_machine_config'); + const machine = new ReelsMachine(config); + const container = new MachineContainer(machine); + + view.addChild(container); + context.machine = machine; + machine.systems.stick = new StickySymbolsSystem(machine); + machine.stateMachine.states[STATES.SPINNING].systems = ['spin', 'layering']; + machine.stateMachine.states.forEach((state) => state.systems.push('stick')); + machine.inputs.initMap = createScreenInputMap(config); + machine.inputs.screenMap = machine.inputs.initMap; + machine.maps.stickySymbols = machine.inputs.screenMap.map((s: any) => ['L', 'M', 'N'].includes(s.key)); + machine.systems.stick.setSettings(_params); + machine.inputs.spin = true; + machine.inputs.blockExitState = true; + setTimeout(() => { + machine.inputs.blockExitState = false; + }, 250); + centerView(view); + centerView(view); + centerView(view); + }, + resize: centerView, + update: () => + { + context.machine && context.machine.update(Ticker.shared.deltaMS); + } +}); + +export const CascadeMachineStory: StoryFn = (_params, context) => new PixiStory({ + context, init: async (view) => + { + Assets.reset(); + await Assets.init({ + manifest: 'bubblex/manifest.json', + }); + await Assets.loadBundle('configs'); + await Assets.loadBundle('symbols'); + const config: SlotMachineConfig = Assets.get('slot_machine_config'); + const machine = new CascadeMachine(config); + const container = new MachineContainer(machine); + + view.addChild(container); + context.machine = machine; + machine.systems.stick = new StickySymbolsSystem(machine); + machine.stateMachine.states[STATES.SPINNING].systems = ['stick', 'spin']; + machine.inputs.initMap = createScreenInputMap(config); + machine.inputs.screenMap = machine.inputs.initMap; + machine.maps.stickySymbols = machine.inputs.screenMap.map((s: any) => ["RR"].includes(s.key)); + machine.systems.stick.setSettings(_params); + machine.inputs.spin = true; + centerView(view); + }, + resize: centerView, + update: () => + { + context.machine && context.machine.update(Ticker.shared.deltaMS); + } +}); + +export const StaticReelsMachineStory: StoryFn = (_params, context) => new PixiStory({ + context, init: async (view) => + { + Assets.reset(); + await Assets.init({ + manifest: 'bubblex/manifest.json', + }); + await Assets.loadBundle('configs'); + await Assets.loadBundle('symbols'); + const config: SlotMachineConfig = Assets.get('slot_machine_config'); + const machine = new StaticReelsMachine(config); + const container = new MachineContainer(machine); + + view.addChild(container); + context.machine = machine; + machine.systems.blockExitState = new MockSystem(machine) + machine.systems.stick = new StickySymbolsSystem(machine); + machine.stateMachine.states[STATES.SPINNING].systems = ['stick', 'spin']; + machine.inputs.initMap = createScreenInputMap(config); + machine.inputs.screenMap = machine.inputs.initMap; + machine.maps.stickySymbols = machine.inputs.screenMap.map((s: any) => ["RR"].includes(s.key)); + machine.systems.stick.setSettings(_params); + machine.inputs.spin = true; + centerView(view); + }, + resize: centerView, + update: () => + { + context.machine && context.machine.update(Ticker.shared.deltaMS); + } +}); diff --git a/src/stories/WinSymbolSystem.stories.ts b/src/stories/WinSymbolSystem.stories.ts new file mode 100644 index 0000000..db2d6b5 --- /dev/null +++ b/src/stories/WinSymbolSystem.stories.ts @@ -0,0 +1,217 @@ +import { Assets, Ticker } from 'pixi.js'; +import { argTypes, getDefaultArgs } from 'src/stories/utils/argTypes'; +import { createScreenInputMap } from 'src/stories/utils/createScreenInputMap'; +import MachineContainer from 'src/stories/utils/MachineContainer'; +import { centerView } from 'src/stories/utils/resize'; +import ReelsSpinSystem from 'src/systems/ReelsSpinSystem'; +import { SlotMachineConfig } from 'src/types/SlotMachineConfig'; +import { Meta, PixiStory, StoryFn } from '@pixi/storybook-renderer'; +import ReelsMachine from '../slotMachines/ReelsMachine'; +import MockSystem from "../systems/MockSystem"; + +const args = { + key: 'A', // skin '10' + accelerationTime: 1, + backCoef: 1.1, + maxSpeed: 40, + reelStartDelay: 0.2, + reelStopDelay: 0.5, + spinningDuration: 2, + blur: true, + bounce: true +}; + +const meta: Meta = { + title: 'Systems/WinSymbolSystem', // Путь для отображения в Storybook + tags: ['autodocs'], // Включает автоматическую генерацию документации + parameters: { + docs: { + story: { + height: 600 + }, + description: { + component: 'Animation of win symbols and winlines, all and individual loop' + }, + } + }, + argTypes: argTypes(args), + args: getDefaultArgs(args), +}; + +export default meta; + + +const rawLines = [ + [0, 1, 0, 1, 0], + [0, 1, 1, 1, 0] +] +const lines = { + get: (index: number) => { + return rawLines[index] + }, + numberOfLines: () => 2, + lines: rawLines +} + +export const WinSymbolStory: StoryFn = (_params, context) => new PixiStory({ + context, init: async (view) => + { + Assets.reset(); + await Assets.init({ + manifest: 'area69/manifest.json', + }); + await Assets.loadBundle('configs'); + await Assets.loadBundle('symbols'); + const config: SlotMachineConfig = Assets.get('slot_machine_config'); + const machine = new ReelsMachine({...config, lines: lines.lines}); + machine.systems.spin.setSettings(_params); + const container = new MachineContainer(machine); + machine.systems.blockExitState = new MockSystem(machine) + view.addChild(container); + context.machine = machine; + machine.inputs.initMap = createScreenInputMap(config); + machine.inputs.screenMap = createScreenInputMap(config); + machine.inputs.wins = { + totalWin: 200, + totalWinString: '2.00 USD', + wins: [ + { + type: 'line', + amount: 100, + amountString: '1.00 USD', + lineSlotsIndexMap: [0, 1, 0], + lineIndex: 0 + }, + { + type: 'line', + amount: 100, + amountString: '1.00 USD', + lineSlotsIndexMap: [0, 1, 1], + lineIndex: 1 + } + ] + }; + + console.log(machine) + console.log(machine.inputs) + machine.inputs.spin = true; + centerView(view); + + }, + resize: centerView, + update: () => + { + context.machine && context.machine.update(Ticker.shared.deltaMS); + } +}); + +// export const WinStickSymbolStory: StoryFn = (_params, context) => new PixiStory({ +// context, init: async (view) => +// { +// Assets.reset(); +// await Assets.init({ +// manifest: 'area69/manifest.json', +// }); +// await Assets.loadBundle('configs'); +// await Assets.loadBundle('symbols'); +// const config: SlotMachineConfig = Assets.get('slot_machine_config'); +// const machine = new ReelsMachine({...config, lines: [ +// [0, 1, 0, 1, 0], +// [0, 1, 1, 1, 0] +// ] }); +// const container = new MachineContainer(machine); +// +// +// view.addChild(container); +// context.machine = machine; +// machine.inputs.initMap = createScreenInputMap(config); +// machine.inputs.screenMap = createScreenInputMap(config); +// machine.inputs.wins = [ +// { +// type: 'line', +// amount: 100, +// amountString: '1.00 USD', +// lineSlotsIndexMap: [0, 1, 0], +// lineIndex: 0 +// }, +// { +// type: 'line', +// amount: 100, +// amountString: '1.00 USD', +// lineSlotsIndexMap: [0, 1, 1], +// lineIndex: 1 +// } +// ] +// machine.stateMachine.states[STATES.SPINNING].systems = ['spin', 'layering', 'stick']; +// machine.systems.stick = new StickySymbolsSystem(machine); +// machine.systems.stick.setSettings(_params); +// machine.systems.spin.setSettings(_params); +// // machine.systems.allWinSymbols.setSettings(winSymbolSettings); +// // machine.systems.winningLinesLoop.setSettings(winSymbolSettings); +// +// machine.inputs.blockExitState = true; +// setTimeout(() => { +// machine.inputs.blockExitState = false; +// }, 250); +// +// centerView(view); +// }, +// resize: centerView, +// update: () => +// { +// context.machine && context.machine.update(Ticker.shared.deltaMS); +// } +// }); +// +// export const WinStickExpandingSymbolStory: StoryFn = (_params, context) => new PixiStory({ +// context, init: async (view) => +// { +// Assets.reset(); +// await Assets.init({ +// manifest: 'area69/manifest.json', +// }); +// await Assets.loadBundle('configs'); +// await Assets.loadBundle('symbols'); +// const config: SlotMachineConfig = Assets.get('slot_machine_config'); +// const machine = new ReelsMachine(config); +// const container = new MachineContainer(machine); +// const winSymbolSettings = { +// lines: [[0, 1, 0, 1, 0], [3, 2, 3, 2, 3]], +// hideWinline: false, +// winlineAnimationClass: WinLine, +// basicWinClass: BasicWin, +// }; +// const spin = () => +// { +// machine.inputs.spin = true; +// setTimeout(() => { machine.inputs.spin = false; }, 1000); +// setTimeout(spin, 10000); +// }; +// +// view.addChild(container); +// context.machine = machine; +// machine.inputs.initMap = createScreenInputMap(config); +// machine.inputs.screenMap = createScreenInputMap(config); +// machine.inputs.wins = [['line', 100, [0, 1, 0], 0], ['line', 100, [3, 2, 3], 1]]; +// machine.inputs.celebrateSymbolIndexes = [0, 1, 5]; +// machine.stateMachine.states[STATES.SPINNING].systems = ['spin', 'layering', 'stick', 'expanding']; +// machine.systems.expanding = new ExpandedSymbolsSpinSystem(machine); +// machine.systems.stick = new StickySymbolsSystem(machine); +// machine.systems.expanding.setSettings(_params); +// machine.systems.stick.setSettings(_params); +// machine.systems.spin.setSettings(_params); +// machine.systems.allWinSymbols.setSettings(winSymbolSettings); +// machine.systems.winningLinesLoop.setSettings(winSymbolSettings); +// machine.inputs.blockExitState = true; +// setTimeout(() => { +// machine.inputs.blockExitState = false; +// }, 250); +// centerView(view); +// spin(); +// }, +// resize: centerView, +// update: () => +// { +// context.machine && context.machine.update(Ticker.shared.deltaMS); +// } +// }); diff --git a/src/stories/assets/area69/anticipation/anticipation.atlas b/src/stories/assets/area69/anticipation/anticipation.atlas new file mode 100644 index 0000000..f809156 --- /dev/null +++ b/src/stories/assets/area69/anticipation/anticipation.atlas @@ -0,0 +1,19 @@ +anticipation.webp +size:2048,1024 +filter:Linear,Linear +scale:0.75 +anticip_bg +bounds:777,30,220,836 +offsets:319,27,858,879 +anticip_circle_whole_source_1.4 +bounds:999,463,404,403 +offsets:429,445,858,879 +anticip_frame +bounds:291,27,262,839 +offsets:297,20,858,879 +anticip_frame_glow +bounds:2,2,287,864 +offsets:285,7,858,879 +anticip_glow +bounds:555,29,220,837 +offsets:319,27,858,879 diff --git a/src/stories/assets/area69/anticipation/anticipation.webp b/src/stories/assets/area69/anticipation/anticipation.webp new file mode 100644 index 0000000..f4bfa85 Binary files /dev/null and b/src/stories/assets/area69/anticipation/anticipation.webp differ diff --git a/src/stories/assets/area69/anticipation/anticipation_back.skel b/src/stories/assets/area69/anticipation/anticipation_back.skel new file mode 100644 index 0000000..168ca47 Binary files /dev/null and b/src/stories/assets/area69/anticipation/anticipation_back.skel differ diff --git a/src/stories/assets/area69/anticipation/anticipation_front.skel b/src/stories/assets/area69/anticipation/anticipation_front.skel new file mode 100644 index 0000000..8464c33 Binary files /dev/null and b/src/stories/assets/area69/anticipation/anticipation_front.skel differ diff --git a/src/stories/assets/area69/bitmapFonts/multiplier_value_font.fnt b/src/stories/assets/area69/bitmapFonts/multiplier_value_font.fnt new file mode 100644 index 0000000..83a2d6f --- /dev/null +++ b/src/stories/assets/area69/bitmapFonts/multiplier_value_font.fnt @@ -0,0 +1,16 @@ +info face="multiplier_value_font" size=90 bold=0 italic=0 charset="" unicode=1 stretchH=100 smooth=1 aa=1 padding=1,1,1,1 spacing=1,1 +common lineHeight=104 base=83 scaleW=218 scaleH=218 pages=1 packed=0 +page id=0 file="multiplier_value_font.png" +chars count=12 +char id=32 x=0 y=0 width=0 height=0 xoffset=0 yoffset=0 xadvance=26 page=0 chnl=15 +char id=48 x=167 y=0 width=51 height=71 xoffset=-1 yoffset=-1 xadvance=49 page=0 chnl=15 +char id=49 x=0 y=74 width=42 height=72 xoffset=-1 yoffset=-1 xadvance=41 page=0 chnl=15 +char id=50 x=0 y=147 width=52 height=71 xoffset=-1 yoffset=-1 xadvance=50 page=0 chnl=15 +char id=51 x=53 y=147 width=42 height=71 xoffset=0 yoffset=0 xadvance=41 page=0 chnl=15 +char id=52 x=143 y=147 width=54 height=69 xoffset=-1 yoffset=-1 xadvance=52 page=0 chnl=15 +char id=53 x=96 y=147 width=46 height=71 xoffset=-1 yoffset=-1 xadvance=44 page=0 chnl=15 +char id=54 x=0 y=0 width=56 height=73 xoffset=-1 yoffset=-1 xadvance=54 page=0 chnl=15 +char id=55 x=43 y=74 width=50 height=69 xoffset=-1 yoffset=-1 xadvance=48 page=0 chnl=15 +char id=56 x=57 y=0 width=52 height=73 xoffset=-1 yoffset=-1 xadvance=50 page=0 chnl=15 +char id=57 x=110 y=0 width=56 height=73 xoffset=-1 yoffset=-1 xadvance=54 page=0 chnl=15 +char id=88 x=94 y=74 width=55 height=63 xoffset=-1 yoffset=8 xadvance=54 page=0 chnl=15 diff --git a/src/stories/assets/area69/bitmapFonts/multiplier_value_font.png b/src/stories/assets/area69/bitmapFonts/multiplier_value_font.png new file mode 100644 index 0000000..b450bbf Binary files /dev/null and b/src/stories/assets/area69/bitmapFonts/multiplier_value_font.png differ diff --git a/src/stories/assets/area69/bitmapFonts/wild_multiplier_font.fnt b/src/stories/assets/area69/bitmapFonts/wild_multiplier_font.fnt new file mode 100644 index 0000000..8c10405 --- /dev/null +++ b/src/stories/assets/area69/bitmapFonts/wild_multiplier_font.fnt @@ -0,0 +1,16 @@ +info face="wild_multiplier_font" size=90 bold=0 italic=0 charset="" unicode=1 stretchH=100 smooth=1 aa=1 padding=1,1,1,1 spacing=1,1 +common lineHeight=104 base=83 scaleW=209 scaleH=218 pages=1 packed=0 +page id=0 file="wild_multiplier_font.png" +chars count=12 +char id=32 x=0 y=0 width=0 height=0 xoffset=0 yoffset=0 xadvance=26 page=0 chnl=15 +char id=48 x=0 y=0 width=53 height=73 xoffset=-1 yoffset=-1 xadvance=51 page=0 chnl=15 +char id=49 x=166 y=0 width=43 height=72 xoffset=-1 yoffset=-1 xadvance=41 page=0 chnl=15 +char id=50 x=150 y=74 width=53 height=71 xoffset=-1 yoffset=-1 xadvance=51 page=0 chnl=15 +char id=51 x=58 y=74 width=43 height=72 xoffset=-1 yoffset=-1 xadvance=41 page=0 chnl=15 +char id=52 x=0 y=148 width=55 height=70 xoffset=-1 yoffset=-1 xadvance=53 page=0 chnl=15 +char id=53 x=102 y=74 width=47 height=72 xoffset=-1 yoffset=-1 xadvance=45 page=0 chnl=15 +char id=54 x=54 y=0 width=57 height=73 xoffset=-1 yoffset=-1 xadvance=55 page=0 chnl=15 +char id=55 x=56 y=148 width=51 height=70 xoffset=-1 yoffset=-1 xadvance=49 page=0 chnl=15 +char id=56 x=112 y=0 width=53 height=73 xoffset=-1 yoffset=-1 xadvance=51 page=0 chnl=15 +char id=57 x=0 y=74 width=57 height=73 xoffset=-1 yoffset=-1 xadvance=55 page=0 chnl=15 +char id=88 x=108 y=148 width=56 height=64 xoffset=-1 yoffset=8 xadvance=55 page=0 chnl=15 diff --git a/src/stories/assets/area69/bitmapFonts/wild_multiplier_font.png b/src/stories/assets/area69/bitmapFonts/wild_multiplier_font.png new file mode 100644 index 0000000..a893f6c Binary files /dev/null and b/src/stories/assets/area69/bitmapFonts/wild_multiplier_font.png differ diff --git a/src/stories/assets/area69/configs/slotMachine.json b/src/stories/assets/area69/configs/slotMachine.json new file mode 100644 index 0000000..0907822 --- /dev/null +++ b/src/stories/assets/area69/configs/slotMachine.json @@ -0,0 +1,111 @@ +{ + "width": 550, + "height": 420, + "reels": 5, + "slots": 4, + "paddings": { + "left": 16, + "top": 0, + "right": 18, + "bottom": 0 + }, + "symbolsKeys": ["L", "J", "I", "H", "G", "F", "E", "D", "C", "B", "A", "K", "M", "N"], + "symbols": { + "A": { + "key": "A", + "spine": "lowest_symbols", + "skin": "Ten", + "zIndex": 1 + }, + "B": { + "key": "B", + "spine": "lowest_symbols", + "skin": "J", + "zIndex": 1 + }, + "C": { + "key": "C", + "spine": "lowest_symbols", + "skin": "Q", + "zIndex": 1 + }, + "D": { + "key": "D", + "spine": "low_symbols", + "skin": "K", + "zIndex": 1 + }, + "E": { + "key": "E", + "spine": "low_symbols", + "skin": "A", + "zIndex": 1 + }, + "F": { + "key": "F", + "spine": "h5", + "skin": "default", + "zIndex": 1 + }, + "G": { + "key": "G", + "spine": "h4", + "skin": "default", + "zIndex": 1 + }, + "H": { + "key": "H", + "spine": "h3", + "skin": "default", + "zIndex": 1 + }, + "I": { + "key": "I", + "spine": "h2", + "skin": "default", + "zIndex": 1 + }, + "J": { + "key": "J", + "spine": "h1", + "skin": "default", + "zIndex": 1 + }, + "K": { + "key": "K", + "spine": "scatter", + "skin": "default", + "zIndex": 2 + }, + "L": { + "key": "L", + "spine": "wild", + "skin": "low", + "fontStyle": { + "fontSize": 30, + "fontName": "wild_multiplier_font" + }, + "zIndex": 3 + }, + "M": { + "key": "M", + "spine": "wild", + "skin": "med", + "fontStyle": { + "fontSize": 30, + "fontName": "wild_multiplier_font" + }, + "zIndex": 3 + }, + "N": { + "key": "N", + "spine": "wild", + "skin": "high", + "fontStyle": { + "fontSize": 30, + "fontName": "wild_multiplier_font" + }, + "zIndex": 3 + } + } +} diff --git a/src/stories/assets/area69/manifest.json b/src/stories/assets/area69/manifest.json new file mode 100644 index 0000000..7a4abfa --- /dev/null +++ b/src/stories/assets/area69/manifest.json @@ -0,0 +1,146 @@ +{ + "bundles": [ + { + "name": "configs", + "assets": [ + { + "name": "slot_machine_config", + "srcs": "area69/configs/slotMachine.json" + } + ] + }, + { + "name":"symbols", + "assets":[ + { + "name": "wild_multiplier_font", + "srcs": "area69/bitmapFonts/wild_multiplier_font.fnt" + }, + { + "name": "symbols_atlas", + "srcs": "area69/symbols/symbols.atlas" + }, + { + "name": "wild", + "srcs": "area69/symbols/wild.skel", + "data": { + "spineSkeletonScale": 0.35, + "spineAtlasAlias": "symbols_atlas", + "spineAtlasFile": "area69/symbols/symbols.atlas" + } + }, + { + "name": "scatter", + "srcs": "area69/symbols/scatter.skel", + "data": { + "spineSkeletonScale": 0.5, + "spineAtlasAlias": "symbols_atlas", + "spineAtlasFile": "area69/symbols/symbols.atlas" + } + }, + { + "name": "lowest_symbols", + "srcs": "area69/symbols/L_10_q_j.skel", + "data": { + "spineSkeletonScale": 0.35, + "spineAtlasAlias": "symbols_atlas", + "spineAtlasFile": "area69/symbols/symbols.atlas" + } + }, + { + "name": "low_symbols", + "srcs": "area69/symbols/L_A_K.skel", + "data": { + "spineSkeletonScale": 0.35, + "spineAtlasAlias": "symbols_atlas", + "spineAtlasFile": "area69/symbols/symbols.atlas" + } + }, + { + "name": "h5", + "srcs": "area69/symbols/M3.skel", + "data": { + "spineSkeletonScale": 0.45, + "spineAtlasAlias": "symbols_atlas", + "spineAtlasFile": "area69/symbols/symbols.atlas" + } + }, + { + "name": "h4", + "srcs": "area69/symbols/M2.skel", + "data": { + "spineSkeletonScale": 0.4, + "spineAtlasAlias": "symbols_atlas", + "spineAtlasFile": "area69/symbols/symbols.atlas" + } + }, + { + "name": "h3", + "srcs": "area69/symbols/M1.skel", + "data": { + "spineSkeletonScale": 0.35, + "spineAtlasAlias": "symbols_atlas", + "spineAtlasFile": "area69/symbols/symbols.atlas" + } + }, + { + "name": "h2", + "srcs": "area69/symbols/H2.skel", + "data": { + "spineSkeletonScale": 0.5, + "spineAtlasAlias": "symbols_atlas", + "spineAtlasFile": "area69/symbols/symbols.atlas" + } + }, + { + "name": "h1", + "srcs": "area69/symbols/H1.skel", + "data": { + "spineSkeletonScale": 0.5, + "spineAtlasAlias": "symbols_atlas", + "spineAtlasFile": "area69/symbols/symbols.atlas" + } + }, + { + "name": "expanding", + "srcs": "area69/symbols/expanding_multiplier.skel", + "data": { + "spineSkeletonScale": 0.5, + "spineAtlasAlias": "symbols_atlas", + "spineAtlasFile": "area69/symbols/symbols.atlas" + } + }, + { + "name": "win_line", + "srcs": "area69/winline/win_line.skel", + "data": { + "spineAtlasAlias": "main_atlas", + "spineAtlasFile": "area69/winline/assembly.atlas" + } + }, + { + "name": "win_frame", + "srcs": "area69/textures/win_frame.png" + }, + { + "name": "anticipation_back", + "srcs": "area69/anticipation/anticipation_back.skel", + "data": { + "spineSkeletonScale": 0.4, + "spineAtlasAlias": "anticipation", + "spineAtlasFile": "area69/anticipation/anticipation.atlas" + } + }, + { + "name": "anticipation_front", + "srcs": "area69/anticipation/anticipation_front.skel", + "data": { + "spineSkeletonScale": 0.4, + "spineAtlasAlias": "anticipation", + "spineAtlasFile": "area69/anticipation/anticipation.atlas" + } + } + ] + } + ] +} diff --git a/src/stories/assets/area69/symbols/H1.skel b/src/stories/assets/area69/symbols/H1.skel new file mode 100644 index 0000000..e806d21 Binary files /dev/null and b/src/stories/assets/area69/symbols/H1.skel differ diff --git a/src/stories/assets/area69/symbols/H2.skel b/src/stories/assets/area69/symbols/H2.skel new file mode 100644 index 0000000..b1ef5e0 Binary files /dev/null and b/src/stories/assets/area69/symbols/H2.skel differ diff --git a/src/stories/assets/area69/symbols/L_10_q_j.skel b/src/stories/assets/area69/symbols/L_10_q_j.skel new file mode 100644 index 0000000..8b2a24d Binary files /dev/null and b/src/stories/assets/area69/symbols/L_10_q_j.skel differ diff --git a/src/stories/assets/area69/symbols/L_A_K.skel b/src/stories/assets/area69/symbols/L_A_K.skel new file mode 100644 index 0000000..aad48db Binary files /dev/null and b/src/stories/assets/area69/symbols/L_A_K.skel differ diff --git a/src/stories/assets/area69/symbols/M1.skel b/src/stories/assets/area69/symbols/M1.skel new file mode 100644 index 0000000..f7b4861 Binary files /dev/null and b/src/stories/assets/area69/symbols/M1.skel differ diff --git a/src/stories/assets/area69/symbols/M2.skel b/src/stories/assets/area69/symbols/M2.skel new file mode 100644 index 0000000..e71bcdd Binary files /dev/null and b/src/stories/assets/area69/symbols/M2.skel differ diff --git a/src/stories/assets/area69/symbols/M3.skel b/src/stories/assets/area69/symbols/M3.skel new file mode 100644 index 0000000..3121a14 Binary files /dev/null and b/src/stories/assets/area69/symbols/M3.skel differ diff --git a/src/stories/assets/area69/symbols/expanding_multiplier.skel b/src/stories/assets/area69/symbols/expanding_multiplier.skel new file mode 100644 index 0000000..9c9377e Binary files /dev/null and b/src/stories/assets/area69/symbols/expanding_multiplier.skel differ diff --git a/src/stories/assets/area69/symbols/scatter.skel b/src/stories/assets/area69/symbols/scatter.skel new file mode 100644 index 0000000..9935398 Binary files /dev/null and b/src/stories/assets/area69/symbols/scatter.skel differ diff --git a/src/stories/assets/area69/symbols/symbols.atlas b/src/stories/assets/area69/symbols/symbols.atlas new file mode 100644 index 0000000..76ab2ca --- /dev/null +++ b/src/stories/assets/area69/symbols/symbols.atlas @@ -0,0 +1,526 @@ +symbols.webp +size:3236,2056 +filter:Linear,Linear +103_S +bounds:223,1060,258,241 +rotate:90 +10_newspaper1_l +bounds:2296,893,157,220 +10_newspaper2_r +bounds:1876,1144,149,211 +rotate:90 +2(Effect) +bounds:2229,307,214,208 +rotate:90 +3(Effect) +bounds:2202,523,214,209 +A3_S +bounds:2400,1116,295,306 +A_newspaper1_l +bounds:1091,1110,188,284 +rotate:90 +A_newspaper2_r +bounds:3011,1453,187,280 +DiscoBall_1_1 +bounds:241,107,307,309 +DiscoBall_1_2 +bounds:550,107,307,309 +DiscoBall_1_3 +bounds:867,789,307,309 +DiscoBall_1_4 +bounds:1153,1300,307,309 +rotate:90 +DiscoBall_1_5 +bounds:1176,799,307,309 +DiscoBall_1_6 +bounds:1464,1300,307,309 +rotate:90 +DiscoBall_1_sequins +bounds:843,1736,348,318 +DiscoBall_2_1 +bounds:1775,1424,307,309 +DiscoBall_2_2 +bounds:2084,1424,307,309 +DiscoBall_2_3 +bounds:2393,1424,307,309 +DiscoBall_2_4 +bounds:2702,1424,307,309 +DiscoBall_2_5 +bounds:1485,799,307,309 +DiscoBall_2_6 +bounds:2089,1115,307,309 +rotate:90 +DiscoBall_2_sequins +bounds:1193,1736,348,318 +DiscoBall_3_1 +bounds:864,364,296,297 +rotate:90 +DiscoBall_3_2 +bounds:859,66,296,297 +rotate:90 +DiscoBall_3_3 +bounds:1179,501,296,297 +rotate:90 +DiscoBall_3_4 +bounds:1478,501,296,297 +rotate:90 +DiscoBall_3_5 +bounds:1163,203,296,297 +rotate:90 +DiscoBall_3_6 +bounds:1462,203,296,297 +rotate:90 +DiscoBall_3_sequins +bounds:489,1381,349,319 +Electricity_m2_00 +bounds:1543,1735,328,319 +Electricity_m2_01 +bounds:1873,1735,328,319 +Electricity_m2_03 +bounds:2203,1735,328,319 +Electricity_m2_04 +bounds:2533,1735,328,319 +Electricity_m2_06 +bounds:2863,1735,328,319 +Electricity_m2_07 +bounds:489,1060,328,319 +Electricity_m2_09 +bounds:216,739,328,319 +Electricity_m2_10 +bounds:216,418,328,319 +Electricity_m2_12 +bounds:546,730,328,319 +rotate:90 +H1_BG +bounds:840,1309,300,311 +rotate:90 +H1_button +bounds:830,93,12,27 +rotate:90 +H1_cigar +bounds:1724,1110,53,32 +H1_cigar _S +bounds:2694,356,51,32 +rotate:90 +H1_collar_3 +bounds:3028,342,71,58 +H1_collar_L_2 +bounds:2866,284,46,87 +rotate:90 +H1_collar_R_1 +bounds:2775,564,55,117 +rotate:90 +H1_eyes +bounds:2049,8,109,37 +H1_finger_1 +bounds:2993,135,73,38 +H1_finger_2 +bounds:45,7,61,29 +H1_finger_3 +bounds:3099,422,79,87 +H1_hand +bounds:2855,445,54,117 +H1_head +bounds:2224,2,152,182 +rotate:90 +H1_horns +bounds:2694,409,153,67 +rotate:90 +H1_neck +bounds:2442,189,189,141 +H1_shirt +bounds:1750,34,144,100 +rotate:90 +H1_sleeve_L_2 +bounds:3055,2,49,63 +H1_sleeve_R_1 +bounds:3100,287,50,72 +rotate:90 +H2_BG +bounds:2697,1118,294,304 +H2_brows +bounds:241,2,91,51 +H2_collar _2 +bounds:1928,2,38,119 +rotate:90 +H2_collar_top_1 +bounds:2894,581,108,120 +H2_curler +bounds:3104,232,67,53 +H2_ear +bounds:2408,2,138,152 +H2_earring_L_1 +bounds:2,2,34,41 +rotate:90 +H2_earring_R_2 +bounds:1610,1609,37,41 +H2_eyelid_L_2 +bounds:1182,2,36,25 +H2_eyelid_L_top_1 +bounds:1906,6,28,20 +rotate:90 +H2_eyelid_R_4 +bounds:3007,479,21,19 +offsets:2,0,23,19 +rotate:90 +H2_eyelid_R_top_3 +bounds:466,1293,25,21 +offsets:0,1,25,22 +rotate:90 +H2_glasses_L_1 +bounds:2993,175,78,55 +H2_glasses_R_3 +bounds:3180,372,54,57 +H2_hair_L_1 +bounds:2633,215,139,137 +rotate:90 +H2_hair_L_S_2 +bounds:2990,72,61,63 +offsets:2,0,66,64 +rotate:90 +H2_hair_R_2 +bounds:2772,215,84,89 +rotate:90 +H2_hand_L_1 +bounds:3007,502,82,117 +H2_hand_R_2 +bounds:2911,467,94,112 +H2_hat_1 +bounds:2620,564,153,158 +H2_hat_S_2 +bounds:2763,429,133,90 +rotate:90 +H2_head_S +bounds:3028,402,98,69 +rotate:90 +H2_mouth_3 +bounds:3004,2,29,24 +H2_mouth_bottom_2 +bounds:2479,156,31,23 +rotate:90 +H2_mouth_top_1 +bounds:1220,2,35,25 +H2_neck_1 +bounds:2675,2,71,112 +rotate:90 +H2_nose +bounds:2160,5,40,55 +rotate:90 +H2_protein_L_2 +bounds:3091,592,27,23 +rotate:90 +H2_protein_R_4 +bounds:2708,724,24,20 +H2_pupil_L_1 +bounds:1163,644,14,16 +H2_pupil_R_3 +bounds:2941,885,13,15 +rotate:90 +H2_robe +bounds:571,5,257,100 +H2_robe_S +bounds:3173,207,76,61 +rotate:90 +H2_sleeve_L_1 +bounds:1473,1609,68,41 +H2_sleeve_R_2 +bounds:3101,339,81,60 +rotate:90 +J_newspaper1_l +bounds:2226,734,157,220 +rotate:90 +J_newspaper2_r +bounds:1663,1144,149,211 +rotate:90 +K_newspaper1_l +bounds:1377,1110,188,284 +rotate:90 +K_newspaper2_r +bounds:1468,14,187,280 +rotate:90 +M1_BG +bounds:1996,47,219,226 +rotate:90 +M1_backpack +bounds:2796,88,78,125 +M1_backpackHandle +bounds:2772,301,92,126 +M1_body +bounds:2675,75,138,119 +rotate:90 +M1_effect_00604 +bounds:2993,1191,241,231 +M1_effect_00605 +bounds:2993,958,241,231 +M1_effect_00606 +bounds:1794,911,241,231 +M1_effect_00607 +bounds:2455,883,241,231 +M1_effect_00608 +bounds:2698,885,241,231 +M1_effect_00609 +bounds:2993,725,241,231 +M1_effect_00610 +bounds:1959,511,241,231 +M1_effect_00611 +bounds:1996,268,241,231 +rotate:90 +M1_hand_L_1 +bounds:3116,655,68,118 +rotate:90 +M1_hand_L_2 +bounds:3180,431,54,78 +M1_hand_L_3 +bounds:475,2,51,65 +rotate:90 +M1_hand_L_S +bounds:2894,703,69,97 +rotate:90 +M1_hand_R_1 +bounds:3005,232,53,97 +rotate:90 +M1_hand_R_2 +bounds:2876,122,55,101 +offsets:0,0,55,103 +M1_hand_R_3 +bounds:3174,285,85,60 +rotate:90 +M1_head +bounds:2548,26,125,161 +offsets:0,0,126,161 +M1_visor +bounds:2944,359,82,106 +offsets:0,2,82,108 +M2_detail_1 +bounds:3155,107,44,48 +M2_detail_2 +bounds:2884,774,107,109 +M2_detail_3 +bounds:2037,905,208,257 +rotate:90 +M3_can +bounds:819,1100,207,270 +offsets:0,0,215,270 +rotate:90 +M3_handle +bounds:2948,27,50,37 +rotate:90 +M3_pict +bounds:2775,621,123,117 +rotate:90 +M3_pict_rays +bounds:2439,332,180,203 +Q_newspaper1_l +bounds:2448,724,157,220 +rotate:90 +Q_newspaper2_r +bounds:2229,156,149,211 +rotate:90 +X2 +bounds:2866,332,111,76 +offsets:0,1,111,77 +rotate:90 +X200 +bounds:2621,356,206,71 +rotate:90 +bg +bounds:2,369,212,838 +chick_S +bounds:334,7,139,46 +chick_beak +bounds:216,380,36,23 +rotate:90 +chick_beard +bounds:2911,445,20,30 +rotate:90 +chick_body +bounds:2789,2,93,71 +chick_brows +bounds:3127,1433,44,18 +chick_eyelids +bounds:3163,382,38,15 +rotate:90 +chick_eyes +bounds:2504,158,37,29 +chick_hair +bounds:3073,177,66,53 +offsets:0,1,66,54 +chick_leg_l +bounds:3204,517,28,30 +rotate:90 +chick_leg_r +bounds:2670,724,36,20 +chick_neck +bounds:2933,138,58,85 +chick_puppil +bounds:3141,180,28,12 +chick_tail +bounds:1425,9,39,73 +offsets:0,0,39,74 +chick_wing_l +bounds:3106,72,47,61 +chick_wing_r +bounds:3106,17,49,53 +cow_S +bounds:1158,29,218,53 +cow_bell +bounds:3141,194,28,36 +cow_body +bounds:2670,746,135,134 +offsets:0,0,140,134 +rotate:90 +cow_collar +bounds:1543,1609,65,41 +cow_ear_l +bounds:3204,547,43,30 +rotate:90 +cow_ear_r +bounds:1852,2,52,32 +cow_eye +bounds:164,2,34,18 +rotate:90 +cow_eyelids +bounds:1143,2,37,25 +cow_foot_back_l +bounds:2863,225,57,90 +offsets:0,1,57,91 +rotate:90 +cow_foot_back_r +bounds:2948,2,23,54 +rotate:90 +cow_foot_front_l +bounds:2955,253,48,104 +cow_foot_front_r +bounds:2728,357,35,50 +cow_hair +bounds:2037,1115,42,27 +cow_hay +bounds:3011,1428,114,23 +cow_head +bounds:1852,36,74,139 +cow_mouth +bounds:2876,76,62,44 +cow_mouth_1 +bounds:2633,189,37,24 +cow_pupil +bounds:3225,179,26,9 +rotate:90 +cow_tail +bounds:2940,79,57,48 +rotate:90 +cow_udder +bounds:3055,67,66,49 +rotate:90 +effect_shine +bounds:489,1702,352,352 +eyelid_l_top2 +bounds:1959,488,35,21 +eyelid_r_top2 +bounds:819,1353,26,19 +rotate:90 +frame +bounds:2,1209,219,845 +glow2 +bounds:2418,537,185,200 +rotate:90 +hand_l_2 +bounds:2806,756,76,127 +hand_r_2 +bounds:1928,42,57,130 +offsets:0,1,57,131 +m3_l +bounds:1378,2,45,80 +m3_r +bounds:3005,287,53,93 +rotate:90 +pig_S +bounds:2941,900,216,50 +rotate:90 +pig_body +bounds:1794,799,175,110 +pig_brows +bounds:2548,6,45,18 +pig_ear_l +bounds:3068,135,49,38 +pig_ear_r +bounds:1663,1110,59,32 +pig_eyelids +bounds:1649,1615,35,17 +rotate:90 +pig_eyes +bounds:819,1063,45,35 +pig_head +bounds:3004,621,110,102 +pig_leg_back_l +bounds:2442,156,31,35 +rotate:90 +pig_leg_back_r +bounds:3116,592,61,117 +rotate:90 +pig_leg_front_l +bounds:2987,28,42,66 +rotate:90 +pig_leg_front_r +bounds:2884,10,62,64 +pig_mouth +bounds:542,3,50,26 +rotate:90 +pig_nose +bounds:3157,60,44,45 +pig_puppil +bounds:1750,16,31,16 +pig_ribbon +bounds:3091,511,111,79 +pig_tail +bounds:108,3,33,54 +rotate:90 +plate_bg +bounds:546,418,310,316 +offsets:0,0,311,318 +rotate:90 +plate_plate +bounds:2,38,329,237 +offsets:0,0,329,243 +rotate:90 +plate_txt +bounds:1473,1652,198,81 +ray +bounds:223,1320,264,734 +scroll +bounds:241,55,328,50 +ship +bounds:1971,744,253,159 +smoke +bounds:1673,1630,95,103 +wild_ring_1 +bounds:867,662,310,125 +wild_ring_10 +bounds:1159,1609,312,125 +wild_ring_11 +bounds:843,1611,314,123 +wild_ring_12 +bounds:1775,1295,312,127 +wild_ring_2 +bounds:1777,489,308,97 +rotate:90 +wild_ring_3 +bounds:1864,177,309,76 +rotate:90 +wild_ring_4 +bounds:1942,174,312,52 +rotate:90 +wild_ring_5 +bounds:3193,1741,313,28 +rotate:90 +wild_ring_6 +bounds:830,7,311,57 +wild_ring_7 +bounds:1876,488,309,81 +rotate:90 +wild_ring_8 +bounds:1761,180,307,101 +rotate:90 +wild_ring_9 +bounds:1158,84,308,117 +wild_rope +bounds:3171,157,52,48 diff --git a/src/stories/assets/area69/symbols/symbols.webp b/src/stories/assets/area69/symbols/symbols.webp new file mode 100644 index 0000000..8197616 Binary files /dev/null and b/src/stories/assets/area69/symbols/symbols.webp differ diff --git a/src/stories/assets/area69/symbols/wild.skel b/src/stories/assets/area69/symbols/wild.skel new file mode 100644 index 0000000..27673ea Binary files /dev/null and b/src/stories/assets/area69/symbols/wild.skel differ diff --git a/src/stories/assets/area69/textures/win_frame.png b/src/stories/assets/area69/textures/win_frame.png new file mode 100644 index 0000000..980c842 Binary files /dev/null and b/src/stories/assets/area69/textures/win_frame.png differ diff --git a/src/stories/assets/area69/winline/assembly.atlas b/src/stories/assets/area69/winline/assembly.atlas new file mode 100644 index 0000000..01d183d --- /dev/null +++ b/src/stories/assets/area69/winline/assembly.atlas @@ -0,0 +1,279 @@ +assembly.webp +size:2399,2390 +filter:Linear,Linear +Abduction_15 +bounds:1404,1545,211,191 +offsets:1,2,214,195 +Abduction_ABDUCTION_txt +bounds:2,543,587,237 +Abduction_ALIEN_txt +bounds:716,1773,301,161 +Abduction_FREE SPINS_txt +bounds:1399,1290,668,199 +Abduction_bg_Llight +bounds:1439,577,247,417 +rotate:90 +Abduction_bg_Lplate +bounds:281,1645,273,180 +Abduction_bg_Mlight +bounds:1304,327,248,473 +rotate:90 +Abduction_bg_Mplate +bounds:943,1157,335,203 +Abduction_bg_Rlight +bounds:677,698,239,445 +rotate:90 +Abduction_bg_Rplate +bounds:2,1677,277,167 +Abduction_chick +bounds:1481,1917,151,205 +rotate:90 +Abduction_cow +bounds:2,784,238,291 +rotate:90 +Abduction_pig +bounds:2069,1196,234,230 +HANGOVER_txt +bounds:1280,1078,513,210 +Hangover_DiscoBall_1_sequins +bounds:2,1459,237,216 +Hangover_DiscoBall_2_sequins +bounds:1795,1054,234,236 +rotate:90 +Hangover_DiscoBall_3_sequins +bounds:2088,1428,239,219 +Hangover_X2 +bounds:458,2316,85,60 +Hangover_X20 +bounds:847,2300,124,61 +Hangover_X200 +bounds:304,2319,152,57 +Hangover_ball_1 +bounds:2,2,284,342 +rotate:90 +Hangover_ball_2 +bounds:2070,188,277,323 +rotate:90 +PRESS ANYWHERE TO CONTINUE +bounds:719,2363,471,25 +bg_hangar +bounds:1162,855,400,221 +offsets:1,2,402,224 +bg_paper_angle +bounds:952,2084,250,115 +bg_paper_angle_S +bounds:1054,2201,192,88 +bg_pict_S +bounds:2103,1649,179,258 +rotate:90 +bg_sattelite +bounds:774,939,386,216 +offsets:1,1,432,218 +bubble1 +bounds:1192,2363,25,25 +bubbles3 +bounds:1725,2344,44,44 +buildings_dark +bounds:2,1236,939,160 +offsets:1,3,940,163 +carS_all +bounds:584,2369,133,19 +car_all +bounds:2,2143,297,104 +car_wheel_front1_all +bounds:2,2323,53,53 +car_wheel_front2_all +bounds:2,2323,53,53 +glow2 +bounds:241,1417,226,243 +rotate:90 +gold_star +bounds:2285,2137,112,123 +hangar_alien_abd +bounds:382,1019,390,215 +offsets:2,1,393,217 +left_leg_light +bounds:1564,826,226,389 +offsets:22,29,256,421 +rotate:90 +logo +bounds:437,2121,513,107 +max_win_MAX_txt_A +bounds:1970,2021,133,180 +rotate:90 +max_win_MAX_txt_M +bounds:1924,1860,159,180 +rotate:90 +max_win_MAX_txt_X +bounds:2,1999,142,180 +rotate:90 +max_win_WIN_txt +bounds:1325,2072,264,115 +max_win_plate_light +bounds:1253,1756,180,173 +monitor_screen_hangover +bounds:1877,1668,224,190 +offsets:4,6,233,199 +num_bg_all +bounds:902,86,778,239 +particle +bounds:871,1936,146,155 +rotate:90 +placeholder +bounds:1932,2169,100,98 +offsets:0,2,100,100 +plate +bounds:1858,467,350,247 +plate_S +bounds:1248,2193,166,94 +progressbar_blue2 +bounds:973,2300,61,149 +offsets:1,2,64,152 +rotate:90 +progressbar_flask1_L +bounds:2093,2339,49,135 +rotate:90 +progressbar_flask2_L +bounds:2230,2339,49,124 +rotate:90 +progressbar_flask3_L +bounds:1771,2340,48,135 +rotate:90 +progressbar_flasks1 +bounds:2236,2262,158,75 +progressbar_flasks2 +bounds:1666,1707,181,209 +rotate:90 +progressbar_green1 +bounds:696,2301,60,149 +offsets:2,1,63,152 +rotate:90 +progressbar_pink3 +bounds:545,2308,59,149 +offsets:1,1,61,152 +rotate:90 +progressbar_top +bounds:445,2234,203,72 +progressbar_wall1 +bounds:1955,716,248,240 +progressbar_wall2 +bounds:1491,2272,71,218 +rotate:90 +progressbar_wall3 +bounds:1435,1738,177,229 +rotate:90 +progressbar_wire1 +bounds:184,1998,235,142 +progressbar_wire1_S +bounds:2152,1991,235,144 +progressbar_wire2 +bounds:1173,1564,229,190 +progressbar_wire2_S +bounds:1019,1765,232,164 +progressbar_wire3 +bounds:1124,2291,70,93 +rotate:90 +progressbar_wire4 +bounds:1393,2289,68,96 +offsets:1,0,69,96 +rotate:90 +rays2_all +bounds:591,449,387,247 +red_star +bounds:2034,2167,100,113 +rotate:90 +right_leg_light +bounds:295,782,235,380 +offsets:5,13,281,401 +rotate:90 +sandL_all +bounds:57,2322,245,54 +sandR_all +bounds:1908,2340,183,48 +sattelite_dark +bounds:2,1024,378,210 +offsets:0,0,419,210 +ship +bounds:980,355,251,322 +offsets:1,2,254,326 +rotate:90 +shipS +bounds:1028,1931,451,139 +offsets:19,35,491,176 +shipS_alien_abd +bounds:421,1983,448,136 +offsets:16,52,478,190 +shipSand +bounds:556,1595,615,168 +offsets:2,12,618,184 +shipSand_alien_abd +bounds:1617,1491,469,175 +offsets:2,7,472,186 +ship_alien_abd +bounds:1124,608,245,313 +offsets:1,2,248,316 +rotate:90 +ship_all +bounds:1052,1362,345,200 +ship_ray_1 +bounds:1571,2345,152,43 +offsets:9,3,171,49 +ship_ray_2 +bounds:2033,958,282,236 +offsets:0,1,282,242 +ship_ray_3 +bounds:1219,2359,306,29 +offsets:11,3,321,34 +sign_danger_dark +bounds:2149,2156,104,134 +rotate:90 +sign_danger_light +bounds:301,2142,105,134 +rotate:90 +sign_warning_dark +bounds:1688,1890,234,155 +offsets:0,0,234,161 +sign_warning_leg_d +bounds:2,1846,150,351 +offsets:57,16,235,367 +rotate:90 +sign_warning_leg_l +bounds:355,1827,154,359 +offsets:58,11,240,370 +rotate:90 +sign_warning_light +bounds:2106,1830,240,159 +offsets:0,0,240,164 +sing_triangle_dark +bounds:1204,2076,119,115 +sing_triangle_light +bounds:1591,2070,121,117 +sing_yellow_dark +bounds:1714,2068,119,126 +offsets:0,0,120,126 +rotate:90 +sing_yellow_light +bounds:1842,2047,120,126 +rotate:90 +spark +bounds:1527,2346,42,42 +text1_smw +bounds:486,1398,564,195 +text2_smw +bounds:2,288,448,253 +text_add +bounds:1711,2269,523,68 +text_bw +bounds:1779,212,289,253 +text_fs +bounds:1416,2189,514,78 +text_fs3 +bounds:2,2249,441,68 +text_left +bounds:1219,2291,172,66 +text_mw +bounds:452,194,448,253 +text_yw +bounds:650,2230,402,68 +win_line +bounds:2,2378,580,10 \ No newline at end of file diff --git a/src/stories/assets/area69/winline/assembly.webp b/src/stories/assets/area69/winline/assembly.webp new file mode 100644 index 0000000..13a49cb Binary files /dev/null and b/src/stories/assets/area69/winline/assembly.webp differ diff --git a/src/stories/assets/area69/winline/win_line.skel b/src/stories/assets/area69/winline/win_line.skel new file mode 100644 index 0000000..138749d Binary files /dev/null and b/src/stories/assets/area69/winline/win_line.skel differ diff --git a/src/stories/assets/bubblex/configs/slotMachine.json b/src/stories/assets/bubblex/configs/slotMachine.json new file mode 100644 index 0000000..2c82ee3 --- /dev/null +++ b/src/stories/assets/bubblex/configs/slotMachine.json @@ -0,0 +1,73 @@ +{ + "width": 317, + "height": 320, + "reels": 6, + "slots": 6, + "symbolsKeys": ["S1", "S2", "S3", "S4", "S5", "S6", "RR"], + "wilds": [], + "scatters": [], + "symbols": { + "S1": { + "key": "S1", + "spine": "symbols", + "skin": "ORANGE" + }, + "S2": { + "key": "S2", + "spine": "symbols", + "skin": "YELLOW" + }, + "S3": { + "key": "S3", + "spine": "symbols", + "skin": "GREEN" + }, + "S4": { + "key": "S4", + "spine": "symbols", + "skin": "BLUE" + }, + "S5": { + "key": "S5", + "spine": "symbols", + "skin": "VIOLET" + }, + "S6": { + "key": "S6", + "spine": "symbols", + "skin": "ROSE" + }, + "SC1": { + "spine": "symbols", + "skin": "WHITE_PAPER" + }, + "W0": { + "spine": "symbols", + "skin": "COLOR_WILD" + }, + "W1": { + "spine": "symbols", + "skin": "SQUARE_WILD" + }, + "RR": { + "key": "RR", + "spine": "symbols", + "skin": "RAINBOW" + }, + "ADD": { + "spine": "symbols", + "skin": "X_PLUS" + }, + "BL": { + "spine": "symbols", + "skin": "COLOR_WILD" + }, + "MUL": { + "spine": "symbols", + "skin": "X_MULTIPLIER" + }, + "DE": { + "spine": "symbols" + } + } +} diff --git a/src/stories/assets/bubblex/manifest.json b/src/stories/assets/bubblex/manifest.json new file mode 100644 index 0000000..e34729c --- /dev/null +++ b/src/stories/assets/bubblex/manifest.json @@ -0,0 +1,25 @@ +{ + "bundles": [ + { + "name": "configs", + "assets": [ + { + "name": "slot_machine_config", + "srcs": "bubblex/configs/slotMachine.json" + } + ] + }, + { + "name": "symbols", + "assets": [ + { + "name": "symbols", + "srcs": "bubblex/symbols/symbols.skel", + "data": { + "spineSkeletonScale": 0.31 + } + } + ] + } + ] +} diff --git a/src/stories/assets/bubblex/symbols/symbols.atlas b/src/stories/assets/bubblex/symbols/symbols.atlas new file mode 100644 index 0000000..18580b3 --- /dev/null +++ b/src/stories/assets/bubblex/symbols/symbols.atlas @@ -0,0 +1,335 @@ +symbols.webp +size:2017,751 +filter:Linear,Linear +Black_ball_1 +bounds:1292,147,65,66 +offsets:3,2,71,70 +Black_ball_2 +bounds:1119,27,83,84 +offsets:4,3,91,90 +Black_ball_3 +bounds:108,2,103,104 +offsets:3,2,109,108 +Black_ball_4 +bounds:1238,440,129,131 +offsets:2,2,135,138 +Black_base +bounds:815,573,176,176 +offsets:1,1,178,178 +Blue_ball_1 +bounds:1359,147,65,66 +offsets:3,2,71,70 +Blue_ball_2 +bounds:859,11,85,85 +offsets:3,2,91,90 +Blue_ball_3 +bounds:213,2,103,104 +offsets:3,2,109,108 +Blue_ball_4 +bounds:695,436,132,135 +offsets:2,2,135,138 +Blue_base +bounds:636,573,177,176 +offsets:1,1,179,178 +Green_ball_1 +bounds:1426,152,65,66 +offsets:3,2,71,70 +Green_ball_2 +bounds:946,11,85,84 +offsets:3,3,91,90 +rotate:90 +Green_ball_3 +bounds:439,2,103,104 +offsets:3,2,109,108 +Green_ball_4 +bounds:829,437,133,134 +offsets:2,2,136,137 +Green_base +bounds:993,573,176,176 +offsets:1,1,178,178 +Grey_ball_1 +bounds:1493,154,65,66 +offsets:2,2,71,70 +Grey_ball_2 +bounds:1838,171,83,84 +offsets:3,3,91,90 +Grey_ball_3 +bounds:544,2,103,104 +offsets:2,2,109,108 +Grey_ball_4 +bounds:1369,440,129,131 +offsets:2,2,135,138 +Grey_base +bounds:1171,573,176,176 +offsets:1,1,178,178 +Orange_ball_1 +bounds:1560,154,65,66 +offsets:3,2,71,70 +Orange_ball_2 +bounds:1032,27,85,84 +offsets:3,3,91,90 +Orange_ball_3 +bounds:649,2,103,104 +offsets:3,2,109,108 +Orange_ball_4 +bounds:381,237,149,153 +offsets:1,2,150,155 +Orange_base +bounds:1699,579,169,170 +offsets:1,1,171,172 +Rose_ball_1 +bounds:1292,80,65,66 +offsets:3,2,71,70 +rotate:90 +Rose_ball_2 +bounds:1923,181,83,84 +offsets:4,3,91,90 +Rose_ball_3 +bounds:1762,473,103,104 +offsets:3,2,109,108 +Rose_ball_4 +bounds:1103,440,131,133 +offsets:2,2,134,136 +rotate:90 +Rose_base +bounds:431,392,169,169 +offsets:1,1,171,172 +Violet_ball_1 +bounds:1360,79,65,66 +offsets:3,2,71,70 +Violet_ball_2 +bounds:1751,86,83,84 +offsets:4,3,91,90 +rotate:90 +Violet_ball_3 +bounds:1762,367,103,104 +offsets:3,2,109,108 +Violet_ball_4 +bounds:1500,440,129,131 +offsets:2,2,131,134 +Violet_base +bounds:1527,579,170,170 +offsets:1,1,172,172 +White_ball_1 +bounds:1427,84,65,66 +offsets:3,2,71,70 +White_ball_2 +bounds:1837,86,83,84 +offsets:4,3,91,90 +rotate:90 +White_ball_3 +bounds:754,2,103,104 +offsets:3,2,109,108 +White_ball_4 +bounds:1631,446,129,131 +offsets:1,2,131,133 +White_base +bounds:1349,573,176,176 +offsets:1,1,178,178 +Yellow_ball_1 +bounds:1494,86,65,66 +offsets:3,2,71,70 +Yellow_ball_2 +bounds:1923,95,83,84 +offsets:4,3,91,90 +Yellow_ball_3 +bounds:1050,211,103,104 +offsets:3,2,109,108 +Yellow_ball_4 +bounds:1430,322,115,116 +Yellow_base +bounds:259,392,169,170 +offsets:1,1,171,172 +rotate:90 +blank_circle +bounds:532,242,148,148 +offsets:1,1,150,150 +blank_middle +bounds:951,317,118,118 +offsets:1,1,120,120 +effect/effect_00001 +bounds:1813,36,48,48 +offsets:51,52,150,150 +effect/effect_00002 +bounds:1148,139,70,70 +offsets:40,41,150,150 +effect/effect_00003 +bounds:930,98,86,86 +offsets:32,33,150,150 +effect/effect_00004 +bounds:1467,222,98,98 +offsets:26,27,150,150 +effect/effect_00005 +bounds:1365,220,100,100 +offsets:25,26,150,150 +effect/effect_00006 +bounds:1050,113,96,96 +offsets:27,28,150,150 +effect/effect_00007 +bounds:2,2,104,104 +offsets:23,24,150,150 +effect/effect_00008 +bounds:1757,257,108,108 +offsets:21,22,150,150 +effect/effect_00009 +bounds:1547,324,114,114 +offsets:18,19,150,150 +effect/effect_00010 +bounds:1071,320,118,118 +offsets:16,17,150,150 +effect/effect_00011 +bounds:829,315,120,120 +offsets:15,16,150,150 +effect/effect_00012 +bounds:685,189,124,124 +offsets:13,14,150,150 +effect/effect_00013 +bounds:410,109,129,126 +offsets:12,13,150,150 +effect/effect_00014 +bounds:1867,389,132,128 +offsets:11,12,150,150 +effect/effect_00015 +bounds:964,441,137,130 +offsets:10,11,150,150 +effect/effect_00016 +bounds:541,108,142,132 +offsets:8,10,150,150 +effect/effect_00017 +bounds:1870,519,144,132 +offsets:6,10,150,150 +effect/effect_00018 +bounds:1870,653,145,96 +offsets:5,27,150,150 +effect/effect_00019 +bounds:602,415,146,91 +offsets:4,30,150,150 +rotate:90 +rainbow_1 +bounds:1427,17,65,65 +offsets:1,1,67,67 +rainbow_10 +bounds:869,127,59,58 +offsets:1,1,61,60 +rainbow_2 +bounds:1220,78,62,62 +offsets:1,1,64,64 +rainbow_3 +bounds:1561,86,65,66 +offsets:1,1,67,68 +rainbow_4 +bounds:1268,18,58,58 +offsets:1,1,60,60 +rainbow_5 +bounds:1628,83,65,66 +offsets:1,1,67,68 +rotate:90 +rainbow_6 +bounds:1628,17,64,64 +offsets:1,1,66,66 +rainbow_7 +bounds:1220,142,70,70 +offsets:1,1,72,72 +rainbow_8 +bounds:1696,26,58,58 +offsets:1,1,60,60 +rainbow_9 +bounds:1328,18,58,59 +offsets:1,1,60,61 +rainbow_S +bounds:2,108,183,189 +offsets:1,1,185,191 +rainbow_ballS +bounds:1567,224,98,95 +offsets:4,2,105,99 +rotate:90 +symbol_glow_color +bounds:2,494,255,255 +symbol_glow_white +bounds:210,221,169,169 +symbol_shine/eff_00000 +bounds:210,467,20,25 +offsets:29,130,203,188 +symbol_shine/eff_00001 +bounds:1696,86,53,62 +offsets:21,106,203,188 +symbol_shine/eff_00002 +bounds:785,115,70,82 +offsets:20,90,203,188 +rotate:90 +symbol_shine/eff_00003 +bounds:1664,236,85,98 +offsets:20,76,203,188 +symbol_shine/eff_00004 +bounds:310,109,98,110 +offsets:20,65,203,188 +symbol_shine/eff_00005 +bounds:187,108,111,121 +offsets:20,54,203,188 +rotate:90 +symbol_shine/eff_00006 +bounds:811,187,119,126 +offsets:25,44,203,188 +symbol_shine/eff_00007 +bounds:1867,267,120,128 +offsets:37,34,203,188 +rotate:90 +symbol_shine/eff_00008 +bounds:695,315,119,128 +offsets:49,25,203,188 +rotate:90 +symbol_shine/eff_00009 +bounds:932,186,116,127 +offsets:62,17,203,188 +symbol_shine/eff_00010 +bounds:318,2,105,119 +offsets:75,15,203,188 +rotate:90 +symbol_shine/eff_00011 +bounds:1663,336,92,108 +offsets:88,15,203,188 +symbol_shine/eff_00012 +bounds:685,108,79,98 +offsets:101,15,203,188 +rotate:90 +symbol_shine/eff_00013 +bounds:1923,28,65,83 +offsets:115,17,203,188 +rotate:90 +symbol_shine/eff_00014 +bounds:1204,27,49,62 +offsets:130,22,203,188 +rotate:90 +symbol_shine_spot +bounds:1756,29,55,55 +offsets:0,0,55,56 +wildColor_ball_1 +bounds:1494,18,65,66 +offsets:3,2,71,70 +wildColor_ball_2 +bounds:1751,171,85,84 +offsets:3,3,91,90 +wildColor_ball_3 +bounds:1155,214,103,104 +offsets:3,2,109,108 +wildColor_ball_4 +bounds:1191,321,118,117 +wildSquare_ball_1 +bounds:1561,18,65,66 +offsets:3,2,71,70 +wildSquare_ball_2 +bounds:1664,150,85,84 +offsets:3,3,91,90 +wildSquare_ball_3 +bounds:1260,215,103,104 +offsets:3,2,109,108 +wildSquare_ball_4 +bounds:1311,322,117,116 +wild_base +bounds:448,563,186,186 +offsets:1,1,188,188 +wild_base_Square +bounds:259,563,187,186 +wild_ray +bounds:2,299,206,193 +offsets:4,7,217,206 diff --git a/src/stories/assets/bubblex/symbols/symbols.skel b/src/stories/assets/bubblex/symbols/symbols.skel new file mode 100644 index 0000000..6faa640 Binary files /dev/null and b/src/stories/assets/bubblex/symbols/symbols.skel differ diff --git a/src/stories/assets/bubblex/symbols/symbols.webp b/src/stories/assets/bubblex/symbols/symbols.webp new file mode 100644 index 0000000..1d1e657 Binary files /dev/null and b/src/stories/assets/bubblex/symbols/symbols.webp differ diff --git a/src/stories/assets/hold-and-win/anticipation/anticipation.atlas b/src/stories/assets/hold-and-win/anticipation/anticipation.atlas new file mode 100644 index 0000000..f809156 --- /dev/null +++ b/src/stories/assets/hold-and-win/anticipation/anticipation.atlas @@ -0,0 +1,19 @@ +anticipation.webp +size:2048,1024 +filter:Linear,Linear +scale:0.75 +anticip_bg +bounds:777,30,220,836 +offsets:319,27,858,879 +anticip_circle_whole_source_1.4 +bounds:999,463,404,403 +offsets:429,445,858,879 +anticip_frame +bounds:291,27,262,839 +offsets:297,20,858,879 +anticip_frame_glow +bounds:2,2,287,864 +offsets:285,7,858,879 +anticip_glow +bounds:555,29,220,837 +offsets:319,27,858,879 diff --git a/src/stories/assets/hold-and-win/anticipation/anticipation.webp b/src/stories/assets/hold-and-win/anticipation/anticipation.webp new file mode 100644 index 0000000..f4bfa85 Binary files /dev/null and b/src/stories/assets/hold-and-win/anticipation/anticipation.webp differ diff --git a/src/stories/assets/hold-and-win/anticipation/anticipation_back.skel b/src/stories/assets/hold-and-win/anticipation/anticipation_back.skel new file mode 100644 index 0000000..168ca47 Binary files /dev/null and b/src/stories/assets/hold-and-win/anticipation/anticipation_back.skel differ diff --git a/src/stories/assets/hold-and-win/anticipation/anticipation_front.skel b/src/stories/assets/hold-and-win/anticipation/anticipation_front.skel new file mode 100644 index 0000000..8464c33 Binary files /dev/null and b/src/stories/assets/hold-and-win/anticipation/anticipation_front.skel differ diff --git a/src/stories/assets/hold-and-win/bitmapFonts/multiplier_value_font.fnt b/src/stories/assets/hold-and-win/bitmapFonts/multiplier_value_font.fnt new file mode 100644 index 0000000..83a2d6f --- /dev/null +++ b/src/stories/assets/hold-and-win/bitmapFonts/multiplier_value_font.fnt @@ -0,0 +1,16 @@ +info face="multiplier_value_font" size=90 bold=0 italic=0 charset="" unicode=1 stretchH=100 smooth=1 aa=1 padding=1,1,1,1 spacing=1,1 +common lineHeight=104 base=83 scaleW=218 scaleH=218 pages=1 packed=0 +page id=0 file="multiplier_value_font.png" +chars count=12 +char id=32 x=0 y=0 width=0 height=0 xoffset=0 yoffset=0 xadvance=26 page=0 chnl=15 +char id=48 x=167 y=0 width=51 height=71 xoffset=-1 yoffset=-1 xadvance=49 page=0 chnl=15 +char id=49 x=0 y=74 width=42 height=72 xoffset=-1 yoffset=-1 xadvance=41 page=0 chnl=15 +char id=50 x=0 y=147 width=52 height=71 xoffset=-1 yoffset=-1 xadvance=50 page=0 chnl=15 +char id=51 x=53 y=147 width=42 height=71 xoffset=0 yoffset=0 xadvance=41 page=0 chnl=15 +char id=52 x=143 y=147 width=54 height=69 xoffset=-1 yoffset=-1 xadvance=52 page=0 chnl=15 +char id=53 x=96 y=147 width=46 height=71 xoffset=-1 yoffset=-1 xadvance=44 page=0 chnl=15 +char id=54 x=0 y=0 width=56 height=73 xoffset=-1 yoffset=-1 xadvance=54 page=0 chnl=15 +char id=55 x=43 y=74 width=50 height=69 xoffset=-1 yoffset=-1 xadvance=48 page=0 chnl=15 +char id=56 x=57 y=0 width=52 height=73 xoffset=-1 yoffset=-1 xadvance=50 page=0 chnl=15 +char id=57 x=110 y=0 width=56 height=73 xoffset=-1 yoffset=-1 xadvance=54 page=0 chnl=15 +char id=88 x=94 y=74 width=55 height=63 xoffset=-1 yoffset=8 xadvance=54 page=0 chnl=15 diff --git a/src/stories/assets/hold-and-win/bitmapFonts/multiplier_value_font.png b/src/stories/assets/hold-and-win/bitmapFonts/multiplier_value_font.png new file mode 100644 index 0000000..b450bbf Binary files /dev/null and b/src/stories/assets/hold-and-win/bitmapFonts/multiplier_value_font.png differ diff --git a/src/stories/assets/hold-and-win/bitmapFonts/wild_multiplier_font.fnt b/src/stories/assets/hold-and-win/bitmapFonts/wild_multiplier_font.fnt new file mode 100644 index 0000000..8c10405 --- /dev/null +++ b/src/stories/assets/hold-and-win/bitmapFonts/wild_multiplier_font.fnt @@ -0,0 +1,16 @@ +info face="wild_multiplier_font" size=90 bold=0 italic=0 charset="" unicode=1 stretchH=100 smooth=1 aa=1 padding=1,1,1,1 spacing=1,1 +common lineHeight=104 base=83 scaleW=209 scaleH=218 pages=1 packed=0 +page id=0 file="wild_multiplier_font.png" +chars count=12 +char id=32 x=0 y=0 width=0 height=0 xoffset=0 yoffset=0 xadvance=26 page=0 chnl=15 +char id=48 x=0 y=0 width=53 height=73 xoffset=-1 yoffset=-1 xadvance=51 page=0 chnl=15 +char id=49 x=166 y=0 width=43 height=72 xoffset=-1 yoffset=-1 xadvance=41 page=0 chnl=15 +char id=50 x=150 y=74 width=53 height=71 xoffset=-1 yoffset=-1 xadvance=51 page=0 chnl=15 +char id=51 x=58 y=74 width=43 height=72 xoffset=-1 yoffset=-1 xadvance=41 page=0 chnl=15 +char id=52 x=0 y=148 width=55 height=70 xoffset=-1 yoffset=-1 xadvance=53 page=0 chnl=15 +char id=53 x=102 y=74 width=47 height=72 xoffset=-1 yoffset=-1 xadvance=45 page=0 chnl=15 +char id=54 x=54 y=0 width=57 height=73 xoffset=-1 yoffset=-1 xadvance=55 page=0 chnl=15 +char id=55 x=56 y=148 width=51 height=70 xoffset=-1 yoffset=-1 xadvance=49 page=0 chnl=15 +char id=56 x=112 y=0 width=53 height=73 xoffset=-1 yoffset=-1 xadvance=51 page=0 chnl=15 +char id=57 x=0 y=74 width=57 height=73 xoffset=-1 yoffset=-1 xadvance=55 page=0 chnl=15 +char id=88 x=108 y=148 width=56 height=64 xoffset=-1 yoffset=8 xadvance=55 page=0 chnl=15 diff --git a/src/stories/assets/hold-and-win/bitmapFonts/wild_multiplier_font.png b/src/stories/assets/hold-and-win/bitmapFonts/wild_multiplier_font.png new file mode 100644 index 0000000..a893f6c Binary files /dev/null and b/src/stories/assets/hold-and-win/bitmapFonts/wild_multiplier_font.png differ diff --git a/src/stories/assets/hold-and-win/configs/slotMachine.json b/src/stories/assets/hold-and-win/configs/slotMachine.json new file mode 100644 index 0000000..ec49be2 --- /dev/null +++ b/src/stories/assets/hold-and-win/configs/slotMachine.json @@ -0,0 +1,126 @@ +{ + "width": 550, + "height": 420, + "reels": 5, + "slots": 4, + "paddings": { + "left": 16, + "top": 0, + "right": 18, + "bottom": 0 + }, + "symbolsKeys": ["L", "J", "I", "H", "G", "F", "E", "D", "C", "B", "A", "K", "M", "N"], + "symbolsWeights": { + "L": 0, + "J": 0, + "I": 0, + "H": 0, + "G": 0, + "F": 0, + "E": 0, + "D": 0, + "C": 0, + "B": 0, + "K": 0.5, + "M": 0, + "N": 0 + }, + "symbols": { + "A": { + "key": "A", + "spine": "lowest_symbols", + "skin": "Ten", + "zIndex": 1 + }, + "B": { + "key": "B", + "spine": "lowest_symbols", + "skin": "J", + "zIndex": 1 + }, + "C": { + "key": "C", + "spine": "lowest_symbols", + "skin": "Q", + "zIndex": 1 + }, + "D": { + "key": "D", + "spine": "low_symbols", + "skin": "K", + "zIndex": 1 + }, + "E": { + "key": "E", + "spine": "low_symbols", + "skin": "A", + "zIndex": 1 + }, + "F": { + "key": "F", + "spine": "h5", + "skin": "default", + "zIndex": 1 + }, + "G": { + "key": "G", + "spine": "h4", + "skin": "default", + "zIndex": 1 + }, + "H": { + "key": "H", + "spine": "h3", + "skin": "default", + "zIndex": 1 + }, + "I": { + "key": "I", + "spine": "h2", + "skin": "default", + "zIndex": 1 + }, + "J": { + "key": "J", + "spine": "h1", + "skin": "default", + "zIndex": 1 + }, + "K": { + "key": "K", + "spine": "scatter", + "skin": "default", + "zIndex": 2 + }, + "L": { + "key": "L", + "spine": "wild", + "skin": "low", + "fontStyle": { + "fontSize": 30, + "fontName": "wild_multiplier_font" + }, + "zIndex": 3 + }, + "M": { + "key": "M", + "spine": "wild", + "skin": "med", + "fontStyle": { + "fontSize": 30, + "fontName": "wild_multiplier_font" + }, + "zIndex": 3 + }, + "N": { + "key": "N", + "spine": "wild", + "skin": "high", + "fontStyle": { + "fontSize": 30, + "fontName": "wild_multiplier_font" + }, + "zIndex": 3 + } + } +} diff --git a/src/stories/assets/hold-and-win/manifest.json b/src/stories/assets/hold-and-win/manifest.json new file mode 100644 index 0000000..4d79766 --- /dev/null +++ b/src/stories/assets/hold-and-win/manifest.json @@ -0,0 +1,158 @@ +{ + "bundles": [ + { + "name": "configs", + "assets": [ + { + "name": "slot_machine_config", + "srcs": "hold-and-win/configs/slotMachine.json" + } + ] + }, + { + "name":"symbols", + "assets":[ + { + "name": "wild_multiplier_font", + "srcs": "hold-and-win/bitmapFonts/wild_multiplier_font.fnt" + }, + { + "name": "symbols_atlas", + "srcs": "hold-and-win/symbols/symbols.atlas" + }, + { + "name": "wild", + "srcs": "hold-and-win/symbols/wild.skel", + "data": { + "spineSkeletonScale": 0.35, + "spineAtlasAlias": "symbols_atlas", + "spineAtlasFile": "hold-and-win/symbols/symbols.atlas" + } + }, + { + "name": "scatter", + "srcs": "hold-and-win/symbols/scatter.skel", + "data": { + "spineSkeletonScale": 0.5, + "spineAtlasAlias": "symbols_atlas", + "spineAtlasFile": "hold-and-win/symbols/symbols.atlas" + } + }, + { + "name": "lowest_symbols", + "srcs": "hold-and-win/symbols/L_10_q_j.skel", + "data": { + "spineSkeletonScale": 0.35, + "spineAtlasAlias": "symbols_atlas", + "spineAtlasFile": "hold-and-win/symbols/symbols.atlas" + } + }, + { + "name": "low_symbols", + "srcs": "hold-and-win/symbols/L_A_K.skel", + "data": { + "spineSkeletonScale": 0.35, + "spineAtlasAlias": "symbols_atlas", + "spineAtlasFile": "hold-and-win/symbols/symbols.atlas" + } + }, + { + "name": "h5", + "srcs": "hold-and-win/symbols/M3.skel", + "data": { + "spineSkeletonScale": 0.45, + "spineAtlasAlias": "symbols_atlas", + "spineAtlasFile": "hold-and-win/symbols/symbols.atlas" + } + }, + { + "name": "h4", + "srcs": "hold-and-win/symbols/M2.skel", + "data": { + "spineSkeletonScale": 0.4, + "spineAtlasAlias": "symbols_atlas", + "spineAtlasFile": "hold-and-win/symbols/symbols.atlas" + } + }, + { + "name": "h3", + "srcs": "hold-and-win/symbols/M1.skel", + "data": { + "spineSkeletonScale": 0.35, + "spineAtlasAlias": "symbols_atlas", + "spineAtlasFile": "hold-and-win/symbols/symbols.atlas" + } + }, + { + "name": "h2", + "srcs": "hold-and-win/symbols/H2.skel", + "data": { + "spineSkeletonScale": 0.5, + "spineAtlasAlias": "symbols_atlas", + "spineAtlasFile": "hold-and-win/symbols/symbols.atlas" + } + }, + { + "name": "h1", + "srcs": "hold-and-win/symbols/H1.skel", + "data": { + "spineSkeletonScale": 0.5, + "spineAtlasAlias": "symbols_atlas", + "spineAtlasFile": "hold-and-win/symbols/symbols.atlas" + } + }, + { + "name": "expanding", + "srcs": "hold-and-win/symbols/expanding_multiplier.skel", + "data": { + "spineSkeletonScale": 0.5, + "spineAtlasAlias": "symbols_atlas", + "spineAtlasFile": "hold-and-win/symbols/symbols.atlas" + } + }, + { + "name": "win_line", + "srcs": "hold-and-win/winline/win_line.skel", + "data": { + "spineAtlasAlias": "main_atlas", + "spineAtlasFile": "hold-and-win/winline/assembly.atlas" + } + }, + { + "name": "win_frame", + "srcs": "hold-and-win/textures/win_frame.png" + }, + { + "name": "anticipation_back", + "srcs": "hold-and-win/anticipation/anticipation_back.skel", + "data": { + "spineSkeletonScale": 0.4, + "spineAtlasAlias": "anticipation", + "spineAtlasFile": "hold-and-win/anticipation/anticipation.atlas" + } + }, + { + "name": "anticipation_front", + "srcs": "hold-and-win/anticipation/anticipation_front.skel", + "data": { + "spineSkeletonScale": 0.4, + "spineAtlasAlias": "anticipation", + "spineAtlasFile": "hold-and-win/anticipation/anticipation.atlas" + } + } + ] + }, + { + "name": "addons", + "assets": [ + { + "name": "slot_multiplier", + "srcs": "hold-and-win/slot-multiplier/slot_multiplier.skel", + "data": { + "spineSkeletonScale": 0.4 + } + } + ] + } + ] +} diff --git a/src/stories/assets/hold-and-win/slot-multiplier/slot_multiplier.atlas b/src/stories/assets/hold-and-win/slot-multiplier/slot_multiplier.atlas new file mode 100644 index 0000000..2350222 --- /dev/null +++ b/src/stories/assets/hold-and-win/slot-multiplier/slot_multiplier.atlas @@ -0,0 +1,8 @@ +slot_multiplier.webp +size:392,280 +filter:Linear,Linear +imgs/frame +bounds:2,2,284,276 +imgs/placeholder +bounds:288,178,100,100 +offsets:1,1,102,102 diff --git a/src/stories/assets/hold-and-win/slot-multiplier/slot_multiplier.skel b/src/stories/assets/hold-and-win/slot-multiplier/slot_multiplier.skel new file mode 100644 index 0000000..42939d2 Binary files /dev/null and b/src/stories/assets/hold-and-win/slot-multiplier/slot_multiplier.skel differ diff --git a/src/stories/assets/hold-and-win/slot-multiplier/slot_multiplier.webp b/src/stories/assets/hold-and-win/slot-multiplier/slot_multiplier.webp new file mode 100644 index 0000000..0237627 Binary files /dev/null and b/src/stories/assets/hold-and-win/slot-multiplier/slot_multiplier.webp differ diff --git a/src/stories/assets/hold-and-win/symbols/H1.skel b/src/stories/assets/hold-and-win/symbols/H1.skel new file mode 100644 index 0000000..e806d21 Binary files /dev/null and b/src/stories/assets/hold-and-win/symbols/H1.skel differ diff --git a/src/stories/assets/hold-and-win/symbols/H2.skel b/src/stories/assets/hold-and-win/symbols/H2.skel new file mode 100644 index 0000000..b1ef5e0 Binary files /dev/null and b/src/stories/assets/hold-and-win/symbols/H2.skel differ diff --git a/src/stories/assets/hold-and-win/symbols/L_10_q_j.skel b/src/stories/assets/hold-and-win/symbols/L_10_q_j.skel new file mode 100644 index 0000000..8b2a24d Binary files /dev/null and b/src/stories/assets/hold-and-win/symbols/L_10_q_j.skel differ diff --git a/src/stories/assets/hold-and-win/symbols/L_A_K.skel b/src/stories/assets/hold-and-win/symbols/L_A_K.skel new file mode 100644 index 0000000..aad48db Binary files /dev/null and b/src/stories/assets/hold-and-win/symbols/L_A_K.skel differ diff --git a/src/stories/assets/hold-and-win/symbols/M1.skel b/src/stories/assets/hold-and-win/symbols/M1.skel new file mode 100644 index 0000000..f7b4861 Binary files /dev/null and b/src/stories/assets/hold-and-win/symbols/M1.skel differ diff --git a/src/stories/assets/hold-and-win/symbols/M2.skel b/src/stories/assets/hold-and-win/symbols/M2.skel new file mode 100644 index 0000000..e71bcdd Binary files /dev/null and b/src/stories/assets/hold-and-win/symbols/M2.skel differ diff --git a/src/stories/assets/hold-and-win/symbols/M3.skel b/src/stories/assets/hold-and-win/symbols/M3.skel new file mode 100644 index 0000000..3121a14 Binary files /dev/null and b/src/stories/assets/hold-and-win/symbols/M3.skel differ diff --git a/src/stories/assets/hold-and-win/symbols/expanding_multiplier.skel b/src/stories/assets/hold-and-win/symbols/expanding_multiplier.skel new file mode 100644 index 0000000..9c9377e Binary files /dev/null and b/src/stories/assets/hold-and-win/symbols/expanding_multiplier.skel differ diff --git a/src/stories/assets/hold-and-win/symbols/scatter.skel b/src/stories/assets/hold-and-win/symbols/scatter.skel new file mode 100644 index 0000000..9935398 Binary files /dev/null and b/src/stories/assets/hold-and-win/symbols/scatter.skel differ diff --git a/src/stories/assets/hold-and-win/symbols/symbols.atlas b/src/stories/assets/hold-and-win/symbols/symbols.atlas new file mode 100644 index 0000000..76ab2ca --- /dev/null +++ b/src/stories/assets/hold-and-win/symbols/symbols.atlas @@ -0,0 +1,526 @@ +symbols.webp +size:3236,2056 +filter:Linear,Linear +103_S +bounds:223,1060,258,241 +rotate:90 +10_newspaper1_l +bounds:2296,893,157,220 +10_newspaper2_r +bounds:1876,1144,149,211 +rotate:90 +2(Effect) +bounds:2229,307,214,208 +rotate:90 +3(Effect) +bounds:2202,523,214,209 +A3_S +bounds:2400,1116,295,306 +A_newspaper1_l +bounds:1091,1110,188,284 +rotate:90 +A_newspaper2_r +bounds:3011,1453,187,280 +DiscoBall_1_1 +bounds:241,107,307,309 +DiscoBall_1_2 +bounds:550,107,307,309 +DiscoBall_1_3 +bounds:867,789,307,309 +DiscoBall_1_4 +bounds:1153,1300,307,309 +rotate:90 +DiscoBall_1_5 +bounds:1176,799,307,309 +DiscoBall_1_6 +bounds:1464,1300,307,309 +rotate:90 +DiscoBall_1_sequins +bounds:843,1736,348,318 +DiscoBall_2_1 +bounds:1775,1424,307,309 +DiscoBall_2_2 +bounds:2084,1424,307,309 +DiscoBall_2_3 +bounds:2393,1424,307,309 +DiscoBall_2_4 +bounds:2702,1424,307,309 +DiscoBall_2_5 +bounds:1485,799,307,309 +DiscoBall_2_6 +bounds:2089,1115,307,309 +rotate:90 +DiscoBall_2_sequins +bounds:1193,1736,348,318 +DiscoBall_3_1 +bounds:864,364,296,297 +rotate:90 +DiscoBall_3_2 +bounds:859,66,296,297 +rotate:90 +DiscoBall_3_3 +bounds:1179,501,296,297 +rotate:90 +DiscoBall_3_4 +bounds:1478,501,296,297 +rotate:90 +DiscoBall_3_5 +bounds:1163,203,296,297 +rotate:90 +DiscoBall_3_6 +bounds:1462,203,296,297 +rotate:90 +DiscoBall_3_sequins +bounds:489,1381,349,319 +Electricity_m2_00 +bounds:1543,1735,328,319 +Electricity_m2_01 +bounds:1873,1735,328,319 +Electricity_m2_03 +bounds:2203,1735,328,319 +Electricity_m2_04 +bounds:2533,1735,328,319 +Electricity_m2_06 +bounds:2863,1735,328,319 +Electricity_m2_07 +bounds:489,1060,328,319 +Electricity_m2_09 +bounds:216,739,328,319 +Electricity_m2_10 +bounds:216,418,328,319 +Electricity_m2_12 +bounds:546,730,328,319 +rotate:90 +H1_BG +bounds:840,1309,300,311 +rotate:90 +H1_button +bounds:830,93,12,27 +rotate:90 +H1_cigar +bounds:1724,1110,53,32 +H1_cigar _S +bounds:2694,356,51,32 +rotate:90 +H1_collar_3 +bounds:3028,342,71,58 +H1_collar_L_2 +bounds:2866,284,46,87 +rotate:90 +H1_collar_R_1 +bounds:2775,564,55,117 +rotate:90 +H1_eyes +bounds:2049,8,109,37 +H1_finger_1 +bounds:2993,135,73,38 +H1_finger_2 +bounds:45,7,61,29 +H1_finger_3 +bounds:3099,422,79,87 +H1_hand +bounds:2855,445,54,117 +H1_head +bounds:2224,2,152,182 +rotate:90 +H1_horns +bounds:2694,409,153,67 +rotate:90 +H1_neck +bounds:2442,189,189,141 +H1_shirt +bounds:1750,34,144,100 +rotate:90 +H1_sleeve_L_2 +bounds:3055,2,49,63 +H1_sleeve_R_1 +bounds:3100,287,50,72 +rotate:90 +H2_BG +bounds:2697,1118,294,304 +H2_brows +bounds:241,2,91,51 +H2_collar _2 +bounds:1928,2,38,119 +rotate:90 +H2_collar_top_1 +bounds:2894,581,108,120 +H2_curler +bounds:3104,232,67,53 +H2_ear +bounds:2408,2,138,152 +H2_earring_L_1 +bounds:2,2,34,41 +rotate:90 +H2_earring_R_2 +bounds:1610,1609,37,41 +H2_eyelid_L_2 +bounds:1182,2,36,25 +H2_eyelid_L_top_1 +bounds:1906,6,28,20 +rotate:90 +H2_eyelid_R_4 +bounds:3007,479,21,19 +offsets:2,0,23,19 +rotate:90 +H2_eyelid_R_top_3 +bounds:466,1293,25,21 +offsets:0,1,25,22 +rotate:90 +H2_glasses_L_1 +bounds:2993,175,78,55 +H2_glasses_R_3 +bounds:3180,372,54,57 +H2_hair_L_1 +bounds:2633,215,139,137 +rotate:90 +H2_hair_L_S_2 +bounds:2990,72,61,63 +offsets:2,0,66,64 +rotate:90 +H2_hair_R_2 +bounds:2772,215,84,89 +rotate:90 +H2_hand_L_1 +bounds:3007,502,82,117 +H2_hand_R_2 +bounds:2911,467,94,112 +H2_hat_1 +bounds:2620,564,153,158 +H2_hat_S_2 +bounds:2763,429,133,90 +rotate:90 +H2_head_S +bounds:3028,402,98,69 +rotate:90 +H2_mouth_3 +bounds:3004,2,29,24 +H2_mouth_bottom_2 +bounds:2479,156,31,23 +rotate:90 +H2_mouth_top_1 +bounds:1220,2,35,25 +H2_neck_1 +bounds:2675,2,71,112 +rotate:90 +H2_nose +bounds:2160,5,40,55 +rotate:90 +H2_protein_L_2 +bounds:3091,592,27,23 +rotate:90 +H2_protein_R_4 +bounds:2708,724,24,20 +H2_pupil_L_1 +bounds:1163,644,14,16 +H2_pupil_R_3 +bounds:2941,885,13,15 +rotate:90 +H2_robe +bounds:571,5,257,100 +H2_robe_S +bounds:3173,207,76,61 +rotate:90 +H2_sleeve_L_1 +bounds:1473,1609,68,41 +H2_sleeve_R_2 +bounds:3101,339,81,60 +rotate:90 +J_newspaper1_l +bounds:2226,734,157,220 +rotate:90 +J_newspaper2_r +bounds:1663,1144,149,211 +rotate:90 +K_newspaper1_l +bounds:1377,1110,188,284 +rotate:90 +K_newspaper2_r +bounds:1468,14,187,280 +rotate:90 +M1_BG +bounds:1996,47,219,226 +rotate:90 +M1_backpack +bounds:2796,88,78,125 +M1_backpackHandle +bounds:2772,301,92,126 +M1_body +bounds:2675,75,138,119 +rotate:90 +M1_effect_00604 +bounds:2993,1191,241,231 +M1_effect_00605 +bounds:2993,958,241,231 +M1_effect_00606 +bounds:1794,911,241,231 +M1_effect_00607 +bounds:2455,883,241,231 +M1_effect_00608 +bounds:2698,885,241,231 +M1_effect_00609 +bounds:2993,725,241,231 +M1_effect_00610 +bounds:1959,511,241,231 +M1_effect_00611 +bounds:1996,268,241,231 +rotate:90 +M1_hand_L_1 +bounds:3116,655,68,118 +rotate:90 +M1_hand_L_2 +bounds:3180,431,54,78 +M1_hand_L_3 +bounds:475,2,51,65 +rotate:90 +M1_hand_L_S +bounds:2894,703,69,97 +rotate:90 +M1_hand_R_1 +bounds:3005,232,53,97 +rotate:90 +M1_hand_R_2 +bounds:2876,122,55,101 +offsets:0,0,55,103 +M1_hand_R_3 +bounds:3174,285,85,60 +rotate:90 +M1_head +bounds:2548,26,125,161 +offsets:0,0,126,161 +M1_visor +bounds:2944,359,82,106 +offsets:0,2,82,108 +M2_detail_1 +bounds:3155,107,44,48 +M2_detail_2 +bounds:2884,774,107,109 +M2_detail_3 +bounds:2037,905,208,257 +rotate:90 +M3_can +bounds:819,1100,207,270 +offsets:0,0,215,270 +rotate:90 +M3_handle +bounds:2948,27,50,37 +rotate:90 +M3_pict +bounds:2775,621,123,117 +rotate:90 +M3_pict_rays +bounds:2439,332,180,203 +Q_newspaper1_l +bounds:2448,724,157,220 +rotate:90 +Q_newspaper2_r +bounds:2229,156,149,211 +rotate:90 +X2 +bounds:2866,332,111,76 +offsets:0,1,111,77 +rotate:90 +X200 +bounds:2621,356,206,71 +rotate:90 +bg +bounds:2,369,212,838 +chick_S +bounds:334,7,139,46 +chick_beak +bounds:216,380,36,23 +rotate:90 +chick_beard +bounds:2911,445,20,30 +rotate:90 +chick_body +bounds:2789,2,93,71 +chick_brows +bounds:3127,1433,44,18 +chick_eyelids +bounds:3163,382,38,15 +rotate:90 +chick_eyes +bounds:2504,158,37,29 +chick_hair +bounds:3073,177,66,53 +offsets:0,1,66,54 +chick_leg_l +bounds:3204,517,28,30 +rotate:90 +chick_leg_r +bounds:2670,724,36,20 +chick_neck +bounds:2933,138,58,85 +chick_puppil +bounds:3141,180,28,12 +chick_tail +bounds:1425,9,39,73 +offsets:0,0,39,74 +chick_wing_l +bounds:3106,72,47,61 +chick_wing_r +bounds:3106,17,49,53 +cow_S +bounds:1158,29,218,53 +cow_bell +bounds:3141,194,28,36 +cow_body +bounds:2670,746,135,134 +offsets:0,0,140,134 +rotate:90 +cow_collar +bounds:1543,1609,65,41 +cow_ear_l +bounds:3204,547,43,30 +rotate:90 +cow_ear_r +bounds:1852,2,52,32 +cow_eye +bounds:164,2,34,18 +rotate:90 +cow_eyelids +bounds:1143,2,37,25 +cow_foot_back_l +bounds:2863,225,57,90 +offsets:0,1,57,91 +rotate:90 +cow_foot_back_r +bounds:2948,2,23,54 +rotate:90 +cow_foot_front_l +bounds:2955,253,48,104 +cow_foot_front_r +bounds:2728,357,35,50 +cow_hair +bounds:2037,1115,42,27 +cow_hay +bounds:3011,1428,114,23 +cow_head +bounds:1852,36,74,139 +cow_mouth +bounds:2876,76,62,44 +cow_mouth_1 +bounds:2633,189,37,24 +cow_pupil +bounds:3225,179,26,9 +rotate:90 +cow_tail +bounds:2940,79,57,48 +rotate:90 +cow_udder +bounds:3055,67,66,49 +rotate:90 +effect_shine +bounds:489,1702,352,352 +eyelid_l_top2 +bounds:1959,488,35,21 +eyelid_r_top2 +bounds:819,1353,26,19 +rotate:90 +frame +bounds:2,1209,219,845 +glow2 +bounds:2418,537,185,200 +rotate:90 +hand_l_2 +bounds:2806,756,76,127 +hand_r_2 +bounds:1928,42,57,130 +offsets:0,1,57,131 +m3_l +bounds:1378,2,45,80 +m3_r +bounds:3005,287,53,93 +rotate:90 +pig_S +bounds:2941,900,216,50 +rotate:90 +pig_body +bounds:1794,799,175,110 +pig_brows +bounds:2548,6,45,18 +pig_ear_l +bounds:3068,135,49,38 +pig_ear_r +bounds:1663,1110,59,32 +pig_eyelids +bounds:1649,1615,35,17 +rotate:90 +pig_eyes +bounds:819,1063,45,35 +pig_head +bounds:3004,621,110,102 +pig_leg_back_l +bounds:2442,156,31,35 +rotate:90 +pig_leg_back_r +bounds:3116,592,61,117 +rotate:90 +pig_leg_front_l +bounds:2987,28,42,66 +rotate:90 +pig_leg_front_r +bounds:2884,10,62,64 +pig_mouth +bounds:542,3,50,26 +rotate:90 +pig_nose +bounds:3157,60,44,45 +pig_puppil +bounds:1750,16,31,16 +pig_ribbon +bounds:3091,511,111,79 +pig_tail +bounds:108,3,33,54 +rotate:90 +plate_bg +bounds:546,418,310,316 +offsets:0,0,311,318 +rotate:90 +plate_plate +bounds:2,38,329,237 +offsets:0,0,329,243 +rotate:90 +plate_txt +bounds:1473,1652,198,81 +ray +bounds:223,1320,264,734 +scroll +bounds:241,55,328,50 +ship +bounds:1971,744,253,159 +smoke +bounds:1673,1630,95,103 +wild_ring_1 +bounds:867,662,310,125 +wild_ring_10 +bounds:1159,1609,312,125 +wild_ring_11 +bounds:843,1611,314,123 +wild_ring_12 +bounds:1775,1295,312,127 +wild_ring_2 +bounds:1777,489,308,97 +rotate:90 +wild_ring_3 +bounds:1864,177,309,76 +rotate:90 +wild_ring_4 +bounds:1942,174,312,52 +rotate:90 +wild_ring_5 +bounds:3193,1741,313,28 +rotate:90 +wild_ring_6 +bounds:830,7,311,57 +wild_ring_7 +bounds:1876,488,309,81 +rotate:90 +wild_ring_8 +bounds:1761,180,307,101 +rotate:90 +wild_ring_9 +bounds:1158,84,308,117 +wild_rope +bounds:3171,157,52,48 diff --git a/src/stories/assets/hold-and-win/symbols/symbols.webp b/src/stories/assets/hold-and-win/symbols/symbols.webp new file mode 100644 index 0000000..8197616 Binary files /dev/null and b/src/stories/assets/hold-and-win/symbols/symbols.webp differ diff --git a/src/stories/assets/hold-and-win/symbols/wild.skel b/src/stories/assets/hold-and-win/symbols/wild.skel new file mode 100644 index 0000000..27673ea Binary files /dev/null and b/src/stories/assets/hold-and-win/symbols/wild.skel differ diff --git a/src/stories/assets/hold-and-win/textures/win_frame.png b/src/stories/assets/hold-and-win/textures/win_frame.png new file mode 100644 index 0000000..980c842 Binary files /dev/null and b/src/stories/assets/hold-and-win/textures/win_frame.png differ diff --git a/src/stories/assets/hold-and-win/winline/assembly.atlas b/src/stories/assets/hold-and-win/winline/assembly.atlas new file mode 100644 index 0000000..01d183d --- /dev/null +++ b/src/stories/assets/hold-and-win/winline/assembly.atlas @@ -0,0 +1,279 @@ +assembly.webp +size:2399,2390 +filter:Linear,Linear +Abduction_15 +bounds:1404,1545,211,191 +offsets:1,2,214,195 +Abduction_ABDUCTION_txt +bounds:2,543,587,237 +Abduction_ALIEN_txt +bounds:716,1773,301,161 +Abduction_FREE SPINS_txt +bounds:1399,1290,668,199 +Abduction_bg_Llight +bounds:1439,577,247,417 +rotate:90 +Abduction_bg_Lplate +bounds:281,1645,273,180 +Abduction_bg_Mlight +bounds:1304,327,248,473 +rotate:90 +Abduction_bg_Mplate +bounds:943,1157,335,203 +Abduction_bg_Rlight +bounds:677,698,239,445 +rotate:90 +Abduction_bg_Rplate +bounds:2,1677,277,167 +Abduction_chick +bounds:1481,1917,151,205 +rotate:90 +Abduction_cow +bounds:2,784,238,291 +rotate:90 +Abduction_pig +bounds:2069,1196,234,230 +HANGOVER_txt +bounds:1280,1078,513,210 +Hangover_DiscoBall_1_sequins +bounds:2,1459,237,216 +Hangover_DiscoBall_2_sequins +bounds:1795,1054,234,236 +rotate:90 +Hangover_DiscoBall_3_sequins +bounds:2088,1428,239,219 +Hangover_X2 +bounds:458,2316,85,60 +Hangover_X20 +bounds:847,2300,124,61 +Hangover_X200 +bounds:304,2319,152,57 +Hangover_ball_1 +bounds:2,2,284,342 +rotate:90 +Hangover_ball_2 +bounds:2070,188,277,323 +rotate:90 +PRESS ANYWHERE TO CONTINUE +bounds:719,2363,471,25 +bg_hangar +bounds:1162,855,400,221 +offsets:1,2,402,224 +bg_paper_angle +bounds:952,2084,250,115 +bg_paper_angle_S +bounds:1054,2201,192,88 +bg_pict_S +bounds:2103,1649,179,258 +rotate:90 +bg_sattelite +bounds:774,939,386,216 +offsets:1,1,432,218 +bubble1 +bounds:1192,2363,25,25 +bubbles3 +bounds:1725,2344,44,44 +buildings_dark +bounds:2,1236,939,160 +offsets:1,3,940,163 +carS_all +bounds:584,2369,133,19 +car_all +bounds:2,2143,297,104 +car_wheel_front1_all +bounds:2,2323,53,53 +car_wheel_front2_all +bounds:2,2323,53,53 +glow2 +bounds:241,1417,226,243 +rotate:90 +gold_star +bounds:2285,2137,112,123 +hangar_alien_abd +bounds:382,1019,390,215 +offsets:2,1,393,217 +left_leg_light +bounds:1564,826,226,389 +offsets:22,29,256,421 +rotate:90 +logo +bounds:437,2121,513,107 +max_win_MAX_txt_A +bounds:1970,2021,133,180 +rotate:90 +max_win_MAX_txt_M +bounds:1924,1860,159,180 +rotate:90 +max_win_MAX_txt_X +bounds:2,1999,142,180 +rotate:90 +max_win_WIN_txt +bounds:1325,2072,264,115 +max_win_plate_light +bounds:1253,1756,180,173 +monitor_screen_hangover +bounds:1877,1668,224,190 +offsets:4,6,233,199 +num_bg_all +bounds:902,86,778,239 +particle +bounds:871,1936,146,155 +rotate:90 +placeholder +bounds:1932,2169,100,98 +offsets:0,2,100,100 +plate +bounds:1858,467,350,247 +plate_S +bounds:1248,2193,166,94 +progressbar_blue2 +bounds:973,2300,61,149 +offsets:1,2,64,152 +rotate:90 +progressbar_flask1_L +bounds:2093,2339,49,135 +rotate:90 +progressbar_flask2_L +bounds:2230,2339,49,124 +rotate:90 +progressbar_flask3_L +bounds:1771,2340,48,135 +rotate:90 +progressbar_flasks1 +bounds:2236,2262,158,75 +progressbar_flasks2 +bounds:1666,1707,181,209 +rotate:90 +progressbar_green1 +bounds:696,2301,60,149 +offsets:2,1,63,152 +rotate:90 +progressbar_pink3 +bounds:545,2308,59,149 +offsets:1,1,61,152 +rotate:90 +progressbar_top +bounds:445,2234,203,72 +progressbar_wall1 +bounds:1955,716,248,240 +progressbar_wall2 +bounds:1491,2272,71,218 +rotate:90 +progressbar_wall3 +bounds:1435,1738,177,229 +rotate:90 +progressbar_wire1 +bounds:184,1998,235,142 +progressbar_wire1_S +bounds:2152,1991,235,144 +progressbar_wire2 +bounds:1173,1564,229,190 +progressbar_wire2_S +bounds:1019,1765,232,164 +progressbar_wire3 +bounds:1124,2291,70,93 +rotate:90 +progressbar_wire4 +bounds:1393,2289,68,96 +offsets:1,0,69,96 +rotate:90 +rays2_all +bounds:591,449,387,247 +red_star +bounds:2034,2167,100,113 +rotate:90 +right_leg_light +bounds:295,782,235,380 +offsets:5,13,281,401 +rotate:90 +sandL_all +bounds:57,2322,245,54 +sandR_all +bounds:1908,2340,183,48 +sattelite_dark +bounds:2,1024,378,210 +offsets:0,0,419,210 +ship +bounds:980,355,251,322 +offsets:1,2,254,326 +rotate:90 +shipS +bounds:1028,1931,451,139 +offsets:19,35,491,176 +shipS_alien_abd +bounds:421,1983,448,136 +offsets:16,52,478,190 +shipSand +bounds:556,1595,615,168 +offsets:2,12,618,184 +shipSand_alien_abd +bounds:1617,1491,469,175 +offsets:2,7,472,186 +ship_alien_abd +bounds:1124,608,245,313 +offsets:1,2,248,316 +rotate:90 +ship_all +bounds:1052,1362,345,200 +ship_ray_1 +bounds:1571,2345,152,43 +offsets:9,3,171,49 +ship_ray_2 +bounds:2033,958,282,236 +offsets:0,1,282,242 +ship_ray_3 +bounds:1219,2359,306,29 +offsets:11,3,321,34 +sign_danger_dark +bounds:2149,2156,104,134 +rotate:90 +sign_danger_light +bounds:301,2142,105,134 +rotate:90 +sign_warning_dark +bounds:1688,1890,234,155 +offsets:0,0,234,161 +sign_warning_leg_d +bounds:2,1846,150,351 +offsets:57,16,235,367 +rotate:90 +sign_warning_leg_l +bounds:355,1827,154,359 +offsets:58,11,240,370 +rotate:90 +sign_warning_light +bounds:2106,1830,240,159 +offsets:0,0,240,164 +sing_triangle_dark +bounds:1204,2076,119,115 +sing_triangle_light +bounds:1591,2070,121,117 +sing_yellow_dark +bounds:1714,2068,119,126 +offsets:0,0,120,126 +rotate:90 +sing_yellow_light +bounds:1842,2047,120,126 +rotate:90 +spark +bounds:1527,2346,42,42 +text1_smw +bounds:486,1398,564,195 +text2_smw +bounds:2,288,448,253 +text_add +bounds:1711,2269,523,68 +text_bw +bounds:1779,212,289,253 +text_fs +bounds:1416,2189,514,78 +text_fs3 +bounds:2,2249,441,68 +text_left +bounds:1219,2291,172,66 +text_mw +bounds:452,194,448,253 +text_yw +bounds:650,2230,402,68 +win_line +bounds:2,2378,580,10 \ No newline at end of file diff --git a/src/stories/assets/hold-and-win/winline/assembly.webp b/src/stories/assets/hold-and-win/winline/assembly.webp new file mode 100644 index 0000000..13a49cb Binary files /dev/null and b/src/stories/assets/hold-and-win/winline/assembly.webp differ diff --git a/src/stories/assets/hold-and-win/winline/win_line.skel b/src/stories/assets/hold-and-win/winline/win_line.skel new file mode 100644 index 0000000..138749d Binary files /dev/null and b/src/stories/assets/hold-and-win/winline/win_line.skel differ diff --git a/src/stories/assets/textures/win_line.png b/src/stories/assets/textures/win_line.png new file mode 100644 index 0000000..73125c3 Binary files /dev/null and b/src/stories/assets/textures/win_line.png differ diff --git a/src/stories/utils/MachineContainer.ts b/src/stories/utils/MachineContainer.ts new file mode 100644 index 0000000..37230ff --- /dev/null +++ b/src/stories/utils/MachineContainer.ts @@ -0,0 +1,58 @@ +import { Container, Graphics } from 'pixi.js'; +import BaseMachine from 'src/slotMachines/BaseMachine'; + +/** + * Hosts a slot machine with optional masking and boundary helpers for Storybook previews. + */ +export default class MachineContainer extends Container +{ + private readonly machine: BaseMachine; + private readonly grBondaries: Graphics; + private grMask?: Graphics; + + /** + * @param machine - Slot machine instance to display. + * @param mask - Enables the rendering mask around the machine (default: true). + */ + constructor(machine: BaseMachine, mask = true) + { + super(); + this.machine = machine; + + if (mask) + { + this.grMask = new Graphics() + .beginFill(0xff0000) + .drawRect( + -this.machine.config.width / 2, + -this.machine.config.height / 2, + this.machine.config.width, + this.machine.config.height + ); + this.machine.mask = this.grMask; + } + else + { + this.machine.mask = null; + } + + this.grBondaries = new Graphics() + .lineStyle(10, 0xff0000, 1, 1) + .drawRect( + -this.machine.config.width / 2, + -this.machine.config.height / 2, + this.machine.config.width, + this.machine.config.height + ); + + this.addChild(this.machine); + if (this.grMask) + { + this.addChild(this.grMask); + } + this.addChild(this.grBondaries); + + this.machine.x -= this.machine.config.width / 2; + this.machine.y -= this.machine.config.height / 2; + } +} diff --git a/src/stories/utils/argTypes.ts b/src/stories/utils/argTypes.ts new file mode 100644 index 0000000..c875be7 --- /dev/null +++ b/src/stories/utils/argTypes.ts @@ -0,0 +1,214 @@ +type Types = { [name: string]: object | number | string | boolean }; + +const controls = { + select: { + control: { + type: 'select' + } + }, + check: { + control: { + type: 'check' + } + }, + color: { + control: { + type: 'color' + } + }, + amount: { + control: { + type: 'range' + } + }, + type: { + control: { + type: 'radio' + } + }, + date: { + control: { + type: 'date' + } + }, + switch: { + control: { + type: 'boolean' + } + } +}; + +export const argTypes = (args: Types) => +{ + const exportArgTypes: any = {}; + + for (const key in args) + { + if (typeof args[key] === 'number') + { + let min = 0; + const arg: number = args[key] as number; + + if (key.includes('font')) + { + min = 1; + } + + if (arg >= 0) + { + if (arg >= 100) + { + exportArgTypes[key] = { + control: { + type: 'range', + min, + max: 10000, + step: 10 + } + }; + } + else if (arg > 10) + { + exportArgTypes[key] = { + control: { + type: 'range', + min, + max: 100, + step: 1 + } + }; + } + else if (arg !== 0 && arg < 1) + { + exportArgTypes[key] = { + control: { + type: 'range', + min: 0, + max: 1, + step: 0.01 + } + }; + } + else + { + exportArgTypes[key] = { + control: { + type: 'range', + min, + max: 10, + step: 1 + } + }; + } + } + else if (arg <= -100) + { + exportArgTypes[key] = { + control: { + type: 'range', + min: -1000, + max: 1000, + step: 10 + } + }; + } + else if (arg < -10) + { + exportArgTypes[key] = { + control: { + type: 'range', + min: -100, + max: 100, + step: 10 + } + }; + } + else if (arg !== 0 && arg > -1) + { + exportArgTypes[key] = { + control: { + type: 'range', + min: -1, + max: 0, + step: 0.1 + } + }; + } + else + { + exportArgTypes[key] = { + control: { + type: 'range', + min: -10, + max: 10, + step: 1 + } + }; + } + } + else + { + if (getArgType(key)) + { + exportArgTypes[key] = getArgType(key); + } + + switch (typeof args[key]) + { + case 'object': + exportArgTypes[key] = controls.select; + + if (Array.isArray(args[key])) + { + exportArgTypes[key].options = args[key]; + } + else + { + exportArgTypes[key].options = Object.keys(args).map((key) => args[key]); + } + break; + case 'boolean': + exportArgTypes[key] = controls.switch; + break; + } + } + } + + return exportArgTypes; +}; + +function getArgType(type: string) +{ + for (const control in controls) + { + if (type.toLowerCase().indexOf(control) > -1) + { + // @ts-expect-error - we are lazy + return controls[control]; + } + } + + return undefined; +} + +export const getDefaultArgs = (args: Types) => +{ + const exportArgs: any = {}; + + for (const key in args) + { + switch (typeof args[key]) + { + case 'object': + if (Array.isArray(args[key])) + { + exportArgs[key] = args[key][0] as any; + } + break; + default: + exportArgs[key] = args[key]; + } + } + + return exportArgs; +}; diff --git a/src/stories/utils/color.ts b/src/stories/utils/color.ts new file mode 100644 index 0000000..90cdef4 --- /dev/null +++ b/src/stories/utils/color.ts @@ -0,0 +1,17 @@ +// eslint-disable-next-line no-restricted-imports +import { Color } from 'pixi.js'; + +export function getColor(color: number | string): number +{ + if (color === 'transparent') + { + return undefined; + } + + if (color === undefined) + { + return undefined; + } + + return Color.shared.setValue(color).toNumber(); +} diff --git a/src/stories/utils/createScreenInputMap.ts b/src/stories/utils/createScreenInputMap.ts new file mode 100644 index 0000000..bba1cf6 --- /dev/null +++ b/src/stories/utils/createScreenInputMap.ts @@ -0,0 +1,44 @@ +import { SlotMachineConfig } from 'src/types/SlotMachineConfig'; + +// Picks a symbol key based on weights from config.symbolsWeights (if provided). +// - Unspecified symbols get default weight 1. +// - Weight 0 excludes a symbol. +// - If all weights are 0 or invalid, falls back to uniform random among symbolsKeys. +function pickWeightedSymbolKey(config: SlotMachineConfig): string { + const keys = config.symbolsKeys || []; + if (!keys.length) return '' as unknown as string; + + const weightsCfg = config.symbolsWeights || {}; + let total = 0; + const weights: number[] = keys.map((k) => { + const w = weightsCfg[k]; + const weight = typeof w === 'number' ? Math.max(0, w) : 1; + total += weight; + return weight; + }); + + // Fallback to uniform if total weight is 0 + if (total <= 0) { + const i = Math.floor(Math.random() * keys.length); + return keys[i]; + } + + let r = Math.random() * total; + for (let i = 0; i < keys.length; i++) { + const w = weights[i]; + if (r < w) return keys[i]; + r -= w; + } + return keys[keys.length - 1]; +} + +export const createScreenInputMap = (config: SlotMachineConfig) => + new Array(config.reels * config.slots).fill({}).map(() => { + const key = pickWeightedSymbolKey(config); + // Derive value from symbol config if provided; otherwise leave undefined to avoid forcing a value + const cfg = config.symbols?.[key] as any; + const value = (cfg && typeof cfg.value === 'number' && isFinite(cfg.value) && cfg.value > 0) + ? cfg.value + : undefined; + return { key, value }; + }); diff --git a/src/stories/utils/loader.ts b/src/stories/utils/loader.ts new file mode 100644 index 0000000..f1f79fe --- /dev/null +++ b/src/stories/utils/loader.ts @@ -0,0 +1,7 @@ +import { Assets } from 'pixi.js'; +import 'pixi-spine'; + +export async function preload(assets: string[]): Promise +{ + await Assets.load(assets); +} diff --git a/src/stories/utils/random.ts b/src/stories/utils/random.ts new file mode 100644 index 0000000..71d24a9 --- /dev/null +++ b/src/stories/utils/random.ts @@ -0,0 +1,156 @@ +// From a very good answer about pseudo random numbers on stack overflow +// https://stackoverflow.com/a/47593316 +function xmur3(str: string): () => number +{ + let h = 1779033703 ^ str.length; + + for (let i = 0; i < str.length; i++) + { + h = Math.imul(h ^ str.charCodeAt(i), 3432918353); + h = (h << 13) | (h >>> 19); + } + + return (): number => + { + h = Math.imul(h ^ (h >>> 16), 2246822507); + h = Math.imul(h ^ (h >>> 13), 3266489909); + + return (h ^= h >>> 16) >>> 0; + }; +} + +function mulberry32(a: number): () => number +{ + return (): number => + { + let t = (a += 0x6d2b79f5); + + t = Math.imul(t ^ (t >>> 15), t | 1); + t ^= t + Math.imul(t ^ (t >>> 7), t | 61); + + return ((t ^ (t >>> 14)) >>> 0) / 4294967296; + }; +} + +const HASH_CHARSET + = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789'; + +/** + * Creates a seeded random function similar to Math.random() based on given seed hash + * @param seed - The hash string, can be anything + * @returns Function that can be used instead Math.random + */ +export function randomSeeded(seed: string): () => number +{ + return mulberry32(xmur3(seed)()); +} + +/** + * Returns a random color + * @param random - The random function to be used (defaults to Math.random) + */ +export function randomColor(random = Math.random): number +{ + const r = Math.floor(0xff * random()); + const g = Math.floor(0xff * random()); + const b = Math.floor(0xff * random()); + + return (r << 16) | (g << 8) | b; +} + +/** + * Returns a random number within a range + * @param min - lowest number (inclusive) + * @param max - highest number (exclusive) + * @param random - The random function to be used (defaults to Math.random) + */ +export function randomRange( + min: number, + max: number, + random = Math.random +): number +{ + const a = Math.min(min, max); + const b = Math.max(min, max); + + const v = a + ((b - a) * random()); + + return v; +} + +/** + * Returns a random item from an object or array + * @param obj - The object or array + * @param random - The random function to be used (defaults to Math.random) + */ +export function randomItem(obj: T, random = Math.random): T[keyof T] +{ + if (Array.isArray(obj)) + { + return obj[Math.floor(random() * obj.length)]; + } + + const keys = Object.keys(obj as Record); + const key = keys[Math.floor(random() * keys.length)]; + + return obj[key as keyof T]; +} + +/** + * Returns a random boolean. + * @param weight - The chance of true value, between 0 and 1 + * @param random - The random function to be used (defaults to Math.random) + * @returns A random boolean + */ +export function randomBool(weight = 0.5, random = Math.random): boolean +{ + return random() < weight; +} + +/** + * Random shuffle an array in place, without cloning it + * @param array - The array that will be shuffled + * @param random - The random function to be used (defaults to Math.random) + * @returns The same array, shuffled + */ +export function randomShuffle(array: T[], random = Math.random): T[] +{ + let currentIndex = array.length; + let temporaryValue; + let randomIndex; + + while (currentIndex !== 0) + { + randomIndex = Math.floor(random() * currentIndex); + currentIndex -= 1; + temporaryValue = array[currentIndex]; + array[currentIndex] = array[randomIndex]; + array[randomIndex] = temporaryValue; + } + + return array; +} + +/** + * Return a random string hash - not guaranteed to be unique + * @param length - The length of the hash + * @param random - The random function to be used (defaults to Math.random) + * @param charset + * @returns A random string hash + */ +export function randomHash( + length: number, + random = Math.random, + charset = HASH_CHARSET +): string +{ + const charsetLength = charset.length; + let result = ''; + + for (let i = 0; i < length; i++) + { + result += charset.charAt(Math.floor(random() * charsetLength)); + } + + return result; +} diff --git a/src/stories/utils/resize.ts b/src/stories/utils/resize.ts new file mode 100644 index 0000000..8f60354 --- /dev/null +++ b/src/stories/utils/resize.ts @@ -0,0 +1,54 @@ +import { Container } from 'pixi.js'; + +export function centerElement(view: Container, horPos?: number, verPos?: number) +{ + const canvas = document.getElementById('storybook-root'); + + if (view.width > 0) + { + if (horPos === 0) + { + view.x = 0; + } + else if (horPos) + { + view.x = (canvas.offsetWidth * horPos) - (view.width / 2); + } + else + { + view.x = (canvas.offsetWidth / 2) - (view.width / 2); + } + } + else + { + view.x = canvas.offsetWidth / 2; + } + + if (view.height > 0) + { + if (verPos === 0) + { + view.y = 0; + } + else if (verPos) + { + view.y = (canvas.offsetHeight * verPos) - (view.height / 2); + } + else + { + view.y = (canvas.offsetHeight / 2) - (view.height / 2); + } + } + else + { + view.y = canvas.offsetHeight / 2; + } +} + +export function centerView(view: Container) +{ + const canvas = document.getElementById('storybook-root'); + + view.x = canvas.offsetWidth / 2; + view.y = canvas.offsetHeight / 2; +} diff --git a/src/systems/AllWinningSymbolSystem.ts b/src/systems/AllWinningSymbolSystem.ts new file mode 100644 index 0000000..94fe75a --- /dev/null +++ b/src/systems/AllWinningSymbolSystem.ts @@ -0,0 +1,63 @@ +import { WinLineRecord, WinsData } from '../types/WinsData'; +import BaseSystem from './BaseSystem'; + +/** + * @class AllWinningSymbolSystem + * @description + * System responsible for marking winning symbols in the `winningSymbols` map. + * + * This system: + * - Reads the `wins` input (`WinsData`) when entering the state. + * - Iterates through all winning lines and marks corresponding symbols as winning. + * - Uses `grid.fromCRtoMapIndex()` to convert reel/slot positions into map indices. + * + * This system does **not** handle animations or visual effects, it only updates the state. + */ +export default class AllWinningSymbolSystem extends BaseSystem +{ + public state: string = 'stopped'; + + static override requiredMaps: string[] = ['winningSymbols']; + static override requiredInputs: string[] = ['wins']; + + override onEnter() + { + this.checkIsMapSetup(); + if (!this.machine.inputs.wins) return; + this.processWinMap(); + } + + override onLeave() + { + // Do nothing + } + + update(_dt: number) + { + // Do nothing + } + + private processWinMap() + { + const winsData: WinsData = this.machine.inputs.wins; + + winsData.wins.forEach((win: WinLineRecord) => + { + win.lineSlotsIndexMap.forEach((slot: number, reel: number) => + { + const index = this.machine.utils.grid.fromCRtoMapIndex(reel, slot); + + this.machine.maps.winningSymbols[index] = true; + }); + }); + } + + private checkIsMapSetup() + { + if (!this.machine.maps.winningSymbols || this.machine.maps.winningSymbols.length === 0) + { + this.machine.maps.winningSymbols = new Array(this.machine.maps.symbols.length).fill(false); + } + } +} + diff --git a/src/systems/AnimatedExpandedSymbolsSystem.ts b/src/systems/AnimatedExpandedSymbolsSystem.ts new file mode 100644 index 0000000..5f26a7e --- /dev/null +++ b/src/systems/AnimatedExpandedSymbolsSystem.ts @@ -0,0 +1,294 @@ +import ExpandedSymbol from '../entities/ExpandedSymbol'; +import BaseMachine from '../slotMachines/BaseMachine'; +import { SymbolConfig } from '../types/SlotMachineConfig'; +import AnimationProgressHook from '../utils/hooks/AnimationProgressHook'; +import DelayHook from '../utils/hooks/DelayHook'; +import Hook from '../utils/hooks/Hook'; +import HooksChain from '../utils/hooks/HooksChain'; +import BaseSystem from './BaseSystem'; + +/** + * Represents an entity compatible with the ReelsSpinSystem. + * This entity must be able to be blocked, play idle animations, play bouncing animations, and be blurred. + */ +export type AnimatedExpandedSymbolSystemCompatibleEntity = ExpandedSymbol; + +/** Configuration settings for the reel spinning behavior in the ReelsSpinSystem. */ +export interface AnimatedExpandedSymbolsSystemSettings +{ + accelerationTime: number, + reelStartDelay: number, + reelStopDelay: number, + spinningDuration: number, + key: string, + zIndex: number, +} + +/** Enum representing different states of the spin process. */ +const SPIN_STATES = { + STOPPED: 'stopped', + STARTING: 'starting', + SPINNING: 'spinning', + STOPPING: 'stopping' +}; + +/** + * @class AnimatedExpandedSymbolsSystem + * @extends BaseSystem + * @description Handles the spinning behavior of ExpandedSymbol entities in a slot machine game, + * including the initialization, updating, and stopping of expanded symbols. + */ +export default class AnimatedExpandedSymbolsSystem extends BaseSystem +{ + /** + * Default configuration settings for reel spin behavior. + * @type {ReelsSpinSystemSettings} + */ + static defaultSettings: AnimatedExpandedSymbolsSystemSettings = { + accelerationTime: 0.1, + reelStartDelay: 0.2, + reelStopDelay: 0.5, + spinningDuration: 2, + key: 'K', + zIndex: 1000, + }; + + static override requiredFlags: string[] = ['isSpinning']; + static override requiredMaps: string[] = ['symbols']; + static override requiredInputs: string[] = ['screenMap']; + static override requiredMethods: string[] = ['createSymbol']; + static override requiredUtils: string[] = ['grid']; + + private state: string; + private elapsedTime: number = 0; + private startingReel: number = 0; + private stoppingReel: number = 0; + private expandedSymbols: AnimatedExpandedSymbolSystemCompatibleEntity[] = []; + private hooks: Array = []; + + /** + * Initializes the reel spin system with specified machine settings and prepares reels. + * @class + * @param {BaseMachine} machine - The slot machine instance that the spin system controls. + */ + constructor(machine: BaseMachine) + { + super(machine); + this.setSettings(AnimatedExpandedSymbolsSystem.defaultSettings); + this.expandedSymbols = new Array(this.machine.config.reels).fill(null); + } + + /** + * Handles the actions to be performed when entering the spin state. + * Initializes the state to STARTING, and resets the starting and stopping reels, as well as the elapsed time. + */ + override onEnter(): void + { + this.state = SPIN_STATES.STARTING; + this.startingReel = 0; + this.stoppingReel = 0; + this.elapsedTime = 0; + } + + /** + * Updates the state of the spin system based on the elapsed time and current state. + * @param dt - The delta time since the last update, in milliseconds. + */ + update(dt: number): void + { + this.elapsedTime += dt * 0.001; + + if (this.state === SPIN_STATES.STARTING) + { + this._processStarting(); + } + + if (this.state === SPIN_STATES.SPINNING) + { + this._processSpinning(); + } + + if (this.state === SPIN_STATES.STOPPING) + { + this._processStopping(); + } + + this.hooks = this.hooks.filter((hook) => + { + hook.update(dt); + + return !hook.isComplete(); + }); + } + + /** + * Processes the starting state of the spin system. + * @returns {void} + */ + _processStarting(): void + { + if (this.startingReel < this.machine.config.reels + && this.elapsedTime >= this.startingReel * this.settings.reelStartDelay) + { + this.startNext(); + } + + if (this.machine.sharedSystemData.spinSystemState === 'spinning' && this.startingReel >= this.machine.config.reels) + { + this.state = SPIN_STATES.SPINNING; + } + } + + /** + * Processes the spinning state of the slot machine. + * @returns {void} + */ + _processSpinning(): void + { + if (this.hooks.length === 0 && this.machine.sharedSystemData.spinSystemState === 'stopping') + { + this.state = SPIN_STATES.STOPPING; + this.elapsedTime = 0; + this.machine.events.addEvent('inProcessingStarted'); + } + } + + /** + * Handles the stopping process of the reels and updates the spin state. + * @returns {void} + */ + _processStopping(): void + { + if (this.stoppingReel < this.machine.config.reels && this.elapsedTime >= this.settings.reelStopDelay) + { + this.elapsedTime = 0; + this.stopNext(); + } + + if (this.hooks.length === 0 && this.machine.sharedSystemData.spinSystemState === 'stopped') + { + this.state = SPIN_STATES.STOPPED; + } + } + + /** + * Initiates the next step in processing expanded symbols on the reels. + * @returns {void} + */ + startNext(): void + { + if (!this.expandedSymbols[this.startingReel]) + { + this.startingReel++; + + return; + } + const expandedSymbol = this.expandedSymbols[this.startingReel]; + const currentReelIndex = this.startingReel; + + const chain = new HooksChain() + .addHook(new DelayHook(this.settings.accelerationTime)) + .addHook(new AnimationProgressHook(() => expandedSymbol.out())) + .setOnComplete(() => + { + expandedSymbol.destroy(); + this.expandedSymbols[currentReelIndex] = null; + }); + + this.hooks.push(chain); + this.startingReel++; + } + + /** + * Stops the next reel and handles the expanded symbols animation. + * @returns {void} + */ + stopNext(): void + { + if (!this.checkReelForExpandeds(this.stoppingReel)) + { + this.stoppingReel++; + + return; + } + const expandedSymbol = new ExpandedSymbol({ spine: 'expanding', skin: 'high' } as SymbolConfig); + + expandedSymbol.reelIndex = this.stoppingReel; + expandedSymbol.zIndex = this.settings.zIndex; + expandedSymbol.position.set( + this.machine.utils.grid.getSlotWidth() * (0.5 + this.stoppingReel), + this.machine.utils.grid.getSlotHeight() * 2 + ); + this.machine.addChild(expandedSymbol); + + const spinHook = new AnimationProgressHook(() => expandedSymbol.spin()); + const inHook = new AnimationProgressHook(() => expandedSymbol.in()); + const currentReelIndex = this.stoppingReel; + + spinHook.setOnComplete(() => + { + expandedSymbol.isLanded = true; + const reelSymbols = this.getReelSymbols(currentReelIndex); + + reelSymbols.forEach((symbol) => { symbol.alpha = 0; }); + }); + + const chain = new HooksChain(); + + chain.addHook(spinHook); + chain.addHook(inHook); + + this.hooks.push(chain); + this.expandedSymbols[this.stoppingReel] = expandedSymbol; + this.stoppingReel++; + } + + /** + * Retrieves the symbols for a specific reel index. + * @param reelIndex - The index of the reel to get symbols for. + * @returns An array of AnimatedExpandedSymbolSystemCompatibleEntity objects for the specified reel. + */ + getReelSymbols(reelIndex: number): AnimatedExpandedSymbolSystemCompatibleEntity[] + { + return this.machine.maps.symbols + .filter((_: string, idx: number) => + { + const reelCoords = this.machine.utils.grid.fromMapIndexToGridCoords(idx); + + return reelCoords.x === reelIndex; + }) + .map((id: string) => this.machine.getChildByName(id)); + } + + /** + * Checks if there are expanded symbols on the specified reel. + * @param index - The index of the reel to check. + * @returns True if there is a matching expanded symbol, otherwise false. + */ + private checkReelForExpandeds(index: number) + { + const isMatch = this.machine.inputs.screenMap + .filter((_: any, idx: number) => + { + const reelIndex = this.machine.utils.grid.fromMapIndexToGridCoords(idx); + + return reelIndex.x === index; + }) + .some((symbol: ExpandedSymbol) => + { + const isMatch = symbol.key === this.settings.key; + + return isMatch; + }); + + return isMatch; + } + + /** + * Handles the actions to be performed when leaving the current state. + * @returns {void} + */ + onLeave(): void + { + } +} diff --git a/src/systems/AnticipationAnimationsSystem.ts b/src/systems/AnticipationAnimationsSystem.ts new file mode 100644 index 0000000..dcc5c9d --- /dev/null +++ b/src/systems/AnticipationAnimationsSystem.ts @@ -0,0 +1,144 @@ +import { Container } from 'pixi.js'; +import AnticipationFrame from '../entities/AnticipationFrame'; +import ReelsMachine from '../slotMachines/ReelsMachine'; +import AnimationProgressHook from '../utils/hooks/AnimationProgressHook'; +import DelayHook from '../utils/hooks/DelayHook'; +import HooksChain from '../utils/hooks/HooksChain'; +import BaseSystem from './BaseSystem'; + +/** Configuration settings for the reel spinning behavior in the AnticipationSystem. */ +export interface AnticipationAnimationsSystemSettings +{ + enabled: boolean, + entityClass: typeof AnticipationFrame + zIndex: number, + parent: Container, +} + +/** This system is responsible to process reels anticipation animations */ +export default class AnticipationAnimationsSystem extends BaseSystem +{ + static defaultSettings: AnticipationAnimationsSystemSettings = { + enabled: true, + entityClass: AnticipationFrame, + parent: null, + zIndex: 0, + }; + + static override requiredFlags: string[] = ['isSpinning']; + static override requiredMaps: string[] = ['anticipatingReels']; + static override requiredInputs: string[] = []; + static override requiredMethods: string[] = []; + static override requiredUtils: string[] = ['grid']; + static override sharedSystemData: string[] = []; + + private frames: AnticipationFrame[] = []; + private isCreated: boolean = false; + private activeFrames: boolean[] = []; + private hooks: HooksChain[] = []; + public state: 'active' | 'stopped'; + + constructor(machine: ReelsMachine) + { + super(machine); + this.setSettings(AnticipationAnimationsSystem.defaultSettings); + } + + onEnter(): void + { + if (!this.isCreated) + { + this.createFrames(); + } + this.activeFrames = new Array(this.frames.length).fill(false); + } + + onLeave(): void + { + this.frames.forEach((frame) => frame.visible = false); + } + + update(_dt: number): void + { + this.hooks = this.hooks.filter((h) => + { + h.update(_dt); + + return !h.isComplete(); + }); + this.activeFrames.forEach((isActive, i) => + { + if (!isActive && this.machine.maps.anticipatingReels[i]) + { + this.handleStartAnticipation(i); + } + if (isActive && !this.machine.maps.anticipatingReels[i]) + { + this.handleStopAnticipation(i); + } + }); + if (this.activeFrames.every((v) => !v)) + { + this.state = 'stopped'; + } + else + { + this.state = 'active'; + } + } + + private handleStartAnticipation(frameIndex: number): void + { + this.frames[frameIndex].visible = true; + this.frames[frameIndex].show(); + this.activeFrames[frameIndex] = true; + } + + private handleStopAnticipation(frameIndex: number): void + { + const chain = new HooksChain() + .addHook(new AnimationProgressHook(() => + this.frames[frameIndex].hide())) + .addHook(new DelayHook(0.1)) + .setOnComplete(() => + { + this.frames[frameIndex].visible = false; + }); + + this.activeFrames[frameIndex] = false; + this.hooks.push(chain); + } + + private createFrames() + { + const numberOfReels = this.machine.config.reels; + + for (let i = 0; i < numberOfReels; i++) + { + this.frames.push(this.createFrame(i)); + } + this.isCreated = true; + } + + private createFrame(reelIndex: number) + { + const frame = new this.settings.entityClass(); + + this.getParent().addChild(frame); + const sW = this.machine.utils.grid.getSlotWidth(); + const halfSW = sW * 0.5; + const x = (sW * reelIndex) + halfSW; + const y = this.machine.config.height * 0.5; + + frame.position.set(x, y); + frame.zIndex = this.settings.zIndex; + frame.visible = false; + + return frame; + } + + private getParent() + { + return this.settings.parent || this.machine; + } +} diff --git a/src/systems/AnticipationSymbolsSystem.ts b/src/systems/AnticipationSymbolsSystem.ts new file mode 100644 index 0000000..fd7655b --- /dev/null +++ b/src/systems/AnticipationSymbolsSystem.ts @@ -0,0 +1,97 @@ +import { CanBeLanded, CanPlayAnticipation, Entity } from '../types/Entity'; +import AnimationProgressHook from '../utils/hooks/AnimationProgressHook'; +import HooksChain from '../utils/hooks/HooksChain'; +import BaseSystem from './BaseSystem'; + +export type AnticipationSymbolsSystemCompatibleEntity = Entity & CanPlayAnticipation & CanBeLanded; + +export default class AnticipationSymbolsSystem extends BaseSystem +{ + static override requiredFlags: string[] = []; + static override requiredMaps: string[] = ['anticipatingReels', 'symbols']; + static override requiredInputs: string[] = []; + static override requiredMethods: string[] = []; + static override requiredUtils: string[] = []; + static override sharedSystemData: string[] = ['spinSystemState', 'currentStoppingReel', 'anticipatingSymbolsTests']; + + public state: 'active' | 'anticipating' | 'stopped' = 'stopped'; + private symbolsIDs: string[] = []; + private hooks: HooksChain[] = []; + + override onEnter() + { + this.state = 'active'; + this.symbolsIDs = []; + } + + override onLeave() {} + + update(dt: number): void + { + if (this.state === 'active') + { + if (this.isAnticipatingReel()) + { + this.state = 'anticipating'; + } + } + if (this.state === 'anticipating') + { + this.animateSymbols(); + } + if (this.isStopConditionMet()) + { + this.state = 'stopped'; + this.hooks = []; + } + + if (this.machine.sharedSystemData.spinSystemState === 'stopped') + { + this.state = 'stopped'; + this.hooks = []; + } + + this.hooks = this.hooks.filter((hook) => + { + hook.update(dt); + + return !hook.isComplete(); + }); + } + + private isStopConditionMet() + { + return this.state === 'anticipating' + && this.machine.sharedSystemData.currentStoppingReel === this.machine.config.reels + && !this.machine.maps.anticipatingReels[this.machine.config.reels - 1]; + } + + private animateSymbols() + { + this.machine.maps.symbols.forEach((id: string) => + { + if (!id) return; + if (this.symbolsIDs.includes(id)) return; + const entity: AnticipationSymbolsSystemCompatibleEntity = this.machine.getChildByName(id); + + if (!entity) return; + if (this.machine.sharedSystemData.anticipatingSymbolsTests.some((t: RegExp) => t.test(entity.key))) + { + const chain = new HooksChain() + .addHook(new AnimationProgressHook(() => entity.anticipate())) + .setOnComplete(() => + { + this.symbolsIDs.splice(this.symbolsIDs.indexOf(id), 1); + }); + + this.symbolsIDs.push(id); + this.hooks.push(chain); + } + }); + } + + private isAnticipatingReel() + { + return this.machine.maps.anticipatingReels.some((v: boolean) => v); + } +} diff --git a/src/systems/AnticipationSystem.ts b/src/systems/AnticipationSystem.ts new file mode 100644 index 0000000..833dbd0 --- /dev/null +++ b/src/systems/AnticipationSystem.ts @@ -0,0 +1,267 @@ +import BaseMachine from '../slotMachines/BaseMachine'; +import { ScreenMapRecord } from '../types/ScreenInputMap'; +import DelayHook from '../utils/hooks/DelayHook'; +import Hook from '../utils/hooks/Hook'; +import HooksChain from '../utils/hooks/HooksChain'; +import BaseSystem from './BaseSystem'; + +/** Configuration settings for the reel spinning behavior in the AnticipationSystem. */ +export interface AnticipationSystemSettings +{ + enabled: boolean, + reelStopDelay: number, + duration: number, + test: RegExp, + triggerThreshold: number, + zIndex: number, +} + +/** Enum representing different states of the spin process. */ +const SPIN_STATES: { [key: string]: string; } = { + STARTING: 'starting', + SPINNING: 'spinning', + STOPPING: 'stopping', + STOPPED: 'stopped', +}; + +/** + * @class AnticipationSystem + * @extends BaseSystem + * @description Handles the spinning behavior of ExpandedSymbol entities in a slot machine game, + * including the initialization, updating, and stopping of expanded symbols. + */ +export default class AnticipationSystem extends BaseSystem +{ + /** + * Default configuration settings for reel spin behavior. + * @type {ReelsSpinSystemSettings} + */ + static defaultSettings: AnticipationSystemSettings = { + enabled: true, + reelStopDelay: 0.5, + duration: 2, + test: /A/, + triggerThreshold: 2, + zIndex: 1000, + }; + + static override requiredFlags: string[] = ['isSpinning']; + static override requiredMaps: string[] = ['symbols', 'preventReelStop', 'anticipatingReels']; + static override requiredInputs: string[] = ['screenMap']; + static override requiredMethods: string[] = ['createSymbol']; + static override requiredUtils: string[] = ['grid']; + static override sharedSystemData: string[] = ['spinSystemState', 'currentStoppingReel', 'anticipatingSymbolsTests']; + + private state: string; + private stoppingReel: number = 0; + private hooks: (Hook | HooksChain)[] = []; + private skipped: boolean = false; + + /** + * Initializes the reel spin system with specified machine settings and prepares reels. + * @class + * @param {BaseMachine} machine - The slot machine instance that the spin system controls. + */ + constructor(machine: BaseMachine) + { + super(machine); + this.setSettings(AnticipationSystem.defaultSettings); + this.stoppingReel = 0; + this.hooks = []; + } + + /** + * Handles the actions to be performed when entering the spin state. + * Initializes the state to STARTING, and resets the starting and stopping reels, as well as the elapsed time. + */ + override onEnter(): void + { + this.state = SPIN_STATES.STARTING; + this.hooks = []; + this.stoppingReel = 0; + this.skipped = false; + this.resetAnticipationReels(); + } + + /** + * Updates the state of the spin system based on the elapsed time and current state. + * @param dt - The delta time since the last update, in milliseconds. + */ + update(dt: number): void + { + if (!this.settings.enabled) + { + this.hooks = []; + this.state = SPIN_STATES.STOPPED; + this.resetAnticipationReels(); + + return; + } + + if (this.state === SPIN_STATES.STARTING) + { + if (this.machine.sharedSystemData.spinSystemState === 'stopping') + { + this.state = SPIN_STATES.SPINNING; + } + } + + if (this.state === SPIN_STATES.SPINNING) + { + this.handleScreenMapIsProvided(); + } + + if (this.machine.sharedSystemData.spinSystemState === 'stopping') + { + this.handleSkip(); + this.evaluateAnticipationTrigger(); + } + + if (this.machine.sharedSystemData.spinSystemState === 'stopped') + { + this.state = SPIN_STATES.STOPPED; + this.resetAnticipationReels(); + this.hooks = []; + } + + this.stoppingReel = this.machine.sharedSystemData.currentStoppingReel; + + this.hooks = this.hooks.filter((hook) => + { + hook.update(dt); + + return !hook.isComplete(); + }); + } + + private resetAnticipationReels() + { + this.machine.maps.anticipatingReels = new Array(this.machine.config.reels).fill(false); + this.machine.sharedSystemData.anticipatingSymbolsTests = this.machine.sharedSystemData.anticipatingSymbolsTests.filter((t: RegExp) => + { + return t !== this.settings.test; + }); + } + + private handleSkip() + { + if (!this.skipped && this.machine.inputs.fastStop) + { + this.skipped = true; + this.machine.maps.preventReelStop.forEach((_: boolean, i: number) => + { + this.machine.maps.preventReelStop[i] = false; + }); + this.hooks = this.hooks.filter((hook) => + { + hook.update(Infinity); + return !hook.isComplete(); + }); + } + } + + private evaluateAnticipationTrigger() + { + if (this.skipped) return; + if (!this.isAnticipationStartConditionIsMet()) return; + const duration = this.settings.duration; + const currentStoppingReelIndex = this.machine.sharedSystemData.currentStoppingReel; + const { reels, slots } = this.machine.config; + const map = this.updateTriggerArray(this.machine.inputs.screenMap, reels, slots, this.settings.test, this.settings.triggerThreshold); + if (map[currentStoppingReelIndex] && !this.machine.sharedSystemData.anticipatingSymbolsTests.includes(this.settings.test)) + { + this.machine.sharedSystemData.anticipatingSymbolsTests.push(this.settings.test); + } + if (this.isReelAlreadyAnticipating(currentStoppingReelIndex)) return; + this.machine.maps.anticipatingReels[currentStoppingReelIndex] = true; + const chain = new HooksChain() + .addHook(new DelayHook(duration)) + .setOnComplete(() => + { + this.machine.maps.preventReelStop[currentStoppingReelIndex] = false; + this.machine.maps.anticipatingReels[currentStoppingReelIndex] = false; + }); + + this.hooks.push(chain); + } + + private isReelAlreadyAnticipating(reelIndex: number): boolean + { + return this.machine.maps.anticipatingReels[reelIndex]; + } + + private isAnticipationStartConditionIsMet() + { + const currentStoppingReelIndex = this.machine.sharedSystemData.currentStoppingReel; + const isReelIndexChanged = this.stoppingReel !== currentStoppingReelIndex; + const isReelStopPrevented = this.machine.maps.preventReelStop[currentStoppingReelIndex]; + + return isReelStopPrevented && isReelIndexChanged; + } + + handleScreenMapIsProvided() + { + if (this.machine.inputs.screenMap) + { + const { reels, slots } = this.machine.config; + const map = this.updateTriggerArray(this.machine.inputs.screenMap, reels, slots, this.settings.test, this.settings.triggerThreshold); + + this.machine.maps.preventReelStop.forEach((v: boolean, i: number) => + { + this.machine.maps.preventReelStop[i] = v || map[i]; + }); + this.state = SPIN_STATES.STOPPING; + } + } + + private updateTriggerArray(data: ScreenMapRecord[], columns: number, rows: number, regExp: RegExp, triggerThreshold: number): boolean[] + { + const matchingColumns = this.findColumnsWithRegExp(data, columns, rows, regExp); + const triggerArray: boolean[] = new Array(columns).fill(false); + + if (matchingColumns.length === 0) return triggerArray; + const thresholdIndex = matchingColumns[triggerThreshold - 1] ?? columns; + + for (let i = thresholdIndex + 1; i < columns; i++) + { + triggerArray[i] = true; + } + + return triggerArray; + } + + private findColumnsWithRegExp(data: ScreenMapRecord[], columns: number, rows: number, regExp: RegExp): number[] + { + const matrix: ScreenMapRecord[][] = []; + + for (let i = 0; i < rows; i++) + { + matrix.push(data.slice(i * columns, (i + 1) * columns)); + } + + const result: number[] = []; + + for (let col = 0; col < columns; col++) + { + for (let row = 0; row < rows; row++) + { + if (regExp.test(matrix[row][col].key)) + { + result.push(col); + break; + } + } + } + + return result; + } + + /** + * Handles the actions to be performed when leaving the current state. + * @returns {void} + */ + onLeave(): void + { + + } +} diff --git a/src/systems/AnticipationTintingSystem.ts b/src/systems/AnticipationTintingSystem.ts new file mode 100644 index 0000000..218ed28 --- /dev/null +++ b/src/systems/AnticipationTintingSystem.ts @@ -0,0 +1,71 @@ +import { Entity } from '../types/Entity'; +import BaseSystem from './BaseSystem'; + + +export default class AnticipationTintingSystem extends BaseSystem +{ + static override requiredFlags: string[] = []; + static override requiredMaps: string[] = ['anticipatingReels', 'tinting', 'symbols']; + static override requiredInputs: string[] = []; + static override requiredMethods: string[] = []; + static override requiredUtils: string[] = []; + static override sharedSystemData: string[] = ['spinSystemState', 'currentStoppingReel', 'anticipatingSymbolsTests']; + + public state: 'active' | 'anticipating' | 'stopped' = 'stopped'; + + override onEnter() + { + this.state = 'active'; + } + + override onLeave() {} + + update(_dt: number): void + { + if (this.state === 'active') + { + if (this.isAnticipatingReel()) + { + this.state = 'anticipating'; + } + } + if (this.state === 'anticipating') + { + this.tintSymbols(); + } + if (this.isStopConditionMet()) + { + this.state = 'stopped'; + this.machine.maps.tinting.fill(false); + } + if (this.machine.sharedSystemData.spinSystemState === 'stopped') + { + this.state = 'stopped'; + this.machine.maps.tinting.fill(false); + } + } + + private isStopConditionMet() + { + return this.state === 'anticipating' + && this.machine.sharedSystemData.currentStoppingReel === this.machine.config.reels + && !this.machine.maps.anticipatingReels[this.machine.config.reels - 1]; + } + + private tintSymbols() + { + this.machine.maps.symbols.forEach((id: string, i: number) => + { + if (!id) return; + const entity: Entity = this.machine.getChildByName(id); + + if (!entity) return; + this.machine.maps.tinting[i] = !this.machine.sharedSystemData.anticipatingSymbolsTests.some((t: RegExp) => t.test(entity.key)); + }); + } + + private isAnticipatingReel() + { + return this.machine.maps.anticipatingReels.some((v: boolean) => v); + } +} diff --git a/src/systems/BaseSystem.ts b/src/systems/BaseSystem.ts new file mode 100644 index 0000000..93b8884 --- /dev/null +++ b/src/systems/BaseSystem.ts @@ -0,0 +1,114 @@ +import BaseMachine from '../slotMachines/BaseMachine'; + +/** + * @class BaseSystem + * @description Base class that defines an interface for all systems within the slot machine. Systems that extend + * BaseSystem should implement specific logic in the `onEnter`, `onLeave`, and `update` methods. + */ +abstract class BaseSystem> +{ + machine: BaseMachine; + settings: SettingsType; + + /** Static list of flags that the machine should provide. Subclasses can override to specify their own requirements. */ + static requiredFlags: string[] = []; + + /** Static list of maps that the machine should provide. Subclasses can override to specify their own requirements. */ + static requiredMaps: string[] = []; + + /** Static list of inputs that the machine should provide. Subclasses can override to specify their own requirements. */ + static requiredInputs: string[] = []; + + /** Static list of methods that the machine should provide. Subclasses can override to specify their own requirements. */ + static requiredMethods: string[] = []; + + /** Static list of utils that the machine should provide. Subclasses can override to specify their own requirements. */ + static requiredUtils: string[] = []; + + static sharedSystemData: string[] = []; + + /** + * @class + * @param {BaseMachine} machine - The slot machine instance that the system will operate on. + */ + constructor(machine: BaseMachine) + { + this.machine = machine; + this.settings = {} as SettingsType; + this._validateMachineRequirements(); + } + + /** + * Validates that the machine instance provides all required flags, maps, inputs, methods, and utilities. + * Throws an error if any requirements are missing. + * @private + */ + private _validateMachineRequirements(): void + { + const missingFlags = (this.constructor as typeof BaseSystem).requiredFlags + .filter((flag) => !(flag in this.machine.flags)); + const missingMaps = (this.constructor as typeof BaseSystem) + .requiredMaps.filter((map) => !(map in this.machine.maps)); + const missingInputs = (this.constructor as typeof BaseSystem) + .requiredInputs.filter((input) => !(input in this.machine.inputs)); + const missingMethods: string[] = (this.constructor as typeof BaseSystem) + .requiredMethods.filter((method: string) => + { + const fn = (this.machine as any)[method]; + + return typeof fn !== 'function'; + }); + const missingUtils = (this.constructor as typeof BaseSystem) + .requiredUtils.filter((util) => !(util in this.machine.utils)); + const missingSharedSystemData = (this.constructor as typeof BaseSystem) + .sharedSystemData.filter((sharedSystemData) => !(sharedSystemData in this.machine.sharedSystemData)); + + const errors: string[] = []; + + if (missingFlags.length > 0) errors.push(`Missing flags: ${missingFlags.join(', ')}`); + if (missingMaps.length > 0) errors.push(`Missing maps: ${missingMaps.join(', ')}`); + if (missingInputs.length > 0) errors.push(`Missing inputs: ${missingInputs.join(', ')}`); + if (missingMethods.length > 0) errors.push(`Missing methods: ${missingMethods.join(', ')}`); + if (missingUtils.length > 0) errors.push(`Missing utilities: ${missingUtils.join(', ')}`); + if (missingSharedSystemData.length > 0) errors.push(`Missing shared system data: ${missingSharedSystemData.join(', ')}`); + + if (errors.length > 0) + { + throw new Error(`Machine does not meet system requirements:\n${errors.join('\n')}`); + } + } + + /** + * @method onEnter + * @description Called when the system is activated or enters scope. Should be overridden in subclasses. + */ + abstract onEnter(): void; + + /** + * @method onLeave + * @description Called when the system is deactivated or leaves scope. Should be overridden in subclasses. + */ + abstract onLeave(): void; + + /** + * @method update + * @description Called on each update cycle to perform the system's primary functionality. + * Should be overridden in subclasses to add specific update logic. + */ + abstract update(dt: number): void; + + public destroy() { + + } + + /** + * Merges provided settings into the existing settings. + * @param newSettings - New settings to merge with existing settings. + */ + public setSettings(newSettings: Partial): void + { + Object.assign(this.settings, newSettings); + } +} + +export default BaseSystem; diff --git a/src/systems/BlockExitStateSystem.ts b/src/systems/BlockExitStateSystem.ts new file mode 100644 index 0000000..e9f4f6e --- /dev/null +++ b/src/systems/BlockExitStateSystem.ts @@ -0,0 +1,27 @@ +import BaseSystem from "../systems/BaseSystem"; +import BaseMachine from "../slotMachines/BaseMachine"; + +export default class BlockExitStateSystem extends BaseSystem { + public state: 'active' | 'stopped' = 'stopped' + private blockExitState: boolean = false; + + constructor(machine:BaseMachine) { + super(machine); + this.machine.inputs.blockExitState = false; + } + + static override requiredInputs = ['blockExitState']; + + override onEnter() { + this.state = 'active' + } + + override onLeave() { + // Do nothing + } + + override update(_dt: number) { + if (this.blockExitState && !this.machine.inputs.blockExitState) this.state = 'stopped'; + this.blockExitState = this.machine.inputs.blockExitState + } +} diff --git a/src/systems/BlurSymbolsSystem.ts b/src/systems/BlurSymbolsSystem.ts new file mode 100644 index 0000000..4fdac0d --- /dev/null +++ b/src/systems/BlurSymbolsSystem.ts @@ -0,0 +1,147 @@ +import { DisplayObject } from 'pixi.js'; +import { MotionBlurFilter } from '@pixi/filter-motion-blur'; +import BaseSystem from './BaseSystem'; +import BaseMachine from '../slotMachines/BaseMachine'; +import { CanBeBlurred } from '../types/Entity'; + +/** Describes motion blur configuration parameters. */ +export interface BlurSymbolsSystemSettings +{ + velocity: [number, number]; + kernelSize: number; + offset: number; +} + +/** Coordinates blur enabling and disabling for symbol entities. */ +export default class BlurSymbolsSystem extends BaseSystem +{ + /** Current lifecycle state for the blur system. */ + public state: 'running' | 'stopped' = 'stopped'; + /** Shared motion blur filter instance applied to eligible symbols. */ + private readonly blurFilter: MotionBlurFilter = new MotionBlurFilter([0, -50], 15, 7); + + /** Builds a blur system scoped to the provided machine. */ + constructor(machine: BaseMachine) + { + super(machine); + this.settings = { + velocity: [0, -50], + kernelSize: 15, + offset: 7, + } satisfies BlurSymbolsSystemSettings; + this.blurFilter.padding = 0; + this.applyFilterSettings(); + } + + /** Updates blur configuration using the provided settings. */ + public override setSettings(newSettings: Partial): void + { + const mergedSettings: BlurSymbolsSystemSettings = { + ...this.settings, + ...newSettings, + }; + + if (newSettings.velocity) + { + mergedSettings.velocity = [...newSettings.velocity] as [number, number]; + } + + this.settings = mergedSettings; + this.applyFilterSettings(); + } + + /** @inheritdoc */ + override onEnter(): void + { + this.state = 'stopped'; + this.refreshBlurState(); + } + + /** @inheritdoc */ + override onLeave(): void + { + this.state = 'stopped'; + this.clearBlurFromChildren(); + } + + /** @inheritdoc */ + override update(_dt: number): void + { + this.machine.children.forEach((child) => + { + if (!this.isBlurCapableEntity(child)) return; + + if (child.isBlurred) + { + this.applyBlur(child); + return; + } + + this.removeBlur(child); + }); + } + + /** Applies the blur effect when not already active. */ + private applyBlur(entity: CanBeBlurred): void + { + if (entity.blurEnabled) return; + + entity.filters = [this.blurFilter]; + entity.blurEnabled = true; + entity.cacheAsBitmap = false; + } + + /** Disables the blur effect when it is currently active. */ + private removeBlur(entity: CanBeBlurred): void + { + if (!entity.blurEnabled) return; + + entity.filters = null; + entity.blurEnabled = false; + entity.cacheAsBitmap = false; + } + + /** Ensures a consistent blur state for all managed children. */ + private refreshBlurState(): void + { + this.machine.children.forEach((child) => + { + if (!this.isBlurCapableEntity(child)) return; + + if (child.isBlurred) + { + this.applyBlur(child); + return; + } + + this.removeBlur(child); + }); + } + + /** Clears blur from all tracked entities when the system stops. */ + private clearBlurFromChildren(): void + { + this.machine.children.forEach((child) => + { + if (!this.isBlurCapableEntity(child)) return; + this.removeBlur(child); + }); + } + + /** Applies the configured filter options to the shared blur filter. */ + private applyFilterSettings(): void + { + const { velocity, kernelSize, offset } = this.settings; + this.blurFilter.velocity.set(...velocity); + this.blurFilter.kernelSize = kernelSize; + this.blurFilter.offset = offset; + } + + /** Type guard ensuring the display object supports blur toggling. */ + private isBlurCapableEntity(child: DisplayObject): child is DisplayObject & CanBeBlurred + { + const entity = child as CanBeBlurred; + return typeof entity.isBlurred === 'boolean' + && typeof entity.blurEnabled === 'boolean'; + } +} diff --git a/src/systems/CascadeRefillSystems.ts b/src/systems/CascadeRefillSystems.ts new file mode 100644 index 0000000..ff79437 --- /dev/null +++ b/src/systems/CascadeRefillSystems.ts @@ -0,0 +1,297 @@ +import BaseMachine from '../slotMachines/BaseMachine'; +import { CanBeBlocked, CanPlayBouncing, CanPlayFalling, CanPlayIdle, Entity } from '../types/Entity'; +import AnimationProgressHook from '../utils/hooks/AnimationProgressHook'; +import DelayHook from '../utils/hooks/DelayHook'; +import GravityHook from '../utils/hooks/GravityHook'; +import Hook from '../utils/hooks/Hook'; +import HooksChain from '../utils/hooks/HooksChain'; +import ImmediateHook from '../utils/hooks/ImmediateHook'; +import BaseSystem from './BaseSystem'; + +export type CascadeRefillSystemCompatibleEntity = Entity +& CanBeBlocked +& CanPlayFalling +& CanPlayIdle +& CanPlayBouncing; + +export interface CascadeRefillSystemSettings +{ + gravity: number; + refillDelay: number; + slotDelay: number; + spawnOffsetY: number; +} + +/** + * @class CascadeRefillSystem + * @extends BaseSystem + * @description System that manages the refill of empty slots in a cascading slot machine game. + */ +export default class CascadeRefillSystem extends BaseSystem +{ + private _droppingHooks: (Hook | HooksChain)[]; + private _refillingHooks: (Hook | HooksChain)[]; + private _delayHook?: (dt: number) => boolean; + private state: 'stopped' | 'pending' | 'refilling'; + + static defaultSettings: CascadeRefillSystemSettings = { + gravity: 4000, + refillDelay: 0, + slotDelay: 0, + spawnOffsetY: 0, + }; + + /** Required flags for the system to operate. */ + static override requiredFlags: string[] = []; + + /** Required maps for the system to operate. */ + static override requiredMaps: string[] = ['symbols']; + + /** Required inputs for the system to operate. */ + static override requiredInputs: string[] = ['screenMap']; + + /** Required methods that `machine` should implement. */ + static override requiredMethods: string[] = ['getChildByName', 'createSymbol']; + + /** Required utilities for the system to operate. */ + static override requiredUtils: string[] = ['grid']; + + constructor(machine: BaseMachine) + { + super(machine); + this.setSettings(CascadeRefillSystem.defaultSettings); + this._droppingHooks = []; + this._refillingHooks = []; + this._delayHook = undefined; + this.state = 'stopped'; + } + + /** + * Updates the state of the refill system based on the current game conditions. + * @param {number} dt - Delta time in milliseconds since the last update. + */ + update(dt: number): void + { + if (this.state === 'stopped') + { + if (!this.shouldBeRefilled()) + { + this.state = 'stopped'; + + return; + } + this.state = 'pending'; + this._createDroppingHooks(); + this._createDelayHook(); + } + + if (this.state === 'pending') + { + if (this.isPending(dt)) return; + this.state = 'refilling'; + this._createRefillingHooks(); + } + + if (this.state === 'refilling') + { + if (this._refillingHooks.length === 0) + { + this.machine.events.addEvent('respinEnded', {}); + this.state = 'stopped'; + } + } + + this.processDroppingHooks(dt); + this.processRefillingHooks(dt); + } + + /** + * Processes dropping hooks to animate symbols dropping into place. + * @param {number} dt - Delta time in milliseconds since the last update. + */ + private processDroppingHooks(dt: number): void + { + this._droppingHooks = this._processHooks(this._droppingHooks, dt); + } + + /** + * Processes refilling hooks to animate symbols refilling empty slots. + * @param {number} dt - Delta time in milliseconds since the last update. + */ + private processRefillingHooks(dt: number): void + { + this._refillingHooks = this._processHooks(this._refillingHooks, dt); + } + + /** + * Processes each hook and filters out completed ones. + * @param {Hook[]} hooks - List of hooks to process. + * @param {number} dt - Delta time in milliseconds. + * @returns {Hook[]} Updated list of active hooks. + */ + private _processHooks(hooks: (Hook | HooksChain)[], dt: number): (Hook | HooksChain)[] + { + return hooks.filter((hook) => + { + hook.update(dt); + + return !hook.isComplete(); + }); + } + + /** Creates dropping hooks for symbols that should fall into empty slots. */ + private _createDroppingHooks(): void + { + const distancesMap = this.machine.maps.symbols + .map((_: string, i: number) => this.getNumberOfEmptySlotsUnderEntity(i)); + const symbolsMap: CascadeRefillSystemCompatibleEntity[] = this.machine.maps.symbols + .map((name: string) => name ? this.machine.getChildByName(name) : null); + + this.machine.nullMap('symbols'); + + this._droppingHooks = distancesMap.map((distanceInSlots: number, i: number) => + { + const symbol = symbolsMap[i]; + + if (!symbol) return new ImmediateHook(); + if (distanceInSlots === 0) + { + this.machine.maps.symbols[i] = symbol.name; + + return new ImmediateHook(); + } + + return this._createDroppingHook(symbol, distanceInSlots, i); + }); + } + + /** + * Creates a dropping hook for a specific symbol. + * @param {Entity} symbol - The symbol to drop. + * @param {number} distanceInSlots - Distance the symbol should fall in slots. + * @param {number} i - Index in the grid. + * @returns {HooksChain} A chain of hooks for the dropping animation. + */ + private _createDroppingHook(symbol: CascadeRefillSystemCompatibleEntity, distanceInSlots: number, i: number): HooksChain + { + this.machine.maps.symbols[i + (distanceInSlots * this.machine.config.reels)] = symbol.name; + this.machine.utils.grid.fromMapIndexToXY(i).copyTo(symbol.position); + this.machine.addChild(symbol); + const slotHeight = this.machine.utils.grid.getSlotHeight(); + const gravity: number = this.settings.gravity; + + return new HooksChain() + .addHook(new ImmediateHook(() => ((symbol as CanBeBlocked).isBlocked = true))) + .addHook(new DelayHook(this._getAnimationDelay(i))) + .addHook(new ImmediateHook(() => (symbol as CanPlayFalling).falling())) + .addHook(new GravityHook(symbol, symbol.y + (distanceInSlots * slotHeight), gravity)) + .addHook(new AnimationProgressHook(() => symbol.bounce())) + .addHook(new ImmediateHook(() => symbol.idle())) + .addHook(new ImmediateHook(() => (symbol.isBlocked = false))); + } + + /** Creates refilling hooks for empty slots that need new symbols. */ + private _createRefillingHooks(): void + { + const { reels } = this.machine.config; + const emptySlotsInReelsMap = new Array(this.machine.config.reels).fill(0); + + this.machine.maps.symbols.forEach((name: any, i: number) => + { + const reel = i % reels; + + if (!name) emptySlotsInReelsMap[reel]++; + }); + this.machine.inputs.respinMap.forEach((data: { key: string; }, i: number) => + { + if (this.machine.maps.symbols[i] !== null) return; + const symbol = this.machine.createSymbol(data.key); + + this.machine.addChild(symbol); + this.machine.maps.symbols[i] = symbol.name; + symbol.position = this.machine.utils.grid.fromMapIndexToXY(i); + const distance = emptySlotsInReelsMap[i % reels] * this.machine.utils.grid.getSlotHeight() + this.settings.spawnOffsetY; + const targetY = symbol.position.y; + + symbol.y -= distance; + + const chain = new HooksChain() + .addHook(new ImmediateHook(() => (symbol.isBlocked = true))) + .addHook(new DelayHook(this._getAnimationDelay(i))) + .addHook(new GravityHook(symbol, targetY, this.settings.gravity)) + .addHook(new AnimationProgressHook(() => symbol.bounce())) + .addHook(new ImmediateHook(() => symbol.idle())) + .addHook(new ImmediateHook(() => (symbol.isBlocked = false))); + + this._refillingHooks.push(chain); + }); + } + + /** + * Counts the number of empty slots under a specific entity in a column. + * @param {number} index - The index of the entity in the grid. + * @returns {number} The count of empty slots. + */ + private getNumberOfEmptySlotsUnderEntity(index: number): number + { + let counter = 0; + const { reels, slots } = this.machine.config; + + for (let i = index + reels; Math.floor(i / reels) < slots; i += reels) + { + if (this.machine.maps.symbols[i] === null) counter++; + } + + return counter; + } + + /** Creates a delay hook for the refill process. */ + private _createDelayHook(): void + { + let time = 0; + + this._delayHook = (dt) => + { + time += dt * 0.001; + + return time >= this.settings.refillDelay; + }; + } + + /** + * Checks if the system is still pending refill. + * @param {number} dt - Delta time since last update. + * @returns {boolean} - Returns `true` if still pending. + */ + private isPending(dt: number): boolean + { + return !this._delayHook!(dt) || !this.machine.inputs.respinMap; + } + + /** + * Determines if the refill is needed based on empty slots in the grid. + * @returns {boolean} - Returns `true` if refill is needed. + */ + private shouldBeRefilled(): boolean + { + return this.machine.maps.symbols.some((symbol: string | null) => symbol === null); + } + + /** + * Gets the animation delay for a specific slot index. + * @param {number} _i - Slot index. + * @returns {number} - The delay in milliseconds. + */ + private _getAnimationDelay(_i: number): number + { + return 0; + } + + onEnter(): void + { + } + + onLeave(): void + { + } +} diff --git a/src/systems/CascadeSpinSystem.ts b/src/systems/CascadeSpinSystem.ts new file mode 100644 index 0000000..94449a2 --- /dev/null +++ b/src/systems/CascadeSpinSystem.ts @@ -0,0 +1,241 @@ +import BaseMachine from '../slotMachines/BaseMachine'; +import { CanBeBlocked, CanPlayBouncing, CanPlayFalling, CanPlayWin, Entity } from '../types/Entity'; +import { ScreenMapRecord } from '../types/ScreenInputMap'; +import AnimationProgressHook from '../utils/hooks/AnimationProgressHook'; +import DelayHook from '../utils/hooks/DelayHook'; +import GravityHook from '../utils/hooks/GravityHook'; +import HooksChain from '../utils/hooks/HooksChain'; +import ImmediateHook from '../utils/hooks/ImmediateHook'; +import BaseSystem from './BaseSystem'; + +export type CascadeSpinSystemCompatibleEntity = Entity & CanBeBlocked & CanPlayBouncing & CanPlayFalling & CanPlayWin; + +export interface CascadeSpinSystemSettings +{ + gravity: number, + reelDelay: number, + slotDelay: number, + refillDelay: number, + spawnOffsetY: number +} + +/** + * @class CascadeSpinSystem + * @extends BaseSystem + * @description Manages the cascade spinning effect in the slot machine. Handles dropping, + * refilling, and bouncing symbols with gravity effects. + */ +export default class CascadeSpinSystem extends BaseSystem +{ + /** Default settings for cascade spin system. */ + static defaultSettings: CascadeSpinSystemSettings = { + gravity: 4000, + reelDelay: 0.12, + slotDelay: 0.03, + refillDelay: 0.5, + spawnOffsetY: 0 + }; + + static override requiredFlags: string[] = ['isSpinning']; + static override requiredMaps: string[] = ['symbols']; + static override requiredInputs: string[] = ['screenMap']; + static override requiredMethods: string[] = ['getChildByName', 'createSymbol']; + static override requiredUtils: string[] = ['grid']; + + private droppingHooks: Array = []; + private refillingHooks: Array = []; + private delayHook: DelayHook | undefined; + private state: 'stopped' | 'starting' | 'pending' | 'refilling' = 'stopped'; + + /** + * Initializes the cascade spin system with specified machine settings. + * @class + * @param {BaseMachine} machine - The slot machine instance. + */ + constructor(machine: BaseMachine) + { + super(machine); + this.setSettings(CascadeSpinSystem.defaultSettings); + } + + onEnter(): void + { + this.state = 'starting'; + this.machine.flags.isSpinning = true; + } + + onLeave(): void + { + } + + /** + * Updates the cascade spin system based on the current state. + * Manages drop, refill, and bounce animations. + * @param {number} dt - Delta time since the last update, in milliseconds. + */ + override update(dt: number): void + { + const stateHandlers: Record void> = { + stopped: () => {}, + starting: () => this._handleStarting(), + pending: () => this._handlePending(dt), + refilling: () => this._handleRefilling(), + }; + + const handler = stateHandlers[this.state]; + + if (handler) handler(); + + this.delayHook?.update(dt); + this.processDropping(dt); + this.processRefilling(dt); + } + + /** + * Handles logic for the "stopped" state. + * Prepares dropping hooks and transitions to "pending". + * @private + */ + private _handleStarting(): void + { + this.state = 'pending'; + this._createDroppingHooks(); + this.delayHook = new DelayHook(this.settings.refillDelay); + this.machine.events.addEvent('outProcessingStarted'); + } + + /** + * Handles the "pending" state logic. If complete, moves to "refilling". + * @param {number} dt - Delta time for the update cycle. + * @private + */ + private _handlePending(dt: number): void + { + if (this.isPending(dt)) + { + this.state = 'refilling'; + this._createRefillingHooks(); + this.machine.events.addEvent('inProcessingStarted'); + } + } + + /** + * Handles logic for the "refilling" state, resetting to "stopped" when complete. + * @private + */ + private _handleRefilling(): void + { + if (this.refillingHooks.length === 0) + { + this.state = 'stopped'; + this.machine.flags.isSpinning = false; + this.machine.events.addEvent('inProcessingEnded'); + } + } + + /** + * Processes all active dropping hooks. + * @param {number} dt - Delta time for the update cycle. + */ + processDropping(dt: number): void + { + this.droppingHooks = this.droppingHooks.filter((hook) => + { + hook.update(dt); + + return !hook.isComplete(); + }); + } + + /** + * Processes all active refilling hooks. + * @param {number} dt - Delta time for the update cycle. + */ + processRefilling(dt: number): void + { + this.refillingHooks = this.refillingHooks.filter((hook) => + { + hook.update(dt); + + return !hook.isComplete(); + }); + } + + /** + * Checks if the pending state is complete. + * @param {number} _dt - Delta time for the update cycle. + * @returns {boolean} True if pending state is complete, otherwise false. + */ + isPending(_dt: number): boolean + { + return this.delayHook?.isComplete() && !!this.machine.inputs.screenMap; + } + + /** + * Creates hooks for dropping symbols with gravity effects. + * @private + */ + private _createDroppingHooks(): void + { + this.droppingHooks = this.machine.maps.symbols.map((name: string, i: number) => + { + if (!name) return new ImmediateHook(); + const symbol: CascadeSpinSystemCompatibleEntity = this.machine.getChildByName(name); + const targetY = this.machine.config.height + symbol.y; + const gravity = this.settings.gravity; + + return new HooksChain() + .addHook(new DelayHook(this._getAnimationDelay(i))) + .addHook(new ImmediateHook(() => symbol.falling())) + .addHook(new GravityHook(symbol, targetY, gravity)) + .setOnComplete(() => symbol.destroy()); + }); + } + + /** + * Creates hooks for refilling symbols that have fallen out of view. + * @private + */ + private _createRefillingHooks(): void + { + let landedCount = 0; + this.refillingHooks = this.machine.inputs.screenMap.map((data: ScreenMapRecord, i: number) => + { + const symbol = this.machine.createSymbol(data.key); + + this.machine.addChild(symbol); + this.machine.maps.symbols[i] = symbol.name; + this.machine.utils.grid.fromMapIndexToXY(i).copyTo(symbol.position); + const reelIndex = this.machine.utils.grid.fromMapIndexToGridCoords(i).x; + const targetY = symbol.y; + + symbol.y -= this.machine.config.height + this.settings.spawnOffsetY; + const gravity = this.settings.gravity; + + return new HooksChain() + .addHook(new DelayHook(this._getAnimationDelay(i))) + .addHook(new ImmediateHook(() => symbol.falling())) + .addHook(new GravityHook(symbol, targetY, gravity)) + .addHook(new ImmediateHook(() => { + ++landedCount % this.machine.config.slots === 1 ? this.machine.events.addEvent('reelLanded', {reelIndex}) : null + })) + .addHook(new AnimationProgressHook(() => symbol.bounce())); + }); + } + + /** + * Calculates animation delay based on symbol's reel and slot positions. + * @private + * @param {number} i - The index of the symbol. + * @returns {number} The calculated delay for the animation. + */ + private _getAnimationDelay(i: number): number + { + const { slots } = this.machine.config; + const position = this.machine.utils.grid.fromMapIndexToGridCoords(i); + const slotDelay = (slots - position.y) * this.settings.slotDelay; + const reelDelay = position.x * this.settings.reelDelay; + + return slotDelay + reelDelay; + } +} diff --git a/src/systems/CelebrateSystem.ts b/src/systems/CelebrateSystem.ts new file mode 100644 index 0000000..c5f5938 --- /dev/null +++ b/src/systems/CelebrateSystem.ts @@ -0,0 +1,130 @@ +import BaseMachine from '../slotMachines/BaseMachine'; +import AnimationProgressHook from '../utils/hooks/AnimationProgressHook'; +import HooksChain from '../utils/hooks/HooksChain'; +import BaseSystem from './BaseSystem'; + +/** Configuration settings for the reel spinning behavior in the ReelsSpinSystem. */ +export interface CelebrateSystemSettings +{ + celebrateAnimationName: string, + zIndex: number, +} + +/** Enum representing different states of the celebrate process. */ +const STATES = { + CELEBRATING: 'celebrating', + STOPPED: 'stopped', +}; + +/** + * @class AnticipationSystem + * @extends BaseSystem + * @description Handles the spinning behavior of ExpandedSymbol entities in a slot machine game, + * including the initialization, updating, and stopping of expanded symbols. + */ +export default class CelebrateSystem extends BaseSystem +{ + /** Required maps used in this system */ + static override requiredMaps: string[] = ['tinting', 'symbols']; + + private state: string; + + /** Stores hooks for tracking animation progress */ + private hooks: HooksChain[] = []; + + /** + * Default configuration settings for reel spin behavior. + * @type {ReelsSpinSystemSettings} + */ + static defaultSettings: CelebrateSystemSettings = { + celebrateAnimationName: 'win', + zIndex: 1000, + }; + + /** + * Initializes the reel spin system with specified machine settings and prepares reels. + * @class + * @param {BaseMachine} machine - The slot machine instance that the spin system controls. + */ + constructor(machine: BaseMachine) + { + super(machine); + this.setSettings(CelebrateSystem.defaultSettings); + this.state = STATES.STOPPED; + } + + /** + * Handles the actions to be performed when entering the spin state. + * Initializes the state to STARTING, and resets the starting and stopping reels, as well as the elapsed time. + */ + override onEnter(): void + { + this.state = STATES.CELEBRATING; + this.hooks = []; + this.playCelebrateAnimations(); + } + + /** + * Updates the state of the spin system based on the elapsed time and current state. + * @param dt - The delta time since the last update, in milliseconds. + */ + update(dt: number): void + { + if (this.state === STATES.CELEBRATING) + { + this.processHooks(dt); + if (this.hooks.length === 0) + { + this.machine.maps.tinting = this.machine.maps.symbols.map(() => false); + this.state = STATES.STOPPED; + } + } + } + + playCelebrateAnimations(): void + { + if (!this.machine.inputs.celebrateSymbolIndexes) return; + this.machine.maps.tinting = this.machine.maps.symbols.map(() => true); + this.machine.inputs.celebrateSymbolIndexes.forEach((index: number) => + { + const entity = this.machine.getChildByName(this.machine.maps.symbols[index]); + const prevZIndex = entity.zIndex; + + entity.zIndex = this.settings.zIndex; + + this.machine.maps.tinting[index] = false; + + const symbolChain = new HooksChain() + .addHook(new AnimationProgressHook(() => (entity as any)[this.settings.celebrateAnimationName]())) + .setOnComplete(() => + { + entity.zIndex = prevZIndex; + }); + + this.hooks.push(symbolChain); + }); + } + + /** + * Processes the hooks by updating them with the given delta time and filtering out the completed ones. + * @param {number} dt - The delta time to update the hooks. + * @returns {void} + */ + processHooks(dt: number): void + { + this.hooks = this.hooks.filter((hook) => + { + hook.update(dt); + + return !hook.isComplete(); + }); + } + + /** + * Handles the actions to be performed when leaving the current state. + * @returns {void} + */ + onLeave(): void + { + } +} diff --git a/src/systems/DisplayLineWinValueSystem.ts b/src/systems/DisplayLineWinValueSystem.ts new file mode 100644 index 0000000..3c9f5b8 --- /dev/null +++ b/src/systems/DisplayLineWinValueSystem.ts @@ -0,0 +1,95 @@ +import BaseSystem from "../systems/BaseSystem"; +import BasicWin from "../entities/BasicWin"; +import BaseMachine from "../slotMachines/BaseMachine"; + +export interface DisplayLineWinValueSystemSettings { + zIndex: number, + entityClass: typeof BasicWin +} + +export default class DisplayLineWinValueSystem extends BaseSystem { + public state: 'stopped' | 'active' = "stopped"; + + private _entity: BasicWin; + + static override requiredInputs = ['wins']; + static override sharedSystemData = ['currentWinIndex']; + + static defaultSettings:DisplayLineWinValueSystemSettings = { + zIndex: 100, + entityClass: BasicWin + } + + constructor(machine:BaseMachine) { + super(machine); + this.setSettings(DisplayLineWinValueSystem.defaultSettings); + } + + get entity() { + if (!this._entity) { + this._entity = this.createEntity(); + } + return this._entity; + } + + override onEnter() { + if (!this.getWinsData()) return; + this.setValue(); + this.setPosition(); + this.show(); + } + + override onLeave() { + this.hide() + } + + override update(dt: number) { + this.entity.update(dt); + } + + private createEntity() { + const entity = new this.settings.entityClass(); + entity.zIndex = this.settings.zIndex; + entity.position.set(0, 0) + this.machine.addChild(entity); + entity.visible = false; + return entity; + } + + private getWinsData() { + return this.machine.inputs.wins; + } + + private setPosition() { + const currentWinIndex = this.getCurrentWinIndex(); + const currentWinData = this.getWinsData().wins[currentWinIndex]; + const lineMap = this.machine.config.lines[currentWinData.lineIndex]; + const slotIndex = lineMap[Math.floor(lineMap.length / 2)]; + const mapIndex = this.machine.utils.grid.fromCRtoMapIndex(0, slotIndex); + const position = this.machine.utils.grid.fromMapIndexToXY(mapIndex) + const x = this.machine.config.width * 0.5; + const y = position.y; + this.entity.position.set(x, y); + } + + private setValue() { + this.entity.value = this.getWinsData().wins[this.getCurrentWinIndex()].amountString; + } + + private getCurrentWinIndex() { + return this.machine.sharedSystemData.currentWinIndex + } + + private show(): void { + this.entity.visible = true; + this.entity.show() + } + + private hide(): void { + this.entity.hide() + } + + override destroy() { + this._entity?.destroy() + } +} diff --git a/src/systems/DisplayTotalLinesWinSystem.ts b/src/systems/DisplayTotalLinesWinSystem.ts new file mode 100644 index 0000000..accd2f9 --- /dev/null +++ b/src/systems/DisplayTotalLinesWinSystem.ts @@ -0,0 +1,84 @@ +import BaseSystem from "../systems/BaseSystem"; +import BasicWin from "../entities/BasicWin"; +import BaseMachine from "../slotMachines/BaseMachine"; + +export interface DisplayTotalLinesWinSystemSettings { + zIndex: number, + entityClass: typeof BasicWin +} + +export default class DisplayTotalLinesWinSystem extends BaseSystem { + public state: 'stopped' | 'active' = "stopped"; + + private _entity: BasicWin; + + static override requiredInputs = ['wins']; + + static defaultSettings:DisplayTotalLinesWinSystemSettings = { + zIndex: 100, + entityClass: BasicWin + } + + constructor(machine:BaseMachine) { + super(machine); + this.setSettings(DisplayTotalLinesWinSystem.defaultSettings); + } + + get entity() { + if (!this._entity) { + this._entity = this.createEntity(); + } + return this._entity; + } + + override onEnter() { + if (!this.getWinsData()) return; + this.setValue(); + this.show(); + } + + override onLeave() { + this.hide() + } + + override update(dt: number) { + this.entity.update(dt); + } + + private createEntity() { + const entity = new this.settings.entityClass(); + entity.zIndex = this.settings.zIndex; + entity.position.set(0, 0) + this.machine.addChild(entity); + this.setCenter(entity); + entity.visible = false; + return entity; + } + + private getWinsData() { + return this.machine.inputs.wins; + } + + private setCenter(entity:BasicWin) { + const x = this.machine.config.width * 0.5; + const y = this.machine.config.height * 0.5; + entity.position.set(x, y); + } + + private setValue() { + this.entity.value = this.getWinsData().totalWinString + } + + private show(): void { + this.entity.visible = true; + this.entity.show() + } + + private hide(): void { + this.entity.hide() + } + + override destroy() { + this._entity?.destroy() + } +} diff --git a/src/systems/GridSystem.ts b/src/systems/GridSystem.ts new file mode 100644 index 0000000..5036d27 --- /dev/null +++ b/src/systems/GridSystem.ts @@ -0,0 +1,69 @@ +import { Point } from 'pixi.js'; +import BaseMachine from '../slotMachines/BaseMachine'; +import BaseSystem from '../systems/BaseSystem'; +import { Entity } from '../types/Entity'; + +/** + * @class GridSystem + * @extends BaseSystem + * @description Manages the positioning of symbols on a grid for a slot machine. + */ +export default class GridSystem extends BaseSystem +{ + /** Required utility paths. */ + static override requiredUtils: string[] = ['grid']; + + /** Required map keys. */ + static override requiredMaps: string[] = ['symbols']; + + /** + * @class + * @param {BaseMachine} machine - The slot machine instance. + */ + constructor(machine: BaseMachine) + { + super(machine); + } + + /** Updates the positions of all symbols in the grid. */ + override update(): void + { + if (!this.machine.maps.symbols) + { + this.machine.maps.symbols = []; + } + + this.machine.maps.symbols.forEach((name: string, i: number) => + { + this._updatePosition(name, i); + }); + } + + /** + * Updates the position of a symbol based on its grid index. + * @private + * @param {string} name - The name of the symbol to position. + * @param {number} i - The index in the grid. + */ + private _updatePosition(name: string, i: number): void + { + const symbol: Entity = this.machine.getChildByName(name); + + if (!symbol) return; + + const point: Point = this.machine.utils.grid.fromMapIndexToXY(i); + + if (point) + { + point.copyTo(symbol.position); + } + } + + onEnter(): void + { + } + + onLeave(): void + { + } +} diff --git a/src/systems/HighlightLandedSymbolSystem.ts b/src/systems/HighlightLandedSymbolSystem.ts new file mode 100644 index 0000000..d071328 --- /dev/null +++ b/src/systems/HighlightLandedSymbolSystem.ts @@ -0,0 +1,149 @@ +import BaseMachine from '../slotMachines/BaseMachine'; +import { CanBeHighlighted, CanBeLanded, Entity } from '../types/Entity'; +import { ITrackEntry } from '../types/ITrackEntry'; +import AnimationProgressHook from '../utils/hooks/AnimationProgressHook'; +import HooksChain from '../utils/hooks/HooksChain'; +import BaseSystem from './BaseSystem'; + +export type HighlightLandedSymbolSystemCompatibleEntity = Entity +& CanBeLanded +& CanBeHighlighted; + +/** Configuration settings for the reel spinning behavior in the ReelsSpinSystem. */ +export interface HighlightLandedSymbolSystemSettings +{ + key: string, + loop: boolean, +} + +export default class HighlightLandedSymbolSystem extends BaseSystem +{ + private state: 'stopped' | 'watching' = 'stopped'; + private hooks: HooksChain[] = []; + private animatingIds: string[] = []; + + static defaultSettings: HighlightLandedSymbolSystemSettings = { + key: '', + loop: false, + }; + + /** Static list of flags that the machine should provide. Subclasses can override to specify their own requirements. */ + static override requiredFlags: string[] = []; + + /** Static list of maps that the machine should provide. Subclasses can override to specify their own requirements. */ + static override requiredMaps: string[] = ['symbols']; + + /** Static list of inputs that the machine should provide. Subclasses can override to specify their own requirements. */ + static override requiredInputs: string[] = []; + + /** Static list of methods that the machine should provide. Subclasses can override to specify their own requirements. */ + static override requiredMethods: string[] = []; + + /** Static list of utils that the machine should provide. Subclasses can override to specify their own requirements. */ + static override requiredUtils: string[] = []; + + constructor(machine: BaseMachine) + { + super(machine); + this.setSettings(HighlightLandedSymbolSystem.defaultSettings); + } + + onEnter(): void + { + this.state = 'watching'; + this.hooks = []; + this.animatingIds = []; + } + + onLeave(): void + { + this.resetHighlightedFlags(); + } + + update(dt: number): void + { + if (this.state !== 'watching') return; + if (this.isStopConditionMet()) + { + this.state = 'stopped'; + + return; + } + this.watchTargetSymbols(); + this.processHooks(dt); + } + + private isStopConditionMet() + { + const everySymbolIsLanded = this.machine.maps.symbols.every((id: string) => + { + if (!id) return false; + const symbol: HighlightLandedSymbolSystemCompatibleEntity = this.machine.getChildByName(id); + + if (!symbol) return false; + + return symbol.isLanded; + }); + + const everyTargetSymbolIsHighlighted = this.machine.maps.symbols.every((id: string) => + { + if (!id) return false; + const symbol: HighlightLandedSymbolSystemCompatibleEntity = this.machine.getChildByName(id); + + if (!symbol) return false; + if (symbol.key !== this.settings.key) return true; + + return symbol.isHighlighted; + }); + + const hooksAreCompleted = this.hooks.length === 0; + + return everyTargetSymbolIsHighlighted && everySymbolIsLanded && hooksAreCompleted; + } + + private watchTargetSymbols() + { + this.machine.maps.symbols.forEach((id: string) => + { + if (!id) return; + const entity: HighlightLandedSymbolSystemCompatibleEntity = this.machine.getChildByName(id); + + if (!entity) return; + if (entity.key !== this.settings.key) return; + if (!entity.isLanded) return; + if (entity.isHighlighted) return; + if (this.animatingIds.includes(entity.name)) return; + this.animatingIds.push(id); + const chain = this.createChain(entity); + + this.hooks.push(chain); + }); + } + + private createChain(entity: HighlightLandedSymbolSystemCompatibleEntity) + { + return new HooksChain() + .addHook(new AnimationProgressHook((): ITrackEntry => entity.highlight())) + .setOnComplete(() => entity.isHighlighted = true); + } + + private processHooks(dt: number) + { + this.hooks = this.hooks.filter((hook) => + { + hook.update(dt); + + return !hook.isComplete(); + }); + } + + private resetHighlightedFlags() + { + this.animatingIds.forEach((id: string) => + { + const e: HighlightLandedSymbolSystemCompatibleEntity = this.machine.getChildByName(id); + + e.isHighlighted = false; + }); + } +} diff --git a/src/systems/IdleSystem.ts b/src/systems/IdleSystem.ts new file mode 100644 index 0000000..91eb436 --- /dev/null +++ b/src/systems/IdleSystem.ts @@ -0,0 +1,128 @@ +import BaseMachine from '../slotMachines/BaseMachine'; +import { CanPlayIdle, Entity, Updatable } from '../types/Entity'; +import AnimationProgressHook from '../utils/hooks/AnimationProgressHook'; +import HooksChain from '../utils/hooks/HooksChain'; +import BaseSystem from './BaseSystem'; + +export type IdleSystemCompatibleEntity = Entity & Updatable & CanPlayIdle; + +export interface IdleSystemSettings +{ + maxAnimatedSymbols: number; +} + +/** + * @class IdleSystem + * @extends BaseSystem + * @description Manages idle animations for random symbols in the slot machine. + * When the system is idle, it triggers an idle animation on a randomly chosen symbol. + */ +export default class IdleSystem extends BaseSystem +{ + /** Required flags for the system to operate. */ + static override requiredFlags: string[] = []; + + /** Required maps for the system to operate. */ + static override requiredMaps: string[] = ['symbols']; + + /** Required inputs for the system to operate. */ + static override requiredInputs: string[] = []; + + /** Required methods that `machine` should implement. */ + static override requiredMethods: string[] = ['getChildByName']; + + /** Required utilities for the system to operate. */ + static override requiredUtils: string[] = []; + + /** + * A hook for tracking the progress of the current animation. + * @private + */ + private animationHooks: HooksChain[] = []; + + private animatedSymbols: string[]; + + static defaultSettings: IdleSystemSettings = { + maxAnimatedSymbols: 3, + }; + + /** + * @class + * @param {BaseMachine} machine - The slot machine instance. + */ + constructor(machine: BaseMachine) + { + super(machine); + this.setSettings(IdleSystem.defaultSettings); + } + + /** Called when the system is activated. Resets the animation progress hook. */ + override onEnter(): void + { + this.animatedSymbols = []; + this.animationHooks = []; + } + + /** + * Updates the system, checking the progress of the current animation. + * If no animation is in progress or the current animation is complete, triggers a new animation. + * @param dt + */ + override update(dt: number): void + { + this.updateHooks(dt); + this.handleAnimatedSymbols(); + } + + private updateHooks(dt: number) + { + this.animationHooks = this.animationHooks.filter((hook) => + { + hook.update(dt); + + return !hook.isComplete(); + }); + } + + private handleAnimatedSymbols() + { + if (this.animatedSymbols.length < this.settings.maxAnimatedSymbols) + { + this._animateRandomSymbol(); + } + } + + /** + * Selects a random symbol from the machine and triggers its idle animation. + * @private + */ + private _animateRandomSymbol() + { + const { reels, slots } = this.machine.config; + const randomIndex = Math.floor(Math.random() * reels * slots); + const name = this.machine.maps.symbols[randomIndex]; + const symbol: IdleSystemCompatibleEntity = this.machine.getChildByName(name); + + if (!symbol) + { + throw new Error(`Symbol with name ${name} not found.`); + } + if (this.animatedSymbols.includes(symbol.name)) return; + this.animatedSymbols.push(symbol.name); + this.animationHooks.push( + new HooksChain() + .addHook(new AnimationProgressHook(() => symbol.idle())) + .setOnComplete(() => + { + const index = this.animatedSymbols.indexOf(symbol.name); + + if (index < 0) return; + this.animatedSymbols.splice(index, 1); + }) + ); + } + + onLeave(): void + { + } +} diff --git a/src/systems/InitSpinningExpandedSymbolsSystem.ts b/src/systems/InitSpinningExpandedSymbolsSystem.ts new file mode 100644 index 0000000..6dc5f7d --- /dev/null +++ b/src/systems/InitSpinningExpandedSymbolsSystem.ts @@ -0,0 +1,44 @@ +import SpinningExpandedSymbolsSystem from './SpinningExpandedSymbolsSystem'; + +/** + * @class InitSpinningExpandedSymbolsSystem + * @extends SpinningExpandedSymbolsSystem + * @description Handles the init of spinning expanded symbols. + */ +export default class InitSpinningExpandedSymbolsSystem extends SpinningExpandedSymbolsSystem +{ + + /** + * Handles the actions to be performed when entering the system. + * Initializes the state to active. + */ + override onEnter(): void + { + this.state = 'active'; + } + + /** + * Updates the state of the spin system based on the current state. + */ + override update(): void + { + if (!this.machine.inputs.expandedSymbolsData) return; + this.machine.inputs.expandedSymbolsData.forEach((expandedSymbolData: any, reelIndex: number) => + { + if (!expandedSymbolData) return; + const { key, value } = expandedSymbolData; + const expandedSymbol = this.createSymbol({ ...this.machine.config.expandedSymbols[key], value }, reelIndex); + this.landSymbol(expandedSymbol); + this.updateSymbol(expandedSymbol); + }); + this.state = 'stopped'; + } + + /** + * Handles the actions to be performed when leaving the current state. + * @returns {void} + */ + override onLeave(): void + { + } +} \ No newline at end of file diff --git a/src/systems/InitSystem.ts b/src/systems/InitSystem.ts new file mode 100644 index 0000000..dd74c5a --- /dev/null +++ b/src/systems/InitSystem.ts @@ -0,0 +1,110 @@ +import BaseMachine from '../slotMachines/BaseMachine'; +import { ScreenMapRecord } from '../types/ScreenInputMap'; +import BaseSystem from './BaseSystem'; + +export type InitMap = ScreenMapRecord[]; + +/** + * @class InitSystem + * @extends BaseSystem + * @description A system responsible for initializing symbols in the slot machine. It only runs once, adding + * symbols based on `initMap` data to the main scene and marking initialization as complete. + */ +export default class InitSystem extends BaseSystem +{ + /** + * List of flags required by InitSystem. + * @type {string[]} + */ + static override requiredFlags: string[] = ['init']; + + /** + * List of maps required by InitSystem. + * @type {string[]} + */ + static override requiredMaps: string[] = ['symbols']; + + /** + * List of inputs required by InitSystem. + * @type {string[]} + */ + static override requiredInputs: string[] = ['initMap']; + + /** + * List of methods required by InitSystem. + * @type {string[]} + */ + static override requiredMethods: string[] = ['createSymbol', 'addChild']; + + /** + * @class + * @param {BaseMachine} machine - The slot machine instance that requires initialization. + */ + constructor(machine: BaseMachine) + { + super(machine); + } + + /** + * @override + * @method onEnter + * @description Called when `InitSystem` is activated. Currently unused but defined for consistency with BaseSystem. + */ + onEnter(): void + { + // Can be used to prepare or reset the system if needed + } + + /** + * @override + * @method update + * @description Initializes symbols if they haven't been initialized already. + * - Creates an array in `machine.maps.symbols` to store references. + * - Iterates over `machine.inputs.initMap` to create and add each symbol. + * - Sets `machine.flags.init` to true after initialization. + */ + update(): void + { + const initMap = this.machine.inputs.initMap as InitMap; + + if (!initMap) return; // Exit if no data + if (this.machine.flags.init) return; // Exit if already initialized + + this.machine.maps.symbols = []; + + initMap.forEach((record: ScreenMapRecord) => + { + if (!record.key) + { + console.warn('InitSystem: Missing \'key\' property in record', record); + + return; + } + + const symbol = this.machine.createSymbol(record.key); + + if (symbol) + { + symbol.value = record.value; + this.machine.addChild(symbol); + this.machine.maps.symbols.push(symbol.name); + } + else + { + console.warn(`InitSystem: Failed to create symbol for key: ${record.key}`); + } + }); + + this.machine.flags.init = true; + } + + /** + * @override + * @method onLeave + * @description Called when `InitSystem` is deactivated. Currently unused but defined for consistency with BaseSystem. + */ + onLeave(): void + { + // Can be used to clean up or reset the system if needed + } +} diff --git a/src/systems/InteractiveGridSystem.ts b/src/systems/InteractiveGridSystem.ts new file mode 100644 index 0000000..a6a6ec5 --- /dev/null +++ b/src/systems/InteractiveGridSystem.ts @@ -0,0 +1,138 @@ +import { Graphics, Rectangle } from 'pixi.js'; +import BaseMachine from '../slotMachines/BaseMachine'; +import BaseSystem from './BaseSystem'; + +export interface InteractiveGridSystemSettings +{ + debug: boolean; +} + +export type InteractiveGridSystemEventData = { + reel: number; + slot: number; + mapIndex: number; +}; + +export default class InteractiveGridSystem extends BaseSystem +{ + static defaultSettings: InteractiveGridSystemSettings = { + debug: false, + }; + + static override requiredFlags: string[] = []; + static override requiredMaps: string[] = []; + static override requiredInputs: string[] = []; + static override requiredMethods: string[] = []; + static override requiredUtils: string[] = ['grid']; + static override sharedSystemData: string[] = []; + + public state: string = 'stopped'; + private debugGraphics: Graphics; + private pressedSlot: {reel: number; slot: number}; + private isSlotPressed: boolean = false; + private prevIsSlotPressed: boolean = false; + + constructor(machine: BaseMachine) + { + super(machine); + this.setSettings(InteractiveGridSystem.defaultSettings); + this.machine.eventMode = 'static'; + this.createHitArea(); + this.createGrid(); + } + + onEnter(): void + { + this.machine.on('pointerdown', this.handlePointerDown, this); + this.machine.on('pointerup', this.handlePointerUp, this); + } + + onLeave(): void + { + this.machine.off('pointerdown', this.handlePointerDown, this); + this.machine.off('pointerup', this.handlePointerUp, this); + } + + update(_dt: number): void + { + this.debugGraphics.visible = this.settings.debug; + if (this.debugGraphics.visible) this.updateDebugGraphics(); + + if (this.isSlotPressed && !this.prevIsSlotPressed) + { + this.machine.events.addEvent('slotPressed', this.pressedSlot); + } + else if (this.prevIsSlotPressed && !this.isSlotPressed) + { + this.machine.events.addEvent('slotReleased', this.pressedSlot); + this.pressedSlot = undefined; + } + this.prevIsSlotPressed = this.isSlotPressed; + } + + handlePointerDown(e: any): void + { + const position = this.machine.toLocal(e.global); + const w = this.machine.utils.grid.getSlotWidth(); + const h = this.machine.utils.grid.getSlotHeight(); + const reel = Math.floor(position.x / w); + const slot = Math.floor(position.y / h); + const mapIndex = this.machine.utils.grid.fromCRtoMapIndex(reel, slot); + const eventData: InteractiveGridSystemEventData = { reel, slot, mapIndex }; + + this.pressedSlot = eventData; + this.isSlotPressed = true; + } + + handlePointerUp(_e: any): void + { + this.isSlotPressed = false; + } + + private createGrid() + { + const gr = new Graphics(); + + this.machine.addChild(gr); + gr.zIndex = 10000; + this.debugGraphics = gr; + } + + private createHitArea() + { + const { slots, reels } = this.machine.config; + const w = this.machine.utils.grid.getSlotWidth(); + const h = this.machine.utils.grid.getSlotHeight(); + + this.machine.hitArea = new Rectangle(0, 0, w * reels, h * slots); + } + + private updateDebugGraphics() + { + const w = this.machine.utils.grid.getSlotWidth(); + const h = this.machine.utils.grid.getSlotHeight(); + + this.debugGraphics.clear(); + this.debugGraphics.lineStyle(2, 0xff0000); + const { slots, reels } = this.machine.config; + + for (let i = 0; i < reels; i++) + { + for (let j = 0; j < slots; j++) + { + const x = i * w; + const y = j * h; + + this.debugGraphics.drawRect(x, y, w, h); + } + } + if (!this.pressedSlot) return; + this.debugGraphics.beginFill(0x00ff00, 0.5); + this.debugGraphics.drawRect( + this.pressedSlot.reel * w, + this.pressedSlot.slot * h, + w, + h + ); + } +} diff --git a/src/systems/LayeringSystem.ts b/src/systems/LayeringSystem.ts new file mode 100644 index 0000000..0d3f669 --- /dev/null +++ b/src/systems/LayeringSystem.ts @@ -0,0 +1,55 @@ +import { DisplayObject } from 'pixi.js'; +import { Entity } from 'src/types/Entity'; +import BaseSystem from '../systems/BaseSystem'; + +export default class LayeringSystem extends BaseSystem +{ + public state: 'watching' | 'stopped' = 'stopped'; + + /** Static list of flags that the machine should provide. Subclasses can override to specify their own requirements. */ + static override requiredFlags: string[] = ['isSpinning']; + + /** Static list of maps that the machine should provide. Subclasses can override to specify their own requirements. */ + static override requiredMaps: string[] = ['symbols']; + + /** Static list of inputs that the machine should provide. Subclasses can override to specify their own requirements. */ + static override requiredInputs: string[] = []; + + /** Static list of methods that the machine should provide. Subclasses can override to specify their own requirements. */ + static override requiredMethods: string[] = []; + + /** Static list of utils that the machine should provide. Subclasses can override to specify their own requirements. */ + static override requiredUtils: string[] = []; + + override update(_dt: number): void + { + if (this.state === 'stopped') return; + + this.machine.children.forEach((entity: DisplayObject) => + { + const e = entity as Entity; + + if (!e.key) return; + if (this.machine.config.symbols[e.key]) + { + entity.zIndex = this.machine.config.symbols[e.key].zIndex || 0; + } + }); + + if (!this.machine.flags.isSpinning) + { + this.state = 'stopped'; + + return; + } + } + override onEnter(): void + { + this.state = 'watching'; + } + + override onLeave(): void + { + + } +} diff --git a/src/systems/MaskingSystem.ts b/src/systems/MaskingSystem.ts new file mode 100644 index 0000000..b09a06d --- /dev/null +++ b/src/systems/MaskingSystem.ts @@ -0,0 +1,176 @@ +import { DisplayObject, Graphics } from 'pixi.js'; +import BaseSystem from './BaseSystem'; +import BaseMachine from '../slotMachines/BaseMachine'; +import { CanBeMasked } from '../types/Entity'; + +/** + * Configuration settings for the masking system. + */ +export interface MaskingSystemSettings { + width: number; + height: number; + enabled: boolean; +} + +/** + * Coordinates masking behaviour across systems. + */ +export default class MaskingSystem extends BaseSystem +{ + /** Current lifecycle state for the masking system. */ + public state = 'stopped'; + + private mask: Graphics; + + constructor(machine: BaseMachine) + { + super(machine); + this.setSettings({ + width: machine.config.width, + height: machine.config.height, + enabled: true, + }); + this.mask = this.createMask(); + } + + /** + * Updates the masking settings and redraws the mask accordingly. + */ + public override setSettings(newSettings: Partial): void + { + const previousSettings = { ...this.settings }; + super.setSettings(newSettings); + + if (!this.mask) + { + return; + } + + const enabledChanged = typeof newSettings.enabled === 'boolean' + && newSettings.enabled !== previousSettings.enabled; + const dimensionsChanged = typeof newSettings.width === 'number' + || typeof newSettings.height === 'number'; + + if (enabledChanged && !this.settings.enabled) + { + this.removeMaskFromChildren(); + } + + if (dimensionsChanged || (enabledChanged && this.settings.enabled)) + { + this.refreshMaskShape(); + } + } + + /** @inheritdoc */ + override onEnter(): void + { + this.state = 'stopped'; + if (this.settings.enabled) + { + this.refreshMaskShape(); + return; + } + + this.removeMaskFromChildren(); + } + + /** @inheritdoc */ + override onLeave(): void + { + this.state = 'stopped'; + this.removeMaskFromChildren(); + } + + /** @inheritdoc */ + override update(_dt: number): void + { + if (!this.settings.enabled) + { + this.removeMaskFromChildren(); + return; + } + + this.machine.children.forEach((child) => + { + if (child === this.mask) return; + if (!this.isMaskableEntity(child)) return; + if (child.isMasked) + { + this.applyMask(child); + return; + } + this.clearMask(child); + }); + this.mask.worldTransform.copyFrom(this.machine.worldTransform) + } + + /** + * Creates the reusable mask graphics with the configured size. + */ + private createMask(): Graphics + { + const mask = new Graphics(); + mask.name = 'masking-system-mask'; + mask.visible = true; + this.drawMask(mask); + return mask; + } + + /** + * Redraws the mask using the current settings. + */ + private refreshMaskShape(): void + { + this.drawMask(this.mask); + } + + /** + * Applies the configured mask to the entity when no other mask is set. + */ + private applyMask(entity: DisplayObject & CanBeMasked): void + { + if (entity.mask) return; + entity.mask = this.mask; + } + + /** + * Removes the configured mask from the entity if it is currently applied. + */ + private clearMask(entity: DisplayObject & CanBeMasked): void + { + if (entity.mask !== this.mask) return; + entity.mask = null; + } + + /** + * Ensures entities are unmasked when the system leaves the scene. + */ + private removeMaskFromChildren(): void + { + this.machine.children.forEach((child) => + { + if (!this.isMaskableEntity(child)) return; + this.clearMask(child); + }); + } + + /** + * Type guard verifying that the display object supports masking control. + */ + private isMaskableEntity(child: DisplayObject): child is DisplayObject & CanBeMasked + { + return typeof (child as Partial).isMasked === 'boolean'; + } + + /** + * Draws a rectangle mask using the provided graphics instance. + */ + private drawMask(graphics: Graphics): void + { + graphics.clear(); + graphics.beginFill(0xff0000, 1); + graphics.drawRect(0, 0, this.settings.width, this.settings.height); + graphics.endFill(); + } +} diff --git a/src/systems/MockSystem.ts b/src/systems/MockSystem.ts new file mode 100644 index 0000000..6e81194 --- /dev/null +++ b/src/systems/MockSystem.ts @@ -0,0 +1,25 @@ +import BaseMachine from '../slotMachines/BaseMachine'; +import BaseSystem from './BaseSystem'; + +export default class MockSystem extends BaseSystem +{ + protected state:string + constructor(machine: BaseMachine) + { + super(machine); + this.state = 'stopped' + } + + update() + { + + } + + override onEnter() + { + } + + override onLeave() + { + } +} diff --git a/src/systems/ReelsSpinSystem.ts b/src/systems/ReelsSpinSystem.ts new file mode 100644 index 0000000..dd3dd18 --- /dev/null +++ b/src/systems/ReelsSpinSystem.ts @@ -0,0 +1,561 @@ +import BaseMachine from '../slotMachines/BaseMachine'; +import { HighlightLandedSymbolSystemCompatibleEntity } from '../systems/HighlightLandedSymbolSystem'; +import { CanBeBlocked, CanBeBlurred, CanBeLanded, CanBeMasked, CanPlayBouncing, CanPlayIdle, Entity } from '../types/Entity'; +import { ScreenMapRecord } from '../types/ScreenInputMap'; +import Pool from '../utils/Pool'; +import BaseSystem from './BaseSystem'; +import Reel from './reels/Reel'; + +/** + * Represents an entity compatible with the ReelsSpinSystem. + * This entity must be able to be blocked, play idle animations, play bouncing animations, and be blurred. + */ +export type ReelsSpinSystemCompatibleEntity = Entity + & CanBeBlocked + & CanPlayIdle + & CanPlayBouncing + & CanBeBlurred + & CanBeLanded + & CanBeMasked; + +/** Configuration settings for the reel spinning behavior in the ReelsSpinSystem. */ +export interface ReelsSpinSystemSettings +{ + accelerationTime: number, + backCoef: number, + maxSpeed: number, + reelStartDelay: number, + reelStopDelay: number, + spinningDuration: number, + blur: true, + bounce: true, +} + +/** Enum representing different states of the spin process. */ +const SPIN_STATES = { + STOPPED: 'stopped', + STARTING: 'starting', + SPINNING: 'spinning', + STOPPING: 'stopping' +}; + +/** + * @class ReelsSpinSystem + * @extends BaseSystem + * @description Controls the spinning behavior of slot machine reels, including acceleration, sustained spinning, and deceleration. + * This class manages reel state transitions, timing for each stage of the spin, and the display of symbols on each reel. + */ +export default class ReelsSpinSystem extends BaseSystem +{ + /** + * Default configuration settings for reel spin behavior. + * @type {ReelsSpinSystemSettings} + */ + static defaultSettings: ReelsSpinSystemSettings = { + accelerationTime: 1, + backCoef: 1.1, + maxSpeed: 40, + reelStartDelay: 0.2, + reelStopDelay: 0.5, + spinningDuration: 2, + blur: true, + bounce: true, + }; + + static override requiredFlags: string[] = ['isSpinning']; + static override requiredMaps: string[] = ['symbols', 'preventReelStop', 'preventReelsSpin']; + static override requiredInputs: string[] = ['screenMap']; + static override requiredMethods: string[] = ['createSymbol']; + static override requiredUtils: string[] = ['grid']; + static override sharedSystemData: string[] = ['spinSystemState', 'currentStoppingReel']; + + public symbolKeys: string[]; + protected reels: Reel[]; + private _state: string; + // Weighted random selection support + private _weightedKeys: { key: string, weight: number, acc: number }[] = []; + private _totalWeight: number = 0; + protected elapsedTime: number = 0; + pool: Pool; + protected startingReel: number; + protected stoppingReel: number; + protected stoppingStartTime: number; + + get state() + { + return this._state; + } + + set state(value: string) + { + this._state = value; + this.machine.sharedSystemData.spinSystemState = value; + } + + /** + * Initializes the reel spin system with specified machine settings and prepares reels. + * @class + * @param {BaseMachine} machine - The slot machine instance that the spin system controls. + */ + constructor(machine: BaseMachine) + { + super(machine); + this.setSettings(ReelsSpinSystem.defaultSettings); + this.symbolKeys = Object.keys(machine.config.symbols); + this._recomputeWeights(); + this.reels = this._initializeReels(); + this.initPreventReelsStopMap(); + this.initPreventReelsSpinMap(); + this.state = SPIN_STATES.STOPPED; + this.elapsedTime = 0; + this.pool = new Pool(); + this.startingReel = 0; + this.stoppingReel = 0; + this.stoppingStartTime = 0; + this._initializeSharedSystemData(); + } + + /** Sets up the reels to begin spinning from an idle state, initializing symbols and firing a start event. */ + override onEnter(): void + { + this.state = SPIN_STATES.STARTING; + this.machine.flags.isSpinning = true; + this.startingReel = 0; + this.stoppingReel = 0; + this.elapsedTime = 0; + this.resetIsLandedFlags(); + this.reels.forEach((reel, i) => + { + reel.setSymbols(this._getSymbolsFromScreen(i)); + }); + this.machine.events.addEvent('outProcessingStarted'); + } + + /** Initiates the spinning of the next reel in the sequence, according to the `reelStartDelay` setting. */ + startNext(): void + { + // Skip reels prevented from spinning + while (this.startingReel < this.machine.config.reels && this.isReelSpinPrevented(this.startingReel)) + { + this.startingReel++; + } + if (this.startingReel >= this.machine.config.reels) return; + this.reels[this.startingReel].start(); + this.startingReel++; + } + + /** + * Stops the next reel in the sequence by positioning it at a calculated stop position. + * Adds any remaining symbols from the screen map to the reel before stopping it. + */ + stopNext(): void + { + const reelMap: ReelsSpinSystemCompatibleEntity[] = this._getReelMapForStop(); + const reel = this.reels[this.stoppingReel]; + const stopPosition = this._calculateStopPosition(reel); + + this._setReelMapToSymbolMap(reelMap.slice().reverse(), this.stoppingReel); + reel.addSymbols(reelMap, stopPosition); + reel.stop(stopPosition); + this.stoppingReel++; + } + + /** + * Updates the state and position of each reel in the spin system. + * Manages transitions between starting, spinning, and stopping states. + * @param {number} dt - Time delta in milliseconds since the last update. + */ + override update(dt: number): void + { + this.elapsedTime += dt * 0.001; + + if (this.state === SPIN_STATES.STARTING) + { + this._processStarting(); + } + + if (this.state === SPIN_STATES.SPINNING) + { + this._processSpinning(); + } + + if (this.state === SPIN_STATES.STOPPING) + { + this._processStopping(); + } + + this.reels.forEach((reel) => reel.update(dt)); + this.syncReelBlurFlags(); + this.syncReelMaskFlags(); + + this.machine.sharedSystemData.spinSystemState = this.state; + this.machine.sharedSystemData.currentStoppingReel = this.stoppingReel; + this.machine.sharedSystemData.reelsStates = this.reels.map((reel) => reel.currentState.name); + } + + /** Synchronises blur flags with reel states, keeping blur only while reels spin. */ + private syncReelBlurFlags(): void + { + const blurEnabled = this.settings.blur; + + this.reels.forEach((reel) => + { + const stateName = reel.currentState?.name; + const shouldBlur = Boolean(blurEnabled && stateName === 'Spinning'); + + reel.symbols.forEach(([_, symbol]) => + { + symbol.isBlurred = shouldBlur; + }); + }); + } + + /** Synchronises symbol masking with reel states, keeping masks during spin and clearing them when bouncing or stopped. */ + private syncReelMaskFlags(): void + { + this.reels.forEach((reel) => + { + const stateName = reel.currentState?.name; + const shouldUnmask = stateName === 'Bouncing' || stateName === 'Stopped'; + const shouldMask = !shouldUnmask; + + reel.symbols.forEach(([_, symbol]) => + { + if (shouldMask) + { + symbol.isMasked = true; + return; + } + + if (shouldUnmask) + { + symbol.isMasked = false; + } + }); + }); + } + + /** + * Retrieves a symbol from the pool or creates a new one if none are available. + * @param {string} key - The key identifying the symbol to retrieve. + * @returns {ReelsSpinSystemCompatibleEntity} - The retrieved or newly created symbol instance. + */ + getSymbol(key: string): ReelsSpinSystemCompatibleEntity + { + const symbol = this.pool.retrieve(key); + + return symbol || this.machine.createSymbol(key); + } + + /** + * Returns a random symbol key based on optional weights from config. + * - If symbolsWeights not provided, all symbols are equally likely. + * - Symbols with weight 0 are excluded. + * - Symbols without specified weights are given equal default weight among themselves (implemented as weight = 1). + */ + public getRandomSymbolKey(): string + { + // Fast path: if total weight is zero (all zero or no symbols), fall back to uniform from symbolKeys + if (this._totalWeight <= 0) + { + // Should not happen normally; fallback safe + const idx = Math.floor(Math.random() * this.symbolKeys.length); + return this.symbolKeys[idx]; + } + + const r = Math.random() * this._totalWeight; + // Binary search could be used; linear scan is fine for small symbol sets + for (let i = 0; i < this._weightedKeys.length; i++) + { + if (r < this._weightedKeys[i].acc) return this._weightedKeys[i].key; + } + // Fallback: return last key + return this._weightedKeys[this._weightedKeys.length - 1].key; + } + + /** Precompute cumulative weights from config for fast random selection */ + private _recomputeWeights(): void + { + const weightsCfg = this.machine.config.symbolsWeights || {}; + const weighted: { key: string, weight: number, acc: number }[] = []; + + // Assign weights: use provided, default 1, but exclude if 0 + for (const key of this.symbolKeys) + { + const w = weightsCfg[key]; + const weight = (w === undefined) ? 1 : Math.max(0, Number(w)); + if (weight <= 0) continue; // exclude zero weights + weighted.push({ key, weight, acc: 0 }); + } + + // Build cumulative distribution + let acc = 0; + for (const item of weighted) + { + acc += item.weight; + item.acc = acc; + } + + this._weightedKeys = weighted; + this._totalWeight = acc; + } + + /** + * Initializes reels for the slot machine based on the machine configuration. + * @private + * @returns {Reel[]} - An array of Reel instances initialized for the system. + */ + private _initializeReels(): Reel[] + { + return Array.from({ length: this.getReelCount() }, (_, i) => + { + const reel: Reel = this.createReel(i); + + reel.onDecelerationEnded = this.onReelDecelerationEnded.bind(this, reel); + reel.onStop = this.onReelStop.bind(this, i); + + return reel; + }); + } + + /** + * Allows subclasses to control how many reels are created. By default, equals to columns count. + */ + protected getReelCount(): number + { + return this.machine.config.reels; + } + + /** + * Factory method to create a reel instance. Subclasses may override to provide custom Reel types. + * @param {number} index - reel index (column) + */ + protected createReel(index: number): Reel + { + return new Reel(this, index); + } + + private _initializeSharedSystemData() + { + this.machine.sharedSystemData.spinSystemState = this.state; + this.machine.sharedSystemData.currentStoppingReel = this.stoppingReel; + this.machine.sharedSystemData.reelsStates = this.reels.map((reel) => reel.currentState.name); + } + + onReelStop(index: number) + { + this.machine.events.addEvent('reelStopped', { index }); + } + + protected onReelDecelerationEnded(reel: Reel): void + { + this.machine.maps.symbols.forEach((id: string, i: number) => + { + if (reel.index !== this.machine.utils.grid.fromMapIndexToGridCoords(i).x) return; + const entity: HighlightLandedSymbolSystemCompatibleEntity = this.machine.getChildByName(id); + + if (!entity) return; + entity.isLanded = true; + }); + } + + /** + * Retrieves the symbols for the current reel from the screen map for stopping. + * Reverses the order to display symbols correctly on the reel. + * @private + * @returns {ReelsSpinSystemCompatibleEntity[]} - Array of Symbol instances to stop the reel with. + */ + protected _getReelMapForStop(): ReelsSpinSystemCompatibleEntity[] + { + return this.machine.inputs.screenMap + .filter((_: ScreenMapRecord, i: number) => i % this.machine.config.reels === this.stoppingReel) + .map((record: ScreenMapRecord) => + { + const symbol = this.machine.createSymbol(record.key); + + if (record.value !== undefined) { + // Assign only when value is explicitly provided + // to avoid setting invalid/undefined values on symbols + (symbol as any).value = record.value as any; + } + + return symbol; + }) + .reverse(); + } + + /** + * Calculates the appropriate stop position for the reel based on the number of symbols it holds. + * Ensures that enough symbols are present on the reel to reach the target stop position. + * @protected + * @param {Reel} reel - The reel for which to calculate the stop position. + * @returns {number} - The calculated stop position for the reel. + */ + protected _calculateStopPosition(reel: Reel): number + { + const lastSymbolPosition = reel.getLastSymbolPosition(); + const currPos = Math.ceil(reel.position); + return lastSymbolPosition > currPos ? lastSymbolPosition + 1 : currPos; + } + + /** + * Retrieves the initial symbols from the machine’s screen map for the specified reel index. + * @private + * @param {number} index - The index of the reel to retrieve symbols for. + * @returns {ReelsSpinSystemCompatibleEntity[]} - Array of Symbol instances to initialize the reel with. + */ + protected _getSymbolsFromScreen(index: number): ReelsSpinSystemCompatibleEntity[] + { + return this.machine.maps.symbols + .filter((_: string, i: number) => i % this.machine.config.reels === index) + .map((id: string) => this.machine.getChildByName(id)); + } + + /** + * Handles the timing logic for starting the reels with delays between each. + * Transitions the state to `SPINNING` once all reels are spinning. + * @private + */ + private _processStarting(): void + { + if (this.isStartConditionMet()) + { + this.startNext(); + if (this.settings.reelStartDelay === 0) + { + this._processStarting(); + } + } + + if (this.reels.every((reel, i) => reel.currentState.name === 'Spinning' || this.isReelSpinPrevented(i))) + { + this.state = SPIN_STATES.SPINNING; + } + } + + private isStartConditionMet(): boolean + { + return this.startingReel < this.machine.config.reels + && this.elapsedTime >= this.startingReel * this.settings.reelStartDelay; + } + + /** + * Manages the duration of the spinning state. Transitions to the stopping phase when time elapses. + * @private + */ + private _processSpinning(): void + { + if ( + this.elapsedTime >= this.settings.spinningDuration + && this.machine.inputs.screenMap + ) + { + this.state = SPIN_STATES.STOPPING; + this.stoppingStartTime = this.elapsedTime; + this.machine.events.addEvent('inProcessingStarted'); + } + } + + /** + * Handles the timing logic for stopping the reels with delays between each. + * Ends the spinning session once all reels are stopped and updates the screen map. + * @private + */ + private _processStopping(): void + { + // Skip reels that should not be stopped/spun at all (permanent skip) + while (this.stoppingReel < this.machine.config.reels && this.isReelSpinPrevented(this.stoppingReel)) + { + this.stoppingReel++; + } + // If current reel is under temporary stop prevention (e.g., anticipation), wait until cleared + const isTemporarilyPrevented = !!this.machine.maps.preventReelStop[this.stoppingReel]; + if (this.isStopNextReelConditionMet() && !isTemporarilyPrevented) + { + this.stopNext(); + } + if (this.isEveryReelStopped()) + { + this.machine.events.addEvent('inProcessingEnded'); + this._updateScreenMap(); + this.state = SPIN_STATES.STOPPED; + this.machine.flags.isSpinning = false; + } + } + + private isEveryReelStopped() + { + return this.reels.every((reel, i) => reel.currentState.name === 'Stopped' || this.isReelSpinPrevented(i)); + } + private isStopNextReelConditionMet() + { + return this.stoppingReel < this.machine.config.reels && this.elapsedTime - this.stoppingStartTime >= this.stoppingReel * this.settings.reelStopDelay; + } + + /** + * Updates the machine's symbol map based on the final positions of symbols on the reels. + * @private + */ + _updateScreenMap() + { + const reelsSymbols = this.reels.map((reel) => + reel.symbols.slice().reverse()); + + for (let i = this.machine.config.slots - 1; i >= 0; i--) + { + for (let j = this.machine.config.reels - 1; j >= 0; j--) + { + const mapIndex = this.machine.utils.grid.fromCRtoMapIndex(j, i); + const [_, symbol] = reelsSymbols[j][i]; + + this.machine.maps.symbols[mapIndex] = symbol.name; + } + } + } + + private _setReelMapToSymbolMap(symbolsMap: ReelsSpinSystemCompatibleEntity[], reelIndex: number) + { + symbolsMap.forEach(((symbol: ReelsSpinSystemCompatibleEntity, i: number) => + { + const mapIndex: number = this.machine.utils.grid.fromCRtoMapIndex(reelIndex, i); + + this.machine.maps.symbols[mapIndex] = symbol.name; + })); + } + + private resetIsLandedFlags() + { + this.machine.maps.symbols.forEach((id: string) => + { + const e: ReelsSpinSystemCompatibleEntity = this.machine.getChildByName(id); + + e.isLanded = false; + }); + } + + /** Handles clean-up operations when leaving the system. */ + onLeave(): void + { + } + + private initPreventReelsStopMap() + { + this.machine.maps.preventReelStop = this.reels.map(() => false); + } + + private initPreventReelsSpinMap() + { + // Default: no reels are prevented from spinning + this.machine.maps.preventReelsSpin = this.reels.map(() => false); + } + + private isReelSpinPrevented(index: number): boolean + { + const map = this.machine.maps.preventReelsSpin; + return !!(map && map[index]); + } + + public override destroy() { + this.pool.clear(); + } +} diff --git a/src/systems/ResetTintSystem.ts b/src/systems/ResetTintSystem.ts new file mode 100644 index 0000000..310e721 --- /dev/null +++ b/src/systems/ResetTintSystem.ts @@ -0,0 +1,34 @@ +import BaseMachine from '../slotMachines/BaseMachine'; +import BaseSystem from '../systems/BaseSystem'; + +export default class ResetTintSystem extends BaseSystem +{ + public state: string = 'stopped'; + + static override requiredMaps: string[] = ['tinting', 'symbols']; + + constructor(machine: BaseMachine) + { + super(machine); + } + + override onEnter() + { + this.resetTintingMap(); + } + + override onLeave() + { + // Do nothing + } + + update(_dt: number): void + { + // Do nothing + } + + private resetTintingMap() + { + this.machine.maps.tinting = new Array(this.machine.maps.symbols.length).fill(false); + } +} diff --git a/src/systems/ResetWinningSymbolsSystem.ts b/src/systems/ResetWinningSymbolsSystem.ts new file mode 100644 index 0000000..f125116 --- /dev/null +++ b/src/systems/ResetWinningSymbolsSystem.ts @@ -0,0 +1,34 @@ +import BaseMachine from '../slotMachines/BaseMachine'; +import BaseSystem from '../systems/BaseSystem'; + +export default class ResetWinningSymbolsSystem extends BaseSystem +{ + public state: string = 'stopped'; + + static override requiredMaps: string[] = ['winningSymbols', 'symbols']; + + constructor(machine: BaseMachine) + { + super(machine); + } + + override onEnter() + { + this.resetWinningSymbolsMap(); + } + + override onLeave() + { + // Do nothing + } + + update(_dt: number): void + { + // Do nothing + } + + private resetWinningSymbolsMap() + { + this.machine.maps.winningSymbols = new Array(this.machine.maps.symbols.length).fill(false); + } +} diff --git a/src/systems/SetAllWinLinesSystem.ts b/src/systems/SetAllWinLinesSystem.ts new file mode 100644 index 0000000..b7e401c --- /dev/null +++ b/src/systems/SetAllWinLinesSystem.ts @@ -0,0 +1,42 @@ +import BaseMachine from 'src/slotMachines/BaseMachine'; +import { WinLineRecord, WinsData } from 'src/types/WinsData'; +import BaseSystem from '../systems/BaseSystem'; + +export default class SetAllWinLinesSystem extends BaseSystem +{ + public state: 'watch' | 'animating' | 'stopped' = 'stopped'; + + static override requiredInputs: string[] = ['wins']; + static override sharedSystemData: string[] = ['animateLines']; + + constructor(machine: BaseMachine) + { + super(machine); + } + + override onEnter() + { + this.handleWinsData(); + } + + override update(_dt: number) + { + // Do nothing + } + + override onLeave() + { + // Do nothing + } + + private handleWinsData() + { + const winsData: WinsData = this.machine.inputs.wins; + const wins: WinLineRecord[] = winsData.wins; + + wins.forEach((win: WinLineRecord) => + { + this.machine.sharedSystemData.animateLines.push(win.lineIndex); + }); + } +} diff --git a/src/systems/SetCurrentWinLinesSystem.ts b/src/systems/SetCurrentWinLinesSystem.ts new file mode 100644 index 0000000..cb3d38b --- /dev/null +++ b/src/systems/SetCurrentWinLinesSystem.ts @@ -0,0 +1,40 @@ +import BaseMachine from 'src/slotMachines/BaseMachine'; +import { WinLineRecord, WinsData } from 'src/types/WinsData'; +import BaseSystem from '../systems/BaseSystem'; + +export default class SetCurrentWinLinesSystem extends BaseSystem +{ + public state: string = 'stopped'; + + static override requiredInputs: string[] = ['wins']; + static override sharedSystemData: string[] = ['animateLines', 'currentWinIndex']; + + constructor(machine: BaseMachine) + { + super(machine); + } + + override onEnter() + { + this.handleWinsData(); + } + + override update(_dt: number) + { + // do nothing + } + + override onLeave() + { + // Do nothing + } + + private handleWinsData() + { + const winsData: WinsData = this.machine.inputs.wins; + const currentWinIndex = this.machine.sharedSystemData.currentWinIndex; + const win: WinLineRecord = winsData.wins[currentWinIndex]; + + this.machine.sharedSystemData.animateLines.push(win.lineIndex); + } +} diff --git a/src/systems/SetWinningLineSymbolsSystem.ts b/src/systems/SetWinningLineSymbolsSystem.ts new file mode 100644 index 0000000..a155f70 --- /dev/null +++ b/src/systems/SetWinningLineSymbolsSystem.ts @@ -0,0 +1,42 @@ +import { WinLineRecord, WinsData } from 'src/types/WinsData'; +import BaseSystem from '../systems/BaseSystem'; + +export default class SetWinningLineSymbolsSystem extends BaseSystem +{ + public state: string = 'stopped'; + + static override requiredMaps: string[] = ['winningSymbols']; + static override requiredInputs: string[] = ['wins']; + static override sharedSystemData: string[] = ['currentWinIndex']; + + override onEnter() + { + if (!this.machine.inputs.wins) return; + this.processWinMap(); + } + + override onLeave() + { + // Do nothing + } + + override update(_dt: number) + { + // Do nothing + } + + private processWinMap() + { + const currentWinIndex = this.machine.sharedSystemData.currentWinIndex; + const winsData: WinsData = this.machine.inputs.wins; + const currentWinData: WinLineRecord = winsData.wins[currentWinIndex]; + const symbolsMap: number[] = currentWinData.lineSlotsIndexMap; + + symbolsMap.forEach((slotIndex: number, reel: number) => + { + const mapIndex = this.machine.utils.grid.fromCRtoMapIndex(reel, slotIndex); + + this.machine.maps.winningSymbols[mapIndex] = true; + }); + } +} diff --git a/src/systems/SingleSlotReelsSpinSystem.ts b/src/systems/SingleSlotReelsSpinSystem.ts new file mode 100644 index 0000000..c7b1831 --- /dev/null +++ b/src/systems/SingleSlotReelsSpinSystem.ts @@ -0,0 +1,407 @@ +import BaseMachine from '../slotMachines/BaseMachine'; +import ReelsSpinSystem, { ReelsSpinSystemCompatibleEntity, ReelsSpinSystemSettings } from './ReelsSpinSystem'; +import SingleSlotReel from './reels/SingleSlotReel'; +import Reel from './reels/Reel'; +import { ScreenMapRecord } from '../types/ScreenInputMap'; + +/** Settings for {@link SingleSlotReelsSpinSystem}. */ +export interface SingleSlotReelsSpinSystemSettings extends ReelsSpinSystemSettings { + /** Delay in seconds between stopping individual slot reels within the same column. */ + slotStopDelay: number; +} + +interface ColumnStopTask { + reelIndex: number; + mapIndex: number; + symbol: ReelsSpinSystemCompatibleEntity | null; +} + +interface ColumnStopQueue { + column: number; + unifiedStop: number; + tasks: ColumnStopTask[]; + nextTask: number; + lastStopTime: number; +} + +/** + * SingleSlotReelsSpinSystem: specialized ReelsSpinSystem that creates N per-cell SingleSlotReel instances + * and maps symbols per slot. + */ +export default class SingleSlotReelsSpinSystem extends ReelsSpinSystem { + public static override defaultSettings: SingleSlotReelsSpinSystemSettings = { + ...ReelsSpinSystem.defaultSettings, + slotStopDelay: 0, + }; + + private _cellPreventReelsSpin: boolean[] = []; + private _columnStopQueues: ColumnStopQueue[] = []; + private _nextColumnToSchedule: number = 0; + private _lastColumnFirstSlotTime: number = Number.NEGATIVE_INFINITY; + + constructor(machine: BaseMachine) { + super(machine); + this.settings = { + ...SingleSlotReelsSpinSystem.defaultSettings, + ...this.settings, + } as SingleSlotReelsSpinSystemSettings; + } + + /** Returns the settings as {@link SingleSlotReelsSpinSystemSettings}. */ + private get _typedSettings(): SingleSlotReelsSpinSystemSettings { + return this.settings as SingleSlotReelsSpinSystemSettings; + } + + protected override getReelCount(): number { + return this.machine.config.reels * this.machine.config.slots; + } + + protected override createReel(index: number): Reel { + return new SingleSlotReel(this, index); + } + + /** + * Override onEnter to reconcile per-cell prevent map with base column-level logic. + * - Cache per-cell map locally for SingleSlot start/stop decisions. + * - Expose a column-level prevent map to the base class so its stopping logic works correctly. + */ + public override onEnter(): void { + super.onEnter(); + const reels = this.machine.config.reels; + const slots = this.machine.config.slots; + // Accept shorter per-cell arrays and pad with false up to total cells + const total = reels * slots; + const input = (this.machine.maps.preventReelsSpin || []) as boolean[]; + const padded: boolean[] = new Array(total).fill(false); + for (let i = 0; i < Math.min(input.length, total); i++) { + padded[i] = !!input[i]; + } + this._cellPreventReelsSpin = padded; + this._columnStopQueues = []; + this._nextColumnToSchedule = 0; + this._lastColumnFirstSlotTime = Number.NEGATIVE_INFINITY; + // Keep per-cell map in machine.maps to let base checks (reels.every) treat prevented cell-reels as already spun + this.machine.maps.preventReelsSpin = this._cellPreventReelsSpin; + } + + protected override _getSymbolsFromScreen(index: number): ReelsSpinSystemCompatibleEntity[] { + const id = this.machine.maps.symbols[index]; + if (!id) return []; + const symbol = this.machine.getChildByName(id) as unknown as ReelsSpinSystemCompatibleEntity; + return symbol ? [symbol] : []; + } + + protected override _getReelMapForStop(): ReelsSpinSystemCompatibleEntity[] { + const stoppingIndex = this.machine.sharedSystemData.currentStoppingReel ?? 0; + const record: ScreenMapRecord = this.machine.inputs.screenMap[stoppingIndex]; + if (!record) return []; + const symbol = this.machine.createSymbol(record.key); + if (record.value !== undefined) { + (symbol as any).value = record.value as any; + } + return [symbol]; + } + + /** + * Callback hook: in SingleSlotReelsSpinSystem the screen map is set per-cell during stopNext(). + * Do not rebuild or mutate the map here. + */ + override _updateScreenMap(): void { + // no-op: screen map was already updated during stopNext() + } + + /** + * Override update to use per-cell prevention without column aggregation. + * Skips stopping a column only if all its cell-reels are prevented. + */ + public override update(dt: number): void { + const settings = this._typedSettings; + // advance time in seconds + this.elapsedTime += dt * 0.001; + + // STARTING phase + if (this.state === 'starting') { + const canStart = this.startingReel < this.machine.config.reels + && this.elapsedTime >= this.startingReel * settings.reelStartDelay; + if (canStart) { + this.startNext(); + if (settings.reelStartDelay === 0) { + // start remaining columns immediately + this.update(0); + return; + } + } + // transition to SPINNING when all reels are spinning or prevented + const prevent = this.machine.maps.preventReelsSpin || []; + if (this.reels.every((reel, i) => reel.currentState.name === 'Spinning' || !!prevent[i])) { + this.state = 'spinning'; + } + } + + // SPINNING phase + if (this.state === 'spinning') { + if (this.elapsedTime >= settings.spinningDuration && this.machine.inputs.screenMap) { + this.state = 'stopping'; + this.stoppingStartTime = this.elapsedTime; + this.machine.events.addEvent('inProcessingStarted'); + } + } + + // STOPPING phase + if (this.state === 'stopping') { + this._scheduleColumnStops(settings.reelStopDelay); + this._processColumnStopQueues(); + // Finish when every per-cell reel is Stopped or Prevented + const prevent = this.machine.maps.preventReelsSpin || []; + if (this.reels.every((reel, i) => reel.currentState.name === 'Stopped' || !!prevent[i])) { + this.machine.events.addEvent('inProcessingEnded'); + this._updateScreenMap(); + this.state = 'stopped'; + this.machine.flags.isSpinning = false; + } + } + + // Update all reels + this.reels.forEach((reel) => reel.update(dt)); + + // Shared data update + this.machine.sharedSystemData.spinSystemState = this.state as any; + this.machine.sharedSystemData.currentStoppingReel = this._nextColumnToSchedule; + this.machine.sharedSystemData.reelsStates = this.reels.map((reel) => reel.currentState.name); + } + + private _isColumnFullyPrevented(col: number): boolean { + const reels = this.machine.config.reels; + const slots = this.machine.config.slots; + for (let row = 0; row < slots; row++) { + const idx = col + row * reels; + if (!this._cellPreventReelsSpin[idx]) return false; + } + return true; + } + + /** Starts all row reels for the current column in a single step. */ + public override startNext(): void { + const col = this.startingReel; + const reels = this.machine.config.reels; + const slots = this.machine.config.slots; + + // Guard: nothing to start if column index exceeds total columns + if (col >= reels) return; + + const preventMap: boolean[] = this._cellPreventReelsSpin || []; + for (let row = 0; row < slots; row++) { + const idx = col + row * reels; // per-cell reel index + if (!preventMap[idx]) { + this.reels[idx].start(); + } + } + // Advance to next column regardless, so fully prevented columns are skipped + this.startingReel++; + } + + /** Stops all row reels for the current column in a single step. */ + public override stopNext(): void { + this._scheduleNextColumnStop(); + } + + // Ensure landed marking works per column for per-cell reels + protected override onReelDecelerationEnded(reel: Reel): void { + const reels = this.machine.config.reels; + const reelCol = reel.index % reels; + this.machine.maps.symbols.forEach((id: string, i: number) => { + if (reelCol !== this.machine.utils.grid.fromMapIndexToGridCoords(i).x) return; + const entity = this.machine.getChildByName(id) as unknown as ReelsSpinSystemCompatibleEntity; + if (!entity) return; + entity.isLanded = true; + }); + } + + /** + * Builds a queue describing how reels in a column should be stopped. + */ + private _createColumnStopQueue(column: number, unifiedStop: number, rows: number[]): ColumnStopQueue { + const reels = this.machine.config.reels; + const queue: ColumnStopTask[] = rows.map((row) => { + const reelIndex = column + row * reels; + const mapIndex = this.machine.utils.grid.fromCRtoMapIndex(column, row); + const record: ScreenMapRecord = this.machine.inputs.screenMap[mapIndex]; + let symbol: ReelsSpinSystemCompatibleEntity | null = null; + if (record) { + symbol = this.machine.createSymbol(record.key); + if (record.value !== undefined) { + (symbol as any).value = record.value as any; + } + } + + return { reelIndex, mapIndex, symbol }; + }); + + return { + column, + unifiedStop, + tasks: queue, + nextTask: 0, + lastStopTime: Number.NEGATIVE_INFINITY, + }; + } + + /** + * Progresses the currently active column stop queue while respecting the configured delay. + */ + private _processColumnStopQueues(): void { + const slotDelay = this._typedSettings.slotStopDelay ?? 0; + + for (let i = 0; i < this._columnStopQueues.length;) { + const queue = this._columnStopQueues[i]; + + while (queue.nextTask < queue.tasks.length) { + const isFirst = queue.nextTask === 0; + if (!isFirst && (this.elapsedTime - queue.lastStopTime) < slotDelay) { + break; + } + + this._stopNextSlotFromQueue(queue); + + if (queue.nextTask >= queue.tasks.length) { + break; + } + } + + if (queue.nextTask >= queue.tasks.length) { + this._finalizeQueueAtIndex(i); + } else { + i++; + } + } + } + + /** + * Stops the next slot reel according to the active queue definition. + */ + private _stopNextSlotFromQueue(queue: ColumnStopQueue): void { + const task = queue.tasks[queue.nextTask]; + const reel = this.reels[task.reelIndex] as SingleSlotReel; + const symbols = task.symbol ? [task.symbol] : []; + + this._setSymbolMapEntry(task.mapIndex, task.symbol); + + const stopPosition = queue.unifiedStop; + + reel.trimSymbolsFrom(stopPosition); + reel.addSymbols(symbols, stopPosition); + reel.retainOnlySymbolAt(stopPosition); + reel.stop(stopPosition); + + if (queue.nextTask === 0) { + this._lastColumnFirstSlotTime = this.elapsedTime; + } + + queue.nextTask++; + queue.lastStopTime = this.elapsedTime; + } + + /** Removes a completed queue and advances the stopped column counter. */ + private _finalizeQueueAtIndex(index: number): void { + this._columnStopQueues.splice(index, 1); + this.stoppingReel++; + } + + /** Updates the machine symbol map for the provided index. */ + private _setSymbolMapEntry(mapIndex: number, symbol: ReelsSpinSystemCompatibleEntity | null): void { + if (!Array.isArray(this.machine.maps.symbols)) { + this.machine.maps.symbols = []; + } + if (this.machine.maps.symbols.length <= mapIndex) { + this.machine.maps.symbols.length = mapIndex + 1; + } + this.machine.maps.symbols[mapIndex] = symbol ? symbol.name : null; + } + + /** + * Calculates the appropriate stop position for the reel based on the number of symbols it holds. + * Ensures that enough symbols are present on the reel to reach the target stop position. + * @private + * @param {Reel} reel - The reel for which to calculate the stop position. + * @returns {number} - The calculated stop position for the reel. + */ + protected override _calculateStopPosition(reel: SingleSlotReel): number { + const lastSymbolPosition = reel.getLastSymbolPosition(); + return lastSymbolPosition + 1; + } + + /** Attempts to schedule the next column stop if timing conditions are met. */ + private _scheduleColumnStops(reelStopDelay: number): void { + const totalColumns = this.machine.config.reels; + const delay = Math.max(0, reelStopDelay); + + while (this._nextColumnToSchedule < totalColumns) { + const columnIndex = this._nextColumnToSchedule; + + if (this._isColumnFullyPrevented(columnIndex)) { + this._markColumnAsCompleted(); + continue; + } + + if (!this._canStartNextColumn(delay)) { + break; + } + + this.stopNext(); + } + } + + /** Returns true when enough time has elapsed to begin the next column stop. */ + private _canStartNextColumn(delay: number): boolean { + if (this._nextColumnToSchedule === 0) { + return true; + } + return (this.elapsedTime - this._lastColumnFirstSlotTime) >= delay; + } + + /** Schedules the next available column stop queue. */ + private _scheduleNextColumnStop(): void { + const totalColumns = this.machine.config.reels; + const reels = this.machine.config.reels; + const slots = this.machine.config.slots; + + while (this._nextColumnToSchedule < totalColumns) { + const column = this._nextColumnToSchedule; + if (this._isColumnFullyPrevented(column)) { + this._markColumnAsCompleted(); + continue; + } + + const rowsToStop: number[] = []; + for (let row = 0; row < slots; row++) { + const idx = column + row * reels; + if (!this._cellPreventReelsSpin[idx]) rowsToStop.push(row); + } + + if (rowsToStop.length === 0) { + this._markColumnAsCompleted(); + continue; + } + + let unifiedStop = 0; + for (const row of rowsToStop) { + const idx = column + row * reels; + const reel = this.reels[idx] as SingleSlotReel; + const pos = this._calculateStopPosition(reel); + if (pos > unifiedStop) unifiedStop = pos; + } + + const queue = this._createColumnStopQueue(column, unifiedStop, rowsToStop); + this._columnStopQueues.push(queue); + this._nextColumnToSchedule++; + this._stopNextSlotFromQueue(queue); + return; + } + } + + /** Marks a fully prevented column as finished. */ + private _markColumnAsCompleted(): void { + this._nextColumnToSchedule++; + this.stoppingReel++; + } +} diff --git a/src/systems/SlotMultipliersSystem.ts b/src/systems/SlotMultipliersSystem.ts new file mode 100644 index 0000000..74d8034 --- /dev/null +++ b/src/systems/SlotMultipliersSystem.ts @@ -0,0 +1,190 @@ +import BaseMachine from '../slotMachines/BaseMachine'; +import SlotMultiplierEntity from '../entities/SlotMultiplierEntity'; +import GridUtils from '../utils/GridUtils'; +import BaseSystem from './BaseSystem'; + +/** Factory signature for SlotMultiplierEntity derivatives. */ +export type SlotMultiplierEntityConstructor = new () => SlotMultiplierEntity; + +/** Runtime configuration for {@link SlotMultipliersSystem}. */ +export interface SlotMultipliersSystemSettings +{ + entityClass: SlotMultiplierEntityConstructor; +} + +/** + * Projects multiplier overlays on top of slots based on the `slotMultipliers` map. + */ +export default class SlotMultipliersSystem extends BaseSystem +{ + public static defaultSettings: SlotMultipliersSystemSettings = { + entityClass: SlotMultiplierEntity, + }; + + public static override requiredMaps: string[] = ['slotMultipliers']; + public static override requiredUtils: string[] = ['grid']; + + /** Tracks whether the system currently has pending work for the state machine. */ + public state: 'active' | 'stopped' = 'stopped'; + + private entities: SlotMultiplierEntity[] = []; + private warnedAboutLength = false; + + constructor(machine: BaseMachine) + { + super(machine); + this.setSettings(SlotMultipliersSystem.defaultSettings); + } + + public override onEnter(): void + { + this.state = 'active'; + this.ensureEntityPool(); + this.refreshVisibility(); + this.state = 'stopped'; + } + + /** + * Leaves overlays untouched; visibility is fully driven by the multiplier map. + */ + public override onLeave(): void + { + this.state = 'stopped'; + } + + public override update(_dt: number): void + { + this.state = 'active'; + this.ensureEntityPool(); + this.refreshVisibility(); + this.state = 'stopped'; + } + + /** + * Ensures there is exactly one overlay entity per slot and keeps positions in sync with the grid. + */ + private ensureEntityPool(): void + { + const total = this.machine.config.reels * this.machine.config.slots; + const grid = this.grid(); + + for (let index = 0; index < total; index++) + { + if (this.entities[index]) + { + const position = grid.fromMapIndexToXY(index); + if (position) + { + this.entities[index].position.copyFrom(position); + } + + continue; + } + + const entity = new this.settings.entityClass(); + entity.name = `slotMultiplier-${index}`; + entity.visible = false; + entity.zIndex = 10_000; + const position = grid.fromMapIndexToXY(index); + if (position) + { + entity.position.copyFrom(position); + } + this.machine.addChild(entity); + this.entities[index] = entity; + } + + if (this.entities.length > total) + { + for (let i = total; i < this.entities.length; i++) + { + const entity = this.entities[i]; + if (entity) + { + entity.destroy(); + } + } + this.entities.length = total; + } + } + + /** + * Shows or hides entities based on the current multiplier map. + */ + private refreshVisibility(): void + { + const total = this.machine.config.reels * this.machine.config.slots; + const multipliers = this.normaliseMultipliers(total); + + for (let i = 0; i < total; i++) + { + const entity = this.entities[i]; + if (!entity) continue; + + const value = multipliers[i]; + entity.value = value; + + if (value > 0) + { + if (!entity.isShown()) + { + entity.in(); + } + } + else if (entity.isShown()) + { + entity.out(); + } + } + } + + /** + * Validates and normalises the raw multiplier map against the expected cell count. + */ + private normaliseMultipliers(total: number): number[] + { + const map = this.machine.maps.slotMultipliers; + if (!Array.isArray(map)) + { + if (!this.warnedAboutLength) + { + console.warn('SlotMultipliersSystem: slotMultipliers map is missing.'); + this.warnedAboutLength = true; + } + + return new Array(total).fill(0); + } + + if (map.length !== total) + { + if (!this.warnedAboutLength) + { + console.warn(`SlotMultipliersSystem: slotMultipliers length ${map.length} does not match expected ${total}.`); + this.warnedAboutLength = true; + } + } + else + { + this.warnedAboutLength = false; + } + + const result = new Array(total).fill(0); + const limit = Math.min(total, map.length); + + for (let index = 0; index < limit; index++) + { + const value = map[index]; + result[index] = typeof value === 'number' && value > 0 ? value : 0; + } + + return result; + } + + /** + * Provides typed access to the machine grid utility. + */ + private grid(): GridUtils + { + return this.machine.utils.grid as GridUtils; + } +} diff --git a/src/systems/SpinningExpandedSymbolsSystem.ts b/src/systems/SpinningExpandedSymbolsSystem.ts new file mode 100644 index 0000000..33a8bac --- /dev/null +++ b/src/systems/SpinningExpandedSymbolsSystem.ts @@ -0,0 +1,257 @@ +import ExpandedSymbol from '../entities/ExpandedSymbol'; +import ReelSymbol from '../entities/ReelSymbol'; +import BaseMachine from '../slotMachines/BaseMachine'; +import AnimationProgressHook from '../utils/hooks/AnimationProgressHook'; +import Hook from '../utils/hooks/Hook'; +import HooksChain from '../utils/hooks/HooksChain'; +import BaseSystem from './BaseSystem'; + +/** + * A pair of expanded symbols and top reel symbols. + * */ +type ExpandedSymbolPair = { + expandedSymbol: ExpandedSymbol; // replace with the proper type + reelSymbol: ReelSymbol; // replace with the proper type +}; + +/** + * Configuration settings for symbols class and zIndex. + */ +export interface SpinningExpandedSymbolsSystemSettings +{ + entityClass: typeof ExpandedSymbol, +} + +/** + * @class SpinningExpandedSymbolsSystem + * @extends BaseSystem + * @description Handles the spinning behavior of ExpandedSymbol entities in a slot machine game, + * including the initialization, updating, and stopping of expanded symbols. + */ +export default class SpinningExpandedSymbolsSystem extends BaseSystem +{ + static override requiredMaps: string[] = ['symbols']; + static override requiredUtils: string[] = ['grid']; + static override sharedSystemData: string[] = ['reelsStates']; + + static defaultSettings = { + entityClass: ExpandedSymbol, + }; + + public state: 'active' | 'stopped'; + + protected expandedSymbolsPairs: ExpandedSymbolPair[] = []; + + private reelsStates: string[] = []; + private hooks: Array = []; + + /** + * Initializes machine settings. + * @class + * @param {BaseMachine} machine - The slot machine instance. + */ + constructor(machine: BaseMachine) + { + super(machine); + this.setSettings(SpinningExpandedSymbolsSystem.defaultSettings); + } + + /** + * Handles the actions to be performed when entering the system. + * Initializes the state to active. + */ + override onEnter(): void + { + this.state = 'active'; + this.expandedSymbolsPairs = []; + const existingExpandedSymbols = this.machine.children.filter(c => c instanceof this.settings.entityClass); + existingExpandedSymbols.forEach(expandedSymbol => + { + const reelSymbols = this.getReelSymbols(expandedSymbol.reelIndex); + this.expandedSymbolsPairs.push({ + expandedSymbol, + reelSymbol: reelSymbols[0], + }); + }); + } + + /** + * Updates the state of the spin system based on the current state. + * @param dt - The delta time since the last update, in milliseconds. + */ + update(dt: number): void + { + // Track the state of each reel and perform actions based on the state + this.machine.sharedSystemData.reelsStates.forEach((currentState: string, reelIndex: number) => + { + // Handle symbol creation, animation, and landing based on reel state + if (currentState !== this.reelsStates[reelIndex]) + { + const expandedSymbolData = this.machine.inputs.expandedSymbolsData?.[reelIndex]; + const reelSymbols = this.getReelSymbols(reelIndex); + const reelSymbol = reelSymbols[0]; + const expandedSymbol = reelSymbol && this.getExpandedSymbolPair(reelSymbol); + switch (currentState) + { + case 'Deceleration': + if (expandedSymbolData && reelSymbol && !expandedSymbol) + { + this.createSymbol(expandedSymbolData, reelIndex); + } + break; + case 'Bouncing': + if (expandedSymbol) + { + this.animateSymbol(expandedSymbol); + } + break; + case 'Stopped': + if (expandedSymbol) + { + this.landSymbol(expandedSymbol); + } + break; + } + this.reelsStates[reelIndex] = currentState; + } + }); + + // Update expanded symbols + this.expandedSymbolsPairs.forEach(({ expandedSymbol }) => + { + if (this.reelsStates[expandedSymbol.reelIndex] !== 'Stopped') + { + this.updateSymbol(expandedSymbol); + + } + }); + + // Update hooks + this.hooks = this.hooks.filter((hook) => + { + hook.update(dt); + return !hook.isComplete(); + }); + + // Stop when reels are stopped and no hooks are running + if (this.hooks.length === 0 && this.reelsStates.every((state) => state === 'Stopped')) + { + this.state = 'stopped'; + } + } + + /** + * Handles the actions to be performed when a reel is decelerating. + * @param expandedSymbolData - The data for the expanded symbol to create. + * @param reelIndex - The index of the reel that is decelerating. + * @returns {ExpandedSymbol} + */ + protected createSymbol(expandedSymbolData: any, reelIndex: number): ExpandedSymbol + { + const {key, value} = expandedSymbolData; + const config = this.machine.config.expandedSymbols[key]; + const expandedSymbol = new this.settings.entityClass({ ...config, value }); + expandedSymbol.reelIndex = reelIndex; + expandedSymbol.zIndex = config.zIndex; + this.machine.addChild(expandedSymbol); + const reelSymbols = this.getReelSymbols(reelIndex); + reelSymbols.forEach((symbol) => symbol && (symbol.alpha = 0)); + this.expandedSymbolsPairs.push({ + expandedSymbol, + reelSymbol: reelSymbols[0], + }); + return expandedSymbol; + } + + /** + * Handles the actions to be performed when a reel is stopped. + * @param expandedSymbol - The expanded symbol to animate. + * @returns {void} + */ + protected animateSymbol(expandedSymbol: ExpandedSymbol): void + { + const inHook = new AnimationProgressHook(() => expandedSymbol.in()); + const chain = new HooksChain(); + chain.addHook(inHook); + this.hooks.push(chain); + } + + /** + * Handles the actions to be performed when a reel is stopped. + * @param expandedSymbol - The expanded symbol to land. + * @returns {void} + */ + protected landSymbol(expandedSymbol: ExpandedSymbol): void + { + expandedSymbol.isLanded = true; + } + + /** + * Handles the actions to be performed while a reel is spinning. + * @param expandedSymbol - The expanded symbol to update. + * @returns {void} + */ + updateSymbol(expandedSymbol: ExpandedSymbol): void + { + this.expandedSymbolsPairs = this.expandedSymbolsPairs.filter(pair => + { + if (pair.expandedSymbol !== expandedSymbol) return true; + const isPairedReelSymbolInMachine = this.machine.getChildByName(pair.reelSymbol.name); + if (isPairedReelSymbolInMachine) + { + const offset = 0.5 * (this.machine.config.height - this.machine.config.height / this.machine.config.slots); + expandedSymbol.position.set( + pair.reelSymbol.position.x, + pair.reelSymbol.position.y + offset, + ); + return true; + } + expandedSymbol.destroy(); + return false; + }); + } + + /** + * Retrieves the symbols for a specific reel index. + * @param reelIndex - The index of the reel to get symbols for. + * @returns An array of symbols for the specified reel. + */ + protected getReelSymbols(reelIndex: number): ReelSymbol[] + { + return this.machine.maps.symbols + .filter((_: string, idx: number) => + { + const reelCoords = this.machine.utils.grid.fromMapIndexToGridCoords(idx); + return reelCoords.x === reelIndex; + }) + .map((id: string) => this.machine.getChildByName(id)); + } + + /** + * Retrieves the reelSymbol for expandedSymbol. + * @param expandedSymbol - The expandedSymbol to get reelSymbol for. + * @returns The reelSymbol for the expandedSymbol. + */ + protected getReelSymbolPair(expandedSymbol: ExpandedSymbol) + { + return this.expandedSymbolsPairs.find(pair => pair.expandedSymbol === expandedSymbol)?.reelSymbol; + } + + /** + * Retrieves the expandedSymbol for reelSymbol. + * @param reelSymbol - The reelSymbol to get expandedSymbol for. + * @returns The expandedSymbol for the reelSymbol. + */ + protected getExpandedSymbolPair(reelSymbol: ReelSymbol) + { + return this.expandedSymbolsPairs.find(pair => pair.reelSymbol === reelSymbol)?.expandedSymbol; + } + + /** + * Handles the actions to be performed when leaving the current state. + * @returns {void} + */ + onLeave(): void + { + } +} diff --git a/src/systems/StaticReelsSpinSystem.ts b/src/systems/StaticReelsSpinSystem.ts new file mode 100644 index 0000000..be87be3 --- /dev/null +++ b/src/systems/StaticReelsSpinSystem.ts @@ -0,0 +1,253 @@ +import BaseMachine from '../slotMachines/BaseMachine'; +import BaseSystem from '../systems/BaseSystem'; +import { CanBeBlocked, CanPlayIdle, CanPlayIn, CanPlayOut, Entity } from '../types/Entity'; +import { ScreenMapRecord } from '../types/ScreenInputMap'; +import AnimationProgressHook from '../utils/hooks/AnimationProgressHook'; +import DelayHook from '../utils/hooks/DelayHook'; +import Hook from '../utils/hooks/Hook'; +import HooksChain from '../utils/hooks/HooksChain'; +import ImmediateHook from '../utils/hooks/ImmediateHook'; + +/** + * Represents an entity compatible with the ReelsSpinSystem. + * This entity must be able to be blocked, play idle animations, play bouncing animations, and be blurred. + */ +export type StaticReelsSystemCompatibleEntity = Entity +& CanBeBlocked +& CanPlayIdle +& CanPlayIn +& CanPlayOut; + +/** Configuration settings for the reel spinning behavior in the StaticReelsSpinSystem. */ +export interface StaticReelsSystemSettings +{ + reelDelay: number + slotDelay: number, + refillDelay: number, +} + +type systemState = 'stopped' | 'processingOut' | 'pending' | 'processingIn' | 'complete'; + +const STATES: Record = { + STOPPED: 'stopped', + PROCESSING_OUT: 'processingOut', + PENDING: 'pending', + PROCESSING_IN: 'processingIn', + COMPLETE: 'complete' +}; + +/** Manages the spin system for static reels, handling animations and states. */ +export default class StaticReelsSpinSystem extends BaseSystem +{ + /** + * Configuration settings for reel and slot delays. + * @type {object} + * @property {number} reelDelay - Delay between reels in seconds. + * @property {number} slotDelay - Delay between slots in seconds. + * @property {number} refillDelay - Delay for refilling symbols. + */ + static defaultSettings: StaticReelsSystemSettings = { + reelDelay: 0.1, + slotDelay: 0.03, + refillDelay: 0.15, + }; + + /** Static list of flags that the machine should provide. Subclasses can override to specify their own requirements. */ + static override requiredFlags: string[] = ['isSpinning']; + + /** Static list of maps that the machine should provide. Subclasses can override to specify their own requirements. */ + static override requiredMaps: string[] = ['symbols']; + + /** Static list of inputs that the machine should provide. Subclasses can override to specify their own requirements. */ + static override requiredInputs: string[] = []; + + /** Static list of methods that the machine should provide. Subclasses can override to specify their own requirements. */ + static override requiredMethods: string[] = []; + + /** Static list of utils that the machine should provide. Subclasses can override to specify their own requirements. */ + static override requiredUtils: string[] = ['grid']; + + public state: systemState; + private _outHooks: (Hook | HooksChain)[] = []; + private _inHooks: (Hook | HooksChain)[] = []; + private _delayHook: DelayHook; + + /** + * Initializes a new instance of StaticReelsSpinSystem. + * @param {object} machine - The machine context in which the system operates. + */ + constructor(machine: BaseMachine) + { + super(machine); + + this.setSettings(StaticReelsSpinSystem.defaultSettings); + + this.state = STATES.STOPPED; + } + + /** + * Updates the spin system state based on the current delta time. + * @param {number} dt - Delta time since the last update. + */ + update(dt: number) + { + if (this.state === 'stopped') + { + this._createOutHooks(); + this._createDelayHook(); + this.state = 'processingOut'; + this.machine.events.addEvent('outProcessingStarted'); + } + + if (this.state === 'processingOut') + { + this._processOutAnimations(dt); + if (this._outHooks.length === 0) + { + this.machine.events.addEvent('pendingStarted'); + this.state = 'pending'; + } + } + + if (this.state === 'pending') + { + if (!this.isPending(dt)) return; + this.machine.events.addEvent('pendingEnded'); + this._createInHooks(); + this.state = 'processingIn'; + this.machine.events.addEvent('inProcessingStarted'); + } + + if (this.state === 'processingIn') + { + this._processInAnimations(dt); + if (this._inHooks.length === 0) this.state = 'complete'; + } + + if (this.state === 'complete') + { + this.machine.events.addEvent('inProcessingEnded'); + this.state = 'stopped'; + } + } + + /** + * Checks if the system is in a pending state based on delta time. + * @param {number} dt - Delta time since the last update. + * @returns {boolean} True if the system is pending, otherwise false. + */ + isPending(dt: number): boolean + { + this._delayHook.update(dt); + + return !(!this._delayHook.isComplete() || !this.machine.inputs.screenMap); + } + + /** + * Initializes a delay hook for refilling symbols. + * @private + */ + _createDelayHook() + { + this._delayHook = new DelayHook(this.settings.refillDelay); + } + + /** + * Processes the outgoing animations for symbols. + * @param dt + * @private + */ + _processOutAnimations(dt: number): void + { + this._outHooks = this._outHooks.filter((outHook) => + { + outHook.update(dt); + + return !outHook.isComplete(); + }); + } + + /** + * Creates hooks for outgoing animations of symbols. + * @private + */ + _createOutHooks() + { + this._outHooks = this.machine.maps.symbols + .map((name: string, i: number) => + { + if (!name) return () => new ImmediateHook(); + const symbol: StaticReelsSystemCompatibleEntity = this.machine.getChildByName(name); + + return new HooksChain() + .addHook(new DelayHook(this._getAnimationDelay(i))) + .addHook(new AnimationProgressHook(() => symbol.out())); + }); + } + + /** + * Processes the incoming animations for symbols. + * @param dt + * @private + */ + _processInAnimations(dt: number) + { + this._inHooks = this._inHooks.filter((inHook) => + { + inHook.update(dt); + + return !inHook.isComplete(); + }); + } + + /** + * Creates hooks for incoming animations of symbols. + * @private + */ + _createInHooks() + { + this._inHooks = this.machine.inputs.screenMap + .map((record: ScreenMapRecord, i: number) => + new HooksChain() + .addHook(new DelayHook(this._getAnimationDelay(i))) + .addHook(new AnimationProgressHook(() => + { + if (this.machine.maps.symbols[i]) + { + const id = this.machine.maps.symbols[i]; + + this.machine.getChildByName(id).destroy(); + } + const symbol: StaticReelsSystemCompatibleEntity = this.machine.createSymbol(record.key); + + this.machine.utils.grid.fromMapIndexToXY(i).copyTo(symbol.position); + this.machine.addChild(symbol); + this.machine.maps.symbols[i] = symbol.name; + + return symbol.in(); + }))); + } + + /** + * Calculates the delay for a symbol's animation based on its position. + * @private + * @param {number} i - The index of the symbol. + * @returns {number} The calculated animation delay. + */ + _getAnimationDelay(i: number) + { + const pos = this.machine.utils.grid.fromMapIndexToGridCoords(i); + const slotDelay = pos.y * this.settings.slotDelay; + const reelDelay = pos.x * this.settings.reelDelay; + + return slotDelay + reelDelay; + } + + onEnter(): void + { + } + + onLeave(): void + { + } +} diff --git a/src/systems/StickySymbolsSystem.ts b/src/systems/StickySymbolsSystem.ts new file mode 100644 index 0000000..a1eb563 --- /dev/null +++ b/src/systems/StickySymbolsSystem.ts @@ -0,0 +1,126 @@ +import BaseMachine from '../slotMachines/BaseMachine'; +import BaseSystem from './BaseSystem'; +import { CanBeBlocked, CanPlayIdle, Entity, ValueAssignable } from '../types/Entity'; + +/** + * Represents an entity compatible with the ReelsSpinSystem. + * This entity must be able to be blocked, play idle animations, play bouncing animations, and be blurred. + */ +export type StickySymbolsSystemCompatibleEntity = Entity + & CanBeBlocked + & CanPlayIdle + & ValueAssignable; + +/** Configuration settings for the reel spinning behavior in the ReelsSpinSystem. */ +export interface StickySymbolsSystemSettings +{ + zIndex: number, +} + +/** Represents a stick symbol system that manages the behavior of sticky symbols. */ +export default class StickySymbolsSystem extends BaseSystem +{ + + static defaultSettings: StickySymbolsSystemSettings = { + zIndex: 4, + }; + /** Static list of flags that the machine should provide. Subclasses can override to specify their own requirements. */ + static override requiredFlags: string[] = ['isSpinning']; + + /** Static list of maps that the machine should provide. Subclasses can override to specify their own requirements. */ + static override requiredMaps: string[] = ['symbols', 'stickySymbols']; + + /** Static list of inputs that the machine should provide. Subclasses can override to specify their own requirements. */ + static override requiredInputs: string[] = []; + + /** Static list of methods that the machine should provide. Subclasses can override to specify their own requirements. */ + static override requiredMethods: string[] = ['getChildByName']; + + /** Static list of utils that the machine should provide. Subclasses can override to specify their own requirements. */ + static override requiredUtils: string[] = ['grid']; + + public state: 'watching' | 'stopped' = 'stopped'; + + private stickySymbols: (StickySymbolsSystemCompatibleEntity | null)[] = []; + + constructor(machine: BaseMachine) + { + super(machine); + this.setSettings(StickySymbolsSystem.defaultSettings); + } + + onEnter() + { + this.state = 'watching'; + } + + onLeave() + { + this.stickySymbols.forEach((symbol, i) => + { + if (symbol) + { + this._removeStickySymbol(i); + } + }); + } + + update(_dt: number): void + { + this.machine.maps.stickySymbols.forEach((isSticky: boolean, mapIndex: number) => + { + if (isSticky && !this.stickySymbols[mapIndex]) + { + this._addStickySymbol(mapIndex); + } else if (!isSticky && this.stickySymbols[mapIndex]) + { + this._removeStickySymbol(mapIndex); + } + }); + + this._hideSymbolsBehindStickySymbols(); + this._updateZIndex(); + if (!this.machine.flags.isSpinning) this.state = 'stopped'; + } + + _addStickySymbol(i: number): void + { + const originalSymbol: StickySymbolsSystemCompatibleEntity = this.machine.getChildByName(this.machine.maps.symbols[i]); + const stickySymbol: StickySymbolsSystemCompatibleEntity = this.machine.createSymbol(originalSymbol.key); + stickySymbol.position.copyFrom(originalSymbol.position); + stickySymbol.value = originalSymbol.value; + this.machine.addChild(stickySymbol); + this.stickySymbols[i] = stickySymbol; + } + + + _removeStickySymbol(i: number): void + { + this.stickySymbols[i].destroy(); + this.stickySymbols[i] = null; + this.machine.getChildByName(this.machine.maps.symbols[i]).visible = true; + } + + _hideSymbolsBehindStickySymbols(): void + { + this.stickySymbols.forEach((stickySymbol, i) => + { + if (!stickySymbol) return; + + const symbol = this.machine.getChildByName(this.machine.maps.symbols[i]); + if (!symbol) return; + + symbol.visible = false; + }); + } + + _updateZIndex(): void + { + this.stickySymbols.forEach(symbol => + { + if (!symbol) return; + + symbol.zIndex = this.settings.zIndex; + }); + } +} diff --git a/src/systems/TintingSymbolsSystem.ts b/src/systems/TintingSymbolsSystem.ts new file mode 100644 index 0000000..f76960c --- /dev/null +++ b/src/systems/TintingSymbolsSystem.ts @@ -0,0 +1,79 @@ +import BaseMachine from '../slotMachines/BaseMachine'; +import { CanBeTinted, Entity } from '../types/Entity'; +import BaseSystem from './BaseSystem'; + +/** Configuration settings for the tinting symbols behavior */ +export interface TintingSymbolsSystemSettings +{ + color: number +} + +export type TintingSymbolsSystemCompatibleEntity = Entity & CanBeTinted; + +/** The system is responsible for tinting symbols on the screen It uses "tinting" to handle tinting state. */ + +export default class TintingSymbolsSystem extends BaseSystem +{ + static defaultSettings: TintingSymbolsSystemSettings = { + color: 0x666666, + }; + + static override requiredFlags: string[] = []; + static override requiredMaps: string[] = ['tinting', 'symbols']; + static override requiredInputs: string[] = []; + static override requiredMethods: string[] = []; + static override requiredUtils: string[] = ['grid']; + static override sharedSystemData: string[] = []; + + public state: string = 'stopped'; + + constructor(machine: BaseMachine) + { + super(machine); + this.setSettings(TintingSymbolsSystem.defaultSettings); + this.initTintingMap(); + } + + onEnter(): void + { + // Do nothing + } + + onLeave(): void + { + // Do nothing + } + + update(_dt: number): void + { + this.machine.maps.tinting.forEach((tintState: boolean, i: number) => + { + this.handleStateChanging(i, tintState); + }); + } + + private handleStateChanging(symbolMapIndex: number, state: boolean) + { + const entityID = this.machine.maps.symbols[symbolMapIndex]; + + if (!entityID) return; + const entity: TintingSymbolsSystemCompatibleEntity = this.machine.getChildByName(entityID); + + if (!entity) return; + const color = state ? this.settings.color : 0xffffff; + + entity.tint(color); + } + + private initTintingMap(): void + { + this.machine.maps.tinting = this.createMap(); + } + + private createMap(): boolean[] + { + const { reels, slots } = this.machine.config; + + return new Array(slots * reels).fill(false); + } +} diff --git a/src/systems/WinLinesAnimationsSystem.ts b/src/systems/WinLinesAnimationsSystem.ts new file mode 100644 index 0000000..2a267c5 --- /dev/null +++ b/src/systems/WinLinesAnimationsSystem.ts @@ -0,0 +1,102 @@ +import WebGLWinLine from '../entities/WebGLWinLine'; +import BaseMachine from '../slotMachines/BaseMachine'; +import BaseSystem from '../systems/BaseSystem'; + +export interface WinLinesAnimationsSystemSettings +{ + zIndex: number, + lineClass: typeof WebGLWinLine, +} + +export default class WinLinesAnimationsSystem extends BaseSystem +{ + public state: 'watch' | 'animating' | 'stopped' = 'stopped'; + + private lines: WebGLWinLine[] = []; + + static override requiredInputs: string[] = ['wins']; + static override sharedSystemData: string[] = ['animateLines']; + + static defaultSettings: WinLinesAnimationsSystemSettings = { + zIndex: 20, + lineClass: WebGLWinLine, + }; + + constructor(machine: BaseMachine) + { + super(machine); + this.setSettings(WinLinesAnimationsSystem.defaultSettings); + } + + override onEnter() + { + this.handleAnimateLinesData(); + } + + override update(_dt: number) + { + if (this.state === 'stopped') return; + if (this.lines.every((line) => + { + if (!line) return true; + + return line.state === 'stopped'; + })) + { + this.state = 'stopped'; + } + } + + override onLeave() + { + this.resetAnimateLinesData(); + } + + private handleAnimateLinesData() + { + this.machine.sharedSystemData.animateLines.forEach((lineIndex: number) => + { + const lineMap = this.machine.config.lines + + if (!lineMap) + { + throw new Error(`Line ${lineIndex} not found`); + } + if (!this.lines[lineIndex]) + { + this.createLine(lineIndex); + } + this.lines[lineIndex].play(); + }); + this.state = 'animating'; + } + + private createLine(lineIndex: number) + { + if (!this.settings.lineClass) + { + throw new Error(`Line class isn't defined in settings`); + } + const lineMap:number[] = this.machine.config.lines[lineIndex]; + const points: number[][] = lineMap.map((slot, reel):number[] => [reel, slot]); + points.unshift([-1, lineMap[0]]); + points.push([lineMap.length, lineMap[lineMap.length - 1]]); + const slotWidth = this.machine.utils.grid.getSlotWidth(); + const slotHeight = this.machine.utils.grid.getSlotHeight(); + const line = new this.settings.lineClass(points, slotWidth, slotHeight); + + line.zIndex = this.settings.zIndex; + this.machine.addChild(line); + this.lines[lineIndex] = line; + } + + resetAnimateLinesData() + { + this.machine.sharedSystemData.animateLines = []; + this.lines.forEach((line) => + { + if (!line) return; + line.state = 'stopped'; + }); + } +} diff --git a/src/systems/WinningExpandedSymbolsAnimationSystem.ts b/src/systems/WinningExpandedSymbolsAnimationSystem.ts new file mode 100644 index 0000000..57283ff --- /dev/null +++ b/src/systems/WinningExpandedSymbolsAnimationSystem.ts @@ -0,0 +1,140 @@ +import ExpandedSymbol from "../entities/ExpandedSymbol"; +import BaseSystem from "./BaseSystem"; +import AnimationProgressHook from "../utils/hooks/AnimationProgressHook"; +import Hook from "../utils/hooks/Hook"; +import BaseMachine from "../slotMachines/BaseMachine"; + +/** Configuration settings for symbols class. */ +export interface WinningExpandedSymbolsAnimationSystemSettings +{ + entityClass: typeof ExpandedSymbol, +} + +/** + * @class WinningExpandedSymbolsAnimationSystem + * @extends BaseSystem + * @description Handles the winning behavior of ExpandedSymbol entities. + */ +export default class WinningExpandedSymbolsAnimationSystem extends BaseSystem +{ + static override requiredMaps: string[] = ['winningSymbols']; + static override requiredUtils: string[] = ['grid']; + + static defaultSettings = { + entityClass: ExpandedSymbol, + }; + + public state: 'checking' | 'animating' | 'stopped' = 'stopped'; + + protected expandedSymbols: ExpandedSymbol[] = []; + + private hooks: Hook[] = []; + + /** + * Initializes machine settings. + * @class + * @param {BaseMachine} machine - The slot machine instance. + */ + constructor(machine: BaseMachine) + { + super(machine); + this.setSettings(WinningExpandedSymbolsAnimationSystem.defaultSettings); + } + + override onEnter() + { + this.state = 'checking'; + this.expandedSymbols = this.machine.children.filter(c => c instanceof this.settings.entityClass); + } + + override onLeave() + { + // Do nothing + } + + /** + * Updates the animation system per frame. + * - If in `"checking"` state, scans `winningSymbols` and sets up animation hooks. + * - If in `"animating"` state, processes animation progress and checks for completion. + * @param {number} dt - Delta time since the last update (in milliseconds). + */ + override update(dt: number) + { + if (this.state === 'checking') + { + this.checkWinningSymbolsMap(); + } + + if (this.state === 'animating') + { + this.processAnimations(dt); + } + } + + /** + * Scans the `winningSymbols` map to determine which symbols need animations. + * - If no symbols have a winning flag, system transitions to `"stopped"`. + * - Otherwise, creates `AnimationProgressHook` instances for each winning symbol. + * - Transitions state to `"animating"` if animations are needed. + * @private + */ + private checkWinningSymbolsMap() + { + const winningSymbolsReelIndexes = this.machine.maps.winningSymbols.reduce((acc: number[], flag: boolean, index: number) => + { + if (!flag) return acc; + const reelIndex = this.machine.utils.grid.fromMapIndexToGridCoords(index).x; + if (!acc.includes(reelIndex)) + { + acc.push(reelIndex); + } + return acc; + }, []); + const expandedSymbolsToAnimate = this.expandedSymbols.filter(expandedSymbol => winningSymbolsReelIndexes.includes(expandedSymbol.reelIndex)); + if (!expandedSymbolsToAnimate.length) + { + this.state = 'stopped'; + return; + } + this.animateSymbols(expandedSymbolsToAnimate); + } + + /** + * Animates the winning expanded symbols. + * - Sets the system state to `"animating"`. + * - Creates `AnimationProgressHook` instances for each winning symbol. + * @private + * @param {ExpandedSymbol[]} expandedSymbols - The expanded symbols to animate. + * @returns {void} + */ + private animateSymbols(expandedSymbols: ExpandedSymbol[]): void + { + this.state = 'animating'; + this.hooks = expandedSymbols.map((expandedSymbol: ExpandedSymbol) => { + return new AnimationProgressHook(() => expandedSymbol.win()); + }); + } + + /** + * Processes active animation hooks. + * - Calls `update(dt)` on each hook to progress animations. + * - Filters out completed animations. + * - Transitions system to `"stopped"` once all animations are finished. + * @param {number} dt - Delta time since the last update (in milliseconds). + * @private + */ + private processAnimations(dt: number): void + { + this.hooks = this.hooks.filter((hook) => + { + hook.update(dt); + + return !hook.isComplete(); + }); + + if (this.hooks.length === 0) + { + this.state = 'stopped'; + } + } +} diff --git a/src/systems/WinningLinesIncrementSystem.ts b/src/systems/WinningLinesIncrementSystem.ts new file mode 100644 index 0000000..8b849ee --- /dev/null +++ b/src/systems/WinningLinesIncrementSystem.ts @@ -0,0 +1,97 @@ +import BaseMachine from '../slotMachines/BaseMachine'; +import BaseSystem from '../systems/BaseSystem'; + +/** + * @class WinningLinesIncrementSystem + * @description + * System responsible for managing the index of the currently processed winning line. + * + * This system: + * - Stores the `currentWinIndex` in `sharedSystemData` to track the current win. + * - Increments the index when exiting (`onLeave()`). + * - Resets `currentWinIndex` to `0` when the last win is processed. + * + * The system does **not** trigger any animations or visual effects; it only updates the win index. + * @extends BaseSystem + * @property {string} state - Current system state (always "stopped"). + * @property {number} sharedSystemData.currentWinIndex - Tracks the index of the active win line. + */ +export default class WinningLinesIncrementSystem extends BaseSystem +{ + /** System state, always "stopped". */ + public state = 'stopped'; + + /** Shared system data: keeps track of the current win index. */ + static override sharedSystemData: string[] = ['currentWinIndex']; + + /** Required input: `wins`, which contains the list of winning lines. */ + static override requiredInputs: string[] = ['wins']; + + /** + * Creates an instance of WinningLinesIncrementSystem. + * Initializes `currentWinIndex` to `0`. + * @param {BaseMachine} machine - Reference to the slot machine instance. + */ + constructor(machine: BaseMachine) + { + super(machine); + this.machine.sharedSystemData.currentWinIndex = 0; + } + + /** Called when the system becomes active. Logs the current win index for debugging. */ + override onEnter() + { + // Do nothing + } + + /** + * Called when the system exits. + * - Increments the `currentWinIndex`. + * - Resets to `0` if the last win has been processed. + */ + override onLeave() + { + this.increaseWinIndex(); + if (this.isLastIndex()) + { + this.resetWinIndex(); + } + } + + /** + * Increases `currentWinIndex` by `1`. + * @private + */ + private increaseWinIndex() + { + this.machine.sharedSystemData.currentWinIndex++; + } + + /** + * Resets `currentWinIndex` to `0` when the last win has been processed. + * @private + */ + private resetWinIndex() + { + this.machine.sharedSystemData.currentWinIndex = 0; + } + + /** + * Checks if the current win index is the last one in the `wins` list. + * @returns {boolean} - `true` if the last index is reached, otherwise `false`. + * @private + */ + private isLastIndex() + { + return this.machine.sharedSystemData.currentWinIndex >= this.machine.inputs.wins.wins.length; + } + + /** + * This system does not update per frame. + * @param {number} _dt - Delta time since the last update (not used). + */ + update(_dt: number) + { + // Do nothing + } +} diff --git a/src/systems/WinningLinesResetIncrementSystem.ts b/src/systems/WinningLinesResetIncrementSystem.ts new file mode 100644 index 0000000..c2f30e5 --- /dev/null +++ b/src/systems/WinningLinesResetIncrementSystem.ts @@ -0,0 +1,63 @@ +import BaseMachine from '../slotMachines/BaseMachine'; +import BaseSystem from '../systems/BaseSystem'; + +/** + * @class WinningLinesResetIncrementSystem + * @description + * System responsible for resetting the `currentWinIndex` to `0` when activated. + * + * This system: + * - Stores `currentWinIndex` in `sharedSystemData` to track the active win. + * - Resets `currentWinIndex = 0` when entering (`onEnter()`). + * + * It does **not** modify game visuals, animations, or gameplay logic beyond resetting the index. + */ +export default class WinningLinesResetIncrementSystem extends BaseSystem +{ + /** System state, always `"stopped"` after execution. */ + public state = 'stopped'; + + /** Shared system data: keeps track of the current win index. */ + static override sharedSystemData: string[] = ['currentWinIndex']; + + /** + * Creates an instance of `WinningLinesResetIncrementSystem`. + * Initializes `currentWinIndex` to `0`. + * @param {BaseMachine} machine - Reference to the slot machine instance. + */ + constructor(machine: BaseMachine) + { + super(machine); + this.machine.sharedSystemData.currentWinIndex = 0; + } + + /** Called when the system becomes active. Resets the win index to `0`. */ + override onEnter() + { + this.resetWinIndex(); + } + + /** Called when the system exits. Currently does nothing but can be extended in the future. */ + override onLeave() + { + // Do nothing + } + + /** + * Resets `currentWinIndex` to `0`. + * @private + */ + private resetWinIndex() + { + this.machine.sharedSystemData.currentWinIndex = 0; + } + + /** + * This system does not update per frame. + * @param {number} _dt - Delta time since the last update (not used). + */ + update(_dt: number) + { + // Do nothing + } +} diff --git a/src/systems/WinningSymbolAnimationsSystem.ts b/src/systems/WinningSymbolAnimationsSystem.ts new file mode 100644 index 0000000..5e3aab7 --- /dev/null +++ b/src/systems/WinningSymbolAnimationsSystem.ts @@ -0,0 +1,172 @@ +import { BaseMachine } from 'src/index'; +import { CanPlayWin, Entity } from 'src/types/Entity'; +import AnimationProgressHook from '../utils/hooks/AnimationProgressHook'; +import Hook from '../utils/hooks/Hook'; +import ImmediateHook from '../utils/hooks/ImmediateHook'; +import BaseSystem from './BaseSystem'; + +/** + * @description + * Represents an entity that is compatible with the `WinningSymbolAnimationsSystem`. + * This entity combines the base `Entity` properties with the ability to trigger a win animation (`CanPlayWin`). + * + * Used within `WinningSymbolAnimationsSystem` to identify symbols that should play win animations. + */ +export type WinningSymbolAnimationsSystemCompatibleEntity = Entity & CanPlayWin; + +export interface WinningSymbolAnimationsSystemSettings +{ + zIndex: number; +} + +/** + * @class WinningSymbolAnimationsSystem + * @description + * System responsible for triggering win animations on symbols that are marked as winning. + * + * This system: + * - Reads from the `winningSymbols` map to identify symbols that need animations. + * - Uses animation hooks (`AnimationProgressHook`) to manage animation lifecycle. + * - Transitions through the states: `"checking"` → `"animating"` → `"stopped"`. + * - Stops execution once all animations are completed. + * @extends BaseSystem + * @property {"checking" | "animating" | "stopped"} state - Current system state. + * @property {Hook[]} hooks - List of hooks managing animation progress. + */ +export default class WinningSymbolAnimationsSystem extends BaseSystem +{ + /** + * System state transitions: + * - "checking": Scans `winningSymbols` map to determine which symbols need animations. + * - "animating": Executes animations using hooks. + * - "stopped": Ends the animation process once all animations are complete. + */ + public state: 'checking' | 'animating' | 'stopped' = 'stopped'; + + /** Stores hooks for tracking animation progress */ + private hooks: Hook[] = []; + + /** Required maps used in this system */ + static override requiredMaps: string[] = ['tinting', 'winningSymbols', 'symbols']; + + static defaultSettings = { + zIndex: 10, + }; + + constructor(machine: BaseMachine) + { + super(machine); + + this.setSettings(WinningSymbolAnimationsSystem.defaultSettings); + } + + /** Called when the system becomes active. Transitions state to `"checking"` and starts scanning for winning symbols. */ + override onEnter() + { + this.state = 'checking'; + } + + /** Called when the system exits. Currently, does nothing but can be extended in the future. */ + override onLeave() + { + this.machine.maps.symbols.forEach((symbolID: string) => + { + const entity: WinningSymbolAnimationsSystemCompatibleEntity = this.machine.getChildByName(symbolID); + + entity.reset(); + }); + } + + /** + * Updates the animation system per frame. + * - If in `"checking"` state, scans `winningSymbols` and sets up animation hooks. + * - If in `"animating"` state, processes animation progress and checks for completion. + * @param {number} dt - Delta time since the last update (in milliseconds). + */ + override update(dt: number) + { + if (this.state === 'checking') + { + this.checkWinningSymbolsMap(); + } + + if (this.state === 'animating') + { + this.processAnimations(dt); + } + } + + /** + * Scans the `winningSymbols` map to determine which symbols need animations. + * - If no symbols have a winning flag, system transitions to `"stopped"`. + * - Otherwise, creates `AnimationProgressHook` instances for each winning symbol. + * - Transitions state to `"animating"` if animations are needed. + * @private + */ + private checkWinningSymbolsMap() + { + if (this.machine.maps.winningSymbols.every((flag: boolean) => flag === false)) + { + this.state = 'stopped'; + + return; + } + + this.animateSymbols(); + } + + private animateSymbols() + { + this.state = 'animating'; + this.hooks = this.machine.maps.winningSymbols.map((flag: boolean, i: number) => + { + if (!flag) return new ImmediateHook(); + const entityId = this.machine.maps.symbols[i]; + + if (!entityId) return new ImmediateHook(); + const entity: WinningSymbolAnimationsSystemCompatibleEntity = this.machine.getChildByName(entityId); + + entity.zIndex += this.settings.zIndex; + + return new AnimationProgressHook(() => entity.win()); + }); + } + + /** + * Processes active animation hooks. + * - Calls `update(dt)` on each hook to progress animations. + * - Filters out completed animations. + * - Transitions system to `"stopped"` once all animations are finished. + * @param {number} dt - Delta time since the last update (in milliseconds). + * @private + */ + private processAnimations(dt: number): void + { + this.hooks = this.hooks.filter((hook) => + { + hook.update(dt); + + return !hook.isComplete(); + }); + + if (this.hooks.length === 0) + { + this.resetZIndex(); + this.state = 'stopped'; + } + } + + resetZIndex() + { + this.machine.maps.winningSymbols.map((flag: boolean, i: number) => + { + if (!flag) return; + const entityId = this.machine.maps.symbols[i]; + + if (!entityId) return; + const entity = this.machine.getChildByName(entityId); + + entity.zIndex -= this.settings.zIndex; + }); + } +} diff --git a/src/systems/WinningSymbolTintingSystem.ts b/src/systems/WinningSymbolTintingSystem.ts new file mode 100644 index 0000000..23a8f1d --- /dev/null +++ b/src/systems/WinningSymbolTintingSystem.ts @@ -0,0 +1,34 @@ +import BaseSystem from './BaseSystem'; + +/** + * @class WinningSymbolTintingSystem + * @description + * System responsible for marking winning symbols in the `tinting`, + * based on the data from `winningSymbols`. This system does not + * apply visual effects directly but sets tinting flags for other systems + * to process. + * + * This is part of the slot machine game architecture, ensuring that + * winning symbols are properly flagged for tinting effects. + */ +export default class WinningSymbolTintingSystem extends BaseSystem +{ + public state: string = 'stopped'; + + static override requiredMaps: string[] = ['tinting', 'winningSymbols']; + + onEnter(): void + { + this.machine.maps.tinting = this.machine.maps.winningSymbols.map((v: boolean) => !v); + } + + onLeave(): void + { + // do nothing + } + + update(_dt: number): void + { + // do nothing + } +} diff --git a/src/systems/reels/Acceleration.ts b/src/systems/reels/Acceleration.ts new file mode 100644 index 0000000..3f0b353 --- /dev/null +++ b/src/systems/reels/Acceleration.ts @@ -0,0 +1,68 @@ +import Reel from '../../systems/reels/Reel'; +import { easeInOutBack } from '../../utils/easing/easeInOutBack'; +import { REEL_STATES } from './states'; +import { State } from '@popiplay/state-machine'; + +/** + * @class Acceleration + * @extends State + * @description Represents the acceleration phase of a reel. In this state, the reel gradually increases + * its speed up to a defined maximum speed using an easing function. + */ +export default class Acceleration extends State +{ + private reel: Reel; + private elapsedTime: number; + private t: number; + + /** + * @class + * @param {Reel} reel - The reel instance that this state belongs to. + */ + constructor(reel: Reel) + { + super('Acceleration'); + this.reel = reel; + this.elapsedTime = 0; + this.t = 0; + } + + /** Initializes the state by resetting the elapsed time and easing progress. Called when the state is entered. */ + override enter(): void + { + this.elapsedTime = 0; // Total time spent in the acceleration phase + this.t = 0; // Normalized time (from 0 to 1) for easing calculations + } + + /** + * Updates the reel's position and speed based on elapsed time and an easing function. + * The reel's speed is increased smoothly up to the maximum speed defined in reel settings. + * @param {number} dt - Delta time since the last update, in milliseconds. + */ + override update(dt: number): void + { + this.elapsedTime += dt * 0.001; + this.t = Math.min(this.elapsedTime / this.reel.accelerationTime, 1); + + // Apply easing function to calculate progress + const easedProgress = easeInOutBack(this.t, this.reel.backCoef); + + // Update reel speed and position + this.reel.speed = this.reel.maxSpeed * easedProgress; + this.reel.position += dt * 0.001 * this.reel.speed; + } + + /** + * Handles state transition input. Transitions the reel to the spinning state + * once half of the acceleration duration has passed. + * @param {unknown} _input - Optional input for state handling, unused in this implementation. + */ + override handleInput(_input: unknown): void + { + if (this.t >= 0.5) + { + this.reel.setState(REEL_STATES.SPINNING); + } + } + +} diff --git a/src/systems/reels/Bouncing.ts b/src/systems/reels/Bouncing.ts new file mode 100644 index 0000000..6232eb6 --- /dev/null +++ b/src/systems/reels/Bouncing.ts @@ -0,0 +1,49 @@ +import Reel from '../../systems/reels/Reel'; +import AnimationProgressHook from '../../utils/hooks/AnimationProgressHook'; +import { REEL_STATES } from './states'; +import { State } from '@popiplay/state-machine'; + +/** + * @class Deceleration + * @extends State + * @description Represents the bouncing phase of a reel. In this state, the symbols bouncing + */ +export default class Bouncing extends State +{ + private reel: Reel; + private hooks: AnimationProgressHook[] = []; + /** + * @class + * @param {Reel} reel - The reel instance that this state belongs to. + */ + constructor(reel: Reel) + { + super('Bouncing'); + this.reel = reel; + } + + override enter() + { + this.hooks = []; + if (!this.reel.target.settings.bounce) return; + this.hooks = this.reel.bounce(); + } + + override update(_dt: number): void + { + this.hooks.forEach((hook) => hook.update(_dt)); + this.reel.position = this.reel.stopPosition; + } + + /** + * Handles the transition to the stopped state once the reel reaches its stop position. + * @param {unknown} _input - Optional input for state handling, unused in this implementation. + */ + override handleInput(_input: unknown): void + { + if (this.hooks.every((hook) => hook.isComplete())) + { + this.reel.setState(REEL_STATES.STOPPED); // Transition to the STOPPED state + } + } +} diff --git a/src/systems/reels/Deceleration.ts b/src/systems/reels/Deceleration.ts new file mode 100644 index 0000000..0cfbc9a --- /dev/null +++ b/src/systems/reels/Deceleration.ts @@ -0,0 +1,54 @@ +import Reel from '../../systems/reels/Reel'; +import { REEL_STATES } from './states'; +import { State } from '@popiplay/state-machine'; + +/** + * @class Deceleration + * @extends State + * @description Represents the deceleration phase of a reel. In this state, the reel gradually slows down + * until it reaches the specified stop position. + */ +export default class Deceleration extends State +{ + private reel: Reel; + + /** + * @class + * @param {Reel} reel - The reel instance that this state belongs to. + */ + constructor(reel: Reel) + { + super('Deceleration'); + this.reel = reel; + } + + /** + * Updates the reel's position based on its current speed and delta time. + * The speed decreases gradually until the reel reaches its stop position. + * @param {number} dt - Delta time since the last update, in milliseconds. + */ + override update(dt: number): void + { + this.reel.position = Math.min( + this.reel.position + (dt * 0.001 * this.reel.speed), + this.reel.stopPosition + ); + } + + override leave() + { + this.reel.onDecelerationEnded(); + } + + /** + * Handles the transition to the stopped state once the reel reaches its stop position. + * @param {unknown} _input - Optional input for state handling, unused in this implementation. + */ + override handleInput(_input: unknown): void + { + if (this.reel.position >= this.reel.stopPosition) + { + this.reel.setState(REEL_STATES.BOUNCING); // Transition to the STOPPED state + } + } +} diff --git a/src/systems/reels/Reel.ts b/src/systems/reels/Reel.ts new file mode 100644 index 0000000..736e373 --- /dev/null +++ b/src/systems/reels/Reel.ts @@ -0,0 +1,290 @@ +import Bouncing from '../../systems/reels/Bouncing'; +import ReelsSpinSystem, { ReelsSpinSystemCompatibleEntity } from '../../systems/ReelsSpinSystem'; +import { Entity } from '../../types/Entity'; +import AnimationProgressHook from '../../utils/hooks/AnimationProgressHook'; +import Acceleration from './Acceleration'; +import Deceleration from './Deceleration'; +import Spinning from './Spinning'; +import { REEL_STATES } from './states'; +import Stopped from './Stopped'; +import { StateMachine } from '@popiplay/state-machine'; + +type ReelState = Stopped | Acceleration | Deceleration | Spinning | Bouncing; + +type ReelItemRecord = [position: number, symbol: ReelsSpinSystemCompatibleEntity]; + +/** + * @class Reel + * @extends StateMachine + * @description Manages the spinning of a reel in a slot machine, with states for acceleration, spinning, deceleration, and stopping. + */ +export default class Reel extends StateMachine +{ + public system: ReelsSpinSystem; + public index: number; + public position: number = 0; + public stopPosition: number = 0; + public speed: number = 0; + public symbols: ReelItemRecord[] = []; + protected _prevPosition: number = 0; + + /** + * @class + * @param target + * @param {number} index - The index of the reel, used for positioning. + */ + constructor(target: ReelsSpinSystem, index: number) + { + super(target); + this.index = index; + + // Provide states for StateMachine and set initial state + this.provideStates([ + new Stopped(this), + new Acceleration(this), + new Spinning(this), + new Deceleration(this), + new Bouncing(this) + ]); + + this.setState(REEL_STATES.STOPPED); + } + + /** + * @returns {number} - Returns the acceleration time setting for the reel. + */ + get accelerationTime(): number + { + return this.target.settings.accelerationTime; + } + + /** + * @returns {number} - Returns the maximum speed setting for the reel. + */ + get maxSpeed(): number + { + return this.target.settings.maxSpeed; + } + + /** + * @returns {number} - Returns the back coefficient setting for the reel, used in easing calculations. + */ + get backCoef(): number + { + return this.target.settings.backCoef; + } + + /** + * Sets an array of symbols for the reel, resetting position and stop position. + * @param {Array} symbols - The symbols to set on the reel. + */ + setSymbols(symbols: ReelsSpinSystemCompatibleEntity[]): void + { + this.position = 0; + this._prevPosition = 0; + this.stopPosition = 0; + this.symbols = symbols.reverse().map((symbol, i) => + { + symbol.isBlurred = false; + symbol.filters = null; + symbol.blurEnabled = false; + symbol.cacheAsBitmap = false; + symbol.filterArea = null; + return [i, symbol]; + }); + } + + /** + * Adds symbols to the reel starting at a specified position. + * @param {Array} symbols - Array of symbols to add. + * @param {number} position - The position to start adding symbols. + */ + addSymbols(symbols: ReelsSpinSystemCompatibleEntity[], position: number): void + { + symbols.forEach((symbol, i) => + { + this._setSymbolX(symbol); + this.symbols.push([position + i, symbol]); + this.target.machine.addChild(symbol); + }); + } + + /** Starts the reel by setting its position to zero and switching to the acceleration state. */ + start(): void + { + this.position = 0; + this.stopPosition = 0; + this._prevPosition = 0; + this.setState(REEL_STATES.ACCELERATION); + } + + /** + * Stops the reel at a specified stop position and switches to the deceleration state. + * @param {number} [stopPosition=0] - The target stop position for the reel. + */ + stop(stopPosition: number = 0): void + { + this.stopPosition = stopPosition; + this.setState(REEL_STATES.DECELERATION); + } + + /** + * Updates the reel's current state, position, and symbols. + * @param {number} dt - Delta time since the last update, in milliseconds. + */ + override update(dt: number): void + { + super.handleInput(this); + super.update(dt); // Calls StateMachine's update to handle the current state logic + this._handleSwitchingPosition(); + this._updateSymbols(); + } + + /** Triggers a bounce effect on each symbol in the reel. */ + bounce(): AnimationProgressHook[] + { + return this.symbols.map(([_, symbol]) => + new AnimationProgressHook(() => symbol.bounce())); + } + + /** Is called when entering Stopped state */ + public onStop() + { + // do something + } + + /** Is called when leaving Deceleration state */ + public onDecelerationEnded() + { + // do something + } + + /** + * Updates symbol positions based on the reel's current position. + * Each symbol's position is calculated to provide a smooth scrolling effect as the reel spins. + * Symbols are removed from the view when they exit below the visible area, and are returned to the pool. + * @private + */ + protected _updateSymbols(): void + { + const slotHeight = this.target.machine.utils.grid.getSlotHeight(); + const baseY = this.getBaseY(); + + this.symbols.forEach(([position, symbol]) => + { + const distance = this.position - position; + + symbol.y = (distance * slotHeight) + baseY; + }); + this.symbols = this.symbols.filter(([position, symbol]) => + { + if (position <= this.position - 1) + { + symbol.isBlurred = false; + symbol.filters = null; + symbol.blurEnabled = false; + symbol.cacheAsBitmap = false; + symbol.filterArea = null; + this.target.machine.removeChild(symbol); + if (!this.target.pool.add(symbol.key, symbol)) symbol.destroy(); + + return false; + } + + return true; + }); + } + + /** + * Manages the addition of new symbols as the reel position changes, handling cases where multiple positions are skipped. + * @private + */ + protected _handleSwitchingPosition(): void + { + if (!this._isReelSpinning()) return; + + const slots = this.getSlotsCount(); + const currentPos = Math.ceil(this.position); + + if (this._prevPosition === currentPos) return; + + for (let i = 0; i < slots; i++) + { + if (this.symbols.findIndex(([pos]) => pos === currentPos + i) >= 0) continue; + this._addRandomSymbol(currentPos + i); + } + + this._prevPosition = currentPos; + } + + public getLastSymbolPosition() + { + if (this.symbols.length === 0) return 0; + const [position] = this.symbols[this.symbols.length - 1]; + + return position; + } + + /** + * Checks if the reel is in a spinning state. + * @private + */ + protected _isReelSpinning(): boolean + { + return !(this.currentState.name === 'Deceleration' || this.currentState.name === 'Stopped'); + } + + /** + * Adds a random symbol at the specified position on the reel. + * @param {number} position - The position to add the symbol. + * @private + */ + + protected _addRandomSymbol(position: number): void + { + const randomKey = this.target.getRandomSymbolKey(); + const symbol: ReelsSpinSystemCompatibleEntity = this.target.getSymbol(randomKey); + + this._setSymbolX(symbol); + this.symbols.push([position, symbol]); + this.target.machine.addChild(symbol); + } + + /** + * Sets the x-coordinate of a symbol based on the reel index. + * @param {symbol} symbol - The symbol object to position. + * @protected + */ + protected _setSymbolX(symbol: Entity): void + { + const slotWidth = this.target.machine.utils.grid.getSlotWidth(); + const halfSlotWidth = slotWidth * 0.5; + const col = this.getColumnIndex(); + + symbol.x = halfSlotWidth + (col * slotWidth); + } + + /** + * Returns the column index for this reel. Subclasses can override to decouple from this.index. + */ + protected getSlotsCount(): number + { + return this.target.machine.config.slots; + } + + protected getColumnIndex(): number + { + return this.index; + } + + /** + * Returns base Y coordinate for symbols when position equals 0. Subclasses can override to anchor per row. + */ + protected getBaseY(): number + { + const slotHeight = this.target.machine.utils.grid.getSlotHeight(); + const halfSlotHeight = slotHeight / 2; + const reelHeight = this.target.machine.config.height; + return reelHeight - halfSlotHeight; + } +} diff --git a/src/systems/reels/SingleSlotReel.ts b/src/systems/reels/SingleSlotReel.ts new file mode 100644 index 0000000..28075ae --- /dev/null +++ b/src/systems/reels/SingleSlotReel.ts @@ -0,0 +1,187 @@ +import Reel from './Reel'; +import { Graphics } from 'pixi.js'; + +/** + * SingleSlotReel: per-cell reel anchored to a specific grid slot (row, column). + */ +import { ReelsSpinSystemCompatibleEntity } from '../ReelsSpinSystem'; + +export default class SingleSlotReel extends Reel { + private maskGraphics?: Graphics; + + constructor(target: any, index: number) { + super(target, index); + + this.createMask(); + } + + /** Returns the symbol to the pool and removes it from the stage. */ + private releaseSymbol(symbol: ReelsSpinSystemCompatibleEntity): void { + symbol.isBlurred = false; + symbol.filters = null; + symbol.blurEnabled = false; + symbol.cacheAsBitmap = false; + symbol.filterArea = null; + this.target.machine.removeChild(symbol); + if (!this.target.pool.add(symbol.key, symbol)) { + symbol.destroy(); + } + } + + private createMask() { + // Create a red rectangle graphics matching the slot size + const slotWidth = this.target.machine.utils.grid.getSlotWidth(); + const slotHeight = this.target.machine.utils.grid.getSlotHeight(); + + const gr = new Graphics(); + gr.beginFill(0xff0000, 1); + // Centered rectangle relative to graphics position + gr.drawRect(-slotWidth / 2, -slotHeight / 2, slotWidth, slotHeight); + gr.endFill(); + + // Position to match reel coordinates (column center, row center) + const col = this.getColumnIndex(); + const halfSlotWidth = slotWidth * 0.5; + gr.x = halfSlotWidth + (col * slotWidth); + gr.y = this.getBaseY(); + + // Mask should be hidden by default (visible only while spinning) + gr.visible = false; + + // Add to machine container + this.target.machine.addChild(gr); + + this.maskGraphics = gr; + } + + /** + * Apply or remove mask for a given symbol depending on current state. + * Mask is enabled for all states except Bouncing and Stopped; in those states it is removed. + * Also toggles the mask graphics visibility accordingly. + */ + private updateMask(symbol: ReelsSpinSystemCompatibleEntity): void { + // Mask should be enabled in all states except Bouncing and Stopped + const stateName = this.currentState?.name; + const shouldMask = stateName !== 'Bouncing' && stateName !== 'Stopped'; + + // Toggle mask graphics visibility based on state + if (this.maskGraphics) { + this.maskGraphics.visible = shouldMask; + } + + if (shouldMask && this.maskGraphics) { + symbol.mask = this.maskGraphics; + symbol.isMasked = true; + } else { + symbol.mask = null as any; + symbol.isMasked = false; + } + } + + protected override getSlotsCount(): number { + // Ensure SingleSlotReel manages exactly one visible slot + return 1; + } + + protected override getColumnIndex(): number { + const reels = this.target.machine.config.reels; + return this.index % reels; + } + + protected override getBaseY(): number { + const slotHeight = this.target.machine.utils.grid.getSlotHeight(); + const halfSlotHeight = slotHeight / 2; + const reels = this.target.machine.config.reels; + const row = Math.floor(this.index / reels); + return halfSlotHeight + row * slotHeight; + } + + // Override position switching to strictly manage a single symbol per reel + // Using `any` to access base class private members without changing base visibility + protected override _handleSwitchingPosition(): void { + if (!this._isReelSpinning()) return; + + const slots = 1; + const currentPos = Math.ceil(this.position); + + if (this._prevPosition === currentPos) return; + + for (let i = 0; i < slots; i++) { + if (this.symbols.findIndex(([pos]) => pos === currentPos + i) >= 0) continue; + this._addRandomSymbol(currentPos + i); + } + + this._prevPosition = currentPos; + } + + // Ensure random symbols also respect the mask immediately + protected override _addRandomSymbol(position: number): void { + const randomKey = this.target.getRandomSymbolKey(); + const symbol: ReelsSpinSystemCompatibleEntity = this.target.getSymbol(randomKey); + this._setSymbolX(symbol); + this.updateMask(symbol); + this.symbols.push([position, symbol]); + this.target.machine.addChild(symbol); + } + + // Ensure mask is applied immediately when symbols are added via system + public override addSymbols(symbols: ReelsSpinSystemCompatibleEntity[], position: number): void { + const toAdd = symbols || []; + toAdd.forEach((symbol, i) => { + this._setSymbolX(symbol); + this.updateMask(symbol); + this.symbols.push([position + i, symbol]); + this.target.machine.addChild(symbol); + }); + } + + /** + * Removes all scheduled symbols at or beyond the provided position to avoid duplicates before stopping. + */ + public trimSymbolsFrom(position: number): void { + this.symbols = this.symbols.filter(([symbolPosition, symbol]) => { + if (symbolPosition < position) { + return true; + } + this.releaseSymbol(symbol); + return false; + }); + } + + /** Keeps only the symbol that matches the provided stop position. */ + public retainOnlySymbolAt(position: number): void { + this.symbols = this.symbols.filter(([symbolPosition, symbol]) => { + const keep = symbolPosition === position; + if (!keep) { + this.releaseSymbol(symbol); + } + return keep; + }); + this._prevPosition = position; + } + + // Override symbols update to work with per-slot reel + protected override _updateSymbols(): void { + const slotHeight = this.target.machine.utils.grid.getSlotHeight(); + const baseY = this.getBaseY(); + + this.symbols.forEach(([position, symbol]) => { + const distance = this.position - position; + symbol.y = (distance * slotHeight) + baseY; + this._setSymbolX(symbol); + // Apply or remove per-slot mask depending on current state + this.updateMask(symbol); + }); + + this.symbols = this.symbols.filter(([position, symbol]) => { + if (position <= this.position - 1) { + this.target.machine.removeChild(symbol); + if (!this.target.pool.add(symbol.key, symbol)) { + symbol.destroy(); + } + return false; + } + return true; + }); + } +} diff --git a/src/systems/reels/Spinning.ts b/src/systems/reels/Spinning.ts new file mode 100644 index 0000000..3f18209 --- /dev/null +++ b/src/systems/reels/Spinning.ts @@ -0,0 +1,38 @@ +import Reel from '../../systems/reels/Reel'; +import { State } from '@popiplay/state-machine'; + +/** + * @class Spinning + * @extends State + * @description Represents the spinning phase of a reel. In this state, the reel maintains a constant maximum speed. + */ +export default class Spinning extends State +{ + private reel: Reel; + + /** + * @class + * @param {Reel} reel - The reel instance that this state belongs to. + */ + constructor(reel: Reel) + { + super('Spinning'); + this.reel = reel; + } + + /** Sets the reel's speed to the maximum speed defined in its settings. Called when the state is entered. */ + override enter(): void + { + this.reel.speed = this.reel.maxSpeed; + } + + /** + * Updates the reel's position based on its speed and the time delta. + * @param {number} dt - Delta time since the last update, in milliseconds. + */ + override update(dt: number): void + { + this.reel.position += dt * 0.001 * this.reel.speed; + } + +} diff --git a/src/systems/reels/Stopped.ts b/src/systems/reels/Stopped.ts new file mode 100644 index 0000000..35bc585 --- /dev/null +++ b/src/systems/reels/Stopped.ts @@ -0,0 +1,38 @@ +import Reel from '../../systems/reels/Reel'; +import { State } from '@popiplay/state-machine'; + +/** + * @class Stopped + * @extends State + * @description Represents the stopped phase of a reel. In this state, the reel is stationary at the specified stop position. + */ +export default class Stopped extends State +{ + private reel: Reel; + + /** + * @class + * @param {Reel} reel - The reel instance that this state belongs to. + */ + constructor(reel: Reel) + { + super('Stopped'); + this.reel = reel; + } + + /** Sets the reel's position to the final stop position and applies a bounce effect. Called when the state is entered. */ + public override enter(): void + { + this.reel.position = this.reel.stopPosition; + this.reel.onStop(); + } + + /** + * Sets the reel's speed to zero to ensure it remains stationary. + * @param {number} _dt - Delta time since the last update, in milliseconds. + */ + public override update(_dt: number): void + { + this.reel.speed = 0; + } +} diff --git a/src/systems/reels/states.ts b/src/systems/reels/states.ts new file mode 100644 index 0000000..654745d --- /dev/null +++ b/src/systems/reels/states.ts @@ -0,0 +1,9 @@ +/** Enum representing the states of a slot machine reel. */ +export enum REEL_STATES + { + STOPPED = 0, + ACCELERATION = 1, + SPINNING = 2, + DECELERATION = 3, + BOUNCING = 4 +} diff --git a/src/types/Entity.ts b/src/types/Entity.ts new file mode 100644 index 0000000..05f7a65 --- /dev/null +++ b/src/types/Entity.ts @@ -0,0 +1,141 @@ +import {DisplayObject} from "pixi.js"; +import {ITrackEntry} from "pixi-spine"; + +/** + * @interface Entity + * @description Represents an entity. + */ +export interface Entity extends DisplayObject{ + key: string + reset(): void; +} + +/** + * @interface Entity + * @description Represents an entity than can be updated. + */ +export interface Updatable { + update(dt: number): void; +} + +/** + * @interface CanBeBlocked + * @description Represents an entity than can be marked as blocked. + */ +export interface CanBeBlocked { + isBlocked: boolean; +} + +export interface CanBeLanded { + isLanded: boolean; +} + +/** + * @interface CanBeMasked + * @description Represents an entity that supports enabling and disabling masking. + */ +export interface CanBeMasked { + isMasked: boolean; +} + +export interface CanBeHighlighted { + isHighlighted: boolean; + highlight: () => ITrackEntry; +} + +/** + * @interface CanPlayFalling + * @description Represents an entity than can play falling animation. + */ +export interface CanPlayFalling { + falling: () => ITrackEntry; +} + +/** + * @interface CanPlayIdle + * @description Represents an entity than can play idle animation. + */ +export interface CanPlayIdle { + idle: () => ITrackEntry; +} + +/** + * @interface CanPlayBouncing + * @description Represents an entity than can play bounce animation. + */ +export interface CanPlayBouncing { + bounce: () => ITrackEntry; +} + +/** + * @interface CanPlayWin + * @description Represents an entity than can play win animation. + */ +export interface CanPlayWin { + win: () => ITrackEntry; +} + +/** + * @interface CanPlayIn + * @description Represents an entity than can play in animation. + */ +export interface CanPlayIn { + in: () => ITrackEntry; +} + +/** + * @interface CanPlayOut + * @description Represents an entity than can play out animation. + */ +export interface CanPlayOut { + out: () => ITrackEntry; +} + +/** + * @interface CanPlaySticky + * @description Represents an entity than can play sticky animation. + */ +export interface CanPlaySticky { + sticky: () => ITrackEntry; +} + + +/** + * @interface CanBeBlurred + * @description Represents an entity compatible with system-driven blur toggling. + */ +export interface CanBeBlurred extends DisplayObject { + /** Indicates whether the blur effect should be active. */ + isBlurred: boolean; + /** Reflects whether the blur filter is currently applied. */ + blurEnabled: boolean; +} + +/** + * @interface ValueAssignable + * @description Represents an entity with an assignable numeric value. + */ +export interface ValueAssignable { + value: number +} + +/** + * @interface CanPlaySpin + * @description Interface representing an entity capable of performing a spin action. + */ +export interface CanPlaySpin { + spin: () => ITrackEntry; +} + +/** + * @interface CanBeTinted + * @description Represents an entity that can be tinted with a specified color. + */ +export interface CanBeTinted { + tint(hexColor: number): void + preventTint: boolean +} + +export interface CanPlayAnticipation { + anticipate(): ITrackEntry; +} diff --git a/src/types/ITrackEntry.ts b/src/types/ITrackEntry.ts new file mode 100644 index 0000000..e6a860a --- /dev/null +++ b/src/types/ITrackEntry.ts @@ -0,0 +1,24 @@ +import {IAnimationStateListener} from "pixi-spine"; + +export interface IAnimation { + duration: number; +} + +export interface ITrackEntry { + trackIndex: number; + loop: boolean; + animationEnd: number; + listener: IAnimationStateListener; + delay: number; + trackTime: number; + trackLast: number; + nextTrackLast: number; + trackEnd: number; + timeScale: number; + alpha: number; + mixTime: number; + mixDuration: number; + interruptAlpha: number; + totalAlpha: number; + animation?: IAnimation; +} diff --git a/src/types/ScreenInputMap.ts b/src/types/ScreenInputMap.ts new file mode 100644 index 0000000..2aa2eb2 --- /dev/null +++ b/src/types/ScreenInputMap.ts @@ -0,0 +1,8 @@ +/** + * @interface ScreenMapRecord + * @description Represents a record in the screen input map, containing the symbol key and value. + */ +export interface ScreenMapRecord { + key: string; + value: string | number | undefined +} diff --git a/src/types/SlotMachineConfig.ts b/src/types/SlotMachineConfig.ts new file mode 100644 index 0000000..066230e --- /dev/null +++ b/src/types/SlotMachineConfig.ts @@ -0,0 +1,101 @@ +import {IBitmapTextStyle} from "pixi.js"; + +/** + * @interface SymbolConfig + * @description Configuration for an individual symbol in the slot machine. + */ +export interface SymbolConfig { + /** + * @property {string} key - The key of the symbol. + */ + key: string + /** + * @property {string} spine - The category of the symbol, defining its sprite. + */ + spine: string; + + /** + * @property {string} skin - The appearance or skin of the symbol. + */ + skin: string; + + /** + * @property {"COMMON" | "BONUS" | "MULTIPLIER"} type - The type of the symbol (common, bonus, or multiplier). + */ + type: "COMMON" | "BONUS" | "MULTIPLIER"; + + /** + * @property {number} value - The value of the symbol. + */ + value: number; + + /** + * @property {IBitmapTextStyle} fontStyle - The style of the font for the symbol. + */ + fontStyle?: IBitmapTextStyle, + + /** + * @property {number} zIndex - The z-index of the symbol. + */ + zIndex?: number +} + +/** + * @interface SlotMachineConfig + * @description Main configuration for the slot machine. + */ +export interface SlotMachineConfig { + /** + * @property {number} width - The width of the game area. + */ + width: number; + + /** + * @property {number} height - The height of the game area. + */ + height: number; + + /** + * @property {number} reels - The number of reels in the slot machine. + */ + reels: number; + + /** + * @property {number} slots - The number of slots on each reel. + */ + slots: number; + + /** + * @property {string[]} symbolsKeys - The keys for all available symbols. + */ + symbolsKeys: string[]; + + /** + * @property {Record} [symbolsWeights] - Optional weights for random symbol selection during reel spinning. + * Keys are symbol keys, values are non-negative weights. A weight of 0 disables the symbol from random appearance. + * Symbols without specified weights are assigned equal default weight (balanced among unspecified symbols). + */ + symbolsWeights?: Record; + + /** + * @property {string[]} wilds - List of wild symbols. + */ + wilds: string[]; + + /** + * @property {string[]} scatters - List of scatter symbols. + */ + scatters: string[]; + + /** + * @property {Record} symbols - Configurations for the main symbols, where the key is the symbol ID. + */ + symbols: Record; + + /** + * @property {Record} expandedSymbols - Configurations for the expanded symbols, where the key is the symbol ID. + */ + expandedSymbols: Record; + + lines: number[][]; +} diff --git a/src/types/WinsData.ts b/src/types/WinsData.ts new file mode 100644 index 0000000..21481db --- /dev/null +++ b/src/types/WinsData.ts @@ -0,0 +1,14 @@ + +export type WinLineRecord = { + type: string, + amount: number, + amountString: string, + lineSlotsIndexMap: number[], + lineIndex: number +} + +export type WinsData = { + totalWin: number, + totalWinString: string, + wins: WinLineRecord[], +} diff --git a/src/utils/GridUtils.ts b/src/utils/GridUtils.ts new file mode 100644 index 0000000..bc028c2 --- /dev/null +++ b/src/utils/GridUtils.ts @@ -0,0 +1,106 @@ +import { Point } from 'pixi.js'; +import { SlotMachineConfig } from '../types/SlotMachineConfig'; + +/** + * @class GridUtils + * @description Utility class for working with slot grid configuration, coordinates, and indices. + */ +export default class GridUtils +{ + private config: SlotMachineConfig; + private slotWidth: number; + private slotHeight: number; + private slotCenter: Point; + + /** + * @class + * @param {SlotMachineConfig} config - Configuration for the slot grid. + */ + constructor(config: SlotMachineConfig) + { + this.config = config; + this.slotWidth = config.width / config.reels; + this.slotHeight = config.height / config.slots; + this.slotCenter = new Point(this.slotWidth * 0.5, this.slotHeight * 0.5); + } + + /** + * Converts a linear index to the XY coordinates of the slot's center. + * @param {number} i - The linear index in the grid. + * @returns {Point | null} The center coordinates of the slot or `null` if the index is out of bounds. + */ + fromMapIndexToXY(i: number): Point | null + { + if (i < 0 || i >= this.config.reels * this.config.slots) return null; + const x = (this.getColumn(i) * this.slotWidth) + this.slotCenter.x; + const y = (this.getRow(i) * this.slotHeight) + this.slotCenter.y; + + return new Point(x, y); + } + + /** + * Converts a linear index to grid coordinates. + * @param {number} i - The linear index in the grid. + * @returns {{ x: number, y: number } | null} The grid coordinates or `null` if the index is out of bounds. + */ + fromMapIndexToGridCoords(i: number): { x: number; y: number } | null + { + if (i < 0 || i >= this.config.reels * this.config.slots) return null; + + return { + x: this.getColumn(i), + y: this.getRow(i), + }; + } + + /** + * Returns the width of a single slot. + * @returns {number} The slot width. + */ + getSlotWidth(): number + { + return this.slotWidth; + } + + /** + * Returns the height of a single slot. + * @returns {number} The slot height. + */ + getSlotHeight(): number + { + return this.slotHeight; + } + + /** + * Converts column and row coordinates to a linear index. + * @param {number} c - The column number. + * @param {number} r - The row number. + * @returns {number | null} The linear index or `null` if the values are out of bounds. + */ + fromCRtoMapIndex(c: number, r: number): number | null + { + if (c < 0 || c >= this.config.reels || r < 0 || r >= this.config.slots) return null; + + return (r * this.config.reels) + c; + } + + /** + * Returns the row for a given index in the grid. + * @param {number} i - The linear index in the grid. + * @returns {number} The row number. + */ + getRow(i: number): number + { + return Math.floor(i / this.config.reels); + } + + /** + * Returns the column for a given index in the grid. + * @param {number} i - The linear index in the grid. + * @returns {number} The column number. + */ + getColumn(i: number): number + { + return i % this.config.reels; + } +} diff --git a/src/utils/Pool.ts b/src/utils/Pool.ts new file mode 100644 index 0000000..64559b6 --- /dev/null +++ b/src/utils/Pool.ts @@ -0,0 +1,67 @@ +import {DisplayObject} from "pixi.js"; + +/** + * @class Pool + * @description A simple object pool for managing reusable instances by key. Stores objects in an internal + * dictionary, organized by key, allowing retrieval and reuse of items associated with specific keys. + */ +export default class Pool +{ + /** + * @type {Record} + * @description Internal pool storage, organized by key. Each key holds an array of objects. + */ + private _pool: Record; + + constructor() + { + this._pool = {}; + } + + /** + * Adds an object to the pool under the specified key. + * @param {string} key - The key under which to store the object. + * @param {T} object - The object to add to the pool. + */ + add(key: string, object: T): boolean + { + if (!this._pool[key]) { + this._pool[key] = []; + } + + if (this._pool[key] && this._pool[key].length >= 0) { + return false; + } + + this._pool[key].push(object); + + return true; + } + + + /** + * Retrieves and removes the most recently added object under the specified key. + * Returns `undefined` if no objects are available for that key. + * @param {string} key - The key under which to retrieve an object. + * @returns {T | undefined} The retrieved object, or `undefined` if none are available. + */ + retrieve(key: string): T | undefined + { + if (!this._pool[key] || this._pool[key].length === 0) + { + return undefined; + } + + return this._pool[key].pop(); + } + + clear() { + Object.keys(this._pool).forEach((key: string) => { + this._pool[key].forEach((obj: T):void => { + (obj as DisplayObject).destroy && (obj as DisplayObject).destroy() + }); + delete this._pool[key]; + + }) + } +} diff --git a/src/utils/easing/easeInOutBack.ts b/src/utils/easing/easeInOutBack.ts new file mode 100644 index 0000000..0803d3e --- /dev/null +++ b/src/utils/easing/easeInOutBack.ts @@ -0,0 +1,12 @@ +/** + * Easing function for smooth acceleration and deceleration with a "back" effect, commonly used in animations. + * @param {number} t - The normalized time (from 0 to 1). + * @param {number} [s=1.7] - Overshoot amplitude; default is 1.7 for a standard "back" effect. + * @returns {number} The eased value for the given time. + */ +export function easeInOutBack(t: number, s: number = 1.7): number +{ + return t < 0.5 + ? (Math.pow(2 * t, 2) * (((s + 1) * 2 * t) - s)) / 2 + : ((Math.pow((2 * t) - 2, 2) * (((s + 1) * ((t * 2) - 2)) + s)) + 2) / 2; +} diff --git a/src/utils/getUniqueId.ts b/src/utils/getUniqueId.ts new file mode 100644 index 0000000..1b0a7f5 --- /dev/null +++ b/src/utils/getUniqueId.ts @@ -0,0 +1,3 @@ +/** Returns a unique identifier. */ +export const getUniqueId = (): string => + (Number(new Date())).toString(16) + (Math.random() * 100000000 | 0).toString(16); diff --git a/src/utils/hooks/AnimationProgressHook.ts b/src/utils/hooks/AnimationProgressHook.ts new file mode 100644 index 0000000..c047745 --- /dev/null +++ b/src/utils/hooks/AnimationProgressHook.ts @@ -0,0 +1,54 @@ +import { ITrackEntry } from '../../types/ITrackEntry'; +import Hook from './Hook'; + +/** + * @class AnimationProgressHook + * @extends Hook + * @description Hook that tracks the progress of an animation based on its track time and duration. + */ +class AnimationProgressHook extends Hook +{ + private entry: ITrackEntry; + private callback: () => ITrackEntry; + /** + * @class + * @param onStart + */ + constructor(onStart: () => ITrackEntry) + { + super(); + this.callback = onStart; + } + + /** + * Updates the animation's progress. No specific update action is required, + * as the animation progress is tracked automatically by the entry's track time. + * @param {number} _dt - Delta time since the last update in milliseconds. + */ + update(_dt: number): void + { + if (!this.entry) this.entry = this.callback(); + } + + /** + * Checks if the animation has completed. + * @returns {boolean} - Returns `true` if the animation is complete, otherwise `false`. + */ + isComplete(): boolean + { + return this.checkAnimationProgress() >= 1; + } + + /** + * Calculates the progress of the animation. + * @returns {number} - Returns a progress value between 0 and 1. + */ + private checkAnimationProgress(): number + { + if (!this.entry || !this.entry.animation) return 1; + + return Math.min(this.entry.trackTime / this.entry.animation.duration, 1); + } +} + +export default AnimationProgressHook; diff --git a/src/utils/hooks/DelayHook.ts b/src/utils/hooks/DelayHook.ts new file mode 100644 index 0000000..5f4a3ac --- /dev/null +++ b/src/utils/hooks/DelayHook.ts @@ -0,0 +1,43 @@ +import Hook from './Hook'; + +/** + * @class DelayHook + * @extends Hook + * @description Hook that implements a delay, completing after the specified duration has passed. + */ +class DelayHook extends Hook +{ + private delayDuration: number; + private elapsedTime: number; + + /** + * @class + * @param {number} delayDuration - Duration of the delay in milliseconds. + */ + constructor(delayDuration: number) + { + super(); + this.delayDuration = delayDuration; + this.elapsedTime = 0; + } + + /** + * Updates the elapsed time and checks if the delay duration has been reached. + * @param {number} dt - Delta time since the last update in milliseconds. + */ + update(dt: number): void + { + this.elapsedTime += dt * 0.001; + } + + /** + * Checks if the delay has completed. + * @returns {boolean} - Returns `true` if the delay has reached its duration, otherwise `false`. + */ + isComplete(): boolean + { + return this.elapsedTime >= this.delayDuration; + } +} + +export default DelayHook; diff --git a/src/utils/hooks/GravityHook.ts b/src/utils/hooks/GravityHook.ts new file mode 100644 index 0000000..3873c45 --- /dev/null +++ b/src/utils/hooks/GravityHook.ts @@ -0,0 +1,57 @@ +import { Entity } from '../../types/Entity'; +import Hook from './Hook'; + +/** + * @class GravityHook + * @extends Hook + * @description Hook that updates an entity's position, simulating gravity until it reaches the target Y position. + */ +class GravityHook extends Hook +{ + private entity: Entity; + private targetY: number; + private gravity: number; + private completed: boolean; + + /** + * @class + * @param {Entity} entity - The entity object whose position is being updated. + * @param {number} targetY - The target Y position to reach. + * @param {number} gravity - The gravitational acceleration in units per second^2. + */ + constructor(entity: Entity, targetY: number, gravity: number) + { + super(); + this.entity = entity; + this.targetY = targetY; + this.gravity = gravity; + this.completed = false; + } + + /** + * Updates the entity's position, applying gravity until it reaches the target Y position. + * @param {number} dt - Delta time in milliseconds since the last update. + */ + update(dt: number): void + { + if (this.completed) return; + + this.entity.y = Math.min(this.entity.y + (this.gravity * (dt * 0.001)), this.targetY); + if (this.entity.y >= this.targetY) + { + this.entity.y = this.targetY; + this.completed = true; + } + } + + /** + * Checks if the hook has completed its task (i.e., the entity has reached the target Y position). + * @returns {boolean} - Returns `true` if the hook is complete, otherwise `false`. + */ + isComplete(): boolean + { + return this.completed; + } +} + +export default GravityHook; diff --git a/src/utils/hooks/Hook.ts b/src/utils/hooks/Hook.ts new file mode 100644 index 0000000..10e6db1 --- /dev/null +++ b/src/utils/hooks/Hook.ts @@ -0,0 +1,42 @@ +/** + * @abstract + * @class Hook + * @description Base class for all hooks, providing a unified interface with `update(dt)` and `isComplete()` methods. + * Derived classes must implement these methods to define hook behavior. + */ +abstract class Hook +{ + /** + * Updates the state of the hook. This method should be implemented in derived classes. + * @abstract + * @param {number} dt - Delta time in milliseconds since the last update. + * @throws {Error} Throws an error if not implemented in the subclass. + */ + abstract update(dt: number): void; + + /** + * Checks if the hook has completed its task. This method should be implemented in derived classes. + * @abstract + * @returns {boolean} `true` if the hook is complete, otherwise `false`. + * @throws {Error} Throws an error if not implemented in the subclass. + */ + abstract isComplete(): boolean; + + /** + * Callback function that gets executed when an operation is completed. + * @returns {void} + */ + onComplete: () => void; + + /** + * Sets the callback function to be executed upon completion. + * @param callback - The function to be called when the operation is complete. + * @returns {void} + */ + setOnComplete(callback: () => void): void + { + this.onComplete = callback; + } +} + +export default Hook; diff --git a/src/utils/hooks/HooksChain.ts b/src/utils/hooks/HooksChain.ts new file mode 100644 index 0000000..4d418a5 --- /dev/null +++ b/src/utils/hooks/HooksChain.ts @@ -0,0 +1,100 @@ +import Hook from './Hook'; + +/** + * @class HooksChain + * @description Class representing a chain of hooks that execute in sequence. + * Each hook updates until completion, after which the next hook in the queue starts. + */ +class HooksChain +{ + private hooksQueue: Hook[]; + private currentHookIndex: number; + private onComplete: (() => void) | null; + private chainCompleted: boolean; + + /** + * @class + */ + constructor() + { + this.hooksQueue = []; + this.currentHookIndex = 0; + this.onComplete = null; + this.chainCompleted = false; // Flag to track if the chain has completed + } + + /** + * Adds a hook to the end of the chain. + * @param {Hook} hook - The hook to add to the chain. + * @returns {HooksChain} - Returns the instance for chaining. + */ + addHook(hook: Hook): HooksChain + { + this.hooksQueue.push(hook); + + return this; // Return instance for chaining + } + + /** + * Sets the onComplete callback to execute when all hooks in the chain are complete. + * @param {() => void} callback - Callback to execute on completion. + * @returns {HooksChain} - Returns the instance for chaining. + */ + setOnComplete(callback: () => void): HooksChain + { + this.onComplete = callback; + + return this; // Return instance for chaining + } + + /** + * Updates the current active hook. If the current hook is complete, + * it moves to the next hook in the queue. + * @param {number} dt - Delta time since the last update in milliseconds. + */ + update(dt: number): void + { + if (this.hooksQueue.length === 0 || !this.hooksQueue) return; + + const currentHook = this.hooksQueue[this.currentHookIndex]; + + currentHook.update(dt); + + if (currentHook.isComplete()) + { + if (currentHook.onComplete) + { + currentHook.onComplete(); + } + this.currentHookIndex++; + } + + if (this.isComplete()) + { + if (this.onComplete && !this.chainCompleted) + { + this.onComplete(); + this.chainCompleted = true; // Ensure onComplete is called only once + } + } + } + + /** + * Checks if all hooks in the chain have been completed. + * @returns {boolean} - Returns `true` if the entire chain is complete, otherwise `false`. + */ + isComplete(): boolean + { + return this.currentHookIndex >= this.hooksQueue.length; + } + + /** Resets the chain, clearing all hooks and resetting the index. */ + reset(): void + { + this.hooksQueue = []; + this.currentHookIndex = 0; + this.chainCompleted = false; // Reset the completion flag + } +} + +export default HooksChain; diff --git a/src/utils/hooks/ImmediateHook.ts b/src/utils/hooks/ImmediateHook.ts new file mode 100644 index 0000000..6786ac5 --- /dev/null +++ b/src/utils/hooks/ImmediateHook.ts @@ -0,0 +1,48 @@ +import Hook from './Hook'; + +/** + * @class ImmediateHook + * @extends Hook + * @description Hook that is immediately complete upon creation. Can optionally execute a provided function. + */ +class ImmediateHook extends Hook +{ + private callback: (() => void) | null; + private _isComplete: boolean = false; + /** + * @class + * @param {() => void} [callback] - Optional function to execute immediately upon hook creation. + */ + constructor(callback: (() => void) | null = null) + { + super(); + this.callback = callback; + + // Invoke the callback immediately if it exists + } + + /** + * Updates the hook's state. No action is needed since this hook is always complete. + * @param {number} _dt - Delta time since the last update in milliseconds. + */ + update(_dt: number): void + { + if (this.isComplete()) return; + if (this.callback) + { + this.callback(); + } + this._isComplete = true; + } + + /** + * Checks if the hook is complete. + * @returns {boolean} - Always returns `true` since the hook is complete upon creation. + */ + isComplete(): boolean + { + return this._isComplete; + } +} + +export default ImmediateHook; diff --git a/tsconfig.json b/tsconfig.json new file mode 100644 index 0000000..da0d185 --- /dev/null +++ b/tsconfig.json @@ -0,0 +1,32 @@ +{ + "compilerOptions": { + "target": "ESNext", + "module": "ESNext", + "lib": ["ESNext", "DOM", "ScriptHost"], + "strict": true, + "esModuleInterop": true, + "allowJs": true, + "moduleResolution": "node", + "sourceMap": false, + "declaration": true, + "declarationMap": true, + "declarationDir": "./lib", + "outDir": "./lib", + "noImplicitAny": true, + "noUnusedLocals": true, + "noUnusedParameters": true, + "noImplicitReturns": true, + "strictNullChecks": false, + "resolveJsonModule": true, + "skipLibCheck": true, + "noImplicitOverride": true, + "emitDecoratorMetadata": true, + "experimentalDecorators": true, + "baseUrl": "./", + "paths": { + "src/*": ["src/*"] + } + }, + "include": ["./src", "./typings", "./test", "./docs-source"] +} +