diff --git a/Dockerfile b/Dockerfile
new file mode 100644
index 000000000..713a0a05f
--- /dev/null
+++ b/Dockerfile
@@ -0,0 +1,14 @@
+# syntax=docker/dockerfile:1
+FROM amazonlinux:2
+WORKDIR /
+COPY . /graph-explorer/
+WORKDIR /graph-explorer
+RUN yum install -y curl
+RUN curl -sL https://rpm.nodesource.com/setup_16.x | bash -
+RUN yum install -y nodejs
+RUN npm install -g pnpm
+RUN pnpm install
+ENV HOME=/graph-explorer
+EXPOSE 5173
+EXPOSE 8182
+CMD ["pnpm", "dev"]
diff --git a/README.md b/README.md
index 847260ca5..bb8d2acfd 100644
--- a/README.md
+++ b/README.md
@@ -1,17 +1,85 @@
-## My Project
+# Graph Explorer
+Open source version for the Graph Explorer.
-TODO: Fill this README out!
+## Development
-Be sure to:
+### Supported Graph Types
+- Labelled Property Graph (PG) using Gremlin
+- Resource Description Framework (RDF) using SPARQL
-* Change the title in this README
-* Edit your repository description on GitHub
+### Requirements
+- pnpm >=7.9.3
+- node >=16.15.1
-## Security
+### Run in development mode
+- `pnpm i`
+- `pnpm start`
-See [CONTRIBUTING](CONTRIBUTING.md#security-issue-notifications) for more information.
+### Build for production
+- `pnpm i`
+- `pnpm build:prod`
+- `dist` folder is created in the client directory.
+- Serve the static site using the method of your choice,
+for example, using `serve` npm package.
-## License
+### Environment variables
-This project is licensed under the Apache-2.0 License.
+To change the .env file being used, navigate to `/graph-explorer/packages/proxy-server/node-server.js` and modify the file path provided inside the dotenv function. By default it is as follows:
+
+`dotenv.config({ path: "../client/.env.development" });`
+
+#### Required
+- `REACT_APP_AWS_AUTH_REQUIRED`: Enable authenticated requests. By default, `false` (`boolean`).
+- `REACT_APP_AWS_CLUSTER_HOST`: Internal host to sign requests (`string`).
+
+#### Optional
+- `REACT_APP_ENV_ROOT_FOLDER`: Base folder for the public files. By default, `/` (`string`).
+- `REACT_APP_CONNECTION_NAME`: Default connection name. Blank by default (`string`).
+- `REACT_APP_CONNECTION_URL`: Default connection to instance. Blank by default (`string`).
+- `REACT_APP_STORE_ID`: IndexedDB store identifier, By default, `ge` (`string`).
+- `REACT_APP_STORE_NAME`: IndexedDB store name. By default, `default` (`string`).
+- `REACT_APP_STORE_VERSION`: IndexedDB store version. By default, `1.0` (`number`).
+- `REACT_APP_CONNECTION_ENGINE`: Default connection query engine work with the instance. By default, `gremlin` (`gremlin | sparql`).
+- `REACT_APP_AWS_REGION`: AWS region of your Neptune instance. By default `us-east-1` (`string`).
+- `REACT_APP_AWS_SERVICE`: AWS service name. By default `neptune-db` (`string`).
+- `PROXY_SERVER_CONNECTION_URL`: Proxy server url.
+
+### Docker Instructions
+- To build the image, `docker build -t graph-explorer .` from the root directory. Required.
+- To run the image in a container, run `docker run -dit -p 5173:5173 -p 8182:8182 --name {container_name} graph-explorer`. Optional, can be run as long as the image is there.
+
+## Connection
+
+### Connecting to Neptune
+- Ensure that your environment has access via being in the same VPC or VPC peering.
+- If authentication is enabled, read query privileges are needed (See ReadDataViaQuery managed policy [here](https://docs.aws.amazon.com/neptune/latest/userguide/iam-data-access-examples.html#iam-auth-data-policy-example-read-query).
+
+### Connecting to Gremlin-Server
+- The Graph Explorer currently supports only HTTP(S) connections. When connecting to Gremlin-Server, ensure it is configured with a channelizer that support HTTP(S) (i.e. [Channelizer Documentation](https://tinkerpop.apache.org/javadocs/current/full/org/apache/tinkerpop/gremlin/server/Channelizer.html)). The Gremlin Server configuration can be usually found at: /conf/gremlin-server.yaml.
+- Remove “.withStrategies(ReferenceElementStrategy)” from `/scripts/generate-modern.groovy` so that properties are returned.
+- Change `gremlin.tinkergraph.vertexIdManager` and `gremlin.tinkergraph.edgeIdManager` in `/conf/tinkergraph-empty.properties` to support string ids.
+- Build and run the docker container as normal, substituting the url to access your gremlin-server in the `REACT_APP_CONNECTION_URL` env variable.
+### Connecting to BlazeGraph
+- Build and run the docker container as normal and connect to BlazeGraph through the proxy server.
+
+### Using the Proxy Server
+- Set `PROXY_SERVER_CONNECTION_URL` to the url that accesses your database. If needed you can change the port inside `node-server.js`.
+- Set `REACT_APP_CONNECTION_URL` to the url that accesses your proxy server.
+
+## Authentication
+
+Authentication is enabled using the SigV4 signing process found [here](https://docs.aws.amazon.com/general/latest/gr/signature-version-4.html).
+
+### Use
+- To use auth, you must run requests through the proxy server. This is where credentials are resolved and the signing logic is.
+- For further information on how to properly have credentials resolved, refer to this [documentation](https://docs.aws.amazon.com/AWSJavaScriptSDK/latest/AWS/CredentialProviderChain.html)
+- To use the SharedIniFileCredentials or ProcessCredentials, place your `.aws` folder at the root of the project before creating the docker container.
+
+### Potential Errors
+- If the explorer crashes, you can recreate the container or run `pnpm start` inside of `/packages/client`.
+- If the proxy-server crashes, you can recreate the container or run `pnpm start` inside of `/packages/proxy-server`
+- If the proxy-server fails to start, check that the provided endpoint is properly spelled and that you have access to from the environment you are trying to run in. If you are in a different VPC, consider VPC Peering.
+
+## License
+This project is licensed under the Apache-2.0 License.
diff --git a/package.json b/package.json
new file mode 100644
index 000000000..37b5da2a2
--- /dev/null
+++ b/package.json
@@ -0,0 +1,42 @@
+{
+ "name": "graph-explorer",
+ "version": "1.0.0",
+ "description": "Graph Explorer",
+ "packageManager": "pnpm@7.9.3",
+ "engines": {
+ "node": ">=16.15.1"
+ },
+ "scripts": {
+ "prepare": "husky install",
+ "precommit": "lint-staged && pnpm types:check",
+ "lint": "pnpm -F @graph-explorer/client lint",
+ "format": "pnpm -F @graph-explorer/client format",
+ "test": "pnpm -F @graph-explorer/client test",
+ "types:check": "pnpm -F @graph-explorer/client types:check",
+ "start": "pnpm -F @graph-explorer/client start",
+ "build:dev": "pnpm -F @graph-explorer/client build:dev",
+ "build:prod": "pnpm -F @graph-explorer/client build:prod",
+ "start:proxy-server": "pnpm -F @graph-explorer/proxy-server start",
+ "dev": "concurrently \"pnpm start:proxy-server\" \"pnpm start\""
+ },
+ "author": "amazon",
+ "license": "Apache-2.0",
+ "devDependencies": {
+ "@typescript-eslint/eslint-plugin": "^5.40.0",
+ "@typescript-eslint/parser": "^5.41.0",
+ "concurrently": "^7.5.0",
+ "eslint": "^7.32.0",
+ "eslint-plugin-react": "^7.31.10",
+ "eslint-plugin-react-hooks": "^4.6.0",
+ "husky": "^8.0.0",
+ "lint-staged": "^13.0.3",
+ "prettier": "2.1.2",
+ "typescript": "^4.8.4"
+ },
+ "lint-staged": {
+ "*.{ts,tsx}": [
+ "eslint --fix",
+ "prettier --write"
+ ]
+ }
+}
diff --git a/packages/client/.env.development b/packages/client/.env.development
new file mode 100644
index 000000000..9366e7a1f
--- /dev/null
+++ b/packages/client/.env.development
@@ -0,0 +1,11 @@
+REACT_APP_STORE_ID=graph-explorer
+REACT_APP_STORE_NAME=graph-explorer
+REACT_APP_STORE_VERSION=1.0
+REACT_APP_CONNECTION_NAME=
+REACT_APP_CONNECTION_ENGINE=
+REACT_APP_CONNECTION_URL=
+REACT_APP_AWS_AUTH_REQUIRED=false
+REACT_APP_AWS_REGION=
+REACT_APP_AWS_SERVICE=neptune-db
+REACT_APP_AWS_CLUSTER_HOST=
+PROXY_SERVER_CONNECTION_URL=
diff --git a/packages/client/.env.production b/packages/client/.env.production
new file mode 100644
index 000000000..045c4a7a5
--- /dev/null
+++ b/packages/client/.env.production
@@ -0,0 +1,11 @@
+REACT_APP_STORE_ID=graph-explorer
+REACT_APP_STORE_NAME=graph-explorer
+REACT_APP_STORE_VERSION=1.0
+REACT_APP_CONNECTION_NAME=
+REACT_APP_CONNECTION_ENGINE=
+REACT_APP_CONNECTION_URL=
+REACT_APP_AWS_AUTH_REQUIRED=true
+REACT_APP_AWS_REGION=
+REACT_APP_AWS_SERVICE=neptune-db
+REACT_APP_AWS_CLUSTER_HOST=
+PROXY_SERVER_CONNECTION_URL=
diff --git a/packages/client/.eslintrc b/packages/client/.eslintrc
new file mode 100644
index 000000000..18daebc19
--- /dev/null
+++ b/packages/client/.eslintrc
@@ -0,0 +1,43 @@
+/**
+ * About ESLint configuration:
+ * react-app extends from ESLint Recommended:
+ * https://github.com/eslint/eslint/blob/master/conf/eslint-recommended.js
+ * react-app definition: https://github.com/facebook/create-react-app/blob/master/.eslintrc.json
+ */
+{
+ "env": {
+ "browser": true,
+ "es2021": true
+ },
+ "extends": [
+ "eslint:recommended",
+ "plugin:react/recommended",
+ "plugin:@typescript-eslint/recommended",
+ "plugin:react-hooks/recommended",
+ "plugin:react/jsx-runtime"
+ ],
+ "overrides": [],
+ "parser": "@typescript-eslint/parser",
+ "parserOptions": {
+ "ecmaVersion": "latest",
+ "sourceType": "module"
+ },
+ "plugins": ["react", "@typescript-eslint"],
+ "rules": {
+ "no-unused-vars": "off",
+ "@typescript-eslint/no-unused-vars": "error",
+ "react-hooks/exhaustive-deps": "error",
+ "react/react-in-jsx-scope": "off",
+ "@typescript-eslint/no-explicit-any": "off",
+ "@typescript-eslint/explicit-module-boundary-types": "off",
+ "react/prop-types": "off",
+ "@typescript-eslint/no-empty-function": "off",
+ "react/display-name": "off",
+ "no-console": ["error", { "allow": ["warn", "error"] }]
+ },
+ "settings": {
+ "react": {
+ "version": "17"
+ }
+ }
+}
diff --git a/packages/client/.npmrc b/packages/client/.npmrc
new file mode 100644
index 000000000..f8b3d7def
--- /dev/null
+++ b/packages/client/.npmrc
@@ -0,0 +1,2 @@
+auto-install-peers=true
+engine-strict=true
diff --git a/packages/client/.nvmrc b/packages/client/.nvmrc
new file mode 100644
index 000000000..6f7f377bf
--- /dev/null
+++ b/packages/client/.nvmrc
@@ -0,0 +1 @@
+v16
diff --git a/packages/client/.pipelines.npmrc b/packages/client/.pipelines.npmrc
new file mode 100644
index 000000000..51411c1be
--- /dev/null
+++ b/packages/client/.pipelines.npmrc
@@ -0,0 +1,2 @@
+workspace-concurrency = 1
+child-concurrency = 2
diff --git a/packages/client/.prettierignore b/packages/client/.prettierignore
new file mode 100644
index 000000000..bf561900b
--- /dev/null
+++ b/packages/client/.prettierignore
@@ -0,0 +1,3 @@
+.DS_Store
+node_modules/
+dist/
diff --git a/packages/client/.prettierrc b/packages/client/.prettierrc
new file mode 100644
index 000000000..2a1199028
--- /dev/null
+++ b/packages/client/.prettierrc
@@ -0,0 +1,14 @@
+{
+ "arrowParens": "avoid",
+ "jsxBracketSameLine": false,
+ "jsxSingleQuote": false,
+ "proseWrap": "always",
+ "quoteProps": "as-needed",
+ "semi": true,
+ "tabWidth": 2,
+ "trailingComma": "es5",
+ "useTabs": false,
+ "singleQuote": false,
+ "bracketSpacing": true,
+ "printWidth": 80
+}
diff --git a/packages/client/babel.config.js b/packages/client/babel.config.js
new file mode 100644
index 000000000..48a4d79f2
--- /dev/null
+++ b/packages/client/babel.config.js
@@ -0,0 +1,6 @@
+module.exports = {
+ presets: [
+ "@babel/preset-env",
+ ["@babel/preset-react", { runtime: "automatic" }],
+ ],
+};
diff --git a/packages/client/index.html b/packages/client/index.html
new file mode 100644
index 000000000..075a38bb4
--- /dev/null
+++ b/packages/client/index.html
@@ -0,0 +1,37 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Graph Explorer
+
+
+
+
+
+
diff --git a/packages/client/jest.config.ts b/packages/client/jest.config.ts
new file mode 100644
index 000000000..60b0129d1
--- /dev/null
+++ b/packages/client/jest.config.ts
@@ -0,0 +1,9 @@
+import type { Config } from "jest";
+
+const config: Config = {
+ verbose: true,
+ preset: "ts-jest",
+ testEnvironment: "jsdom",
+};
+
+export default config;
diff --git a/packages/client/package.json b/packages/client/package.json
new file mode 100644
index 000000000..5a404c5d9
--- /dev/null
+++ b/packages/client/package.json
@@ -0,0 +1,167 @@
+{
+ "name": "@graph-explorer/client",
+ "version": "1.0.0",
+ "description": "Graph Explorer client",
+ "packageManager": "pnpm@7.9.3",
+ "engines": {
+ "node": ">=16.15.1"
+ },
+ "scripts": {
+ "format": "prettier --write './src/**/*.{css,ts,tsx}'",
+ "lint": "eslint src --fix",
+ "test": "jest",
+ "start": "vite",
+ "clean": "rimraf dist",
+ "vite-build": "NODE_OPTIONS=--max_old_space_size=6144 vite build",
+ "build:prod": "NODE_ENV=production pnpm vite-build -- --mode production",
+ "build:dev": "NODE_ENV=development pnpm vite-build -- --mode development",
+ "serve": "serve dist",
+ "prepare": "cd ../.. && husky install",
+ "precommit": "lint-staged && pnpm types:check",
+ "types:check": "tsc --project ./tsconfig.types.json"
+ },
+ "author": "amazon",
+ "license": "Apache-2.0",
+ "dependencies": {
+ "@emotion/css": "^11.1.3",
+ "@emotion/react": "^11.10.4",
+ "@mantine/core": "^5.5.5",
+ "@mantine/dates": "^5.5.5",
+ "@mantine/hooks": "^5.5.5",
+ "@react-aria/button": "3.5.1",
+ "@react-aria/checkbox": "3.4.1",
+ "@react-aria/combobox": "3.3.1",
+ "@react-aria/dialog": "^3.4.0",
+ "@react-aria/focus": "^3.5.4",
+ "@react-aria/i18n": "^3.5.1",
+ "@react-aria/listbox": "3.5.1",
+ "@react-aria/overlays": "3.9.1",
+ "@react-aria/radio": "^3.4.0",
+ "@react-aria/searchfield": "3.3.1",
+ "@react-aria/switch": "^3.2.4",
+ "@react-aria/textfield": "3.6.1",
+ "@react-aria/utils": "^3.13.2",
+ "@react-aria/visually-hidden": "^3.3.1",
+ "@react-stately/collections": "^3.4.2",
+ "@react-stately/combobox": "^3.1.1",
+ "@react-stately/list": "^3.5.2",
+ "@react-stately/overlays": "^3.4.0",
+ "@react-stately/searchfield": "^3.2.1",
+ "color": "^3.1.3",
+ "crypto-js": "^4.1.1",
+ "cytoscape": "^3.18.0",
+ "cytoscape-canvas": "^3.0.1",
+ "cytoscape-d3-force": "^1.1.4",
+ "cytoscape-dagre": "^2.3.0",
+ "cytoscape-fcose": "^2.0.0",
+ "cytoscape-klay": "^3.1.4",
+ "date-fns": "^2.29.2",
+ "dayjs": "^1.11.5",
+ "file-saver": "^2.0.5",
+ "flat": "^5.0.2",
+ "framer-motion": "^2.9.5",
+ "localforage": "^1.10.0",
+ "lodash": "^4.17.20",
+ "memoize-one": "^5.1.1",
+ "papaparse": "^5.3.0",
+ "query-string": "^7.1.1",
+ "rc-tabs": "^11.10.1",
+ "re-resizable": "^6.9.9",
+ "react": "^17.0.2",
+ "react-beautiful-dnd": "^13.1.0",
+ "react-dnd": "^11.1.3",
+ "react-dnd-html5-backend": "^16.0.1",
+ "react-dom": "^17.0.2",
+ "react-inlinesvg": "^2.3.0",
+ "react-laag": "^2.0.2",
+ "react-query": "^3.39.2",
+ "react-router-dom": "^6.4.2",
+ "react-slick": "^0.28.1",
+ "react-table": "^7.7.0",
+ "react-transition-group": "^4.4.5",
+ "react-virtuoso": "^2.10.0",
+ "recoil": "^0.7.5",
+ "swiper": "^8.0.7",
+ "use-deep-compare-effect": "^1.6.1",
+ "uuid": "^8.3.1"
+ },
+ "devDependencies": {
+ "@babel/core": "^7.19.3",
+ "@babel/preset-env": "^7.19.4",
+ "@babel/preset-react": "^7.18.6",
+ "@react-aria/overlays": "3.9.1",
+ "@react-stately/radio": "^3.5.0",
+ "@react-types/button": "^3.6.1",
+ "@react-types/checkbox": "^3.3.3",
+ "@react-types/combobox": "^3.5.3",
+ "@react-types/radio": "^3.2.2",
+ "@react-types/shared": "^3.14.1",
+ "@react-types/switch": "^3.2.2",
+ "@testing-library/dom": "^8.19.0",
+ "@testing-library/jest-dom": "^5.11.4",
+ "@testing-library/react": "^11.2.7",
+ "@testing-library/react-hooks": "^5.1.0",
+ "@testing-library/user-event": "^14.4.3",
+ "@types/color": "^3.0.3",
+ "@types/crypto-js": "^4.1.1",
+ "@types/cytoscape": "^3.19.7",
+ "@types/file-saver": "^2.0.5",
+ "@types/flat": "^5.0.2",
+ "@types/history": "4.7.11",
+ "@types/jest": "^26.0.24",
+ "@types/lodash": "^4.14.168",
+ "@types/node": "^17.0.2",
+ "@types/papaparse": "^5.2.5",
+ "@types/react": "^17.0.0",
+ "@types/react-beautiful-dnd": "^13.1.2",
+ "@types/react-dom": "^17.0.0",
+ "@types/react-router-dom": "5.3.3",
+ "@types/react-slick": "^0.23.4",
+ "@types/react-table": "^7.7.2",
+ "@types/react-transition-group": "^4.4.5",
+ "@types/uuid": "^8.3.4",
+ "@typescript-eslint/eslint-plugin": "^5.40.0",
+ "@vitejs/plugin-react": "^2.0.1",
+ "babel-jest": "^28.1.3",
+ "buffer": "^6.0.3",
+ "esbuild-loader": "^2.19.0",
+ "eslint": "^7.32.0",
+ "eslint-plugin-react": "^7.31.10",
+ "eslint-plugin-react-hooks": "^4.6.0",
+ "husky": "^8.0.0",
+ "jest": "^28.1.3",
+ "jest-environment-jsdom": "^29.0.1",
+ "lint-staged": "^13.0.3",
+ "prettier": "2.1.2",
+ "react-test-renderer": "^17.0.2",
+ "serve": "^14.0.1",
+ "ts-jest": "^28.0.8",
+ "ts-node": "^10.9.1",
+ "tslib": "^2.4.0",
+ "type-fest": "^2.19.0",
+ "typescript": "^4.8.4",
+ "vite": "^3.0.7",
+ "webpack": "^5.74.0"
+ },
+ "lint-staged": {
+ "*.{ts,tsx}": [
+ "eslint --fix",
+ "prettier --write"
+ ]
+ },
+ "browserslist": {
+ "production": [
+ ">0.2%",
+ "not dead",
+ "not op_mini all"
+ ],
+ "development": [
+ "last 1 chrome version",
+ "last 1 firefox version",
+ "last 1 safari version"
+ ]
+ },
+ "msw": {
+ "workerDirectory": "public"
+ }
+}
diff --git a/packages/client/pnpm-lock.yaml b/packages/client/pnpm-lock.yaml
new file mode 100644
index 000000000..5dd7b4e74
--- /dev/null
+++ b/packages/client/pnpm-lock.yaml
@@ -0,0 +1,8841 @@
+lockfileVersion: 5.4
+
+specifiers:
+ '@babel/core': ^7.19.3
+ '@babel/preset-env': ^7.19.4
+ '@babel/preset-react': ^7.18.6
+ '@emotion/css': ^11.1.3
+ '@emotion/react': ^11.10.4
+ '@mantine/core': ^5.5.5
+ '@mantine/dates': ^5.5.5
+ '@mantine/hooks': ^5.5.5
+ '@react-aria/button': 3.5.1
+ '@react-aria/checkbox': 3.4.1
+ '@react-aria/combobox': 3.3.1
+ '@react-aria/dialog': ^3.4.0
+ '@react-aria/focus': ^3.5.4
+ '@react-aria/i18n': ^3.5.1
+ '@react-aria/listbox': 3.5.1
+ '@react-aria/overlays': 3.9.1
+ '@react-aria/radio': ^3.4.0
+ '@react-aria/searchfield': 3.3.1
+ '@react-aria/switch': ^3.2.4
+ '@react-aria/textfield': 3.6.1
+ '@react-aria/utils': ^3.13.2
+ '@react-aria/visually-hidden': ^3.3.1
+ '@react-stately/collections': ^3.4.2
+ '@react-stately/combobox': ^3.1.1
+ '@react-stately/list': ^3.5.2
+ '@react-stately/overlays': ^3.4.0
+ '@react-stately/radio': ^3.5.0
+ '@react-stately/searchfield': ^3.2.1
+ '@react-types/button': ^3.6.1
+ '@react-types/checkbox': ^3.3.3
+ '@react-types/combobox': ^3.5.3
+ '@react-types/radio': ^3.2.2
+ '@react-types/shared': ^3.14.1
+ '@react-types/switch': ^3.2.2
+ '@testing-library/dom': ^8.19.0
+ '@testing-library/jest-dom': ^5.11.4
+ '@testing-library/react': ^11.2.7
+ '@testing-library/react-hooks': ^5.1.0
+ '@testing-library/user-event': ^14.4.3
+ '@types/color': ^3.0.3
+ '@types/crypto-js': ^4.1.1
+ '@types/cytoscape': ^3.19.7
+ '@types/file-saver': ^2.0.5
+ '@types/history': 4.7.11
+ '@types/jest': ^26.0.24
+ '@types/lodash': ^4.14.168
+ '@types/node': ^17.0.2
+ '@types/papaparse': ^5.2.5
+ '@types/react': ^17.0.0
+ '@types/react-beautiful-dnd': ^13.1.2
+ '@types/react-dom': ^17.0.0
+ '@types/react-router-dom': 5.3.3
+ '@types/react-slick': ^0.23.4
+ '@types/react-table': ^7.7.2
+ '@types/react-transition-group': ^4.4.5
+ '@types/uuid': ^8.3.4
+ '@typescript-eslint/eslint-plugin': ^5.40.0
+ '@vitejs/plugin-react': ^2.0.1
+ babel-jest: ^28.1.3
+ buffer: ^6.0.3
+ color: ^3.1.3
+ crypto-js: ^4.1.1
+ cytoscape: ^3.18.0
+ cytoscape-canvas: ^3.0.1
+ cytoscape-d3-force: ^1.1.4
+ cytoscape-dagre: ^2.3.0
+ cytoscape-fcose: ^2.0.0
+ cytoscape-klay: ^3.1.4
+ date-fns: ^2.29.2
+ dayjs: ^1.11.5
+ esbuild-loader: ^2.19.0
+ eslint: ^7.32.0
+ eslint-plugin-react: ^7.31.10
+ eslint-plugin-react-hooks: ^4.6.0
+ file-saver: ^2.0.5
+ framer-motion: ^2.9.5
+ husky: ^8.0.0
+ jest: ^28.1.3
+ jest-environment-jsdom: ^29.0.1
+ lint-staged: ^13.0.3
+ localforage: ^1.10.0
+ lodash: ^4.17.20
+ memoize-one: ^5.1.1
+ papaparse: ^5.3.0
+ prettier: 2.1.2
+ query-string: ^7.1.1
+ rc-tabs: ^11.10.1
+ react: ^17.0.2
+ react-beautiful-dnd: ^13.1.0
+ react-dnd: ^11.1.3
+ react-dnd-html5-backend: ^16.0.1
+ react-dom: ^17.0.2
+ react-inlinesvg: ^2.3.0
+ react-laag: ^2.0.2
+ react-query: ^3.39.2
+ react-router-dom: ^6.4.2
+ react-slick: ^0.28.1
+ react-table: ^7.7.0
+ react-test-renderer: ^17.0.2
+ react-transition-group: ^4.4.5
+ react-virtuoso: ^2.10.0
+ recoil: ^0.7.5
+ serve: ^14.0.1
+ swiper: ^8.0.7
+ ts-jest: ^28.0.8
+ ts-node: ^10.9.1
+ tslib: ^2.4.0
+ type-fest: ^2.19.0
+ typescript: ^4.8.4
+ use-deep-compare-effect: ^1.6.1
+ uuid: ^8.3.1
+ vite: ^3.0.7
+ vite-plugin-environment: ^1.1.2
+ web-vitals: ^1.0.1
+ webpack: ^5.74.0
+
+dependencies:
+ '@emotion/css': 11.10.0_@babel+core@7.19.3
+ '@emotion/react': 11.10.4_e5jlcwkuouknzfjrwezo3gnujm
+ '@mantine/core': 5.5.5_gvitupll27rb22hvbmj7ujagna
+ '@mantine/dates': 5.5.5_z2sva5sclaifqz5eqj4iv3gs3e
+ '@mantine/hooks': 5.5.5_react@17.0.2
+ '@react-aria/button': 3.5.1_react@17.0.2
+ '@react-aria/checkbox': 3.4.1_react@17.0.2
+ '@react-aria/combobox': 3.3.1_sfoxds7t5ydpegc3knd667wn6m
+ '@react-aria/dialog': 3.4.0_sfoxds7t5ydpegc3knd667wn6m
+ '@react-aria/focus': 3.9.0_react@17.0.2
+ '@react-aria/i18n': 3.6.1_react@17.0.2
+ '@react-aria/listbox': 3.5.1_react@17.0.2
+ '@react-aria/overlays': 3.9.1_sfoxds7t5ydpegc3knd667wn6m
+ '@react-aria/radio': 3.4.0_react@17.0.2
+ '@react-aria/searchfield': 3.3.1_react@17.0.2
+ '@react-aria/switch': 3.2.4_react@17.0.2
+ '@react-aria/textfield': 3.6.1_react@17.0.2
+ '@react-aria/utils': 3.14.0_react@17.0.2
+ '@react-aria/visually-hidden': 3.5.0_react@17.0.2
+ '@react-stately/collections': 3.4.4_react@17.0.2
+ '@react-stately/combobox': 3.2.2_react@17.0.2
+ '@react-stately/list': 3.5.4_react@17.0.2
+ '@react-stately/overlays': 3.4.2_react@17.0.2
+ '@react-stately/searchfield': 3.3.2_react@17.0.2
+ color: 3.2.1
+ crypto-js: 4.1.1
+ cytoscape: 3.23.0
+ cytoscape-canvas: 3.0.1
+ cytoscape-d3-force: 1.1.4_cytoscape@3.23.0
+ cytoscape-dagre: 2.4.0_cytoscape@3.23.0
+ cytoscape-fcose: 2.1.0_cytoscape@3.23.0
+ cytoscape-klay: 3.1.4_cytoscape@3.23.0
+ date-fns: 2.29.3
+ dayjs: 1.11.5
+ file-saver: 2.0.5
+ framer-motion: 2.9.5_sfoxds7t5ydpegc3knd667wn6m
+ localforage: 1.10.0
+ lodash: 4.17.21
+ memoize-one: 5.2.1
+ papaparse: 5.3.2
+ query-string: 7.1.1
+ rc-tabs: 11.16.1_sfoxds7t5ydpegc3knd667wn6m
+ react: 17.0.2
+ react-beautiful-dnd: 13.1.1_sfoxds7t5ydpegc3knd667wn6m
+ react-dnd: 11.1.3_sfoxds7t5ydpegc3knd667wn6m
+ react-dnd-html5-backend: 16.0.1
+ react-dom: 17.0.2_react@17.0.2
+ react-inlinesvg: 2.3.0_react@17.0.2
+ react-laag: 2.0.4_sfoxds7t5ydpegc3knd667wn6m
+ react-query: 3.39.2_sfoxds7t5ydpegc3knd667wn6m
+ react-router-dom: 6.4.2_sfoxds7t5ydpegc3knd667wn6m
+ react-slick: 0.28.1_sfoxds7t5ydpegc3knd667wn6m
+ react-table: 7.8.0_react@17.0.2
+ react-transition-group: 4.4.5_sfoxds7t5ydpegc3knd667wn6m
+ react-virtuoso: 2.19.1_sfoxds7t5ydpegc3knd667wn6m
+ recoil: 0.7.6_sfoxds7t5ydpegc3knd667wn6m
+ swiper: 8.4.4
+ use-deep-compare-effect: 1.8.1_react@17.0.2
+ uuid: 8.3.2
+ web-vitals: 1.1.2
+
+devDependencies:
+ '@babel/core': 7.19.3
+ '@babel/preset-env': 7.19.4_@babel+core@7.19.3
+ '@babel/preset-react': 7.18.6_@babel+core@7.19.3
+ '@react-stately/radio': 3.6.0_react@17.0.2
+ '@react-types/button': 3.6.2_react@17.0.2
+ '@react-types/checkbox': 3.4.0_react@17.0.2
+ '@react-types/combobox': 3.5.4_react@17.0.2
+ '@react-types/radio': 3.3.0_react@17.0.2
+ '@react-types/shared': 3.15.0_react@17.0.2
+ '@react-types/switch': 3.2.4_react@17.0.2
+ '@testing-library/dom': 8.19.0
+ '@testing-library/jest-dom': 5.16.5
+ '@testing-library/react': 11.2.7_sfoxds7t5ydpegc3knd667wn6m
+ '@testing-library/react-hooks': 5.1.3_7qv3rjnqa3j7exc7qtvho7thru
+ '@testing-library/user-event': 14.4.3_aaq3sbffpfe3jnxzm2zngsddei
+ '@types/color': 3.0.3
+ '@types/crypto-js': 4.1.1
+ '@types/cytoscape': 3.19.9
+ '@types/file-saver': 2.0.5
+ '@types/history': 4.7.11
+ '@types/jest': 26.0.24
+ '@types/lodash': 4.14.186
+ '@types/node': 17.0.45
+ '@types/papaparse': 5.3.5
+ '@types/react': 17.0.50
+ '@types/react-beautiful-dnd': 13.1.2
+ '@types/react-dom': 17.0.17
+ '@types/react-router-dom': 5.3.3
+ '@types/react-slick': 0.23.10
+ '@types/react-table': 7.7.12
+ '@types/react-transition-group': 4.4.5
+ '@types/uuid': 8.3.4
+ '@typescript-eslint/eslint-plugin': 5.40.0_bjgutjmzwoxcmti7ime6tsylke
+ '@vitejs/plugin-react': 2.1.0_vite@3.1.8
+ babel-jest: 28.1.3_@babel+core@7.19.3
+ buffer: 6.0.3
+ esbuild-loader: 2.20.0_webpack@5.74.0
+ eslint: 7.32.0
+ eslint-plugin-react: 7.31.10_eslint@7.32.0
+ eslint-plugin-react-hooks: 4.6.0_eslint@7.32.0
+ husky: 8.0.1
+ jest: 28.1.3_2263m44mchjafa7bz7l52hbcpa
+ jest-environment-jsdom: 29.1.2
+ lint-staged: 13.0.3
+ prettier: 2.1.2
+ react-test-renderer: 17.0.2_react@17.0.2
+ serve: 14.0.1
+ ts-jest: 28.0.8_eqqol6rpm4jvwa3dgns33uykjm
+ ts-node: 10.9.1_ksn4eycaeggbrckn3ykh37hwf4
+ tslib: 2.4.0
+ type-fest: 2.19.0
+ typescript: 4.8.4
+ vite: 3.1.8
+ vite-plugin-environment: 1.1.2_vite@3.1.8
+ webpack: 5.74.0
+
+packages:
+
+ /@adobe/css-tools/4.0.1:
+ resolution: {integrity: sha512-+u76oB43nOHrF4DDWRLWDCtci7f3QJoEBigemIdIeTi1ODqjx6Tad9NCVnPRwewWlKkVab5PlK8DCtPTyX7S8g==}
+ dev: true
+
+ /@ampproject/remapping/2.2.0:
+ resolution: {integrity: sha512-qRmjj8nj9qmLTQXXmaR1cck3UXSRMPrbsLJAasZpF+t3riI71BXed5ebIOYwQntykeZuhjsdweEc9BxH5Jc26w==}
+ engines: {node: '>=6.0.0'}
+ dependencies:
+ '@jridgewell/gen-mapping': 0.1.1
+ '@jridgewell/trace-mapping': 0.3.17
+
+ /@babel/code-frame/7.12.11:
+ resolution: {integrity: sha512-Zt1yodBx1UcyiePMSkWnU4hPqhwq7hGi2nFL1LeA3EUl+q2LQx16MISgJ0+z7dnmgvP9QtIleuETGOiOH1RcIw==}
+ dependencies:
+ '@babel/highlight': 7.18.6
+ dev: true
+
+ /@babel/code-frame/7.18.6:
+ resolution: {integrity: sha512-TDCmlK5eOvH+eH7cdAFlNXeVJqWIQ7gW9tY1GJIpUtFb6CmjVyq2VM3u71bOyR8CRihcCgMUYoDNyLXao3+70Q==}
+ engines: {node: '>=6.9.0'}
+ dependencies:
+ '@babel/highlight': 7.18.6
+
+ /@babel/compat-data/7.19.4:
+ resolution: {integrity: sha512-CHIGpJcUQ5lU9KrPHTjBMhVwQG6CQjxfg36fGXl3qk/Gik1WwWachaXFuo0uCWJT/mStOKtcbFJCaVLihC1CMw==}
+ engines: {node: '>=6.9.0'}
+
+ /@babel/core/7.19.3:
+ resolution: {integrity: sha512-WneDJxdsjEvyKtXKsaBGbDeiyOjR5vYq4HcShxnIbG0qixpoHjI3MqeZM9NDvsojNCEBItQE4juOo/bU6e72gQ==}
+ engines: {node: '>=6.9.0'}
+ dependencies:
+ '@ampproject/remapping': 2.2.0
+ '@babel/code-frame': 7.18.6
+ '@babel/generator': 7.19.5
+ '@babel/helper-compilation-targets': 7.19.3_@babel+core@7.19.3
+ '@babel/helper-module-transforms': 7.19.0
+ '@babel/helpers': 7.19.4
+ '@babel/parser': 7.19.4
+ '@babel/template': 7.18.10
+ '@babel/traverse': 7.19.4
+ '@babel/types': 7.19.4
+ convert-source-map: 1.9.0
+ debug: 4.3.4
+ gensync: 1.0.0-beta.2
+ json5: 2.2.1
+ semver: 6.3.0
+ transitivePeerDependencies:
+ - supports-color
+
+ /@babel/generator/7.19.5:
+ resolution: {integrity: sha512-DxbNz9Lz4aMZ99qPpO1raTbcrI1ZeYh+9NR9qhfkQIbFtVEqotHojEBxHzmxhVONkGt6VyrqVQcgpefMy9pqcg==}
+ engines: {node: '>=6.9.0'}
+ dependencies:
+ '@babel/types': 7.19.4
+ '@jridgewell/gen-mapping': 0.3.2
+ jsesc: 2.5.2
+
+ /@babel/helper-annotate-as-pure/7.18.6:
+ resolution: {integrity: sha512-duORpUiYrEpzKIop6iNbjnwKLAKnJ47csTyRACyEmWj0QdUrm5aqNJGHSSEQSUAvNW0ojX0dOmK9dZduvkfeXA==}
+ engines: {node: '>=6.9.0'}
+ dependencies:
+ '@babel/types': 7.19.4
+ dev: true
+
+ /@babel/helper-builder-binary-assignment-operator-visitor/7.18.9:
+ resolution: {integrity: sha512-yFQ0YCHoIqarl8BCRwBL8ulYUaZpz3bNsA7oFepAzee+8/+ImtADXNOmO5vJvsPff3qi+hvpkY/NYBTrBQgdNw==}
+ engines: {node: '>=6.9.0'}
+ dependencies:
+ '@babel/helper-explode-assignable-expression': 7.18.6
+ '@babel/types': 7.19.4
+ dev: true
+
+ /@babel/helper-compilation-targets/7.19.3_@babel+core@7.19.3:
+ resolution: {integrity: sha512-65ESqLGyGmLvgR0mst5AdW1FkNlj9rQsCKduzEoEPhBCDFGXvz2jW6bXFG6i0/MrV2s7hhXjjb2yAzcPuQlLwg==}
+ engines: {node: '>=6.9.0'}
+ peerDependencies:
+ '@babel/core': ^7.0.0
+ dependencies:
+ '@babel/compat-data': 7.19.4
+ '@babel/core': 7.19.3
+ '@babel/helper-validator-option': 7.18.6
+ browserslist: 4.21.4
+ semver: 6.3.0
+
+ /@babel/helper-create-class-features-plugin/7.19.0_@babel+core@7.19.3:
+ resolution: {integrity: sha512-NRz8DwF4jT3UfrmUoZjd0Uph9HQnP30t7Ash+weACcyNkiYTywpIjDBgReJMKgr+n86sn2nPVVmJ28Dm053Kqw==}
+ engines: {node: '>=6.9.0'}
+ peerDependencies:
+ '@babel/core': ^7.0.0
+ dependencies:
+ '@babel/core': 7.19.3
+ '@babel/helper-annotate-as-pure': 7.18.6
+ '@babel/helper-environment-visitor': 7.18.9
+ '@babel/helper-function-name': 7.19.0
+ '@babel/helper-member-expression-to-functions': 7.18.9
+ '@babel/helper-optimise-call-expression': 7.18.6
+ '@babel/helper-replace-supers': 7.19.1
+ '@babel/helper-split-export-declaration': 7.18.6
+ transitivePeerDependencies:
+ - supports-color
+ dev: true
+
+ /@babel/helper-create-regexp-features-plugin/7.19.0_@babel+core@7.19.3:
+ resolution: {integrity: sha512-htnV+mHX32DF81amCDrwIDr8nrp1PTm+3wfBN9/v8QJOLEioOCOG7qNyq0nHeFiWbT3Eb7gsPwEmV64UCQ1jzw==}
+ engines: {node: '>=6.9.0'}
+ peerDependencies:
+ '@babel/core': ^7.0.0
+ dependencies:
+ '@babel/core': 7.19.3
+ '@babel/helper-annotate-as-pure': 7.18.6
+ regexpu-core: 5.2.1
+ dev: true
+
+ /@babel/helper-define-polyfill-provider/0.3.3_@babel+core@7.19.3:
+ resolution: {integrity: sha512-z5aQKU4IzbqCC1XH0nAqfsFLMVSo22SBKUc0BxGrLkolTdPTructy0ToNnlO2zA4j9Q/7pjMZf0DSY+DSTYzww==}
+ peerDependencies:
+ '@babel/core': ^7.4.0-0
+ dependencies:
+ '@babel/core': 7.19.3
+ '@babel/helper-compilation-targets': 7.19.3_@babel+core@7.19.3
+ '@babel/helper-plugin-utils': 7.19.0
+ debug: 4.3.4
+ lodash.debounce: 4.0.8
+ resolve: 1.22.1
+ semver: 6.3.0
+ transitivePeerDependencies:
+ - supports-color
+ dev: true
+
+ /@babel/helper-environment-visitor/7.18.9:
+ resolution: {integrity: sha512-3r/aACDJ3fhQ/EVgFy0hpj8oHyHpQc+LPtJoY9SzTThAsStm4Ptegq92vqKoE3vD706ZVFWITnMnxucw+S9Ipg==}
+ engines: {node: '>=6.9.0'}
+
+ /@babel/helper-explode-assignable-expression/7.18.6:
+ resolution: {integrity: sha512-eyAYAsQmB80jNfg4baAtLeWAQHfHFiR483rzFK+BhETlGZaQC9bsfrugfXDCbRHLQbIA7U5NxhhOxN7p/dWIcg==}
+ engines: {node: '>=6.9.0'}
+ dependencies:
+ '@babel/types': 7.19.4
+ dev: true
+
+ /@babel/helper-function-name/7.19.0:
+ resolution: {integrity: sha512-WAwHBINyrpqywkUH0nTnNgI5ina5TFn85HKS0pbPDfxFfhyR/aNQEn4hGi1P1JyT//I0t4OgXUlofzWILRvS5w==}
+ engines: {node: '>=6.9.0'}
+ dependencies:
+ '@babel/template': 7.18.10
+ '@babel/types': 7.19.4
+
+ /@babel/helper-hoist-variables/7.18.6:
+ resolution: {integrity: sha512-UlJQPkFqFULIcyW5sbzgbkxn2FKRgwWiRexcuaR8RNJRy8+LLveqPjwZV/bwrLZCN0eUHD/x8D0heK1ozuoo6Q==}
+ engines: {node: '>=6.9.0'}
+ dependencies:
+ '@babel/types': 7.19.4
+
+ /@babel/helper-member-expression-to-functions/7.18.9:
+ resolution: {integrity: sha512-RxifAh2ZoVU67PyKIO4AMi1wTenGfMR/O/ae0CCRqwgBAt5v7xjdtRw7UoSbsreKrQn5t7r89eruK/9JjYHuDg==}
+ engines: {node: '>=6.9.0'}
+ dependencies:
+ '@babel/types': 7.19.4
+ dev: true
+
+ /@babel/helper-module-imports/7.18.6:
+ resolution: {integrity: sha512-0NFvs3VkuSYbFi1x2Vd6tKrywq+z/cLeYC/RJNFrIX/30Bf5aiGYbtvGXolEktzJH8o5E5KJ3tT+nkxuuZFVlA==}
+ engines: {node: '>=6.9.0'}
+ dependencies:
+ '@babel/types': 7.19.4
+
+ /@babel/helper-module-transforms/7.19.0:
+ resolution: {integrity: sha512-3HBZ377Fe14RbLIA+ac3sY4PTgpxHVkFrESaWhoI5PuyXPBBX8+C34qblV9G89ZtycGJCmCI/Ut+VUDK4bltNQ==}
+ engines: {node: '>=6.9.0'}
+ dependencies:
+ '@babel/helper-environment-visitor': 7.18.9
+ '@babel/helper-module-imports': 7.18.6
+ '@babel/helper-simple-access': 7.19.4
+ '@babel/helper-split-export-declaration': 7.18.6
+ '@babel/helper-validator-identifier': 7.19.1
+ '@babel/template': 7.18.10
+ '@babel/traverse': 7.19.4
+ '@babel/types': 7.19.4
+ transitivePeerDependencies:
+ - supports-color
+
+ /@babel/helper-optimise-call-expression/7.18.6:
+ resolution: {integrity: sha512-HP59oD9/fEHQkdcbgFCnbmgH5vIQTJbxh2yf+CdM89/glUNnuzr87Q8GIjGEnOktTROemO0Pe0iPAYbqZuOUiA==}
+ engines: {node: '>=6.9.0'}
+ dependencies:
+ '@babel/types': 7.19.4
+ dev: true
+
+ /@babel/helper-plugin-utils/7.19.0:
+ resolution: {integrity: sha512-40Ryx7I8mT+0gaNxm8JGTZFUITNqdLAgdg0hXzeVZxVD6nFsdhQvip6v8dqkRHzsz1VFpFAaOCHNn0vKBL7Czw==}
+ engines: {node: '>=6.9.0'}
+
+ /@babel/helper-remap-async-to-generator/7.18.9_@babel+core@7.19.3:
+ resolution: {integrity: sha512-dI7q50YKd8BAv3VEfgg7PS7yD3Rtbi2J1XMXaalXO0W0164hYLnh8zpjRS0mte9MfVp/tltvr/cfdXPvJr1opA==}
+ engines: {node: '>=6.9.0'}
+ peerDependencies:
+ '@babel/core': ^7.0.0
+ dependencies:
+ '@babel/core': 7.19.3
+ '@babel/helper-annotate-as-pure': 7.18.6
+ '@babel/helper-environment-visitor': 7.18.9
+ '@babel/helper-wrap-function': 7.19.0
+ '@babel/types': 7.19.4
+ transitivePeerDependencies:
+ - supports-color
+ dev: true
+
+ /@babel/helper-replace-supers/7.19.1:
+ resolution: {integrity: sha512-T7ahH7wV0Hfs46SFh5Jz3s0B6+o8g3c+7TMxu7xKfmHikg7EAZ3I2Qk9LFhjxXq8sL7UkP5JflezNwoZa8WvWw==}
+ engines: {node: '>=6.9.0'}
+ dependencies:
+ '@babel/helper-environment-visitor': 7.18.9
+ '@babel/helper-member-expression-to-functions': 7.18.9
+ '@babel/helper-optimise-call-expression': 7.18.6
+ '@babel/traverse': 7.19.4
+ '@babel/types': 7.19.4
+ transitivePeerDependencies:
+ - supports-color
+ dev: true
+
+ /@babel/helper-simple-access/7.19.4:
+ resolution: {integrity: sha512-f9Xq6WqBFqaDfbCzn2w85hwklswz5qsKlh7f08w4Y9yhJHpnNC0QemtSkK5YyOY8kPGvyiwdzZksGUhnGdaUIg==}
+ engines: {node: '>=6.9.0'}
+ dependencies:
+ '@babel/types': 7.19.4
+
+ /@babel/helper-skip-transparent-expression-wrappers/7.18.9:
+ resolution: {integrity: sha512-imytd2gHi3cJPsybLRbmFrF7u5BIEuI2cNheyKi3/iOBC63kNn3q8Crn2xVuESli0aM4KYsyEqKyS7lFL8YVtw==}
+ engines: {node: '>=6.9.0'}
+ dependencies:
+ '@babel/types': 7.19.4
+ dev: true
+
+ /@babel/helper-split-export-declaration/7.18.6:
+ resolution: {integrity: sha512-bde1etTx6ZyTmobl9LLMMQsaizFVZrquTEHOqKeQESMKo4PlObf+8+JA25ZsIpZhT/WEd39+vOdLXAFG/nELpA==}
+ engines: {node: '>=6.9.0'}
+ dependencies:
+ '@babel/types': 7.19.4
+
+ /@babel/helper-string-parser/7.19.4:
+ resolution: {integrity: sha512-nHtDoQcuqFmwYNYPz3Rah5ph2p8PFeFCsZk9A/48dPc/rGocJ5J3hAAZ7pb76VWX3fZKu+uEr/FhH5jLx7umrw==}
+ engines: {node: '>=6.9.0'}
+
+ /@babel/helper-validator-identifier/7.19.1:
+ resolution: {integrity: sha512-awrNfaMtnHUr653GgGEs++LlAvW6w+DcPrOliSMXWCKo597CwL5Acf/wWdNkf/tfEQE3mjkeD1YOVZOUV/od1w==}
+ engines: {node: '>=6.9.0'}
+
+ /@babel/helper-validator-option/7.18.6:
+ resolution: {integrity: sha512-XO7gESt5ouv/LRJdrVjkShckw6STTaB7l9BrpBaAHDeF5YZT+01PCwmR0SJHnkW6i8OwW/EVWRShfi4j2x+KQw==}
+ engines: {node: '>=6.9.0'}
+
+ /@babel/helper-wrap-function/7.19.0:
+ resolution: {integrity: sha512-txX8aN8CZyYGTwcLhlk87KRqncAzhh5TpQamZUa0/u3an36NtDpUP6bQgBCBcLeBs09R/OwQu3OjK0k/HwfNDg==}
+ engines: {node: '>=6.9.0'}
+ dependencies:
+ '@babel/helper-function-name': 7.19.0
+ '@babel/template': 7.18.10
+ '@babel/traverse': 7.19.4
+ '@babel/types': 7.19.4
+ transitivePeerDependencies:
+ - supports-color
+ dev: true
+
+ /@babel/helpers/7.19.4:
+ resolution: {integrity: sha512-G+z3aOx2nfDHwX/kyVii5fJq+bgscg89/dJNWpYeKeBv3v9xX8EIabmx1k6u9LS04H7nROFVRVK+e3k0VHp+sw==}
+ engines: {node: '>=6.9.0'}
+ dependencies:
+ '@babel/template': 7.18.10
+ '@babel/traverse': 7.19.4
+ '@babel/types': 7.19.4
+ transitivePeerDependencies:
+ - supports-color
+
+ /@babel/highlight/7.18.6:
+ resolution: {integrity: sha512-u7stbOuYjaPezCuLj29hNW1v64M2Md2qupEKP1fHc7WdOA3DgLh37suiSrZYY7haUB7iBeQZ9P1uiRF359do3g==}
+ engines: {node: '>=6.9.0'}
+ dependencies:
+ '@babel/helper-validator-identifier': 7.19.1
+ chalk: 2.4.2
+ js-tokens: 4.0.0
+
+ /@babel/parser/7.19.4:
+ resolution: {integrity: sha512-qpVT7gtuOLjWeDTKLkJ6sryqLliBaFpAtGeqw5cs5giLldvh+Ch0plqnUMKoVAUS6ZEueQQiZV+p5pxtPitEsA==}
+ engines: {node: '>=6.0.0'}
+ hasBin: true
+ dependencies:
+ '@babel/types': 7.19.4
+
+ /@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression/7.18.6_@babel+core@7.19.3:
+ resolution: {integrity: sha512-Dgxsyg54Fx1d4Nge8UnvTrED63vrwOdPmyvPzlNN/boaliRP54pm3pGzZD1SJUwrBA+Cs/xdG8kXX6Mn/RfISQ==}
+ engines: {node: '>=6.9.0'}
+ peerDependencies:
+ '@babel/core': ^7.0.0
+ dependencies:
+ '@babel/core': 7.19.3
+ '@babel/helper-plugin-utils': 7.19.0
+ dev: true
+
+ /@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining/7.18.9_@babel+core@7.19.3:
+ resolution: {integrity: sha512-AHrP9jadvH7qlOj6PINbgSuphjQUAK7AOT7DPjBo9EHoLhQTnnK5u45e1Hd4DbSQEO9nqPWtQ89r+XEOWFScKg==}
+ engines: {node: '>=6.9.0'}
+ peerDependencies:
+ '@babel/core': ^7.13.0
+ dependencies:
+ '@babel/core': 7.19.3
+ '@babel/helper-plugin-utils': 7.19.0
+ '@babel/helper-skip-transparent-expression-wrappers': 7.18.9
+ '@babel/plugin-proposal-optional-chaining': 7.18.9_@babel+core@7.19.3
+ dev: true
+
+ /@babel/plugin-proposal-async-generator-functions/7.19.1_@babel+core@7.19.3:
+ resolution: {integrity: sha512-0yu8vNATgLy4ivqMNBIwb1HebCelqN7YX8SL3FDXORv/RqT0zEEWUCH4GH44JsSrvCu6GqnAdR5EBFAPeNBB4Q==}
+ engines: {node: '>=6.9.0'}
+ peerDependencies:
+ '@babel/core': ^7.0.0-0
+ dependencies:
+ '@babel/core': 7.19.3
+ '@babel/helper-environment-visitor': 7.18.9
+ '@babel/helper-plugin-utils': 7.19.0
+ '@babel/helper-remap-async-to-generator': 7.18.9_@babel+core@7.19.3
+ '@babel/plugin-syntax-async-generators': 7.8.4_@babel+core@7.19.3
+ transitivePeerDependencies:
+ - supports-color
+ dev: true
+
+ /@babel/plugin-proposal-class-properties/7.18.6_@babel+core@7.19.3:
+ resolution: {integrity: sha512-cumfXOF0+nzZrrN8Rf0t7M+tF6sZc7vhQwYQck9q1/5w2OExlD+b4v4RpMJFaV1Z7WcDRgO6FqvxqxGlwo+RHQ==}
+ engines: {node: '>=6.9.0'}
+ peerDependencies:
+ '@babel/core': ^7.0.0-0
+ dependencies:
+ '@babel/core': 7.19.3
+ '@babel/helper-create-class-features-plugin': 7.19.0_@babel+core@7.19.3
+ '@babel/helper-plugin-utils': 7.19.0
+ transitivePeerDependencies:
+ - supports-color
+ dev: true
+
+ /@babel/plugin-proposal-class-static-block/7.18.6_@babel+core@7.19.3:
+ resolution: {integrity: sha512-+I3oIiNxrCpup3Gi8n5IGMwj0gOCAjcJUSQEcotNnCCPMEnixawOQ+KeJPlgfjzx+FKQ1QSyZOWe7wmoJp7vhw==}
+ engines: {node: '>=6.9.0'}
+ peerDependencies:
+ '@babel/core': ^7.12.0
+ dependencies:
+ '@babel/core': 7.19.3
+ '@babel/helper-create-class-features-plugin': 7.19.0_@babel+core@7.19.3
+ '@babel/helper-plugin-utils': 7.19.0
+ '@babel/plugin-syntax-class-static-block': 7.14.5_@babel+core@7.19.3
+ transitivePeerDependencies:
+ - supports-color
+ dev: true
+
+ /@babel/plugin-proposal-dynamic-import/7.18.6_@babel+core@7.19.3:
+ resolution: {integrity: sha512-1auuwmK+Rz13SJj36R+jqFPMJWyKEDd7lLSdOj4oJK0UTgGueSAtkrCvz9ewmgyU/P941Rv2fQwZJN8s6QruXw==}
+ engines: {node: '>=6.9.0'}
+ peerDependencies:
+ '@babel/core': ^7.0.0-0
+ dependencies:
+ '@babel/core': 7.19.3
+ '@babel/helper-plugin-utils': 7.19.0
+ '@babel/plugin-syntax-dynamic-import': 7.8.3_@babel+core@7.19.3
+ dev: true
+
+ /@babel/plugin-proposal-export-namespace-from/7.18.9_@babel+core@7.19.3:
+ resolution: {integrity: sha512-k1NtHyOMvlDDFeb9G5PhUXuGj8m/wiwojgQVEhJ/fsVsMCpLyOP4h0uGEjYJKrRI+EVPlb5Jk+Gt9P97lOGwtA==}
+ engines: {node: '>=6.9.0'}
+ peerDependencies:
+ '@babel/core': ^7.0.0-0
+ dependencies:
+ '@babel/core': 7.19.3
+ '@babel/helper-plugin-utils': 7.19.0
+ '@babel/plugin-syntax-export-namespace-from': 7.8.3_@babel+core@7.19.3
+ dev: true
+
+ /@babel/plugin-proposal-json-strings/7.18.6_@babel+core@7.19.3:
+ resolution: {integrity: sha512-lr1peyn9kOdbYc0xr0OdHTZ5FMqS6Di+H0Fz2I/JwMzGmzJETNeOFq2pBySw6X/KFL5EWDjlJuMsUGRFb8fQgQ==}
+ engines: {node: '>=6.9.0'}
+ peerDependencies:
+ '@babel/core': ^7.0.0-0
+ dependencies:
+ '@babel/core': 7.19.3
+ '@babel/helper-plugin-utils': 7.19.0
+ '@babel/plugin-syntax-json-strings': 7.8.3_@babel+core@7.19.3
+ dev: true
+
+ /@babel/plugin-proposal-logical-assignment-operators/7.18.9_@babel+core@7.19.3:
+ resolution: {integrity: sha512-128YbMpjCrP35IOExw2Fq+x55LMP42DzhOhX2aNNIdI9avSWl2PI0yuBWarr3RYpZBSPtabfadkH2yeRiMD61Q==}
+ engines: {node: '>=6.9.0'}
+ peerDependencies:
+ '@babel/core': ^7.0.0-0
+ dependencies:
+ '@babel/core': 7.19.3
+ '@babel/helper-plugin-utils': 7.19.0
+ '@babel/plugin-syntax-logical-assignment-operators': 7.10.4_@babel+core@7.19.3
+ dev: true
+
+ /@babel/plugin-proposal-nullish-coalescing-operator/7.18.6_@babel+core@7.19.3:
+ resolution: {integrity: sha512-wQxQzxYeJqHcfppzBDnm1yAY0jSRkUXR2z8RePZYrKwMKgMlE8+Z6LUno+bd6LvbGh8Gltvy74+9pIYkr+XkKA==}
+ engines: {node: '>=6.9.0'}
+ peerDependencies:
+ '@babel/core': ^7.0.0-0
+ dependencies:
+ '@babel/core': 7.19.3
+ '@babel/helper-plugin-utils': 7.19.0
+ '@babel/plugin-syntax-nullish-coalescing-operator': 7.8.3_@babel+core@7.19.3
+ dev: true
+
+ /@babel/plugin-proposal-numeric-separator/7.18.6_@babel+core@7.19.3:
+ resolution: {integrity: sha512-ozlZFogPqoLm8WBr5Z8UckIoE4YQ5KESVcNudyXOR8uqIkliTEgJ3RoketfG6pmzLdeZF0H/wjE9/cCEitBl7Q==}
+ engines: {node: '>=6.9.0'}
+ peerDependencies:
+ '@babel/core': ^7.0.0-0
+ dependencies:
+ '@babel/core': 7.19.3
+ '@babel/helper-plugin-utils': 7.19.0
+ '@babel/plugin-syntax-numeric-separator': 7.10.4_@babel+core@7.19.3
+ dev: true
+
+ /@babel/plugin-proposal-object-rest-spread/7.19.4_@babel+core@7.19.3:
+ resolution: {integrity: sha512-wHmj6LDxVDnL+3WhXteUBaoM1aVILZODAUjg11kHqG4cOlfgMQGxw6aCgvrXrmaJR3Bn14oZhImyCPZzRpC93Q==}
+ engines: {node: '>=6.9.0'}
+ peerDependencies:
+ '@babel/core': ^7.0.0-0
+ dependencies:
+ '@babel/compat-data': 7.19.4
+ '@babel/core': 7.19.3
+ '@babel/helper-compilation-targets': 7.19.3_@babel+core@7.19.3
+ '@babel/helper-plugin-utils': 7.19.0
+ '@babel/plugin-syntax-object-rest-spread': 7.8.3_@babel+core@7.19.3
+ '@babel/plugin-transform-parameters': 7.18.8_@babel+core@7.19.3
+ dev: true
+
+ /@babel/plugin-proposal-optional-catch-binding/7.18.6_@babel+core@7.19.3:
+ resolution: {integrity: sha512-Q40HEhs9DJQyaZfUjjn6vE8Cv4GmMHCYuMGIWUnlxH6400VGxOuwWsPt4FxXxJkC/5eOzgn0z21M9gMT4MOhbw==}
+ engines: {node: '>=6.9.0'}
+ peerDependencies:
+ '@babel/core': ^7.0.0-0
+ dependencies:
+ '@babel/core': 7.19.3
+ '@babel/helper-plugin-utils': 7.19.0
+ '@babel/plugin-syntax-optional-catch-binding': 7.8.3_@babel+core@7.19.3
+ dev: true
+
+ /@babel/plugin-proposal-optional-chaining/7.18.9_@babel+core@7.19.3:
+ resolution: {integrity: sha512-v5nwt4IqBXihxGsW2QmCWMDS3B3bzGIk/EQVZz2ei7f3NJl8NzAJVvUmpDW5q1CRNY+Beb/k58UAH1Km1N411w==}
+ engines: {node: '>=6.9.0'}
+ peerDependencies:
+ '@babel/core': ^7.0.0-0
+ dependencies:
+ '@babel/core': 7.19.3
+ '@babel/helper-plugin-utils': 7.19.0
+ '@babel/helper-skip-transparent-expression-wrappers': 7.18.9
+ '@babel/plugin-syntax-optional-chaining': 7.8.3_@babel+core@7.19.3
+ dev: true
+
+ /@babel/plugin-proposal-private-methods/7.18.6_@babel+core@7.19.3:
+ resolution: {integrity: sha512-nutsvktDItsNn4rpGItSNV2sz1XwS+nfU0Rg8aCx3W3NOKVzdMjJRu0O5OkgDp3ZGICSTbgRpxZoWsxoKRvbeA==}
+ engines: {node: '>=6.9.0'}
+ peerDependencies:
+ '@babel/core': ^7.0.0-0
+ dependencies:
+ '@babel/core': 7.19.3
+ '@babel/helper-create-class-features-plugin': 7.19.0_@babel+core@7.19.3
+ '@babel/helper-plugin-utils': 7.19.0
+ transitivePeerDependencies:
+ - supports-color
+ dev: true
+
+ /@babel/plugin-proposal-private-property-in-object/7.18.6_@babel+core@7.19.3:
+ resolution: {integrity: sha512-9Rysx7FOctvT5ouj5JODjAFAkgGoudQuLPamZb0v1TGLpapdNaftzifU8NTWQm0IRjqoYypdrSmyWgkocDQ8Dw==}
+ engines: {node: '>=6.9.0'}
+ peerDependencies:
+ '@babel/core': ^7.0.0-0
+ dependencies:
+ '@babel/core': 7.19.3
+ '@babel/helper-annotate-as-pure': 7.18.6
+ '@babel/helper-create-class-features-plugin': 7.19.0_@babel+core@7.19.3
+ '@babel/helper-plugin-utils': 7.19.0
+ '@babel/plugin-syntax-private-property-in-object': 7.14.5_@babel+core@7.19.3
+ transitivePeerDependencies:
+ - supports-color
+ dev: true
+
+ /@babel/plugin-proposal-unicode-property-regex/7.18.6_@babel+core@7.19.3:
+ resolution: {integrity: sha512-2BShG/d5yoZyXZfVePH91urL5wTG6ASZU9M4o03lKK8u8UW1y08OMttBSOADTcJrnPMpvDXRG3G8fyLh4ovs8w==}
+ engines: {node: '>=4'}
+ peerDependencies:
+ '@babel/core': ^7.0.0-0
+ dependencies:
+ '@babel/core': 7.19.3
+ '@babel/helper-create-regexp-features-plugin': 7.19.0_@babel+core@7.19.3
+ '@babel/helper-plugin-utils': 7.19.0
+ dev: true
+
+ /@babel/plugin-syntax-async-generators/7.8.4_@babel+core@7.19.3:
+ resolution: {integrity: sha512-tycmZxkGfZaxhMRbXlPXuVFpdWlXpir2W4AMhSJgRKzk/eDlIXOhb2LHWoLpDF7TEHylV5zNhykX6KAgHJmTNw==}
+ peerDependencies:
+ '@babel/core': ^7.0.0-0
+ dependencies:
+ '@babel/core': 7.19.3
+ '@babel/helper-plugin-utils': 7.19.0
+ dev: true
+
+ /@babel/plugin-syntax-bigint/7.8.3_@babel+core@7.19.3:
+ resolution: {integrity: sha512-wnTnFlG+YxQm3vDxpGE57Pj0srRU4sHE/mDkt1qv2YJJSeUAec2ma4WLUnUPeKjyrfntVwe/N6dCXpU+zL3Npg==}
+ peerDependencies:
+ '@babel/core': ^7.0.0-0
+ dependencies:
+ '@babel/core': 7.19.3
+ '@babel/helper-plugin-utils': 7.19.0
+ dev: true
+
+ /@babel/plugin-syntax-class-properties/7.12.13_@babel+core@7.19.3:
+ resolution: {integrity: sha512-fm4idjKla0YahUNgFNLCB0qySdsoPiZP3iQE3rky0mBUtMZ23yDJ9SJdg6dXTSDnulOVqiF3Hgr9nbXvXTQZYA==}
+ peerDependencies:
+ '@babel/core': ^7.0.0-0
+ dependencies:
+ '@babel/core': 7.19.3
+ '@babel/helper-plugin-utils': 7.19.0
+ dev: true
+
+ /@babel/plugin-syntax-class-static-block/7.14.5_@babel+core@7.19.3:
+ resolution: {integrity: sha512-b+YyPmr6ldyNnM6sqYeMWE+bgJcJpO6yS4QD7ymxgH34GBPNDM/THBh8iunyvKIZztiwLH4CJZ0RxTk9emgpjw==}
+ engines: {node: '>=6.9.0'}
+ peerDependencies:
+ '@babel/core': ^7.0.0-0
+ dependencies:
+ '@babel/core': 7.19.3
+ '@babel/helper-plugin-utils': 7.19.0
+ dev: true
+
+ /@babel/plugin-syntax-dynamic-import/7.8.3_@babel+core@7.19.3:
+ resolution: {integrity: sha512-5gdGbFon+PszYzqs83S3E5mpi7/y/8M9eC90MRTZfduQOYW76ig6SOSPNe41IG5LoP3FGBn2N0RjVDSQiS94kQ==}
+ peerDependencies:
+ '@babel/core': ^7.0.0-0
+ dependencies:
+ '@babel/core': 7.19.3
+ '@babel/helper-plugin-utils': 7.19.0
+ dev: true
+
+ /@babel/plugin-syntax-export-namespace-from/7.8.3_@babel+core@7.19.3:
+ resolution: {integrity: sha512-MXf5laXo6c1IbEbegDmzGPwGNTsHZmEy6QGznu5Sh2UCWvueywb2ee+CCE4zQiZstxU9BMoQO9i6zUFSY0Kj0Q==}
+ peerDependencies:
+ '@babel/core': ^7.0.0-0
+ dependencies:
+ '@babel/core': 7.19.3
+ '@babel/helper-plugin-utils': 7.19.0
+ dev: true
+
+ /@babel/plugin-syntax-import-assertions/7.18.6_@babel+core@7.19.3:
+ resolution: {integrity: sha512-/DU3RXad9+bZwrgWJQKbr39gYbJpLJHezqEzRzi/BHRlJ9zsQb4CK2CA/5apllXNomwA1qHwzvHl+AdEmC5krQ==}
+ engines: {node: '>=6.9.0'}
+ peerDependencies:
+ '@babel/core': ^7.0.0-0
+ dependencies:
+ '@babel/core': 7.19.3
+ '@babel/helper-plugin-utils': 7.19.0
+ dev: true
+
+ /@babel/plugin-syntax-import-meta/7.10.4_@babel+core@7.19.3:
+ resolution: {integrity: sha512-Yqfm+XDx0+Prh3VSeEQCPU81yC+JWZ2pDPFSS4ZdpfZhp4MkFMaDC1UqseovEKwSUpnIL7+vK+Clp7bfh0iD7g==}
+ peerDependencies:
+ '@babel/core': ^7.0.0-0
+ dependencies:
+ '@babel/core': 7.19.3
+ '@babel/helper-plugin-utils': 7.19.0
+ dev: true
+
+ /@babel/plugin-syntax-json-strings/7.8.3_@babel+core@7.19.3:
+ resolution: {integrity: sha512-lY6kdGpWHvjoe2vk4WrAapEuBR69EMxZl+RoGRhrFGNYVK8mOPAW8VfbT/ZgrFbXlDNiiaxQnAtgVCZ6jv30EA==}
+ peerDependencies:
+ '@babel/core': ^7.0.0-0
+ dependencies:
+ '@babel/core': 7.19.3
+ '@babel/helper-plugin-utils': 7.19.0
+ dev: true
+
+ /@babel/plugin-syntax-jsx/7.18.6_@babel+core@7.19.3:
+ resolution: {integrity: sha512-6mmljtAedFGTWu2p/8WIORGwy+61PLgOMPOdazc7YoJ9ZCWUyFy3A6CpPkRKLKD1ToAesxX8KGEViAiLo9N+7Q==}
+ engines: {node: '>=6.9.0'}
+ peerDependencies:
+ '@babel/core': ^7.0.0-0
+ dependencies:
+ '@babel/core': 7.19.3
+ '@babel/helper-plugin-utils': 7.19.0
+
+ /@babel/plugin-syntax-logical-assignment-operators/7.10.4_@babel+core@7.19.3:
+ resolution: {integrity: sha512-d8waShlpFDinQ5MtvGU9xDAOzKH47+FFoney2baFIoMr952hKOLp1HR7VszoZvOsV/4+RRszNY7D17ba0te0ig==}
+ peerDependencies:
+ '@babel/core': ^7.0.0-0
+ dependencies:
+ '@babel/core': 7.19.3
+ '@babel/helper-plugin-utils': 7.19.0
+ dev: true
+
+ /@babel/plugin-syntax-nullish-coalescing-operator/7.8.3_@babel+core@7.19.3:
+ resolution: {integrity: sha512-aSff4zPII1u2QD7y+F8oDsz19ew4IGEJg9SVW+bqwpwtfFleiQDMdzA/R+UlWDzfnHFCxxleFT0PMIrR36XLNQ==}
+ peerDependencies:
+ '@babel/core': ^7.0.0-0
+ dependencies:
+ '@babel/core': 7.19.3
+ '@babel/helper-plugin-utils': 7.19.0
+ dev: true
+
+ /@babel/plugin-syntax-numeric-separator/7.10.4_@babel+core@7.19.3:
+ resolution: {integrity: sha512-9H6YdfkcK/uOnY/K7/aA2xpzaAgkQn37yzWUMRK7OaPOqOpGS1+n0H5hxT9AUw9EsSjPW8SVyMJwYRtWs3X3ug==}
+ peerDependencies:
+ '@babel/core': ^7.0.0-0
+ dependencies:
+ '@babel/core': 7.19.3
+ '@babel/helper-plugin-utils': 7.19.0
+ dev: true
+
+ /@babel/plugin-syntax-object-rest-spread/7.8.3_@babel+core@7.19.3:
+ resolution: {integrity: sha512-XoqMijGZb9y3y2XskN+P1wUGiVwWZ5JmoDRwx5+3GmEplNyVM2s2Dg8ILFQm8rWM48orGy5YpI5Bl8U1y7ydlA==}
+ peerDependencies:
+ '@babel/core': ^7.0.0-0
+ dependencies:
+ '@babel/core': 7.19.3
+ '@babel/helper-plugin-utils': 7.19.0
+ dev: true
+
+ /@babel/plugin-syntax-optional-catch-binding/7.8.3_@babel+core@7.19.3:
+ resolution: {integrity: sha512-6VPD0Pc1lpTqw0aKoeRTMiB+kWhAoT24PA+ksWSBrFtl5SIRVpZlwN3NNPQjehA2E/91FV3RjLWoVTglWcSV3Q==}
+ peerDependencies:
+ '@babel/core': ^7.0.0-0
+ dependencies:
+ '@babel/core': 7.19.3
+ '@babel/helper-plugin-utils': 7.19.0
+ dev: true
+
+ /@babel/plugin-syntax-optional-chaining/7.8.3_@babel+core@7.19.3:
+ resolution: {integrity: sha512-KoK9ErH1MBlCPxV0VANkXW2/dw4vlbGDrFgz8bmUsBGYkFRcbRwMh6cIJubdPrkxRwuGdtCk0v/wPTKbQgBjkg==}
+ peerDependencies:
+ '@babel/core': ^7.0.0-0
+ dependencies:
+ '@babel/core': 7.19.3
+ '@babel/helper-plugin-utils': 7.19.0
+ dev: true
+
+ /@babel/plugin-syntax-private-property-in-object/7.14.5_@babel+core@7.19.3:
+ resolution: {integrity: sha512-0wVnp9dxJ72ZUJDV27ZfbSj6iHLoytYZmh3rFcxNnvsJF3ktkzLDZPy/mA17HGsaQT3/DQsWYX1f1QGWkCoVUg==}
+ engines: {node: '>=6.9.0'}
+ peerDependencies:
+ '@babel/core': ^7.0.0-0
+ dependencies:
+ '@babel/core': 7.19.3
+ '@babel/helper-plugin-utils': 7.19.0
+ dev: true
+
+ /@babel/plugin-syntax-top-level-await/7.14.5_@babel+core@7.19.3:
+ resolution: {integrity: sha512-hx++upLv5U1rgYfwe1xBQUhRmU41NEvpUvrp8jkrSCdvGSnM5/qdRMtylJ6PG5OFkBaHkbTAKTnd3/YyESRHFw==}
+ engines: {node: '>=6.9.0'}
+ peerDependencies:
+ '@babel/core': ^7.0.0-0
+ dependencies:
+ '@babel/core': 7.19.3
+ '@babel/helper-plugin-utils': 7.19.0
+ dev: true
+
+ /@babel/plugin-syntax-typescript/7.18.6_@babel+core@7.19.3:
+ resolution: {integrity: sha512-mAWAuq4rvOepWCBid55JuRNvpTNf2UGVgoz4JV0fXEKolsVZDzsa4NqCef758WZJj/GDu0gVGItjKFiClTAmZA==}
+ engines: {node: '>=6.9.0'}
+ peerDependencies:
+ '@babel/core': ^7.0.0-0
+ dependencies:
+ '@babel/core': 7.19.3
+ '@babel/helper-plugin-utils': 7.19.0
+ dev: true
+
+ /@babel/plugin-transform-arrow-functions/7.18.6_@babel+core@7.19.3:
+ resolution: {integrity: sha512-9S9X9RUefzrsHZmKMbDXxweEH+YlE8JJEuat9FdvW9Qh1cw7W64jELCtWNkPBPX5En45uy28KGvA/AySqUh8CQ==}
+ engines: {node: '>=6.9.0'}
+ peerDependencies:
+ '@babel/core': ^7.0.0-0
+ dependencies:
+ '@babel/core': 7.19.3
+ '@babel/helper-plugin-utils': 7.19.0
+ dev: true
+
+ /@babel/plugin-transform-async-to-generator/7.18.6_@babel+core@7.19.3:
+ resolution: {integrity: sha512-ARE5wZLKnTgPW7/1ftQmSi1CmkqqHo2DNmtztFhvgtOWSDfq0Cq9/9L+KnZNYSNrydBekhW3rwShduf59RoXag==}
+ engines: {node: '>=6.9.0'}
+ peerDependencies:
+ '@babel/core': ^7.0.0-0
+ dependencies:
+ '@babel/core': 7.19.3
+ '@babel/helper-module-imports': 7.18.6
+ '@babel/helper-plugin-utils': 7.19.0
+ '@babel/helper-remap-async-to-generator': 7.18.9_@babel+core@7.19.3
+ transitivePeerDependencies:
+ - supports-color
+ dev: true
+
+ /@babel/plugin-transform-block-scoped-functions/7.18.6_@babel+core@7.19.3:
+ resolution: {integrity: sha512-ExUcOqpPWnliRcPqves5HJcJOvHvIIWfuS4sroBUenPuMdmW+SMHDakmtS7qOo13sVppmUijqeTv7qqGsvURpQ==}
+ engines: {node: '>=6.9.0'}
+ peerDependencies:
+ '@babel/core': ^7.0.0-0
+ dependencies:
+ '@babel/core': 7.19.3
+ '@babel/helper-plugin-utils': 7.19.0
+ dev: true
+
+ /@babel/plugin-transform-block-scoping/7.19.4_@babel+core@7.19.3:
+ resolution: {integrity: sha512-934S2VLLlt2hRJwPf4MczaOr4hYF0z+VKPwqTNxyKX7NthTiPfhuKFWQZHXRM0vh/wo/VyXB3s4bZUNA08l+tQ==}
+ engines: {node: '>=6.9.0'}
+ peerDependencies:
+ '@babel/core': ^7.0.0-0
+ dependencies:
+ '@babel/core': 7.19.3
+ '@babel/helper-plugin-utils': 7.19.0
+ dev: true
+
+ /@babel/plugin-transform-classes/7.19.0_@babel+core@7.19.3:
+ resolution: {integrity: sha512-YfeEE9kCjqTS9IitkgfJuxjcEtLUHMqa8yUJ6zdz8vR7hKuo6mOy2C05P0F1tdMmDCeuyidKnlrw/iTppHcr2A==}
+ engines: {node: '>=6.9.0'}
+ peerDependencies:
+ '@babel/core': ^7.0.0-0
+ dependencies:
+ '@babel/core': 7.19.3
+ '@babel/helper-annotate-as-pure': 7.18.6
+ '@babel/helper-compilation-targets': 7.19.3_@babel+core@7.19.3
+ '@babel/helper-environment-visitor': 7.18.9
+ '@babel/helper-function-name': 7.19.0
+ '@babel/helper-optimise-call-expression': 7.18.6
+ '@babel/helper-plugin-utils': 7.19.0
+ '@babel/helper-replace-supers': 7.19.1
+ '@babel/helper-split-export-declaration': 7.18.6
+ globals: 11.12.0
+ transitivePeerDependencies:
+ - supports-color
+ dev: true
+
+ /@babel/plugin-transform-computed-properties/7.18.9_@babel+core@7.19.3:
+ resolution: {integrity: sha512-+i0ZU1bCDymKakLxn5srGHrsAPRELC2WIbzwjLhHW9SIE1cPYkLCL0NlnXMZaM1vhfgA2+M7hySk42VBvrkBRw==}
+ engines: {node: '>=6.9.0'}
+ peerDependencies:
+ '@babel/core': ^7.0.0-0
+ dependencies:
+ '@babel/core': 7.19.3
+ '@babel/helper-plugin-utils': 7.19.0
+ dev: true
+
+ /@babel/plugin-transform-destructuring/7.19.4_@babel+core@7.19.3:
+ resolution: {integrity: sha512-t0j0Hgidqf0aM86dF8U+vXYReUgJnlv4bZLsyoPnwZNrGY+7/38o8YjaELrvHeVfTZao15kjR0PVv0nju2iduA==}
+ engines: {node: '>=6.9.0'}
+ peerDependencies:
+ '@babel/core': ^7.0.0-0
+ dependencies:
+ '@babel/core': 7.19.3
+ '@babel/helper-plugin-utils': 7.19.0
+ dev: true
+
+ /@babel/plugin-transform-dotall-regex/7.18.6_@babel+core@7.19.3:
+ resolution: {integrity: sha512-6S3jpun1eEbAxq7TdjLotAsl4WpQI9DxfkycRcKrjhQYzU87qpXdknpBg/e+TdcMehqGnLFi7tnFUBR02Vq6wg==}
+ engines: {node: '>=6.9.0'}
+ peerDependencies:
+ '@babel/core': ^7.0.0-0
+ dependencies:
+ '@babel/core': 7.19.3
+ '@babel/helper-create-regexp-features-plugin': 7.19.0_@babel+core@7.19.3
+ '@babel/helper-plugin-utils': 7.19.0
+ dev: true
+
+ /@babel/plugin-transform-duplicate-keys/7.18.9_@babel+core@7.19.3:
+ resolution: {integrity: sha512-d2bmXCtZXYc59/0SanQKbiWINadaJXqtvIQIzd4+hNwkWBgyCd5F/2t1kXoUdvPMrxzPvhK6EMQRROxsue+mfw==}
+ engines: {node: '>=6.9.0'}
+ peerDependencies:
+ '@babel/core': ^7.0.0-0
+ dependencies:
+ '@babel/core': 7.19.3
+ '@babel/helper-plugin-utils': 7.19.0
+ dev: true
+
+ /@babel/plugin-transform-exponentiation-operator/7.18.6_@babel+core@7.19.3:
+ resolution: {integrity: sha512-wzEtc0+2c88FVR34aQmiz56dxEkxr2g8DQb/KfaFa1JYXOFVsbhvAonFN6PwVWj++fKmku8NP80plJ5Et4wqHw==}
+ engines: {node: '>=6.9.0'}
+ peerDependencies:
+ '@babel/core': ^7.0.0-0
+ dependencies:
+ '@babel/core': 7.19.3
+ '@babel/helper-builder-binary-assignment-operator-visitor': 7.18.9
+ '@babel/helper-plugin-utils': 7.19.0
+ dev: true
+
+ /@babel/plugin-transform-for-of/7.18.8_@babel+core@7.19.3:
+ resolution: {integrity: sha512-yEfTRnjuskWYo0k1mHUqrVWaZwrdq8AYbfrpqULOJOaucGSp4mNMVps+YtA8byoevxS/urwU75vyhQIxcCgiBQ==}
+ engines: {node: '>=6.9.0'}
+ peerDependencies:
+ '@babel/core': ^7.0.0-0
+ dependencies:
+ '@babel/core': 7.19.3
+ '@babel/helper-plugin-utils': 7.19.0
+ dev: true
+
+ /@babel/plugin-transform-function-name/7.18.9_@babel+core@7.19.3:
+ resolution: {integrity: sha512-WvIBoRPaJQ5yVHzcnJFor7oS5Ls0PYixlTYE63lCj2RtdQEl15M68FXQlxnG6wdraJIXRdR7KI+hQ7q/9QjrCQ==}
+ engines: {node: '>=6.9.0'}
+ peerDependencies:
+ '@babel/core': ^7.0.0-0
+ dependencies:
+ '@babel/core': 7.19.3
+ '@babel/helper-compilation-targets': 7.19.3_@babel+core@7.19.3
+ '@babel/helper-function-name': 7.19.0
+ '@babel/helper-plugin-utils': 7.19.0
+ dev: true
+
+ /@babel/plugin-transform-literals/7.18.9_@babel+core@7.19.3:
+ resolution: {integrity: sha512-IFQDSRoTPnrAIrI5zoZv73IFeZu2dhu6irxQjY9rNjTT53VmKg9fenjvoiOWOkJ6mm4jKVPtdMzBY98Fp4Z4cg==}
+ engines: {node: '>=6.9.0'}
+ peerDependencies:
+ '@babel/core': ^7.0.0-0
+ dependencies:
+ '@babel/core': 7.19.3
+ '@babel/helper-plugin-utils': 7.19.0
+ dev: true
+
+ /@babel/plugin-transform-member-expression-literals/7.18.6_@babel+core@7.19.3:
+ resolution: {integrity: sha512-qSF1ihLGO3q+/g48k85tUjD033C29TNTVB2paCwZPVmOsjn9pClvYYrM2VeJpBY2bcNkuny0YUyTNRyRxJ54KA==}
+ engines: {node: '>=6.9.0'}
+ peerDependencies:
+ '@babel/core': ^7.0.0-0
+ dependencies:
+ '@babel/core': 7.19.3
+ '@babel/helper-plugin-utils': 7.19.0
+ dev: true
+
+ /@babel/plugin-transform-modules-amd/7.18.6_@babel+core@7.19.3:
+ resolution: {integrity: sha512-Pra5aXsmTsOnjM3IajS8rTaLCy++nGM4v3YR4esk5PCsyg9z8NA5oQLwxzMUtDBd8F+UmVza3VxoAaWCbzH1rg==}
+ engines: {node: '>=6.9.0'}
+ peerDependencies:
+ '@babel/core': ^7.0.0-0
+ dependencies:
+ '@babel/core': 7.19.3
+ '@babel/helper-module-transforms': 7.19.0
+ '@babel/helper-plugin-utils': 7.19.0
+ babel-plugin-dynamic-import-node: 2.3.3
+ transitivePeerDependencies:
+ - supports-color
+ dev: true
+
+ /@babel/plugin-transform-modules-commonjs/7.18.6_@babel+core@7.19.3:
+ resolution: {integrity: sha512-Qfv2ZOWikpvmedXQJDSbxNqy7Xr/j2Y8/KfijM0iJyKkBTmWuvCA1yeH1yDM7NJhBW/2aXxeucLj6i80/LAJ/Q==}
+ engines: {node: '>=6.9.0'}
+ peerDependencies:
+ '@babel/core': ^7.0.0-0
+ dependencies:
+ '@babel/core': 7.19.3
+ '@babel/helper-module-transforms': 7.19.0
+ '@babel/helper-plugin-utils': 7.19.0
+ '@babel/helper-simple-access': 7.19.4
+ babel-plugin-dynamic-import-node: 2.3.3
+ transitivePeerDependencies:
+ - supports-color
+ dev: true
+
+ /@babel/plugin-transform-modules-systemjs/7.19.0_@babel+core@7.19.3:
+ resolution: {integrity: sha512-x9aiR0WXAWmOWsqcsnrzGR+ieaTMVyGyffPVA7F8cXAGt/UxefYv6uSHZLkAFChN5M5Iy1+wjE+xJuPt22H39A==}
+ engines: {node: '>=6.9.0'}
+ peerDependencies:
+ '@babel/core': ^7.0.0-0
+ dependencies:
+ '@babel/core': 7.19.3
+ '@babel/helper-hoist-variables': 7.18.6
+ '@babel/helper-module-transforms': 7.19.0
+ '@babel/helper-plugin-utils': 7.19.0
+ '@babel/helper-validator-identifier': 7.19.1
+ babel-plugin-dynamic-import-node: 2.3.3
+ transitivePeerDependencies:
+ - supports-color
+ dev: true
+
+ /@babel/plugin-transform-modules-umd/7.18.6_@babel+core@7.19.3:
+ resolution: {integrity: sha512-dcegErExVeXcRqNtkRU/z8WlBLnvD4MRnHgNs3MytRO1Mn1sHRyhbcpYbVMGclAqOjdW+9cfkdZno9dFdfKLfQ==}
+ engines: {node: '>=6.9.0'}
+ peerDependencies:
+ '@babel/core': ^7.0.0-0
+ dependencies:
+ '@babel/core': 7.19.3
+ '@babel/helper-module-transforms': 7.19.0
+ '@babel/helper-plugin-utils': 7.19.0
+ transitivePeerDependencies:
+ - supports-color
+ dev: true
+
+ /@babel/plugin-transform-named-capturing-groups-regex/7.19.1_@babel+core@7.19.3:
+ resolution: {integrity: sha512-oWk9l9WItWBQYS4FgXD4Uyy5kq898lvkXpXQxoJEY1RnvPk4R/Dvu2ebXU9q8lP+rlMwUQTFf2Ok6d78ODa0kw==}
+ engines: {node: '>=6.9.0'}
+ peerDependencies:
+ '@babel/core': ^7.0.0
+ dependencies:
+ '@babel/core': 7.19.3
+ '@babel/helper-create-regexp-features-plugin': 7.19.0_@babel+core@7.19.3
+ '@babel/helper-plugin-utils': 7.19.0
+ dev: true
+
+ /@babel/plugin-transform-new-target/7.18.6_@babel+core@7.19.3:
+ resolution: {integrity: sha512-DjwFA/9Iu3Z+vrAn+8pBUGcjhxKguSMlsFqeCKbhb9BAV756v0krzVK04CRDi/4aqmk8BsHb4a/gFcaA5joXRw==}
+ engines: {node: '>=6.9.0'}
+ peerDependencies:
+ '@babel/core': ^7.0.0-0
+ dependencies:
+ '@babel/core': 7.19.3
+ '@babel/helper-plugin-utils': 7.19.0
+ dev: true
+
+ /@babel/plugin-transform-object-super/7.18.6_@babel+core@7.19.3:
+ resolution: {integrity: sha512-uvGz6zk+pZoS1aTZrOvrbj6Pp/kK2mp45t2B+bTDre2UgsZZ8EZLSJtUg7m/no0zOJUWgFONpB7Zv9W2tSaFlA==}
+ engines: {node: '>=6.9.0'}
+ peerDependencies:
+ '@babel/core': ^7.0.0-0
+ dependencies:
+ '@babel/core': 7.19.3
+ '@babel/helper-plugin-utils': 7.19.0
+ '@babel/helper-replace-supers': 7.19.1
+ transitivePeerDependencies:
+ - supports-color
+ dev: true
+
+ /@babel/plugin-transform-parameters/7.18.8_@babel+core@7.19.3:
+ resolution: {integrity: sha512-ivfbE3X2Ss+Fj8nnXvKJS6sjRG4gzwPMsP+taZC+ZzEGjAYlvENixmt1sZ5Ca6tWls+BlKSGKPJ6OOXvXCbkFg==}
+ engines: {node: '>=6.9.0'}
+ peerDependencies:
+ '@babel/core': ^7.0.0-0
+ dependencies:
+ '@babel/core': 7.19.3
+ '@babel/helper-plugin-utils': 7.19.0
+ dev: true
+
+ /@babel/plugin-transform-property-literals/7.18.6_@babel+core@7.19.3:
+ resolution: {integrity: sha512-cYcs6qlgafTud3PAzrrRNbQtfpQ8+y/+M5tKmksS9+M1ckbH6kzY8MrexEM9mcA6JDsukE19iIRvAyYl463sMg==}
+ engines: {node: '>=6.9.0'}
+ peerDependencies:
+ '@babel/core': ^7.0.0-0
+ dependencies:
+ '@babel/core': 7.19.3
+ '@babel/helper-plugin-utils': 7.19.0
+ dev: true
+
+ /@babel/plugin-transform-react-display-name/7.18.6_@babel+core@7.19.3:
+ resolution: {integrity: sha512-TV4sQ+T013n61uMoygyMRm+xf04Bd5oqFpv2jAEQwSZ8NwQA7zeRPg1LMVg2PWi3zWBz+CLKD+v5bcpZ/BS0aA==}
+ engines: {node: '>=6.9.0'}
+ peerDependencies:
+ '@babel/core': ^7.0.0-0
+ dependencies:
+ '@babel/core': 7.19.3
+ '@babel/helper-plugin-utils': 7.19.0
+ dev: true
+
+ /@babel/plugin-transform-react-jsx-development/7.18.6_@babel+core@7.19.3:
+ resolution: {integrity: sha512-SA6HEjwYFKF7WDjWcMcMGUimmw/nhNRDWxr+KaLSCrkD/LMDBvWRmHAYgE1HDeF8KUuI8OAu+RT6EOtKxSW2qA==}
+ engines: {node: '>=6.9.0'}
+ peerDependencies:
+ '@babel/core': ^7.0.0-0
+ dependencies:
+ '@babel/core': 7.19.3
+ '@babel/plugin-transform-react-jsx': 7.19.0_@babel+core@7.19.3
+ dev: true
+
+ /@babel/plugin-transform-react-jsx-self/7.18.6_@babel+core@7.19.3:
+ resolution: {integrity: sha512-A0LQGx4+4Jv7u/tWzoJF7alZwnBDQd6cGLh9P+Ttk4dpiL+J5p7NSNv/9tlEFFJDq3kjxOavWmbm6t0Gk+A3Ig==}
+ engines: {node: '>=6.9.0'}
+ peerDependencies:
+ '@babel/core': ^7.0.0-0
+ dependencies:
+ '@babel/core': 7.19.3
+ '@babel/helper-plugin-utils': 7.19.0
+ dev: true
+
+ /@babel/plugin-transform-react-jsx-source/7.18.6_@babel+core@7.19.3:
+ resolution: {integrity: sha512-utZmlASneDfdaMh0m/WausbjUjEdGrQJz0vFK93d7wD3xf5wBtX219+q6IlCNZeguIcxS2f/CvLZrlLSvSHQXw==}
+ engines: {node: '>=6.9.0'}
+ peerDependencies:
+ '@babel/core': ^7.0.0-0
+ dependencies:
+ '@babel/core': 7.19.3
+ '@babel/helper-plugin-utils': 7.19.0
+ dev: true
+
+ /@babel/plugin-transform-react-jsx/7.19.0_@babel+core@7.19.3:
+ resolution: {integrity: sha512-UVEvX3tXie3Szm3emi1+G63jyw1w5IcMY0FSKM+CRnKRI5Mr1YbCNgsSTwoTwKphQEG9P+QqmuRFneJPZuHNhg==}
+ engines: {node: '>=6.9.0'}
+ peerDependencies:
+ '@babel/core': ^7.0.0-0
+ dependencies:
+ '@babel/core': 7.19.3
+ '@babel/helper-annotate-as-pure': 7.18.6
+ '@babel/helper-module-imports': 7.18.6
+ '@babel/helper-plugin-utils': 7.19.0
+ '@babel/plugin-syntax-jsx': 7.18.6_@babel+core@7.19.3
+ '@babel/types': 7.19.4
+ dev: true
+
+ /@babel/plugin-transform-react-pure-annotations/7.18.6_@babel+core@7.19.3:
+ resolution: {integrity: sha512-I8VfEPg9r2TRDdvnHgPepTKvuRomzA8+u+nhY7qSI1fR2hRNebasZEETLyM5mAUr0Ku56OkXJ0I7NHJnO6cJiQ==}
+ engines: {node: '>=6.9.0'}
+ peerDependencies:
+ '@babel/core': ^7.0.0-0
+ dependencies:
+ '@babel/core': 7.19.3
+ '@babel/helper-annotate-as-pure': 7.18.6
+ '@babel/helper-plugin-utils': 7.19.0
+ dev: true
+
+ /@babel/plugin-transform-regenerator/7.18.6_@babel+core@7.19.3:
+ resolution: {integrity: sha512-poqRI2+qiSdeldcz4wTSTXBRryoq3Gc70ye7m7UD5Ww0nE29IXqMl6r7Nd15WBgRd74vloEMlShtH6CKxVzfmQ==}
+ engines: {node: '>=6.9.0'}
+ peerDependencies:
+ '@babel/core': ^7.0.0-0
+ dependencies:
+ '@babel/core': 7.19.3
+ '@babel/helper-plugin-utils': 7.19.0
+ regenerator-transform: 0.15.0
+ dev: true
+
+ /@babel/plugin-transform-reserved-words/7.18.6_@babel+core@7.19.3:
+ resolution: {integrity: sha512-oX/4MyMoypzHjFrT1CdivfKZ+XvIPMFXwwxHp/r0Ddy2Vuomt4HDFGmft1TAY2yiTKiNSsh3kjBAzcM8kSdsjA==}
+ engines: {node: '>=6.9.0'}
+ peerDependencies:
+ '@babel/core': ^7.0.0-0
+ dependencies:
+ '@babel/core': 7.19.3
+ '@babel/helper-plugin-utils': 7.19.0
+ dev: true
+
+ /@babel/plugin-transform-shorthand-properties/7.18.6_@babel+core@7.19.3:
+ resolution: {integrity: sha512-eCLXXJqv8okzg86ywZJbRn19YJHU4XUa55oz2wbHhaQVn/MM+XhukiT7SYqp/7o00dg52Rj51Ny+Ecw4oyoygw==}
+ engines: {node: '>=6.9.0'}
+ peerDependencies:
+ '@babel/core': ^7.0.0-0
+ dependencies:
+ '@babel/core': 7.19.3
+ '@babel/helper-plugin-utils': 7.19.0
+ dev: true
+
+ /@babel/plugin-transform-spread/7.19.0_@babel+core@7.19.3:
+ resolution: {integrity: sha512-RsuMk7j6n+r752EtzyScnWkQyuJdli6LdO5Klv8Yx0OfPVTcQkIUfS8clx5e9yHXzlnhOZF3CbQ8C2uP5j074w==}
+ engines: {node: '>=6.9.0'}
+ peerDependencies:
+ '@babel/core': ^7.0.0-0
+ dependencies:
+ '@babel/core': 7.19.3
+ '@babel/helper-plugin-utils': 7.19.0
+ '@babel/helper-skip-transparent-expression-wrappers': 7.18.9
+ dev: true
+
+ /@babel/plugin-transform-sticky-regex/7.18.6_@babel+core@7.19.3:
+ resolution: {integrity: sha512-kfiDrDQ+PBsQDO85yj1icueWMfGfJFKN1KCkndygtu/C9+XUfydLC8Iv5UYJqRwy4zk8EcplRxEOeLyjq1gm6Q==}
+ engines: {node: '>=6.9.0'}
+ peerDependencies:
+ '@babel/core': ^7.0.0-0
+ dependencies:
+ '@babel/core': 7.19.3
+ '@babel/helper-plugin-utils': 7.19.0
+ dev: true
+
+ /@babel/plugin-transform-template-literals/7.18.9_@babel+core@7.19.3:
+ resolution: {integrity: sha512-S8cOWfT82gTezpYOiVaGHrCbhlHgKhQt8XH5ES46P2XWmX92yisoZywf5km75wv5sYcXDUCLMmMxOLCtthDgMA==}
+ engines: {node: '>=6.9.0'}
+ peerDependencies:
+ '@babel/core': ^7.0.0-0
+ dependencies:
+ '@babel/core': 7.19.3
+ '@babel/helper-plugin-utils': 7.19.0
+ dev: true
+
+ /@babel/plugin-transform-typeof-symbol/7.18.9_@babel+core@7.19.3:
+ resolution: {integrity: sha512-SRfwTtF11G2aemAZWivL7PD+C9z52v9EvMqH9BuYbabyPuKUvSWks3oCg6041pT925L4zVFqaVBeECwsmlguEw==}
+ engines: {node: '>=6.9.0'}
+ peerDependencies:
+ '@babel/core': ^7.0.0-0
+ dependencies:
+ '@babel/core': 7.19.3
+ '@babel/helper-plugin-utils': 7.19.0
+ dev: true
+
+ /@babel/plugin-transform-unicode-escapes/7.18.10_@babel+core@7.19.3:
+ resolution: {integrity: sha512-kKAdAI+YzPgGY/ftStBFXTI1LZFju38rYThnfMykS+IXy8BVx+res7s2fxf1l8I35DV2T97ezo6+SGrXz6B3iQ==}
+ engines: {node: '>=6.9.0'}
+ peerDependencies:
+ '@babel/core': ^7.0.0-0
+ dependencies:
+ '@babel/core': 7.19.3
+ '@babel/helper-plugin-utils': 7.19.0
+ dev: true
+
+ /@babel/plugin-transform-unicode-regex/7.18.6_@babel+core@7.19.3:
+ resolution: {integrity: sha512-gE7A6Lt7YLnNOL3Pb9BNeZvi+d8l7tcRrG4+pwJjK9hD2xX4mEvjlQW60G9EEmfXVYRPv9VRQcyegIVHCql/AA==}
+ engines: {node: '>=6.9.0'}
+ peerDependencies:
+ '@babel/core': ^7.0.0-0
+ dependencies:
+ '@babel/core': 7.19.3
+ '@babel/helper-create-regexp-features-plugin': 7.19.0_@babel+core@7.19.3
+ '@babel/helper-plugin-utils': 7.19.0
+ dev: true
+
+ /@babel/preset-env/7.19.4_@babel+core@7.19.3:
+ resolution: {integrity: sha512-5QVOTXUdqTCjQuh2GGtdd7YEhoRXBMVGROAtsBeLGIbIz3obCBIfRMT1I3ZKkMgNzwkyCkftDXSSkHxnfVf4qg==}
+ engines: {node: '>=6.9.0'}
+ peerDependencies:
+ '@babel/core': ^7.0.0-0
+ dependencies:
+ '@babel/compat-data': 7.19.4
+ '@babel/core': 7.19.3
+ '@babel/helper-compilation-targets': 7.19.3_@babel+core@7.19.3
+ '@babel/helper-plugin-utils': 7.19.0
+ '@babel/helper-validator-option': 7.18.6
+ '@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression': 7.18.6_@babel+core@7.19.3
+ '@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining': 7.18.9_@babel+core@7.19.3
+ '@babel/plugin-proposal-async-generator-functions': 7.19.1_@babel+core@7.19.3
+ '@babel/plugin-proposal-class-properties': 7.18.6_@babel+core@7.19.3
+ '@babel/plugin-proposal-class-static-block': 7.18.6_@babel+core@7.19.3
+ '@babel/plugin-proposal-dynamic-import': 7.18.6_@babel+core@7.19.3
+ '@babel/plugin-proposal-export-namespace-from': 7.18.9_@babel+core@7.19.3
+ '@babel/plugin-proposal-json-strings': 7.18.6_@babel+core@7.19.3
+ '@babel/plugin-proposal-logical-assignment-operators': 7.18.9_@babel+core@7.19.3
+ '@babel/plugin-proposal-nullish-coalescing-operator': 7.18.6_@babel+core@7.19.3
+ '@babel/plugin-proposal-numeric-separator': 7.18.6_@babel+core@7.19.3
+ '@babel/plugin-proposal-object-rest-spread': 7.19.4_@babel+core@7.19.3
+ '@babel/plugin-proposal-optional-catch-binding': 7.18.6_@babel+core@7.19.3
+ '@babel/plugin-proposal-optional-chaining': 7.18.9_@babel+core@7.19.3
+ '@babel/plugin-proposal-private-methods': 7.18.6_@babel+core@7.19.3
+ '@babel/plugin-proposal-private-property-in-object': 7.18.6_@babel+core@7.19.3
+ '@babel/plugin-proposal-unicode-property-regex': 7.18.6_@babel+core@7.19.3
+ '@babel/plugin-syntax-async-generators': 7.8.4_@babel+core@7.19.3
+ '@babel/plugin-syntax-class-properties': 7.12.13_@babel+core@7.19.3
+ '@babel/plugin-syntax-class-static-block': 7.14.5_@babel+core@7.19.3
+ '@babel/plugin-syntax-dynamic-import': 7.8.3_@babel+core@7.19.3
+ '@babel/plugin-syntax-export-namespace-from': 7.8.3_@babel+core@7.19.3
+ '@babel/plugin-syntax-import-assertions': 7.18.6_@babel+core@7.19.3
+ '@babel/plugin-syntax-json-strings': 7.8.3_@babel+core@7.19.3
+ '@babel/plugin-syntax-logical-assignment-operators': 7.10.4_@babel+core@7.19.3
+ '@babel/plugin-syntax-nullish-coalescing-operator': 7.8.3_@babel+core@7.19.3
+ '@babel/plugin-syntax-numeric-separator': 7.10.4_@babel+core@7.19.3
+ '@babel/plugin-syntax-object-rest-spread': 7.8.3_@babel+core@7.19.3
+ '@babel/plugin-syntax-optional-catch-binding': 7.8.3_@babel+core@7.19.3
+ '@babel/plugin-syntax-optional-chaining': 7.8.3_@babel+core@7.19.3
+ '@babel/plugin-syntax-private-property-in-object': 7.14.5_@babel+core@7.19.3
+ '@babel/plugin-syntax-top-level-await': 7.14.5_@babel+core@7.19.3
+ '@babel/plugin-transform-arrow-functions': 7.18.6_@babel+core@7.19.3
+ '@babel/plugin-transform-async-to-generator': 7.18.6_@babel+core@7.19.3
+ '@babel/plugin-transform-block-scoped-functions': 7.18.6_@babel+core@7.19.3
+ '@babel/plugin-transform-block-scoping': 7.19.4_@babel+core@7.19.3
+ '@babel/plugin-transform-classes': 7.19.0_@babel+core@7.19.3
+ '@babel/plugin-transform-computed-properties': 7.18.9_@babel+core@7.19.3
+ '@babel/plugin-transform-destructuring': 7.19.4_@babel+core@7.19.3
+ '@babel/plugin-transform-dotall-regex': 7.18.6_@babel+core@7.19.3
+ '@babel/plugin-transform-duplicate-keys': 7.18.9_@babel+core@7.19.3
+ '@babel/plugin-transform-exponentiation-operator': 7.18.6_@babel+core@7.19.3
+ '@babel/plugin-transform-for-of': 7.18.8_@babel+core@7.19.3
+ '@babel/plugin-transform-function-name': 7.18.9_@babel+core@7.19.3
+ '@babel/plugin-transform-literals': 7.18.9_@babel+core@7.19.3
+ '@babel/plugin-transform-member-expression-literals': 7.18.6_@babel+core@7.19.3
+ '@babel/plugin-transform-modules-amd': 7.18.6_@babel+core@7.19.3
+ '@babel/plugin-transform-modules-commonjs': 7.18.6_@babel+core@7.19.3
+ '@babel/plugin-transform-modules-systemjs': 7.19.0_@babel+core@7.19.3
+ '@babel/plugin-transform-modules-umd': 7.18.6_@babel+core@7.19.3
+ '@babel/plugin-transform-named-capturing-groups-regex': 7.19.1_@babel+core@7.19.3
+ '@babel/plugin-transform-new-target': 7.18.6_@babel+core@7.19.3
+ '@babel/plugin-transform-object-super': 7.18.6_@babel+core@7.19.3
+ '@babel/plugin-transform-parameters': 7.18.8_@babel+core@7.19.3
+ '@babel/plugin-transform-property-literals': 7.18.6_@babel+core@7.19.3
+ '@babel/plugin-transform-regenerator': 7.18.6_@babel+core@7.19.3
+ '@babel/plugin-transform-reserved-words': 7.18.6_@babel+core@7.19.3
+ '@babel/plugin-transform-shorthand-properties': 7.18.6_@babel+core@7.19.3
+ '@babel/plugin-transform-spread': 7.19.0_@babel+core@7.19.3
+ '@babel/plugin-transform-sticky-regex': 7.18.6_@babel+core@7.19.3
+ '@babel/plugin-transform-template-literals': 7.18.9_@babel+core@7.19.3
+ '@babel/plugin-transform-typeof-symbol': 7.18.9_@babel+core@7.19.3
+ '@babel/plugin-transform-unicode-escapes': 7.18.10_@babel+core@7.19.3
+ '@babel/plugin-transform-unicode-regex': 7.18.6_@babel+core@7.19.3
+ '@babel/preset-modules': 0.1.5_@babel+core@7.19.3
+ '@babel/types': 7.19.4
+ babel-plugin-polyfill-corejs2: 0.3.3_@babel+core@7.19.3
+ babel-plugin-polyfill-corejs3: 0.6.0_@babel+core@7.19.3
+ babel-plugin-polyfill-regenerator: 0.4.1_@babel+core@7.19.3
+ core-js-compat: 3.25.5
+ semver: 6.3.0
+ transitivePeerDependencies:
+ - supports-color
+ dev: true
+
+ /@babel/preset-modules/0.1.5_@babel+core@7.19.3:
+ resolution: {integrity: sha512-A57th6YRG7oR3cq/yt/Y84MvGgE0eJG2F1JLhKuyG+jFxEgrd/HAMJatiFtmOiZurz+0DkrvbheCLaV5f2JfjA==}
+ peerDependencies:
+ '@babel/core': ^7.0.0-0
+ dependencies:
+ '@babel/core': 7.19.3
+ '@babel/helper-plugin-utils': 7.19.0
+ '@babel/plugin-proposal-unicode-property-regex': 7.18.6_@babel+core@7.19.3
+ '@babel/plugin-transform-dotall-regex': 7.18.6_@babel+core@7.19.3
+ '@babel/types': 7.19.4
+ esutils: 2.0.3
+ dev: true
+
+ /@babel/preset-react/7.18.6_@babel+core@7.19.3:
+ resolution: {integrity: sha512-zXr6atUmyYdiWRVLOZahakYmOBHtWc2WGCkP8PYTgZi0iJXDY2CN180TdrIW4OGOAdLc7TifzDIvtx6izaRIzg==}
+ engines: {node: '>=6.9.0'}
+ peerDependencies:
+ '@babel/core': ^7.0.0-0
+ dependencies:
+ '@babel/core': 7.19.3
+ '@babel/helper-plugin-utils': 7.19.0
+ '@babel/helper-validator-option': 7.18.6
+ '@babel/plugin-transform-react-display-name': 7.18.6_@babel+core@7.19.3
+ '@babel/plugin-transform-react-jsx': 7.19.0_@babel+core@7.19.3
+ '@babel/plugin-transform-react-jsx-development': 7.18.6_@babel+core@7.19.3
+ '@babel/plugin-transform-react-pure-annotations': 7.18.6_@babel+core@7.19.3
+ dev: true
+
+ /@babel/runtime-corejs3/7.19.4:
+ resolution: {integrity: sha512-HzjQ8+dzdx7dmZy4DQ8KV8aHi/74AjEbBGTFutBmg/pd3dY5/q1sfuOGPTFGEytlQhWoeVXqcK5BwMgIkRkNDQ==}
+ engines: {node: '>=6.9.0'}
+ dependencies:
+ core-js-pure: 3.25.5
+ regenerator-runtime: 0.13.10
+ dev: true
+
+ /@babel/runtime/7.19.4:
+ resolution: {integrity: sha512-EXpLCrk55f+cYqmHsSR+yD/0gAIMxxA9QK9lnQWzhMCvt+YmoBN7Zx94s++Kv0+unHk39vxNO8t+CMA2WSS3wA==}
+ engines: {node: '>=6.9.0'}
+ dependencies:
+ regenerator-runtime: 0.13.10
+
+ /@babel/template/7.18.10:
+ resolution: {integrity: sha512-TI+rCtooWHr3QJ27kJxfjutghu44DLnasDMwpDqCXVTal9RLp3RSYNh4NdBrRP2cQAoG9A8juOQl6P6oZG4JxA==}
+ engines: {node: '>=6.9.0'}
+ dependencies:
+ '@babel/code-frame': 7.18.6
+ '@babel/parser': 7.19.4
+ '@babel/types': 7.19.4
+
+ /@babel/traverse/7.19.4:
+ resolution: {integrity: sha512-w3K1i+V5u2aJUOXBFFC5pveFLmtq1s3qcdDNC2qRI6WPBQIDaKFqXxDEqDO/h1dQ3HjsZoZMyIy6jGLq0xtw+g==}
+ engines: {node: '>=6.9.0'}
+ dependencies:
+ '@babel/code-frame': 7.18.6
+ '@babel/generator': 7.19.5
+ '@babel/helper-environment-visitor': 7.18.9
+ '@babel/helper-function-name': 7.19.0
+ '@babel/helper-hoist-variables': 7.18.6
+ '@babel/helper-split-export-declaration': 7.18.6
+ '@babel/parser': 7.19.4
+ '@babel/types': 7.19.4
+ debug: 4.3.4
+ globals: 11.12.0
+ transitivePeerDependencies:
+ - supports-color
+
+ /@babel/types/7.19.4:
+ resolution: {integrity: sha512-M5LK7nAeS6+9j7hAq+b3fQs+pNfUtTGq+yFFfHnauFA8zQtLRfmuipmsKDKKLuyG+wC8ABW43A153YNawNTEtw==}
+ engines: {node: '>=6.9.0'}
+ dependencies:
+ '@babel/helper-string-parser': 7.19.4
+ '@babel/helper-validator-identifier': 7.19.1
+ to-fast-properties: 2.0.0
+
+ /@bcoe/v8-coverage/0.2.3:
+ resolution: {integrity: sha512-0hYQ8SB4Db5zvZB4axdMHGwEaQjkZzFjQiN9LVYvIFB2nSUHW9tYpxWriPrWDASIxiaXax83REcLxuSdnGPZtw==}
+ dev: true
+
+ /@cspotcode/source-map-support/0.8.1:
+ resolution: {integrity: sha512-IchNf6dN4tHoMFIn/7OE8LWZ19Y6q/67Bmf6vnGREv8RSbBVb9LPJxEcnwrcwX6ixSvaiGoomAUvu4YSxXrVgw==}
+ engines: {node: '>=12'}
+ dependencies:
+ '@jridgewell/trace-mapping': 0.3.9
+ dev: true
+
+ /@emotion/babel-plugin/11.10.2_@babel+core@7.19.3:
+ resolution: {integrity: sha512-xNQ57njWTFVfPAc3cjfuaPdsgLp5QOSuRsj9MA6ndEhH/AzuZM86qIQzt6rq+aGBwj3n5/TkLmU5lhAfdRmogA==}
+ peerDependencies:
+ '@babel/core': ^7.0.0
+ dependencies:
+ '@babel/core': 7.19.3
+ '@babel/helper-module-imports': 7.18.6
+ '@babel/plugin-syntax-jsx': 7.18.6_@babel+core@7.19.3
+ '@babel/runtime': 7.19.4
+ '@emotion/hash': 0.9.0
+ '@emotion/memoize': 0.8.0
+ '@emotion/serialize': 1.1.0
+ babel-plugin-macros: 3.1.0
+ convert-source-map: 1.9.0
+ escape-string-regexp: 4.0.0
+ find-root: 1.1.0
+ source-map: 0.5.7
+ stylis: 4.0.13
+ dev: false
+
+ /@emotion/cache/11.10.3:
+ resolution: {integrity: sha512-Psmp/7ovAa8appWh3g51goxu/z3iVms7JXOreq136D8Bbn6dYraPnmL6mdM8GThEx9vwSn92Fz+mGSjBzN8UPQ==}
+ dependencies:
+ '@emotion/memoize': 0.8.0
+ '@emotion/sheet': 1.2.0
+ '@emotion/utils': 1.2.0
+ '@emotion/weak-memoize': 0.3.0
+ stylis: 4.0.13
+ dev: false
+
+ /@emotion/css/11.10.0_@babel+core@7.19.3:
+ resolution: {integrity: sha512-dH9f+kSCucc8ilMg0MUA1AemabcyzYpe5EKX24F528PJjD7HyIY/VBNJHxfUdc8l400h2ncAjR6yEDu+DBj2cg==}
+ peerDependencies:
+ '@babel/core': ^7.0.0
+ peerDependenciesMeta:
+ '@babel/core':
+ optional: true
+ dependencies:
+ '@babel/core': 7.19.3
+ '@emotion/babel-plugin': 11.10.2_@babel+core@7.19.3
+ '@emotion/cache': 11.10.3
+ '@emotion/serialize': 1.1.0
+ '@emotion/sheet': 1.2.0
+ '@emotion/utils': 1.2.0
+ dev: false
+
+ /@emotion/hash/0.9.0:
+ resolution: {integrity: sha512-14FtKiHhy2QoPIzdTcvh//8OyBlknNs2nXRwIhG904opCby3l+9Xaf/wuPvICBF0rc1ZCNBd3nKe9cd2mecVkQ==}
+ dev: false
+
+ /@emotion/is-prop-valid/0.8.8:
+ resolution: {integrity: sha512-u5WtneEAr5IDG2Wv65yhunPSMLIpuKsbuOktRojfrEiEvRyC85LgPMZI63cr7NUqT8ZIGdSVg8ZKGxIug4lXcA==}
+ requiresBuild: true
+ dependencies:
+ '@emotion/memoize': 0.7.4
+ dev: false
+ optional: true
+
+ /@emotion/memoize/0.7.4:
+ resolution: {integrity: sha512-Ja/Vfqe3HpuzRsG1oBtWTHk2PGZ7GR+2Vz5iYGelAw8dx32K0y7PjVuxK6z1nMpZOqAFsRUPCkK1YjJ56qJlgw==}
+ dev: false
+ optional: true
+
+ /@emotion/memoize/0.8.0:
+ resolution: {integrity: sha512-G/YwXTkv7Den9mXDO7AhLWkE3q+I92B+VqAE+dYG4NGPaHZGvt3G8Q0p9vmE+sq7rTGphUbAvmQ9YpbfMQGGlA==}
+ dev: false
+
+ /@emotion/react/11.10.4_e5jlcwkuouknzfjrwezo3gnujm:
+ resolution: {integrity: sha512-j0AkMpr6BL8gldJZ6XQsQ8DnS9TxEQu1R+OGmDZiWjBAJtCcbt0tS3I/YffoqHXxH6MjgI7KdMbYKw3MEiU9eA==}
+ peerDependencies:
+ '@babel/core': ^7.0.0
+ '@types/react': '*'
+ react: '>=16.8.0'
+ peerDependenciesMeta:
+ '@babel/core':
+ optional: true
+ '@types/react':
+ optional: true
+ dependencies:
+ '@babel/core': 7.19.3
+ '@babel/runtime': 7.19.4
+ '@emotion/babel-plugin': 11.10.2_@babel+core@7.19.3
+ '@emotion/cache': 11.10.3
+ '@emotion/serialize': 1.1.0
+ '@emotion/use-insertion-effect-with-fallbacks': 1.0.0_react@17.0.2
+ '@emotion/utils': 1.2.0
+ '@emotion/weak-memoize': 0.3.0
+ '@types/react': 17.0.50
+ hoist-non-react-statics: 3.3.2
+ react: 17.0.2
+ dev: false
+
+ /@emotion/serialize/1.1.0:
+ resolution: {integrity: sha512-F1ZZZW51T/fx+wKbVlwsfchr5q97iW8brAnXmsskz4d0hVB4O3M/SiA3SaeH06x02lSNzkkQv+n3AX3kCXKSFA==}
+ dependencies:
+ '@emotion/hash': 0.9.0
+ '@emotion/memoize': 0.8.0
+ '@emotion/unitless': 0.8.0
+ '@emotion/utils': 1.2.0
+ csstype: 3.1.1
+ dev: false
+
+ /@emotion/sheet/1.2.0:
+ resolution: {integrity: sha512-OiTkRgpxescko+M51tZsMq7Puu/KP55wMT8BgpcXVG2hqXc0Vo0mfymJ/Uj24Hp0i083ji/o0aLddh08UEjq8w==}
+ dev: false
+
+ /@emotion/unitless/0.8.0:
+ resolution: {integrity: sha512-VINS5vEYAscRl2ZUDiT3uMPlrFQupiKgHz5AA4bCH1miKBg4qtwkim1qPmJj/4WG6TreYMY111rEFsjupcOKHw==}
+ dev: false
+
+ /@emotion/use-insertion-effect-with-fallbacks/1.0.0_react@17.0.2:
+ resolution: {integrity: sha512-1eEgUGmkaljiBnRMTdksDV1W4kUnmwgp7X9G8B++9GYwl1lUdqSndSriIrTJ0N7LQaoauY9JJ2yhiOYK5+NI4A==}
+ peerDependencies:
+ react: '>=16.8.0'
+ dependencies:
+ react: 17.0.2
+ dev: false
+
+ /@emotion/utils/1.2.0:
+ resolution: {integrity: sha512-sn3WH53Kzpw8oQ5mgMmIzzyAaH2ZqFEbozVVBSYp538E06OSE6ytOp7pRAjNQR+Q/orwqdQYJSe2m3hCOeznkw==}
+ dev: false
+
+ /@emotion/weak-memoize/0.3.0:
+ resolution: {integrity: sha512-AHPmaAx+RYfZz0eYu6Gviiagpmiyw98ySSlQvCUhVGDRtDFe4DBS0x1bSjdF3gqUDYOczB+yYvBTtEylYSdRhg==}
+ dev: false
+
+ /@esbuild/android-arm/0.15.10:
+ resolution: {integrity: sha512-FNONeQPy/ox+5NBkcSbYJxoXj9GWu8gVGJTVmUyoOCKQFDTrHVKgNSzChdNt0I8Aj/iKcsDf2r9BFwv+FSNUXg==}
+ engines: {node: '>=12'}
+ cpu: [arm]
+ os: [android]
+ requiresBuild: true
+ dev: true
+ optional: true
+
+ /@esbuild/linux-loong64/0.15.10:
+ resolution: {integrity: sha512-w0Ou3Z83LOYEkwaui2M8VwIp+nLi/NA60lBLMvaJ+vXVMcsARYdEzLNE7RSm4+lSg4zq4d7fAVuzk7PNQ5JFgg==}
+ engines: {node: '>=12'}
+ cpu: [loong64]
+ os: [linux]
+ requiresBuild: true
+ dev: true
+ optional: true
+
+ /@eslint/eslintrc/0.4.3:
+ resolution: {integrity: sha512-J6KFFz5QCYUJq3pf0mjEcCJVERbzv71PUIDczuh9JkwGEzced6CO5ADLHB1rbf/+oPBtoPfMYNOpGDzCANlbXw==}
+ engines: {node: ^10.12.0 || >=12.0.0}
+ dependencies:
+ ajv: 6.12.6
+ debug: 4.3.4
+ espree: 7.3.1
+ globals: 13.17.0
+ ignore: 4.0.6
+ import-fresh: 3.3.0
+ js-yaml: 3.14.1
+ minimatch: 3.1.2
+ strip-json-comments: 3.1.1
+ transitivePeerDependencies:
+ - supports-color
+ dev: true
+
+ /@floating-ui/core/1.0.1:
+ resolution: {integrity: sha512-bO37brCPfteXQfFY0DyNDGB3+IMe4j150KFQcgJ5aBP295p9nBGeHEs/p0czrRbtlHq4Px/yoPXO/+dOCcF4uA==}
+ dev: false
+
+ /@floating-ui/dom/1.0.2:
+ resolution: {integrity: sha512-5X9WSvZ8/fjy3gDu8yx9HAA4KG1lazUN2P4/VnaXLxTO9Dz53HI1oYoh1OlhqFNlHgGDiwFX5WhFCc2ljbW3yA==}
+ dependencies:
+ '@floating-ui/core': 1.0.1
+ dev: false
+
+ /@floating-ui/react-dom-interactions/0.10.1_hiunvzosbwliizyirxfy6hjyim:
+ resolution: {integrity: sha512-mb9Sn/cnPjVlEucSZTSt4Iu7NAvqnXTvmzeE5EtfdRhVQO6L94dqqT+DPTmJmbiw4XqzoyGP+Q6J+I5iK2p6bw==}
+ peerDependencies:
+ react: '>=16.8.0'
+ react-dom: '>=16.8.0'
+ dependencies:
+ '@floating-ui/react-dom': 1.0.0_sfoxds7t5ydpegc3knd667wn6m
+ aria-hidden: 1.2.1_pxzommwrsowkd4kgag6q3sluym
+ react: 17.0.2
+ react-dom: 17.0.2_react@17.0.2
+ transitivePeerDependencies:
+ - '@types/react'
+ dev: false
+
+ /@floating-ui/react-dom/1.0.0_sfoxds7t5ydpegc3knd667wn6m:
+ resolution: {integrity: sha512-uiOalFKPG937UCLm42RxjESTWUVpbbatvlphQAU6bsv+ence6IoVG8JOUZcy8eW81NkU+Idiwvx10WFLmR4MIg==}
+ peerDependencies:
+ react: '>=16.8.0'
+ react-dom: '>=16.8.0'
+ dependencies:
+ '@floating-ui/dom': 1.0.2
+ react: 17.0.2
+ react-dom: 17.0.2_react@17.0.2
+ dev: false
+
+ /@formatjs/ecma402-abstract/1.13.0:
+ resolution: {integrity: sha512-CQ8Ykd51jYD1n05dtoX6ns6B9n/+6ZAxnWUAonvHC4kkuAemROYBhHkEB4tm1uVrRlE7gLDqXkAnY51Y0pRCWQ==}
+ dependencies:
+ '@formatjs/intl-localematcher': 0.2.31
+ tslib: 2.4.0
+ dev: false
+
+ /@formatjs/fast-memoize/1.2.6:
+ resolution: {integrity: sha512-9CWZ3+wCkClKHX+i5j+NyoBVqGf0pIskTo6Xl6ihGokYM2yqSSS68JIgeo+99UIHc+7vi9L3/SDSz/dWI9SNlA==}
+ dependencies:
+ tslib: 2.4.0
+ dev: false
+
+ /@formatjs/icu-messageformat-parser/2.1.9:
+ resolution: {integrity: sha512-KFwi1cDZ6sFbsZ6xuXpg/UtdVtcwmpEt2WY355k33Z+3fpzRe1EulwX65qEoho0af3+ZsiJxuhIvUIlSSFWASg==}
+ dependencies:
+ '@formatjs/ecma402-abstract': 1.13.0
+ '@formatjs/icu-skeleton-parser': 1.3.14
+ tslib: 2.4.0
+ dev: false
+
+ /@formatjs/icu-skeleton-parser/1.3.14:
+ resolution: {integrity: sha512-7bv60HQQcBb3+TSj+45tOb/CHV5z1hOpwdtS50jsSBXfB+YpGhnoRsZxSRksXeCxMy6xn6tA6VY2601BrrK+OA==}
+ dependencies:
+ '@formatjs/ecma402-abstract': 1.13.0
+ tslib: 2.4.0
+ dev: false
+
+ /@formatjs/intl-localematcher/0.2.31:
+ resolution: {integrity: sha512-9QTjdSBpQ7wHShZgsNzNig5qT3rCPvmZogS/wXZzKotns5skbXgs0I7J8cuN0PPqXyynvNVuN+iOKhNS2eb+ZA==}
+ dependencies:
+ tslib: 2.4.0
+ dev: false
+
+ /@humanwhocodes/config-array/0.5.0:
+ resolution: {integrity: sha512-FagtKFz74XrTl7y6HCzQpwDfXP0yhxe9lHLD1UZxjvZIcbyRz8zTFF/yYNfSfzU414eDwZ1SrO0Qvtyf+wFMQg==}
+ engines: {node: '>=10.10.0'}
+ dependencies:
+ '@humanwhocodes/object-schema': 1.2.1
+ debug: 4.3.4
+ minimatch: 3.1.2
+ transitivePeerDependencies:
+ - supports-color
+ dev: true
+
+ /@humanwhocodes/object-schema/1.2.1:
+ resolution: {integrity: sha512-ZnQMnLV4e7hDlUvw8H+U8ASL02SS2Gn6+9Ac3wGGLIe7+je2AeAOxPY+izIPJDfFDb7eDjev0Us8MO1iFRN8hA==}
+ dev: true
+
+ /@internationalized/date/3.0.1:
+ resolution: {integrity: sha512-E/3lASs4mAeJ2Z2ye6ab7eUD0bPUfTeNVTAv6IS+ne9UtMu9Uepb9A1U2Ae0hDr6WAlBuvUtrakaxEdYB9TV6Q==}
+ dependencies:
+ '@babel/runtime': 7.19.4
+ dev: false
+
+ /@internationalized/message/3.0.9:
+ resolution: {integrity: sha512-yHQggKWUuSvj1GznVtie4tcYq+xMrkd/lTKCFHp6gG18KbIliDw+UI7sL9+yJPGuWiR083xuLyyhzqiPbNOEww==}
+ dependencies:
+ '@babel/runtime': 7.19.4
+ intl-messageformat: 10.2.0
+ dev: false
+
+ /@internationalized/number/3.1.1:
+ resolution: {integrity: sha512-dBxCQKIxvsZvW2IBt3KsqrCfaw2nV6o6a8xsloJn/hjW0ayeyhKuiiMtTwW3/WGNPP7ZRyDbtuiUEjMwif1ENQ==}
+ dependencies:
+ '@babel/runtime': 7.19.4
+ dev: false
+
+ /@internationalized/string/3.0.0:
+ resolution: {integrity: sha512-NUSr4u+mNu5BysXFeVWZW4kvjXylPkU/YYqaWzdNuz1eABfehFiZTEYhWAAMzI3U8DTxfqF9PM3zyhk5gcfz6w==}
+ dependencies:
+ '@babel/runtime': 7.19.4
+ dev: false
+
+ /@istanbuljs/load-nyc-config/1.1.0:
+ resolution: {integrity: sha512-VjeHSlIzpv/NyD3N0YuHfXOPDIixcA1q2ZV98wsMqcYlPmv2n3Yb2lYP9XMElnaFVXg5A7YLTeLu6V84uQDjmQ==}
+ engines: {node: '>=8'}
+ dependencies:
+ camelcase: 5.3.1
+ find-up: 4.1.0
+ get-package-type: 0.1.0
+ js-yaml: 3.14.1
+ resolve-from: 5.0.0
+ dev: true
+
+ /@istanbuljs/schema/0.1.3:
+ resolution: {integrity: sha512-ZXRY4jNvVgSVQ8DL3LTcakaAtXwTVUxE81hslsyD2AtoXW/wVob10HkOJ1X/pAlcI7D+2YoZKg5do8G/w6RYgA==}
+ engines: {node: '>=8'}
+ dev: true
+
+ /@jest/console/28.1.3:
+ resolution: {integrity: sha512-QPAkP5EwKdK/bxIr6C1I4Vs0rm2nHiANzj/Z5X2JQkrZo6IqvC4ldZ9K95tF0HdidhA8Bo6egxSzUFPYKcEXLw==}
+ engines: {node: ^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0}
+ dependencies:
+ '@jest/types': 28.1.3
+ '@types/node': 17.0.45
+ chalk: 4.1.2
+ jest-message-util: 28.1.3
+ jest-util: 28.1.3
+ slash: 3.0.0
+ dev: true
+
+ /@jest/core/28.1.3_ts-node@10.9.1:
+ resolution: {integrity: sha512-CIKBrlaKOzA7YG19BEqCw3SLIsEwjZkeJzf5bdooVnW4bH5cktqe3JX+G2YV1aK5vP8N9na1IGWFzYaTp6k6NA==}
+ engines: {node: ^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0}
+ peerDependencies:
+ node-notifier: ^8.0.1 || ^9.0.0 || ^10.0.0
+ peerDependenciesMeta:
+ node-notifier:
+ optional: true
+ dependencies:
+ '@jest/console': 28.1.3
+ '@jest/reporters': 28.1.3
+ '@jest/test-result': 28.1.3
+ '@jest/transform': 28.1.3
+ '@jest/types': 28.1.3
+ '@types/node': 17.0.45
+ ansi-escapes: 4.3.2
+ chalk: 4.1.2
+ ci-info: 3.5.0
+ exit: 0.1.2
+ graceful-fs: 4.2.10
+ jest-changed-files: 28.1.3
+ jest-config: 28.1.3_2263m44mchjafa7bz7l52hbcpa
+ jest-haste-map: 28.1.3
+ jest-message-util: 28.1.3
+ jest-regex-util: 28.0.2
+ jest-resolve: 28.1.3
+ jest-resolve-dependencies: 28.1.3
+ jest-runner: 28.1.3
+ jest-runtime: 28.1.3
+ jest-snapshot: 28.1.3
+ jest-util: 28.1.3
+ jest-validate: 28.1.3
+ jest-watcher: 28.1.3
+ micromatch: 4.0.5
+ pretty-format: 28.1.3
+ rimraf: 3.0.2
+ slash: 3.0.0
+ strip-ansi: 6.0.1
+ transitivePeerDependencies:
+ - supports-color
+ - ts-node
+ dev: true
+
+ /@jest/environment/28.1.3:
+ resolution: {integrity: sha512-1bf40cMFTEkKyEf585R9Iz1WayDjHoHqvts0XFYEqyKM3cFWDpeMoqKKTAF9LSYQModPUlh8FKptoM2YcMWAXA==}
+ engines: {node: ^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0}
+ dependencies:
+ '@jest/fake-timers': 28.1.3
+ '@jest/types': 28.1.3
+ '@types/node': 17.0.45
+ jest-mock: 28.1.3
+ dev: true
+
+ /@jest/environment/29.1.2:
+ resolution: {integrity: sha512-rG7xZ2UeOfvOVzoLIJ0ZmvPl4tBEQ2n73CZJSlzUjPw4or1oSWC0s0Rk0ZX+pIBJ04aVr6hLWFn1DFtrnf8MhQ==}
+ engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0}
+ dependencies:
+ '@jest/fake-timers': 29.1.2
+ '@jest/types': 29.1.2
+ '@types/node': 17.0.45
+ jest-mock: 29.1.2
+ dev: true
+
+ /@jest/expect-utils/28.1.3:
+ resolution: {integrity: sha512-wvbi9LUrHJLn3NlDW6wF2hvIMtd4JUl2QNVrjq+IBSHirgfrR3o9RnVtxzdEGO2n9JyIWwHnLfby5KzqBGg2YA==}
+ engines: {node: ^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0}
+ dependencies:
+ jest-get-type: 28.0.2
+ dev: true
+
+ /@jest/expect/28.1.3:
+ resolution: {integrity: sha512-lzc8CpUbSoE4dqT0U+g1qODQjBRHPpCPXissXD4mS9+sWQdmmpeJ9zSH1rS1HEkrsMN0fb7nKrJ9giAR1d3wBw==}
+ engines: {node: ^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0}
+ dependencies:
+ expect: 28.1.3
+ jest-snapshot: 28.1.3
+ transitivePeerDependencies:
+ - supports-color
+ dev: true
+
+ /@jest/fake-timers/28.1.3:
+ resolution: {integrity: sha512-D/wOkL2POHv52h+ok5Oj/1gOG9HSywdoPtFsRCUmlCILXNn5eIWmcnd3DIiWlJnpGvQtmajqBP95Ei0EimxfLw==}
+ engines: {node: ^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0}
+ dependencies:
+ '@jest/types': 28.1.3
+ '@sinonjs/fake-timers': 9.1.2
+ '@types/node': 17.0.45
+ jest-message-util: 28.1.3
+ jest-mock: 28.1.3
+ jest-util: 28.1.3
+ dev: true
+
+ /@jest/fake-timers/29.1.2:
+ resolution: {integrity: sha512-GppaEqS+QQYegedxVMpCe2xCXxxeYwQ7RsNx55zc8f+1q1qevkZGKequfTASI7ejmg9WwI+SJCrHe9X11bLL9Q==}
+ engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0}
+ dependencies:
+ '@jest/types': 29.1.2
+ '@sinonjs/fake-timers': 9.1.2
+ '@types/node': 17.0.45
+ jest-message-util: 29.1.2
+ jest-mock: 29.1.2
+ jest-util: 29.1.2
+ dev: true
+
+ /@jest/globals/28.1.3:
+ resolution: {integrity: sha512-XFU4P4phyryCXu1pbcqMO0GSQcYe1IsalYCDzRNyhetyeyxMcIxa11qPNDpVNLeretItNqEmYYQn1UYz/5x1NA==}
+ engines: {node: ^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0}
+ dependencies:
+ '@jest/environment': 28.1.3
+ '@jest/expect': 28.1.3
+ '@jest/types': 28.1.3
+ transitivePeerDependencies:
+ - supports-color
+ dev: true
+
+ /@jest/reporters/28.1.3:
+ resolution: {integrity: sha512-JuAy7wkxQZVNU/V6g9xKzCGC5LVXx9FDcABKsSXp5MiKPEE2144a/vXTEDoyzjUpZKfVwp08Wqg5A4WfTMAzjg==}
+ engines: {node: ^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0}
+ peerDependencies:
+ node-notifier: ^8.0.1 || ^9.0.0 || ^10.0.0
+ peerDependenciesMeta:
+ node-notifier:
+ optional: true
+ dependencies:
+ '@bcoe/v8-coverage': 0.2.3
+ '@jest/console': 28.1.3
+ '@jest/test-result': 28.1.3
+ '@jest/transform': 28.1.3
+ '@jest/types': 28.1.3
+ '@jridgewell/trace-mapping': 0.3.17
+ '@types/node': 17.0.45
+ chalk: 4.1.2
+ collect-v8-coverage: 1.0.1
+ exit: 0.1.2
+ glob: 7.2.3
+ graceful-fs: 4.2.10
+ istanbul-lib-coverage: 3.2.0
+ istanbul-lib-instrument: 5.2.1
+ istanbul-lib-report: 3.0.0
+ istanbul-lib-source-maps: 4.0.1
+ istanbul-reports: 3.1.5
+ jest-message-util: 28.1.3
+ jest-util: 28.1.3
+ jest-worker: 28.1.3
+ slash: 3.0.0
+ string-length: 4.0.2
+ strip-ansi: 6.0.1
+ terminal-link: 2.1.1
+ v8-to-istanbul: 9.0.1
+ transitivePeerDependencies:
+ - supports-color
+ dev: true
+
+ /@jest/schemas/28.1.3:
+ resolution: {integrity: sha512-/l/VWsdt/aBXgjshLWOFyFt3IVdYypu5y2Wn2rOO1un6nkqIn8SLXzgIMYXFyYsRWDyF5EthmKJMIdJvk08grg==}
+ engines: {node: ^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0}
+ dependencies:
+ '@sinclair/typebox': 0.24.46
+ dev: true
+
+ /@jest/schemas/29.0.0:
+ resolution: {integrity: sha512-3Ab5HgYIIAnS0HjqJHQYZS+zXc4tUmTmBH3z83ajI6afXp8X3ZtdLX+nXx+I7LNkJD7uN9LAVhgnjDgZa2z0kA==}
+ engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0}
+ dependencies:
+ '@sinclair/typebox': 0.24.46
+ dev: true
+
+ /@jest/source-map/28.1.2:
+ resolution: {integrity: sha512-cV8Lx3BeStJb8ipPHnqVw/IM2VCMWO3crWZzYodSIkxXnRcXJipCdx1JCK0K5MsJJouZQTH73mzf4vgxRaH9ww==}
+ engines: {node: ^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0}
+ dependencies:
+ '@jridgewell/trace-mapping': 0.3.17
+ callsites: 3.1.0
+ graceful-fs: 4.2.10
+ dev: true
+
+ /@jest/test-result/28.1.3:
+ resolution: {integrity: sha512-kZAkxnSE+FqE8YjW8gNuoVkkC9I7S1qmenl8sGcDOLropASP+BkcGKwhXoyqQuGOGeYY0y/ixjrd/iERpEXHNg==}
+ engines: {node: ^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0}
+ dependencies:
+ '@jest/console': 28.1.3
+ '@jest/types': 28.1.3
+ '@types/istanbul-lib-coverage': 2.0.4
+ collect-v8-coverage: 1.0.1
+ dev: true
+
+ /@jest/test-sequencer/28.1.3:
+ resolution: {integrity: sha512-NIMPEqqa59MWnDi1kvXXpYbqsfQmSJsIbnd85mdVGkiDfQ9WQQTXOLsvISUfonmnBT+w85WEgneCigEEdHDFxw==}
+ engines: {node: ^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0}
+ dependencies:
+ '@jest/test-result': 28.1.3
+ graceful-fs: 4.2.10
+ jest-haste-map: 28.1.3
+ slash: 3.0.0
+ dev: true
+
+ /@jest/transform/28.1.3:
+ resolution: {integrity: sha512-u5dT5di+oFI6hfcLOHGTAfmUxFRrjK+vnaP0kkVow9Md/M7V/MxqQMOz/VV25UZO8pzeA9PjfTpOu6BDuwSPQA==}
+ engines: {node: ^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0}
+ dependencies:
+ '@babel/core': 7.19.3
+ '@jest/types': 28.1.3
+ '@jridgewell/trace-mapping': 0.3.17
+ babel-plugin-istanbul: 6.1.1
+ chalk: 4.1.2
+ convert-source-map: 1.9.0
+ fast-json-stable-stringify: 2.1.0
+ graceful-fs: 4.2.10
+ jest-haste-map: 28.1.3
+ jest-regex-util: 28.0.2
+ jest-util: 28.1.3
+ micromatch: 4.0.5
+ pirates: 4.0.5
+ slash: 3.0.0
+ write-file-atomic: 4.0.2
+ transitivePeerDependencies:
+ - supports-color
+ dev: true
+
+ /@jest/types/26.6.2:
+ resolution: {integrity: sha512-fC6QCp7Sc5sX6g8Tvbmj4XUTbyrik0akgRy03yjXbQaBWWNWGE7SGtJk98m0N8nzegD/7SggrUlivxo5ax4KWQ==}
+ engines: {node: '>= 10.14.2'}
+ dependencies:
+ '@types/istanbul-lib-coverage': 2.0.4
+ '@types/istanbul-reports': 3.0.1
+ '@types/node': 17.0.45
+ '@types/yargs': 15.0.14
+ chalk: 4.1.2
+ dev: true
+
+ /@jest/types/28.1.3:
+ resolution: {integrity: sha512-RyjiyMUZrKz/c+zlMFO1pm70DcIlST8AeWTkoUdZevew44wcNZQHsEVOiCVtgVnlFFD82FPaXycys58cf2muVQ==}
+ engines: {node: ^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0}
+ dependencies:
+ '@jest/schemas': 28.1.3
+ '@types/istanbul-lib-coverage': 2.0.4
+ '@types/istanbul-reports': 3.0.1
+ '@types/node': 17.0.45
+ '@types/yargs': 17.0.13
+ chalk: 4.1.2
+ dev: true
+
+ /@jest/types/29.1.2:
+ resolution: {integrity: sha512-DcXGtoTykQB5jiwCmVr8H4vdg2OJhQex3qPkG+ISyDO7xQXbt/4R6dowcRyPemRnkH7JoHvZuxPBdlq+9JxFCg==}
+ engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0}
+ dependencies:
+ '@jest/schemas': 29.0.0
+ '@types/istanbul-lib-coverage': 2.0.4
+ '@types/istanbul-reports': 3.0.1
+ '@types/node': 17.0.45
+ '@types/yargs': 17.0.13
+ chalk: 4.1.2
+ dev: true
+
+ /@jridgewell/gen-mapping/0.1.1:
+ resolution: {integrity: sha512-sQXCasFk+U8lWYEe66WxRDOE9PjVz4vSM51fTu3Hw+ClTpUSQb718772vH3pyS5pShp6lvQM7SxgIDXXXmOX7w==}
+ engines: {node: '>=6.0.0'}
+ dependencies:
+ '@jridgewell/set-array': 1.1.2
+ '@jridgewell/sourcemap-codec': 1.4.14
+
+ /@jridgewell/gen-mapping/0.3.2:
+ resolution: {integrity: sha512-mh65xKQAzI6iBcFzwv28KVWSmCkdRBWoOh+bYQGW3+6OZvbbN3TqMGo5hqYxQniRcH9F2VZIoJCm4pa3BPDK/A==}
+ engines: {node: '>=6.0.0'}
+ dependencies:
+ '@jridgewell/set-array': 1.1.2
+ '@jridgewell/sourcemap-codec': 1.4.14
+ '@jridgewell/trace-mapping': 0.3.17
+
+ /@jridgewell/resolve-uri/3.1.0:
+ resolution: {integrity: sha512-F2msla3tad+Mfht5cJq7LSXcdudKTWCVYUgw6pLFOOHSTtZlj6SWNYAp+AhuqLmWdBO2X5hPrLcu8cVP8fy28w==}
+ engines: {node: '>=6.0.0'}
+
+ /@jridgewell/set-array/1.1.2:
+ resolution: {integrity: sha512-xnkseuNADM0gt2bs+BvhO0p78Mk762YnZdsuzFV018NoG1Sj1SCQvpSqa7XUaTam5vAGasABV9qXASMKnFMwMw==}
+ engines: {node: '>=6.0.0'}
+
+ /@jridgewell/source-map/0.3.2:
+ resolution: {integrity: sha512-m7O9o2uR8k2ObDysZYzdfhb08VuEml5oWGiosa1VdaPZ/A6QyPkAJuwN0Q1lhULOf6B7MtQmHENS743hWtCrgw==}
+ dependencies:
+ '@jridgewell/gen-mapping': 0.3.2
+ '@jridgewell/trace-mapping': 0.3.17
+ dev: true
+
+ /@jridgewell/sourcemap-codec/1.4.14:
+ resolution: {integrity: sha512-XPSJHWmi394fuUuzDnGz1wiKqWfo1yXecHQMRf2l6hztTO+nPru658AyDngaBe7isIxEkRsPR3FZh+s7iVa4Uw==}
+
+ /@jridgewell/trace-mapping/0.3.17:
+ resolution: {integrity: sha512-MCNzAp77qzKca9+W/+I0+sEpaUnZoeasnghNeVc41VZCEKaCH73Vq3BZZ/SzWIgrqE4H4ceI+p+b6C0mHf9T4g==}
+ dependencies:
+ '@jridgewell/resolve-uri': 3.1.0
+ '@jridgewell/sourcemap-codec': 1.4.14
+
+ /@jridgewell/trace-mapping/0.3.9:
+ resolution: {integrity: sha512-3Belt6tdc8bPgAtbcmdtNJlirVoTmEb5e2gC94PnkwEW9jI6CAHUeoG85tjWP5WquqfavoMtMwiG4P926ZKKuQ==}
+ dependencies:
+ '@jridgewell/resolve-uri': 3.1.0
+ '@jridgewell/sourcemap-codec': 1.4.14
+ dev: true
+
+ /@mantine/core/5.5.5_gvitupll27rb22hvbmj7ujagna:
+ resolution: {integrity: sha512-VjNpz5mvV1hg6RbVuLkA9uY+iS3Ocpg9C0ZjnBuMKbDA9TYmpxgLJ1Eo56OMfJvQ03W8qG/prIwY8QNZddtNBg==}
+ peerDependencies:
+ '@mantine/hooks': 5.5.5
+ react: '>=16.8.0'
+ react-dom: '>=16.8.0'
+ dependencies:
+ '@floating-ui/react-dom-interactions': 0.10.1_hiunvzosbwliizyirxfy6hjyim
+ '@mantine/hooks': 5.5.5_react@17.0.2
+ '@mantine/styles': 5.5.5_qawu4fmqw6isfocvbm4ah6kxfm
+ '@mantine/utils': 5.5.5_react@17.0.2
+ '@radix-ui/react-scroll-area': 1.0.0_sfoxds7t5ydpegc3knd667wn6m
+ react: 17.0.2
+ react-dom: 17.0.2_react@17.0.2
+ react-textarea-autosize: 8.3.4_pxzommwrsowkd4kgag6q3sluym
+ transitivePeerDependencies:
+ - '@emotion/react'
+ - '@types/react'
+ dev: false
+
+ /@mantine/dates/5.5.5_z2sva5sclaifqz5eqj4iv3gs3e:
+ resolution: {integrity: sha512-UeHwi2pimhsZQPK24Rl33XFAELxzXxk5HUNM7YZM6ptyrIQIacAYhmjBwAfg6G5UkqCzvOz91P7RYlGSOnUStA==}
+ peerDependencies:
+ '@mantine/core': 5.5.5
+ '@mantine/hooks': 5.5.5
+ dayjs: '>=1.0.0'
+ react: '>=16.8.0'
+ dependencies:
+ '@mantine/core': 5.5.5_gvitupll27rb22hvbmj7ujagna
+ '@mantine/hooks': 5.5.5_react@17.0.2
+ '@mantine/utils': 5.5.5_react@17.0.2
+ dayjs: 1.11.5
+ react: 17.0.2
+ dev: false
+
+ /@mantine/hooks/5.5.5_react@17.0.2:
+ resolution: {integrity: sha512-qWZAZm203s0knYk6Ut4VPvur9H5BMul02cCb9E09s60iSjnLRHDC3f73VmSzmLZNVfgE+7hXUhguR/1lC7js4Q==}
+ peerDependencies:
+ react: '>=16.8.0'
+ dependencies:
+ react: 17.0.2
+ dev: false
+
+ /@mantine/styles/5.5.5_qawu4fmqw6isfocvbm4ah6kxfm:
+ resolution: {integrity: sha512-cAYLoqQbnyoJepD7zstFF+A2/rj8DJblBzEdri0V+CWQccpqfP5xOTPEvCHVwQUODg40uT9PyVwFZ4h+zyyzvg==}
+ peerDependencies:
+ '@emotion/react': '>=11.9.0'
+ react: '>=16.8.0'
+ react-dom: '>=16.8.0'
+ dependencies:
+ '@emotion/react': 11.10.4_e5jlcwkuouknzfjrwezo3gnujm
+ clsx: 1.1.1
+ csstype: 3.0.9
+ react: 17.0.2
+ react-dom: 17.0.2_react@17.0.2
+ dev: false
+
+ /@mantine/utils/5.5.5_react@17.0.2:
+ resolution: {integrity: sha512-nt8+A0N1cV4cJNqlKuXazShoEwqtLohHNKFuywEdF3B6vHWdbY799PbT2WmqGTwNQ+se8y5/nBMmamBZrUN4fg==}
+ peerDependencies:
+ react: '>=16.8.0'
+ dependencies:
+ react: 17.0.2
+ dev: false
+
+ /@nodelib/fs.scandir/2.1.5:
+ resolution: {integrity: sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==}
+ engines: {node: '>= 8'}
+ dependencies:
+ '@nodelib/fs.stat': 2.0.5
+ run-parallel: 1.2.0
+ dev: true
+
+ /@nodelib/fs.stat/2.0.5:
+ resolution: {integrity: sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==}
+ engines: {node: '>= 8'}
+ dev: true
+
+ /@nodelib/fs.walk/1.2.8:
+ resolution: {integrity: sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==}
+ engines: {node: '>= 8'}
+ dependencies:
+ '@nodelib/fs.scandir': 2.1.5
+ fastq: 1.13.0
+ dev: true
+
+ /@radix-ui/number/1.0.0:
+ resolution: {integrity: sha512-Ofwh/1HX69ZfJRiRBMTy7rgjAzHmwe4kW9C9Y99HTRUcYLUuVT0KESFj15rPjRgKJs20GPq8Bm5aEDJ8DuA3vA==}
+ dependencies:
+ '@babel/runtime': 7.19.4
+ dev: false
+
+ /@radix-ui/primitive/1.0.0:
+ resolution: {integrity: sha512-3e7rn8FDMin4CgeL7Z/49smCA3rFYY3Ha2rUQ7HRWFadS5iCRw08ZgVT1LaNTCNqgvrUiyczLflrVrF0SRQtNA==}
+ dependencies:
+ '@babel/runtime': 7.19.4
+ dev: false
+
+ /@radix-ui/react-compose-refs/1.0.0_react@17.0.2:
+ resolution: {integrity: sha512-0KaSv6sx787/hK3eF53iOkiSLwAGlFMx5lotrqD2pTjB18KbybKoEIgkNZTKC60YECDQTKGTRcDBILwZVqVKvA==}
+ peerDependencies:
+ react: ^16.8 || ^17.0 || ^18.0
+ dependencies:
+ '@babel/runtime': 7.19.4
+ react: 17.0.2
+ dev: false
+
+ /@radix-ui/react-context/1.0.0_react@17.0.2:
+ resolution: {integrity: sha512-1pVM9RfOQ+n/N5PJK33kRSKsr1glNxomxONs5c49MliinBY6Yw2Q995qfBUUo0/Mbg05B/sGA0gkgPI7kmSHBg==}
+ peerDependencies:
+ react: ^16.8 || ^17.0 || ^18.0
+ dependencies:
+ '@babel/runtime': 7.19.4
+ react: 17.0.2
+ dev: false
+
+ /@radix-ui/react-direction/1.0.0_react@17.0.2:
+ resolution: {integrity: sha512-2HV05lGUgYcA6xgLQ4BKPDmtL+QbIZYH5fCOTAOOcJ5O0QbWS3i9lKaurLzliYUDhORI2Qr3pyjhJh44lKA3rQ==}
+ peerDependencies:
+ react: ^16.8 || ^17.0 || ^18.0
+ dependencies:
+ '@babel/runtime': 7.19.4
+ react: 17.0.2
+ dev: false
+
+ /@radix-ui/react-presence/1.0.0_sfoxds7t5ydpegc3knd667wn6m:
+ resolution: {integrity: sha512-A+6XEvN01NfVWiKu38ybawfHsBjWum42MRPnEuqPsBZ4eV7e/7K321B5VgYMPv3Xx5An6o1/l9ZuDBgmcmWK3w==}
+ peerDependencies:
+ react: ^16.8 || ^17.0 || ^18.0
+ react-dom: ^16.8 || ^17.0 || ^18.0
+ dependencies:
+ '@babel/runtime': 7.19.4
+ '@radix-ui/react-compose-refs': 1.0.0_react@17.0.2
+ '@radix-ui/react-use-layout-effect': 1.0.0_react@17.0.2
+ react: 17.0.2
+ react-dom: 17.0.2_react@17.0.2
+ dev: false
+
+ /@radix-ui/react-primitive/1.0.0_sfoxds7t5ydpegc3knd667wn6m:
+ resolution: {integrity: sha512-EyXe6mnRlHZ8b6f4ilTDrXmkLShICIuOTTj0GX4w1rp+wSxf3+TD05u1UOITC8VsJ2a9nwHvdXtOXEOl0Cw/zQ==}
+ peerDependencies:
+ react: ^16.8 || ^17.0 || ^18.0
+ react-dom: ^16.8 || ^17.0 || ^18.0
+ dependencies:
+ '@babel/runtime': 7.19.4
+ '@radix-ui/react-slot': 1.0.0_react@17.0.2
+ react: 17.0.2
+ react-dom: 17.0.2_react@17.0.2
+ dev: false
+
+ /@radix-ui/react-scroll-area/1.0.0_sfoxds7t5ydpegc3knd667wn6m:
+ resolution: {integrity: sha512-3SNFukAjS5remgtpAVR9m3Zgo23ZojBZ8V3TCyR3A+56x2mtVqKlPV4+e8rScZUFMuvtbjIdQCmsJBFBazKZig==}
+ peerDependencies:
+ react: ^16.8 || ^17.0 || ^18.0
+ react-dom: ^16.8 || ^17.0 || ^18.0
+ dependencies:
+ '@babel/runtime': 7.19.4
+ '@radix-ui/number': 1.0.0
+ '@radix-ui/primitive': 1.0.0
+ '@radix-ui/react-compose-refs': 1.0.0_react@17.0.2
+ '@radix-ui/react-context': 1.0.0_react@17.0.2
+ '@radix-ui/react-direction': 1.0.0_react@17.0.2
+ '@radix-ui/react-presence': 1.0.0_sfoxds7t5ydpegc3knd667wn6m
+ '@radix-ui/react-primitive': 1.0.0_sfoxds7t5ydpegc3knd667wn6m
+ '@radix-ui/react-use-callback-ref': 1.0.0_react@17.0.2
+ '@radix-ui/react-use-layout-effect': 1.0.0_react@17.0.2
+ react: 17.0.2
+ react-dom: 17.0.2_react@17.0.2
+ dev: false
+
+ /@radix-ui/react-slot/1.0.0_react@17.0.2:
+ resolution: {integrity: sha512-3mrKauI/tWXo1Ll+gN5dHcxDPdm/Df1ufcDLCecn+pnCIVcdWE7CujXo8QaXOWRJyZyQWWbpB8eFwHzWXlv5mQ==}
+ peerDependencies:
+ react: ^16.8 || ^17.0 || ^18.0
+ dependencies:
+ '@babel/runtime': 7.19.4
+ '@radix-ui/react-compose-refs': 1.0.0_react@17.0.2
+ react: 17.0.2
+ dev: false
+
+ /@radix-ui/react-use-callback-ref/1.0.0_react@17.0.2:
+ resolution: {integrity: sha512-GZtyzoHz95Rhs6S63D2t/eqvdFCm7I+yHMLVQheKM7nBD8mbZIt+ct1jz4536MDnaOGKIxynJ8eHTkVGVVkoTg==}
+ peerDependencies:
+ react: ^16.8 || ^17.0 || ^18.0
+ dependencies:
+ '@babel/runtime': 7.19.4
+ react: 17.0.2
+ dev: false
+
+ /@radix-ui/react-use-layout-effect/1.0.0_react@17.0.2:
+ resolution: {integrity: sha512-6Tpkq+R6LOlmQb1R5NNETLG0B4YP0wc+klfXafpUCj6JGyaUc8il7/kUZ7m59rGbXGczE9Bs+iz2qloqsZBduQ==}
+ peerDependencies:
+ react: ^16.8 || ^17.0 || ^18.0
+ dependencies:
+ '@babel/runtime': 7.19.4
+ react: 17.0.2
+ dev: false
+
+ /@react-aria/button/3.5.1_react@17.0.2:
+ resolution: {integrity: sha512-M0AaDeJoM4wu2xkv1FvbhuvWB78yF8yNE91KkyEW+TMBiEjSaij61jyov95m08DT2EXSxuXnch3BoP8s3XHj4g==}
+ peerDependencies:
+ react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0
+ dependencies:
+ '@babel/runtime': 7.19.4
+ '@react-aria/focus': 3.9.0_react@17.0.2
+ '@react-aria/interactions': 3.12.0_react@17.0.2
+ '@react-aria/utils': 3.14.0_react@17.0.2
+ '@react-stately/toggle': 3.4.2_react@17.0.2
+ '@react-types/button': 3.6.2_react@17.0.2
+ react: 17.0.2
+ dev: false
+
+ /@react-aria/checkbox/3.4.1_react@17.0.2:
+ resolution: {integrity: sha512-aTGW7Yo8rXC741GB2FPt0LqtjUm8E0KW2OldskcQuBUk2jSc11q7626VFvagk6bxMuoT+0gKAgehz/+yNHmmzA==}
+ peerDependencies:
+ react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0
+ dependencies:
+ '@babel/runtime': 7.19.4
+ '@react-aria/label': 3.4.2_react@17.0.2
+ '@react-aria/toggle': 3.4.0_react@17.0.2
+ '@react-aria/utils': 3.14.0_react@17.0.2
+ '@react-stately/checkbox': 3.3.0_react@17.0.2
+ '@react-stately/toggle': 3.4.2_react@17.0.2
+ '@react-types/checkbox': 3.4.0_react@17.0.2
+ react: 17.0.2
+ dev: false
+
+ /@react-aria/combobox/3.3.1_sfoxds7t5ydpegc3knd667wn6m:
+ resolution: {integrity: sha512-CIO4I6naPjUdNcpdnDyqTUw8slZcTjKco8awL5tMYP/dDWcxtKbBi2MkfD5OMebGqtGd3KEJYR6WcGJqFV3GHQ==}
+ peerDependencies:
+ react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0
+ react-dom: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0
+ dependencies:
+ '@babel/runtime': 7.19.4
+ '@react-aria/i18n': 3.6.1_react@17.0.2
+ '@react-aria/interactions': 3.12.0_react@17.0.2
+ '@react-aria/listbox': 3.5.1_react@17.0.2
+ '@react-aria/live-announcer': 3.1.1
+ '@react-aria/menu': 3.6.2_sfoxds7t5ydpegc3knd667wn6m
+ '@react-aria/overlays': 3.9.1_sfoxds7t5ydpegc3knd667wn6m
+ '@react-aria/selection': 3.11.0_react@17.0.2
+ '@react-aria/textfield': 3.6.1_react@17.0.2
+ '@react-aria/utils': 3.14.0_react@17.0.2
+ '@react-stately/collections': 3.4.4_react@17.0.2
+ '@react-stately/combobox': 3.2.2_react@17.0.2
+ '@react-stately/layout': 3.8.0_react@17.0.2
+ '@react-types/button': 3.6.2_react@17.0.2
+ '@react-types/combobox': 3.5.4_react@17.0.2
+ '@react-types/shared': 3.15.0_react@17.0.2
+ react: 17.0.2
+ react-dom: 17.0.2_react@17.0.2
+ dev: false
+
+ /@react-aria/dialog/3.4.0_sfoxds7t5ydpegc3knd667wn6m:
+ resolution: {integrity: sha512-h1D7OOe20PhSb4DD40ABVgHMbSA2Y9rSU5lrGf9zuNSYkQIwDz6pTSXp/9roy7SEvf5KAN6zPa1inSVBOTzf3w==}
+ peerDependencies:
+ react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0
+ dependencies:
+ '@babel/runtime': 7.19.4
+ '@react-aria/focus': 3.9.0_react@17.0.2
+ '@react-aria/overlays': 3.11.0_sfoxds7t5ydpegc3knd667wn6m
+ '@react-aria/utils': 3.14.0_react@17.0.2
+ '@react-stately/overlays': 3.4.2_react@17.0.2
+ '@react-types/dialog': 3.4.4_react@17.0.2
+ '@react-types/shared': 3.15.0_react@17.0.2
+ react: 17.0.2
+ transitivePeerDependencies:
+ - react-dom
+ dev: false
+
+ /@react-aria/focus/3.9.0_react@17.0.2:
+ resolution: {integrity: sha512-DwesjEjWjFfwAwzv9qeqkyKZNPAYmPa3UrygxzmXeKEg2JpaACGZPxRcmT2EFJFEDbX8daQDEeRGyLO49o5agg==}
+ peerDependencies:
+ react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0
+ dependencies:
+ '@babel/runtime': 7.19.4
+ '@react-aria/interactions': 3.12.0_react@17.0.2
+ '@react-aria/utils': 3.14.0_react@17.0.2
+ '@react-types/shared': 3.15.0_react@17.0.2
+ clsx: 1.2.1
+ react: 17.0.2
+ dev: false
+
+ /@react-aria/i18n/3.6.1_react@17.0.2:
+ resolution: {integrity: sha512-kAetWsj9HOqwaqLhmFU2udhZ+4QGGYkQOgGBJYdrB7GfLZQ1GPBlZjv3QFdkX4oSf/k9cFqgftxvVQQDYZLOew==}
+ peerDependencies:
+ react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0
+ dependencies:
+ '@babel/runtime': 7.19.4
+ '@internationalized/date': 3.0.1
+ '@internationalized/message': 3.0.9
+ '@internationalized/number': 3.1.1
+ '@internationalized/string': 3.0.0
+ '@react-aria/ssr': 3.3.0_react@17.0.2
+ '@react-aria/utils': 3.14.0_react@17.0.2
+ '@react-types/shared': 3.15.0_react@17.0.2
+ react: 17.0.2
+ dev: false
+
+ /@react-aria/interactions/3.12.0_react@17.0.2:
+ resolution: {integrity: sha512-KcKurjPZwme9ggvGQjbjqZtZtuyXipTBVMHUah9a3+Dz7vXxhRg5vFaEdM79oQnNsrGFW5xS6SKBehl/JG6BMw==}
+ peerDependencies:
+ react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0
+ dependencies:
+ '@babel/runtime': 7.19.4
+ '@react-aria/utils': 3.14.0_react@17.0.2
+ '@react-types/shared': 3.15.0_react@17.0.2
+ react: 17.0.2
+ dev: false
+
+ /@react-aria/label/3.4.2_react@17.0.2:
+ resolution: {integrity: sha512-ctygLrA4yY31440UMZdw21Iz4ogXupLJB5xpTU1KFXcvybSu+H3gvVCOJu1jFwR12bTKnkVogTWT6wwVYH2nFw==}
+ peerDependencies:
+ react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0
+ dependencies:
+ '@babel/runtime': 7.19.4
+ '@react-aria/utils': 3.14.0_react@17.0.2
+ '@react-types/label': 3.7.0_react@17.0.2
+ '@react-types/shared': 3.15.0_react@17.0.2
+ react: 17.0.2
+ dev: false
+
+ /@react-aria/listbox/3.5.1_react@17.0.2:
+ resolution: {integrity: sha512-+wZYQs1M+hrLB8UKPV9aOOhyFa0dC/HrG8ET6uE0nVzYZGcfsR1oDyHCDjB74QCYzmmyTqbzcDruRapheAuXXA==}
+ peerDependencies:
+ react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0
+ dependencies:
+ '@babel/runtime': 7.19.4
+ '@react-aria/focus': 3.9.0_react@17.0.2
+ '@react-aria/interactions': 3.12.0_react@17.0.2
+ '@react-aria/label': 3.4.2_react@17.0.2
+ '@react-aria/selection': 3.11.0_react@17.0.2
+ '@react-aria/utils': 3.14.0_react@17.0.2
+ '@react-stately/collections': 3.4.4_react@17.0.2
+ '@react-stately/list': 3.5.4_react@17.0.2
+ '@react-types/listbox': 3.3.4_react@17.0.2
+ '@react-types/shared': 3.15.0_react@17.0.2
+ react: 17.0.2
+ dev: false
+
+ /@react-aria/live-announcer/3.1.1:
+ resolution: {integrity: sha512-e7b+dRh1SUTla42vzjdbhGYkeLD7E6wIYjYaHW9zZ37rBkSqLHUhTigh3eT3k5NxFlDD/uRxTYuwaFnWQgR+4g==}
+ dependencies:
+ '@babel/runtime': 7.19.4
+ dev: false
+
+ /@react-aria/menu/3.6.2_sfoxds7t5ydpegc3knd667wn6m:
+ resolution: {integrity: sha512-uBZHGuFAtOdoocBVZzoBpZQFJmkt5axlEUKjBgh2BuR5JX8aZiSxyKnfgAeb3aDEi9PZpOp6RWxHzOMBRg4TsA==}
+ peerDependencies:
+ react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0
+ react-dom: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0
+ dependencies:
+ '@babel/runtime': 7.19.4
+ '@react-aria/i18n': 3.6.1_react@17.0.2
+ '@react-aria/interactions': 3.12.0_react@17.0.2
+ '@react-aria/overlays': 3.11.0_sfoxds7t5ydpegc3knd667wn6m
+ '@react-aria/selection': 3.11.0_react@17.0.2
+ '@react-aria/utils': 3.14.0_react@17.0.2
+ '@react-stately/collections': 3.4.4_react@17.0.2
+ '@react-stately/menu': 3.4.2_react@17.0.2
+ '@react-stately/tree': 3.3.4_react@17.0.2
+ '@react-types/button': 3.6.2_react@17.0.2
+ '@react-types/menu': 3.7.2_react@17.0.2
+ '@react-types/shared': 3.15.0_react@17.0.2
+ react: 17.0.2
+ react-dom: 17.0.2_react@17.0.2
+ dev: false
+
+ /@react-aria/overlays/3.11.0_sfoxds7t5ydpegc3knd667wn6m:
+ resolution: {integrity: sha512-NqLqxSiEW9AuUPcEHCIp2lHH1moNxlkP0CkuUMkT2/T5MCPm/Iq+uD53VSR+NyeCWU/aGH3ykj2kq9NSITJkOA==}
+ peerDependencies:
+ react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0
+ react-dom: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0
+ dependencies:
+ '@babel/runtime': 7.19.4
+ '@react-aria/focus': 3.9.0_react@17.0.2
+ '@react-aria/i18n': 3.6.1_react@17.0.2
+ '@react-aria/interactions': 3.12.0_react@17.0.2
+ '@react-aria/ssr': 3.3.0_react@17.0.2
+ '@react-aria/utils': 3.14.0_react@17.0.2
+ '@react-aria/visually-hidden': 3.5.0_react@17.0.2
+ '@react-stately/overlays': 3.4.2_react@17.0.2
+ '@react-types/button': 3.6.2_react@17.0.2
+ '@react-types/overlays': 3.6.4_react@17.0.2
+ '@react-types/shared': 3.15.0_react@17.0.2
+ react: 17.0.2
+ react-dom: 17.0.2_react@17.0.2
+ dev: false
+
+ /@react-aria/overlays/3.9.1_sfoxds7t5ydpegc3knd667wn6m:
+ resolution: {integrity: sha512-gQlM9MQX+RZiX5kxuyX5C2hv7Wm0k1wM4VBfeBmcPbcOGJz3v//GN002PuSUjSTx6eaTNuQeks7Qx0Wovsnd5A==}
+ peerDependencies:
+ react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0
+ react-dom: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0
+ dependencies:
+ '@babel/runtime': 7.19.4
+ '@react-aria/i18n': 3.6.1_react@17.0.2
+ '@react-aria/interactions': 3.12.0_react@17.0.2
+ '@react-aria/utils': 3.14.0_react@17.0.2
+ '@react-aria/visually-hidden': 3.5.0_react@17.0.2
+ '@react-stately/overlays': 3.4.2_react@17.0.2
+ '@react-types/button': 3.6.2_react@17.0.2
+ '@react-types/overlays': 3.6.4_react@17.0.2
+ '@react-types/shared': 3.15.0_react@17.0.2
+ dom-helpers: 5.2.1
+ react: 17.0.2
+ react-dom: 17.0.2_react@17.0.2
+ react-transition-group: 4.4.5_sfoxds7t5ydpegc3knd667wn6m
+ dev: false
+
+ /@react-aria/radio/3.4.0_react@17.0.2:
+ resolution: {integrity: sha512-DUccHQxfI0PikXXQKarh/hLS/G+ZzfdQ00/sd57jzWsuRyukb+WywQhud29p5uO3wT33/MH9LZgSmb9dlvfabQ==}
+ peerDependencies:
+ react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0
+ dependencies:
+ '@babel/runtime': 7.19.4
+ '@react-aria/focus': 3.9.0_react@17.0.2
+ '@react-aria/i18n': 3.6.1_react@17.0.2
+ '@react-aria/interactions': 3.12.0_react@17.0.2
+ '@react-aria/label': 3.4.2_react@17.0.2
+ '@react-aria/utils': 3.14.0_react@17.0.2
+ '@react-stately/radio': 3.6.0_react@17.0.2
+ '@react-types/radio': 3.3.0_react@17.0.2
+ '@react-types/shared': 3.15.0_react@17.0.2
+ react: 17.0.2
+ dev: false
+
+ /@react-aria/searchfield/3.3.1_react@17.0.2:
+ resolution: {integrity: sha512-vIMR5prW0UgHmiCbCcyy5Pvx7tLP+4ZDq34xdGOB0OEOj+qffHdDBOnO+76fx0XC6vw5l+PMiZwFBdNQukz0Qw==}
+ peerDependencies:
+ react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0
+ dependencies:
+ '@babel/runtime': 7.19.4
+ '@react-aria/i18n': 3.6.1_react@17.0.2
+ '@react-aria/interactions': 3.12.0_react@17.0.2
+ '@react-aria/textfield': 3.6.1_react@17.0.2
+ '@react-aria/utils': 3.14.0_react@17.0.2
+ '@react-stately/searchfield': 3.3.2_react@17.0.2
+ '@react-types/button': 3.6.2_react@17.0.2
+ '@react-types/searchfield': 3.3.4_react@17.0.2
+ '@react-types/shared': 3.15.0_react@17.0.2
+ react: 17.0.2
+ dev: false
+
+ /@react-aria/selection/3.11.0_react@17.0.2:
+ resolution: {integrity: sha512-2Qcv0PxXqOrYYT1oL+TOaB+lE/jhIPzVEPHVmf8HYzEMP5WBYP8Q+R9no5s8x++b1W0DsbUVwmk9szY48O9Bmw==}
+ peerDependencies:
+ react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0
+ dependencies:
+ '@babel/runtime': 7.19.4
+ '@react-aria/focus': 3.9.0_react@17.0.2
+ '@react-aria/i18n': 3.6.1_react@17.0.2
+ '@react-aria/interactions': 3.12.0_react@17.0.2
+ '@react-aria/utils': 3.14.0_react@17.0.2
+ '@react-stately/collections': 3.4.4_react@17.0.2
+ '@react-stately/selection': 3.11.0_react@17.0.2
+ '@react-types/shared': 3.15.0_react@17.0.2
+ react: 17.0.2
+ dev: false
+
+ /@react-aria/ssr/3.3.0_react@17.0.2:
+ resolution: {integrity: sha512-yNqUDuOVZIUGP81R87BJVi/ZUZp/nYOBXbPsRe7oltJOfErQZD+UezMpw4vM2KRz18cURffvmC8tJ6JTeyDtaQ==}
+ peerDependencies:
+ react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0
+ dependencies:
+ '@babel/runtime': 7.19.4
+ react: 17.0.2
+ dev: false
+
+ /@react-aria/switch/3.2.4_react@17.0.2:
+ resolution: {integrity: sha512-nXEzXmSs+vTTDyI8YmJVVDEyxSmjkXCdMlPNZJfCO3Bf8PV7V1dt3brKWD7MYOnUKUqzjZU61+A9eC2TG5hkfw==}
+ peerDependencies:
+ react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0
+ dependencies:
+ '@babel/runtime': 7.19.4
+ '@react-aria/toggle': 3.4.0_react@17.0.2
+ '@react-stately/toggle': 3.4.2_react@17.0.2
+ '@react-types/switch': 3.2.4_react@17.0.2
+ react: 17.0.2
+ dev: false
+
+ /@react-aria/textfield/3.6.1_react@17.0.2:
+ resolution: {integrity: sha512-MX0xDIin1rZweEVKqEAqLjw7BsNQjjj8FVopNFzRl2tLxf7C+n/cHLdgwf8uVhHOcl9Vcqx/zeKuuZeB//Dvrg==}
+ peerDependencies:
+ react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0
+ dependencies:
+ '@babel/runtime': 7.19.4
+ '@react-aria/focus': 3.9.0_react@17.0.2
+ '@react-aria/label': 3.4.2_react@17.0.2
+ '@react-aria/utils': 3.14.0_react@17.0.2
+ '@react-types/shared': 3.15.0_react@17.0.2
+ '@react-types/textfield': 3.6.0_react@17.0.2
+ react: 17.0.2
+ dev: false
+
+ /@react-aria/toggle/3.4.0_react@17.0.2:
+ resolution: {integrity: sha512-kQ/CuStB64QcQtT5Kovj4cJ234CotH5et77CP9ctsT37w5lc/t4iDWDTJxf2ju9atPeMh+efqsnRY34lhK2cBA==}
+ peerDependencies:
+ react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0
+ dependencies:
+ '@babel/runtime': 7.19.4
+ '@react-aria/focus': 3.9.0_react@17.0.2
+ '@react-aria/interactions': 3.12.0_react@17.0.2
+ '@react-aria/utils': 3.14.0_react@17.0.2
+ '@react-stately/toggle': 3.4.2_react@17.0.2
+ '@react-types/checkbox': 3.4.0_react@17.0.2
+ '@react-types/shared': 3.15.0_react@17.0.2
+ '@react-types/switch': 3.2.4_react@17.0.2
+ react: 17.0.2
+ dev: false
+
+ /@react-aria/utils/3.14.0_react@17.0.2:
+ resolution: {integrity: sha512-DHgmwNBNEhnb6DEYYAfbt99wprBqJJOBBeIpQ2g3+pxwlw4BZ+v4Qr+rDD0ZibWV0mYzt8zOhZ9StpId7iTF0Q==}
+ peerDependencies:
+ react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0
+ dependencies:
+ '@babel/runtime': 7.19.4
+ '@react-aria/ssr': 3.3.0_react@17.0.2
+ '@react-stately/utils': 3.5.1_react@17.0.2
+ '@react-types/shared': 3.15.0_react@17.0.2
+ clsx: 1.2.1
+ react: 17.0.2
+ dev: false
+
+ /@react-aria/visually-hidden/3.5.0_react@17.0.2:
+ resolution: {integrity: sha512-tF/kCZCGv1yebwgH21cKbhjSV5CmB5/SAHOUM5YkO5V/lIFjaPtywcamIPI8F0JSfrwGF/Z9EqvqBxvIYGRlCA==}
+ peerDependencies:
+ react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0
+ dependencies:
+ '@babel/runtime': 7.19.4
+ '@react-aria/interactions': 3.12.0_react@17.0.2
+ '@react-aria/utils': 3.14.0_react@17.0.2
+ '@react-types/shared': 3.15.0_react@17.0.2
+ clsx: 1.2.1
+ react: 17.0.2
+ dev: false
+
+ /@react-dnd/asap/4.0.1:
+ resolution: {integrity: sha512-kLy0PJDDwvwwTXxqTFNAAllPHD73AycE9ypWeln/IguoGBEbvFcPDbCV03G52bEcC5E+YgupBE0VzHGdC8SIXg==}
+ dev: false
+
+ /@react-dnd/asap/5.0.2:
+ resolution: {integrity: sha512-WLyfoHvxhs0V9U+GTsGilGgf2QsPl6ZZ44fnv0/b8T3nQyvzxidxsg/ZltbWssbsRDlYW8UKSQMTGotuTotZ6A==}
+ dev: false
+
+ /@react-dnd/invariant/2.0.0:
+ resolution: {integrity: sha512-xL4RCQBCBDJ+GRwKTFhGUW8GXa4yoDfJrPbLblc3U09ciS+9ZJXJ3Qrcs/x2IODOdIE5kQxvMmE2UKyqUictUw==}
+ dev: false
+
+ /@react-dnd/invariant/4.0.2:
+ resolution: {integrity: sha512-xKCTqAK/FFauOM9Ta2pswIyT3D8AQlfrYdOi/toTPEhqCuAs1v5tcJ3Y08Izh1cJ5Jchwy9SeAXmMg6zrKs2iw==}
+ dev: false
+
+ /@react-dnd/shallowequal/2.0.0:
+ resolution: {integrity: sha512-Pc/AFTdwZwEKJxFJvlxrSmGe/di+aAOBn60sremrpLo6VI/6cmiUYNNwlI5KNYttg7uypzA3ILPMPgxB2GYZEg==}
+ dev: false
+
+ /@react-stately/checkbox/3.3.0_react@17.0.2:
+ resolution: {integrity: sha512-hYFJzEoreAmUKkcgd3ErDXtEqp65pfawfcygOr/3pe7MUGzl+MaauVUOg6Dh02Bxt+mdSX4mQXbJSfvm+8bmfA==}
+ peerDependencies:
+ react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0
+ dependencies:
+ '@babel/runtime': 7.19.4
+ '@react-stately/toggle': 3.4.2_react@17.0.2
+ '@react-stately/utils': 3.5.1_react@17.0.2
+ '@react-types/checkbox': 3.4.0_react@17.0.2
+ '@react-types/shared': 3.15.0_react@17.0.2
+ react: 17.0.2
+ dev: false
+
+ /@react-stately/collections/3.4.4_react@17.0.2:
+ resolution: {integrity: sha512-gryUYCe6uzqE0ea5frTwOxOPpx/6Z42PRk7KetOh3ddN3Ts0j8XQP08jP1IB/7BC1QidrkHWvDCqGHxRiEjiIg==}
+ peerDependencies:
+ react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0
+ dependencies:
+ '@babel/runtime': 7.19.4
+ '@react-types/shared': 3.15.0_react@17.0.2
+ react: 17.0.2
+ dev: false
+
+ /@react-stately/combobox/3.2.2_react@17.0.2:
+ resolution: {integrity: sha512-kUMxgXskrtwdeEExZkJ9CjF4EJANetj+7970cOevCpy6ePCdrvdgO6+0cMrVvSgZeMaMDZXDIbbF7fqA6w0uXQ==}
+ peerDependencies:
+ react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0
+ dependencies:
+ '@babel/runtime': 7.19.4
+ '@react-stately/list': 3.5.4_react@17.0.2
+ '@react-stately/menu': 3.4.2_react@17.0.2
+ '@react-stately/select': 3.3.2_react@17.0.2
+ '@react-stately/utils': 3.5.1_react@17.0.2
+ '@react-types/combobox': 3.5.4_react@17.0.2
+ '@react-types/shared': 3.15.0_react@17.0.2
+ react: 17.0.2
+ dev: false
+
+ /@react-stately/layout/3.8.0_react@17.0.2:
+ resolution: {integrity: sha512-0cUlkjY42YaGa0u8Z8CgNx8PIsm06zr0cr3HESCfHmvuOOR2q707PcqAd6kKuF/4NjHU4MVfuGp5z9Sm/lnjlA==}
+ peerDependencies:
+ react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0
+ dependencies:
+ '@babel/runtime': 7.19.4
+ '@react-stately/virtualizer': 3.3.1_react@17.0.2
+ '@react-types/grid': 3.1.4_react@17.0.2
+ '@react-types/shared': 3.15.0_react@17.0.2
+ '@react-types/table': 3.3.2_react@17.0.2
+ react: 17.0.2
+ dev: false
+
+ /@react-stately/list/3.5.4_react@17.0.2:
+ resolution: {integrity: sha512-AB0r2RevKVAP2AOQM1JRuCVjS2UUxMJFshA53t8pV+OSVWeyirYccsMR49mWwU60ZnxYqBWVMN+Pl7NTPTnT8w==}
+ peerDependencies:
+ react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0
+ dependencies:
+ '@babel/runtime': 7.19.4
+ '@react-stately/collections': 3.4.4_react@17.0.2
+ '@react-stately/selection': 3.11.0_react@17.0.2
+ '@react-stately/utils': 3.5.1_react@17.0.2
+ '@react-types/shared': 3.15.0_react@17.0.2
+ react: 17.0.2
+ dev: false
+
+ /@react-stately/menu/3.4.2_react@17.0.2:
+ resolution: {integrity: sha512-vFC8EloVEcqf6sgiP6ABIkC41ytjoJiGtj7Ws5OS7PvZNyxxDgJr4V0O3Pxd1T0AjlHCloBbojnvoTRwZiSr/A==}
+ peerDependencies:
+ react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0
+ dependencies:
+ '@babel/runtime': 7.19.4
+ '@react-stately/overlays': 3.4.2_react@17.0.2
+ '@react-stately/utils': 3.5.1_react@17.0.2
+ '@react-types/menu': 3.7.2_react@17.0.2
+ '@react-types/shared': 3.15.0_react@17.0.2
+ react: 17.0.2
+ dev: false
+
+ /@react-stately/overlays/3.4.2_react@17.0.2:
+ resolution: {integrity: sha512-UTCnn0aT+JL4ZhYPQYUWHwhmuR2T3vKTFUEZeZN9sTuDCctg08VfGoASJx8qofqkLwYJXeb8D5PMhhTDPiUQPw==}
+ peerDependencies:
+ react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0
+ dependencies:
+ '@babel/runtime': 7.19.4
+ '@react-stately/utils': 3.5.1_react@17.0.2
+ '@react-types/overlays': 3.6.4_react@17.0.2
+ react: 17.0.2
+ dev: false
+
+ /@react-stately/radio/3.6.0_react@17.0.2:
+ resolution: {integrity: sha512-hzNwIapDSnbk5mCim/AgHQTtHRgy2QiW95okfVnGflzO7nnws8WH/s2Va4f7UupWObPv8XTqHADUEng86mVBJA==}
+ peerDependencies:
+ react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0
+ dependencies:
+ '@babel/runtime': 7.19.4
+ '@react-stately/utils': 3.5.1_react@17.0.2
+ '@react-types/radio': 3.3.0_react@17.0.2
+ '@react-types/shared': 3.15.0_react@17.0.2
+ react: 17.0.2
+
+ /@react-stately/searchfield/3.3.2_react@17.0.2:
+ resolution: {integrity: sha512-4MTpoqE1M/3aWb/Feau0QpQcjOEK3i8apyA7g9ltY5OtcwHMXDXXk9i3Pg4itk2CXqOY2LuJ+vHCctSnEAm9vw==}
+ peerDependencies:
+ react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0
+ dependencies:
+ '@babel/runtime': 7.19.4
+ '@react-stately/utils': 3.5.1_react@17.0.2
+ '@react-types/searchfield': 3.3.4_react@17.0.2
+ '@react-types/shared': 3.15.0_react@17.0.2
+ react: 17.0.2
+ dev: false
+
+ /@react-stately/select/3.3.2_react@17.0.2:
+ resolution: {integrity: sha512-/C9fW7HT+V9XnmSTiZZqH5cn+ifY9vdXvIKDbUyna98lFHtDgn7i/UvD5edunOGY0qqSMIO3kJ6/BiNg+gpn6Q==}
+ peerDependencies:
+ react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0
+ dependencies:
+ '@babel/runtime': 7.19.4
+ '@react-stately/collections': 3.4.4_react@17.0.2
+ '@react-stately/list': 3.5.4_react@17.0.2
+ '@react-stately/menu': 3.4.2_react@17.0.2
+ '@react-stately/selection': 3.11.0_react@17.0.2
+ '@react-stately/utils': 3.5.1_react@17.0.2
+ '@react-types/select': 3.6.4_react@17.0.2
+ '@react-types/shared': 3.15.0_react@17.0.2
+ react: 17.0.2
+ dev: false
+
+ /@react-stately/selection/3.11.0_react@17.0.2:
+ resolution: {integrity: sha512-cBgDzH+AY+bMEROJbcZFdhbMk0vgiwyqBB8ZKLtCL7EOHs2xeynTAohRM+/t27U/tF91o4qHPFo67Tkxrd16Bg==}
+ peerDependencies:
+ react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0
+ dependencies:
+ '@babel/runtime': 7.19.4
+ '@react-stately/collections': 3.4.4_react@17.0.2
+ '@react-stately/utils': 3.5.1_react@17.0.2
+ '@react-types/shared': 3.15.0_react@17.0.2
+ react: 17.0.2
+ dev: false
+
+ /@react-stately/toggle/3.4.2_react@17.0.2:
+ resolution: {integrity: sha512-+pO13Ap/tj4optu6VjQrEAaAoZvJAEwarMUaZvrkc0kdvMTNPdiT/2vhN32yvsSW0ssuFqToa3jMrTylCbpo8w==}
+ peerDependencies:
+ react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0
+ dependencies:
+ '@babel/runtime': 7.19.4
+ '@react-stately/utils': 3.5.1_react@17.0.2
+ '@react-types/checkbox': 3.4.0_react@17.0.2
+ '@react-types/shared': 3.15.0_react@17.0.2
+ react: 17.0.2
+ dev: false
+
+ /@react-stately/tree/3.3.4_react@17.0.2:
+ resolution: {integrity: sha512-CBgXvwa9qYBsJuxrAiVgGnm48eSxLe/6OjPMwH1pWf4s383Mx73MbbN4fS0oWDeXBVgdqz5/Xg/p8nvPIvl3WQ==}
+ peerDependencies:
+ react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0
+ dependencies:
+ '@babel/runtime': 7.19.4
+ '@react-stately/collections': 3.4.4_react@17.0.2
+ '@react-stately/selection': 3.11.0_react@17.0.2
+ '@react-stately/utils': 3.5.1_react@17.0.2
+ '@react-types/shared': 3.15.0_react@17.0.2
+ react: 17.0.2
+ dev: false
+
+ /@react-stately/utils/3.5.1_react@17.0.2:
+ resolution: {integrity: sha512-INeQ5Er2Jm+db8Py4upKBtgfzp3UYgwXYmbU/XJn49Xw27ktuimH9e37qP3bgHaReb5L3g8IrGs38tJUpnGPHA==}
+ peerDependencies:
+ react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0
+ dependencies:
+ '@babel/runtime': 7.19.4
+ react: 17.0.2
+
+ /@react-stately/virtualizer/3.3.1_react@17.0.2:
+ resolution: {integrity: sha512-1bjvrLLto3TewJRfe4bCrRKYUAdE6lPB9fn3kQhpxbWb4KW1Xl7ar/waL7JDzpwxTBbwzbxCS6nL03YxSt5tIw==}
+ peerDependencies:
+ react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0
+ dependencies:
+ '@babel/runtime': 7.19.4
+ '@react-aria/utils': 3.14.0_react@17.0.2
+ '@react-types/shared': 3.15.0_react@17.0.2
+ react: 17.0.2
+ dev: false
+
+ /@react-types/button/3.6.2_react@17.0.2:
+ resolution: {integrity: sha512-qgrYT6yiGVuZSPbzeDT6kTREQVxzJ9p5chV+JX7G5Rpjl2vyUDkEhZ5V/AHLKguBALgFaWJvjtwejHQ7FtycTw==}
+ peerDependencies:
+ react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0
+ dependencies:
+ '@react-types/shared': 3.15.0_react@17.0.2
+ react: 17.0.2
+
+ /@react-types/checkbox/3.4.0_react@17.0.2:
+ resolution: {integrity: sha512-ZDqbtAYWWSGPjL4ydinaWHrD65Qft9yEGA6BCKQTxdJCgxiXxgGkA3pI7Sxwk+OulR+O0CYJ1JROExM9cSJyyQ==}
+ peerDependencies:
+ react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0
+ dependencies:
+ '@react-types/shared': 3.15.0_react@17.0.2
+ react: 17.0.2
+
+ /@react-types/combobox/3.5.4_react@17.0.2:
+ resolution: {integrity: sha512-boVrxvARZBuhZSmhcaShty/JXaJRKNm3fx0zKcqyfB8iFpszltMfv2w23cRzc8BVA5bA6RRTsiKf8hEjkqFnxg==}
+ peerDependencies:
+ react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0
+ dependencies:
+ '@react-types/shared': 3.15.0_react@17.0.2
+ react: 17.0.2
+
+ /@react-types/dialog/3.4.4_react@17.0.2:
+ resolution: {integrity: sha512-mBaoQn+2nd14j0WSTfqGMb8dfG6Nak4+S9HqbJeP6UjKfwnmF8aXQ/Z3EYPNcwwDB+fNYStPagxRdBeqJ1GK4g==}
+ peerDependencies:
+ react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0
+ dependencies:
+ '@react-types/overlays': 3.6.4_react@17.0.2
+ '@react-types/shared': 3.15.0_react@17.0.2
+ react: 17.0.2
+ dev: false
+
+ /@react-types/grid/3.1.4_react@17.0.2:
+ resolution: {integrity: sha512-i9f2VEnlex5BFV/AdSUGg71xoukn2i/XT2VLxUXUagy23gFxKJk9Xr3BT9bw+pRRLPwm/Ib+h9ELUdgi8lUAKA==}
+ peerDependencies:
+ react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0
+ dependencies:
+ '@react-types/shared': 3.15.0_react@17.0.2
+ react: 17.0.2
+ dev: false
+
+ /@react-types/label/3.7.0_react@17.0.2:
+ resolution: {integrity: sha512-33iQQ3aC34+yKECvSHJ8DDWwd32rm2TZhABX513DYwuCupIxs+BrgHvcfp2YLmz2Fh5UTMSfJXDA74Tbd0XwLg==}
+ peerDependencies:
+ react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0
+ dependencies:
+ '@react-types/shared': 3.15.0_react@17.0.2
+ react: 17.0.2
+ dev: false
+
+ /@react-types/listbox/3.3.4_react@17.0.2:
+ resolution: {integrity: sha512-/wKUxIj/F7JekEFpsxQS4Za3OqwKop3orD67tmJh9xD8Abcj+YjGVNrjQuBvbq1hzTPgefNrb42Y4aqnqZojIg==}
+ peerDependencies:
+ react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0
+ dependencies:
+ '@react-types/shared': 3.15.0_react@17.0.2
+ react: 17.0.2
+ dev: false
+
+ /@react-types/menu/3.7.2_react@17.0.2:
+ resolution: {integrity: sha512-BXMWrT3VCP6NTf0y7v1YYqRJNXkUKLzGXI+n7Qv9+aiZZfd3NNMyk20byHczhFoT2yuCcU5xhyOXzkxSo6ew3A==}
+ peerDependencies:
+ react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0
+ dependencies:
+ '@react-types/overlays': 3.6.4_react@17.0.2
+ '@react-types/shared': 3.15.0_react@17.0.2
+ react: 17.0.2
+ dev: false
+
+ /@react-types/overlays/3.6.4_react@17.0.2:
+ resolution: {integrity: sha512-REC4IyDUHS5WhwxMxcvTo+LdrvlSYpJKjyYkPFtJoDBpM3gmXfakTY3KW6K5eZkFv3TnmXjDF9Q2yboEk2u6WQ==}
+ peerDependencies:
+ react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0
+ dependencies:
+ '@react-types/shared': 3.15.0_react@17.0.2
+ react: 17.0.2
+ dev: false
+
+ /@react-types/radio/3.3.0_react@17.0.2:
+ resolution: {integrity: sha512-aF4OpGjd9/xuRnDSDJnmwzLvvOENUWSHQc//wp8rViCWf1uinY4wHI/J3uEhodhsUPAKmrqvUagphRoyXWZA8A==}
+ peerDependencies:
+ react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0
+ dependencies:
+ '@react-types/shared': 3.15.0_react@17.0.2
+ react: 17.0.2
+
+ /@react-types/searchfield/3.3.4_react@17.0.2:
+ resolution: {integrity: sha512-NuzNTfP80qnCn+gJJMB/Fv1AhPjrSZyB2m0fVrss0Ua5bmtScxMhXA5Pak3aTDyn3xne2r97LwcAaCdsaDnD1w==}
+ peerDependencies:
+ react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0
+ dependencies:
+ '@react-types/shared': 3.15.0_react@17.0.2
+ '@react-types/textfield': 3.6.0_react@17.0.2
+ react: 17.0.2
+ dev: false
+
+ /@react-types/select/3.6.4_react@17.0.2:
+ resolution: {integrity: sha512-lbiv7XUEdByluILjEAYVZic2uq4pU0BzW+qZ+sBCYn7v8q2hxXP7T0C6OamzfgXokQHhJ6247JDk7kugqXKL4Q==}
+ peerDependencies:
+ react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0
+ dependencies:
+ '@react-types/shared': 3.15.0_react@17.0.2
+ react: 17.0.2
+ dev: false
+
+ /@react-types/shared/3.15.0_react@17.0.2:
+ resolution: {integrity: sha512-hwuE4BmgswqP+HRDSLMj7DcnYOCCK+ZRuKnc9AVhXS4LBrwRSkdUkNvXhgvqF5tav7IqTpG9pBYMR9wedehuhA==}
+ peerDependencies:
+ react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0
+ dependencies:
+ react: 17.0.2
+
+ /@react-types/switch/3.2.4_react@17.0.2:
+ resolution: {integrity: sha512-LFrt8fbEu2QXoZ9FLYLmorCMTrQ3WmvkKpRYaMSj81COxXwIHbByZlH/nzL278fU40GkZGXz2f6ffEYeuc9Vcg==}
+ peerDependencies:
+ react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0
+ dependencies:
+ '@react-types/checkbox': 3.4.0_react@17.0.2
+ '@react-types/shared': 3.15.0_react@17.0.2
+ react: 17.0.2
+
+ /@react-types/table/3.3.2_react@17.0.2:
+ resolution: {integrity: sha512-BIYehWSfvPRkneKKKB7YEWD4wZAVVLBf2N0M2jjsVdshK9ZpjQPgOMI6YKjiWGC/ZLZFrAysKRploaIw4Cb+TQ==}
+ peerDependencies:
+ react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0
+ dependencies:
+ '@react-types/grid': 3.1.4_react@17.0.2
+ '@react-types/shared': 3.15.0_react@17.0.2
+ react: 17.0.2
+ dev: false
+
+ /@react-types/textfield/3.6.0_react@17.0.2:
+ resolution: {integrity: sha512-fEa/lTqpWBn7ZE0cDsc700OhTBAxiy8ifm8AQcLYfZuRX4zqRoMpkXMWN0XMjYfoZzNrS0LJJ6pLBHTwrlXWWA==}
+ peerDependencies:
+ react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0
+ dependencies:
+ '@react-types/shared': 3.15.0_react@17.0.2
+ react: 17.0.2
+ dev: false
+
+ /@remix-run/router/1.0.2:
+ resolution: {integrity: sha512-GRSOFhJzjGN+d4sKHTMSvNeUPoZiDHWmRnXfzaxrqe7dE/Nzlc8BiMSJdLDESZlndM7jIUrZ/F4yWqVYlI0rwQ==}
+ engines: {node: '>=14'}
+ dev: false
+
+ /@sinclair/typebox/0.24.46:
+ resolution: {integrity: sha512-ng4ut1z2MCBhK/NwDVwIQp3pAUOCs/KNaW3cBxdFB2xTDrOuo1xuNmpr/9HHFhxqIvHrs1NTH3KJg6q+JSy1Kw==}
+ dev: true
+
+ /@sinonjs/commons/1.8.3:
+ resolution: {integrity: sha512-xkNcLAn/wZaX14RPlwizcKicDk9G3F8m2nU3L7Ukm5zBgTwiT0wsoFAHx9Jq56fJA1z/7uKGtCRu16sOUCLIHQ==}
+ dependencies:
+ type-detect: 4.0.8
+ dev: true
+
+ /@sinonjs/fake-timers/9.1.2:
+ resolution: {integrity: sha512-BPS4ynJW/o92PUR4wgriz2Ud5gpST5vz6GQfMixEDK0Z8ZCUv2M7SkBLykH56T++Xs+8ln9zTGbOvNGIe02/jw==}
+ dependencies:
+ '@sinonjs/commons': 1.8.3
+ dev: true
+
+ /@testing-library/dom/7.31.2:
+ resolution: {integrity: sha512-3UqjCpey6HiTZT92vODYLPxTBWlM8ZOOjr3LX5F37/VRipW2M1kX6I/Cm4VXzteZqfGfagg8yXywpcOgQBlNsQ==}
+ engines: {node: '>=10'}
+ dependencies:
+ '@babel/code-frame': 7.18.6
+ '@babel/runtime': 7.19.4
+ '@types/aria-query': 4.2.2
+ aria-query: 4.2.2
+ chalk: 4.1.2
+ dom-accessibility-api: 0.5.14
+ lz-string: 1.4.4
+ pretty-format: 26.6.2
+ dev: true
+
+ /@testing-library/dom/8.19.0:
+ resolution: {integrity: sha512-6YWYPPpxG3e/xOo6HIWwB/58HukkwIVTOaZ0VwdMVjhRUX/01E4FtQbck9GazOOj7MXHc5RBzMrU86iBJHbI+A==}
+ engines: {node: '>=12'}
+ dependencies:
+ '@babel/code-frame': 7.18.6
+ '@babel/runtime': 7.19.4
+ '@types/aria-query': 4.2.2
+ aria-query: 5.0.2
+ chalk: 4.1.2
+ dom-accessibility-api: 0.5.14
+ lz-string: 1.4.4
+ pretty-format: 27.5.1
+ dev: true
+
+ /@testing-library/jest-dom/5.16.5:
+ resolution: {integrity: sha512-N5ixQ2qKpi5OLYfwQmUb/5mSV9LneAcaUfp32pn4yCnpb8r/Yz0pXFPck21dIicKmi+ta5WRAknkZCfA8refMA==}
+ engines: {node: '>=8', npm: '>=6', yarn: '>=1'}
+ dependencies:
+ '@adobe/css-tools': 4.0.1
+ '@babel/runtime': 7.19.4
+ '@types/testing-library__jest-dom': 5.14.5
+ aria-query: 5.0.2
+ chalk: 3.0.0
+ css.escape: 1.5.1
+ dom-accessibility-api: 0.5.14
+ lodash: 4.17.21
+ redent: 3.0.0
+ dev: true
+
+ /@testing-library/react-hooks/5.1.3_7qv3rjnqa3j7exc7qtvho7thru:
+ resolution: {integrity: sha512-UdEUtlQapQ579NEcXDAUE275u+KUsPtxW7NmFrNt0bE6lW8lqNCyxDK0RSuECmNZ/S0/fgP00W9RWRhVKO/hRg==}
+ peerDependencies:
+ react: '>=16.9.0'
+ react-dom: '>=16.9.0'
+ react-test-renderer: '>=16.9.0'
+ peerDependenciesMeta:
+ react-dom:
+ optional: true
+ react-test-renderer:
+ optional: true
+ dependencies:
+ '@babel/runtime': 7.19.4
+ '@types/react': 17.0.50
+ '@types/react-dom': 17.0.17
+ '@types/react-test-renderer': 18.0.0
+ filter-console: 0.1.1
+ react: 17.0.2
+ react-dom: 17.0.2_react@17.0.2
+ react-error-boundary: 3.1.4_react@17.0.2
+ react-test-renderer: 17.0.2_react@17.0.2
+ dev: true
+
+ /@testing-library/react/11.2.7_sfoxds7t5ydpegc3knd667wn6m:
+ resolution: {integrity: sha512-tzRNp7pzd5QmbtXNG/mhdcl7Awfu/Iz1RaVHY75zTdOkmHCuzMhRL83gWHSgOAcjS3CCbyfwUHMZgRJb4kAfpA==}
+ engines: {node: '>=10'}
+ peerDependencies:
+ react: '*'
+ react-dom: '*'
+ dependencies:
+ '@babel/runtime': 7.19.4
+ '@testing-library/dom': 7.31.2
+ react: 17.0.2
+ react-dom: 17.0.2_react@17.0.2
+ dev: true
+
+ /@testing-library/user-event/14.4.3_aaq3sbffpfe3jnxzm2zngsddei:
+ resolution: {integrity: sha512-kCUc5MEwaEMakkO5x7aoD+DLi02ehmEM2QCGWvNqAS1dV/fAvORWEjnjsEIvml59M7Y5kCkWN6fCCyPOe8OL6Q==}
+ engines: {node: '>=12', npm: '>=6'}
+ peerDependencies:
+ '@testing-library/dom': '>=7.21.4'
+ dependencies:
+ '@testing-library/dom': 8.19.0
+ dev: true
+
+ /@tootallnate/once/2.0.0:
+ resolution: {integrity: sha512-XCuKFP5PS55gnMVu3dty8KPatLqUoy/ZYzDzAGCQ8JNFCkLXzmI7vNHCR+XpbZaMWQK/vQubr7PkYq8g470J/A==}
+ engines: {node: '>= 10'}
+ dev: true
+
+ /@tsconfig/node10/1.0.9:
+ resolution: {integrity: sha512-jNsYVVxU8v5g43Erja32laIDHXeoNvFEpX33OK4d6hljo3jDhCBDhx5dhCCTMWUojscpAagGiRkBKxpdl9fxqA==}
+ dev: true
+
+ /@tsconfig/node12/1.0.11:
+ resolution: {integrity: sha512-cqefuRsh12pWyGsIoBKJA9luFu3mRxCA+ORZvA4ktLSzIuCUtWVxGIuXigEwO5/ywWFMZ2QEGKWvkZG1zDMTag==}
+ dev: true
+
+ /@tsconfig/node14/1.0.3:
+ resolution: {integrity: sha512-ysT8mhdixWK6Hw3i1V2AeRqZ5WfXg1G43mqoYlM2nc6388Fq5jcXyr5mRsqViLx/GJYdoL0bfXD8nmF+Zn/Iow==}
+ dev: true
+
+ /@tsconfig/node16/1.0.3:
+ resolution: {integrity: sha512-yOlFc+7UtL/89t2ZhjPvvB/DeAr3r+Dq58IgzsFkOAvVC6NMJXmCGjbptdXdR9qsX7pKcTL+s87FtYREi2dEEQ==}
+ dev: true
+
+ /@types/aria-query/4.2.2:
+ resolution: {integrity: sha512-HnYpAE1Y6kRyKM/XkEuiRQhTHvkzMBurTHnpFLYLBGPIylZNPs9jJcuOOYWxPLJCSEtmZT0Y8rHDokKN7rRTig==}
+ dev: true
+
+ /@types/babel__core/7.1.19:
+ resolution: {integrity: sha512-WEOTgRsbYkvA/KCsDwVEGkd7WAr1e3g31VHQ8zy5gul/V1qKullU/BU5I68X5v7V3GnB9eotmom4v5a5gjxorw==}
+ dependencies:
+ '@babel/parser': 7.19.4
+ '@babel/types': 7.19.4
+ '@types/babel__generator': 7.6.4
+ '@types/babel__template': 7.4.1
+ '@types/babel__traverse': 7.18.2
+ dev: true
+
+ /@types/babel__generator/7.6.4:
+ resolution: {integrity: sha512-tFkciB9j2K755yrTALxD44McOrk+gfpIpvC3sxHjRawj6PfnQxrse4Clq5y/Rq+G3mrBurMax/lG8Qn2t9mSsg==}
+ dependencies:
+ '@babel/types': 7.19.4
+ dev: true
+
+ /@types/babel__template/7.4.1:
+ resolution: {integrity: sha512-azBFKemX6kMg5Io+/rdGT0dkGreboUVR0Cdm3fz9QJWpaQGJRQXl7C+6hOTCZcMll7KFyEQpgbYI2lHdsS4U7g==}
+ dependencies:
+ '@babel/parser': 7.19.4
+ '@babel/types': 7.19.4
+ dev: true
+
+ /@types/babel__traverse/7.18.2:
+ resolution: {integrity: sha512-FcFaxOr2V5KZCviw1TnutEMVUVsGt4D2hP1TAfXZAMKuHYW3xQhe3jTxNPWutgCJ3/X1c5yX8ZoGVEItxKbwBg==}
+ dependencies:
+ '@babel/types': 7.19.4
+ dev: true
+
+ /@types/color-convert/2.0.0:
+ resolution: {integrity: sha512-m7GG7IKKGuJUXvkZ1qqG3ChccdIM/qBBo913z+Xft0nKCX4hAU/IxKwZBU4cpRZ7GS5kV4vOblUkILtSShCPXQ==}
+ dependencies:
+ '@types/color-name': 1.1.1
+ dev: true
+
+ /@types/color-name/1.1.1:
+ resolution: {integrity: sha512-rr+OQyAjxze7GgWrSaJwydHStIhHq2lvY3BOC2Mj7KnzI7XK0Uw1TOOdI9lDoajEbSWLiYgoo4f1R51erQfhPQ==}
+ dev: true
+
+ /@types/color/3.0.3:
+ resolution: {integrity: sha512-X//qzJ3d3Zj82J9sC/C18ZY5f43utPbAJ6PhYt/M7uG6etcF6MRpKdN880KBy43B0BMzSfeT96MzrsNjFI3GbA==}
+ dependencies:
+ '@types/color-convert': 2.0.0
+ dev: true
+
+ /@types/crypto-js/4.1.1:
+ resolution: {integrity: sha512-BG7fQKZ689HIoc5h+6D2Dgq1fABRa0RbBWKBd9SP/MVRVXROflpm5fhwyATX5duFmbStzyzyycPB8qUYKDH3NA==}
+ dev: true
+
+ /@types/cytoscape/3.19.9:
+ resolution: {integrity: sha512-oqCx0ZGiBO0UESbjgq052vjDAy2X53lZpMrWqiweMpvVwKw/2IiYDdzPFK6+f4tMfdv9YKEM9raO5bAZc3UYBg==}
+ dev: true
+
+ /@types/eslint-scope/3.7.4:
+ resolution: {integrity: sha512-9K4zoImiZc3HlIp6AVUDE4CWYx22a+lhSZMYNpbjW04+YF0KWj4pJXnEMjdnFTiQibFFmElcsasJXDbdI/EPhA==}
+ dependencies:
+ '@types/eslint': 8.4.6
+ '@types/estree': 0.0.51
+ dev: true
+
+ /@types/eslint/8.4.6:
+ resolution: {integrity: sha512-/fqTbjxyFUaYNO7VcW5g+4npmqVACz1bB7RTHYuLj+PRjw9hrCwrUXVQFpChUS0JsyEFvMZ7U/PfmvWgxJhI9g==}
+ dependencies:
+ '@types/estree': 0.0.51
+ '@types/json-schema': 7.0.11
+ dev: true
+
+ /@types/estree/0.0.51:
+ resolution: {integrity: sha512-CuPgU6f3eT/XgKKPqKd/gLZV1Xmvf1a2R5POBOGQa6uv82xpls89HU5zKeVoyR8XzHd1RGNOlQlvUe3CFkjWNQ==}
+ dev: true
+
+ /@types/file-saver/2.0.5:
+ resolution: {integrity: sha512-zv9kNf3keYegP5oThGLaPk8E081DFDuwfqjtiTzm6PoxChdJ1raSuADf2YGCVIyrSynLrgc8JWv296s7Q7pQSQ==}
+ dev: true
+
+ /@types/graceful-fs/4.1.5:
+ resolution: {integrity: sha512-anKkLmZZ+xm4p8JWBf4hElkM4XR+EZeA2M9BAkkTldmcyDY4mbdIJnRghDJH3Ov5ooY7/UAoENtmdMSkaAd7Cw==}
+ dependencies:
+ '@types/node': 17.0.45
+ dev: true
+
+ /@types/history/4.7.11:
+ resolution: {integrity: sha512-qjDJRrmvBMiTx+jyLxvLfJU7UznFuokDv4f3WRuriHKERccVpFU+8XMQUAbDzoiJCsmexxRExQeMwwCdamSKDA==}
+ dev: true
+
+ /@types/hoist-non-react-statics/3.3.1:
+ resolution: {integrity: sha512-iMIqiko6ooLrTh1joXodJK5X9xeEALT1kM5G3ZLhD3hszxBdIEd5C75U834D9mLcINgD4OyZf5uQXjkuYydWvA==}
+ dependencies:
+ '@types/react': 17.0.50
+ hoist-non-react-statics: 3.3.2
+ dev: false
+
+ /@types/istanbul-lib-coverage/2.0.4:
+ resolution: {integrity: sha512-z/QT1XN4K4KYuslS23k62yDIDLwLFkzxOuMplDtObz0+y7VqJCaO2o+SPwHCvLFZh7xazvvoor2tA/hPz9ee7g==}
+ dev: true
+
+ /@types/istanbul-lib-report/3.0.0:
+ resolution: {integrity: sha512-plGgXAPfVKFoYfa9NpYDAkseG+g6Jr294RqeqcqDixSbU34MZVJRi/P+7Y8GDpzkEwLaGZZOpKIEmeVZNtKsrg==}
+ dependencies:
+ '@types/istanbul-lib-coverage': 2.0.4
+ dev: true
+
+ /@types/istanbul-reports/3.0.1:
+ resolution: {integrity: sha512-c3mAZEuK0lvBp8tmuL74XRKn1+y2dcwOUpH7x4WrF6gk1GIgiluDRgMYQtw2OFcBvAJWlt6ASU3tSqxp0Uu0Aw==}
+ dependencies:
+ '@types/istanbul-lib-report': 3.0.0
+ dev: true
+
+ /@types/jest/26.0.24:
+ resolution: {integrity: sha512-E/X5Vib8BWqZNRlDxj9vYXhsDwPYbPINqKF9BsnSoon4RQ0D9moEuLD8txgyypFLH7J4+Lho9Nr/c8H0Fi+17w==}
+ dependencies:
+ jest-diff: 26.6.2
+ pretty-format: 26.6.2
+ dev: true
+
+ /@types/jsdom/20.0.0:
+ resolution: {integrity: sha512-YfAchFs0yM1QPDrLm2VHe+WHGtqms3NXnXAMolrgrVP6fgBHHXy1ozAbo/dFtPNtZC/m66bPiCTWYmqp1F14gA==}
+ dependencies:
+ '@types/node': 17.0.45
+ '@types/tough-cookie': 4.0.2
+ parse5: 7.1.1
+ dev: true
+
+ /@types/json-schema/7.0.11:
+ resolution: {integrity: sha512-wOuvG1SN4Us4rez+tylwwwCV1psiNVOkJeM3AUWUNWg/jDQY2+HE/444y5gc+jBmRqASOm2Oeh5c1axHobwRKQ==}
+ dev: true
+
+ /@types/lodash/4.14.186:
+ resolution: {integrity: sha512-eHcVlLXP0c2FlMPm56ITode2AgLMSa6aJ05JTTbYbI+7EMkCEE5qk2E41d5g2lCVTqRe0GnnRFurmlCsDODrPw==}
+ dev: true
+
+ /@types/node/17.0.45:
+ resolution: {integrity: sha512-w+tIMs3rq2afQdsPJlODhoUEKzFP1ayaoyl1CcnwtIlsVe7K7bA1NGm4s3PraqTLlXnbIN84zuBlxBWo1u9BLw==}
+ dev: true
+
+ /@types/papaparse/5.3.5:
+ resolution: {integrity: sha512-R1icl/hrJPFRpuYj9PVG03WBAlghJj4JW9Py5QdR8FFSxaLmZRyu7xYDCCBZIJNfUv3MYaeBbhBoX958mUTAaw==}
+ dependencies:
+ '@types/node': 17.0.45
+ dev: true
+
+ /@types/parse-json/4.0.0:
+ resolution: {integrity: sha512-//oorEZjL6sbPcKUaCdIGlIUeH26mgzimjBB77G6XRgnDl/L5wOnpyBGRe/Mmf5CVW3PwEBE1NjiMZ/ssFh4wA==}
+ dev: false
+
+ /@types/prettier/2.7.1:
+ resolution: {integrity: sha512-ri0UmynRRvZiiUJdiz38MmIblKK+oH30MztdBVR95dv/Ubw6neWSb8u1XpRb72L4qsZOhz+L+z9JD40SJmfWow==}
+ dev: true
+
+ /@types/prop-types/15.7.5:
+ resolution: {integrity: sha512-JCB8C6SnDoQf0cNycqd/35A7MjcnK+ZTqE7judS6o7utxUCg6imJg3QK2qzHKszlTjcj2cn+NwMB2i96ubpj7w==}
+
+ /@types/react-beautiful-dnd/13.1.2:
+ resolution: {integrity: sha512-+OvPkB8CdE/bGdXKyIhc/Lm2U7UAYCCJgsqmopFmh9gbAudmslkI8eOrPDjg4JhwSE6wytz4a3/wRjKtovHVJg==}
+ dependencies:
+ '@types/react': 17.0.50
+ dev: true
+
+ /@types/react-dom/17.0.17:
+ resolution: {integrity: sha512-VjnqEmqGnasQKV0CWLevqMTXBYG9GbwuE6x3VetERLh0cq2LTptFE73MrQi2S7GkKXCf2GgwItB/melLnxfnsg==}
+ dependencies:
+ '@types/react': 17.0.50
+ dev: true
+
+ /@types/react-redux/7.1.24:
+ resolution: {integrity: sha512-7FkurKcS1k0FHZEtdbbgN8Oc6b+stGSfZYjQGicofJ0j4U0qIn/jaSvnP2pLwZKiai3/17xqqxkkrxTgN8UNbQ==}
+ dependencies:
+ '@types/hoist-non-react-statics': 3.3.1
+ '@types/react': 17.0.50
+ hoist-non-react-statics: 3.3.2
+ redux: 4.2.0
+ dev: false
+
+ /@types/react-router-dom/5.3.3:
+ resolution: {integrity: sha512-kpqnYK4wcdm5UaWI3fLcELopqLrHgLqNsdpHauzlQktfkHL3npOSwtj1Uz9oKBAzs7lFtVkV8j83voAz2D8fhw==}
+ dependencies:
+ '@types/history': 4.7.11
+ '@types/react': 17.0.50
+ '@types/react-router': 5.1.19
+ dev: true
+
+ /@types/react-router/5.1.19:
+ resolution: {integrity: sha512-Fv/5kb2STAEMT3wHzdKQK2z8xKq38EDIGVrutYLmQVVLe+4orDFquU52hQrULnEHinMKv9FSA6lf9+uNT1ITtA==}
+ dependencies:
+ '@types/history': 4.7.11
+ '@types/react': 17.0.50
+ dev: true
+
+ /@types/react-slick/0.23.10:
+ resolution: {integrity: sha512-ZiqdencANDZy6sWOWJ54LDvebuXFEhDlHtXU9FFipQR2BcYU2QJxZhvJPW6YK7cocibUiNn+YvDTbt1HtCIBVA==}
+ dependencies:
+ '@types/react': 17.0.50
+ dev: true
+
+ /@types/react-table/7.7.12:
+ resolution: {integrity: sha512-bRUent+NR/WwtDGwI/BqhZ8XnHghwHw0HUKeohzB5xN3K2qKWYE5w19e7GCuOkL1CXD9Gi1HFy7TIm2AvgWUHg==}
+ dependencies:
+ '@types/react': 17.0.50
+ dev: true
+
+ /@types/react-test-renderer/18.0.0:
+ resolution: {integrity: sha512-C7/5FBJ3g3sqUahguGi03O79b8afNeSD6T8/GU50oQrJCU0bVCCGQHaGKUbg2Ce8VQEEqTw8/HiS6lXHHdgkdQ==}
+ dependencies:
+ '@types/react': 17.0.50
+ dev: true
+
+ /@types/react-transition-group/4.4.5:
+ resolution: {integrity: sha512-juKD/eiSM3/xZYzjuzH6ZwpP+/lejltmiS3QEzV/vmb/Q8+HfDmxu+Baga8UEMGBqV88Nbg4l2hY/K2DkyaLLA==}
+ dependencies:
+ '@types/react': 17.0.50
+ dev: true
+
+ /@types/react/17.0.50:
+ resolution: {integrity: sha512-ZCBHzpDb5skMnc1zFXAXnL3l1FAdi+xZvwxK+PkglMmBrwjpp9nKaWuEvrGnSifCJmBFGxZOOFuwC6KH/s0NuA==}
+ dependencies:
+ '@types/prop-types': 15.7.5
+ '@types/scheduler': 0.16.2
+ csstype: 3.1.1
+
+ /@types/scheduler/0.16.2:
+ resolution: {integrity: sha512-hppQEBDmlwhFAXKJX2KnWLYu5yMfi91yazPb2l+lbJiwW+wdo1gNeRA+3RgNSO39WYX2euey41KEwnqesU2Jew==}
+
+ /@types/stack-utils/2.0.1:
+ resolution: {integrity: sha512-Hl219/BT5fLAaz6NDkSuhzasy49dwQS/DSdu4MdggFB8zcXv7vflBI3xp7FEmkmdDkBUI2bPUNeMttp2knYdxw==}
+ dev: true
+
+ /@types/testing-library__jest-dom/5.14.5:
+ resolution: {integrity: sha512-SBwbxYoyPIvxHbeHxTZX2Pe/74F/tX2/D3mMvzabdeJ25bBojfW0TyB8BHrbq/9zaaKICJZjLP+8r6AeZMFCuQ==}
+ dependencies:
+ '@types/jest': 26.0.24
+ dev: true
+
+ /@types/tough-cookie/4.0.2:
+ resolution: {integrity: sha512-Q5vtl1W5ue16D+nIaW8JWebSSraJVlK+EthKn7e7UcD4KWsaSJ8BqGPXNaPghgtcn/fhvrN17Tv8ksUsQpiplw==}
+ dev: true
+
+ /@types/uuid/8.3.4:
+ resolution: {integrity: sha512-c/I8ZRb51j+pYGAu5CrFMRxqZ2ke4y2grEBO5AUjgSkSk+qT2Ea+OdWElz/OiMf5MNpn2b17kuVBwZLQJXzihw==}
+ dev: true
+
+ /@types/yargs-parser/21.0.0:
+ resolution: {integrity: sha512-iO9ZQHkZxHn4mSakYV0vFHAVDyEOIJQrV2uZ06HxEPcx+mt8swXoZHIbaaJ2crJYFfErySgktuTZ3BeLz+XmFA==}
+ dev: true
+
+ /@types/yargs/15.0.14:
+ resolution: {integrity: sha512-yEJzHoxf6SyQGhBhIYGXQDSCkJjB6HohDShto7m8vaKg9Yp0Yn8+71J9eakh2bnPg6BfsH9PRMhiRTZnd4eXGQ==}
+ dependencies:
+ '@types/yargs-parser': 21.0.0
+ dev: true
+
+ /@types/yargs/17.0.13:
+ resolution: {integrity: sha512-9sWaruZk2JGxIQU+IhI1fhPYRcQ0UuTNuKuCW9bR5fp7qi2Llf7WDzNa17Cy7TKnh3cdxDOiyTu6gaLS0eDatg==}
+ dependencies:
+ '@types/yargs-parser': 21.0.0
+ dev: true
+
+ /@typescript-eslint/eslint-plugin/5.40.0_bjgutjmzwoxcmti7ime6tsylke:
+ resolution: {integrity: sha512-FIBZgS3DVJgqPwJzvZTuH4HNsZhHMa9SjxTKAZTlMsPw/UzpEjcf9f4dfgDJEHjK+HboUJo123Eshl6niwEm/Q==}
+ engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0}
+ peerDependencies:
+ '@typescript-eslint/parser': ^5.0.0
+ eslint: ^6.0.0 || ^7.0.0 || ^8.0.0
+ typescript: '*'
+ peerDependenciesMeta:
+ typescript:
+ optional: true
+ dependencies:
+ '@typescript-eslint/parser': 5.40.0_3rubbgt5ekhqrcgx4uwls3neim
+ '@typescript-eslint/scope-manager': 5.40.0
+ '@typescript-eslint/type-utils': 5.40.0_3rubbgt5ekhqrcgx4uwls3neim
+ '@typescript-eslint/utils': 5.40.0_3rubbgt5ekhqrcgx4uwls3neim
+ debug: 4.3.4
+ eslint: 7.32.0
+ ignore: 5.2.0
+ regexpp: 3.2.0
+ semver: 7.3.8
+ tsutils: 3.21.0_typescript@4.8.4
+ typescript: 4.8.4
+ transitivePeerDependencies:
+ - supports-color
+ dev: true
+
+ /@typescript-eslint/parser/5.40.0_3rubbgt5ekhqrcgx4uwls3neim:
+ resolution: {integrity: sha512-Ah5gqyX2ySkiuYeOIDg7ap51/b63QgWZA7w6AHtFrag7aH0lRQPbLzUjk0c9o5/KZ6JRkTTDKShL4AUrQa6/hw==}
+ engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0}
+ peerDependencies:
+ eslint: ^6.0.0 || ^7.0.0 || ^8.0.0
+ typescript: '*'
+ peerDependenciesMeta:
+ typescript:
+ optional: true
+ dependencies:
+ '@typescript-eslint/scope-manager': 5.40.0
+ '@typescript-eslint/types': 5.40.0
+ '@typescript-eslint/typescript-estree': 5.40.0_typescript@4.8.4
+ debug: 4.3.4
+ eslint: 7.32.0
+ typescript: 4.8.4
+ transitivePeerDependencies:
+ - supports-color
+ dev: true
+
+ /@typescript-eslint/scope-manager/5.40.0:
+ resolution: {integrity: sha512-d3nPmjUeZtEWRvyReMI4I1MwPGC63E8pDoHy0BnrYjnJgilBD3hv7XOiETKLY/zTwI7kCnBDf2vWTRUVpYw0Uw==}
+ engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0}
+ dependencies:
+ '@typescript-eslint/types': 5.40.0
+ '@typescript-eslint/visitor-keys': 5.40.0
+ dev: true
+
+ /@typescript-eslint/type-utils/5.40.0_3rubbgt5ekhqrcgx4uwls3neim:
+ resolution: {integrity: sha512-nfuSdKEZY2TpnPz5covjJqav+g5qeBqwSHKBvz7Vm1SAfy93SwKk/JeSTymruDGItTwNijSsno5LhOHRS1pcfw==}
+ engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0}
+ peerDependencies:
+ eslint: '*'
+ typescript: '*'
+ peerDependenciesMeta:
+ typescript:
+ optional: true
+ dependencies:
+ '@typescript-eslint/typescript-estree': 5.40.0_typescript@4.8.4
+ '@typescript-eslint/utils': 5.40.0_3rubbgt5ekhqrcgx4uwls3neim
+ debug: 4.3.4
+ eslint: 7.32.0
+ tsutils: 3.21.0_typescript@4.8.4
+ typescript: 4.8.4
+ transitivePeerDependencies:
+ - supports-color
+ dev: true
+
+ /@typescript-eslint/types/5.40.0:
+ resolution: {integrity: sha512-V1KdQRTXsYpf1Y1fXCeZ+uhjW48Niiw0VGt4V8yzuaDTU8Z1Xl7yQDyQNqyAFcVhpYXIVCEuxSIWTsLDpHgTbw==}
+ engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0}
+ dev: true
+
+ /@typescript-eslint/typescript-estree/5.40.0_typescript@4.8.4:
+ resolution: {integrity: sha512-b0GYlDj8TLTOqwX7EGbw2gL5EXS2CPEWhF9nGJiGmEcmlpNBjyHsTwbqpyIEPVpl6br4UcBOYlcI2FJVtJkYhg==}
+ engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0}
+ peerDependencies:
+ typescript: '*'
+ peerDependenciesMeta:
+ typescript:
+ optional: true
+ dependencies:
+ '@typescript-eslint/types': 5.40.0
+ '@typescript-eslint/visitor-keys': 5.40.0
+ debug: 4.3.4
+ globby: 11.1.0
+ is-glob: 4.0.3
+ semver: 7.3.8
+ tsutils: 3.21.0_typescript@4.8.4
+ typescript: 4.8.4
+ transitivePeerDependencies:
+ - supports-color
+ dev: true
+
+ /@typescript-eslint/utils/5.40.0_3rubbgt5ekhqrcgx4uwls3neim:
+ resolution: {integrity: sha512-MO0y3T5BQ5+tkkuYZJBjePewsY+cQnfkYeRqS6tPh28niiIwPnQ1t59CSRcs1ZwJJNOdWw7rv9pF8aP58IMihA==}
+ engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0}
+ peerDependencies:
+ eslint: ^6.0.0 || ^7.0.0 || ^8.0.0
+ dependencies:
+ '@types/json-schema': 7.0.11
+ '@typescript-eslint/scope-manager': 5.40.0
+ '@typescript-eslint/types': 5.40.0
+ '@typescript-eslint/typescript-estree': 5.40.0_typescript@4.8.4
+ eslint: 7.32.0
+ eslint-scope: 5.1.1
+ eslint-utils: 3.0.0_eslint@7.32.0
+ semver: 7.3.8
+ transitivePeerDependencies:
+ - supports-color
+ - typescript
+ dev: true
+
+ /@typescript-eslint/visitor-keys/5.40.0:
+ resolution: {integrity: sha512-ijJ+6yig+x9XplEpG2K6FUdJeQGGj/15U3S56W9IqXKJqleuD7zJ2AX/miLezwxpd7ZxDAqO87zWufKg+RPZyQ==}
+ engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0}
+ dependencies:
+ '@typescript-eslint/types': 5.40.0
+ eslint-visitor-keys: 3.3.0
+ dev: true
+
+ /@virtuoso.dev/react-urx/0.2.13_react@17.0.2:
+ resolution: {integrity: sha512-MY0ugBDjFb5Xt8v2HY7MKcRGqw/3gTpMlLXId2EwQvYJoC8sP7nnXjAxcBtTB50KTZhO0SbzsFimaZ7pSdApwA==}
+ engines: {node: '>=10'}
+ peerDependencies:
+ react: '>=16'
+ dependencies:
+ '@virtuoso.dev/urx': 0.2.13
+ react: 17.0.2
+ dev: false
+
+ /@virtuoso.dev/urx/0.2.13:
+ resolution: {integrity: sha512-iirJNv92A1ZWxoOHHDYW/1KPoi83939o83iUBQHIim0i3tMeSKEh+bxhJdTHQ86Mr4uXx9xGUTq69cp52ZP8Xw==}
+ dev: false
+
+ /@vitejs/plugin-react/2.1.0_vite@3.1.8:
+ resolution: {integrity: sha512-am6rPyyU3LzUYne3Gd9oj9c4Rzbq5hQnuGXSMT6Gujq45Il/+bunwq3lrB7wghLkiF45ygMwft37vgJ/NE8IAA==}
+ engines: {node: ^14.18.0 || >=16.0.0}
+ peerDependencies:
+ vite: ^3.0.0
+ dependencies:
+ '@babel/core': 7.19.3
+ '@babel/plugin-transform-react-jsx': 7.19.0_@babel+core@7.19.3
+ '@babel/plugin-transform-react-jsx-development': 7.18.6_@babel+core@7.19.3
+ '@babel/plugin-transform-react-jsx-self': 7.18.6_@babel+core@7.19.3
+ '@babel/plugin-transform-react-jsx-source': 7.18.6_@babel+core@7.19.3
+ magic-string: 0.26.7
+ react-refresh: 0.14.0
+ vite: 3.1.8
+ transitivePeerDependencies:
+ - supports-color
+ dev: true
+
+ /@webassemblyjs/ast/1.11.1:
+ resolution: {integrity: sha512-ukBh14qFLjxTQNTXocdyksN5QdM28S1CxHt2rdskFyL+xFV7VremuBLVbmCePj+URalXBENx/9Lm7lnhihtCSw==}
+ dependencies:
+ '@webassemblyjs/helper-numbers': 1.11.1
+ '@webassemblyjs/helper-wasm-bytecode': 1.11.1
+ dev: true
+
+ /@webassemblyjs/floating-point-hex-parser/1.11.1:
+ resolution: {integrity: sha512-iGRfyc5Bq+NnNuX8b5hwBrRjzf0ocrJPI6GWFodBFzmFnyvrQ83SHKhmilCU/8Jv67i4GJZBMhEzltxzcNagtQ==}
+ dev: true
+
+ /@webassemblyjs/helper-api-error/1.11.1:
+ resolution: {integrity: sha512-RlhS8CBCXfRUR/cwo2ho9bkheSXG0+NwooXcc3PAILALf2QLdFyj7KGsKRbVc95hZnhnERon4kW/D3SZpp6Tcg==}
+ dev: true
+
+ /@webassemblyjs/helper-buffer/1.11.1:
+ resolution: {integrity: sha512-gwikF65aDNeeXa8JxXa2BAk+REjSyhrNC9ZwdT0f8jc4dQQeDQ7G4m0f2QCLPJiMTTO6wfDmRmj/pW0PsUvIcA==}
+ dev: true
+
+ /@webassemblyjs/helper-numbers/1.11.1:
+ resolution: {integrity: sha512-vDkbxiB8zfnPdNK9Rajcey5C0w+QJugEglN0of+kmO8l7lDb77AnlKYQF7aarZuCrv+l0UvqL+68gSDr3k9LPQ==}
+ dependencies:
+ '@webassemblyjs/floating-point-hex-parser': 1.11.1
+ '@webassemblyjs/helper-api-error': 1.11.1
+ '@xtuc/long': 4.2.2
+ dev: true
+
+ /@webassemblyjs/helper-wasm-bytecode/1.11.1:
+ resolution: {integrity: sha512-PvpoOGiJwXeTrSf/qfudJhwlvDQxFgelbMqtq52WWiXC6Xgg1IREdngmPN3bs4RoO83PnL/nFrxucXj1+BX62Q==}
+ dev: true
+
+ /@webassemblyjs/helper-wasm-section/1.11.1:
+ resolution: {integrity: sha512-10P9No29rYX1j7F3EVPX3JvGPQPae+AomuSTPiF9eBQeChHI6iqjMIwR9JmOJXwpnn/oVGDk7I5IlskuMwU/pg==}
+ dependencies:
+ '@webassemblyjs/ast': 1.11.1
+ '@webassemblyjs/helper-buffer': 1.11.1
+ '@webassemblyjs/helper-wasm-bytecode': 1.11.1
+ '@webassemblyjs/wasm-gen': 1.11.1
+ dev: true
+
+ /@webassemblyjs/ieee754/1.11.1:
+ resolution: {integrity: sha512-hJ87QIPtAMKbFq6CGTkZYJivEwZDbQUgYd3qKSadTNOhVY7p+gfP6Sr0lLRVTaG1JjFj+r3YchoqRYxNH3M0GQ==}
+ dependencies:
+ '@xtuc/ieee754': 1.2.0
+ dev: true
+
+ /@webassemblyjs/leb128/1.11.1:
+ resolution: {integrity: sha512-BJ2P0hNZ0u+Th1YZXJpzW6miwqQUGcIHT1G/sf72gLVD9DZ5AdYTqPNbHZh6K1M5VmKvFXwGSWZADz+qBWxeRw==}
+ dependencies:
+ '@xtuc/long': 4.2.2
+ dev: true
+
+ /@webassemblyjs/utf8/1.11.1:
+ resolution: {integrity: sha512-9kqcxAEdMhiwQkHpkNiorZzqpGrodQQ2IGrHHxCy+Ozng0ofyMA0lTqiLkVs1uzTRejX+/O0EOT7KxqVPuXosQ==}
+ dev: true
+
+ /@webassemblyjs/wasm-edit/1.11.1:
+ resolution: {integrity: sha512-g+RsupUC1aTHfR8CDgnsVRVZFJqdkFHpsHMfJuWQzWU3tvnLC07UqHICfP+4XyL2tnr1amvl1Sdp06TnYCmVkA==}
+ dependencies:
+ '@webassemblyjs/ast': 1.11.1
+ '@webassemblyjs/helper-buffer': 1.11.1
+ '@webassemblyjs/helper-wasm-bytecode': 1.11.1
+ '@webassemblyjs/helper-wasm-section': 1.11.1
+ '@webassemblyjs/wasm-gen': 1.11.1
+ '@webassemblyjs/wasm-opt': 1.11.1
+ '@webassemblyjs/wasm-parser': 1.11.1
+ '@webassemblyjs/wast-printer': 1.11.1
+ dev: true
+
+ /@webassemblyjs/wasm-gen/1.11.1:
+ resolution: {integrity: sha512-F7QqKXwwNlMmsulj6+O7r4mmtAlCWfO/0HdgOxSklZfQcDu0TpLiD1mRt/zF25Bk59FIjEuGAIyn5ei4yMfLhA==}
+ dependencies:
+ '@webassemblyjs/ast': 1.11.1
+ '@webassemblyjs/helper-wasm-bytecode': 1.11.1
+ '@webassemblyjs/ieee754': 1.11.1
+ '@webassemblyjs/leb128': 1.11.1
+ '@webassemblyjs/utf8': 1.11.1
+ dev: true
+
+ /@webassemblyjs/wasm-opt/1.11.1:
+ resolution: {integrity: sha512-VqnkNqnZlU5EB64pp1l7hdm3hmQw7Vgqa0KF/KCNO9sIpI6Fk6brDEiX+iCOYrvMuBWDws0NkTOxYEb85XQHHw==}
+ dependencies:
+ '@webassemblyjs/ast': 1.11.1
+ '@webassemblyjs/helper-buffer': 1.11.1
+ '@webassemblyjs/wasm-gen': 1.11.1
+ '@webassemblyjs/wasm-parser': 1.11.1
+ dev: true
+
+ /@webassemblyjs/wasm-parser/1.11.1:
+ resolution: {integrity: sha512-rrBujw+dJu32gYB7/Lup6UhdkPx9S9SnobZzRVL7VcBH9Bt9bCBLEuX/YXOOtBsOZ4NQrRykKhffRWHvigQvOA==}
+ dependencies:
+ '@webassemblyjs/ast': 1.11.1
+ '@webassemblyjs/helper-api-error': 1.11.1
+ '@webassemblyjs/helper-wasm-bytecode': 1.11.1
+ '@webassemblyjs/ieee754': 1.11.1
+ '@webassemblyjs/leb128': 1.11.1
+ '@webassemblyjs/utf8': 1.11.1
+ dev: true
+
+ /@webassemblyjs/wast-printer/1.11.1:
+ resolution: {integrity: sha512-IQboUWM4eKzWW+N/jij2sRatKMh99QEelo3Eb2q0qXkvPRISAj8Qxtmw5itwqK+TTkBuUIE45AxYPToqPtL5gg==}
+ dependencies:
+ '@webassemblyjs/ast': 1.11.1
+ '@xtuc/long': 4.2.2
+ dev: true
+
+ /@xtuc/ieee754/1.2.0:
+ resolution: {integrity: sha512-DX8nKgqcGwsc0eJSqYt5lwP4DH5FlHnmuWWBRy7X0NcaGR0ZtuyeESgMwTYVEtxmsNGY+qit4QYT/MIYTOTPeA==}
+ dev: true
+
+ /@xtuc/long/4.2.2:
+ resolution: {integrity: sha512-NuHqBY1PB/D8xU6s/thBgOAiAP7HOYDQ32+BFZILJ8ivkUkAHQnWfn6WhL79Owj1qmUnoN/YPhktdIoucipkAQ==}
+ dev: true
+
+ /@zeit/schemas/2.21.0:
+ resolution: {integrity: sha512-/J4WBTpWtQ4itN1rb3ao8LfClmVcmz2pO6oYb7Qd4h7VSqUhIbJIvrykz9Ew1WMg6eFWsKdsMHc5uPbFxqlCpg==}
+ dev: true
+
+ /abab/2.0.6:
+ resolution: {integrity: sha512-j2afSsaIENvHZN2B8GOpF566vZ5WVk5opAiMTvWgaQT8DkbOqsTfvNAvHoRGU2zzP8cPoqys+xHTRDWW8L+/BA==}
+ dev: true
+
+ /accepts/1.3.8:
+ resolution: {integrity: sha512-PYAthTa2m2VKxuvSD3DPC/Gy+U+sOA1LAuT8mkmRuvw+NACSaeXEQ+NHcVF7rONl6qcaxV3Uuemwawk+7+SJLw==}
+ engines: {node: '>= 0.6'}
+ dependencies:
+ mime-types: 2.1.35
+ negotiator: 0.6.3
+ dev: true
+
+ /acorn-globals/7.0.1:
+ resolution: {integrity: sha512-umOSDSDrfHbTNPuNpC2NSnnA3LUrqpevPb4T9jRx4MagXNS0rs+gwiTcAvqCRmsD6utzsrzNt+ebm00SNWiC3Q==}
+ dependencies:
+ acorn: 8.8.0
+ acorn-walk: 8.2.0
+ dev: true
+
+ /acorn-import-assertions/1.8.0_acorn@8.8.0:
+ resolution: {integrity: sha512-m7VZ3jwz4eK6A4Vtt8Ew1/mNbP24u0FhdyfA7fSvnJR6LMdfOYnmuIrrJAgrYfYJ10F/otaHTtrtrtmHdMNzEw==}
+ peerDependencies:
+ acorn: ^8
+ dependencies:
+ acorn: 8.8.0
+ dev: true
+
+ /acorn-jsx/5.3.2_acorn@7.4.1:
+ resolution: {integrity: sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==}
+ peerDependencies:
+ acorn: ^6.0.0 || ^7.0.0 || ^8.0.0
+ dependencies:
+ acorn: 7.4.1
+ dev: true
+
+ /acorn-walk/8.2.0:
+ resolution: {integrity: sha512-k+iyHEuPgSw6SbuDpGQM+06HQUa04DZ3o+F6CSzXMvvI5KMvnaEqXe+YVe555R9nn6GPt404fos4wcgpw12SDA==}
+ engines: {node: '>=0.4.0'}
+ dev: true
+
+ /acorn/7.4.1:
+ resolution: {integrity: sha512-nQyp0o1/mNdbTO1PO6kHkwSrmgZ0MT/jCCpNiwbUjGoRN4dlBhqJtoQuCnEOKzgTVwg0ZWiCoQy6SxMebQVh8A==}
+ engines: {node: '>=0.4.0'}
+ hasBin: true
+ dev: true
+
+ /acorn/8.8.0:
+ resolution: {integrity: sha512-QOxyigPVrpZ2GXT+PFyZTl6TtOFc5egxHIP9IlQ+RbupQuX4RkT/Bee4/kQuC02Xkzg84JcT7oLYtDIQxp+v7w==}
+ engines: {node: '>=0.4.0'}
+ hasBin: true
+ dev: true
+
+ /agent-base/6.0.2:
+ resolution: {integrity: sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ==}
+ engines: {node: '>= 6.0.0'}
+ dependencies:
+ debug: 4.3.4
+ transitivePeerDependencies:
+ - supports-color
+ dev: true
+
+ /aggregate-error/3.1.0:
+ resolution: {integrity: sha512-4I7Td01quW/RpocfNayFdFVk1qSuoh0E7JrbRJ16nH01HhKFQ88INq9Sd+nd72zqRySlr9BmDA8xlEJ6vJMrYA==}
+ engines: {node: '>=8'}
+ dependencies:
+ clean-stack: 2.2.0
+ indent-string: 4.0.0
+ dev: true
+
+ /ajv-keywords/3.5.2_ajv@6.12.6:
+ resolution: {integrity: sha512-5p6WTN0DdTGVQk6VjcEju19IgaHudalcfabD7yhDGeA6bcQnmL+CpveLJq/3hvfwd1aof6L386Ougkx6RfyMIQ==}
+ peerDependencies:
+ ajv: ^6.9.1
+ dependencies:
+ ajv: 6.12.6
+ dev: true
+
+ /ajv/6.12.6:
+ resolution: {integrity: sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==}
+ dependencies:
+ fast-deep-equal: 3.1.3
+ fast-json-stable-stringify: 2.1.0
+ json-schema-traverse: 0.4.1
+ uri-js: 4.4.1
+ dev: true
+
+ /ajv/8.11.0:
+ resolution: {integrity: sha512-wGgprdCvMalC0BztXvitD2hC04YffAvtsUn93JbGXYLAtCUO4xd17mCCZQxUOItiBwZvJScWo8NIvQMQ71rdpg==}
+ dependencies:
+ fast-deep-equal: 3.1.3
+ json-schema-traverse: 1.0.0
+ require-from-string: 2.0.2
+ uri-js: 4.4.1
+ dev: true
+
+ /ansi-align/3.0.1:
+ resolution: {integrity: sha512-IOfwwBF5iczOjp/WeY4YxyjqAFMQoZufdQWDd19SEExbVLNXqvpzSJ/M7Za4/sCPmQ0+GRquoA7bGcINcxew6w==}
+ dependencies:
+ string-width: 4.2.3
+ dev: true
+
+ /ansi-colors/4.1.3:
+ resolution: {integrity: sha512-/6w/C21Pm1A7aZitlI5Ni/2J6FFQN8i1Cvz3kHABAAbw93v/NlvKdVOqz7CCWz/3iv/JplRSEEZ83XION15ovw==}
+ engines: {node: '>=6'}
+ dev: true
+
+ /ansi-escapes/4.3.2:
+ resolution: {integrity: sha512-gKXj5ALrKWQLsYG9jlTRmR/xKluxHV+Z9QEwNIgCfM1/uwPMCuzVVnh5mwTd+OuBZcwSIMbqssNWRm1lE51QaQ==}
+ engines: {node: '>=8'}
+ dependencies:
+ type-fest: 0.21.3
+ dev: true
+
+ /ansi-regex/5.0.1:
+ resolution: {integrity: sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==}
+ engines: {node: '>=8'}
+ dev: true
+
+ /ansi-regex/6.0.1:
+ resolution: {integrity: sha512-n5M855fKb2SsfMIiFFoVrABHJC8QtHwVx+mHWP3QcEqBHYienj5dHSgjbxtC0WEZXYt4wcD6zrQElDPhFuZgfA==}
+ engines: {node: '>=12'}
+ dev: true
+
+ /ansi-styles/3.2.1:
+ resolution: {integrity: sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==}
+ engines: {node: '>=4'}
+ dependencies:
+ color-convert: 1.9.3
+
+ /ansi-styles/4.3.0:
+ resolution: {integrity: sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==}
+ engines: {node: '>=8'}
+ dependencies:
+ color-convert: 2.0.1
+ dev: true
+
+ /ansi-styles/5.2.0:
+ resolution: {integrity: sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==}
+ engines: {node: '>=10'}
+ dev: true
+
+ /ansi-styles/6.2.1:
+ resolution: {integrity: sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug==}
+ engines: {node: '>=12'}
+ dev: true
+
+ /anymatch/3.1.2:
+ resolution: {integrity: sha512-P43ePfOAIupkguHUycrc4qJ9kz8ZiuOUijaETwX7THt0Y/GNK7v0aa8rY816xWjZ7rJdA5XdMcpVFTKMq+RvWg==}
+ engines: {node: '>= 8'}
+ dependencies:
+ normalize-path: 3.0.0
+ picomatch: 2.3.1
+ dev: true
+
+ /arch/2.2.0:
+ resolution: {integrity: sha512-Of/R0wqp83cgHozfIYLbBMnej79U/SVGOOyuB3VVFv1NRM/PSFMK12x9KVtiYzJqmnU5WR2qp0Z5rHb7sWGnFQ==}
+ dev: true
+
+ /arg/4.1.3:
+ resolution: {integrity: sha512-58S9QDqG0Xx27YwPSt9fJxivjYl432YCwfDMfZ+71RAqUrZef7LrKQZ3LHLOwCS4FLNBplP533Zx895SeOCHvA==}
+ dev: true
+
+ /arg/5.0.2:
+ resolution: {integrity: sha512-PYjyFOLKQ9y57JvQ6QLo8dAgNqswh8M1RMJYdQduT6xbWSgK36P/Z/v+p888pM69jMMfS8Xd8F6I1kQ/I9HUGg==}
+ dev: true
+
+ /argparse/1.0.10:
+ resolution: {integrity: sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==}
+ dependencies:
+ sprintf-js: 1.0.3
+ dev: true
+
+ /aria-hidden/1.2.1_pxzommwrsowkd4kgag6q3sluym:
+ resolution: {integrity: sha512-PN344VAf9j1EAi+jyVHOJ8XidQdPVssGco39eNcsGdM4wcsILtxrKLkbuiMfLWYROK1FjRQasMWCBttrhjnr6A==}
+ engines: {node: '>=10'}
+ peerDependencies:
+ '@types/react': ^16.9.0 || ^17.0.0 || ^18.0.0
+ react: ^16.9.0 || ^17.0.0 || ^18.0.0
+ peerDependenciesMeta:
+ '@types/react':
+ optional: true
+ dependencies:
+ '@types/react': 17.0.50
+ react: 17.0.2
+ tslib: 2.4.0
+ dev: false
+
+ /aria-query/4.2.2:
+ resolution: {integrity: sha512-o/HelwhuKpTj/frsOsbNLNgnNGVIFsVP/SW2BSF14gVl7kAfMOJ6/8wUAUvG1R1NHKrfG+2sHZTu0yauT1qBrA==}
+ engines: {node: '>=6.0'}
+ dependencies:
+ '@babel/runtime': 7.19.4
+ '@babel/runtime-corejs3': 7.19.4
+ dev: true
+
+ /aria-query/5.0.2:
+ resolution: {integrity: sha512-eigU3vhqSO+Z8BKDnVLN/ompjhf3pYzecKXz8+whRy+9gZu8n1TCGfwzQUUPnqdHl9ax1Hr9031orZ+UOEYr7Q==}
+ engines: {node: '>=6.0'}
+ dev: true
+
+ /array-includes/3.1.5:
+ resolution: {integrity: sha512-iSDYZMMyTPkiFasVqfuAQnWAYcvO/SeBSCGKePoEthjp4LEMTe4uLc7b025o4jAZpHhihh8xPo99TNWUWWkGDQ==}
+ engines: {node: '>= 0.4'}
+ dependencies:
+ call-bind: 1.0.2
+ define-properties: 1.1.4
+ es-abstract: 1.20.4
+ get-intrinsic: 1.1.3
+ is-string: 1.0.7
+ dev: true
+
+ /array-union/2.1.0:
+ resolution: {integrity: sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==}
+ engines: {node: '>=8'}
+ dev: true
+
+ /array.prototype.flatmap/1.3.0:
+ resolution: {integrity: sha512-PZC9/8TKAIxcWKdyeb77EzULHPrIX/tIZebLJUQOMR1OwYosT8yggdfWScfTBCDj5utONvOuPQQumYsU2ULbkg==}
+ engines: {node: '>= 0.4'}
+ dependencies:
+ call-bind: 1.0.2
+ define-properties: 1.1.4
+ es-abstract: 1.20.4
+ es-shim-unscopables: 1.0.0
+ dev: true
+
+ /astral-regex/2.0.0:
+ resolution: {integrity: sha512-Z7tMw1ytTXt5jqMcOP+OQteU1VuNK9Y02uuJtKQ1Sv69jXQKKg5cibLwGJow8yzZP+eAc18EmLGPal0bp36rvQ==}
+ engines: {node: '>=8'}
+ dev: true
+
+ /asynckit/0.4.0:
+ resolution: {integrity: sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==}
+ dev: true
+
+ /babel-jest/28.1.3_@babel+core@7.19.3:
+ resolution: {integrity: sha512-epUaPOEWMk3cWX0M/sPvCHHCe9fMFAa/9hXEgKP8nFfNl/jlGkE9ucq9NqkZGXLDduCJYS0UvSlPUwC0S+rH6Q==}
+ engines: {node: ^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0}
+ peerDependencies:
+ '@babel/core': ^7.8.0
+ dependencies:
+ '@babel/core': 7.19.3
+ '@jest/transform': 28.1.3
+ '@types/babel__core': 7.1.19
+ babel-plugin-istanbul: 6.1.1
+ babel-preset-jest: 28.1.3_@babel+core@7.19.3
+ chalk: 4.1.2
+ graceful-fs: 4.2.10
+ slash: 3.0.0
+ transitivePeerDependencies:
+ - supports-color
+ dev: true
+
+ /babel-plugin-dynamic-import-node/2.3.3:
+ resolution: {integrity: sha512-jZVI+s9Zg3IqA/kdi0i6UDCybUI3aSBLnglhYbSSjKlV7yF1F/5LWv8MakQmvYpnbJDS6fcBL2KzHSxNCMtWSQ==}
+ dependencies:
+ object.assign: 4.1.4
+ dev: true
+
+ /babel-plugin-istanbul/6.1.1:
+ resolution: {integrity: sha512-Y1IQok9821cC9onCx5otgFfRm7Lm+I+wwxOx738M/WLPZ9Q42m4IG5W0FNX8WLL2gYMZo3JkuXIH2DOpWM+qwA==}
+ engines: {node: '>=8'}
+ dependencies:
+ '@babel/helper-plugin-utils': 7.19.0
+ '@istanbuljs/load-nyc-config': 1.1.0
+ '@istanbuljs/schema': 0.1.3
+ istanbul-lib-instrument: 5.2.1
+ test-exclude: 6.0.0
+ transitivePeerDependencies:
+ - supports-color
+ dev: true
+
+ /babel-plugin-jest-hoist/28.1.3:
+ resolution: {integrity: sha512-Ys3tUKAmfnkRUpPdpa98eYrAR0nV+sSFUZZEGuQ2EbFd1y4SOLtD5QDNHAq+bb9a+bbXvYQC4b+ID/THIMcU6Q==}
+ engines: {node: ^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0}
+ dependencies:
+ '@babel/template': 7.18.10
+ '@babel/types': 7.19.4
+ '@types/babel__core': 7.1.19
+ '@types/babel__traverse': 7.18.2
+ dev: true
+
+ /babel-plugin-macros/3.1.0:
+ resolution: {integrity: sha512-Cg7TFGpIr01vOQNODXOOaGz2NpCU5gl8x1qJFbb6hbZxR7XrcE2vtbAsTAbJ7/xwJtUuJEw8K8Zr/AE0LHlesg==}
+ engines: {node: '>=10', npm: '>=6'}
+ dependencies:
+ '@babel/runtime': 7.19.4
+ cosmiconfig: 7.0.1
+ resolve: 1.22.1
+ dev: false
+
+ /babel-plugin-polyfill-corejs2/0.3.3_@babel+core@7.19.3:
+ resolution: {integrity: sha512-8hOdmFYFSZhqg2C/JgLUQ+t52o5nirNwaWM2B9LWteozwIvM14VSwdsCAUET10qT+kmySAlseadmfeeSWFCy+Q==}
+ peerDependencies:
+ '@babel/core': ^7.0.0-0
+ dependencies:
+ '@babel/compat-data': 7.19.4
+ '@babel/core': 7.19.3
+ '@babel/helper-define-polyfill-provider': 0.3.3_@babel+core@7.19.3
+ semver: 6.3.0
+ transitivePeerDependencies:
+ - supports-color
+ dev: true
+
+ /babel-plugin-polyfill-corejs3/0.6.0_@babel+core@7.19.3:
+ resolution: {integrity: sha512-+eHqR6OPcBhJOGgsIar7xoAB1GcSwVUA3XjAd7HJNzOXT4wv6/H7KIdA/Nc60cvUlDbKApmqNvD1B1bzOt4nyA==}
+ peerDependencies:
+ '@babel/core': ^7.0.0-0
+ dependencies:
+ '@babel/core': 7.19.3
+ '@babel/helper-define-polyfill-provider': 0.3.3_@babel+core@7.19.3
+ core-js-compat: 3.25.5
+ transitivePeerDependencies:
+ - supports-color
+ dev: true
+
+ /babel-plugin-polyfill-regenerator/0.4.1_@babel+core@7.19.3:
+ resolution: {integrity: sha512-NtQGmyQDXjQqQ+IzRkBVwEOz9lQ4zxAQZgoAYEtU9dJjnl1Oc98qnN7jcp+bE7O7aYzVpavXE3/VKXNzUbh7aw==}
+ peerDependencies:
+ '@babel/core': ^7.0.0-0
+ dependencies:
+ '@babel/core': 7.19.3
+ '@babel/helper-define-polyfill-provider': 0.3.3_@babel+core@7.19.3
+ transitivePeerDependencies:
+ - supports-color
+ dev: true
+
+ /babel-preset-current-node-syntax/1.0.1_@babel+core@7.19.3:
+ resolution: {integrity: sha512-M7LQ0bxarkxQoN+vz5aJPsLBn77n8QgTFmo8WK0/44auK2xlCXrYcUxHFxgU7qW5Yzw/CjmLRK2uJzaCd7LvqQ==}
+ peerDependencies:
+ '@babel/core': ^7.0.0
+ dependencies:
+ '@babel/core': 7.19.3
+ '@babel/plugin-syntax-async-generators': 7.8.4_@babel+core@7.19.3
+ '@babel/plugin-syntax-bigint': 7.8.3_@babel+core@7.19.3
+ '@babel/plugin-syntax-class-properties': 7.12.13_@babel+core@7.19.3
+ '@babel/plugin-syntax-import-meta': 7.10.4_@babel+core@7.19.3
+ '@babel/plugin-syntax-json-strings': 7.8.3_@babel+core@7.19.3
+ '@babel/plugin-syntax-logical-assignment-operators': 7.10.4_@babel+core@7.19.3
+ '@babel/plugin-syntax-nullish-coalescing-operator': 7.8.3_@babel+core@7.19.3
+ '@babel/plugin-syntax-numeric-separator': 7.10.4_@babel+core@7.19.3
+ '@babel/plugin-syntax-object-rest-spread': 7.8.3_@babel+core@7.19.3
+ '@babel/plugin-syntax-optional-catch-binding': 7.8.3_@babel+core@7.19.3
+ '@babel/plugin-syntax-optional-chaining': 7.8.3_@babel+core@7.19.3
+ '@babel/plugin-syntax-top-level-await': 7.14.5_@babel+core@7.19.3
+ dev: true
+
+ /babel-preset-jest/28.1.3_@babel+core@7.19.3:
+ resolution: {integrity: sha512-L+fupJvlWAHbQfn74coNX3zf60LXMJsezNvvx8eIh7iOR1luJ1poxYgQk1F8PYtNq/6QODDHCqsSnTFSWC491A==}
+ engines: {node: ^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0}
+ peerDependencies:
+ '@babel/core': ^7.0.0
+ dependencies:
+ '@babel/core': 7.19.3
+ babel-plugin-jest-hoist: 28.1.3
+ babel-preset-current-node-syntax: 1.0.1_@babel+core@7.19.3
+ dev: true
+
+ /balanced-match/1.0.2:
+ resolution: {integrity: sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==}
+
+ /base64-js/1.5.1:
+ resolution: {integrity: sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==}
+ dev: true
+
+ /big-integer/1.6.51:
+ resolution: {integrity: sha512-GPEid2Y9QU1Exl1rpO9B2IPJGHPSupF5GnVIP0blYvNOMer2bTvSWs1jGOUg04hTmu67nmLsQ9TBo1puaotBHg==}
+ engines: {node: '>=0.6'}
+ dev: false
+
+ /big.js/5.2.2:
+ resolution: {integrity: sha512-vyL2OymJxmarO8gxMr0mhChsO9QGwhynfuu4+MHTAW6czfq9humCB7rKpUjDd9YUiDPU4mzpyupFSvOClAwbmQ==}
+ dev: true
+
+ /boxen/7.0.0:
+ resolution: {integrity: sha512-j//dBVuyacJbvW+tvZ9HuH03fZ46QcaKvvhZickZqtB271DxJ7SNRSNxrV/dZX0085m7hISRZWbzWlJvx/rHSg==}
+ engines: {node: '>=14.16'}
+ dependencies:
+ ansi-align: 3.0.1
+ camelcase: 7.0.0
+ chalk: 5.0.1
+ cli-boxes: 3.0.0
+ string-width: 5.1.2
+ type-fest: 2.19.0
+ widest-line: 4.0.1
+ wrap-ansi: 8.0.1
+ dev: true
+
+ /brace-expansion/1.1.11:
+ resolution: {integrity: sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==}
+ dependencies:
+ balanced-match: 1.0.2
+ concat-map: 0.0.1
+
+ /braces/3.0.2:
+ resolution: {integrity: sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==}
+ engines: {node: '>=8'}
+ dependencies:
+ fill-range: 7.0.1
+ dev: true
+
+ /broadcast-channel/3.7.0:
+ resolution: {integrity: sha512-cIAKJXAxGJceNZGTZSBzMxzyOn72cVgPnKx4dc6LRjQgbaJUQqhy5rzL3zbMxkMWsGKkv2hSFkPRMEXfoMZ2Mg==}
+ dependencies:
+ '@babel/runtime': 7.19.4
+ detect-node: 2.1.0
+ js-sha3: 0.8.0
+ microseconds: 0.2.0
+ nano-time: 1.0.0
+ oblivious-set: 1.0.0
+ rimraf: 3.0.2
+ unload: 2.2.0
+ dev: false
+
+ /browserslist/4.21.4:
+ resolution: {integrity: sha512-CBHJJdDmgjl3daYjN5Cp5kbTf1mUhZoS+beLklHIvkOWscs83YAhLlF3Wsh/lciQYAcbBJgTOD44VtG31ZM4Hw==}
+ engines: {node: ^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7}
+ hasBin: true
+ dependencies:
+ caniuse-lite: 1.0.30001419
+ electron-to-chromium: 1.4.282
+ node-releases: 2.0.6
+ update-browserslist-db: 1.0.10_browserslist@4.21.4
+
+ /bs-logger/0.2.6:
+ resolution: {integrity: sha512-pd8DCoxmbgc7hyPKOvxtqNcjYoOsABPQdcCUjGp3d42VR2CX1ORhk2A87oqqu5R1kk+76nsxZupkmyd+MVtCog==}
+ engines: {node: '>= 6'}
+ dependencies:
+ fast-json-stable-stringify: 2.1.0
+ dev: true
+
+ /bser/2.1.1:
+ resolution: {integrity: sha512-gQxTNE/GAfIIrmHLUE3oJyp5FO6HRBfhjnw4/wMmA63ZGDJnWBmgY/lyQBpnDUkGmAhbSe39tx2d/iTOAfglwQ==}
+ dependencies:
+ node-int64: 0.4.0
+ dev: true
+
+ /buffer-from/1.1.2:
+ resolution: {integrity: sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==}
+ dev: true
+
+ /buffer/6.0.3:
+ resolution: {integrity: sha512-FTiCpNxtwiZZHEZbcbTIcZjERVICn9yq/pDFkTl95/AxzD1naBctN7YO68riM/gLSDY7sdrMby8hofADYuuqOA==}
+ dependencies:
+ base64-js: 1.5.1
+ ieee754: 1.2.1
+ dev: true
+
+ /bytes/3.0.0:
+ resolution: {integrity: sha512-pMhOfFDPiv9t5jjIXkHosWmkSyQbvsgEVNkz0ERHbuLh2T/7j4Mqqpz523Fe8MVY89KC6Sh/QfS2sM+SjgFDcw==}
+ engines: {node: '>= 0.8'}
+ dev: true
+
+ /call-bind/1.0.2:
+ resolution: {integrity: sha512-7O+FbCihrB5WGbFYesctwmTKae6rOiIzmz1icreWJ+0aA7LJfuqhEso2T9ncpcFtzMQtzXf2QGGueWJGTYsqrA==}
+ dependencies:
+ function-bind: 1.1.1
+ get-intrinsic: 1.1.3
+ dev: true
+
+ /callsites/3.1.0:
+ resolution: {integrity: sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==}
+ engines: {node: '>=6'}
+
+ /camelcase/5.3.1:
+ resolution: {integrity: sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==}
+ engines: {node: '>=6'}
+ dev: true
+
+ /camelcase/6.3.0:
+ resolution: {integrity: sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA==}
+ engines: {node: '>=10'}
+ dev: true
+
+ /camelcase/7.0.0:
+ resolution: {integrity: sha512-JToIvOmz6nhGsUhAYScbo2d6Py5wojjNfoxoc2mEVLUdJ70gJK2gnd+ABY1Tc3sVMyK7QDPtN0T/XdlCQWITyQ==}
+ engines: {node: '>=14.16'}
+ dev: true
+
+ /caniuse-lite/1.0.30001419:
+ resolution: {integrity: sha512-aFO1r+g6R7TW+PNQxKzjITwLOyDhVRLjW0LcwS/HCZGUUKTGNp9+IwLC4xyDSZBygVL/mxaFR3HIV6wEKQuSzw==}
+
+ /chalk-template/0.4.0:
+ resolution: {integrity: sha512-/ghrgmhfY8RaSdeo43hNXxpoHAtxdbskUHjPpfqUWGttFgycUhYPGx3YZBCnUCvOa7Doivn1IZec3DEGFoMgLg==}
+ engines: {node: '>=12'}
+ dependencies:
+ chalk: 4.1.2
+ dev: true
+
+ /chalk/2.4.2:
+ resolution: {integrity: sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==}
+ engines: {node: '>=4'}
+ dependencies:
+ ansi-styles: 3.2.1
+ escape-string-regexp: 1.0.5
+ supports-color: 5.5.0
+
+ /chalk/3.0.0:
+ resolution: {integrity: sha512-4D3B6Wf41KOYRFdszmDqMCGq5VV/uMAB273JILmO+3jAlh8X4qDtdtgCR3fxtbLEMzSx22QdhnDcJvu2u1fVwg==}
+ engines: {node: '>=8'}
+ dependencies:
+ ansi-styles: 4.3.0
+ supports-color: 7.2.0
+ dev: true
+
+ /chalk/4.1.2:
+ resolution: {integrity: sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==}
+ engines: {node: '>=10'}
+ dependencies:
+ ansi-styles: 4.3.0
+ supports-color: 7.2.0
+ dev: true
+
+ /chalk/5.0.1:
+ resolution: {integrity: sha512-Fo07WOYGqMfCWHOzSXOt2CxDbC6skS/jO9ynEcmpANMoPrD+W1r1K6Vx7iNm+AQmETU1Xr2t+n8nzkV9t6xh3w==}
+ engines: {node: ^12.17.0 || ^14.13 || >=16.0.0}
+ dev: true
+
+ /char-regex/1.0.2:
+ resolution: {integrity: sha512-kWWXztvZ5SBQV+eRgKFeh8q5sLuZY2+8WUIzlxWVTg+oGwY14qylx1KbKzHd8P6ZYkAg0xyIDU9JMHhyJMZ1jw==}
+ engines: {node: '>=10'}
+ dev: true
+
+ /chrome-trace-event/1.0.3:
+ resolution: {integrity: sha512-p3KULyQg4S7NIHixdwbGX+nFHkoBiA4YQmyWtjb8XngSKV124nJmRysgAeujbUVb15vh+RvFUfCPqU7rXk+hZg==}
+ engines: {node: '>=6.0'}
+ dev: true
+
+ /ci-info/3.5.0:
+ resolution: {integrity: sha512-yH4RezKOGlOhxkmhbeNuC4eYZKAUsEaGtBuBzDDP1eFUKiccDWzBABxBfOx31IDwDIXMTxWuwAxUGModvkbuVw==}
+ dev: true
+
+ /cjs-module-lexer/1.2.2:
+ resolution: {integrity: sha512-cOU9usZw8/dXIXKtwa8pM0OTJQuJkxMN6w30csNRUerHfeQ5R6U3kkU/FtJeIf3M202OHfY2U8ccInBG7/xogA==}
+ dev: true
+
+ /classnames/2.3.2:
+ resolution: {integrity: sha512-CSbhY4cFEJRe6/GQzIk5qXZ4Jeg5pcsP7b5peFSDpffpe1cqjASH/n9UTjBwOp6XpMSTwQ8Za2K5V02ueA7Tmw==}
+ dev: false
+
+ /clean-stack/2.2.0:
+ resolution: {integrity: sha512-4diC9HaTE+KRAMWhDhrGOECgWZxoevMc5TlkObMqNSsVU62PYzXZ/SMTjzyGAFF1YusgxGcSWTEXBhp0CPwQ1A==}
+ engines: {node: '>=6'}
+ dev: true
+
+ /cli-boxes/3.0.0:
+ resolution: {integrity: sha512-/lzGpEWL/8PfI0BmBOPRwp0c/wFNX1RdUML3jK/RcSBA9T8mZDdQpqYBKtCFTOfQbwPqWEOpjqW+Fnayc0969g==}
+ engines: {node: '>=10'}
+ dev: true
+
+ /cli-cursor/3.1.0:
+ resolution: {integrity: sha512-I/zHAwsKf9FqGoXM4WWRACob9+SNukZTd94DWF57E4toouRulbCxcUh6RKUEOQlYTHJnzkPMySvPNaaSLNfLZw==}
+ engines: {node: '>=8'}
+ dependencies:
+ restore-cursor: 3.1.0
+ dev: true
+
+ /cli-truncate/2.1.0:
+ resolution: {integrity: sha512-n8fOixwDD6b/ObinzTrp1ZKFzbgvKZvuz/TvejnLn1aQfC6r52XEx85FmuC+3HI+JM7coBRXUvNqEU2PHVrHpg==}
+ engines: {node: '>=8'}
+ dependencies:
+ slice-ansi: 3.0.0
+ string-width: 4.2.3
+ dev: true
+
+ /cli-truncate/3.1.0:
+ resolution: {integrity: sha512-wfOBkjXteqSnI59oPcJkcPl/ZmwvMMOj340qUIY1SKZCv0B9Cf4D4fAucRkIKQmsIuYK3x1rrgU7MeGRruiuiA==}
+ engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0}
+ dependencies:
+ slice-ansi: 5.0.0
+ string-width: 5.1.2
+ dev: true
+
+ /clipboardy/3.0.0:
+ resolution: {integrity: sha512-Su+uU5sr1jkUy1sGRpLKjKrvEOVXgSgiSInwa/qeID6aJ07yh+5NWc3h2QfjHjBnfX4LhtFcuAWKUsJ3r+fjbg==}
+ engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0}
+ dependencies:
+ arch: 2.2.0
+ execa: 5.1.1
+ is-wsl: 2.2.0
+ dev: true
+
+ /cliui/8.0.1:
+ resolution: {integrity: sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ==}
+ engines: {node: '>=12'}
+ dependencies:
+ string-width: 4.2.3
+ strip-ansi: 6.0.1
+ wrap-ansi: 7.0.0
+ dev: true
+
+ /clsx/1.1.1:
+ resolution: {integrity: sha512-6/bPho624p3S2pMyvP5kKBPXnI3ufHLObBFCfgx+LkeR5lg2XYy2hqZqUf45ypD8COn2bhgGJSUE+l5dhNBieA==}
+ engines: {node: '>=6'}
+ dev: false
+
+ /clsx/1.2.1:
+ resolution: {integrity: sha512-EcR6r5a8bj6pu3ycsa/E/cKVGuTgZJZdsyUYHOksG/UHIiKfjxzRxYJpyVBwYaQeOvghal9fcc4PidlgzugAQg==}
+ engines: {node: '>=6'}
+ dev: false
+
+ /co/4.6.0:
+ resolution: {integrity: sha512-QVb0dM5HvG+uaxitm8wONl7jltx8dqhfU33DcqtOZcLSVIKSDDLDi7+0LbAKiyI8hD9u42m2YxXSkMGWThaecQ==}
+ engines: {iojs: '>= 1.0.0', node: '>= 0.12.0'}
+ dev: true
+
+ /collect-v8-coverage/1.0.1:
+ resolution: {integrity: sha512-iBPtljfCNcTKNAto0KEtDfZ3qzjJvqE3aTGZsbhjSBlorqpXJlaWWtPO35D+ZImoC3KWejX64o+yPGxhWSTzfg==}
+ dev: true
+
+ /color-convert/1.9.3:
+ resolution: {integrity: sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==}
+ dependencies:
+ color-name: 1.1.3
+
+ /color-convert/2.0.1:
+ resolution: {integrity: sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==}
+ engines: {node: '>=7.0.0'}
+ dependencies:
+ color-name: 1.1.4
+ dev: true
+
+ /color-name/1.1.3:
+ resolution: {integrity: sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==}
+
+ /color-name/1.1.4:
+ resolution: {integrity: sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==}
+
+ /color-string/1.9.1:
+ resolution: {integrity: sha512-shrVawQFojnZv6xM40anx4CkoDP+fZsw/ZerEMsW/pyzsRbElpsL/DBVW7q3ExxwusdNXI3lXpuhEZkzs8p5Eg==}
+ dependencies:
+ color-name: 1.1.4
+ simple-swizzle: 0.2.2
+ dev: false
+
+ /color/3.2.1:
+ resolution: {integrity: sha512-aBl7dZI9ENN6fUGC7mWpMTPNHmWUSNan9tuWN6ahh5ZLNk9baLJOnSMlrQkHcrfFgz2/RigjUVAjdx36VcemKA==}
+ dependencies:
+ color-convert: 1.9.3
+ color-string: 1.9.1
+ dev: false
+
+ /colorette/2.0.19:
+ resolution: {integrity: sha512-3tlv/dIP7FWvj3BsbHrGLJ6l/oKh1O3TcgBqMn+yyCagOxc23fyzDS6HypQbgxWbkpDnf52p1LuR4eWDQ/K9WQ==}
+ dev: true
+
+ /combined-stream/1.0.8:
+ resolution: {integrity: sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==}
+ engines: {node: '>= 0.8'}
+ dependencies:
+ delayed-stream: 1.0.0
+ dev: true
+
+ /commander/2.20.3:
+ resolution: {integrity: sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==}
+ dev: true
+
+ /commander/9.4.1:
+ resolution: {integrity: sha512-5EEkTNyHNGFPD2H+c/dXXfQZYa/scCKasxWcXJaWnNJ99pnQN9Vnmqow+p+PlFPE63Q6mThaZws1T+HxfpgtPw==}
+ engines: {node: ^12.20.0 || >=14}
+ dev: true
+
+ /compressible/2.0.18:
+ resolution: {integrity: sha512-AF3r7P5dWxL8MxyITRMlORQNaOA2IkAFaTr4k7BUumjPtRpGDTZpl0Pb1XCO6JeDCBdp126Cgs9sMxqSjgYyRg==}
+ engines: {node: '>= 0.6'}
+ dependencies:
+ mime-db: 1.52.0
+ dev: true
+
+ /compression/1.7.4:
+ resolution: {integrity: sha512-jaSIDzP9pZVS4ZfQ+TzvtiWhdpFhE2RDHz8QJkpX9SIpLq88VueF5jJw6t+6CUQcAoA6t+x89MLrWAqpfDE8iQ==}
+ engines: {node: '>= 0.8.0'}
+ dependencies:
+ accepts: 1.3.8
+ bytes: 3.0.0
+ compressible: 2.0.18
+ debug: 2.6.9
+ on-headers: 1.0.2
+ safe-buffer: 5.1.2
+ vary: 1.1.2
+ transitivePeerDependencies:
+ - supports-color
+ dev: true
+
+ /concat-map/0.0.1:
+ resolution: {integrity: sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=}
+
+ /content-disposition/0.5.2:
+ resolution: {integrity: sha512-kRGRZw3bLlFISDBgwTSA1TMBFN6J6GWDeubmDE3AF+3+yXL8hTWv8r5rkLbqYXY4RjPk/EzHnClI3zQf1cFmHA==}
+ engines: {node: '>= 0.6'}
+ dev: true
+
+ /convert-source-map/1.9.0:
+ resolution: {integrity: sha512-ASFBup0Mz1uyiIjANan1jzLQami9z1PoYSZCiiYW2FczPbenXc45FZdBZLzOT+r6+iciuEModtmCti+hjaAk0A==}
+
+ /core-js-compat/3.25.5:
+ resolution: {integrity: sha512-ovcyhs2DEBUIE0MGEKHP4olCUW/XYte3Vroyxuh38rD1wAO4dHohsovUC4eAOuzFxE6b+RXvBU3UZ9o0YhUTkA==}
+ dependencies:
+ browserslist: 4.21.4
+ dev: true
+
+ /core-js-pure/3.25.5:
+ resolution: {integrity: sha512-oml3M22pHM+igfWHDfdLVq2ShWmjM2V4L+dQEBs0DWVIqEm9WHCwGAlZ6BmyBQGy5sFrJmcx+856D9lVKyGWYg==}
+ requiresBuild: true
+ dev: true
+
+ /cose-base/2.1.0:
+ resolution: {integrity: sha512-HTMm07dhxq1dIPGWwpiVrIk9n+DH7KYmqWA786mLe8jDS+1ZjGtJGIIsJVKoseZXS6/FxiUWCJ2B7XzqUCuhPw==}
+ dependencies:
+ layout-base: 2.0.1
+ dev: false
+
+ /cosmiconfig/7.0.1:
+ resolution: {integrity: sha512-a1YWNUV2HwGimB7dU2s1wUMurNKjpx60HxBB6xUM8Re+2s1g1IIfJvFR0/iCF+XHdE0GMTKTuLR32UQff4TEyQ==}
+ engines: {node: '>=10'}
+ dependencies:
+ '@types/parse-json': 4.0.0
+ import-fresh: 3.3.0
+ parse-json: 5.2.0
+ path-type: 4.0.0
+ yaml: 1.10.2
+ dev: false
+
+ /create-require/1.1.1:
+ resolution: {integrity: sha512-dcKFX3jn0MpIaXjisoRvexIJVEKzaq7z2rZKxf+MSr9TkdmHmsU4m2lcLojrj/FHl8mk5VxMmYA+ftRkP/3oKQ==}
+ dev: true
+
+ /cross-spawn/7.0.3:
+ resolution: {integrity: sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==}
+ engines: {node: '>= 8'}
+ dependencies:
+ path-key: 3.1.1
+ shebang-command: 2.0.0
+ which: 2.0.2
+ dev: true
+
+ /crypto-js/4.1.1:
+ resolution: {integrity: sha512-o2JlM7ydqd3Qk9CA0L4NL6mTzU2sdx96a+oOfPu8Mkl/PK51vSyoi8/rQ8NknZtk44vq15lmhAj9CIAGwgeWKw==}
+ dev: false
+
+ /css-box-model/1.2.1:
+ resolution: {integrity: sha512-a7Vr4Q/kd/aw96bnJG332W9V9LkJO69JRcaCYDUqjp6/z0w6VcZjgAcTbgFxEPfBgdnAwlh3iwu+hLopa+flJw==}
+ dependencies:
+ tiny-invariant: 1.3.1
+ dev: false
+
+ /css.escape/1.5.1:
+ resolution: {integrity: sha512-YUifsXXuknHlUsmlgyY0PKzgPOr7/FjCePfHNt0jxm83wHZi44VDMQ7/fGNkjY3/jV1MC+1CmZbaHzugyeRtpg==}
+ dev: true
+
+ /cssom/0.3.8:
+ resolution: {integrity: sha512-b0tGHbfegbhPJpxpiBPU2sCkigAqtM9O121le6bbOlgyV+NyGyCmVfJ6QW9eRjz8CpNfWEOYBIMIGRYkLwsIYg==}
+ dev: true
+
+ /cssom/0.5.0:
+ resolution: {integrity: sha512-iKuQcq+NdHqlAcwUY0o/HL69XQrUaQdMjmStJ8JFmUaiiQErlhrmuigkg/CU4E2J0IyUKUrMAgl36TvN67MqTw==}
+ dev: true
+
+ /cssstyle/2.3.0:
+ resolution: {integrity: sha512-AZL67abkUzIuvcHqk7c09cezpGNcxUxU4Ioi/05xHk4DQeTkWmGYftIE6ctU6AEt+Gn4n1lDStOtj7FKycP71A==}
+ engines: {node: '>=8'}
+ dependencies:
+ cssom: 0.3.8
+ dev: true
+
+ /csstype/3.0.9:
+ resolution: {integrity: sha512-rpw6JPxK6Rfg1zLOYCSwle2GFOOsnjmDYDaBwEcwoOg4qlsIVCN789VkBZDJAGi4T07gI4YSutR43t9Zz4Lzuw==}
+ dev: false
+
+ /csstype/3.1.1:
+ resolution: {integrity: sha512-DJR/VvkAvSZW9bTouZue2sSxDwdTN92uHjqeKVm+0dAqdfNykRzQ95tay8aXMBAAPpUiq4Qcug2L7neoRh2Egw==}
+
+ /cytoscape-canvas/3.0.1:
+ resolution: {integrity: sha512-R1nCLnJHGTR5fWEpNQQBPyoigdnfhnk1lOHegzmzz1Kg6yxzVf0hfdRAMa0wPAhtC4kkgyoViiIfZ/zyCqMhEQ==}
+ dev: false
+
+ /cytoscape-d3-force/1.1.4_cytoscape@3.23.0:
+ resolution: {integrity: sha512-8NjI/yEoB3YqVsdf7ud7Oh8Kyi+C9Lhh1fICmtemIo6EC1ZUtm8KcPNLkQySYO8nRS2mQKj5eVdCr7W0L8ONoQ==}
+ peerDependencies:
+ cytoscape: ^3.2.0
+ dependencies:
+ cytoscape: 3.23.0
+ d3-force: 2.1.1
+ dev: false
+
+ /cytoscape-dagre/2.4.0_cytoscape@3.23.0:
+ resolution: {integrity: sha512-jfOtKzKduCnruBs3YMHS9kqWjZKqvp6loSJwlotPO5pcU4wLUhkx7ZBIyW3VWZXa8wfkGxv/zhWoBxWtYrUxKQ==}
+ peerDependencies:
+ cytoscape: ^3.2.22
+ dependencies:
+ cytoscape: 3.23.0
+ dagre: 0.8.5
+ dev: false
+
+ /cytoscape-fcose/2.1.0_cytoscape@3.23.0:
+ resolution: {integrity: sha512-Q3apPl66jf8/2sMsrCjNP247nbDkyIPjA9g5iPMMWNLZgP3/mn9aryF7EFY/oRPEpv7bKJ4jYmCoU5r5/qAc1Q==}
+ peerDependencies:
+ cytoscape: ^3.2.0
+ dependencies:
+ cose-base: 2.1.0
+ cytoscape: 3.23.0
+ dev: false
+
+ /cytoscape-klay/3.1.4_cytoscape@3.23.0:
+ resolution: {integrity: sha512-VwPj0VR25GPfy6qXVQRi/MYlZM/zkdvRhHlgqbM//lSvstgM6fhp3ik/uM8Wr8nlhskfqz/M1fIDmR6UckbS2A==}
+ peerDependencies:
+ cytoscape: ^3.2.0
+ dependencies:
+ cytoscape: 3.23.0
+ klayjs: 0.4.1
+ dev: false
+
+ /cytoscape/3.23.0:
+ resolution: {integrity: sha512-gRZqJj/1kiAVPkrVFvz/GccxsXhF3Qwpptl32gKKypO4IlqnKBjTOu+HbXtEggSGzC5KCaHp3/F7GgENrtsFkA==}
+ engines: {node: '>=0.10'}
+ dependencies:
+ heap: 0.2.7
+ lodash: 4.17.21
+ dev: false
+
+ /d3-dispatch/2.0.0:
+ resolution: {integrity: sha512-S/m2VsXI7gAti2pBoLClFFTMOO1HTtT0j99AuXLoGFKO6deHDdnv6ZGTxSTTUTgO1zVcv82fCOtDjYK4EECmWA==}
+ dev: false
+
+ /d3-force/2.1.1:
+ resolution: {integrity: sha512-nAuHEzBqMvpFVMf9OX75d00OxvOXdxY+xECIXjW6Gv8BRrXu6gAWbv/9XKrvfJ5i5DCokDW7RYE50LRoK092ew==}
+ dependencies:
+ d3-dispatch: 2.0.0
+ d3-quadtree: 2.0.0
+ d3-timer: 2.0.0
+ dev: false
+
+ /d3-quadtree/2.0.0:
+ resolution: {integrity: sha512-b0Ed2t1UUalJpc3qXzKi+cPGxeXRr4KU9YSlocN74aTzp6R/Ud43t79yLLqxHRWZfsvWXmbDWPpoENK1K539xw==}
+ dev: false
+
+ /d3-timer/2.0.0:
+ resolution: {integrity: sha512-TO4VLh0/420Y/9dO3+f9abDEFYeCUr2WZRlxJvbp4HPTQcSylXNiL6yZa9FIUvV1yRiFufl1bszTCLDqv9PWNA==}
+ dev: false
+
+ /dagre/0.8.5:
+ resolution: {integrity: sha512-/aTqmnRta7x7MCCpExk7HQL2O4owCT2h8NT//9I1OQ9vt29Pa0BzSAkR5lwFUcQ7491yVi/3CXU9jQ5o0Mn2Sw==}
+ dependencies:
+ graphlib: 2.1.8
+ lodash: 4.17.21
+ dev: false
+
+ /data-urls/3.0.2:
+ resolution: {integrity: sha512-Jy/tj3ldjZJo63sVAvg6LHt2mHvl4V6AgRAmNDtLdm7faqtsx+aJG42rsyCo9JCoRVKwPFzKlIPx3DIibwSIaQ==}
+ engines: {node: '>=12'}
+ dependencies:
+ abab: 2.0.6
+ whatwg-mimetype: 3.0.0
+ whatwg-url: 11.0.0
+ dev: true
+
+ /date-fns/2.29.3:
+ resolution: {integrity: sha512-dDCnyH2WnnKusqvZZ6+jA1O51Ibt8ZMRNkDZdyAyK4YfbDwa/cEmuztzG5pk6hqlp9aSBPYcjOlktquahGwGeA==}
+ engines: {node: '>=0.11'}
+ dev: false
+
+ /dayjs/1.11.5:
+ resolution: {integrity: sha512-CAdX5Q3YW3Gclyo5Vpqkgpj8fSdLQcRuzfX6mC6Phy0nfJ0eGYOeS7m4mt2plDWLAtA4TqTakvbboHvUxfe4iA==}
+ dev: false
+
+ /debug/2.6.9:
+ resolution: {integrity: sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==}
+ peerDependencies:
+ supports-color: '*'
+ peerDependenciesMeta:
+ supports-color:
+ optional: true
+ dependencies:
+ ms: 2.0.0
+ dev: true
+
+ /debug/4.3.4:
+ resolution: {integrity: sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==}
+ engines: {node: '>=6.0'}
+ peerDependencies:
+ supports-color: '*'
+ peerDependenciesMeta:
+ supports-color:
+ optional: true
+ dependencies:
+ ms: 2.1.2
+
+ /decimal.js/10.4.2:
+ resolution: {integrity: sha512-ic1yEvwT6GuvaYwBLLY6/aFFgjZdySKTE8en/fkU3QICTmRtgtSlFn0u0BXN06InZwtfCelR7j8LRiDI/02iGA==}
+ dev: true
+
+ /decode-uri-component/0.2.0:
+ resolution: {integrity: sha512-hjf+xovcEn31w/EUYdTXQh/8smFL/dzYjohQGEIgjyNavaJfBY2p5F527Bo1VPATxv0VYTUC2bOcXvqFwk78Og==}
+ engines: {node: '>=0.10'}
+ dev: false
+
+ /dedent/0.7.0:
+ resolution: {integrity: sha512-Q6fKUPqnAHAyhiUgFU7BUzLiv0kd8saH9al7tnu5Q/okj6dnupxyTgFIBjVzJATdfIAm9NAsvXNzjaKa+bxVyA==}
+ dev: true
+
+ /deep-extend/0.6.0:
+ resolution: {integrity: sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA==}
+ engines: {node: '>=4.0.0'}
+ dev: true
+
+ /deep-is/0.1.4:
+ resolution: {integrity: sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==}
+ dev: true
+
+ /deepmerge/4.2.2:
+ resolution: {integrity: sha512-FJ3UgI4gIl+PHZm53knsuSFpE+nESMr7M4v9QcgB7S63Kj/6WqMiFQJpBBYz1Pt+66bZpP3Q7Lye0Oo9MPKEdg==}
+ engines: {node: '>=0.10.0'}
+ dev: true
+
+ /define-properties/1.1.4:
+ resolution: {integrity: sha512-uckOqKcfaVvtBdsVkdPv3XjveQJsNQqmhXgRi8uhvWWuPYZCNlzT8qAyblUgNoXdHdjMTzAqeGjAoli8f+bzPA==}
+ engines: {node: '>= 0.4'}
+ dependencies:
+ has-property-descriptors: 1.0.0
+ object-keys: 1.1.1
+ dev: true
+
+ /delayed-stream/1.0.0:
+ resolution: {integrity: sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==}
+ engines: {node: '>=0.4.0'}
+ dev: true
+
+ /dequal/2.0.3:
+ resolution: {integrity: sha512-0je+qPKHEMohvfRTCEo3CrPG6cAzAYgmzKyxRiYSSDkS6eGJdyVJm7WaYA5ECaAD9wLB2T4EEeymA5aFVcYXCA==}
+ engines: {node: '>=6'}
+ dev: false
+
+ /detect-newline/3.1.0:
+ resolution: {integrity: sha512-TLz+x/vEXm/Y7P7wn1EJFNLxYpUD4TgMosxY6fAVJUnJMbupHBOncxyWUG9OpTaH9EBD7uFI5LfEgmMOc54DsA==}
+ engines: {node: '>=8'}
+ dev: true
+
+ /detect-node/2.1.0:
+ resolution: {integrity: sha512-T0NIuQpnTvFDATNuHN5roPwSBG83rFsuO+MXXH9/3N1eFbn4wcPjttvjMLEPWJ0RGUYgQE7cGgS3tNxbqCGM7g==}
+ dev: false
+
+ /diff-sequences/26.6.2:
+ resolution: {integrity: sha512-Mv/TDa3nZ9sbc5soK+OoA74BsS3mL37yixCvUAQkiuA4Wz6YtwP/K47n2rv2ovzHZvoiQeA5FTQOschKkEwB0Q==}
+ engines: {node: '>= 10.14.2'}
+ dev: true
+
+ /diff-sequences/28.1.1:
+ resolution: {integrity: sha512-FU0iFaH/E23a+a718l8Qa/19bF9p06kgE0KipMOMadwa3SjnaElKzPaUC0vnibs6/B/9ni97s61mcejk8W1fQw==}
+ engines: {node: ^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0}
+ dev: true
+
+ /diff/4.0.2:
+ resolution: {integrity: sha512-58lmxKSA4BNyLz+HHMUzlOEpg09FV+ev6ZMe3vJihgdxzgcwZ8VoEEPmALCZG9LmqfVoNMMKpttIYTVG6uDY7A==}
+ engines: {node: '>=0.3.1'}
+ dev: true
+
+ /dir-glob/3.0.1:
+ resolution: {integrity: sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==}
+ engines: {node: '>=8'}
+ dependencies:
+ path-type: 4.0.0
+ dev: true
+
+ /dnd-core/11.1.3:
+ resolution: {integrity: sha512-QugF55dNW+h+vzxVJ/LSJeTeUw9MCJ2cllhmVThVPEtF16ooBkxj0WBE5RB+AceFxMFo1rO6bJKXtqKl+JNnyA==}
+ dependencies:
+ '@react-dnd/asap': 4.0.1
+ '@react-dnd/invariant': 2.0.0
+ redux: 4.2.0
+ dev: false
+
+ /dnd-core/16.0.1:
+ resolution: {integrity: sha512-HK294sl7tbw6F6IeuK16YSBUoorvHpY8RHO+9yFfaJyCDVb6n7PRcezrOEOa2SBCqiYpemh5Jx20ZcjKdFAVng==}
+ dependencies:
+ '@react-dnd/asap': 5.0.2
+ '@react-dnd/invariant': 4.0.2
+ redux: 4.2.0
+ dev: false
+
+ /doctrine/2.1.0:
+ resolution: {integrity: sha512-35mSku4ZXK0vfCuHEDAwt55dg2jNajHZ1odvF+8SSr82EsZY4QmXfuWso8oEd8zRhVObSN18aM0CjSdoBX7zIw==}
+ engines: {node: '>=0.10.0'}
+ dependencies:
+ esutils: 2.0.3
+ dev: true
+
+ /doctrine/3.0.0:
+ resolution: {integrity: sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==}
+ engines: {node: '>=6.0.0'}
+ dependencies:
+ esutils: 2.0.3
+ dev: true
+
+ /dom-accessibility-api/0.5.14:
+ resolution: {integrity: sha512-NMt+m9zFMPZe0JcY9gN224Qvk6qLIdqex29clBvc/y75ZBX9YA9wNK3frsYvu2DI1xcCIwxwnX+TlsJ2DSOADg==}
+ dev: true
+
+ /dom-align/1.12.3:
+ resolution: {integrity: sha512-Gj9hZN3a07cbR6zviMUBOMPdWxYhbMI+x+WS0NAIu2zFZmbK8ys9R79g+iG9qLnlCwpFoaB+fKy8Pdv470GsPA==}
+ dev: false
+
+ /dom-helpers/5.2.1:
+ resolution: {integrity: sha512-nRCa7CK3VTrM2NmGkIy4cbK7IZlgBE/PYMn55rrXefr5xXDP0LdtfPnblFDoVdcAfslJ7or6iqAUnx0CCGIWQA==}
+ dependencies:
+ '@babel/runtime': 7.19.4
+ csstype: 3.1.1
+ dev: false
+
+ /dom7/4.0.4:
+ resolution: {integrity: sha512-DSSgBzQ4rJWQp1u6o+3FVwMNnT5bzQbMb+o31TjYYeRi05uAcpF8koxdfzeoe5ElzPmua7W7N28YJhF7iEKqIw==}
+ dependencies:
+ ssr-window: 4.0.2
+ dev: false
+
+ /domexception/4.0.0:
+ resolution: {integrity: sha512-A2is4PLG+eeSfoTMA95/s4pvAoSo2mKtiM5jlHkAVewmiO8ISFTFKZjH7UAM1Atli/OT/7JHOrJRJiMKUZKYBw==}
+ engines: {node: '>=12'}
+ dependencies:
+ webidl-conversions: 7.0.0
+ dev: true
+
+ /eastasianwidth/0.2.0:
+ resolution: {integrity: sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==}
+ dev: true
+
+ /electron-to-chromium/1.4.282:
+ resolution: {integrity: sha512-Dki0WhHNh/br/Xi1vAkueU5mtIc9XLHcMKB6tNfQKk+kPG0TEUjRh5QEMAUbRp30/rYNMFD1zKKvbVzwq/4wmg==}
+
+ /emittery/0.10.2:
+ resolution: {integrity: sha512-aITqOwnLanpHLNXZJENbOgjUBeHocD+xsSJmNrjovKBW5HbSpW3d1pEls7GFQPUWXiwG9+0P4GtHfEqC/4M0Iw==}
+ engines: {node: '>=12'}
+ dev: true
+
+ /emoji-regex/8.0.0:
+ resolution: {integrity: sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==}
+ dev: true
+
+ /emoji-regex/9.2.2:
+ resolution: {integrity: sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==}
+ dev: true
+
+ /emojis-list/3.0.0:
+ resolution: {integrity: sha512-/kyM18EfinwXZbno9FyUGeFh87KC8HRQBQGildHZbEuRyWFOmv1U10o9BBp8XVZDVNNuQKyIGIu5ZYAAXJ0V2Q==}
+ engines: {node: '>= 4'}
+ dev: true
+
+ /enhanced-resolve/5.10.0:
+ resolution: {integrity: sha512-T0yTFjdpldGY8PmuXXR0PyQ1ufZpEGiHVrp7zHKB7jdR4qlmZHhONVM5AQOAWXuF/w3dnHbEQVrNptJgt7F+cQ==}
+ engines: {node: '>=10.13.0'}
+ dependencies:
+ graceful-fs: 4.2.10
+ tapable: 2.2.1
+ dev: true
+
+ /enquire.js/2.1.6:
+ resolution: {integrity: sha512-/KujNpO+PT63F7Hlpu4h3pE3TokKRHN26JYmQpPyjkRD/N57R7bPDNojMXdi7uveAKjYB7yQnartCxZnFWr0Xw==}
+ dev: false
+
+ /enquirer/2.3.6:
+ resolution: {integrity: sha512-yjNnPr315/FjS4zIsUxYguYUPP2e1NK4d7E7ZOLiyYCcbFBiTMyID+2wvm2w6+pZ/odMA7cRkjhsPbltwBOrLg==}
+ engines: {node: '>=8.6'}
+ dependencies:
+ ansi-colors: 4.1.3
+ dev: true
+
+ /entities/4.4.0:
+ resolution: {integrity: sha512-oYp7156SP8LkeGD0GF85ad1X9Ai79WtRsZ2gxJqtBuzH+98YUV6jkHEKlZkMbcrjJjIVJNIDP/3WL9wQkoPbWA==}
+ engines: {node: '>=0.12'}
+ dev: true
+
+ /error-ex/1.3.2:
+ resolution: {integrity: sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==}
+ dependencies:
+ is-arrayish: 0.2.1
+
+ /es-abstract/1.20.4:
+ resolution: {integrity: sha512-0UtvRN79eMe2L+UNEF1BwRe364sj/DXhQ/k5FmivgoSdpM90b8Jc0mDzKMGo7QS0BVbOP/bTwBKNnDc9rNzaPA==}
+ engines: {node: '>= 0.4'}
+ dependencies:
+ call-bind: 1.0.2
+ es-to-primitive: 1.2.1
+ function-bind: 1.1.1
+ function.prototype.name: 1.1.5
+ get-intrinsic: 1.1.3
+ get-symbol-description: 1.0.0
+ has: 1.0.3
+ has-property-descriptors: 1.0.0
+ has-symbols: 1.0.3
+ internal-slot: 1.0.3
+ is-callable: 1.2.7
+ is-negative-zero: 2.0.2
+ is-regex: 1.1.4
+ is-shared-array-buffer: 1.0.2
+ is-string: 1.0.7
+ is-weakref: 1.0.2
+ object-inspect: 1.12.2
+ object-keys: 1.1.1
+ object.assign: 4.1.4
+ regexp.prototype.flags: 1.4.3
+ safe-regex-test: 1.0.0
+ string.prototype.trimend: 1.0.5
+ string.prototype.trimstart: 1.0.5
+ unbox-primitive: 1.0.2
+ dev: true
+
+ /es-module-lexer/0.9.3:
+ resolution: {integrity: sha512-1HQ2M2sPtxwnvOvT1ZClHyQDiggdNjURWpY2we6aMKCQiUVxTmVs2UYPLIrD84sS+kMdUwfBSylbJPwNnBrnHQ==}
+ dev: true
+
+ /es-shim-unscopables/1.0.0:
+ resolution: {integrity: sha512-Jm6GPcCdC30eMLbZ2x8z2WuRwAws3zTBBKuusffYVUrNj/GVSUAZ+xKMaUpfNDR5IbyNA5LJbaecoUVbmUcB1w==}
+ dependencies:
+ has: 1.0.3
+ dev: true
+
+ /es-to-primitive/1.2.1:
+ resolution: {integrity: sha512-QCOllgZJtaUo9miYBcLChTUaHNjJF3PYs1VidD7AwiEj1kYxKeQTctLAezAOH5ZKRH0g2IgPn6KwB4IT8iRpvA==}
+ engines: {node: '>= 0.4'}
+ dependencies:
+ is-callable: 1.2.7
+ is-date-object: 1.0.5
+ is-symbol: 1.0.4
+ dev: true
+
+ /esbuild-android-64/0.15.10:
+ resolution: {integrity: sha512-UI7krF8OYO1N7JYTgLT9ML5j4+45ra3amLZKx7LO3lmLt1Ibn8t3aZbX5Pu4BjWiqDuJ3m/hsvhPhK/5Y/YpnA==}
+ engines: {node: '>=12'}
+ cpu: [x64]
+ os: [android]
+ requiresBuild: true
+ dev: true
+ optional: true
+
+ /esbuild-android-arm64/0.15.10:
+ resolution: {integrity: sha512-EOt55D6xBk5O05AK8brXUbZmoFj4chM8u3riGflLa6ziEoVvNjRdD7Cnp82NHQGfSHgYR06XsPI8/sMuA/cUwg==}
+ engines: {node: '>=12'}
+ cpu: [arm64]
+ os: [android]
+ requiresBuild: true
+ dev: true
+ optional: true
+
+ /esbuild-darwin-64/0.15.10:
+ resolution: {integrity: sha512-hbDJugTicqIm+WKZgp208d7FcXcaK8j2c0l+fqSJ3d2AzQAfjEYDRM3Z2oMeqSJ9uFxyj/muSACLdix7oTstRA==}
+ engines: {node: '>=12'}
+ cpu: [x64]
+ os: [darwin]
+ requiresBuild: true
+ dev: true
+ optional: true
+
+ /esbuild-darwin-arm64/0.15.10:
+ resolution: {integrity: sha512-M1t5+Kj4IgSbYmunf2BB6EKLkWUq+XlqaFRiGOk8bmBapu9bCDrxjf4kUnWn59Dka3I27EiuHBKd1rSO4osLFQ==}
+ engines: {node: '>=12'}
+ cpu: [arm64]
+ os: [darwin]
+ requiresBuild: true
+ dev: true
+ optional: true
+
+ /esbuild-freebsd-64/0.15.10:
+ resolution: {integrity: sha512-KMBFMa7C8oc97nqDdoZwtDBX7gfpolkk6Bcmj6YFMrtCMVgoU/x2DI1p74DmYl7CSS6Ppa3xgemrLrr5IjIn0w==}
+ engines: {node: '>=12'}
+ cpu: [x64]
+ os: [freebsd]
+ requiresBuild: true
+ dev: true
+ optional: true
+
+ /esbuild-freebsd-arm64/0.15.10:
+ resolution: {integrity: sha512-m2KNbuCX13yQqLlbSojFMHpewbn8wW5uDS6DxRpmaZKzyq8Dbsku6hHvh2U+BcLwWY4mpgXzFUoENEf7IcioGg==}
+ engines: {node: '>=12'}
+ cpu: [arm64]
+ os: [freebsd]
+ requiresBuild: true
+ dev: true
+ optional: true
+
+ /esbuild-linux-32/0.15.10:
+ resolution: {integrity: sha512-guXrwSYFAvNkuQ39FNeV4sNkNms1bLlA5vF1H0cazZBOLdLFIny6BhT+TUbK/hdByMQhtWQ5jI9VAmPKbVPu1w==}
+ engines: {node: '>=12'}
+ cpu: [ia32]
+ os: [linux]
+ requiresBuild: true
+ dev: true
+ optional: true
+
+ /esbuild-linux-64/0.15.10:
+ resolution: {integrity: sha512-jd8XfaSJeucMpD63YNMO1JCrdJhckHWcMv6O233bL4l6ogQKQOxBYSRP/XLWP+6kVTu0obXovuckJDcA0DKtQA==}
+ engines: {node: '>=12'}
+ cpu: [x64]
+ os: [linux]
+ requiresBuild: true
+ dev: true
+ optional: true
+
+ /esbuild-linux-arm/0.15.10:
+ resolution: {integrity: sha512-6N8vThLL/Lysy9y4Ex8XoLQAlbZKUyExCWyayGi2KgTBelKpPgj6RZnUaKri0dHNPGgReJriKVU6+KDGQwn10A==}
+ engines: {node: '>=12'}
+ cpu: [arm]
+ os: [linux]
+ requiresBuild: true
+ dev: true
+ optional: true
+
+ /esbuild-linux-arm64/0.15.10:
+ resolution: {integrity: sha512-GByBi4fgkvZFTHFDYNftu1DQ1GzR23jws0oWyCfhnI7eMOe+wgwWrc78dbNk709Ivdr/evefm2PJiUBMiusS1A==}
+ engines: {node: '>=12'}
+ cpu: [arm64]
+ os: [linux]
+ requiresBuild: true
+ dev: true
+ optional: true
+
+ /esbuild-linux-mips64le/0.15.10:
+ resolution: {integrity: sha512-BxP+LbaGVGIdQNJUNF7qpYjEGWb0YyHVSKqYKrn+pTwH/SiHUxFyJYSP3pqkku61olQiSBnSmWZ+YUpj78Tw7Q==}
+ engines: {node: '>=12'}
+ cpu: [mips64el]
+ os: [linux]
+ requiresBuild: true
+ dev: true
+ optional: true
+
+ /esbuild-linux-ppc64le/0.15.10:
+ resolution: {integrity: sha512-LoSQCd6498PmninNgqd/BR7z3Bsk/mabImBWuQ4wQgmQEeanzWd5BQU2aNi9mBURCLgyheuZS6Xhrw5luw3OkQ==}
+ engines: {node: '>=12'}
+ cpu: [ppc64]
+ os: [linux]
+ requiresBuild: true
+ dev: true
+ optional: true
+
+ /esbuild-linux-riscv64/0.15.10:
+ resolution: {integrity: sha512-Lrl9Cr2YROvPV4wmZ1/g48httE8z/5SCiXIyebiB5N8VT7pX3t6meI7TQVHw/wQpqP/AF4SksDuFImPTM7Z32Q==}
+ engines: {node: '>=12'}
+ cpu: [riscv64]
+ os: [linux]
+ requiresBuild: true
+ dev: true
+ optional: true
+
+ /esbuild-linux-s390x/0.15.10:
+ resolution: {integrity: sha512-ReP+6q3eLVVP2lpRrvl5EodKX7EZ1bS1/z5j6hsluAlZP5aHhk6ghT6Cq3IANvvDdscMMCB4QEbI+AjtvoOFpA==}
+ engines: {node: '>=12'}
+ cpu: [s390x]
+ os: [linux]
+ requiresBuild: true
+ dev: true
+ optional: true
+
+ /esbuild-loader/2.20.0_webpack@5.74.0:
+ resolution: {integrity: sha512-dr+j8O4w5RvqZ7I4PPB4EIyVTd679EBQnMm+JBB7av+vu05Zpje2IpK5N3ld1VWa+WxrInIbNFAg093+E1aRsA==}
+ peerDependencies:
+ webpack: ^4.40.0 || ^5.0.0
+ dependencies:
+ esbuild: 0.15.10
+ joycon: 3.1.1
+ json5: 2.2.1
+ loader-utils: 2.0.2
+ tapable: 2.2.1
+ webpack: 5.74.0
+ webpack-sources: 2.3.1
+ dev: true
+
+ /esbuild-netbsd-64/0.15.10:
+ resolution: {integrity: sha512-iGDYtJCMCqldMskQ4eIV+QSS/CuT7xyy9i2/FjpKvxAuCzrESZXiA1L64YNj6/afuzfBe9i8m/uDkFHy257hTw==}
+ engines: {node: '>=12'}
+ cpu: [x64]
+ os: [netbsd]
+ requiresBuild: true
+ dev: true
+ optional: true
+
+ /esbuild-openbsd-64/0.15.10:
+ resolution: {integrity: sha512-ftMMIwHWrnrYnvuJQRJs/Smlcb28F9ICGde/P3FUTCgDDM0N7WA0o9uOR38f5Xe2/OhNCgkjNeb7QeaE3cyWkQ==}
+ engines: {node: '>=12'}
+ cpu: [x64]
+ os: [openbsd]
+ requiresBuild: true
+ dev: true
+ optional: true
+
+ /esbuild-sunos-64/0.15.10:
+ resolution: {integrity: sha512-mf7hBL9Uo2gcy2r3rUFMjVpTaGpFJJE5QTDDqUFf1632FxteYANffDZmKbqX0PfeQ2XjUDE604IcE7OJeoHiyg==}
+ engines: {node: '>=12'}
+ cpu: [x64]
+ os: [sunos]
+ requiresBuild: true
+ dev: true
+ optional: true
+
+ /esbuild-windows-32/0.15.10:
+ resolution: {integrity: sha512-ttFVo+Cg8b5+qHmZHbEc8Vl17kCleHhLzgT8X04y8zudEApo0PxPg9Mz8Z2cKH1bCYlve1XL8LkyXGFjtUYeGg==}
+ engines: {node: '>=12'}
+ cpu: [ia32]
+ os: [win32]
+ requiresBuild: true
+ dev: true
+ optional: true
+
+ /esbuild-windows-64/0.15.10:
+ resolution: {integrity: sha512-2H0gdsyHi5x+8lbng3hLbxDWR7mKHWh5BXZGKVG830KUmXOOWFE2YKJ4tHRkejRduOGDrBvHBriYsGtmTv3ntA==}
+ engines: {node: '>=12'}
+ cpu: [x64]
+ os: [win32]
+ requiresBuild: true
+ dev: true
+ optional: true
+
+ /esbuild-windows-arm64/0.15.10:
+ resolution: {integrity: sha512-S+th4F+F8VLsHLR0zrUcG+Et4hx0RKgK1eyHc08kztmLOES8BWwMiaGdoW9hiXuzznXQ0I/Fg904MNbr11Nktw==}
+ engines: {node: '>=12'}
+ cpu: [arm64]
+ os: [win32]
+ requiresBuild: true
+ dev: true
+ optional: true
+
+ /esbuild/0.15.10:
+ resolution: {integrity: sha512-N7wBhfJ/E5fzn/SpNgX+oW2RLRjwaL8Y0ezqNqhjD6w0H2p0rDuEz2FKZqpqLnO8DCaWumKe8dsC/ljvVSSxng==}
+ engines: {node: '>=12'}
+ hasBin: true
+ requiresBuild: true
+ optionalDependencies:
+ '@esbuild/android-arm': 0.15.10
+ '@esbuild/linux-loong64': 0.15.10
+ esbuild-android-64: 0.15.10
+ esbuild-android-arm64: 0.15.10
+ esbuild-darwin-64: 0.15.10
+ esbuild-darwin-arm64: 0.15.10
+ esbuild-freebsd-64: 0.15.10
+ esbuild-freebsd-arm64: 0.15.10
+ esbuild-linux-32: 0.15.10
+ esbuild-linux-64: 0.15.10
+ esbuild-linux-arm: 0.15.10
+ esbuild-linux-arm64: 0.15.10
+ esbuild-linux-mips64le: 0.15.10
+ esbuild-linux-ppc64le: 0.15.10
+ esbuild-linux-riscv64: 0.15.10
+ esbuild-linux-s390x: 0.15.10
+ esbuild-netbsd-64: 0.15.10
+ esbuild-openbsd-64: 0.15.10
+ esbuild-sunos-64: 0.15.10
+ esbuild-windows-32: 0.15.10
+ esbuild-windows-64: 0.15.10
+ esbuild-windows-arm64: 0.15.10
+ dev: true
+
+ /escalade/3.1.1:
+ resolution: {integrity: sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==}
+ engines: {node: '>=6'}
+
+ /escape-string-regexp/1.0.5:
+ resolution: {integrity: sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==}
+ engines: {node: '>=0.8.0'}
+
+ /escape-string-regexp/2.0.0:
+ resolution: {integrity: sha512-UpzcLCXolUWcNu5HtVMHYdXJjArjsF9C0aNnquZYY4uW/Vu0miy5YoWvbV345HauVvcAUnpRuhMMcqTcGOY2+w==}
+ engines: {node: '>=8'}
+ dev: true
+
+ /escape-string-regexp/4.0.0:
+ resolution: {integrity: sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==}
+ engines: {node: '>=10'}
+
+ /escodegen/2.0.0:
+ resolution: {integrity: sha512-mmHKys/C8BFUGI+MAWNcSYoORYLMdPzjrknd2Vc+bUsjN5bXcr8EhrNB+UTqfL1y3I9c4fw2ihgtMPQLBRiQxw==}
+ engines: {node: '>=6.0'}
+ hasBin: true
+ dependencies:
+ esprima: 4.0.1
+ estraverse: 5.3.0
+ esutils: 2.0.3
+ optionator: 0.8.3
+ optionalDependencies:
+ source-map: 0.6.1
+ dev: true
+
+ /eslint-plugin-react-hooks/4.6.0_eslint@7.32.0:
+ resolution: {integrity: sha512-oFc7Itz9Qxh2x4gNHStv3BqJq54ExXmfC+a1NjAta66IAN87Wu0R/QArgIS9qKzX3dXKPI9H5crl9QchNMY9+g==}
+ engines: {node: '>=10'}
+ peerDependencies:
+ eslint: ^3.0.0 || ^4.0.0 || ^5.0.0 || ^6.0.0 || ^7.0.0 || ^8.0.0-0
+ dependencies:
+ eslint: 7.32.0
+ dev: true
+
+ /eslint-plugin-react/7.31.10_eslint@7.32.0:
+ resolution: {integrity: sha512-e4N/nc6AAlg4UKW/mXeYWd3R++qUano5/o+t+wnWxIf+bLsOaH3a4q74kX3nDjYym3VBN4HyO9nEn1GcAqgQOA==}
+ engines: {node: '>=4'}
+ peerDependencies:
+ eslint: ^3 || ^4 || ^5 || ^6 || ^7 || ^8
+ dependencies:
+ array-includes: 3.1.5
+ array.prototype.flatmap: 1.3.0
+ doctrine: 2.1.0
+ eslint: 7.32.0
+ estraverse: 5.3.0
+ jsx-ast-utils: 3.3.3
+ minimatch: 3.1.2
+ object.entries: 1.1.5
+ object.fromentries: 2.0.5
+ object.hasown: 1.1.1
+ object.values: 1.1.5
+ prop-types: 15.8.1
+ resolve: 2.0.0-next.4
+ semver: 6.3.0
+ string.prototype.matchall: 4.0.7
+ dev: true
+
+ /eslint-scope/5.1.1:
+ resolution: {integrity: sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw==}
+ engines: {node: '>=8.0.0'}
+ dependencies:
+ esrecurse: 4.3.0
+ estraverse: 4.3.0
+ dev: true
+
+ /eslint-utils/2.1.0:
+ resolution: {integrity: sha512-w94dQYoauyvlDc43XnGB8lU3Zt713vNChgt4EWwhXAP2XkBvndfxF0AgIqKOOasjPIPzj9JqgwkwbCYD0/V3Zg==}
+ engines: {node: '>=6'}
+ dependencies:
+ eslint-visitor-keys: 1.3.0
+ dev: true
+
+ /eslint-utils/3.0.0_eslint@7.32.0:
+ resolution: {integrity: sha512-uuQC43IGctw68pJA1RgbQS8/NP7rch6Cwd4j3ZBtgo4/8Flj4eGE7ZYSZRN3iq5pVUv6GPdW5Z1RFleo84uLDA==}
+ engines: {node: ^10.0.0 || ^12.0.0 || >= 14.0.0}
+ peerDependencies:
+ eslint: '>=5'
+ dependencies:
+ eslint: 7.32.0
+ eslint-visitor-keys: 2.1.0
+ dev: true
+
+ /eslint-visitor-keys/1.3.0:
+ resolution: {integrity: sha512-6J72N8UNa462wa/KFODt/PJ3IU60SDpC3QXC1Hjc1BXXpfL2C9R5+AU7jhe0F6GREqVMh4Juu+NY7xn+6dipUQ==}
+ engines: {node: '>=4'}
+ dev: true
+
+ /eslint-visitor-keys/2.1.0:
+ resolution: {integrity: sha512-0rSmRBzXgDzIsD6mGdJgevzgezI534Cer5L/vyMX0kHzT/jiB43jRhd9YUlMGYLQy2zprNmoT8qasCGtY+QaKw==}
+ engines: {node: '>=10'}
+ dev: true
+
+ /eslint-visitor-keys/3.3.0:
+ resolution: {integrity: sha512-mQ+suqKJVyeuwGYHAdjMFqjCyfl8+Ldnxuyp3ldiMBFKkvytrXUZWaiPCEav8qDHKty44bD+qV1IP4T+w+xXRA==}
+ engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0}
+ dev: true
+
+ /eslint/7.32.0:
+ resolution: {integrity: sha512-VHZ8gX+EDfz+97jGcgyGCyRia/dPOd6Xh9yPv8Bl1+SoaIwD+a/vlrOmGRUyOYu7MwUhc7CxqeaDZU13S4+EpA==}
+ engines: {node: ^10.12.0 || >=12.0.0}
+ hasBin: true
+ dependencies:
+ '@babel/code-frame': 7.12.11
+ '@eslint/eslintrc': 0.4.3
+ '@humanwhocodes/config-array': 0.5.0
+ ajv: 6.12.6
+ chalk: 4.1.2
+ cross-spawn: 7.0.3
+ debug: 4.3.4
+ doctrine: 3.0.0
+ enquirer: 2.3.6
+ escape-string-regexp: 4.0.0
+ eslint-scope: 5.1.1
+ eslint-utils: 2.1.0
+ eslint-visitor-keys: 2.1.0
+ espree: 7.3.1
+ esquery: 1.4.0
+ esutils: 2.0.3
+ fast-deep-equal: 3.1.3
+ file-entry-cache: 6.0.1
+ functional-red-black-tree: 1.0.1
+ glob-parent: 5.1.2
+ globals: 13.17.0
+ ignore: 4.0.6
+ import-fresh: 3.3.0
+ imurmurhash: 0.1.4
+ is-glob: 4.0.3
+ js-yaml: 3.14.1
+ 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.1
+ progress: 2.0.3
+ regexpp: 3.2.0
+ semver: 7.3.8
+ strip-ansi: 6.0.1
+ strip-json-comments: 3.1.1
+ table: 6.8.0
+ text-table: 0.2.0
+ v8-compile-cache: 2.3.0
+ transitivePeerDependencies:
+ - supports-color
+ dev: true
+
+ /espree/7.3.1:
+ resolution: {integrity: sha512-v3JCNCE64umkFpmkFGqzVKsOT0tN1Zr+ueqLZfpV1Ob8e+CEgPWa+OxCoGH3tnhimMKIaBm4m/vaRpJ/krRz2g==}
+ engines: {node: ^10.12.0 || >=12.0.0}
+ dependencies:
+ acorn: 7.4.1
+ acorn-jsx: 5.3.2_acorn@7.4.1
+ eslint-visitor-keys: 1.3.0
+ dev: true
+
+ /esprima/4.0.1:
+ resolution: {integrity: sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==}
+ engines: {node: '>=4'}
+ hasBin: true
+ dev: true
+
+ /esquery/1.4.0:
+ resolution: {integrity: sha512-cCDispWt5vHHtwMY2YrAQ4ibFkAL8RbH5YGBnZBc90MolvvfkkQcJro/aZiAQUlQ3qgrYS6D6v8Gc5G5CQsc9w==}
+ engines: {node: '>=0.10'}
+ dependencies:
+ estraverse: 5.3.0
+ dev: true
+
+ /esrecurse/4.3.0:
+ resolution: {integrity: sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==}
+ engines: {node: '>=4.0'}
+ dependencies:
+ estraverse: 5.3.0
+ dev: true
+
+ /estraverse/4.3.0:
+ resolution: {integrity: sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==}
+ engines: {node: '>=4.0'}
+ dev: true
+
+ /estraverse/5.3.0:
+ resolution: {integrity: sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==}
+ engines: {node: '>=4.0'}
+ dev: true
+
+ /esutils/2.0.3:
+ resolution: {integrity: sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==}
+ engines: {node: '>=0.10.0'}
+ dev: true
+
+ /events/3.3.0:
+ resolution: {integrity: sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q==}
+ engines: {node: '>=0.8.x'}
+ dev: true
+
+ /execa/5.1.1:
+ resolution: {integrity: sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg==}
+ engines: {node: '>=10'}
+ dependencies:
+ cross-spawn: 7.0.3
+ get-stream: 6.0.1
+ human-signals: 2.1.0
+ is-stream: 2.0.1
+ merge-stream: 2.0.0
+ npm-run-path: 4.0.1
+ onetime: 5.1.2
+ signal-exit: 3.0.7
+ strip-final-newline: 2.0.0
+ dev: true
+
+ /execa/6.1.0:
+ resolution: {integrity: sha512-QVWlX2e50heYJcCPG0iWtf8r0xjEYfz/OYLGDYH+IyjWezzPNxz63qNFOu0l4YftGWuizFVZHHs8PrLU5p2IDA==}
+ engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0}
+ dependencies:
+ cross-spawn: 7.0.3
+ get-stream: 6.0.1
+ human-signals: 3.0.1
+ is-stream: 3.0.0
+ merge-stream: 2.0.0
+ npm-run-path: 5.1.0
+ onetime: 6.0.0
+ signal-exit: 3.0.7
+ strip-final-newline: 3.0.0
+ dev: true
+
+ /exenv/1.2.2:
+ resolution: {integrity: sha512-Z+ktTxTwv9ILfgKCk32OX3n/doe+OcLTRtqK9pcL+JsP3J1/VW8Uvl4ZjLlKqeW4rzK4oesDOGMEMRIZqtP4Iw==}
+ dev: false
+
+ /exit/0.1.2:
+ resolution: {integrity: sha512-Zk/eNKV2zbjpKzrsQ+n1G6poVbErQxJ0LBOJXaKZ1EViLzH+hrLu9cdXI4zw9dBQJslwBEpbQ2P1oS7nDxs6jQ==}
+ engines: {node: '>= 0.8.0'}
+ dev: true
+
+ /expect/28.1.3:
+ resolution: {integrity: sha512-eEh0xn8HlsuOBxFgIss+2mX85VAS4Qy3OSkjV7rlBWljtA4oWH37glVGyOZSZvErDT/yBywZdPGwCXuTvSG85g==}
+ engines: {node: ^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0}
+ dependencies:
+ '@jest/expect-utils': 28.1.3
+ jest-get-type: 28.0.2
+ jest-matcher-utils: 28.1.3
+ jest-message-util: 28.1.3
+ jest-util: 28.1.3
+ dev: true
+
+ /fast-deep-equal/3.1.3:
+ resolution: {integrity: sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==}
+ dev: true
+
+ /fast-glob/3.2.12:
+ resolution: {integrity: sha512-DVj4CQIYYow0BlaelwK1pHl5n5cRSJfM60UA0zK891sVInoPri2Ekj7+e1CT3/3qxXenpI+nBBmQAcJPJgaj4w==}
+ engines: {node: '>=8.6.0'}
+ dependencies:
+ '@nodelib/fs.stat': 2.0.5
+ '@nodelib/fs.walk': 1.2.8
+ glob-parent: 5.1.2
+ merge2: 1.4.1
+ micromatch: 4.0.5
+ dev: true
+
+ /fast-json-stable-stringify/2.1.0:
+ resolution: {integrity: sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==}
+ dev: true
+
+ /fast-levenshtein/2.0.6:
+ resolution: {integrity: sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==}
+ dev: true
+
+ /fast-url-parser/1.1.3:
+ resolution: {integrity: sha512-5jOCVXADYNuRkKFzNJ0dCCewsZiYo0dz8QNYljkOpFC6r2U4OBmKtvm/Tsuh4w1YYdDqDb31a8TVhBJ2OJKdqQ==}
+ dependencies:
+ punycode: 1.4.1
+ dev: true
+
+ /fastq/1.13.0:
+ resolution: {integrity: sha512-YpkpUnK8od0o1hmeSc7UUs/eB/vIPWJYjKck2QKIzAf71Vm1AAQ3EbuZB3g2JIy+pg+ERD0vqI79KyZiB2e2Nw==}
+ dependencies:
+ reusify: 1.0.4
+ dev: true
+
+ /fb-watchman/2.0.2:
+ resolution: {integrity: sha512-p5161BqbuCaSnB8jIbzQHOlpgsPmK5rJVDfDKO91Axs5NC1uu3HRQm6wt9cd9/+GtQQIO53JdGXXoyDpTAsgYA==}
+ dependencies:
+ bser: 2.1.1
+ dev: true
+
+ /file-entry-cache/6.0.1:
+ resolution: {integrity: sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg==}
+ engines: {node: ^10.12.0 || >=12.0.0}
+ dependencies:
+ flat-cache: 3.0.4
+ dev: true
+
+ /file-saver/2.0.5:
+ resolution: {integrity: sha512-P9bmyZ3h/PRG+Nzga+rbdI4OEpNDzAVyy74uVO9ATgzLK6VtAsYybF/+TOCvrc0MO793d6+42lLyZTw7/ArVzA==}
+ dev: false
+
+ /fill-range/7.0.1:
+ resolution: {integrity: sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==}
+ engines: {node: '>=8'}
+ dependencies:
+ to-regex-range: 5.0.1
+ dev: true
+
+ /filter-console/0.1.1:
+ resolution: {integrity: sha512-zrXoV1Uaz52DqPs+qEwNJWJFAWZpYJ47UNmpN9q4j+/EYsz85uV0DC9k8tRND5kYmoVzL0W+Y75q4Rg8sRJCdg==}
+ engines: {node: '>=8'}
+ dev: true
+
+ /filter-obj/1.1.0:
+ resolution: {integrity: sha512-8rXg1ZnX7xzy2NGDVkBVaAy+lSlPNwad13BtgSlLuxfIslyt5Vg64U7tFcCt4WS1R0hvtnQybT/IyCkGZ3DpXQ==}
+ engines: {node: '>=0.10.0'}
+ dev: false
+
+ /find-root/1.1.0:
+ resolution: {integrity: sha512-NKfW6bec6GfKc0SGx1e07QZY9PE99u0Bft/0rzSD5k3sO/vwkVUpDUKVm5Gpp5Ue3YfShPFTX2070tDs5kB9Ng==}
+ dev: false
+
+ /find-up/4.1.0:
+ resolution: {integrity: sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==}
+ engines: {node: '>=8'}
+ dependencies:
+ locate-path: 5.0.0
+ path-exists: 4.0.0
+ dev: true
+
+ /flat-cache/3.0.4:
+ resolution: {integrity: sha512-dm9s5Pw7Jc0GvMYbshN6zchCA9RgQlzzEZX3vylR9IqFfS8XciblUXOKfW6SiuJ0e13eDYZoZV5wdrev7P3Nwg==}
+ engines: {node: ^10.12.0 || >=12.0.0}
+ dependencies:
+ flatted: 3.2.7
+ rimraf: 3.0.2
+ dev: true
+
+ /flatted/3.2.7:
+ resolution: {integrity: sha512-5nqDSxl8nn5BSNxyR3n4I6eDmbolI6WT+QqR547RwxQapgjQBmtktdP+HTBb/a/zLsbzERTONyUB5pefh5TtjQ==}
+ dev: true
+
+ /form-data/4.0.0:
+ resolution: {integrity: sha512-ETEklSGi5t0QMZuiXoA/Q6vcnxcLQP5vdugSpuAyi6SVGi2clPPp+xgEhuMaHC+zGgn31Kd235W35f7Hykkaww==}
+ engines: {node: '>= 6'}
+ dependencies:
+ asynckit: 0.4.0
+ combined-stream: 1.0.8
+ mime-types: 2.1.35
+ dev: true
+
+ /framer-motion/2.9.5_sfoxds7t5ydpegc3knd667wn6m:
+ resolution: {integrity: sha512-epSX4Co1YbDv0mjfHouuY0q361TpHE7WQzCp/xMTilxy4kXd+Z23uJzPVorfzbm1a/9q1Yu8T5bndaw65NI4Tg==}
+ peerDependencies:
+ react: '>=16.8'
+ react-dom: '>=16.8'
+ dependencies:
+ framesync: 4.1.0
+ hey-listen: 1.0.8
+ popmotion: 9.0.0-rc.20
+ react: 17.0.2
+ react-dom: 17.0.2_react@17.0.2
+ style-value-types: 3.2.0
+ tslib: 1.14.1
+ optionalDependencies:
+ '@emotion/is-prop-valid': 0.8.8
+ dev: false
+
+ /framesync/4.1.0:
+ resolution: {integrity: sha512-MmgZ4wCoeVxNbx2xp5hN/zPDCbLSKiDt4BbbslK7j/pM2lg5S0vhTNv1v8BCVb99JPIo6hXBFdwzU7Q4qcAaoQ==}
+ dependencies:
+ hey-listen: 1.0.8
+ dev: false
+
+ /fs.realpath/1.0.0:
+ resolution: {integrity: sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==}
+
+ /fsevents/2.3.2:
+ resolution: {integrity: sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==}
+ engines: {node: ^8.16.0 || ^10.6.0 || >=11.0.0}
+ os: [darwin]
+ requiresBuild: true
+ dev: true
+ optional: true
+
+ /function-bind/1.1.1:
+ resolution: {integrity: sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==}
+
+ /function.prototype.name/1.1.5:
+ resolution: {integrity: sha512-uN7m/BzVKQnCUF/iW8jYea67v++2u7m5UgENbHRtdDVclOUP+FMPlCNdmk0h/ysGyo2tavMJEDqJAkJdRa1vMA==}
+ engines: {node: '>= 0.4'}
+ dependencies:
+ call-bind: 1.0.2
+ define-properties: 1.1.4
+ es-abstract: 1.20.4
+ functions-have-names: 1.2.3
+ dev: true
+
+ /functional-red-black-tree/1.0.1:
+ resolution: {integrity: sha512-dsKNQNdj6xA3T+QlADDA7mOSlX0qiMINjn0cgr+eGHGsbSHzTabcIogz2+p/iqP1Xs6EP/sS2SbqH+brGTbq0g==}
+ dev: true
+
+ /functions-have-names/1.2.3:
+ resolution: {integrity: sha512-xckBUXyTIqT97tq2x2AMb+g163b5JFysYk0x4qxNFwbfQkmNZoiRHb6sPzI9/QV33WeuvVYBUIiD4NzNIyqaRQ==}
+ dev: true
+
+ /gensync/1.0.0-beta.2:
+ resolution: {integrity: sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==}
+ engines: {node: '>=6.9.0'}
+
+ /get-caller-file/2.0.5:
+ resolution: {integrity: sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==}
+ engines: {node: 6.* || 8.* || >= 10.*}
+ dev: true
+
+ /get-intrinsic/1.1.3:
+ resolution: {integrity: sha512-QJVz1Tj7MS099PevUG5jvnt9tSkXN8K14dxQlikJuPt4uD9hHAHjLyLBiLR5zELelBdD9QNRAXZzsJx0WaDL9A==}
+ dependencies:
+ function-bind: 1.1.1
+ has: 1.0.3
+ has-symbols: 1.0.3
+ dev: true
+
+ /get-package-type/0.1.0:
+ resolution: {integrity: sha512-pjzuKtY64GYfWizNAJ0fr9VqttZkNiK2iS430LtIHzjBEr6bX8Am2zm4sW4Ro5wjWW5cAlRL1qAMTcXbjNAO2Q==}
+ engines: {node: '>=8.0.0'}
+ dev: true
+
+ /get-stream/6.0.1:
+ resolution: {integrity: sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==}
+ engines: {node: '>=10'}
+ dev: true
+
+ /get-symbol-description/1.0.0:
+ resolution: {integrity: sha512-2EmdH1YvIQiZpltCNgkuiUnyukzxM/R6NDJX31Ke3BG1Nq5b0S2PhX59UKi9vZpPDQVdqn+1IcaAwnzTT5vCjw==}
+ engines: {node: '>= 0.4'}
+ dependencies:
+ call-bind: 1.0.2
+ get-intrinsic: 1.1.3
+ dev: true
+
+ /glob-parent/5.1.2:
+ resolution: {integrity: sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==}
+ engines: {node: '>= 6'}
+ dependencies:
+ is-glob: 4.0.3
+ dev: true
+
+ /glob-to-regexp/0.4.1:
+ resolution: {integrity: sha512-lkX1HJXwyMcprw/5YUZc2s7DrpAiHB21/V+E1rHUrVNokkvB6bqMzT0VfV6/86ZNabt1k14YOIaT7nDvOX3Iiw==}
+ dev: true
+
+ /glob/7.2.3:
+ resolution: {integrity: sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==}
+ dependencies:
+ fs.realpath: 1.0.0
+ inflight: 1.0.6
+ inherits: 2.0.4
+ minimatch: 3.1.2
+ once: 1.4.0
+ path-is-absolute: 1.0.1
+
+ /globals/11.12.0:
+ resolution: {integrity: sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==}
+ engines: {node: '>=4'}
+
+ /globals/13.17.0:
+ resolution: {integrity: sha512-1C+6nQRb1GwGMKm2dH/E7enFAMxGTmGI7/dEdhy/DNelv85w9B72t3uc5frtMNXIbzrarJJ/lTCjcaZwbLJmyw==}
+ engines: {node: '>=8'}
+ dependencies:
+ type-fest: 0.20.2
+ dev: true
+
+ /globby/11.1.0:
+ resolution: {integrity: sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g==}
+ engines: {node: '>=10'}
+ dependencies:
+ array-union: 2.1.0
+ dir-glob: 3.0.1
+ fast-glob: 3.2.12
+ ignore: 5.2.0
+ merge2: 1.4.1
+ slash: 3.0.0
+ dev: true
+
+ /graceful-fs/4.2.10:
+ resolution: {integrity: sha512-9ByhssR2fPVsNZj478qUUbKfmL0+t5BDVyjShtyZZLiK7ZDAArFFfopyOTj0M05wE2tJPisA4iTnnXl2YoPvOA==}
+ dev: true
+
+ /graphlib/2.1.8:
+ resolution: {integrity: sha512-jcLLfkpoVGmH7/InMC/1hIvOPSUh38oJtGhvrOFGzioE1DZ+0YW16RgmOJhHiuWTvGiJQ9Z1Ik43JvkRPRvE+A==}
+ dependencies:
+ lodash: 4.17.21
+ dev: false
+
+ /hamt_plus/1.0.2:
+ resolution: {integrity: sha512-t2JXKaehnMb9paaYA7J0BX8QQAY8lwfQ9Gjf4pg/mk4krt+cmwmU652HOoWonf+7+EQV97ARPMhhVgU1ra2GhA==}
+ dev: false
+
+ /has-bigints/1.0.2:
+ resolution: {integrity: sha512-tSvCKtBr9lkF0Ex0aQiP9N+OpV4zi2r/Nee5VkRDbaqv35RLYMzbwQfFSZZH0kR+Rd6302UJZ2p/bJCEoR3VoQ==}
+ dev: true
+
+ /has-flag/3.0.0:
+ resolution: {integrity: sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==}
+ engines: {node: '>=4'}
+
+ /has-flag/4.0.0:
+ resolution: {integrity: sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==}
+ engines: {node: '>=8'}
+ dev: true
+
+ /has-property-descriptors/1.0.0:
+ resolution: {integrity: sha512-62DVLZGoiEBDHQyqG4w9xCuZ7eJEwNmJRWw2VY84Oedb7WFcA27fiEVe8oUQx9hAUJ4ekurquucTGwsyO1XGdQ==}
+ dependencies:
+ get-intrinsic: 1.1.3
+ dev: true
+
+ /has-symbols/1.0.3:
+ resolution: {integrity: sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==}
+ engines: {node: '>= 0.4'}
+ dev: true
+
+ /has-tostringtag/1.0.0:
+ resolution: {integrity: sha512-kFjcSNhnlGV1kyoGk7OXKSawH5JOb/LzUc5w9B02hOTO0dfFRjbHQKvg1d6cf3HbeUmtU9VbbV3qzZ2Teh97WQ==}
+ engines: {node: '>= 0.4'}
+ dependencies:
+ has-symbols: 1.0.3
+ dev: true
+
+ /has/1.0.3:
+ resolution: {integrity: sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==}
+ engines: {node: '>= 0.4.0'}
+ dependencies:
+ function-bind: 1.1.1
+
+ /heap/0.2.7:
+ resolution: {integrity: sha512-2bsegYkkHO+h/9MGbn6KWcE45cHZgPANo5LXF7EvWdT0yT2EguSVO1nDgU5c8+ZOPwp2vMNa7YFsJhVcDR9Sdg==}
+ dev: false
+
+ /hey-listen/1.0.8:
+ resolution: {integrity: sha512-COpmrF2NOg4TBWUJ5UVyaCU2A88wEMkUPK4hNqyCkqHbxT92BbvfjoSozkAIIm6XhicGlJHhFdullInrdhwU8Q==}
+ dev: false
+
+ /hoist-non-react-statics/3.3.2:
+ resolution: {integrity: sha512-/gGivxi8JPKWNm/W0jSmzcMPpfpPLc3dY/6GxhX2hQ9iGj3aDfklV4ET7NjKpSinLpJ5vafa9iiGIEZg10SfBw==}
+ dependencies:
+ react-is: 16.13.1
+ dev: false
+
+ /html-encoding-sniffer/3.0.0:
+ resolution: {integrity: sha512-oWv4T4yJ52iKrufjnyZPkrN0CH3QnrUqdB6In1g5Fe1mia8GmF36gnfNySxoZtxD5+NmYw1EElVXiBk93UeskA==}
+ engines: {node: '>=12'}
+ dependencies:
+ whatwg-encoding: 2.0.0
+ dev: true
+
+ /html-escaper/2.0.2:
+ resolution: {integrity: sha512-H2iMtd0I4Mt5eYiapRdIDjp+XzelXQ0tFE4JS7YFwFevXXMmOp9myNrUvCg0D6ws8iqkRPBfKHgbwig1SmlLfg==}
+ dev: true
+
+ /http-proxy-agent/5.0.0:
+ resolution: {integrity: sha512-n2hY8YdoRE1i7r6M0w9DIw5GgZN0G25P8zLCRQ8rjXtTU3vsNFBI/vWK/UIeE6g5MUUz6avwAPXmL6Fy9D/90w==}
+ engines: {node: '>= 6'}
+ dependencies:
+ '@tootallnate/once': 2.0.0
+ agent-base: 6.0.2
+ debug: 4.3.4
+ transitivePeerDependencies:
+ - supports-color
+ dev: true
+
+ /https-proxy-agent/5.0.1:
+ resolution: {integrity: sha512-dFcAjpTQFgoLMzC2VwU+C/CbS7uRL0lWmxDITmqm7C+7F0Odmj6s9l6alZc6AELXhrnggM2CeWSXHGOdX2YtwA==}
+ engines: {node: '>= 6'}
+ dependencies:
+ agent-base: 6.0.2
+ debug: 4.3.4
+ transitivePeerDependencies:
+ - supports-color
+ dev: true
+
+ /human-signals/2.1.0:
+ resolution: {integrity: sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw==}
+ engines: {node: '>=10.17.0'}
+ dev: true
+
+ /human-signals/3.0.1:
+ resolution: {integrity: sha512-rQLskxnM/5OCldHo+wNXbpVgDn5A17CUoKX+7Sokwaknlq7CdSnphy0W39GU8dw59XiCXmFXDg4fRuckQRKewQ==}
+ engines: {node: '>=12.20.0'}
+ dev: true
+
+ /husky/8.0.1:
+ resolution: {integrity: sha512-xs7/chUH/CKdOCs7Zy0Aev9e/dKOMZf3K1Az1nar3tzlv0jfqnYtu235bstsWTmXOR0EfINrPa97yy4Lz6RiKw==}
+ engines: {node: '>=14'}
+ hasBin: true
+ dev: true
+
+ /iconv-lite/0.6.3:
+ resolution: {integrity: sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==}
+ engines: {node: '>=0.10.0'}
+ dependencies:
+ safer-buffer: 2.1.2
+ dev: true
+
+ /ieee754/1.2.1:
+ resolution: {integrity: sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==}
+ dev: true
+
+ /ignore/4.0.6:
+ resolution: {integrity: sha512-cyFDKrqc/YdcWFniJhzI42+AzS+gNwmUzOSFcRCQYwySuBBBy/KjuxWLZ/FHEH6Moq1NizMOBWyTcv8O4OZIMg==}
+ engines: {node: '>= 4'}
+ dev: true
+
+ /ignore/5.2.0:
+ resolution: {integrity: sha512-CmxgYGiEPCLhfLnpPp1MoRmifwEIOgjcHXxOBjv7mY96c+eWScsOP9c112ZyLdWHi0FxHjI+4uVhKYp/gcdRmQ==}
+ engines: {node: '>= 4'}
+ dev: true
+
+ /immediate/3.0.6:
+ resolution: {integrity: sha512-XXOFtyqDjNDAQxVfYxuF7g9Il/IbWmmlQg2MYKOH8ExIT1qg6xc4zyS3HaEEATgs1btfzxq15ciUiY7gjSXRGQ==}
+ dev: false
+
+ /import-fresh/3.3.0:
+ resolution: {integrity: sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==}
+ engines: {node: '>=6'}
+ dependencies:
+ parent-module: 1.0.1
+ resolve-from: 4.0.0
+
+ /import-local/3.1.0:
+ resolution: {integrity: sha512-ASB07uLtnDs1o6EHjKpX34BKYDSqnFerfTOJL2HvMqF70LnxpjkzDB8J44oT9pu4AMPkQwf8jl6szgvNd2tRIg==}
+ engines: {node: '>=8'}
+ hasBin: true
+ dependencies:
+ pkg-dir: 4.2.0
+ resolve-cwd: 3.0.0
+ dev: true
+
+ /imurmurhash/0.1.4:
+ resolution: {integrity: sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==}
+ engines: {node: '>=0.8.19'}
+ dev: true
+
+ /indent-string/4.0.0:
+ resolution: {integrity: sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg==}
+ engines: {node: '>=8'}
+ dev: true
+
+ /inflight/1.0.6:
+ resolution: {integrity: sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==}
+ dependencies:
+ once: 1.4.0
+ wrappy: 1.0.2
+
+ /inherits/2.0.4:
+ resolution: {integrity: sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==}
+
+ /ini/1.3.8:
+ resolution: {integrity: sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==}
+ dev: true
+
+ /internal-slot/1.0.3:
+ resolution: {integrity: sha512-O0DB1JC/sPyZl7cIo78n5dR7eUSwwpYPiXRhTzNxZVAMUuB8vlnRFyLxdrVToks6XPLVnFfbzaVd5WLjhgg+vA==}
+ engines: {node: '>= 0.4'}
+ dependencies:
+ get-intrinsic: 1.1.3
+ has: 1.0.3
+ side-channel: 1.0.4
+ dev: true
+
+ /intl-messageformat/10.2.0:
+ resolution: {integrity: sha512-VndSbrryShPRnFvEB81rt2DvbEmygRfuM9+6gdu9TXxTFX0m3Pyk8EvKUEBNhZ1/19JyOvFsRhvg+p6K64ohKA==}
+ dependencies:
+ '@formatjs/ecma402-abstract': 1.13.0
+ '@formatjs/fast-memoize': 1.2.6
+ '@formatjs/icu-messageformat-parser': 2.1.9
+ tslib: 2.4.0
+ dev: false
+
+ /is-arrayish/0.2.1:
+ resolution: {integrity: sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg==}
+
+ /is-arrayish/0.3.2:
+ resolution: {integrity: sha512-eVRqCvVlZbuw3GrM63ovNSNAeA1K16kaR/LRY/92w0zxQ5/1YzwblUX652i4Xs9RwAGjW9d9y6X88t8OaAJfWQ==}
+ dev: false
+
+ /is-bigint/1.0.4:
+ resolution: {integrity: sha512-zB9CruMamjym81i2JZ3UMn54PKGsQzsJeo6xvN3HJJ4CAsQNB6iRutp2To77OfCNuoxspsIhzaPoO1zyCEhFOg==}
+ dependencies:
+ has-bigints: 1.0.2
+ dev: true
+
+ /is-boolean-object/1.1.2:
+ resolution: {integrity: sha512-gDYaKHJmnj4aWxyj6YHyXVpdQawtVLHU5cb+eztPGczf6cjuTdwve5ZIEfgXqH4e57An1D1AKf8CZ3kYrQRqYA==}
+ engines: {node: '>= 0.4'}
+ dependencies:
+ call-bind: 1.0.2
+ has-tostringtag: 1.0.0
+ dev: true
+
+ /is-callable/1.2.7:
+ resolution: {integrity: sha512-1BC0BVFhS/p0qtw6enp8e+8OD0UrK0oFLztSjNzhcKA3WDuJxxAPXzPuPtKkjEY9UUoEWlX/8fgKeu2S8i9JTA==}
+ engines: {node: '>= 0.4'}
+ dev: true
+
+ /is-core-module/2.10.0:
+ resolution: {integrity: sha512-Erxj2n/LDAZ7H8WNJXd9tw38GYM3dv8rk8Zcs+jJuxYTW7sozH+SS8NtrSjVL1/vpLvWi1hxy96IzjJ3EHTJJg==}
+ dependencies:
+ has: 1.0.3
+
+ /is-date-object/1.0.5:
+ resolution: {integrity: sha512-9YQaSxsAiSwcvS33MBk3wTCVnWK+HhF8VZR2jRxehM16QcVOdHqPn4VPHmRK4lSr38n9JriurInLcP90xsYNfQ==}
+ engines: {node: '>= 0.4'}
+ dependencies:
+ has-tostringtag: 1.0.0
+ dev: true
+
+ /is-docker/2.2.1:
+ resolution: {integrity: sha512-F+i2BKsFrH66iaUFc0woD8sLy8getkwTwtOBjvs56Cx4CgJDeKQeqfz8wAYiSb8JOprWhHH5p77PbmYCvvUuXQ==}
+ engines: {node: '>=8'}
+ hasBin: true
+ dev: true
+
+ /is-extglob/2.1.1:
+ resolution: {integrity: sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==}
+ engines: {node: '>=0.10.0'}
+ dev: true
+
+ /is-fullwidth-code-point/3.0.0:
+ resolution: {integrity: sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==}
+ engines: {node: '>=8'}
+ dev: true
+
+ /is-fullwidth-code-point/4.0.0:
+ resolution: {integrity: sha512-O4L094N2/dZ7xqVdrXhh9r1KODPJpFms8B5sGdJLPy664AgvXsreZUyCQQNItZRDlYug4xStLjNp/sz3HvBowQ==}
+ engines: {node: '>=12'}
+ dev: true
+
+ /is-generator-fn/2.1.0:
+ resolution: {integrity: sha512-cTIB4yPYL/Grw0EaSzASzg6bBy9gqCofvWN8okThAYIxKJZC+udlRAmGbM0XLeniEJSs8uEgHPGuHSe1XsOLSQ==}
+ engines: {node: '>=6'}
+ dev: true
+
+ /is-glob/4.0.3:
+ resolution: {integrity: sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==}
+ engines: {node: '>=0.10.0'}
+ dependencies:
+ is-extglob: 2.1.1
+ dev: true
+
+ /is-negative-zero/2.0.2:
+ resolution: {integrity: sha512-dqJvarLawXsFbNDeJW7zAz8ItJ9cd28YufuuFzh0G8pNHjJMnY08Dv7sYX2uF5UpQOwieAeOExEYAWWfu7ZZUA==}
+ engines: {node: '>= 0.4'}
+ dev: true
+
+ /is-number-object/1.0.7:
+ resolution: {integrity: sha512-k1U0IRzLMo7ZlYIfzRu23Oh6MiIFasgpb9X76eqfFZAqwH44UI4KTBvBYIZ1dSL9ZzChTB9ShHfLkR4pdW5krQ==}
+ engines: {node: '>= 0.4'}
+ dependencies:
+ has-tostringtag: 1.0.0
+ dev: true
+
+ /is-number/7.0.0:
+ resolution: {integrity: sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==}
+ engines: {node: '>=0.12.0'}
+ dev: true
+
+ /is-port-reachable/4.0.0:
+ resolution: {integrity: sha512-9UoipoxYmSk6Xy7QFgRv2HDyaysmgSG75TFQs6S+3pDM7ZhKTF/bskZV+0UlABHzKjNVhPjYCLfeZUEg1wXxig==}
+ engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0}
+ dev: true
+
+ /is-potential-custom-element-name/1.0.1:
+ resolution: {integrity: sha512-bCYeRA2rVibKZd+s2625gGnGF/t7DSqDs4dP7CrLA1m7jKWz6pps0LpYLJN8Q64HtmPKJ1hrN3nzPNKFEKOUiQ==}
+ dev: true
+
+ /is-regex/1.1.4:
+ resolution: {integrity: sha512-kvRdxDsxZjhzUX07ZnLydzS1TU/TJlTUHHY4YLL87e37oUA49DfkLqgy+VjFocowy29cKvcSiu+kIv728jTTVg==}
+ engines: {node: '>= 0.4'}
+ dependencies:
+ call-bind: 1.0.2
+ has-tostringtag: 1.0.0
+ dev: true
+
+ /is-shared-array-buffer/1.0.2:
+ resolution: {integrity: sha512-sqN2UDu1/0y6uvXyStCOzyhAjCSlHceFoMKJW8W9EU9cvic/QdsZ0kEU93HEy3IUEFZIiH/3w+AH/UQbPHNdhA==}
+ dependencies:
+ call-bind: 1.0.2
+ dev: true
+
+ /is-stream/2.0.1:
+ resolution: {integrity: sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==}
+ engines: {node: '>=8'}
+ dev: true
+
+ /is-stream/3.0.0:
+ resolution: {integrity: sha512-LnQR4bZ9IADDRSkvpqMGvt/tEJWclzklNgSw48V5EAaAeDd6qGvN8ei6k5p0tvxSR171VmGyHuTiAOfxAbr8kA==}
+ engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0}
+ dev: true
+
+ /is-string/1.0.7:
+ resolution: {integrity: sha512-tE2UXzivje6ofPW7l23cjDOMa09gb7xlAqG6jG5ej6uPV32TlWP3NKPigtaGeHNu9fohccRYvIiZMfOOnOYUtg==}
+ engines: {node: '>= 0.4'}
+ dependencies:
+ has-tostringtag: 1.0.0
+ dev: true
+
+ /is-symbol/1.0.4:
+ resolution: {integrity: sha512-C/CPBqKWnvdcxqIARxyOh4v1UUEOCHpgDa0WYgpKDFMszcrPcffg5uhwSgPCLD2WWxmq6isisz87tzT01tuGhg==}
+ engines: {node: '>= 0.4'}
+ dependencies:
+ has-symbols: 1.0.3
+ dev: true
+
+ /is-weakref/1.0.2:
+ resolution: {integrity: sha512-qctsuLZmIQ0+vSSMfoVvyFe2+GSEvnmZ2ezTup1SBse9+twCCeial6EEi3Nc2KFcf6+qz2FBPnjXsk8xhKSaPQ==}
+ dependencies:
+ call-bind: 1.0.2
+ dev: true
+
+ /is-wsl/2.2.0:
+ resolution: {integrity: sha512-fKzAra0rGJUUBwGBgNkHZuToZcn+TtXHpeCgmkMJMMYx1sQDYaCSyjJBSCa2nH1DGm7s3n1oBnohoVTBaN7Lww==}
+ engines: {node: '>=8'}
+ dependencies:
+ is-docker: 2.2.1
+ dev: true
+
+ /isexe/2.0.0:
+ resolution: {integrity: sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==}
+ dev: true
+
+ /istanbul-lib-coverage/3.2.0:
+ resolution: {integrity: sha512-eOeJ5BHCmHYvQK7xt9GkdHuzuCGS1Y6g9Gvnx3Ym33fz/HpLRYxiS0wHNr+m/MBC8B647Xt608vCDEvhl9c6Mw==}
+ engines: {node: '>=8'}
+ dev: true
+
+ /istanbul-lib-instrument/5.2.1:
+ resolution: {integrity: sha512-pzqtp31nLv/XFOzXGuvhCb8qhjmTVo5vjVk19XE4CRlSWz0KoeJ3bw9XsA7nOp9YBf4qHjwBxkDzKcME/J29Yg==}
+ engines: {node: '>=8'}
+ dependencies:
+ '@babel/core': 7.19.3
+ '@babel/parser': 7.19.4
+ '@istanbuljs/schema': 0.1.3
+ istanbul-lib-coverage: 3.2.0
+ semver: 6.3.0
+ transitivePeerDependencies:
+ - supports-color
+ dev: true
+
+ /istanbul-lib-report/3.0.0:
+ resolution: {integrity: sha512-wcdi+uAKzfiGT2abPpKZ0hSU1rGQjUQnLvtY5MpQ7QCTahD3VODhcu4wcfY1YtkGaDD5yuydOLINXsfbus9ROw==}
+ engines: {node: '>=8'}
+ dependencies:
+ istanbul-lib-coverage: 3.2.0
+ make-dir: 3.1.0
+ supports-color: 7.2.0
+ dev: true
+
+ /istanbul-lib-source-maps/4.0.1:
+ resolution: {integrity: sha512-n3s8EwkdFIJCG3BPKBYvskgXGoy88ARzvegkitk60NxRdwltLOTaH7CUiMRXvwYorl0Q712iEjcWB+fK/MrWVw==}
+ engines: {node: '>=10'}
+ dependencies:
+ debug: 4.3.4
+ istanbul-lib-coverage: 3.2.0
+ source-map: 0.6.1
+ transitivePeerDependencies:
+ - supports-color
+ dev: true
+
+ /istanbul-reports/3.1.5:
+ resolution: {integrity: sha512-nUsEMa9pBt/NOHqbcbeJEgqIlY/K7rVWUX6Lql2orY5e9roQOthbR3vtY4zzf2orPELg80fnxxk9zUyPlgwD1w==}
+ engines: {node: '>=8'}
+ dependencies:
+ html-escaper: 2.0.2
+ istanbul-lib-report: 3.0.0
+ dev: true
+
+ /jest-changed-files/28.1.3:
+ resolution: {integrity: sha512-esaOfUWJXk2nfZt9SPyC8gA1kNfdKLkQWyzsMlqq8msYSlNKfmZxfRgZn4Cd4MGVUF+7v6dBs0d5TOAKa7iIiA==}
+ engines: {node: ^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0}
+ dependencies:
+ execa: 5.1.1
+ p-limit: 3.1.0
+ dev: true
+
+ /jest-circus/28.1.3:
+ resolution: {integrity: sha512-cZ+eS5zc79MBwt+IhQhiEp0OeBddpc1n8MBo1nMB8A7oPMKEO+Sre+wHaLJexQUj9Ya/8NOBY0RESUgYjB6fow==}
+ engines: {node: ^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0}
+ dependencies:
+ '@jest/environment': 28.1.3
+ '@jest/expect': 28.1.3
+ '@jest/test-result': 28.1.3
+ '@jest/types': 28.1.3
+ '@types/node': 17.0.45
+ chalk: 4.1.2
+ co: 4.6.0
+ dedent: 0.7.0
+ is-generator-fn: 2.1.0
+ jest-each: 28.1.3
+ jest-matcher-utils: 28.1.3
+ jest-message-util: 28.1.3
+ jest-runtime: 28.1.3
+ jest-snapshot: 28.1.3
+ jest-util: 28.1.3
+ p-limit: 3.1.0
+ pretty-format: 28.1.3
+ slash: 3.0.0
+ stack-utils: 2.0.5
+ transitivePeerDependencies:
+ - supports-color
+ dev: true
+
+ /jest-cli/28.1.3_2263m44mchjafa7bz7l52hbcpa:
+ resolution: {integrity: sha512-roY3kvrv57Azn1yPgdTebPAXvdR2xfezaKKYzVxZ6It/5NCxzJym6tUI5P1zkdWhfUYkxEI9uZWcQdaFLo8mJQ==}
+ engines: {node: ^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0}
+ hasBin: true
+ peerDependencies:
+ node-notifier: ^8.0.1 || ^9.0.0 || ^10.0.0
+ peerDependenciesMeta:
+ node-notifier:
+ optional: true
+ dependencies:
+ '@jest/core': 28.1.3_ts-node@10.9.1
+ '@jest/test-result': 28.1.3
+ '@jest/types': 28.1.3
+ chalk: 4.1.2
+ exit: 0.1.2
+ graceful-fs: 4.2.10
+ import-local: 3.1.0
+ jest-config: 28.1.3_2263m44mchjafa7bz7l52hbcpa
+ jest-util: 28.1.3
+ jest-validate: 28.1.3
+ prompts: 2.4.2
+ yargs: 17.6.0
+ transitivePeerDependencies:
+ - '@types/node'
+ - supports-color
+ - ts-node
+ dev: true
+
+ /jest-config/28.1.3_2263m44mchjafa7bz7l52hbcpa:
+ resolution: {integrity: sha512-MG3INjByJ0J4AsNBm7T3hsuxKQqFIiRo/AUqb1q9LRKI5UU6Aar9JHbr9Ivn1TVwfUD9KirRoM/T6u8XlcQPHQ==}
+ engines: {node: ^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0}
+ peerDependencies:
+ '@types/node': '*'
+ ts-node: '>=9.0.0'
+ peerDependenciesMeta:
+ '@types/node':
+ optional: true
+ ts-node:
+ optional: true
+ dependencies:
+ '@babel/core': 7.19.3
+ '@jest/test-sequencer': 28.1.3
+ '@jest/types': 28.1.3
+ '@types/node': 17.0.45
+ babel-jest: 28.1.3_@babel+core@7.19.3
+ chalk: 4.1.2
+ ci-info: 3.5.0
+ deepmerge: 4.2.2
+ glob: 7.2.3
+ graceful-fs: 4.2.10
+ jest-circus: 28.1.3
+ jest-environment-node: 28.1.3
+ jest-get-type: 28.0.2
+ jest-regex-util: 28.0.2
+ jest-resolve: 28.1.3
+ jest-runner: 28.1.3
+ jest-util: 28.1.3
+ jest-validate: 28.1.3
+ micromatch: 4.0.5
+ parse-json: 5.2.0
+ pretty-format: 28.1.3
+ slash: 3.0.0
+ strip-json-comments: 3.1.1
+ ts-node: 10.9.1_ksn4eycaeggbrckn3ykh37hwf4
+ transitivePeerDependencies:
+ - supports-color
+ dev: true
+
+ /jest-diff/26.6.2:
+ resolution: {integrity: sha512-6m+9Z3Gv9wN0WFVasqjCL/06+EFCMTqDEUl/b87HYK2rAPTyfz4ZIuSlPhY51PIQRWx5TaxeF1qmXKe9gfN3sA==}
+ engines: {node: '>= 10.14.2'}
+ dependencies:
+ chalk: 4.1.2
+ diff-sequences: 26.6.2
+ jest-get-type: 26.3.0
+ pretty-format: 26.6.2
+ dev: true
+
+ /jest-diff/28.1.3:
+ resolution: {integrity: sha512-8RqP1B/OXzjjTWkqMX67iqgwBVJRgCyKD3L9nq+6ZqJMdvjE8RgHktqZ6jNrkdMT+dJuYNI3rhQpxaz7drJHfw==}
+ engines: {node: ^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0}
+ dependencies:
+ chalk: 4.1.2
+ diff-sequences: 28.1.1
+ jest-get-type: 28.0.2
+ pretty-format: 28.1.3
+ dev: true
+
+ /jest-docblock/28.1.1:
+ resolution: {integrity: sha512-3wayBVNiOYx0cwAbl9rwm5kKFP8yHH3d/fkEaL02NPTkDojPtheGB7HZSFY4wzX+DxyrvhXz0KSCVksmCknCuA==}
+ engines: {node: ^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0}
+ dependencies:
+ detect-newline: 3.1.0
+ dev: true
+
+ /jest-each/28.1.3:
+ resolution: {integrity: sha512-arT1z4sg2yABU5uogObVPvSlSMQlDA48owx07BDPAiasW0yYpYHYOo4HHLz9q0BVzDVU4hILFjzJw0So9aCL/g==}
+ engines: {node: ^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0}
+ dependencies:
+ '@jest/types': 28.1.3
+ chalk: 4.1.2
+ jest-get-type: 28.0.2
+ jest-util: 28.1.3
+ pretty-format: 28.1.3
+ dev: true
+
+ /jest-environment-jsdom/29.1.2:
+ resolution: {integrity: sha512-D+XNIKia5+uDjSMwL/G1l6N9MCb7LymKI8FpcLo7kkISjc/Sa9w+dXXEa7u1Wijo3f8sVLqfxdGqYtRhmca+Xw==}
+ engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0}
+ dependencies:
+ '@jest/environment': 29.1.2
+ '@jest/fake-timers': 29.1.2
+ '@jest/types': 29.1.2
+ '@types/jsdom': 20.0.0
+ '@types/node': 17.0.45
+ jest-mock: 29.1.2
+ jest-util: 29.1.2
+ jsdom: 20.0.1
+ transitivePeerDependencies:
+ - bufferutil
+ - canvas
+ - supports-color
+ - utf-8-validate
+ dev: true
+
+ /jest-environment-node/28.1.3:
+ resolution: {integrity: sha512-ugP6XOhEpjAEhGYvp5Xj989ns5cB1K6ZdjBYuS30umT4CQEETaxSiPcZ/E1kFktX4GkrcM4qu07IIlDYX1gp+A==}
+ engines: {node: ^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0}
+ dependencies:
+ '@jest/environment': 28.1.3
+ '@jest/fake-timers': 28.1.3
+ '@jest/types': 28.1.3
+ '@types/node': 17.0.45
+ jest-mock: 28.1.3
+ jest-util: 28.1.3
+ dev: true
+
+ /jest-get-type/26.3.0:
+ resolution: {integrity: sha512-TpfaviN1R2pQWkIihlfEanwOXK0zcxrKEE4MlU6Tn7keoXdN6/3gK/xl0yEh8DOunn5pOVGKf8hB4R9gVh04ig==}
+ engines: {node: '>= 10.14.2'}
+ dev: true
+
+ /jest-get-type/28.0.2:
+ resolution: {integrity: sha512-ioj2w9/DxSYHfOm5lJKCdcAmPJzQXmbM/Url3rhlghrPvT3tt+7a/+oXc9azkKmLvoiXjtV83bEWqi+vs5nlPA==}
+ engines: {node: ^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0}
+ dev: true
+
+ /jest-haste-map/28.1.3:
+ resolution: {integrity: sha512-3S+RQWDXccXDKSWnkHa/dPwt+2qwA8CJzR61w3FoYCvoo3Pn8tvGcysmMF0Bj0EX5RYvAI2EIvC57OmotfdtKA==}
+ engines: {node: ^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0}
+ dependencies:
+ '@jest/types': 28.1.3
+ '@types/graceful-fs': 4.1.5
+ '@types/node': 17.0.45
+ anymatch: 3.1.2
+ fb-watchman: 2.0.2
+ graceful-fs: 4.2.10
+ jest-regex-util: 28.0.2
+ jest-util: 28.1.3
+ jest-worker: 28.1.3
+ micromatch: 4.0.5
+ walker: 1.0.8
+ optionalDependencies:
+ fsevents: 2.3.2
+ dev: true
+
+ /jest-leak-detector/28.1.3:
+ resolution: {integrity: sha512-WFVJhnQsiKtDEo5lG2mM0v40QWnBM+zMdHHyJs8AWZ7J0QZJS59MsyKeJHWhpBZBH32S48FOVvGyOFT1h0DlqA==}
+ engines: {node: ^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0}
+ dependencies:
+ jest-get-type: 28.0.2
+ pretty-format: 28.1.3
+ dev: true
+
+ /jest-matcher-utils/28.1.3:
+ resolution: {integrity: sha512-kQeJ7qHemKfbzKoGjHHrRKH6atgxMk8Enkk2iPQ3XwO6oE/KYD8lMYOziCkeSB9G4adPM4nR1DE8Tf5JeWH6Bw==}
+ engines: {node: ^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0}
+ dependencies:
+ chalk: 4.1.2
+ jest-diff: 28.1.3
+ jest-get-type: 28.0.2
+ pretty-format: 28.1.3
+ dev: true
+
+ /jest-message-util/28.1.3:
+ resolution: {integrity: sha512-PFdn9Iewbt575zKPf1286Ht9EPoJmYT7P0kY+RibeYZ2XtOr53pDLEFoTWXbd1h4JiGiWpTBC84fc8xMXQMb7g==}
+ engines: {node: ^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0}
+ dependencies:
+ '@babel/code-frame': 7.18.6
+ '@jest/types': 28.1.3
+ '@types/stack-utils': 2.0.1
+ chalk: 4.1.2
+ graceful-fs: 4.2.10
+ micromatch: 4.0.5
+ pretty-format: 28.1.3
+ slash: 3.0.0
+ stack-utils: 2.0.5
+ dev: true
+
+ /jest-message-util/29.1.2:
+ resolution: {integrity: sha512-9oJ2Os+Qh6IlxLpmvshVbGUiSkZVc2FK+uGOm6tghafnB2RyjKAxMZhtxThRMxfX1J1SOMhTn9oK3/MutRWQJQ==}
+ engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0}
+ dependencies:
+ '@babel/code-frame': 7.18.6
+ '@jest/types': 29.1.2
+ '@types/stack-utils': 2.0.1
+ chalk: 4.1.2
+ graceful-fs: 4.2.10
+ micromatch: 4.0.5
+ pretty-format: 29.1.2
+ slash: 3.0.0
+ stack-utils: 2.0.5
+ dev: true
+
+ /jest-mock/28.1.3:
+ resolution: {integrity: sha512-o3J2jr6dMMWYVH4Lh/NKmDXdosrsJgi4AviS8oXLujcjpCMBb1FMsblDnOXKZKfSiHLxYub1eS0IHuRXsio9eA==}
+ engines: {node: ^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0}
+ dependencies:
+ '@jest/types': 28.1.3
+ '@types/node': 17.0.45
+ dev: true
+
+ /jest-mock/29.1.2:
+ resolution: {integrity: sha512-PFDAdjjWbjPUtQPkQufvniXIS3N9Tv7tbibePEjIIprzjgo0qQlyUiVMrT4vL8FaSJo1QXifQUOuPH3HQC/aMA==}
+ engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0}
+ dependencies:
+ '@jest/types': 29.1.2
+ '@types/node': 17.0.45
+ jest-util: 29.1.2
+ dev: true
+
+ /jest-pnp-resolver/1.2.2_jest-resolve@28.1.3:
+ resolution: {integrity: sha512-olV41bKSMm8BdnuMsewT4jqlZ8+3TCARAXjZGT9jcoSnrfUnRCqnMoF9XEeoWjbzObpqF9dRhHQj0Xb9QdF6/w==}
+ engines: {node: '>=6'}
+ peerDependencies:
+ jest-resolve: '*'
+ peerDependenciesMeta:
+ jest-resolve:
+ optional: true
+ dependencies:
+ jest-resolve: 28.1.3
+ dev: true
+
+ /jest-regex-util/28.0.2:
+ resolution: {integrity: sha512-4s0IgyNIy0y9FK+cjoVYoxamT7Zeo7MhzqRGx7YDYmaQn1wucY9rotiGkBzzcMXTtjrCAP/f7f+E0F7+fxPNdw==}
+ engines: {node: ^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0}
+ dev: true
+
+ /jest-resolve-dependencies/28.1.3:
+ resolution: {integrity: sha512-qa0QO2Q0XzQoNPouMbCc7Bvtsem8eQgVPNkwn9LnS+R2n8DaVDPL/U1gngC0LTl1RYXJU0uJa2BMC2DbTfFrHA==}
+ engines: {node: ^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0}
+ dependencies:
+ jest-regex-util: 28.0.2
+ jest-snapshot: 28.1.3
+ transitivePeerDependencies:
+ - supports-color
+ dev: true
+
+ /jest-resolve/28.1.3:
+ resolution: {integrity: sha512-Z1W3tTjE6QaNI90qo/BJpfnvpxtaFTFw5CDgwpyE/Kz8U/06N1Hjf4ia9quUhCh39qIGWF1ZuxFiBiJQwSEYKQ==}
+ engines: {node: ^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0}
+ dependencies:
+ chalk: 4.1.2
+ graceful-fs: 4.2.10
+ jest-haste-map: 28.1.3
+ jest-pnp-resolver: 1.2.2_jest-resolve@28.1.3
+ jest-util: 28.1.3
+ jest-validate: 28.1.3
+ resolve: 1.22.1
+ resolve.exports: 1.1.0
+ slash: 3.0.0
+ dev: true
+
+ /jest-runner/28.1.3:
+ resolution: {integrity: sha512-GkMw4D/0USd62OVO0oEgjn23TM+YJa2U2Wu5zz9xsQB1MxWKDOlrnykPxnMsN0tnJllfLPinHTka61u0QhaxBA==}
+ engines: {node: ^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0}
+ dependencies:
+ '@jest/console': 28.1.3
+ '@jest/environment': 28.1.3
+ '@jest/test-result': 28.1.3
+ '@jest/transform': 28.1.3
+ '@jest/types': 28.1.3
+ '@types/node': 17.0.45
+ chalk: 4.1.2
+ emittery: 0.10.2
+ graceful-fs: 4.2.10
+ jest-docblock: 28.1.1
+ jest-environment-node: 28.1.3
+ jest-haste-map: 28.1.3
+ jest-leak-detector: 28.1.3
+ jest-message-util: 28.1.3
+ jest-resolve: 28.1.3
+ jest-runtime: 28.1.3
+ jest-util: 28.1.3
+ jest-watcher: 28.1.3
+ jest-worker: 28.1.3
+ p-limit: 3.1.0
+ source-map-support: 0.5.13
+ transitivePeerDependencies:
+ - supports-color
+ dev: true
+
+ /jest-runtime/28.1.3:
+ resolution: {integrity: sha512-NU+881ScBQQLc1JHG5eJGU7Ui3kLKrmwCPPtYsJtBykixrM2OhVQlpMmFWJjMyDfdkGgBMNjXCGB/ebzsgNGQw==}
+ engines: {node: ^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0}
+ dependencies:
+ '@jest/environment': 28.1.3
+ '@jest/fake-timers': 28.1.3
+ '@jest/globals': 28.1.3
+ '@jest/source-map': 28.1.2
+ '@jest/test-result': 28.1.3
+ '@jest/transform': 28.1.3
+ '@jest/types': 28.1.3
+ chalk: 4.1.2
+ cjs-module-lexer: 1.2.2
+ collect-v8-coverage: 1.0.1
+ execa: 5.1.1
+ glob: 7.2.3
+ graceful-fs: 4.2.10
+ jest-haste-map: 28.1.3
+ jest-message-util: 28.1.3
+ jest-mock: 28.1.3
+ jest-regex-util: 28.0.2
+ jest-resolve: 28.1.3
+ jest-snapshot: 28.1.3
+ jest-util: 28.1.3
+ slash: 3.0.0
+ strip-bom: 4.0.0
+ transitivePeerDependencies:
+ - supports-color
+ dev: true
+
+ /jest-snapshot/28.1.3:
+ resolution: {integrity: sha512-4lzMgtiNlc3DU/8lZfmqxN3AYD6GGLbl+72rdBpXvcV+whX7mDrREzkPdp2RnmfIiWBg1YbuFSkXduF2JcafJg==}
+ engines: {node: ^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0}
+ dependencies:
+ '@babel/core': 7.19.3
+ '@babel/generator': 7.19.5
+ '@babel/plugin-syntax-typescript': 7.18.6_@babel+core@7.19.3
+ '@babel/traverse': 7.19.4
+ '@babel/types': 7.19.4
+ '@jest/expect-utils': 28.1.3
+ '@jest/transform': 28.1.3
+ '@jest/types': 28.1.3
+ '@types/babel__traverse': 7.18.2
+ '@types/prettier': 2.7.1
+ babel-preset-current-node-syntax: 1.0.1_@babel+core@7.19.3
+ chalk: 4.1.2
+ expect: 28.1.3
+ graceful-fs: 4.2.10
+ jest-diff: 28.1.3
+ jest-get-type: 28.0.2
+ jest-haste-map: 28.1.3
+ jest-matcher-utils: 28.1.3
+ jest-message-util: 28.1.3
+ jest-util: 28.1.3
+ natural-compare: 1.4.0
+ pretty-format: 28.1.3
+ semver: 7.3.8
+ transitivePeerDependencies:
+ - supports-color
+ dev: true
+
+ /jest-util/28.1.3:
+ resolution: {integrity: sha512-XdqfpHwpcSRko/C35uLYFM2emRAltIIKZiJ9eAmhjsj0CqZMa0p1ib0R5fWIqGhn1a103DebTbpqIaP1qCQ6tQ==}
+ engines: {node: ^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0}
+ dependencies:
+ '@jest/types': 28.1.3
+ '@types/node': 17.0.45
+ chalk: 4.1.2
+ ci-info: 3.5.0
+ graceful-fs: 4.2.10
+ picomatch: 2.3.1
+ dev: true
+
+ /jest-util/29.1.2:
+ resolution: {integrity: sha512-vPCk9F353i0Ymx3WQq3+a4lZ07NXu9Ca8wya6o4Fe4/aO1e1awMMprZ3woPFpKwghEOW+UXgd15vVotuNN9ONQ==}
+ engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0}
+ dependencies:
+ '@jest/types': 29.1.2
+ '@types/node': 17.0.45
+ chalk: 4.1.2
+ ci-info: 3.5.0
+ graceful-fs: 4.2.10
+ picomatch: 2.3.1
+ dev: true
+
+ /jest-validate/28.1.3:
+ resolution: {integrity: sha512-SZbOGBWEsaTxBGCOpsRWlXlvNkvTkY0XxRfh7zYmvd8uL5Qzyg0CHAXiXKROflh801quA6+/DsT4ODDthOC/OA==}
+ engines: {node: ^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0}
+ dependencies:
+ '@jest/types': 28.1.3
+ camelcase: 6.3.0
+ chalk: 4.1.2
+ jest-get-type: 28.0.2
+ leven: 3.1.0
+ pretty-format: 28.1.3
+ dev: true
+
+ /jest-watcher/28.1.3:
+ resolution: {integrity: sha512-t4qcqj9hze+jviFPUN3YAtAEeFnr/azITXQEMARf5cMwKY2SMBRnCQTXLixTl20OR6mLh9KLMrgVJgJISym+1g==}
+ engines: {node: ^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0}
+ dependencies:
+ '@jest/test-result': 28.1.3
+ '@jest/types': 28.1.3
+ '@types/node': 17.0.45
+ ansi-escapes: 4.3.2
+ chalk: 4.1.2
+ emittery: 0.10.2
+ jest-util: 28.1.3
+ string-length: 4.0.2
+ dev: true
+
+ /jest-worker/27.5.1:
+ resolution: {integrity: sha512-7vuh85V5cdDofPyxn58nrPjBktZo0u9x1g8WtjQol+jZDaE+fhN+cIvTj11GndBnMnyfrUOG1sZQxCdjKh+DKg==}
+ engines: {node: '>= 10.13.0'}
+ dependencies:
+ '@types/node': 17.0.45
+ merge-stream: 2.0.0
+ supports-color: 8.1.1
+ dev: true
+
+ /jest-worker/28.1.3:
+ resolution: {integrity: sha512-CqRA220YV/6jCo8VWvAt1KKx6eek1VIHMPeLEbpcfSfkEeWyBNppynM/o6q+Wmw+sOhos2ml34wZbSX3G13//g==}
+ engines: {node: ^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0}
+ dependencies:
+ '@types/node': 17.0.45
+ merge-stream: 2.0.0
+ supports-color: 8.1.1
+ dev: true
+
+ /jest/28.1.3_2263m44mchjafa7bz7l52hbcpa:
+ resolution: {integrity: sha512-N4GT5on8UkZgH0O5LUavMRV1EDEhNTL0KEfRmDIeZHSV7p2XgLoY9t9VDUgL6o+yfdgYHVxuz81G8oB9VG5uyA==}
+ engines: {node: ^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0}
+ hasBin: true
+ peerDependencies:
+ node-notifier: ^8.0.1 || ^9.0.0 || ^10.0.0
+ peerDependenciesMeta:
+ node-notifier:
+ optional: true
+ dependencies:
+ '@jest/core': 28.1.3_ts-node@10.9.1
+ '@jest/types': 28.1.3
+ import-local: 3.1.0
+ jest-cli: 28.1.3_2263m44mchjafa7bz7l52hbcpa
+ transitivePeerDependencies:
+ - '@types/node'
+ - supports-color
+ - ts-node
+ dev: true
+
+ /joycon/3.1.1:
+ resolution: {integrity: sha512-34wB/Y7MW7bzjKRjUKTa46I2Z7eV62Rkhva+KkopW7Qvv/OSWBqvkSY7vusOPrNuZcUG3tApvdVgNB8POj3SPw==}
+ engines: {node: '>=10'}
+ dev: true
+
+ /js-sha3/0.8.0:
+ resolution: {integrity: sha512-gF1cRrHhIzNfToc802P800N8PpXS+evLLXfsVpowqmAFR9uwbi89WvXg2QspOmXL8QL86J4T1EpFu+yUkwJY3Q==}
+ dev: false
+
+ /js-tokens/4.0.0:
+ resolution: {integrity: sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==}
+
+ /js-yaml/3.14.1:
+ resolution: {integrity: sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==}
+ hasBin: true
+ dependencies:
+ argparse: 1.0.10
+ esprima: 4.0.1
+ dev: true
+
+ /jsdom/20.0.1:
+ resolution: {integrity: sha512-pksjj7Rqoa+wdpkKcLzQRHhJCEE42qQhl/xLMUKHgoSejaKOdaXEAnqs6uDNwMl/fciHTzKeR8Wm8cw7N+g98A==}
+ engines: {node: '>=14'}
+ peerDependencies:
+ canvas: ^2.5.0
+ peerDependenciesMeta:
+ canvas:
+ optional: true
+ dependencies:
+ abab: 2.0.6
+ acorn: 8.8.0
+ acorn-globals: 7.0.1
+ cssom: 0.5.0
+ cssstyle: 2.3.0
+ data-urls: 3.0.2
+ decimal.js: 10.4.2
+ domexception: 4.0.0
+ escodegen: 2.0.0
+ form-data: 4.0.0
+ html-encoding-sniffer: 3.0.0
+ http-proxy-agent: 5.0.0
+ https-proxy-agent: 5.0.1
+ is-potential-custom-element-name: 1.0.1
+ nwsapi: 2.2.2
+ parse5: 7.1.1
+ saxes: 6.0.0
+ symbol-tree: 3.2.4
+ tough-cookie: 4.1.2
+ w3c-xmlserializer: 3.0.0
+ webidl-conversions: 7.0.0
+ whatwg-encoding: 2.0.0
+ whatwg-mimetype: 3.0.0
+ whatwg-url: 11.0.0
+ ws: 8.9.0
+ xml-name-validator: 4.0.0
+ transitivePeerDependencies:
+ - bufferutil
+ - supports-color
+ - utf-8-validate
+ dev: true
+
+ /jsesc/0.5.0:
+ resolution: {integrity: sha512-uZz5UnB7u4T9LvwmFqXii7pZSouaRPorGs5who1Ip7VO0wxanFvBL7GkM6dTHlgX+jhBApRetaWpnDabOeTcnA==}
+ hasBin: true
+ dev: true
+
+ /jsesc/2.5.2:
+ resolution: {integrity: sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==}
+ engines: {node: '>=4'}
+ hasBin: true
+
+ /json-parse-even-better-errors/2.3.1:
+ resolution: {integrity: sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==}
+
+ /json-schema-traverse/0.4.1:
+ resolution: {integrity: sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==}
+ dev: true
+
+ /json-schema-traverse/1.0.0:
+ resolution: {integrity: sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==}
+ dev: true
+
+ /json-stable-stringify-without-jsonify/1.0.1:
+ resolution: {integrity: sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==}
+ dev: true
+
+ /json2mq/0.2.0:
+ resolution: {integrity: sha512-SzoRg7ux5DWTII9J2qkrZrqV1gt+rTaoufMxEzXbS26Uid0NwaJd123HcoB80TgubEppxxIGdNxCx50fEoEWQA==}
+ dependencies:
+ string-convert: 0.2.1
+ dev: false
+
+ /json5/2.2.1:
+ resolution: {integrity: sha512-1hqLFMSrGHRHxav9q9gNjJ5EXznIxGVO09xQRrwplcS8qs28pZ8s8hupZAmqDwZUmVZ2Qb2jnyPOWcDH8m8dlA==}
+ engines: {node: '>=6'}
+ hasBin: true
+
+ /jsx-ast-utils/3.3.3:
+ resolution: {integrity: sha512-fYQHZTZ8jSfmWZ0iyzfwiU4WDX4HpHbMCZ3gPlWYiCl3BoeOTsqKBqnTVfH2rYT7eP5c3sVbeSPHnnJOaTrWiw==}
+ engines: {node: '>=4.0'}
+ dependencies:
+ array-includes: 3.1.5
+ object.assign: 4.1.4
+ dev: true
+
+ /klayjs/0.4.1:
+ resolution: {integrity: sha512-WUNxuO7O79TEkxCj6OIaK5TJBkaWaR/IKNTakgV9PwDn+mrr63MLHed34AcE2yTaDntgO6l0zGFIzhcoTeroTA==}
+ dev: false
+
+ /kleur/3.0.3:
+ resolution: {integrity: sha512-eTIzlVOSUR+JxdDFepEYcBMtZ9Qqdef+rnzWdRZuMbOywu5tO2w2N7rqjoANZ5k9vywhL6Br1VRjUIgTQx4E8w==}
+ engines: {node: '>=6'}
+ dev: true
+
+ /layout-base/2.0.1:
+ resolution: {integrity: sha512-dp3s92+uNI1hWIpPGH3jK2kxE2lMjdXdr+DH8ynZHpd6PUlH6x6cbuXnoMmiNumznqaNO31xu9e79F0uuZ0JFg==}
+ dev: false
+
+ /leven/3.1.0:
+ resolution: {integrity: sha512-qsda+H8jTaUaN/x5vzW2rzc+8Rw4TAQ/4KjB46IwK5VH+IlVeeeje/EoZRpiXvIqjFgK84QffqPztGI3VBLG1A==}
+ engines: {node: '>=6'}
+ dev: true
+
+ /levn/0.3.0:
+ resolution: {integrity: sha512-0OO4y2iOHix2W6ujICbKIaEQXvFQHue65vUG3pb5EUomzPI90z9hsA1VsO/dbIIpC53J8gxM9Q4Oho0jrCM/yA==}
+ engines: {node: '>= 0.8.0'}
+ dependencies:
+ prelude-ls: 1.1.2
+ type-check: 0.3.2
+ dev: true
+
+ /levn/0.4.1:
+ resolution: {integrity: sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==}
+ engines: {node: '>= 0.8.0'}
+ dependencies:
+ prelude-ls: 1.2.1
+ type-check: 0.4.0
+ dev: true
+
+ /lie/3.1.1:
+ resolution: {integrity: sha512-RiNhHysUjhrDQntfYSfY4MU24coXXdEOgw9WGcKHNeEwffDYbF//u87M1EWaMGzuFoSbqW0C9C6lEEhDOAswfw==}
+ dependencies:
+ immediate: 3.0.6
+ dev: false
+
+ /lilconfig/2.0.5:
+ resolution: {integrity: sha512-xaYmXZtTHPAw5m+xLN8ab9C+3a8YmV3asNSPOATITbtwrfbwaLJj8h66H1WMIpALCkqsIzK3h7oQ+PdX+LQ9Eg==}
+ engines: {node: '>=10'}
+ dev: true
+
+ /lines-and-columns/1.2.4:
+ resolution: {integrity: sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==}
+
+ /lint-staged/13.0.3:
+ resolution: {integrity: sha512-9hmrwSCFroTSYLjflGI8Uk+GWAwMB4OlpU4bMJEAT5d/llQwtYKoim4bLOyLCuWFAhWEupE0vkIFqtw/WIsPug==}
+ engines: {node: ^14.13.1 || >=16.0.0}
+ hasBin: true
+ dependencies:
+ cli-truncate: 3.1.0
+ colorette: 2.0.19
+ commander: 9.4.1
+ debug: 4.3.4
+ execa: 6.1.0
+ lilconfig: 2.0.5
+ listr2: 4.0.5
+ micromatch: 4.0.5
+ normalize-path: 3.0.0
+ object-inspect: 1.12.2
+ pidtree: 0.6.0
+ string-argv: 0.3.1
+ yaml: 2.1.3
+ transitivePeerDependencies:
+ - enquirer
+ - supports-color
+ dev: true
+
+ /listr2/4.0.5:
+ resolution: {integrity: sha512-juGHV1doQdpNT3GSTs9IUN43QJb7KHdF9uqg7Vufs/tG9VTzpFphqF4pm/ICdAABGQxsyNn9CiYA3StkI6jpwA==}
+ engines: {node: '>=12'}
+ peerDependencies:
+ enquirer: '>= 2.3.0 < 3'
+ peerDependenciesMeta:
+ enquirer:
+ optional: true
+ dependencies:
+ cli-truncate: 2.1.0
+ colorette: 2.0.19
+ log-update: 4.0.0
+ p-map: 4.0.0
+ rfdc: 1.3.0
+ rxjs: 7.5.7
+ through: 2.3.8
+ wrap-ansi: 7.0.0
+ dev: true
+
+ /loader-runner/4.3.0:
+ resolution: {integrity: sha512-3R/1M+yS3j5ou80Me59j7F9IMs4PXs3VqRrm0TU3AbKPxlmpoY1TNscJV/oGJXo8qCatFGTfDbY6W6ipGOYXfg==}
+ engines: {node: '>=6.11.5'}
+ dev: true
+
+ /loader-utils/2.0.2:
+ resolution: {integrity: sha512-TM57VeHptv569d/GKh6TAYdzKblwDNiumOdkFnejjD0XwTH87K90w3O7AiJRqdQoXygvi1VQTJTLGhJl7WqA7A==}
+ engines: {node: '>=8.9.0'}
+ dependencies:
+ big.js: 5.2.2
+ emojis-list: 3.0.0
+ json5: 2.2.1
+ dev: true
+
+ /localforage/1.10.0:
+ resolution: {integrity: sha512-14/H1aX7hzBBmmh7sGPd+AOMkkIrHM3Z1PAyGgZigA1H1p5O5ANnMyWzvpAETtG68/dC4pC0ncy3+PPGzXZHPg==}
+ dependencies:
+ lie: 3.1.1
+ dev: false
+
+ /locate-path/5.0.0:
+ resolution: {integrity: sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==}
+ engines: {node: '>=8'}
+ dependencies:
+ p-locate: 4.1.0
+ dev: true
+
+ /lodash.debounce/4.0.8:
+ resolution: {integrity: sha512-FT1yDzDYEoYWhnSGnpE/4Kj1fLZkDFyqRb7fNt6FdYOSxlUWAtp42Eh6Wb0rGIv/m9Bgo7x4GhQbm5Ys4SG5ow==}
+
+ /lodash.memoize/4.1.2:
+ resolution: {integrity: sha512-t7j+NzmgnQzTAYXcsHYLgimltOV1MXHtlOWf6GjL9Kj8GK5FInw5JotxvbOs+IvV1/Dzo04/fCGfLVs7aXb4Ag==}
+ dev: true
+
+ /lodash.merge/4.6.2:
+ resolution: {integrity: sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==}
+ dev: true
+
+ /lodash.truncate/4.4.2:
+ resolution: {integrity: sha512-jttmRe7bRse52OsWIMDLaXxWqRAmtIUccAQ3garviCqJjafXOfNMO0yMfNpdD6zbGaTU0P5Nz7e7gAT6cKmJRw==}
+ dev: true
+
+ /lodash/4.17.21:
+ resolution: {integrity: sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==}
+
+ /log-update/4.0.0:
+ resolution: {integrity: sha512-9fkkDevMefjg0mmzWFBW8YkFP91OrizzkW3diF7CpG+S2EYdy4+TVfGwz1zeF8x7hCx1ovSPTOE9Ngib74qqUg==}
+ engines: {node: '>=10'}
+ dependencies:
+ ansi-escapes: 4.3.2
+ cli-cursor: 3.1.0
+ slice-ansi: 4.0.0
+ wrap-ansi: 6.2.0
+ dev: true
+
+ /loose-envify/1.4.0:
+ resolution: {integrity: sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==}
+ hasBin: true
+ dependencies:
+ js-tokens: 4.0.0
+
+ /lru-cache/6.0.0:
+ resolution: {integrity: sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==}
+ engines: {node: '>=10'}
+ dependencies:
+ yallist: 4.0.0
+ dev: true
+
+ /lz-string/1.4.4:
+ resolution: {integrity: sha512-0ckx7ZHRPqb0oUm8zNr+90mtf9DQB60H1wMCjBtfi62Kl3a7JbHob6gA2bC+xRvZoOL+1hzUK8jeuEIQE8svEQ==}
+ hasBin: true
+ dev: true
+
+ /magic-string/0.26.7:
+ resolution: {integrity: sha512-hX9XH3ziStPoPhJxLq1syWuZMxbDvGNbVchfrdCtanC7D13888bMFow61x8axrx+GfHLtVeAx2kxL7tTGRl+Ow==}
+ engines: {node: '>=12'}
+ dependencies:
+ sourcemap-codec: 1.4.8
+ dev: true
+
+ /make-dir/3.1.0:
+ resolution: {integrity: sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw==}
+ engines: {node: '>=8'}
+ dependencies:
+ semver: 6.3.0
+ dev: true
+
+ /make-error/1.3.6:
+ resolution: {integrity: sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw==}
+ dev: true
+
+ /makeerror/1.0.12:
+ resolution: {integrity: sha512-JmqCvUhmt43madlpFzG4BQzG2Z3m6tvQDNKdClZnO3VbIudJYmxsT0FNJMeiB2+JTSlTQTSbU8QdesVmwJcmLg==}
+ dependencies:
+ tmpl: 1.0.5
+ dev: true
+
+ /match-sorter/6.3.1:
+ resolution: {integrity: sha512-mxybbo3pPNuA+ZuCUhm5bwNkXrJTbsk5VWbR5wiwz/GC6LIiegBGn2w3O08UG/jdbYLinw51fSQ5xNU1U3MgBw==}
+ dependencies:
+ '@babel/runtime': 7.19.4
+ remove-accents: 0.4.2
+ dev: false
+
+ /memoize-one/5.2.1:
+ resolution: {integrity: sha512-zYiwtZUcYyXKo/np96AGZAckk+FWWsUdJ3cHGGmld7+AhvcWmQyGCYUh1hc4Q/pkOhb65dQR/pqCyK0cOaHz4Q==}
+ dev: false
+
+ /merge-stream/2.0.0:
+ resolution: {integrity: sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==}
+ dev: true
+
+ /merge2/1.4.1:
+ resolution: {integrity: sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==}
+ engines: {node: '>= 8'}
+ dev: true
+
+ /micromatch/4.0.5:
+ resolution: {integrity: sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA==}
+ engines: {node: '>=8.6'}
+ dependencies:
+ braces: 3.0.2
+ picomatch: 2.3.1
+ dev: true
+
+ /microseconds/0.2.0:
+ resolution: {integrity: sha512-n7DHHMjR1avBbSpsTBj6fmMGh2AGrifVV4e+WYc3Q9lO+xnSZ3NyhcBND3vzzatt05LFhoKFRxrIyklmLlUtyA==}
+ dev: false
+
+ /mime-db/1.33.0:
+ resolution: {integrity: sha512-BHJ/EKruNIqJf/QahvxwQZXKygOQ256myeN/Ew+THcAa5q+PjyTTMMeNQC4DZw5AwfvelsUrA6B67NKMqXDbzQ==}
+ engines: {node: '>= 0.6'}
+ dev: true
+
+ /mime-db/1.52.0:
+ resolution: {integrity: sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==}
+ engines: {node: '>= 0.6'}
+ dev: true
+
+ /mime-types/2.1.18:
+ resolution: {integrity: sha512-lc/aahn+t4/SWV/qcmumYjymLsWfN3ELhpmVuUFjgsORruuZPVSwAQryq+HHGvO/SI2KVX26bx+En+zhM8g8hQ==}
+ engines: {node: '>= 0.6'}
+ dependencies:
+ mime-db: 1.33.0
+ dev: true
+
+ /mime-types/2.1.35:
+ resolution: {integrity: sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==}
+ engines: {node: '>= 0.6'}
+ dependencies:
+ mime-db: 1.52.0
+ dev: true
+
+ /mimic-fn/2.1.0:
+ resolution: {integrity: sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==}
+ engines: {node: '>=6'}
+ dev: true
+
+ /mimic-fn/4.0.0:
+ resolution: {integrity: sha512-vqiC06CuhBTUdZH+RYl8sFrL096vA45Ok5ISO6sE/Mr1jRbGH4Csnhi8f3wKVl7x8mO4Au7Ir9D3Oyv1VYMFJw==}
+ engines: {node: '>=12'}
+ dev: true
+
+ /min-indent/1.0.1:
+ resolution: {integrity: sha512-I9jwMn07Sy/IwOj3zVkVik2JTvgpaykDZEigL6Rx6N9LbMywwUSMtxET+7lVoDLLd3O3IXwJwvuuns8UB/HeAg==}
+ engines: {node: '>=4'}
+ dev: true
+
+ /minimatch/3.0.4:
+ resolution: {integrity: sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==}
+ dependencies:
+ brace-expansion: 1.1.11
+ dev: true
+
+ /minimatch/3.1.2:
+ resolution: {integrity: sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==}
+ dependencies:
+ brace-expansion: 1.1.11
+
+ /minimist/1.2.7:
+ resolution: {integrity: sha512-bzfL1YUZsP41gmu/qjrEk0Q6i2ix/cVeAhbCbqH9u3zYutS1cLg00qhrD0M2MVdCcx4Sc0UpP2eBWo9rotpq6g==}
+ dev: true
+
+ /ms/2.0.0:
+ resolution: {integrity: sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==}
+ dev: true
+
+ /ms/2.1.2:
+ resolution: {integrity: sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==}
+
+ /nano-time/1.0.0:
+ resolution: {integrity: sha512-flnngywOoQ0lLQOTRNexn2gGSNuM9bKj9RZAWSzhQ+UJYaAFG9bac4DW9VHjUAzrOaIcajHybCTHe/bkvozQqA==}
+ dependencies:
+ big-integer: 1.6.51
+ dev: false
+
+ /nanoid/3.3.4:
+ resolution: {integrity: sha512-MqBkQh/OHTS2egovRtLk45wEyNXwF+cokD+1YPf9u5VfJiRdAiRwB2froX5Co9Rh20xs4siNPm8naNotSD6RBw==}
+ engines: {node: ^10 || ^12 || ^13.7 || ^14 || >=15.0.1}
+ hasBin: true
+ dev: true
+
+ /natural-compare/1.4.0:
+ resolution: {integrity: sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==}
+ dev: true
+
+ /negotiator/0.6.3:
+ resolution: {integrity: sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg==}
+ engines: {node: '>= 0.6'}
+ dev: true
+
+ /neo-async/2.6.2:
+ resolution: {integrity: sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw==}
+ dev: true
+
+ /node-int64/0.4.0:
+ resolution: {integrity: sha512-O5lz91xSOeoXP6DulyHfllpq+Eg00MWitZIbtPfoSEvqIHdl5gfcY6hYzDWnj0qD5tz52PI08u9qUvSVeUBeHw==}
+ dev: true
+
+ /node-releases/2.0.6:
+ resolution: {integrity: sha512-PiVXnNuFm5+iYkLBNeq5211hvO38y63T0i2KKh2KnUs3RpzJ+JtODFjkD8yjLwnDkTYF1eKXheUwdssR+NRZdg==}
+
+ /normalize-path/3.0.0:
+ resolution: {integrity: sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==}
+ engines: {node: '>=0.10.0'}
+ dev: true
+
+ /npm-run-path/4.0.1:
+ resolution: {integrity: sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw==}
+ engines: {node: '>=8'}
+ dependencies:
+ path-key: 3.1.1
+ dev: true
+
+ /npm-run-path/5.1.0:
+ resolution: {integrity: sha512-sJOdmRGrY2sjNTRMbSvluQqg+8X7ZK61yvzBEIDhz4f8z1TZFYABsqjjCBd/0PUNE9M6QDgHJXQkGUEm7Q+l9Q==}
+ engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0}
+ dependencies:
+ path-key: 4.0.0
+ dev: true
+
+ /nwsapi/2.2.2:
+ resolution: {integrity: sha512-90yv+6538zuvUMnN+zCr8LuV6bPFdq50304114vJYJ8RDyK8D5O9Phpbd6SZWgI7PwzmmfN1upeOJlvybDSgCw==}
+ dev: true
+
+ /object-assign/4.1.1:
+ resolution: {integrity: sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==}
+ engines: {node: '>=0.10.0'}
+
+ /object-inspect/1.12.2:
+ resolution: {integrity: sha512-z+cPxW0QGUp0mcqcsgQyLVRDoXFQbXOwBaqyF7VIgI4TWNQsDHrBpUQslRmIfAoYWdYzs6UlKJtB2XJpTaNSpQ==}
+ dev: true
+
+ /object-keys/1.1.1:
+ resolution: {integrity: sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==}
+ engines: {node: '>= 0.4'}
+ dev: true
+
+ /object.assign/4.1.4:
+ resolution: {integrity: sha512-1mxKf0e58bvyjSCtKYY4sRe9itRk3PJpquJOjeIkz885CczcI4IvJJDLPS72oowuSh+pBxUFROpX+TU++hxhZQ==}
+ engines: {node: '>= 0.4'}
+ dependencies:
+ call-bind: 1.0.2
+ define-properties: 1.1.4
+ has-symbols: 1.0.3
+ object-keys: 1.1.1
+ dev: true
+
+ /object.entries/1.1.5:
+ resolution: {integrity: sha512-TyxmjUoZggd4OrrU1W66FMDG6CuqJxsFvymeyXI51+vQLN67zYfZseptRge703kKQdo4uccgAKebXFcRCzk4+g==}
+ engines: {node: '>= 0.4'}
+ dependencies:
+ call-bind: 1.0.2
+ define-properties: 1.1.4
+ es-abstract: 1.20.4
+ dev: true
+
+ /object.fromentries/2.0.5:
+ resolution: {integrity: sha512-CAyG5mWQRRiBU57Re4FKoTBjXfDoNwdFVH2Y1tS9PqCsfUTymAohOkEMSG3aRNKmv4lV3O7p1et7c187q6bynw==}
+ engines: {node: '>= 0.4'}
+ dependencies:
+ call-bind: 1.0.2
+ define-properties: 1.1.4
+ es-abstract: 1.20.4
+ dev: true
+
+ /object.hasown/1.1.1:
+ resolution: {integrity: sha512-LYLe4tivNQzq4JdaWW6WO3HMZZJWzkkH8fnI6EebWl0VZth2wL2Lovm74ep2/gZzlaTdV62JZHEqHQ2yVn8Q/A==}
+ dependencies:
+ define-properties: 1.1.4
+ es-abstract: 1.20.4
+ dev: true
+
+ /object.values/1.1.5:
+ resolution: {integrity: sha512-QUZRW0ilQ3PnPpbNtgdNV1PDbEqLIiSFB3l+EnGtBQ/8SUTLj1PZwtQHABZtLgwpJZTSZhuGLOGk57Drx2IvYg==}
+ engines: {node: '>= 0.4'}
+ dependencies:
+ call-bind: 1.0.2
+ define-properties: 1.1.4
+ es-abstract: 1.20.4
+ dev: true
+
+ /oblivious-set/1.0.0:
+ resolution: {integrity: sha512-z+pI07qxo4c2CulUHCDf9lcqDlMSo72N/4rLUpRXf6fu+q8vjt8y0xS+Tlf8NTJDdTXHbdeO1n3MlbctwEoXZw==}
+ dev: false
+
+ /on-headers/1.0.2:
+ resolution: {integrity: sha512-pZAE+FJLoyITytdqK0U5s+FIpjN0JP3OzFi/u8Rx+EV5/W+JTWGXG8xFzevE7AjBfDqHv/8vL8qQsIhHnqRkrA==}
+ engines: {node: '>= 0.8'}
+ dev: true
+
+ /once/1.4.0:
+ resolution: {integrity: sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==}
+ dependencies:
+ wrappy: 1.0.2
+
+ /onetime/5.1.2:
+ resolution: {integrity: sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==}
+ engines: {node: '>=6'}
+ dependencies:
+ mimic-fn: 2.1.0
+ dev: true
+
+ /onetime/6.0.0:
+ resolution: {integrity: sha512-1FlR+gjXK7X+AsAHso35MnyN5KqGwJRi/31ft6x0M194ht7S+rWAvd7PHss9xSKMzE0asv1pyIHaJYq+BbacAQ==}
+ engines: {node: '>=12'}
+ dependencies:
+ mimic-fn: 4.0.0
+ dev: true
+
+ /optionator/0.8.3:
+ resolution: {integrity: sha512-+IW9pACdk3XWmmTXG8m3upGUJst5XRGzxMRjXzAuJ1XnIFNvfhjjIuYkDvysnPQ7qzqVzLt78BCruntqRhWQbA==}
+ engines: {node: '>= 0.8.0'}
+ dependencies:
+ deep-is: 0.1.4
+ fast-levenshtein: 2.0.6
+ levn: 0.3.0
+ prelude-ls: 1.1.2
+ type-check: 0.3.2
+ word-wrap: 1.2.3
+ dev: true
+
+ /optionator/0.9.1:
+ resolution: {integrity: sha512-74RlY5FCnhq4jRxVUPKDaRwrVNXMqsGsiW6AJw4XK8hmtm10wC0ypZBLw5IIp85NZMr91+qd1RvvENwg7jjRFw==}
+ engines: {node: '>= 0.8.0'}
+ dependencies:
+ deep-is: 0.1.4
+ fast-levenshtein: 2.0.6
+ levn: 0.4.1
+ prelude-ls: 1.2.1
+ type-check: 0.4.0
+ word-wrap: 1.2.3
+ dev: true
+
+ /p-limit/2.3.0:
+ resolution: {integrity: sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==}
+ engines: {node: '>=6'}
+ dependencies:
+ p-try: 2.2.0
+ dev: true
+
+ /p-limit/3.1.0:
+ resolution: {integrity: sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==}
+ engines: {node: '>=10'}
+ dependencies:
+ yocto-queue: 0.1.0
+ dev: true
+
+ /p-locate/4.1.0:
+ resolution: {integrity: sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==}
+ engines: {node: '>=8'}
+ dependencies:
+ p-limit: 2.3.0
+ dev: true
+
+ /p-map/4.0.0:
+ resolution: {integrity: sha512-/bjOqmgETBYB5BoEeGVea8dmvHb2m9GLy1E9W43yeyfP6QQCZGFNa+XRceJEuDB6zqr+gKpIAmlLebMpykw/MQ==}
+ engines: {node: '>=10'}
+ dependencies:
+ aggregate-error: 3.1.0
+ dev: true
+
+ /p-try/2.2.0:
+ resolution: {integrity: sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==}
+ engines: {node: '>=6'}
+ dev: true
+
+ /papaparse/5.3.2:
+ resolution: {integrity: sha512-6dNZu0Ki+gyV0eBsFKJhYr+MdQYAzFUGlBMNj3GNrmHxmz1lfRa24CjFObPXtjcetlOv5Ad299MhIK0znp3afw==}
+ dev: false
+
+ /parent-module/1.0.1:
+ resolution: {integrity: sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==}
+ engines: {node: '>=6'}
+ dependencies:
+ callsites: 3.1.0
+
+ /parse-json/5.2.0:
+ resolution: {integrity: sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg==}
+ engines: {node: '>=8'}
+ dependencies:
+ '@babel/code-frame': 7.18.6
+ error-ex: 1.3.2
+ json-parse-even-better-errors: 2.3.1
+ lines-and-columns: 1.2.4
+
+ /parse5/7.1.1:
+ resolution: {integrity: sha512-kwpuwzB+px5WUg9pyK0IcK/shltJN5/OVhQagxhCQNtT9Y9QRZqNY2e1cmbu/paRh5LMnz/oVTVLBpjFmMZhSg==}
+ dependencies:
+ entities: 4.4.0
+ dev: true
+
+ /path-exists/4.0.0:
+ resolution: {integrity: sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==}
+ engines: {node: '>=8'}
+ dev: true
+
+ /path-is-absolute/1.0.1:
+ resolution: {integrity: sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==}
+ engines: {node: '>=0.10.0'}
+
+ /path-is-inside/1.0.2:
+ resolution: {integrity: sha512-DUWJr3+ULp4zXmol/SZkFf3JGsS9/SIv+Y3Rt93/UjPpDpklB5f1er4O3POIbUuUJ3FXgqte2Q7SrU6zAqwk8w==}
+ dev: true
+
+ /path-key/3.1.1:
+ resolution: {integrity: sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==}
+ engines: {node: '>=8'}
+ dev: true
+
+ /path-key/4.0.0:
+ resolution: {integrity: sha512-haREypq7xkM7ErfgIyA0z+Bj4AGKlMSdlQE2jvJo6huWD1EdkKYV+G/T4nq0YEF2vgTT8kqMFKo1uHn950r4SQ==}
+ engines: {node: '>=12'}
+ dev: true
+
+ /path-parse/1.0.7:
+ resolution: {integrity: sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==}
+
+ /path-to-regexp/2.2.1:
+ resolution: {integrity: sha512-gu9bD6Ta5bwGrrU8muHzVOBFFREpp2iRkVfhBJahwJ6p6Xw20SjT0MxLnwkjOibQmGSYhiUnf2FLe7k+jcFmGQ==}
+ dev: true
+
+ /path-type/4.0.0:
+ resolution: {integrity: sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==}
+ engines: {node: '>=8'}
+
+ /picocolors/1.0.0:
+ resolution: {integrity: sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==}
+
+ /picomatch/2.3.1:
+ resolution: {integrity: sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==}
+ engines: {node: '>=8.6'}
+ dev: true
+
+ /pidtree/0.6.0:
+ resolution: {integrity: sha512-eG2dWTVw5bzqGRztnHExczNxt5VGsE6OwTeCG3fdUf9KBsZzO3R5OIIIzWR+iZA0NtZ+RDVdaoE2dK1cn6jH4g==}
+ engines: {node: '>=0.10'}
+ hasBin: true
+ dev: true
+
+ /pirates/4.0.5:
+ resolution: {integrity: sha512-8V9+HQPupnaXMA23c5hvl69zXvTwTzyAYasnkb0Tts4XvO4CliqONMOnvlq26rkhLC3nWDFBJf73LU1e1VZLaQ==}
+ engines: {node: '>= 6'}
+ dev: true
+
+ /pkg-dir/4.2.0:
+ resolution: {integrity: sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ==}
+ engines: {node: '>=8'}
+ dependencies:
+ find-up: 4.1.0
+ dev: true
+
+ /popmotion/9.0.0-rc.20:
+ resolution: {integrity: sha512-f98sny03WuA+c8ckBjNNXotJD4G2utG/I3Q23NU69OEafrXtxxSukAaJBxzbtxwDvz3vtZK69pu9ojdkMoBNTg==}
+ dependencies:
+ framesync: 4.1.0
+ hey-listen: 1.0.8
+ style-value-types: 3.2.0
+ tslib: 1.14.1
+ dev: false
+
+ /postcss/8.4.18:
+ resolution: {integrity: sha512-Wi8mWhncLJm11GATDaQKobXSNEYGUHeQLiQqDFG1qQ5UTDPTEvKw0Xt5NsTpktGTwLps3ByrWsBrG0rB8YQ9oA==}
+ engines: {node: ^10 || ^12 || >=14}
+ dependencies:
+ nanoid: 3.3.4
+ picocolors: 1.0.0
+ source-map-js: 1.0.2
+ dev: true
+
+ /prelude-ls/1.1.2:
+ resolution: {integrity: sha512-ESF23V4SKG6lVSGZgYNpbsiaAkdab6ZgOxe52p7+Kid3W3u3bxR4Vfd/o21dmN7jSt0IwgZ4v5MUd26FEtXE9w==}
+ engines: {node: '>= 0.8.0'}
+ dev: true
+
+ /prelude-ls/1.2.1:
+ resolution: {integrity: sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==}
+ engines: {node: '>= 0.8.0'}
+ dev: true
+
+ /prettier/2.1.2:
+ resolution: {integrity: sha512-16c7K+x4qVlJg9rEbXl7HEGmQyZlG4R9AgP+oHKRMsMsuk8s+ATStlf1NpDqyBI1HpVyfjLOeMhH2LvuNvV5Vg==}
+ engines: {node: '>=10.13.0'}
+ hasBin: true
+ dev: true
+
+ /pretty-format/26.6.2:
+ resolution: {integrity: sha512-7AeGuCYNGmycyQbCqd/3PWH4eOoX/OiCa0uphp57NVTeAGdJGaAliecxwBDHYQCIvrW7aDBZCYeNTP/WX69mkg==}
+ engines: {node: '>= 10'}
+ dependencies:
+ '@jest/types': 26.6.2
+ ansi-regex: 5.0.1
+ ansi-styles: 4.3.0
+ react-is: 17.0.2
+ dev: true
+
+ /pretty-format/27.5.1:
+ resolution: {integrity: sha512-Qb1gy5OrP5+zDf2Bvnzdl3jsTf1qXVMazbvCoKhtKqVs4/YK4ozX4gKQJJVyNe+cajNPn0KoC0MC3FUmaHWEmQ==}
+ engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0}
+ dependencies:
+ ansi-regex: 5.0.1
+ ansi-styles: 5.2.0
+ react-is: 17.0.2
+ dev: true
+
+ /pretty-format/28.1.3:
+ resolution: {integrity: sha512-8gFb/To0OmxHR9+ZTb14Df2vNxdGCX8g1xWGUTqUw5TiZvcQf5sHKObd5UcPyLLyowNwDAMTF3XWOG1B6mxl1Q==}
+ engines: {node: ^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0}
+ dependencies:
+ '@jest/schemas': 28.1.3
+ ansi-regex: 5.0.1
+ ansi-styles: 5.2.0
+ react-is: 18.2.0
+ dev: true
+
+ /pretty-format/29.1.2:
+ resolution: {integrity: sha512-CGJ6VVGXVRP2o2Dorl4mAwwvDWT25luIsYhkyVQW32E4nL+TgW939J7LlKT/npq5Cpq6j3s+sy+13yk7xYpBmg==}
+ engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0}
+ dependencies:
+ '@jest/schemas': 29.0.0
+ ansi-styles: 5.2.0
+ react-is: 18.2.0
+ dev: true
+
+ /progress/2.0.3:
+ resolution: {integrity: sha512-7PiHtLll5LdnKIMw100I+8xJXR5gW2QwWYkT6iJva0bXitZKa/XMrSbdmg3r2Xnaidz9Qumd0VPaMrZlF9V9sA==}
+ engines: {node: '>=0.4.0'}
+ dev: true
+
+ /prompts/2.4.2:
+ resolution: {integrity: sha512-NxNv/kLguCA7p3jE8oL2aEBsrJWgAakBpgmgK6lpPWV+WuOmY6r2/zbAVnP+T8bQlA0nzHXSJSJW0Hq7ylaD2Q==}
+ engines: {node: '>= 6'}
+ dependencies:
+ kleur: 3.0.3
+ sisteransi: 1.0.5
+ dev: true
+
+ /prop-types/15.8.1:
+ resolution: {integrity: sha512-oj87CgZICdulUohogVAR7AjlC0327U4el4L6eAvOqCeudMDVU0NThNaV+b9Df4dXgSP1gXMTnPdhfe/2qDH5cg==}
+ dependencies:
+ loose-envify: 1.4.0
+ object-assign: 4.1.1
+ react-is: 16.13.1
+
+ /psl/1.9.0:
+ resolution: {integrity: sha512-E/ZsdU4HLs/68gYzgGTkMicWTLPdAftJLfJFlLUAAKZGkStNU72sZjT66SnMDVOfOWY/YAoiD7Jxa9iHvngcag==}
+ dev: true
+
+ /punycode/1.4.1:
+ resolution: {integrity: sha512-jmYNElW7yvO7TV33CjSmvSiE2yco3bV2czu/OzDKdMNVZQWfxCblURLhf+47syQRBntjfLdd/H0egrzIG+oaFQ==}
+ dev: true
+
+ /punycode/2.1.1:
+ resolution: {integrity: sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A==}
+ engines: {node: '>=6'}
+ dev: true
+
+ /query-string/7.1.1:
+ resolution: {integrity: sha512-MplouLRDHBZSG9z7fpuAAcI7aAYjDLhtsiVZsevsfaHWDS2IDdORKbSd1kWUA+V4zyva/HZoSfpwnYMMQDhb0w==}
+ engines: {node: '>=6'}
+ dependencies:
+ decode-uri-component: 0.2.0
+ filter-obj: 1.1.0
+ split-on-first: 1.1.0
+ strict-uri-encode: 2.0.0
+ dev: false
+
+ /querystringify/2.2.0:
+ resolution: {integrity: sha512-FIqgj2EUvTa7R50u0rGsyTftzjYmv/a3hO345bZNrqabNqjtgiDMgmo4mkUjd+nzU5oF3dClKqFIPUKybUyqoQ==}
+ dev: true
+
+ /queue-microtask/1.2.3:
+ resolution: {integrity: sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==}
+ dev: true
+
+ /raf-schd/4.0.3:
+ resolution: {integrity: sha512-tQkJl2GRWh83ui2DiPTJz9wEiMN20syf+5oKfB03yYP7ioZcJwsIK8FjrtLwH1m7C7e+Tt2yYBlrOpdT+dyeIQ==}
+ dev: false
+
+ /randombytes/2.1.0:
+ resolution: {integrity: sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ==}
+ dependencies:
+ safe-buffer: 5.2.1
+ dev: true
+
+ /range-parser/1.2.0:
+ resolution: {integrity: sha512-kA5WQoNVo4t9lNx2kQNFCxKeBl5IbbSNBl1M/tLkw9WCn+hxNBAW5Qh8gdhs63CJnhjJ2zQWFoqPJP2sK1AV5A==}
+ engines: {node: '>= 0.6'}
+ dev: true
+
+ /rc-align/4.0.12_sfoxds7t5ydpegc3knd667wn6m:
+ resolution: {integrity: sha512-3DuwSJp8iC/dgHzwreOQl52soj40LchlfUHtgACOUtwGuoFIOVh6n/sCpfqCU8kO5+iz6qR0YKvjgB8iPdE3aQ==}
+ peerDependencies:
+ react: '>=16.9.0'
+ react-dom: '>=16.9.0'
+ dependencies:
+ '@babel/runtime': 7.19.4
+ classnames: 2.3.2
+ dom-align: 1.12.3
+ lodash: 4.17.21
+ rc-util: 5.24.4_sfoxds7t5ydpegc3knd667wn6m
+ react: 17.0.2
+ react-dom: 17.0.2_react@17.0.2
+ resize-observer-polyfill: 1.5.1
+ dev: false
+
+ /rc-dropdown/4.0.1_sfoxds7t5ydpegc3knd667wn6m:
+ resolution: {integrity: sha512-OdpXuOcme1rm45cR0Jzgfl1otzmU4vuBVb+etXM8vcaULGokAKVpKlw8p6xzspG7jGd/XxShvq+N3VNEfk/l5g==}
+ peerDependencies:
+ react: '>=16.11.0'
+ react-dom: '>=16.11.0'
+ dependencies:
+ '@babel/runtime': 7.19.4
+ classnames: 2.3.2
+ rc-trigger: 5.3.1_sfoxds7t5ydpegc3knd667wn6m
+ rc-util: 5.24.4_sfoxds7t5ydpegc3knd667wn6m
+ react: 17.0.2
+ react-dom: 17.0.2_react@17.0.2
+ dev: false
+
+ /rc-menu/9.6.4_sfoxds7t5ydpegc3knd667wn6m:
+ resolution: {integrity: sha512-6DiNAjxjVIPLZXHffXxxcyE15d4isRL7iQ1ru4MqYDH2Cqc5bW96wZOdMydFtGLyDdnmEQ9jVvdCE9yliGvzkw==}
+ peerDependencies:
+ react: '>=16.9.0'
+ react-dom: '>=16.9.0'
+ dependencies:
+ '@babel/runtime': 7.19.4
+ classnames: 2.3.2
+ rc-motion: 2.6.2_sfoxds7t5ydpegc3knd667wn6m
+ rc-overflow: 1.2.8_sfoxds7t5ydpegc3knd667wn6m
+ rc-trigger: 5.3.1_sfoxds7t5ydpegc3knd667wn6m
+ rc-util: 5.24.4_sfoxds7t5ydpegc3knd667wn6m
+ react: 17.0.2
+ react-dom: 17.0.2_react@17.0.2
+ shallowequal: 1.1.0
+ dev: false
+
+ /rc-motion/2.6.2_sfoxds7t5ydpegc3knd667wn6m:
+ resolution: {integrity: sha512-4w1FaX3dtV749P8GwfS4fYnFG4Rb9pxvCYPc/b2fw1cmlHJWNNgOFIz7ysiD+eOrzJSvnLJWlNQQncpNMXwwpg==}
+ peerDependencies:
+ react: '>=16.9.0'
+ react-dom: '>=16.9.0'
+ dependencies:
+ '@babel/runtime': 7.19.4
+ classnames: 2.3.2
+ rc-util: 5.24.4_sfoxds7t5ydpegc3knd667wn6m
+ react: 17.0.2
+ react-dom: 17.0.2_react@17.0.2
+ dev: false
+
+ /rc-overflow/1.2.8_sfoxds7t5ydpegc3knd667wn6m:
+ resolution: {integrity: sha512-QJ0UItckWPQ37ZL1dMEBAdY1dhfTXFL9k6oTTcyydVwoUNMnMqCGqnRNA98axSr/OeDKqR6DVFyi8eA5RQI/uQ==}
+ peerDependencies:
+ react: '>=16.9.0'
+ react-dom: '>=16.9.0'
+ dependencies:
+ '@babel/runtime': 7.19.4
+ classnames: 2.3.2
+ rc-resize-observer: 1.2.0_sfoxds7t5ydpegc3knd667wn6m
+ rc-util: 5.24.4_sfoxds7t5ydpegc3knd667wn6m
+ react: 17.0.2
+ react-dom: 17.0.2_react@17.0.2
+ dev: false
+
+ /rc-resize-observer/1.2.0_sfoxds7t5ydpegc3knd667wn6m:
+ resolution: {integrity: sha512-6W+UzT3PyDM0wVCEHfoW3qTHPTvbdSgiA43buiy8PzmeMnfgnDeb9NjdimMXMl3/TcrvvWl5RRVdp+NqcR47pQ==}
+ peerDependencies:
+ react: '>=16.9.0'
+ react-dom: '>=16.9.0'
+ dependencies:
+ '@babel/runtime': 7.19.4
+ classnames: 2.3.2
+ rc-util: 5.24.4_sfoxds7t5ydpegc3knd667wn6m
+ react: 17.0.2
+ react-dom: 17.0.2_react@17.0.2
+ resize-observer-polyfill: 1.5.1
+ dev: false
+
+ /rc-tabs/11.16.1_sfoxds7t5ydpegc3knd667wn6m:
+ resolution: {integrity: sha512-bR7Dap23YyfzZQwtKomhiFEFzZuE7WaKWo+ypNRSGB9PDKSc6tM12VP8LWYkvmmQHthgwP0WRN8nFbSJWuqLYw==}
+ engines: {node: '>=8.x'}
+ peerDependencies:
+ react: '>=16.9.0'
+ react-dom: '>=16.9.0'
+ dependencies:
+ '@babel/runtime': 7.19.4
+ classnames: 2.3.2
+ rc-dropdown: 4.0.1_sfoxds7t5ydpegc3knd667wn6m
+ rc-menu: 9.6.4_sfoxds7t5ydpegc3knd667wn6m
+ rc-resize-observer: 1.2.0_sfoxds7t5ydpegc3knd667wn6m
+ rc-util: 5.24.4_sfoxds7t5ydpegc3knd667wn6m
+ react: 17.0.2
+ react-dom: 17.0.2_react@17.0.2
+ dev: false
+
+ /rc-trigger/5.3.1_sfoxds7t5ydpegc3knd667wn6m:
+ resolution: {integrity: sha512-5gaFbDkYSefZ14j2AdzucXzlWgU2ri5uEjkHvsf1ynRhdJbKxNOnw4PBZ9+FVULNGFiDzzlVF8RJnR9P/xrnKQ==}
+ engines: {node: '>=8.x'}
+ peerDependencies:
+ react: '>=16.9.0'
+ react-dom: '>=16.9.0'
+ dependencies:
+ '@babel/runtime': 7.19.4
+ classnames: 2.3.2
+ rc-align: 4.0.12_sfoxds7t5ydpegc3knd667wn6m
+ rc-motion: 2.6.2_sfoxds7t5ydpegc3knd667wn6m
+ rc-util: 5.24.4_sfoxds7t5ydpegc3knd667wn6m
+ react: 17.0.2
+ react-dom: 17.0.2_react@17.0.2
+ dev: false
+
+ /rc-util/5.24.4_sfoxds7t5ydpegc3knd667wn6m:
+ resolution: {integrity: sha512-2a4RQnycV9eV7lVZPEJ7QwJRPlZNc06J7CwcwZo4vIHr3PfUqtYgl1EkUV9ETAc6VRRi8XZOMFhYG63whlIC9Q==}
+ peerDependencies:
+ react: '>=16.9.0'
+ react-dom: '>=16.9.0'
+ dependencies:
+ '@babel/runtime': 7.19.4
+ react: 17.0.2
+ react-dom: 17.0.2_react@17.0.2
+ react-is: 16.13.1
+ shallowequal: 1.1.0
+ dev: false
+
+ /rc/1.2.8:
+ resolution: {integrity: sha512-y3bGgqKj3QBdxLbLkomlohkvsA8gdAiUQlSBJnBhfn+BPxg4bc62d8TcBW15wavDfgexCgccckhcZvywyQYPOw==}
+ hasBin: true
+ dependencies:
+ deep-extend: 0.6.0
+ ini: 1.3.8
+ minimist: 1.2.7
+ strip-json-comments: 2.0.1
+ dev: true
+
+ /react-beautiful-dnd/13.1.1_sfoxds7t5ydpegc3knd667wn6m:
+ resolution: {integrity: sha512-0Lvs4tq2VcrEjEgDXHjT98r+63drkKEgqyxdA7qD3mvKwga6a5SscbdLPO2IExotU1jW8L0Ksdl0Cj2AF67nPQ==}
+ peerDependencies:
+ react: ^16.8.5 || ^17.0.0 || ^18.0.0
+ react-dom: ^16.8.5 || ^17.0.0 || ^18.0.0
+ dependencies:
+ '@babel/runtime': 7.19.4
+ css-box-model: 1.2.1
+ memoize-one: 5.2.1
+ raf-schd: 4.0.3
+ react: 17.0.2
+ react-dom: 17.0.2_react@17.0.2
+ react-redux: 7.2.9_sfoxds7t5ydpegc3knd667wn6m
+ redux: 4.2.0
+ use-memo-one: 1.1.3_react@17.0.2
+ transitivePeerDependencies:
+ - react-native
+ dev: false
+
+ /react-dnd-html5-backend/16.0.1:
+ resolution: {integrity: sha512-Wu3dw5aDJmOGw8WjH1I1/yTH+vlXEL4vmjk5p+MHxP8HuHJS1lAGeIdG/hze1AvNeXWo/JgULV87LyQOr+r5jw==}
+ dependencies:
+ dnd-core: 16.0.1
+ dev: false
+
+ /react-dnd/11.1.3_sfoxds7t5ydpegc3knd667wn6m:
+ resolution: {integrity: sha512-8rtzzT8iwHgdSC89VktwhqdKKtfXaAyC4wiqp0SywpHG12TTLvfOoL6xNEIUWXwIEWu+CFfDn4GZJyynCEuHIQ==}
+ peerDependencies:
+ react: '>= 16.9.0'
+ react-dom: '>= 16.9.0'
+ dependencies:
+ '@react-dnd/shallowequal': 2.0.0
+ '@types/hoist-non-react-statics': 3.3.1
+ dnd-core: 11.1.3
+ hoist-non-react-statics: 3.3.2
+ react: 17.0.2
+ react-dom: 17.0.2_react@17.0.2
+ dev: false
+
+ /react-dom/17.0.2_react@17.0.2:
+ resolution: {integrity: sha512-s4h96KtLDUQlsENhMn1ar8t2bEa+q/YAtj8pPPdIjPDGBDIVNsrD9aXNWqspUe6AzKCIG0C1HZZLqLV7qpOBGA==}
+ peerDependencies:
+ react: 17.0.2
+ dependencies:
+ loose-envify: 1.4.0
+ object-assign: 4.1.1
+ react: 17.0.2
+ scheduler: 0.20.2
+
+ /react-error-boundary/3.1.4_react@17.0.2:
+ resolution: {integrity: sha512-uM9uPzZJTF6wRQORmSrvOIgt4lJ9MC1sNgEOj2XGsDTRE4kmpWxg7ENK9EWNKJRMAOY9z0MuF4yIfl6gp4sotA==}
+ engines: {node: '>=10', npm: '>=6'}
+ peerDependencies:
+ react: '>=16.13.1'
+ dependencies:
+ '@babel/runtime': 7.19.4
+ react: 17.0.2
+ dev: true
+
+ /react-from-dom/0.6.2_react@17.0.2:
+ resolution: {integrity: sha512-qvWWTL/4xw4k/Dywd41RBpLQUSq97csuv15qrxN+izNeLYlD9wn5W8LspbfYe5CWbaSdkZ72BsaYBPQf2x4VbQ==}
+ peerDependencies:
+ react: ^16.8.0 || ^17.0.0 || ^18.0.0
+ dependencies:
+ react: 17.0.2
+ dev: false
+
+ /react-inlinesvg/2.3.0_react@17.0.2:
+ resolution: {integrity: sha512-fEGOdDf4k4bcveArbEpj01pJcH8pOCKLxmSj2POFdGvEk5YK0NZVnH6BXpW/PzACHPRsuh1YKAhNZyFnD28oxg==}
+ peerDependencies:
+ react: ^16.8.0 || ^17.0.0
+ dependencies:
+ exenv: 1.2.2
+ react: 17.0.2
+ react-from-dom: 0.6.2_react@17.0.2
+ dev: false
+
+ /react-is/16.13.1:
+ resolution: {integrity: sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==}
+
+ /react-is/17.0.2:
+ resolution: {integrity: sha512-w2GsyukL62IJnlaff/nRegPQR94C/XXamvMWmSHRJ4y7Ts/4ocGRmTHvOs8PSE6pB3dWOrD/nueuU5sduBsQ4w==}
+
+ /react-is/18.2.0:
+ resolution: {integrity: sha512-xWGDIW6x921xtzPkhiULtthJHoJvBbF3q26fzloPCK0hsvxtPVelvftw3zjbHWSkR2km9Z+4uxbDDK/6Zw9B8w==}
+ dev: true
+
+ /react-laag/2.0.4_sfoxds7t5ydpegc3knd667wn6m:
+ resolution: {integrity: sha512-9CGIwYJbysmpQC4KeeTx3fNzchvZT3AIYapi2/z7kOJrYopP2uCoPK39qHKuiyawE57EVRI8F1OtbJeyJ7NTrg==}
+ peerDependencies:
+ react: ^16.0.0 || ^17.0.0
+ react-dom: ^16.0.0 || ^17.0.0
+ dependencies:
+ react: 17.0.2
+ react-dom: 17.0.2_react@17.0.2
+ tiny-warning: 1.0.3
+ dev: false
+
+ /react-query/3.39.2_sfoxds7t5ydpegc3knd667wn6m:
+ resolution: {integrity: sha512-F6hYDKyNgDQfQOuR1Rsp3VRzJnWHx6aRnnIZHMNGGgbL3SBgpZTDg8MQwmxOgpCAoqZJA+JSNCydF1xGJqKOCA==}
+ peerDependencies:
+ react: ^16.8.0 || ^17.0.0 || ^18.0.0
+ react-dom: '*'
+ react-native: '*'
+ peerDependenciesMeta:
+ react-dom:
+ optional: true
+ react-native:
+ optional: true
+ dependencies:
+ '@babel/runtime': 7.19.4
+ broadcast-channel: 3.7.0
+ match-sorter: 6.3.1
+ react: 17.0.2
+ react-dom: 17.0.2_react@17.0.2
+ dev: false
+
+ /react-redux/7.2.9_sfoxds7t5ydpegc3knd667wn6m:
+ resolution: {integrity: sha512-Gx4L3uM182jEEayZfRbI/G11ZpYdNAnBs70lFVMNdHJI76XYtR+7m0MN+eAs7UHBPhWXcnFPaS+9owSCJQHNpQ==}
+ peerDependencies:
+ react: ^16.8.3 || ^17 || ^18
+ react-dom: '*'
+ react-native: '*'
+ peerDependenciesMeta:
+ react-dom:
+ optional: true
+ react-native:
+ optional: true
+ dependencies:
+ '@babel/runtime': 7.19.4
+ '@types/react-redux': 7.1.24
+ hoist-non-react-statics: 3.3.2
+ loose-envify: 1.4.0
+ prop-types: 15.8.1
+ react: 17.0.2
+ react-dom: 17.0.2_react@17.0.2
+ react-is: 17.0.2
+ dev: false
+
+ /react-refresh/0.14.0:
+ resolution: {integrity: sha512-wViHqhAd8OHeLS/IRMJjTSDHF3U9eWi62F/MledQGPdJGDhodXJ9PBLNGr6WWL7qlH12Mt3TyTpbS+hGXMjCzQ==}
+ engines: {node: '>=0.10.0'}
+ dev: true
+
+ /react-router-dom/6.4.2_sfoxds7t5ydpegc3knd667wn6m:
+ resolution: {integrity: sha512-yM1kjoTkpfjgczPrcyWrp+OuQMyB1WleICiiGfstnQYo/S8hPEEnVjr/RdmlH6yKK4Tnj1UGXFSa7uwAtmDoLQ==}
+ engines: {node: '>=14'}
+ peerDependencies:
+ react: '>=16.8'
+ react-dom: '>=16.8'
+ dependencies:
+ '@remix-run/router': 1.0.2
+ react: 17.0.2
+ react-dom: 17.0.2_react@17.0.2
+ react-router: 6.4.2_react@17.0.2
+ dev: false
+
+ /react-router/6.4.2_react@17.0.2:
+ resolution: {integrity: sha512-Rb0BAX9KHhVzT1OKhMvCDMw776aTYM0DtkxqUBP8dNBom3mPXlfNs76JNGK8wKJ1IZEY1+WGj+cvZxHVk/GiKw==}
+ engines: {node: '>=14'}
+ peerDependencies:
+ react: '>=16.8'
+ dependencies:
+ '@remix-run/router': 1.0.2
+ react: 17.0.2
+ dev: false
+
+ /react-shallow-renderer/16.15.0_react@17.0.2:
+ resolution: {integrity: sha512-oScf2FqQ9LFVQgA73vr86xl2NaOIX73rh+YFqcOp68CWj56tSfgtGKrEbyhCj0rSijyG9M1CYprTh39fBi5hzA==}
+ peerDependencies:
+ react: ^16.0.0 || ^17.0.0 || ^18.0.0
+ dependencies:
+ object-assign: 4.1.1
+ react: 17.0.2
+ react-is: 17.0.2
+ dev: true
+
+ /react-slick/0.28.1_sfoxds7t5ydpegc3knd667wn6m:
+ resolution: {integrity: sha512-JwRQXoWGJRbUTE7eZI1rGIHaXX/4YuwX6gn7ulfvUZ4vFDVQAA25HcsHSYaUiRCduTr6rskyIuyPMpuG6bbluw==}
+ peerDependencies:
+ react: ^0.14.0 || ^15.0.1 || ^16.0.0 || ^17.0.0
+ react-dom: ^0.14.0 || ^15.0.1 || ^16.0.0 || ^17.0.0
+ dependencies:
+ classnames: 2.3.2
+ enquire.js: 2.1.6
+ json2mq: 0.2.0
+ lodash.debounce: 4.0.8
+ react: 17.0.2
+ react-dom: 17.0.2_react@17.0.2
+ resize-observer-polyfill: 1.5.1
+ dev: false
+
+ /react-table/7.8.0_react@17.0.2:
+ resolution: {integrity: sha512-hNaz4ygkZO4bESeFfnfOft73iBUj8K5oKi1EcSHPAibEydfsX2MyU6Z8KCr3mv3C9Kqqh71U+DhZkFvibbnPbA==}
+ peerDependencies:
+ react: ^16.8.3 || ^17.0.0-0 || ^18.0.0
+ dependencies:
+ react: 17.0.2
+ dev: false
+
+ /react-test-renderer/17.0.2_react@17.0.2:
+ resolution: {integrity: sha512-yaQ9cB89c17PUb0x6UfWRs7kQCorVdHlutU1boVPEsB8IDZH6n9tHxMacc3y0JoXOJUsZb/t/Mb8FUWMKaM7iQ==}
+ peerDependencies:
+ react: 17.0.2
+ dependencies:
+ object-assign: 4.1.1
+ react: 17.0.2
+ react-is: 17.0.2
+ react-shallow-renderer: 16.15.0_react@17.0.2
+ scheduler: 0.20.2
+ dev: true
+
+ /react-textarea-autosize/8.3.4_pxzommwrsowkd4kgag6q3sluym:
+ resolution: {integrity: sha512-CdtmP8Dc19xL8/R6sWvtknD/eCXkQr30dtvC4VmGInhRsfF8X/ihXCq6+9l9qbxmKRiq407/7z5fxE7cVWQNgQ==}
+ engines: {node: '>=10'}
+ peerDependencies:
+ react: ^16.8.0 || ^17.0.0 || ^18.0.0
+ dependencies:
+ '@babel/runtime': 7.19.4
+ react: 17.0.2
+ use-composed-ref: 1.3.0_react@17.0.2
+ use-latest: 1.2.1_pxzommwrsowkd4kgag6q3sluym
+ transitivePeerDependencies:
+ - '@types/react'
+ dev: false
+
+ /react-transition-group/4.4.5_sfoxds7t5ydpegc3knd667wn6m:
+ resolution: {integrity: sha512-pZcd1MCJoiKiBR2NRxeCRg13uCXbydPnmB4EOeRrY7480qNWO8IIgQG6zlDkm6uRMsURXPuKq0GWtiM59a5Q6g==}
+ peerDependencies:
+ react: '>=16.6.0'
+ react-dom: '>=16.6.0'
+ dependencies:
+ '@babel/runtime': 7.19.4
+ dom-helpers: 5.2.1
+ loose-envify: 1.4.0
+ prop-types: 15.8.1
+ react: 17.0.2
+ react-dom: 17.0.2_react@17.0.2
+ dev: false
+
+ /react-virtuoso/2.19.1_sfoxds7t5ydpegc3knd667wn6m:
+ resolution: {integrity: sha512-zF6MAwujNGy2nJWCx/Df92ay/RnV2Kj4glUZfdyadI4suAn0kAZHB1BeI7yPFVp2iSccLzFlszhakWyr+fJ4Dw==}
+ engines: {node: '>=10'}
+ peerDependencies:
+ react: '>=16 || >=17 || >= 18'
+ react-dom: '>=16 || >=17 || >= 18'
+ dependencies:
+ '@virtuoso.dev/react-urx': 0.2.13_react@17.0.2
+ '@virtuoso.dev/urx': 0.2.13
+ react: 17.0.2
+ react-dom: 17.0.2_react@17.0.2
+ dev: false
+
+ /react/17.0.2:
+ resolution: {integrity: sha512-gnhPt75i/dq/z3/6q/0asP78D0u592D5L1pd7M8P+dck6Fu/jJeL6iVVK23fptSUZj8Vjf++7wXA8UNclGQcbA==}
+ engines: {node: '>=0.10.0'}
+ dependencies:
+ loose-envify: 1.4.0
+ object-assign: 4.1.1
+
+ /recoil/0.7.6_sfoxds7t5ydpegc3knd667wn6m:
+ resolution: {integrity: sha512-hsBEw7jFdpBCY/tu2GweiyaqHKxVj6EqF2/SfrglbKvJHhpN57SANWvPW+gE90i3Awi+A5gssOd3u+vWlT+g7g==}
+ peerDependencies:
+ react: '>=16.13.1'
+ react-dom: '*'
+ react-native: '*'
+ peerDependenciesMeta:
+ react-dom:
+ optional: true
+ react-native:
+ optional: true
+ dependencies:
+ hamt_plus: 1.0.2
+ react: 17.0.2
+ react-dom: 17.0.2_react@17.0.2
+ dev: false
+
+ /redent/3.0.0:
+ resolution: {integrity: sha512-6tDA8g98We0zd0GvVeMT9arEOnTw9qM03L9cJXaCjrip1OO764RDBLBfrB4cwzNGDj5OA5ioymC9GkizgWJDUg==}
+ engines: {node: '>=8'}
+ dependencies:
+ indent-string: 4.0.0
+ strip-indent: 3.0.0
+ dev: true
+
+ /redux/4.2.0:
+ resolution: {integrity: sha512-oSBmcKKIuIR4ME29/AeNUnl5L+hvBq7OaJWzaptTQJAntaPvxIJqfnjbaEiCzzaIz+XmVILfqAM3Ob0aXLPfjA==}
+ dependencies:
+ '@babel/runtime': 7.19.4
+ dev: false
+
+ /regenerate-unicode-properties/10.1.0:
+ resolution: {integrity: sha512-d1VudCLoIGitcU/hEg2QqvyGZQmdC0Lf8BqdOMXGFSvJP4bNV1+XqbPQeHHLD51Jh4QJJ225dlIFvY4Ly6MXmQ==}
+ engines: {node: '>=4'}
+ dependencies:
+ regenerate: 1.4.2
+ dev: true
+
+ /regenerate/1.4.2:
+ resolution: {integrity: sha512-zrceR/XhGYU/d/opr2EKO7aRHUeiBI8qjtfHqADTwZd6Szfy16la6kqD0MIUs5z5hx6AaKa+PixpPrR289+I0A==}
+ dev: true
+
+ /regenerator-runtime/0.13.10:
+ resolution: {integrity: sha512-KepLsg4dU12hryUO7bp/axHAKvwGOCV0sGloQtpagJ12ai+ojVDqkeGSiRX1zlq+kjIMZ1t7gpze+26QqtdGqw==}
+
+ /regenerator-transform/0.15.0:
+ resolution: {integrity: sha512-LsrGtPmbYg19bcPHwdtmXwbW+TqNvtY4riE3P83foeHRroMbH6/2ddFBfab3t7kbzc7v7p4wbkIecHImqt0QNg==}
+ dependencies:
+ '@babel/runtime': 7.19.4
+ dev: true
+
+ /regexp.prototype.flags/1.4.3:
+ resolution: {integrity: sha512-fjggEOO3slI6Wvgjwflkc4NFRCTZAu5CnNfBd5qOMYhWdn67nJBBu34/TkD++eeFmd8C9r9jfXJ27+nSiRkSUA==}
+ engines: {node: '>= 0.4'}
+ dependencies:
+ call-bind: 1.0.2
+ define-properties: 1.1.4
+ functions-have-names: 1.2.3
+ dev: true
+
+ /regexpp/3.2.0:
+ resolution: {integrity: sha512-pq2bWo9mVD43nbts2wGv17XLiNLya+GklZ8kaDLV2Z08gDCsGpnKn9BFMepvWuHCbyVvY7J5o5+BVvoQbmlJLg==}
+ engines: {node: '>=8'}
+ dev: true
+
+ /regexpu-core/5.2.1:
+ resolution: {integrity: sha512-HrnlNtpvqP1Xkb28tMhBUO2EbyUHdQlsnlAhzWcwHy8WJR53UWr7/MAvqrsQKMbV4qdpv03oTMG8iIhfsPFktQ==}
+ engines: {node: '>=4'}
+ dependencies:
+ regenerate: 1.4.2
+ regenerate-unicode-properties: 10.1.0
+ regjsgen: 0.7.1
+ regjsparser: 0.9.1
+ unicode-match-property-ecmascript: 2.0.0
+ unicode-match-property-value-ecmascript: 2.0.0
+ dev: true
+
+ /registry-auth-token/3.3.2:
+ resolution: {integrity: sha512-JL39c60XlzCVgNrO+qq68FoNb56w/m7JYvGR2jT5iR1xBrUA3Mfx5Twk5rqTThPmQKMWydGmq8oFtDlxfrmxnQ==}
+ dependencies:
+ rc: 1.2.8
+ safe-buffer: 5.2.1
+ dev: true
+
+ /registry-url/3.1.0:
+ resolution: {integrity: sha512-ZbgR5aZEdf4UKZVBPYIgaglBmSF2Hi94s2PcIHhRGFjKYu+chjJdYfHn4rt3hB6eCKLJ8giVIIfgMa1ehDfZKA==}
+ engines: {node: '>=0.10.0'}
+ dependencies:
+ rc: 1.2.8
+ dev: true
+
+ /regjsgen/0.7.1:
+ resolution: {integrity: sha512-RAt+8H2ZEzHeYWxZ3H2z6tF18zyyOnlcdaafLrm21Bguj7uZy6ULibiAFdXEtKQY4Sy7wDTwDiOazasMLc4KPA==}
+ dev: true
+
+ /regjsparser/0.9.1:
+ resolution: {integrity: sha512-dQUtn90WanSNl+7mQKcXAgZxvUe7Z0SqXlgzv0za4LwiUhyzBC58yQO3liFoUgu8GiJVInAhJjkj1N0EtQ5nkQ==}
+ hasBin: true
+ dependencies:
+ jsesc: 0.5.0
+ dev: true
+
+ /remove-accents/0.4.2:
+ resolution: {integrity: sha512-7pXIJqJOq5tFgG1A2Zxti3Ht8jJF337m4sowbuHsW30ZnkQFnDzy9qBNhgzX8ZLW4+UBcXiiR7SwR6pokHsxiA==}
+ dev: false
+
+ /require-directory/2.1.1:
+ resolution: {integrity: sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==}
+ engines: {node: '>=0.10.0'}
+ dev: true
+
+ /require-from-string/2.0.2:
+ resolution: {integrity: sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==}
+ engines: {node: '>=0.10.0'}
+ dev: true
+
+ /requires-port/1.0.0:
+ resolution: {integrity: sha512-KigOCHcocU3XODJxsu8i/j8T9tzT4adHiecwORRQ0ZZFcp7ahwXuRU1m+yuO90C5ZUyGeGfocHDI14M3L3yDAQ==}
+ dev: true
+
+ /resize-observer-polyfill/1.5.1:
+ resolution: {integrity: sha512-LwZrotdHOo12nQuZlHEmtuXdqGoOD0OhaxopaNFxWzInpEgaLWoVuAMbTzixuosCx2nEG58ngzW3vxdWoxIgdg==}
+ dev: false
+
+ /resolve-cwd/3.0.0:
+ resolution: {integrity: sha512-OrZaX2Mb+rJCpH/6CpSqt9xFVpN++x01XnN2ie9g6P5/3xelLAkXWVADpdz1IHD/KFfEXyE6V0U01OQ3UO2rEg==}
+ engines: {node: '>=8'}
+ dependencies:
+ resolve-from: 5.0.0
+ dev: true
+
+ /resolve-from/4.0.0:
+ resolution: {integrity: sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==}
+ engines: {node: '>=4'}
+
+ /resolve-from/5.0.0:
+ resolution: {integrity: sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==}
+ engines: {node: '>=8'}
+ dev: true
+
+ /resolve.exports/1.1.0:
+ resolution: {integrity: sha512-J1l+Zxxp4XK3LUDZ9m60LRJF/mAe4z6a4xyabPHk7pvK5t35dACV32iIjJDFeWZFfZlO29w6SZ67knR0tHzJtQ==}
+ engines: {node: '>=10'}
+ dev: true
+
+ /resolve/1.22.1:
+ resolution: {integrity: sha512-nBpuuYuY5jFsli/JIs1oldw6fOQCBioohqWZg/2hiaOybXOft4lonv85uDOKXdf8rhyK159cxU5cDcK/NKk8zw==}
+ hasBin: true
+ dependencies:
+ is-core-module: 2.10.0
+ path-parse: 1.0.7
+ supports-preserve-symlinks-flag: 1.0.0
+
+ /resolve/2.0.0-next.4:
+ resolution: {integrity: sha512-iMDbmAWtfU+MHpxt/I5iWI7cY6YVEZUQ3MBgPQ++XD1PELuJHIl82xBmObyP2KyQmkNB2dsqF7seoQQiAn5yDQ==}
+ hasBin: true
+ dependencies:
+ is-core-module: 2.10.0
+ path-parse: 1.0.7
+ supports-preserve-symlinks-flag: 1.0.0
+ dev: true
+
+ /restore-cursor/3.1.0:
+ resolution: {integrity: sha512-l+sSefzHpj5qimhFSE5a8nufZYAM3sBSVMAPtYkmC+4EH2anSGaEMXSD0izRQbu9nfyQ9y5JrVmp7E8oZrUjvA==}
+ engines: {node: '>=8'}
+ dependencies:
+ onetime: 5.1.2
+ signal-exit: 3.0.7
+ dev: true
+
+ /reusify/1.0.4:
+ resolution: {integrity: sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==}
+ engines: {iojs: '>=1.0.0', node: '>=0.10.0'}
+ dev: true
+
+ /rfdc/1.3.0:
+ resolution: {integrity: sha512-V2hovdzFbOi77/WajaSMXk2OLm+xNIeQdMMuB7icj7bk6zi2F8GGAxigcnDFpJHbNyNcgyJDiP+8nOrY5cZGrA==}
+ dev: true
+
+ /rimraf/3.0.2:
+ resolution: {integrity: sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==}
+ hasBin: true
+ dependencies:
+ glob: 7.2.3
+
+ /rollup/2.78.1:
+ resolution: {integrity: sha512-VeeCgtGi4P+o9hIg+xz4qQpRl6R401LWEXBmxYKOV4zlF82lyhgh2hTZnheFUbANE8l2A41F458iwj2vEYaXJg==}
+ engines: {node: '>=10.0.0'}
+ hasBin: true
+ optionalDependencies:
+ fsevents: 2.3.2
+ dev: true
+
+ /run-parallel/1.2.0:
+ resolution: {integrity: sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==}
+ dependencies:
+ queue-microtask: 1.2.3
+ dev: true
+
+ /rxjs/7.5.7:
+ resolution: {integrity: sha512-z9MzKh/UcOqB3i20H6rtrlaE/CgjLOvheWK/9ILrbhROGTweAi1BaFsTT9FbwZi5Trr1qNRs+MXkhmR06awzQA==}
+ dependencies:
+ tslib: 2.4.0
+ dev: true
+
+ /safe-buffer/5.1.2:
+ resolution: {integrity: sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==}
+ dev: true
+
+ /safe-buffer/5.2.1:
+ resolution: {integrity: sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==}
+ dev: true
+
+ /safe-regex-test/1.0.0:
+ resolution: {integrity: sha512-JBUUzyOgEwXQY1NuPtvcj/qcBDbDmEvWufhlnXZIm75DEHp+afM1r1ujJpJsV/gSM4t59tpDyPi1sd6ZaPFfsA==}
+ dependencies:
+ call-bind: 1.0.2
+ get-intrinsic: 1.1.3
+ is-regex: 1.1.4
+ dev: true
+
+ /safer-buffer/2.1.2:
+ resolution: {integrity: sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==}
+ dev: true
+
+ /saxes/6.0.0:
+ resolution: {integrity: sha512-xAg7SOnEhrm5zI3puOOKyy1OMcMlIJZYNJY7xLBwSze0UjhPLnWfj2GF2EpT0jmzaJKIWKHLsaSSajf35bcYnA==}
+ engines: {node: '>=v12.22.7'}
+ dependencies:
+ xmlchars: 2.2.0
+ dev: true
+
+ /scheduler/0.20.2:
+ resolution: {integrity: sha512-2eWfGgAqqWFGqtdMmcL5zCMK1U8KlXv8SQFGglL3CEtd0aDVDWgeF/YoCmvln55m5zSk3J/20hTaSBeSObsQDQ==}
+ dependencies:
+ loose-envify: 1.4.0
+ object-assign: 4.1.1
+
+ /schema-utils/3.1.1:
+ resolution: {integrity: sha512-Y5PQxS4ITlC+EahLuXaY86TXfR7Dc5lw294alXOq86JAHCihAIZfqv8nNCWvaEJvaC51uN9hbLGeV0cFBdH+Fw==}
+ engines: {node: '>= 10.13.0'}
+ dependencies:
+ '@types/json-schema': 7.0.11
+ ajv: 6.12.6
+ ajv-keywords: 3.5.2_ajv@6.12.6
+ dev: true
+
+ /semver/6.3.0:
+ resolution: {integrity: sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==}
+ hasBin: true
+
+ /semver/7.3.8:
+ resolution: {integrity: sha512-NB1ctGL5rlHrPJtFDVIVzTyQylMLu9N9VICA6HSFJo8MCGVTMW6gfpicwKmmK/dAjTOrqu5l63JJOpDSrAis3A==}
+ engines: {node: '>=10'}
+ hasBin: true
+ dependencies:
+ lru-cache: 6.0.0
+ dev: true
+
+ /serialize-javascript/6.0.0:
+ resolution: {integrity: sha512-Qr3TosvguFt8ePWqsvRfrKyQXIiW+nGbYpy8XK24NQHE83caxWt+mIymTT19DGFbNWNLfEwsrkSmN64lVWB9ag==}
+ dependencies:
+ randombytes: 2.1.0
+ dev: true
+
+ /serve-handler/6.1.3:
+ resolution: {integrity: sha512-FosMqFBNrLyeiIDvP1zgO6YoTzFYHxLDEIavhlmQ+knB2Z7l1t+kGLHkZIDN7UVWqQAmKI3D20A6F6jo3nDd4w==}
+ dependencies:
+ bytes: 3.0.0
+ content-disposition: 0.5.2
+ fast-url-parser: 1.1.3
+ mime-types: 2.1.18
+ minimatch: 3.0.4
+ path-is-inside: 1.0.2
+ path-to-regexp: 2.2.1
+ range-parser: 1.2.0
+ dev: true
+
+ /serve/14.0.1:
+ resolution: {integrity: sha512-tNGwxl27FwA8TbmMQqN0jTaSx8/trL532qZsJHX1VdiEIjjtMJHCs7AFS6OvtC7cTHOvmjXqt5yczejU6CV2Xg==}
+ engines: {node: '>= 14'}
+ hasBin: true
+ dependencies:
+ '@zeit/schemas': 2.21.0
+ ajv: 8.11.0
+ arg: 5.0.2
+ boxen: 7.0.0
+ chalk: 5.0.1
+ chalk-template: 0.4.0
+ clipboardy: 3.0.0
+ compression: 1.7.4
+ is-port-reachable: 4.0.0
+ serve-handler: 6.1.3
+ update-check: 1.5.4
+ transitivePeerDependencies:
+ - supports-color
+ dev: true
+
+ /shallowequal/1.1.0:
+ resolution: {integrity: sha512-y0m1JoUZSlPAjXVtPPW70aZWfIL/dSP7AFkRnniLCrK/8MDKog3TySTBmckD+RObVxH0v4Tox67+F14PdED2oQ==}
+ dev: false
+
+ /shebang-command/2.0.0:
+ resolution: {integrity: sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==}
+ engines: {node: '>=8'}
+ dependencies:
+ shebang-regex: 3.0.0
+ dev: true
+
+ /shebang-regex/3.0.0:
+ resolution: {integrity: sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==}
+ engines: {node: '>=8'}
+ dev: true
+
+ /side-channel/1.0.4:
+ resolution: {integrity: sha512-q5XPytqFEIKHkGdiMIrY10mvLRvnQh42/+GoBlFW3b2LXLE2xxJpZFdm94we0BaoV3RwJyGqg5wS7epxTv0Zvw==}
+ dependencies:
+ call-bind: 1.0.2
+ get-intrinsic: 1.1.3
+ object-inspect: 1.12.2
+ dev: true
+
+ /signal-exit/3.0.7:
+ resolution: {integrity: sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==}
+ dev: true
+
+ /simple-swizzle/0.2.2:
+ resolution: {integrity: sha512-JA//kQgZtbuY83m+xT+tXJkmJncGMTFT+C+g2h2R9uxkYIrE2yy9sgmcLhCnw57/WSD+Eh3J97FPEDFnbXnDUg==}
+ dependencies:
+ is-arrayish: 0.3.2
+ dev: false
+
+ /sisteransi/1.0.5:
+ resolution: {integrity: sha512-bLGGlR1QxBcynn2d5YmDX4MGjlZvy2MRBDRNHLJ8VI6l6+9FUiyTFNJ0IveOSP0bcXgVDPRcfGqA0pjaqUpfVg==}
+ dev: true
+
+ /slash/3.0.0:
+ resolution: {integrity: sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==}
+ engines: {node: '>=8'}
+ dev: true
+
+ /slice-ansi/3.0.0:
+ resolution: {integrity: sha512-pSyv7bSTC7ig9Dcgbw9AuRNUb5k5V6oDudjZoMBSr13qpLBG7tB+zgCkARjq7xIUgdz5P1Qe8u+rSGdouOOIyQ==}
+ engines: {node: '>=8'}
+ dependencies:
+ ansi-styles: 4.3.0
+ astral-regex: 2.0.0
+ is-fullwidth-code-point: 3.0.0
+ dev: true
+
+ /slice-ansi/4.0.0:
+ resolution: {integrity: sha512-qMCMfhY040cVHT43K9BFygqYbUPFZKHOg7K73mtTWJRb8pyP3fzf4Ixd5SzdEJQ6MRUg/WBnOLxghZtKKurENQ==}
+ engines: {node: '>=10'}
+ dependencies:
+ ansi-styles: 4.3.0
+ astral-regex: 2.0.0
+ is-fullwidth-code-point: 3.0.0
+ dev: true
+
+ /slice-ansi/5.0.0:
+ resolution: {integrity: sha512-FC+lgizVPfie0kkhqUScwRu1O/lF6NOgJmlCgK+/LYxDCTk8sGelYaHDhFcDN+Sn3Cv+3VSa4Byeo+IMCzpMgQ==}
+ engines: {node: '>=12'}
+ dependencies:
+ ansi-styles: 6.2.1
+ is-fullwidth-code-point: 4.0.0
+ dev: true
+
+ /source-list-map/2.0.1:
+ resolution: {integrity: sha512-qnQ7gVMxGNxsiL4lEuJwe/To8UnK7fAnmbGEEH8RpLouuKbeEm0lhbQVFIrNSuB+G7tVrAlVsZgETT5nljf+Iw==}
+ dev: true
+
+ /source-map-js/1.0.2:
+ resolution: {integrity: sha512-R0XvVJ9WusLiqTCEiGCmICCMplcCkIwwR11mOSD9CR5u+IXYdiseeEuXCVAjS54zqwkLcPNnmU4OeJ6tUrWhDw==}
+ engines: {node: '>=0.10.0'}
+ dev: true
+
+ /source-map-support/0.5.13:
+ resolution: {integrity: sha512-SHSKFHadjVA5oR4PPqhtAVdcBWwRYVd6g6cAXnIbRiIwc2EhPrTuKUBdSLvlEKyIP3GCf89fltvcZiP9MMFA1w==}
+ dependencies:
+ buffer-from: 1.1.2
+ source-map: 0.6.1
+ dev: true
+
+ /source-map-support/0.5.21:
+ resolution: {integrity: sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w==}
+ dependencies:
+ buffer-from: 1.1.2
+ source-map: 0.6.1
+ dev: true
+
+ /source-map/0.5.7:
+ resolution: {integrity: sha512-LbrmJOMUSdEVxIKvdcJzQC+nQhe8FUZQTXQy6+I75skNgn3OoQ0DZA8YnFa7gp8tqtL3KPf1kmo0R5DoApeSGQ==}
+ engines: {node: '>=0.10.0'}
+ dev: false
+
+ /source-map/0.6.1:
+ resolution: {integrity: sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==}
+ engines: {node: '>=0.10.0'}
+ dev: true
+
+ /sourcemap-codec/1.4.8:
+ resolution: {integrity: sha512-9NykojV5Uih4lgo5So5dtw+f0JgJX30KCNI8gwhz2J9A15wD0Ml6tjHKwf6fTSa6fAdVBdZeNOs9eJ71qCk8vA==}
+ dev: true
+
+ /split-on-first/1.1.0:
+ resolution: {integrity: sha512-43ZssAJaMusuKWL8sKUBQXHWOpq8d6CfN/u1p4gUzfJkM05C8rxTmYrkIPTXapZpORA6LkkzcUulJ8FqA7Uudw==}
+ engines: {node: '>=6'}
+ dev: false
+
+ /sprintf-js/1.0.3:
+ resolution: {integrity: sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g==}
+ dev: true
+
+ /ssr-window/4.0.2:
+ resolution: {integrity: sha512-ISv/Ch+ig7SOtw7G2+qkwfVASzazUnvlDTwypdLoPoySv+6MqlOV10VwPSE6EWkGjhW50lUmghPmpYZXMu/+AQ==}
+ dev: false
+
+ /stack-utils/2.0.5:
+ resolution: {integrity: sha512-xrQcmYhOsn/1kX+Vraq+7j4oE2j/6BFscZ0etmYg81xuM8Gq0022Pxb8+IqgOFUIaxHs0KaSb7T1+OegiNrNFA==}
+ engines: {node: '>=10'}
+ dependencies:
+ escape-string-regexp: 2.0.0
+ dev: true
+
+ /strict-uri-encode/2.0.0:
+ resolution: {integrity: sha512-QwiXZgpRcKkhTj2Scnn++4PKtWsH0kpzZ62L2R6c/LUVYv7hVnZqcg2+sMuT6R7Jusu1vviK/MFsu6kNJfWlEQ==}
+ engines: {node: '>=4'}
+ dev: false
+
+ /string-argv/0.3.1:
+ resolution: {integrity: sha512-a1uQGz7IyVy9YwhqjZIZu1c8JO8dNIe20xBmSS6qu9kv++k3JGzCVmprbNN5Kn+BgzD5E7YYwg1CcjuJMRNsvg==}
+ engines: {node: '>=0.6.19'}
+ dev: true
+
+ /string-convert/0.2.1:
+ resolution: {integrity: sha512-u/1tdPl4yQnPBjnVrmdLo9gtuLvELKsAoRapekWggdiQNvvvum+jYF329d84NAa660KQw7pB2n36KrIKVoXa3A==}
+ dev: false
+
+ /string-length/4.0.2:
+ resolution: {integrity: sha512-+l6rNN5fYHNhZZy41RXsYptCjA2Igmq4EG7kZAYFQI1E1VTXarr6ZPXBg6eq7Y6eK4FEhY6AJlyuFIb/v/S0VQ==}
+ engines: {node: '>=10'}
+ dependencies:
+ char-regex: 1.0.2
+ strip-ansi: 6.0.1
+ dev: true
+
+ /string-width/4.2.3:
+ resolution: {integrity: sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==}
+ engines: {node: '>=8'}
+ dependencies:
+ emoji-regex: 8.0.0
+ is-fullwidth-code-point: 3.0.0
+ strip-ansi: 6.0.1
+ dev: true
+
+ /string-width/5.1.2:
+ resolution: {integrity: sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA==}
+ engines: {node: '>=12'}
+ dependencies:
+ eastasianwidth: 0.2.0
+ emoji-regex: 9.2.2
+ strip-ansi: 7.0.1
+ dev: true
+
+ /string.prototype.matchall/4.0.7:
+ resolution: {integrity: sha512-f48okCX7JiwVi1NXCVWcFnZgADDC/n2vePlQ/KUCNqCikLLilQvwjMO8+BHVKvgzH0JB0J9LEPgxOGT02RoETg==}
+ dependencies:
+ call-bind: 1.0.2
+ define-properties: 1.1.4
+ es-abstract: 1.20.4
+ get-intrinsic: 1.1.3
+ has-symbols: 1.0.3
+ internal-slot: 1.0.3
+ regexp.prototype.flags: 1.4.3
+ side-channel: 1.0.4
+ dev: true
+
+ /string.prototype.trimend/1.0.5:
+ resolution: {integrity: sha512-I7RGvmjV4pJ7O3kdf+LXFpVfdNOxtCW/2C8f6jNiW4+PQchwxkCDzlk1/7p+Wl4bqFIZeF47qAHXLuHHWKAxog==}
+ dependencies:
+ call-bind: 1.0.2
+ define-properties: 1.1.4
+ es-abstract: 1.20.4
+ dev: true
+
+ /string.prototype.trimstart/1.0.5:
+ resolution: {integrity: sha512-THx16TJCGlsN0o6dl2o6ncWUsdgnLRSA23rRE5pyGBw/mLr3Ej/R2LaqCtgP8VNMGZsvMWnf9ooZPyY2bHvUFg==}
+ dependencies:
+ call-bind: 1.0.2
+ define-properties: 1.1.4
+ es-abstract: 1.20.4
+ dev: true
+
+ /strip-ansi/6.0.1:
+ resolution: {integrity: sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==}
+ engines: {node: '>=8'}
+ dependencies:
+ ansi-regex: 5.0.1
+ dev: true
+
+ /strip-ansi/7.0.1:
+ resolution: {integrity: sha512-cXNxvT8dFNRVfhVME3JAe98mkXDYN2O1l7jmcwMnOslDeESg1rF/OZMtK0nRAhiari1unG5cD4jG3rapUAkLbw==}
+ engines: {node: '>=12'}
+ dependencies:
+ ansi-regex: 6.0.1
+ dev: true
+
+ /strip-bom/4.0.0:
+ resolution: {integrity: sha512-3xurFv5tEgii33Zi8Jtp55wEIILR9eh34FAW00PZf+JnSsTmV/ioewSgQl97JHvgjoRGwPShsWm+IdrxB35d0w==}
+ engines: {node: '>=8'}
+ dev: true
+
+ /strip-final-newline/2.0.0:
+ resolution: {integrity: sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA==}
+ engines: {node: '>=6'}
+ dev: true
+
+ /strip-final-newline/3.0.0:
+ resolution: {integrity: sha512-dOESqjYr96iWYylGObzd39EuNTa5VJxyvVAEm5Jnh7KGo75V43Hk1odPQkNDyXNmUR6k+gEiDVXnjB8HJ3crXw==}
+ engines: {node: '>=12'}
+ dev: true
+
+ /strip-indent/3.0.0:
+ resolution: {integrity: sha512-laJTa3Jb+VQpaC6DseHhF7dXVqHTfJPCRDaEbid/drOhgitgYku/letMUqOXFoWV0zIIUbjpdH2t+tYj4bQMRQ==}
+ engines: {node: '>=8'}
+ dependencies:
+ min-indent: 1.0.1
+ dev: true
+
+ /strip-json-comments/2.0.1:
+ resolution: {integrity: sha512-4gB8na07fecVVkOI6Rs4e7T6NOTki5EmL7TUduTs6bu3EdnSycntVJ4re8kgZA+wx9IueI2Y11bfbgwtzuE0KQ==}
+ engines: {node: '>=0.10.0'}
+ dev: true
+
+ /strip-json-comments/3.1.1:
+ resolution: {integrity: sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==}
+ engines: {node: '>=8'}
+ dev: true
+
+ /style-value-types/3.2.0:
+ resolution: {integrity: sha512-ih0mGsrYYmVvdDi++/66O6BaQPRPRMQHoZevNNdMMcPlP/cH28Rnfsqf1UEba/Bwfuw9T8BmIMwbGdzsPwQKrQ==}
+ dependencies:
+ hey-listen: 1.0.8
+ tslib: 1.14.1
+ dev: false
+
+ /stylis/4.0.13:
+ resolution: {integrity: sha512-xGPXiFVl4YED9Jh7Euv2V220mriG9u4B2TA6Ybjc1catrstKD2PpIdU3U0RKpkVBC2EhmL/F0sPCr9vrFTNRag==}
+ dev: false
+
+ /supports-color/5.5.0:
+ resolution: {integrity: sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==}
+ engines: {node: '>=4'}
+ dependencies:
+ has-flag: 3.0.0
+
+ /supports-color/7.2.0:
+ resolution: {integrity: sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==}
+ engines: {node: '>=8'}
+ dependencies:
+ has-flag: 4.0.0
+ dev: true
+
+ /supports-color/8.1.1:
+ resolution: {integrity: sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==}
+ engines: {node: '>=10'}
+ dependencies:
+ has-flag: 4.0.0
+ dev: true
+
+ /supports-hyperlinks/2.3.0:
+ resolution: {integrity: sha512-RpsAZlpWcDwOPQA22aCH4J0t7L8JmAvsCxfOSEwm7cQs3LshN36QaTkwd70DnBOXDWGssw2eUoc8CaRWT0XunA==}
+ engines: {node: '>=8'}
+ dependencies:
+ has-flag: 4.0.0
+ supports-color: 7.2.0
+ dev: true
+
+ /supports-preserve-symlinks-flag/1.0.0:
+ resolution: {integrity: sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==}
+ engines: {node: '>= 0.4'}
+
+ /swiper/8.4.4:
+ resolution: {integrity: sha512-jA/8BfOZwT8PqPSnMX0TENZYitXEhNa7ZSNj1Diqh5LZyUJoBQaZcqAiPQ/PIg1+IPaRn/V8ZYVb0nxHMh51yw==}
+ engines: {node: '>= 4.7.0'}
+ requiresBuild: true
+ dependencies:
+ dom7: 4.0.4
+ ssr-window: 4.0.2
+ dev: false
+
+ /symbol-tree/3.2.4:
+ resolution: {integrity: sha512-9QNk5KwDF+Bvz+PyObkmSYjI5ksVUYtjW7AU22r2NKcfLJcXp96hkDWU3+XndOsUb+AQ9QhfzfCT2O+CNWT5Tw==}
+ dev: true
+
+ /table/6.8.0:
+ resolution: {integrity: sha512-s/fitrbVeEyHKFa7mFdkuQMWlH1Wgw/yEXMt5xACT4ZpzWFluehAxRtUUQKPuWhaLAWhFcVx6w3oC8VKaUfPGA==}
+ engines: {node: '>=10.0.0'}
+ dependencies:
+ ajv: 8.11.0
+ lodash.truncate: 4.4.2
+ slice-ansi: 4.0.0
+ string-width: 4.2.3
+ strip-ansi: 6.0.1
+ dev: true
+
+ /tapable/2.2.1:
+ resolution: {integrity: sha512-GNzQvQTOIP6RyTfE2Qxb8ZVlNmw0n88vp1szwWRimP02mnTsx3Wtn5qRdqY9w2XduFNUgvOwhNnQsjwCp+kqaQ==}
+ engines: {node: '>=6'}
+ dev: true
+
+ /terminal-link/2.1.1:
+ resolution: {integrity: sha512-un0FmiRUQNr5PJqy9kP7c40F5BOfpGlYTrxonDChEZB7pzZxRNp/bt+ymiy9/npwXya9KH99nJ/GXFIiUkYGFQ==}
+ engines: {node: '>=8'}
+ dependencies:
+ ansi-escapes: 4.3.2
+ supports-hyperlinks: 2.3.0
+ dev: true
+
+ /terser-webpack-plugin/5.3.6_webpack@5.74.0:
+ resolution: {integrity: sha512-kfLFk+PoLUQIbLmB1+PZDMRSZS99Mp+/MHqDNmMA6tOItzRt+Npe3E+fsMs5mfcM0wCtrrdU387UnV+vnSffXQ==}
+ engines: {node: '>= 10.13.0'}
+ peerDependencies:
+ '@swc/core': '*'
+ esbuild: '*'
+ uglify-js: '*'
+ webpack: ^5.1.0
+ peerDependenciesMeta:
+ '@swc/core':
+ optional: true
+ esbuild:
+ optional: true
+ uglify-js:
+ optional: true
+ dependencies:
+ '@jridgewell/trace-mapping': 0.3.17
+ jest-worker: 27.5.1
+ schema-utils: 3.1.1
+ serialize-javascript: 6.0.0
+ terser: 5.15.1
+ webpack: 5.74.0
+ dev: true
+
+ /terser/5.15.1:
+ resolution: {integrity: sha512-K1faMUvpm/FBxjBXud0LWVAGxmvoPbZbfTCYbSgaaYQaIXI3/TdI7a7ZGA73Zrou6Q8Zmz3oeUTsp/dj+ag2Xw==}
+ engines: {node: '>=10'}
+ hasBin: true
+ dependencies:
+ '@jridgewell/source-map': 0.3.2
+ acorn: 8.8.0
+ commander: 2.20.3
+ source-map-support: 0.5.21
+ dev: true
+
+ /test-exclude/6.0.0:
+ resolution: {integrity: sha512-cAGWPIyOHU6zlmg88jwm7VRyXnMN7iV68OGAbYDk/Mh/xC/pzVPlQtY6ngoIH/5/tciuhGfvESU8GrHrcxD56w==}
+ engines: {node: '>=8'}
+ dependencies:
+ '@istanbuljs/schema': 0.1.3
+ glob: 7.2.3
+ minimatch: 3.1.2
+ dev: true
+
+ /text-table/0.2.0:
+ resolution: {integrity: sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw==}
+ dev: true
+
+ /through/2.3.8:
+ resolution: {integrity: sha512-w89qg7PI8wAdvX60bMDP+bFoD5Dvhm9oLheFp5O4a2QF0cSBGsBX4qZmadPMvVqlLJBBci+WqGGOAPvcDeNSVg==}
+ dev: true
+
+ /tiny-invariant/1.3.1:
+ resolution: {integrity: sha512-AD5ih2NlSssTCwsMznbvwMZpJ1cbhkGd2uueNxzv2jDlEeZdU04JQfRnggJQ8DrcVBGjAsCKwFBbDlVNtEMlzw==}
+ dev: false
+
+ /tiny-warning/1.0.3:
+ resolution: {integrity: sha512-lBN9zLN/oAf68o3zNXYrdCt1kP8WsiGW8Oo2ka41b2IM5JL/S1CTyX1rW0mb/zSuJun0ZUrDxx4sqvYS2FWzPA==}
+ dev: false
+
+ /tmpl/1.0.5:
+ resolution: {integrity: sha512-3f0uOEAQwIqGuWW2MVzYg8fV/QNnc/IpuJNG837rLuczAaLVHslWHZQj4IGiEl5Hs3kkbhwL9Ab7Hrsmuj+Smw==}
+ dev: true
+
+ /to-fast-properties/2.0.0:
+ resolution: {integrity: sha512-/OaKK0xYrs3DmxRYqL/yDc+FxFUVYhDlXMhRmv3z915w2HF1tnN1omB354j8VUGO/hbRzyD6Y3sA7v7GS/ceog==}
+ engines: {node: '>=4'}
+
+ /to-regex-range/5.0.1:
+ resolution: {integrity: sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==}
+ engines: {node: '>=8.0'}
+ dependencies:
+ is-number: 7.0.0
+ dev: true
+
+ /tough-cookie/4.1.2:
+ resolution: {integrity: sha512-G9fqXWoYFZgTc2z8Q5zaHy/vJMjm+WV0AkAeHxVCQiEB1b+dGvWzFW6QV07cY5jQ5gRkeid2qIkzkxUnmoQZUQ==}
+ engines: {node: '>=6'}
+ dependencies:
+ psl: 1.9.0
+ punycode: 2.1.1
+ universalify: 0.2.0
+ url-parse: 1.5.10
+ dev: true
+
+ /tr46/3.0.0:
+ resolution: {integrity: sha512-l7FvfAHlcmulp8kr+flpQZmVwtu7nfRV7NZujtN0OqES8EL4O4e0qqzL0DC5gAvx/ZC/9lk6rhcUwYvkBnBnYA==}
+ engines: {node: '>=12'}
+ dependencies:
+ punycode: 2.1.1
+ dev: true
+
+ /ts-jest/28.0.8_eqqol6rpm4jvwa3dgns33uykjm:
+ resolution: {integrity: sha512-5FaG0lXmRPzApix8oFG8RKjAz4ehtm8yMKOTy5HX3fY6W8kmvOrmcY0hKDElW52FJov+clhUbrKAqofnj4mXTg==}
+ engines: {node: ^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0}
+ hasBin: true
+ peerDependencies:
+ '@babel/core': '>=7.0.0-beta.0 <8'
+ '@jest/types': ^28.0.0
+ babel-jest: ^28.0.0
+ esbuild: '*'
+ jest: ^28.0.0
+ typescript: '>=4.3'
+ peerDependenciesMeta:
+ '@babel/core':
+ optional: true
+ '@jest/types':
+ optional: true
+ babel-jest:
+ optional: true
+ esbuild:
+ optional: true
+ dependencies:
+ '@babel/core': 7.19.3
+ babel-jest: 28.1.3_@babel+core@7.19.3
+ bs-logger: 0.2.6
+ fast-json-stable-stringify: 2.1.0
+ jest: 28.1.3_2263m44mchjafa7bz7l52hbcpa
+ jest-util: 28.1.3
+ json5: 2.2.1
+ lodash.memoize: 4.1.2
+ make-error: 1.3.6
+ semver: 7.3.8
+ typescript: 4.8.4
+ yargs-parser: 21.1.1
+ dev: true
+
+ /ts-node/10.9.1_ksn4eycaeggbrckn3ykh37hwf4:
+ resolution: {integrity: sha512-NtVysVPkxxrwFGUUxGYhfux8k78pQB3JqYBXlLRZgdGUqTO5wU/UyHop5p70iEbGhB7q5KmiZiU0Y3KlJrScEw==}
+ hasBin: true
+ peerDependencies:
+ '@swc/core': '>=1.2.50'
+ '@swc/wasm': '>=1.2.50'
+ '@types/node': '*'
+ typescript: '>=2.7'
+ peerDependenciesMeta:
+ '@swc/core':
+ optional: true
+ '@swc/wasm':
+ optional: true
+ dependencies:
+ '@cspotcode/source-map-support': 0.8.1
+ '@tsconfig/node10': 1.0.9
+ '@tsconfig/node12': 1.0.11
+ '@tsconfig/node14': 1.0.3
+ '@tsconfig/node16': 1.0.3
+ '@types/node': 17.0.45
+ acorn: 8.8.0
+ acorn-walk: 8.2.0
+ arg: 4.1.3
+ create-require: 1.1.1
+ diff: 4.0.2
+ make-error: 1.3.6
+ typescript: 4.8.4
+ v8-compile-cache-lib: 3.0.1
+ yn: 3.1.1
+ dev: true
+
+ /tslib/1.14.1:
+ resolution: {integrity: sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==}
+
+ /tslib/2.4.0:
+ resolution: {integrity: sha512-d6xOpEDfsi2CZVlPQzGeux8XMwLT9hssAsaPYExaQMuYskwb+x1x7J371tWlbBdWHroy99KnVB6qIkUbs5X3UQ==}
+
+ /tsutils/3.21.0_typescript@4.8.4:
+ resolution: {integrity: sha512-mHKK3iUXL+3UF6xL5k0PEhKRUBKPBCv/+RkEOpjRWxxx27KKRBmmA60A9pgOUvMi8GKhRMPEmjBRPzs2W7O1OA==}
+ engines: {node: '>= 6'}
+ peerDependencies:
+ typescript: '>=2.8.0 || >= 3.2.0-dev || >= 3.3.0-dev || >= 3.4.0-dev || >= 3.5.0-dev || >= 3.6.0-dev || >= 3.6.0-beta || >= 3.7.0-dev || >= 3.7.0-beta'
+ dependencies:
+ tslib: 1.14.1
+ typescript: 4.8.4
+ dev: true
+
+ /type-check/0.3.2:
+ resolution: {integrity: sha512-ZCmOJdvOWDBYJlzAoFkC+Q0+bUyEOS1ltgp1MGU03fqHG+dbi9tBFU2Rd9QKiDZFAYrhPh2JUf7rZRIuHRKtOg==}
+ engines: {node: '>= 0.8.0'}
+ dependencies:
+ prelude-ls: 1.1.2
+ dev: true
+
+ /type-check/0.4.0:
+ resolution: {integrity: sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==}
+ engines: {node: '>= 0.8.0'}
+ dependencies:
+ prelude-ls: 1.2.1
+ dev: true
+
+ /type-detect/4.0.8:
+ resolution: {integrity: sha512-0fr/mIH1dlO+x7TlcMy+bIDqKPsw/70tVyeHW787goQjhmqaZe10uwLujubK9q9Lg6Fiho1KUKDYz0Z7k7g5/g==}
+ engines: {node: '>=4'}
+ dev: true
+
+ /type-fest/0.20.2:
+ resolution: {integrity: sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==}
+ engines: {node: '>=10'}
+ dev: true
+
+ /type-fest/0.21.3:
+ resolution: {integrity: sha512-t0rzBq87m3fVcduHDUFhKmyyX+9eo6WQjZvf51Ea/M0Q7+T374Jp1aUiyUl0GKxp8M/OETVHSDvmkyPgvX+X2w==}
+ engines: {node: '>=10'}
+ dev: true
+
+ /type-fest/2.19.0:
+ resolution: {integrity: sha512-RAH822pAdBgcNMAfWnCBU3CFZcfZ/i1eZjwFU/dsLKumyuuP3niueg2UAukXYF0E2AAoc82ZSSf9J0WQBinzHA==}
+ engines: {node: '>=12.20'}
+ dev: true
+
+ /typescript/4.8.4:
+ resolution: {integrity: sha512-QCh+85mCy+h0IGff8r5XWzOVSbBO+KfeYrMQh7NJ58QujwcE22u+NUSmUxqF+un70P9GXKxa2HCNiTTMJknyjQ==}
+ engines: {node: '>=4.2.0'}
+ hasBin: true
+ dev: true
+
+ /unbox-primitive/1.0.2:
+ resolution: {integrity: sha512-61pPlCD9h51VoreyJ0BReideM3MDKMKnh6+V9L08331ipq6Q8OFXZYiqP6n/tbHx4s5I9uRhcye6BrbkizkBDw==}
+ dependencies:
+ call-bind: 1.0.2
+ has-bigints: 1.0.2
+ has-symbols: 1.0.3
+ which-boxed-primitive: 1.0.2
+ dev: true
+
+ /unicode-canonical-property-names-ecmascript/2.0.0:
+ resolution: {integrity: sha512-yY5PpDlfVIU5+y/BSCxAJRBIS1Zc2dDG3Ujq+sR0U+JjUevW2JhocOF+soROYDSaAezOzOKuyyixhD6mBknSmQ==}
+ engines: {node: '>=4'}
+ dev: true
+
+ /unicode-match-property-ecmascript/2.0.0:
+ resolution: {integrity: sha512-5kaZCrbp5mmbz5ulBkDkbY0SsPOjKqVS35VpL9ulMPfSl0J0Xsm+9Evphv9CoIZFwre7aJoa94AY6seMKGVN5Q==}
+ engines: {node: '>=4'}
+ dependencies:
+ unicode-canonical-property-names-ecmascript: 2.0.0
+ unicode-property-aliases-ecmascript: 2.1.0
+ dev: true
+
+ /unicode-match-property-value-ecmascript/2.0.0:
+ resolution: {integrity: sha512-7Yhkc0Ye+t4PNYzOGKedDhXbYIBe1XEQYQxOPyhcXNMJ0WCABqqj6ckydd6pWRZTHV4GuCPKdBAUiMc60tsKVw==}
+ engines: {node: '>=4'}
+ dev: true
+
+ /unicode-property-aliases-ecmascript/2.1.0:
+ resolution: {integrity: sha512-6t3foTQI9qne+OZoVQB/8x8rk2k1eVy1gRXhV3oFQ5T6R1dqQ1xtin3XqSlx3+ATBkliTaR/hHyJBm+LVPNM8w==}
+ engines: {node: '>=4'}
+ dev: true
+
+ /universalify/0.2.0:
+ resolution: {integrity: sha512-CJ1QgKmNg3CwvAv/kOFmtnEN05f0D/cn9QntgNOQlQF9dgvVTHj3t+8JPdjqawCHk7V/KA+fbUqzZ9XWhcqPUg==}
+ engines: {node: '>= 4.0.0'}
+ dev: true
+
+ /unload/2.2.0:
+ resolution: {integrity: sha512-B60uB5TNBLtN6/LsgAf3udH9saB5p7gqJwcFfbOEZ8BcBHnGwCf6G/TGiEqkRAxX7zAFIUtzdrXQSdL3Q/wqNA==}
+ dependencies:
+ '@babel/runtime': 7.19.4
+ detect-node: 2.1.0
+ dev: false
+
+ /update-browserslist-db/1.0.10_browserslist@4.21.4:
+ resolution: {integrity: sha512-OztqDenkfFkbSG+tRxBeAnCVPckDBcvibKd35yDONx6OU8N7sqgwc7rCbkJ/WcYtVRZ4ba68d6byhC21GFh7sQ==}
+ hasBin: true
+ peerDependencies:
+ browserslist: '>= 4.21.0'
+ dependencies:
+ browserslist: 4.21.4
+ escalade: 3.1.1
+ picocolors: 1.0.0
+
+ /update-check/1.5.4:
+ resolution: {integrity: sha512-5YHsflzHP4t1G+8WGPlvKbJEbAJGCgw+Em+dGR1KmBUbr1J36SJBqlHLjR7oob7sco5hWHGQVcr9B2poIVDDTQ==}
+ dependencies:
+ registry-auth-token: 3.3.2
+ registry-url: 3.1.0
+ dev: true
+
+ /uri-js/4.4.1:
+ resolution: {integrity: sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==}
+ dependencies:
+ punycode: 2.1.1
+ dev: true
+
+ /url-parse/1.5.10:
+ resolution: {integrity: sha512-WypcfiRhfeUP9vvF0j6rw0J3hrWrw6iZv3+22h6iRMJ/8z1Tj6XfLP4DsUix5MhMPnXpiHDoKyoZ/bdCkwBCiQ==}
+ dependencies:
+ querystringify: 2.2.0
+ requires-port: 1.0.0
+ dev: true
+
+ /use-composed-ref/1.3.0_react@17.0.2:
+ resolution: {integrity: sha512-GLMG0Jc/jiKov/3Ulid1wbv3r54K9HlMW29IWcDFPEqFkSO2nS0MuefWgMJpeHQ9YJeXDL3ZUF+P3jdXlZX/cQ==}
+ peerDependencies:
+ react: ^16.8.0 || ^17.0.0 || ^18.0.0
+ dependencies:
+ react: 17.0.2
+ dev: false
+
+ /use-deep-compare-effect/1.8.1_react@17.0.2:
+ resolution: {integrity: sha512-kbeNVZ9Zkc0RFGpfMN3MNfaKNvcLNyxOAAd9O4CBZ+kCBXXscn9s/4I+8ytUER4RDpEYs5+O6Rs4PqiZ+rHr5Q==}
+ engines: {node: '>=10', npm: '>=6'}
+ peerDependencies:
+ react: '>=16.13'
+ dependencies:
+ '@babel/runtime': 7.19.4
+ dequal: 2.0.3
+ react: 17.0.2
+ dev: false
+
+ /use-isomorphic-layout-effect/1.1.2_pxzommwrsowkd4kgag6q3sluym:
+ resolution: {integrity: sha512-49L8yCO3iGT/ZF9QttjwLF/ZD9Iwto5LnH5LmEdk/6cFmXddqi2ulF0edxTwjj+7mqvpVVGQWvbXZdn32wRSHA==}
+ peerDependencies:
+ '@types/react': '*'
+ react: ^16.8.0 || ^17.0.0 || ^18.0.0
+ peerDependenciesMeta:
+ '@types/react':
+ optional: true
+ dependencies:
+ '@types/react': 17.0.50
+ react: 17.0.2
+ dev: false
+
+ /use-latest/1.2.1_pxzommwrsowkd4kgag6q3sluym:
+ resolution: {integrity: sha512-xA+AVm/Wlg3e2P/JiItTziwS7FK92LWrDB0p+hgXloIMuVCeJJ8v6f0eeHyPZaJrM+usM1FkFfbNCrJGs8A/zw==}
+ peerDependencies:
+ '@types/react': '*'
+ react: ^16.8.0 || ^17.0.0 || ^18.0.0
+ peerDependenciesMeta:
+ '@types/react':
+ optional: true
+ dependencies:
+ '@types/react': 17.0.50
+ react: 17.0.2
+ use-isomorphic-layout-effect: 1.1.2_pxzommwrsowkd4kgag6q3sluym
+ dev: false
+
+ /use-memo-one/1.1.3_react@17.0.2:
+ resolution: {integrity: sha512-g66/K7ZQGYrI6dy8GLpVcMsBp4s17xNkYJVSMvTEevGy3nDxHOfE6z8BVE22+5G5x7t3+bhzrlTDB7ObrEE0cQ==}
+ peerDependencies:
+ react: ^16.8.0 || ^17.0.0 || ^18.0.0
+ dependencies:
+ react: 17.0.2
+ dev: false
+
+ /uuid/8.3.2:
+ resolution: {integrity: sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg==}
+ hasBin: true
+ dev: false
+
+ /v8-compile-cache-lib/3.0.1:
+ resolution: {integrity: sha512-wa7YjyUGfNZngI/vtK0UHAN+lgDCxBPCylVXGp0zu59Fz5aiGtNXaq3DhIov063MorB+VfufLh3JlF2KdTK3xg==}
+ dev: true
+
+ /v8-compile-cache/2.3.0:
+ resolution: {integrity: sha512-l8lCEmLcLYZh4nbunNZvQCJc5pv7+RCwa8q/LdUx8u7lsWvPDKmpodJAJNwkAhJC//dFY48KuIEmjtd4RViDrA==}
+ dev: true
+
+ /v8-to-istanbul/9.0.1:
+ resolution: {integrity: sha512-74Y4LqY74kLE6IFyIjPtkSTWzUZmj8tdHT9Ii/26dvQ6K9Dl2NbEfj0XgU2sHCtKgt5VupqhlO/5aWuqS+IY1w==}
+ engines: {node: '>=10.12.0'}
+ dependencies:
+ '@jridgewell/trace-mapping': 0.3.17
+ '@types/istanbul-lib-coverage': 2.0.4
+ convert-source-map: 1.9.0
+ dev: true
+
+ /vary/1.1.2:
+ resolution: {integrity: sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg==}
+ engines: {node: '>= 0.8'}
+ dev: true
+
+ /vite-plugin-environment/1.1.2_vite@3.1.8:
+ resolution: {integrity: sha512-WFgM/ibceOEIuficZVaLcmJvcMZiyTkGzeS8+pzfByGYRdewqil7LSLDV1DwJfFQIx/YzcW9YRSWQG7cJ2XT1w==}
+ peerDependencies:
+ vite: '>= 2.7'
+ dependencies:
+ vite: 3.1.8
+ dev: true
+
+ /vite/3.1.8:
+ resolution: {integrity: sha512-m7jJe3nufUbuOfotkntGFupinL/fmuTNuQmiVE7cH2IZMuf4UbfbGYMUT3jVWgGYuRVLY9j8NnrRqgw5rr5QTg==}
+ engines: {node: ^14.18.0 || >=16.0.0}
+ hasBin: true
+ peerDependencies:
+ less: '*'
+ sass: '*'
+ stylus: '*'
+ terser: ^5.4.0
+ peerDependenciesMeta:
+ less:
+ optional: true
+ sass:
+ optional: true
+ stylus:
+ optional: true
+ terser:
+ optional: true
+ dependencies:
+ esbuild: 0.15.10
+ postcss: 8.4.18
+ resolve: 1.22.1
+ rollup: 2.78.1
+ optionalDependencies:
+ fsevents: 2.3.2
+ dev: true
+
+ /w3c-xmlserializer/3.0.0:
+ resolution: {integrity: sha512-3WFqGEgSXIyGhOmAFtlicJNMjEps8b1MG31NCA0/vOF9+nKMUW1ckhi9cnNHmf88Rzw5V+dwIwsm2C7X8k9aQg==}
+ engines: {node: '>=12'}
+ dependencies:
+ xml-name-validator: 4.0.0
+ dev: true
+
+ /walker/1.0.8:
+ resolution: {integrity: sha512-ts/8E8l5b7kY0vlWLewOkDXMmPdLcVV4GmOQLyxuSswIJsweeFZtAsMF7k1Nszz+TYBQrlYRmzOnr398y1JemQ==}
+ dependencies:
+ makeerror: 1.0.12
+ dev: true
+
+ /watchpack/2.4.0:
+ resolution: {integrity: sha512-Lcvm7MGST/4fup+ifyKi2hjyIAwcdI4HRgtvTpIUxBRhB+RFtUh8XtDOxUfctVCnhVi+QQj49i91OyvzkJl6cg==}
+ engines: {node: '>=10.13.0'}
+ dependencies:
+ glob-to-regexp: 0.4.1
+ graceful-fs: 4.2.10
+ dev: true
+
+ /web-vitals/1.1.2:
+ resolution: {integrity: sha512-PFMKIY+bRSXlMxVAQ+m2aw9c/ioUYfDgrYot0YUa+/xa0sakubWhSDyxAKwzymvXVdF4CZI71g06W+mqhzu6ig==}
+ dev: false
+
+ /webidl-conversions/7.0.0:
+ resolution: {integrity: sha512-VwddBukDzu71offAQR975unBIGqfKZpM+8ZX6ySk8nYhVoo5CYaZyzt3YBvYtRtO+aoGlqxPg/B87NGVZ/fu6g==}
+ engines: {node: '>=12'}
+ dev: true
+
+ /webpack-sources/2.3.1:
+ resolution: {integrity: sha512-y9EI9AO42JjEcrTJFOYmVywVZdKVUfOvDUPsJea5GIr1JOEGFVqwlY2K098fFoIjOkDzHn2AjRvM8dsBZu+gCA==}
+ engines: {node: '>=10.13.0'}
+ dependencies:
+ source-list-map: 2.0.1
+ source-map: 0.6.1
+ dev: true
+
+ /webpack-sources/3.2.3:
+ resolution: {integrity: sha512-/DyMEOrDgLKKIG0fmvtz+4dUX/3Ghozwgm6iPp8KRhvn+eQf9+Q7GWxVNMk3+uCPWfdXYC4ExGBckIXdFEfH1w==}
+ engines: {node: '>=10.13.0'}
+ dev: true
+
+ /webpack/5.74.0:
+ resolution: {integrity: sha512-A2InDwnhhGN4LYctJj6M1JEaGL7Luj6LOmyBHjcI8529cm5p6VXiTIW2sn6ffvEAKmveLzvu4jrihwXtPojlAA==}
+ engines: {node: '>=10.13.0'}
+ hasBin: true
+ peerDependencies:
+ webpack-cli: '*'
+ peerDependenciesMeta:
+ webpack-cli:
+ optional: true
+ dependencies:
+ '@types/eslint-scope': 3.7.4
+ '@types/estree': 0.0.51
+ '@webassemblyjs/ast': 1.11.1
+ '@webassemblyjs/wasm-edit': 1.11.1
+ '@webassemblyjs/wasm-parser': 1.11.1
+ acorn: 8.8.0
+ acorn-import-assertions: 1.8.0_acorn@8.8.0
+ browserslist: 4.21.4
+ chrome-trace-event: 1.0.3
+ enhanced-resolve: 5.10.0
+ es-module-lexer: 0.9.3
+ eslint-scope: 5.1.1
+ events: 3.3.0
+ glob-to-regexp: 0.4.1
+ graceful-fs: 4.2.10
+ json-parse-even-better-errors: 2.3.1
+ loader-runner: 4.3.0
+ mime-types: 2.1.35
+ neo-async: 2.6.2
+ schema-utils: 3.1.1
+ tapable: 2.2.1
+ terser-webpack-plugin: 5.3.6_webpack@5.74.0
+ watchpack: 2.4.0
+ webpack-sources: 3.2.3
+ transitivePeerDependencies:
+ - '@swc/core'
+ - esbuild
+ - uglify-js
+ dev: true
+
+ /whatwg-encoding/2.0.0:
+ resolution: {integrity: sha512-p41ogyeMUrw3jWclHWTQg1k05DSVXPLcVxRTYsXUk+ZooOCZLcoYgPZ/HL/D/N+uQPOtcp1me1WhBEaX02mhWg==}
+ engines: {node: '>=12'}
+ dependencies:
+ iconv-lite: 0.6.3
+ dev: true
+
+ /whatwg-mimetype/3.0.0:
+ resolution: {integrity: sha512-nt+N2dzIutVRxARx1nghPKGv1xHikU7HKdfafKkLNLindmPU/ch3U31NOCGGA/dmPcmb1VlofO0vnKAcsm0o/Q==}
+ engines: {node: '>=12'}
+ dev: true
+
+ /whatwg-url/11.0.0:
+ resolution: {integrity: sha512-RKT8HExMpoYx4igMiVMY83lN6UeITKJlBQ+vR/8ZJ8OCdSiN3RwCq+9gH0+Xzj0+5IrM6i4j/6LuvzbZIQgEcQ==}
+ engines: {node: '>=12'}
+ dependencies:
+ tr46: 3.0.0
+ webidl-conversions: 7.0.0
+ dev: true
+
+ /which-boxed-primitive/1.0.2:
+ resolution: {integrity: sha512-bwZdv0AKLpplFY2KZRX6TvyuN7ojjr7lwkg6ml0roIy9YeuSr7JS372qlNW18UQYzgYK9ziGcerWqZOmEn9VNg==}
+ dependencies:
+ is-bigint: 1.0.4
+ is-boolean-object: 1.1.2
+ is-number-object: 1.0.7
+ is-string: 1.0.7
+ is-symbol: 1.0.4
+ dev: true
+
+ /which/2.0.2:
+ resolution: {integrity: sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==}
+ engines: {node: '>= 8'}
+ hasBin: true
+ dependencies:
+ isexe: 2.0.0
+ dev: true
+
+ /widest-line/4.0.1:
+ resolution: {integrity: sha512-o0cyEG0e8GPzT4iGHphIOh0cJOV8fivsXxddQasHPHfoZf1ZexrfeA21w2NaEN1RHE+fXlfISmOE8R9N3u3Qig==}
+ engines: {node: '>=12'}
+ dependencies:
+ string-width: 5.1.2
+ dev: true
+
+ /word-wrap/1.2.3:
+ resolution: {integrity: sha512-Hz/mrNwitNRh/HUAtM/VT/5VH+ygD6DV7mYKZAtHOrbs8U7lvPS6xf7EJKMF0uW1KJCl0H701g3ZGus+muE5vQ==}
+ engines: {node: '>=0.10.0'}
+ dev: true
+
+ /wrap-ansi/6.2.0:
+ resolution: {integrity: sha512-r6lPcBGxZXlIcymEu7InxDMhdW0KDxpLgoFLcguasxCaJ/SOIZwINatK9KY/tf+ZrlywOKU0UDj3ATXUBfxJXA==}
+ engines: {node: '>=8'}
+ dependencies:
+ ansi-styles: 4.3.0
+ string-width: 4.2.3
+ strip-ansi: 6.0.1
+ dev: true
+
+ /wrap-ansi/7.0.0:
+ resolution: {integrity: sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==}
+ engines: {node: '>=10'}
+ dependencies:
+ ansi-styles: 4.3.0
+ string-width: 4.2.3
+ strip-ansi: 6.0.1
+ dev: true
+
+ /wrap-ansi/8.0.1:
+ resolution: {integrity: sha512-QFF+ufAqhoYHvoHdajT/Po7KoXVBPXS2bgjIam5isfWJPfIOnQZ50JtUiVvCv/sjgacf3yRrt2ZKUZ/V4itN4g==}
+ engines: {node: '>=12'}
+ dependencies:
+ ansi-styles: 6.2.1
+ string-width: 5.1.2
+ strip-ansi: 7.0.1
+ dev: true
+
+ /wrappy/1.0.2:
+ resolution: {integrity: sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==}
+
+ /write-file-atomic/4.0.2:
+ resolution: {integrity: sha512-7KxauUdBmSdWnmpaGFg+ppNjKF8uNLry8LyzjauQDOVONfFLNKrKvQOxZ/VuTIcS/gge/YNahf5RIIQWTSarlg==}
+ engines: {node: ^12.13.0 || ^14.15.0 || >=16.0.0}
+ dependencies:
+ imurmurhash: 0.1.4
+ signal-exit: 3.0.7
+ dev: true
+
+ /ws/8.9.0:
+ resolution: {integrity: sha512-Ja7nszREasGaYUYCI2k4lCKIRTt+y7XuqVoHR44YpI49TtryyqbqvDMn5eqfW7e6HzTukDRIsXqzVHScqRcafg==}
+ 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
+ dev: true
+
+ /xml-name-validator/4.0.0:
+ resolution: {integrity: sha512-ICP2e+jsHvAj2E2lIHxa5tjXRlKDJo4IdvPvCXbXQGdzSfmSpNVyIKMvoZHjDY9DP0zV17iI85o90vRFXNccRw==}
+ engines: {node: '>=12'}
+ dev: true
+
+ /xmlchars/2.2.0:
+ resolution: {integrity: sha512-JZnDKK8B0RCDw84FNdDAIpZK+JuJw+s7Lz8nksI7SIuU3UXJJslUthsi+uWBUYOwPFwW7W7PRLRfUKpxjtjFCw==}
+ dev: true
+
+ /y18n/5.0.8:
+ resolution: {integrity: sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==}
+ engines: {node: '>=10'}
+ dev: true
+
+ /yallist/4.0.0:
+ resolution: {integrity: sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==}
+ dev: true
+
+ /yaml/1.10.2:
+ resolution: {integrity: sha512-r3vXyErRCYJ7wg28yvBY5VSoAF8ZvlcW9/BwUzEtUsjvX/DKs24dIkuwjtuprwJJHsbyUbLApepYTR1BN4uHrg==}
+ engines: {node: '>= 6'}
+ dev: false
+
+ /yaml/2.1.3:
+ resolution: {integrity: sha512-AacA8nRULjKMX2DvWvOAdBZMOfQlypSFkjcOcu9FalllIDJ1kvlREzcdIZmidQUqqeMv7jorHjq2HlLv/+c2lg==}
+ engines: {node: '>= 14'}
+ dev: true
+
+ /yargs-parser/21.1.1:
+ resolution: {integrity: sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==}
+ engines: {node: '>=12'}
+ dev: true
+
+ /yargs/17.6.0:
+ resolution: {integrity: sha512-8H/wTDqlSwoSnScvV2N/JHfLWOKuh5MVla9hqLjK3nsfyy6Y4kDSYSvkU5YCUEPOSnRXfIyx3Sq+B/IWudTo4g==}
+ engines: {node: '>=12'}
+ 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.8
+ yargs-parser: 21.1.1
+ dev: true
+
+ /yn/3.1.1:
+ resolution: {integrity: sha512-Ux4ygGWsu2c7isFWe8Yu1YluJmqVhxqK2cLXNQA5AcC3QfbGNpM7fu0Y8b/z16pXLnFxZYvWhd3fhBY9DLmC6Q==}
+ engines: {node: '>=6'}
+ dev: true
+
+ /yocto-queue/0.1.0:
+ resolution: {integrity: sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==}
+ engines: {node: '>=10'}
+ dev: true
diff --git a/packages/client/prettierrc.json b/packages/client/prettierrc.json
new file mode 100644
index 000000000..2a1199028
--- /dev/null
+++ b/packages/client/prettierrc.json
@@ -0,0 +1,14 @@
+{
+ "arrowParens": "avoid",
+ "jsxBracketSameLine": false,
+ "jsxSingleQuote": false,
+ "proseWrap": "always",
+ "quoteProps": "as-needed",
+ "semi": true,
+ "tabWidth": 2,
+ "trailingComma": "es5",
+ "useTabs": false,
+ "singleQuote": false,
+ "bracketSpacing": true,
+ "printWidth": 80
+}
diff --git a/packages/client/public/android-chrome-192x192.png b/packages/client/public/android-chrome-192x192.png
new file mode 100644
index 000000000..9a7d8f68a
Binary files /dev/null and b/packages/client/public/android-chrome-192x192.png differ
diff --git a/packages/client/public/android-chrome-512x512.png b/packages/client/public/android-chrome-512x512.png
new file mode 100644
index 000000000..65dcfe8da
Binary files /dev/null and b/packages/client/public/android-chrome-512x512.png differ
diff --git a/packages/client/public/apple-touch-icon.png b/packages/client/public/apple-touch-icon.png
new file mode 100644
index 000000000..236c02886
Binary files /dev/null and b/packages/client/public/apple-touch-icon.png differ
diff --git a/packages/client/public/browserconfig.xml b/packages/client/public/browserconfig.xml
new file mode 100644
index 000000000..e0829795d
--- /dev/null
+++ b/packages/client/public/browserconfig.xml
@@ -0,0 +1,9 @@
+
+
+
+
+
+ #4d72f2
+
+
+
diff --git a/packages/client/public/favicon-16x16.png b/packages/client/public/favicon-16x16.png
new file mode 100644
index 000000000..8bdcc94d7
Binary files /dev/null and b/packages/client/public/favicon-16x16.png differ
diff --git a/packages/client/public/favicon-32x32.png b/packages/client/public/favicon-32x32.png
new file mode 100644
index 000000000..222333a7e
Binary files /dev/null and b/packages/client/public/favicon-32x32.png differ
diff --git a/packages/client/public/favicon.ico b/packages/client/public/favicon.ico
new file mode 100644
index 000000000..6ac01ef56
Binary files /dev/null and b/packages/client/public/favicon.ico differ
diff --git a/packages/client/public/index.html b/packages/client/public/index.html
new file mode 100644
index 000000000..eb5d00c8e
--- /dev/null
+++ b/packages/client/public/index.html
@@ -0,0 +1,47 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Graph Explorer
+
+
+You need to enable JavaScript to run this app.
+
+
+
+
diff --git a/packages/client/public/manifest.json b/packages/client/public/manifest.json
new file mode 100644
index 000000000..1b196a009
--- /dev/null
+++ b/packages/client/public/manifest.json
@@ -0,0 +1,19 @@
+{
+ "name": "Graph Explorer",
+ "short_name": "GE",
+ "icons": [
+ {
+ "src": "/android-chrome-192x192.png",
+ "sizes": "192x192",
+ "type": "image/png"
+ },
+ {
+ "src": "/android-chrome-512x512.png",
+ "sizes": "512x512",
+ "type": "image/png"
+ }
+ ],
+ "theme_color": "#4d72f2",
+ "background_color": "#4d72f2",
+ "display": "standalone"
+}
diff --git a/packages/client/public/mstile-144x144.png b/packages/client/public/mstile-144x144.png
new file mode 100644
index 000000000..b581cc60f
Binary files /dev/null and b/packages/client/public/mstile-144x144.png differ
diff --git a/packages/client/public/mstile-150x150.png b/packages/client/public/mstile-150x150.png
new file mode 100644
index 000000000..4435e5676
Binary files /dev/null and b/packages/client/public/mstile-150x150.png differ
diff --git a/packages/client/public/mstile-310x150.png b/packages/client/public/mstile-310x150.png
new file mode 100644
index 000000000..f78701daf
Binary files /dev/null and b/packages/client/public/mstile-310x150.png differ
diff --git a/packages/client/public/mstile-310x310.png b/packages/client/public/mstile-310x310.png
new file mode 100644
index 000000000..dc5ddce90
Binary files /dev/null and b/packages/client/public/mstile-310x310.png differ
diff --git a/packages/client/public/mstile-70x70.png b/packages/client/public/mstile-70x70.png
new file mode 100644
index 000000000..94bd9cfdb
Binary files /dev/null and b/packages/client/public/mstile-70x70.png differ
diff --git a/packages/client/public/robots.txt b/packages/client/public/robots.txt
new file mode 100644
index 000000000..e9e57dc4d
--- /dev/null
+++ b/packages/client/public/robots.txt
@@ -0,0 +1,3 @@
+# https://www.robotstxt.org/robotstxt.html
+User-agent: *
+Disallow:
diff --git a/packages/client/public/safari-pinned-tab.svg b/packages/client/public/safari-pinned-tab.svg
new file mode 100644
index 000000000..d06bf9a66
--- /dev/null
+++ b/packages/client/public/safari-pinned-tab.svg
@@ -0,0 +1,54 @@
+
+
+
+
+Created by potrace 1.14, written by Peter Selinger 2001-2017
+
+
+
+
+
+
diff --git a/packages/client/src/@types/cytoscape-canvas.d.ts b/packages/client/src/@types/cytoscape-canvas.d.ts
new file mode 100644
index 000000000..abd264724
--- /dev/null
+++ b/packages/client/src/@types/cytoscape-canvas.d.ts
@@ -0,0 +1 @@
+declare module "cytoscape-canvas";
diff --git a/packages/client/src/@types/cytoscape-d3-force.d.ts b/packages/client/src/@types/cytoscape-d3-force.d.ts
new file mode 100644
index 000000000..3e71c1887
--- /dev/null
+++ b/packages/client/src/@types/cytoscape-d3-force.d.ts
@@ -0,0 +1 @@
+declare module "cytoscape-d3-force";
diff --git a/packages/client/src/@types/cytoscape-dagre.d.ts b/packages/client/src/@types/cytoscape-dagre.d.ts
new file mode 100644
index 000000000..a3272cdb1
--- /dev/null
+++ b/packages/client/src/@types/cytoscape-dagre.d.ts
@@ -0,0 +1 @@
+declare module "cytoscape-dagre";
diff --git a/packages/client/src/@types/cytoscape-fcose.d.ts b/packages/client/src/@types/cytoscape-fcose.d.ts
new file mode 100644
index 000000000..60be37cbb
--- /dev/null
+++ b/packages/client/src/@types/cytoscape-fcose.d.ts
@@ -0,0 +1 @@
+declare module "cytoscape-fcose";
diff --git a/packages/client/src/@types/cytoscape-klay.d.ts b/packages/client/src/@types/cytoscape-klay.d.ts
new file mode 100644
index 000000000..71d13e5a3
--- /dev/null
+++ b/packages/client/src/@types/cytoscape-klay.d.ts
@@ -0,0 +1 @@
+declare module "cytoscape-klay";
diff --git a/packages/client/src/@types/entities.ts b/packages/client/src/@types/entities.ts
new file mode 100644
index 000000000..aa9b9b7cf
--- /dev/null
+++ b/packages/client/src/@types/entities.ts
@@ -0,0 +1,116 @@
+export interface VertexData {
+ /**
+ * Unique identifier for the vertex.
+ * - For PG, the node id
+ * - For RDF, the resource URI
+ */
+ id: string;
+ /**
+ * Single vertex type.
+ * - For PG, the node label
+ * - For RDF, the resource class
+ */
+ type: string;
+ /**
+ * In gremlin, a node can have multiple labels (types).
+ * So, this stores all possible labels for displaying purposes.
+ * @example
+ * "John Doe" can a "person" and a "worker"
+ * types = ["person", "worker"]
+ */
+ types?: string[];
+ /**
+ * List of attributes associated to the vertex.
+ * - For PG, nodes can contain attributes.
+ * - For RDF, subjects can be connected to other subjects which are literals
+ */
+ attributes: Record;
+ /**
+ * The total number of neighbors.
+ * - For PG, all connected nodes independently of their direction (in/out)
+ * - For RDF, all subjects which be compliant with:
+ * 1. ?pred ?subject
+ * 2. ?subject ?pred
+ * 3. FILTER(!isLiteral(?subject))
+ */
+ neighborsCount: number;
+ /**
+ * The total number of neighbors by type.
+ */
+ neighborsCountByType: Record;
+
+ // The following properties are computed on run-time
+ /**
+ * Total number of non-fetched neighbors
+ */
+ __unfetchedNeighborCount?: number;
+ /**
+ * Non-fetched neighbors by type
+ */
+ __unfetchedNeighborCounts?: Record;
+ /**
+ * Fetched incoming edges connected with the vertex
+ */
+ __fetchedInEdgeCount?: number;
+ /**
+ * Fetched outgoing edges connected with the vertex
+ */
+ __fetchedOutEdgeCount?: number;
+}
+
+/**
+ * Sometimes is needed to add some extra properties to a Vertex
+ * which cannot be mixed or overwritten with the original data
+ * of a vertex.
+ * For example, NodesTabular add __is_visible property to hide/show a node.
+ */
+export type Vertex> = T & {
+ data: VertexData;
+};
+
+export interface EdgeData {
+ /**
+ * Unique identifier for the edge.
+ * - For PG, the edge id
+ * - For RDF, predicates do not have ids like PG graphs.
+ * So, a synthetic id is created using -[predicate]->
+ */
+ id: string;
+ /**
+ * Edge type.
+ * - For PG, the label which identifies the relation type
+ * - For RDF, the predicate
+ */
+ type: string;
+ /**
+ * Source vertex id
+ */
+ source: string;
+ /**
+ * Source vertex type
+ */
+ sourceType: string;
+ /**
+ * Target vertex id
+ */
+ target: string;
+ /**
+ * Target vertex type
+ */
+ targetType: string;
+ /**
+ * Only for PG, attributes associated to the edge.
+ * For RDF, predicates do not have more properties than the predicate itself.
+ */
+ attributes: Record;
+}
+
+/**
+ * Sometimes is needed to add some extra properties to an Edge
+ * which cannot be mixed or overwritten with the original data
+ * of en edge.
+ * For example, EdgesTabular add __is_visible property to hide/show an edge.
+ */
+export interface Edge> {
+ data: EdgeData & T;
+}
diff --git a/packages/client/src/@types/react-table-config.d.ts b/packages/client/src/@types/react-table-config.d.ts
new file mode 100644
index 000000000..00175865c
--- /dev/null
+++ b/packages/client/src/@types/react-table-config.d.ts
@@ -0,0 +1,149 @@
+import {
+ TableKeyedProps,
+ UseColumnOrderInstanceProps,
+ UseColumnOrderState,
+ UseExpandedHooks,
+ UseExpandedInstanceProps,
+ UseExpandedOptions,
+ UseExpandedRowProps,
+ UseExpandedState,
+ UseFiltersColumnOptions,
+ UseFiltersColumnProps,
+ UseFiltersInstanceProps,
+ UseFiltersOptions,
+ UseFiltersState,
+ UseGlobalFiltersColumnOptions,
+ UseGlobalFiltersInstanceProps,
+ UseGlobalFiltersOptions,
+ UseGlobalFiltersState,
+ UseGroupByCellProps,
+ UseGroupByColumnOptions,
+ UseGroupByColumnProps,
+ UseGroupByHooks,
+ UseGroupByInstanceProps,
+ UseGroupByOptions,
+ UseGroupByRowProps,
+ UseGroupByState,
+ UsePaginationInstanceProps,
+ UsePaginationOptions,
+ UsePaginationState,
+ UseResizeColumnsColumnOptions,
+ UseResizeColumnsColumnProps,
+ UseResizeColumnsOptions,
+ UseResizeColumnsState,
+ UseRowSelectHooks,
+ UseRowSelectInstanceProps,
+ UseRowSelectOptions,
+ UseRowSelectRowProps,
+ UseRowSelectState,
+ UseRowStateCellProps,
+ UseRowStateInstanceProps,
+ UseRowStateOptions,
+ UseRowStateRowProps,
+ UseRowStateState,
+ UseSortByColumnOptions,
+ UseSortByColumnProps,
+ UseSortByHooks,
+ UseSortByInstanceProps,
+ UseSortByOptions,
+ UseSortByState,
+} from "react-table";
+export type UseDiffState = {
+ diff: {
+ filters: boolean;
+ };
+};
+
+declare module "react-table" {
+ // take this file as-is, or comment out the sections that don't apply to your plugin configuration
+
+ export interface TableOptions<
+ D extends Record
+ > extends UseExpandedOptions,
+ UseFiltersOptions,
+ UseGlobalFiltersOptions,
+ UseGroupByOptions,
+ UsePaginationOptions,
+ UseResizeColumnsOptions,
+ UseRowSelectOptions,
+ UseRowStateOptions,
+ UseSortByOptions,
+ // note that having Record here allows you to add anything to the options, this matches the spirit of the
+ // underlying js library, but might be cleaner if it's replaced by a more specific type that matches your
+ // feature set, this is a safe default.
+ Record {}
+
+ export interface Hooks<
+ D extends Record = Record
+ > extends UseExpandedHooks,
+ UseGroupByHooks,
+ UseRowSelectHooks,
+ UseSortByHooks {}
+
+ export interface TableInstance<
+ D extends Record = Record
+ > extends UseColumnOrderInstanceProps,
+ UseExpandedInstanceProps,
+ UseFiltersInstanceProps,
+ UseGlobalFiltersInstanceProps,
+ UseGroupByInstanceProps,
+ UsePaginationInstanceProps,
+ UseRowSelectInstanceProps,
+ UseRowStateInstanceProps,
+ UseSortByInstanceProps {}
+
+ export interface TableState<
+ D extends Record = Record
+ > extends UseColumnOrderState,
+ UseExpandedState,
+ UseFiltersState,
+ UseGlobalFiltersState,
+ UseGroupByState,
+ UsePaginationState,
+ UseResizeColumnsState,
+ UseRowSelectState,
+ UseRowStateState,
+ UseSortByState,
+ UseDiffState {}
+
+ export interface ColumnInterface<
+ D extends Record = Record
+ > extends UseFiltersColumnOptions,
+ UseGlobalFiltersColumnOptions,
+ UseGroupByColumnOptions,
+ UseResizeColumnsColumnOptions,
+ UseSortByColumnOptions {}
+
+ export interface ColumnInstance<
+ D extends Record = Record
+ > extends UseFiltersColumnProps,
+ UseGroupByColumnProps,
+ UseResizeColumnsColumnProps,
+ UseSortByColumnProps {}
+
+ export interface Cell<
+ D extends Record = Record,
+ // eslint-disable-next-line @typescript-eslint/no-unused-vars
+ V = any
+ > extends UseGroupByCellProps,
+ UseRowStateCellProps {}
+
+ export interface Row<
+ D extends Record = Record
+ > extends UseExpandedRowProps,
+ UseGroupByRowProps,
+ UseRowSelectRowProps,
+ UseRowStateRowProps {}
+
+ export type TableHeaderProps = TableKeyedProps;
+
+ // react-table propagates every unknown property that is sent to the "columns"
+ // TS does not recognize them
+ // this is the reason for this extension
+ export interface ColumnInterface
+ extends UseTableColumnOptions {
+ align?: "right" | "left";
+ overflow?: "ellipsis" | "truncate" | "none";
+ oneLine?: boolean;
+ }
+}
diff --git a/packages/client/src/@types/svg.d.ts b/packages/client/src/@types/svg.d.ts
new file mode 100644
index 000000000..5011fa352
--- /dev/null
+++ b/packages/client/src/@types/svg.d.ts
@@ -0,0 +1,6 @@
+declare module "@iconfu/svg-inject";
+
+declare module "*.svg" {
+ const content: any;
+ export default content;
+}
diff --git a/packages/client/src/@types/typings.d.ts b/packages/client/src/@types/typings.d.ts
new file mode 100644
index 000000000..a395d3689
--- /dev/null
+++ b/packages/client/src/@types/typings.d.ts
@@ -0,0 +1,103 @@
+import "rc-dock";
+
+declare global {
+ /**
+ * Main level and all nested will be optional
+ */
+ type DeepPartial = {
+ [P in keyof T]?: DeepPartial;
+ };
+
+ /**
+ * Main level and all nested will be required
+ */
+ type DeepRequired = {
+ [P in keyof T]-?: T[P] extends object ? DeepRequired : T[P];
+ };
+
+ type ObjectMapWithAugmentedType = { [K in keyof T]: T[K] & R };
+
+ type ValueOf = T[keyof T];
+
+ /**
+ * Use
+ * interface Interface {
+ * propA?: string
+ * propB?: {
+ * subPropsBPropA?: number
+ * }
+ * }
+ *
+ * PartiallyRequired is equivalent to
+ * interface Interface {
+ * propA?: string
+ * propB: { <-- This is now required but not its inner props
+ * subPropsBPropA?: number
+ * }
+ * }
+ */
+ type PartiallyRequired = T & Required>;
+
+ /**
+ * Use
+ * interface Interface {
+ * propA?: string
+ * propB?: {
+ * subPropsBPropA?: number
+ * }
+ * }
+ *
+ * PartiallyDeepRequired is equivalent to
+ * interface Interface {
+ * propA?: string <-- This continues be optional
+ * propB: { <-- This is now required
+ * subPropsBPropA: number <-- Also its inner props
+ * }
+ * }
+ */
+ type PartiallyDeepRequired = T &
+ DeepRequired>;
+
+ type ValuesOf = T[number];
+
+ /**
+ * This allows to create actions types for reducers.
+ * Example:
+ * ReducerAction<"action_name", { id: string }>
+ */
+ type ReducerAction = TPayload extends undefined
+ ? {
+ type: TType;
+ payload?: TPayload;
+ }
+ : {
+ type: TType;
+ payload: TPayload;
+ };
+
+ type ReducerActionDispatch = (
+ state: TState,
+ action: TAction
+ ) => TState;
+
+ interface PromiseWithCancel extends Promise {
+ cancel?: () => void;
+ }
+}
+declare module "rc-dock" {
+ /**
+ * TabBase allow to add custom props
+ */
+ export interface TabBase {
+ /**
+ * id must be unique
+ */
+ id?: string;
+
+ /** @deprecated - this is used by old dashboard */
+ widgetName?: string;
+
+ type: string;
+ }
+}
+export {};
diff --git a/packages/client/src/App.tsx b/packages/client/src/App.tsx
new file mode 100644
index 000000000..8b2961c2f
--- /dev/null
+++ b/packages/client/src/App.tsx
@@ -0,0 +1,18 @@
+import { Route, Routes } from "react-router-dom";
+import Redirect from "./components/Redirect";
+import Connections from "./workspaces/Connections";
+import DataExplorer from "./workspaces/DataExplorer";
+import GraphExplorer from "./workspaces/GraphExplorer";
+
+const App = () => {
+ return (
+
+ } />
+ } />
+ } />
+ } />
+
+ );
+};
+
+export default App;
diff --git a/packages/client/src/components/AdvancedList/AdvancedList.styles.tsx b/packages/client/src/components/AdvancedList/AdvancedList.styles.tsx
new file mode 100644
index 000000000..8012a7295
--- /dev/null
+++ b/packages/client/src/components/AdvancedList/AdvancedList.styles.tsx
@@ -0,0 +1,281 @@
+import { css } from "@emotion/css";
+import { ThemeStyleFn } from "../../core";
+
+const listStyles = (pfx: string): ThemeStyleFn => ({ theme, isDarkTheme }) => {
+ const { palette, shape, advancedList } = theme;
+ const { primary, background, text, grey } = palette;
+
+ return css`
+ display: flex;
+ flex-direction: column;
+ width: 100%;
+ height: 100%;
+ background-color: ${advancedList?.background || isDarkTheme
+ ? palette.background.secondary
+ : palette.background.contrast};
+
+ color: ${advancedList?.color || text.primary};
+
+ .${pfx}-advanced-list-loading {
+ width: 100%;
+ height: 100%;
+ display: flex;
+ justify-content: center;
+ align-items: center;
+ font-size: 40px;
+ }
+
+ .${pfx}-advanced-list-search-wrapper {
+ display: flex;
+ align-items: center;
+ .${pfx}-advanced-list-search-input {
+ flex: 2;
+ }
+
+ .${pfx}-advanced-list-category-select {
+ flex: 1;
+ }
+
+ .${pfx}-select {
+ min-width: 0;
+ }
+ }
+
+ .${pfx}-advanced-list-no-groups {
+ padding: 0 5px;
+ }
+
+ .${pfx}-advanced-list-item-wrapper {
+ padding: 5px;
+ }
+
+ .${pfx}-advanced-list-item {
+ user-select: auto;
+ border: 1px solid ${advancedList?.item?.borderColor || "transparent"};
+ border-radius: ${advancedList?.item?.borderRadius || shape.borderRadius};
+ background-color: ${advancedList?.background || isDarkTheme
+ ? grey["800"]
+ : background.contrast};
+ padding: 0;
+ align-items: normal;
+ margin: 0 0 10px 0;
+ color: ${advancedList?.item?.color || text.primary};
+
+ &.${pfx}-advanced-list-item-selected {
+ background: ${advancedList?.item?.hover?.background || isDarkTheme
+ ? background.contrast
+ : background.default || "rgba(18, 142, 229, 0.05)"};
+ color: ${advancedList?.item?.hover?.color || text.primary};
+ border: solid 1px
+ ${advancedList?.item?.hover?.borderColor || primary.dark};
+
+ .${pfx}-end-adornment {
+ color: ${advancedList?.item?.color || primary.main};
+ }
+ }
+ &.${pfx}-advanced-list-item-active {
+ border: solid 2px
+ ${advancedList?.item?.hover?.borderColor || primary.dark};
+ }
+
+ .${pfx}-primary {
+ font-weight: 600;
+ display: -webkit-box;
+ -webkit-line-clamp: 1;
+ -webkit-box-orient: vertical;
+ overflow: hidden;
+ word-break: break-all;
+ }
+ .${pfx}-content {
+ flex: 1;
+ }
+
+ .${pfx}-secondary {
+ display: -webkit-box;
+ -webkit-line-clamp: 2;
+ -webkit-box-orient: vertical;
+ overflow: hidden;
+ word-break: break-all;
+ }
+ .sidebar-highlight {
+ color: ${advancedList?.item?.highlight?.color || primary.main};
+ background: ${advancedList?.item?.highlight?.background ||
+ "transparent"};
+ }
+
+ &:hover {
+ background: ${advancedList?.item?.hover?.background || isDarkTheme
+ ? background.contrast
+ : background.default};
+ color: ${advancedList?.item?.hover?.color || "inherit"};
+ border: solid 1px
+ ${advancedList?.item?.hover?.borderColor || primary.dark};
+
+ .${pfx}-end-adornment {
+ color: ${advancedList?.item?.color || primary.main};
+ }
+ }
+
+ .${pfx}-end-adornment {
+ font-size: 20px;
+ color: ${advancedList?.item?.color || palette.border};
+ }
+
+ .${pfx}-content {
+ min-height: 44px;
+ border-radius: ${advancedList?.item?.borderRadius ||
+ shape.borderRadius};
+ background: transparent;
+ }
+
+ .${pfx}-start-adornment {
+ color: ${advancedList?.item?.adornment?.color || primary.main};
+ font-size: 20px;
+ margin: 0;
+ background-color: ${advancedList?.item?.adornment?.background ||
+ background.secondary};
+ border-top-left-radius: ${advancedList?.item?.borderRadius ||
+ shape.borderRadius};
+ border-bottom-left-radius: ${advancedList?.item?.borderRadius ||
+ shape.borderRadius};
+ margin-right: 6px;
+ }
+ }
+
+ .${pfx}-advanced-list-item:last-child {
+ margin: 0;
+ }
+
+ .${pfx}-advanced-list-item-with-popover {
+ margin: 0 !important;
+ }
+
+ .${pfx}-advanced-list-item-wrapper {
+ margin-bottom: 10px;
+ }
+ .${pfx}-advanced-list-item-wrapper:last-child {
+ margin: 0;
+ }
+
+ .${pfx}-advanced-list-category {
+ border: none;
+ padding: 5px 0;
+
+ &.${pfx}-advanced-list-category {
+ padding: 0 0 5px 0;
+ }
+ .${pfx}-header-container {
+ padding: 0;
+ font-size: 14px;
+ font-weight: 500;
+ align-items: center;
+ background-color: ${advancedList?.category?.background ||
+ background.secondary};
+ height: 24px;
+ min-height: 24px;
+ }
+
+ .${pfx}-title {
+ display: flex;
+ align-items: center;
+ line-height: 16px;
+ color: ${advancedList?.category?.color || isDarkTheme
+ ? text.secondary
+ : primary.dark};
+ padding: 0;
+ font-size: 12px;
+
+ svg {
+ font-size: 18px;
+ margin-right: 4px;
+ margin-top: 2px;
+ }
+ }
+
+ .${pfx}-collapsible-container:not(.${pfx}-collapsed) {
+ padding: 12px;
+ }
+ }
+
+ .${pfx}-advanced-list-nogroup {
+ width: 100%;
+ height: 100%;
+ .${pfx}-advanced-list-item-wrapper {
+ padding: 0px;
+ }
+ .${pfx}-advanced-list-nogroup-item-wrapper {
+ padding: 5px 0;
+ }
+ }
+
+ .${pfx}-advanced-list-item-no-category {
+ padding: 5px 0;
+ }
+
+ .${pfx}-panel-empty-state-wrapper {
+ height: max(448px, 100%);
+ }
+ `;
+};
+
+const headerStyles = (pfx: string, noSearchResults: boolean): ThemeStyleFn => ({
+ theme,
+ isDarkTheme,
+}) =>
+ css`
+ flex: 1;
+ height: 100%;
+ .${pfx}-header-container {
+ height: 48px;
+ min-height: 48px;
+ font-size: 16px;
+ padding: 0 14px;
+ font-weight: 500;
+ align-items: center;
+ background-color: ${isDarkTheme
+ ? theme.palette.background.secondary
+ : theme.palette.background.default};
+ }
+
+ .${pfx}-title {
+ padding: 10px 0;
+ }
+
+ > .${pfx}-content {
+ overflow: auto;
+ height: 100%;
+ background: ${noSearchResults
+ ? theme.palette.background.secondary
+ : theme.palette.background.default};
+ }
+ `;
+
+const footerStyles = (pfx: string): ThemeStyleFn => ({ theme, isDarkTheme }) =>
+ css`
+ border-top: solid 1px ${theme.palette.border};
+
+ .${pfx}-header-container {
+ height: 48px;
+ padding: 0 14px;
+ font-weight: 500;
+ align-items: center;
+
+ background-color: ${isDarkTheme
+ ? theme.palette.background.secondary
+ : theme.palette.background.default};
+ }
+
+ .${pfx}-title {
+ padding: 10px 0;
+ color: ${theme.palette.text.secondary};
+ font-size: 14px;
+ }
+ `;
+
+const styles = {
+ footerStyles,
+ headerStyles,
+ listStyles,
+};
+
+export default styles;
diff --git a/packages/client/src/components/AdvancedList/AdvancedList.tsx b/packages/client/src/components/AdvancedList/AdvancedList.tsx
new file mode 100644
index 000000000..bba6fc824
--- /dev/null
+++ b/packages/client/src/components/AdvancedList/AdvancedList.tsx
@@ -0,0 +1,369 @@
+import { cx } from "@emotion/css";
+import type {
+ ComponentType,
+ ForwardedRef,
+ MouseEvent,
+ PropsWithChildren,
+ ReactNode,
+ Ref,
+ RefObject,
+} from "react";
+import { Children, forwardRef, useEffect, useMemo, useState } from "react";
+import type { VirtuosoHandle } from "react-virtuoso";
+import { Virtuoso } from "react-virtuoso";
+import { useWithTheme, withClassNamePrefix } from "../../core";
+import useDebounceValue from "../../hooks/useDebounceValue";
+import LoadingSpinner from "../LoadingSpinner";
+import Section from "../Section/Section";
+import styles from "./AdvancedList.styles";
+import ElementsListItem from "./internalComponents/AdvancedListItem";
+import AdvancedListWithGroups from "./internalComponents/AdvancedListWithGroups";
+import EmptyState from "./internalComponents/EmptyState";
+import Footer from "./internalComponents/Footer";
+import SearchBar from "./internalComponents/SearchBar";
+
+export type AdvancedListItemType = {
+ id: string;
+ title: string;
+ group?: string;
+ subtitle?: ReactNode;
+ icon?: ReactNode;
+ endAdornment?: ReactNode;
+ items?: AdvancedListItemType[];
+ properties?: T;
+ titleComponent?: ReactNode;
+ defaultItemType?: string;
+ className?: string;
+ wrapperElement?: ComponentType>>;
+};
+
+export type AdvancedListMouseEvent = (
+ event: MouseEvent,
+ index: number
+) => void;
+
+export type AdvancedListProps = {
+ items: AdvancedListItemType[];
+ classNamePrefix?: string;
+ className?: string;
+ selectedItemsIds?: string[];
+ draggable?: boolean;
+ search?: string;
+ searchPlaceholder?: string;
+ isLoading?: boolean;
+ onSearch?: (searchTerm: string) => void;
+ category?: string;
+ onItemClick?: (
+ event: MouseEvent,
+ item: AdvancedListItemType,
+ index: number
+ ) => void;
+ onItemMouseOver?: (
+ event: MouseEvent,
+ item: AdvancedListItemType,
+ index: number
+ ) => void;
+ onItemMouseOut?: (
+ event: MouseEvent,
+ item: AdvancedListItemType,
+ index: number
+ ) => void;
+ onItemMouseEnter?: AdvancedListMouseEvent;
+ onItemMouseLeave?: AdvancedListMouseEvent;
+ onCategoryChange?: (category: string) => void;
+ emptyState?: {
+ noSearchResultsTitle?: ReactNode;
+ noSearchResultsSubtitle?: ReactNode;
+ noSearchResultsIcon?: ReactNode;
+ noElementsTitle?: ReactNode;
+ noElementsSubtitle?: ReactNode;
+ noElementsIcon?: ReactNode;
+ };
+ defaultItemType?: string;
+ hideFooter?: boolean;
+ hideCount?: boolean;
+ hideEmptyState?: boolean;
+ renderPopover?: (
+ item: AdvancedListItemType,
+ itemRef: RefObject
+ ) => ReactNode;
+ hidePopover?: boolean;
+ disableVirtualization?: boolean;
+ activeItemIds?: string[];
+};
+
+function counterFn(
+ prev: number,
+ el: AdvancedListItemType
+) {
+ return el.items ? prev + el.items.length : prev + 1;
+}
+
+const AdvancedList = (
+ {
+ items,
+ className,
+ children,
+ classNamePrefix = "ft",
+ emptyState,
+ onSearch,
+ search,
+ searchPlaceholder,
+ onCategoryChange,
+ category = "all",
+ draggable = false,
+ onItemClick,
+ onItemMouseOver,
+ onItemMouseOut,
+ onItemMouseEnter,
+ onItemMouseLeave,
+ selectedItemsIds,
+ isLoading,
+ defaultItemType,
+ hideFooter,
+ hideCount,
+ hideEmptyState,
+ renderPopover,
+ hidePopover,
+ disableVirtualization,
+ activeItemIds,
+ }: PropsWithChildren>,
+ ref: Ref
+) => {
+ const [filteredItems, setFilteredItems] = useState[]>(
+ []
+ );
+ const debouncedSearch = useDebounceValue(search, 300);
+ const styleWithTheme = useWithTheme();
+ const pfx = withClassNamePrefix(classNamePrefix);
+ const hasGroups = useMemo(() => {
+ return items.some(item => !!item.items?.length);
+ }, [items]);
+
+ const itemsCount = useMemo(() => {
+ if (!hasGroups) {
+ return items.length;
+ }
+ return items.reduce(counterFn, 0);
+ }, [items, hasGroups]);
+
+ useEffect(() => {
+ if ((!debouncedSearch && category === "all") || hasGroups) {
+ setFilteredItems(items);
+ return;
+ }
+
+ const searchValue = (debouncedSearch || "").toLowerCase();
+ const filterFn = (item: AdvancedListItemType) =>
+ !!item.items || item.title.toLowerCase().includes(searchValue);
+ const filtered = items.filter(filterFn);
+ setFilteredItems(filtered);
+ }, [debouncedSearch, setFilteredItems, category, items, hasGroups]);
+
+ const typesOptions = useMemo(() => {
+ if (!hasGroups) {
+ return [];
+ }
+ const types = items.reduce<{ label: string; value: string }[]>(
+ (prev, item) => {
+ if (item.items?.length) {
+ return [...prev, { label: item.title, value: item.id }];
+ }
+ return [...prev];
+ },
+ []
+ );
+ types.unshift({ label: "All", value: "all" });
+ return types;
+ }, [items, hasGroups]);
+
+ const hasHeader = onSearch || Children.count(children) > 0;
+
+ const isEmpty = !isLoading && (!filteredItems.length || !items.length);
+ const noSearchResults = search ? !filteredItems.length : false;
+
+ const isFooterVisible =
+ filteredItems.length > 0 &&
+ onSearch &&
+ onCategoryChange &&
+ !isLoading &&
+ !hideFooter;
+
+ const isGroupedListVisible = hasGroups && !isLoading && items.length > 0;
+ const isPlainListVisible = !hasGroups && !isLoading;
+ return (
+ <>
+
+ {!isLoading && items.length > 0 && (
+
+ {children}
+ {onSearch && (
+
+ )}
+
+ )
+ }
+ disablePadding
+ classNamePrefix={classNamePrefix}
+ className={cx(
+ styleWithTheme(
+ styles.headerStyles(classNamePrefix, noSearchResults)
+ ),
+ pfx("advanced-list-header")
+ )}
+ >
+ {isGroupedListVisible && (
+
+ )}
+ {isPlainListVisible && (
+
+ {!disableVirtualization && (
+
{
+ const item = filteredItems[index];
+ return (
+
+
+ onItemClick?.(event, item, index)
+ : undefined
+ }
+ onMouseOver={(event, item) =>
+ onItemMouseOver?.(event, item, index)
+ }
+ onMouseOut={(event, item) =>
+ onItemMouseOut?.(event, item, index)
+ }
+ onMouseEnter={event =>
+ onItemMouseEnter?.(event, index)
+ }
+ onMouseLeave={event =>
+ onItemMouseLeave?.(event, index)
+ }
+ classNamePrefix={classNamePrefix}
+ draggable={draggable}
+ isSelected={
+ !!item.id && selectedItemsIds?.includes(item.id)
+ }
+ key={item.id}
+ overrideTitle={item.titleComponent}
+ defaultItemType={defaultItemType}
+ renderPopover={renderPopover}
+ hidePopover={hidePopover}
+ />
+
+ );
+ }}
+ />
+ )}
+ {disableVirtualization &&
+ filteredItems.map((item, index) => (
+
+ onItemClick?.(event, item, index)
+ : undefined
+ }
+ classNamePrefix={classNamePrefix}
+ draggable={draggable}
+ isSelected={
+ !!item.id && selectedItemsIds?.includes(item.id)
+ }
+ key={item.id}
+ overrideTitle={item.titleComponent}
+ defaultItemType={defaultItemType}
+ renderPopover={renderPopover}
+ hidePopover={hidePopover}
+ />
+
+ ))}
+
+ )}
+
+ )}
+ {isLoading && (
+
+
+
+ )}
+ {!hideEmptyState && !hasGroups && isEmpty && (
+
+ )}
+ {!hasGroups && isFooterVisible && (
+
+ )}
+
+ >
+ );
+};
+
+export default forwardRef(AdvancedList) as (
+ props: PropsWithChildren> & {
+ ref?: ForwardedRef;
+ }
+) => ReturnType;
diff --git a/packages/client/src/components/AdvancedList/index.ts b/packages/client/src/components/AdvancedList/index.ts
new file mode 100644
index 000000000..d7e60193a
--- /dev/null
+++ b/packages/client/src/components/AdvancedList/index.ts
@@ -0,0 +1,3 @@
+export { default } from "./AdvancedList";
+export type { AdvancedListProps, AdvancedListItemType } from "./AdvancedList";
+export { default as AdvancedListEmptyState } from "./internalComponents/EmptyState";
diff --git a/packages/client/src/components/AdvancedList/internalComponents/AdvancedListItem.tsx b/packages/client/src/components/AdvancedList/internalComponents/AdvancedListItem.tsx
new file mode 100644
index 000000000..31beabef6
--- /dev/null
+++ b/packages/client/src/components/AdvancedList/internalComponents/AdvancedListItem.tsx
@@ -0,0 +1,144 @@
+import { cx } from "@emotion/css";
+import type { DragEvent, MouseEvent, ReactNode, RefObject } from "react";
+import { useRef } from "react";
+import type { DragObjectWithType } from "react-dnd";
+import { useDrag } from "react-dnd";
+import { useHover } from "react-laag";
+import { withClassNamePrefix } from "../../../core";
+import { CodeIcon } from "../../icons";
+import ListItem from "../../ListItem";
+import type { AdvancedListItemType } from "../AdvancedList";
+
+type AdvancedListItemProps = {
+ classNamePrefix?: string;
+ className?: string;
+ onClick?: (
+ event: MouseEvent,
+ item: AdvancedListItemType
+ ) => void;
+ onMouseOver?: (
+ event: MouseEvent,
+ item: AdvancedListItemType
+ ) => void;
+ onMouseOut?: (
+ event: MouseEvent,
+ item: AdvancedListItemType
+ ) => void;
+ onMouseEnter?: (
+ event: MouseEvent,
+ item: AdvancedListItemType
+ ) => void;
+ onMouseLeave?: (
+ event: MouseEvent,
+ item: AdvancedListItemType
+ ) => void;
+ item: AdvancedListItemType;
+ group?: AdvancedListItemType;
+ isSelected?: boolean;
+ draggable?: boolean;
+ onDragStart?: (
+ item: AdvancedListItemType,
+ group: AdvancedListItemType | undefined,
+ event: DragEvent
+ ) => void;
+ overrideTitle?: ReactNode;
+ defaultItemType?: string;
+ renderPopover?: (
+ item: AdvancedListItemType,
+ itemRef: RefObject
+ ) => ReactNode;
+ hidePopover?: boolean;
+ isActive?: boolean;
+};
+
+const AdvancedListItem = ({
+ classNamePrefix = "ft",
+ onClick,
+ onMouseOver,
+ onMouseOut,
+ onMouseEnter,
+ onMouseLeave,
+ className,
+ item,
+ draggable,
+ isSelected,
+ isActive = false,
+ onDragStart,
+ overrideTitle,
+ group,
+ defaultItemType,
+ hidePopover,
+ renderPopover,
+}: AdvancedListItemProps) => {
+ const pfx = withClassNamePrefix(classNamePrefix);
+ const ref = useRef(null);
+ const [{ isDragging }, dragRef] = useDrag({
+ collect: monitor => ({
+ isDragging: monitor.isDragging(),
+ }),
+ item: {
+ type: defaultItemType || "none",
+ ...item.properties,
+ } as DragObjectWithType & T,
+ });
+ const [isOver, hoverProps] = useHover({
+ delayEnter: 400,
+ delayLeave: 100,
+ hideOnScroll: false,
+ });
+
+ const InnerItem = (
+
+ onClick?.(event, item)}
+ onMouseOver={event => onMouseOver?.(event, item)}
+ onMouseOut={event => onMouseOut?.(event, item)}
+ onMouseEnter={event => onMouseEnter?.(event, item)}
+ onMouseLeave={event => onMouseLeave?.(event, item)}
+ classNamePrefix={classNamePrefix}
+ className={cx(pfx("advanced-list-item"), item.className, {
+ [pfx("advanced-list-item-with-popover")]: isOver,
+ [pfx("advanced-list-item-selected")]: isSelected,
+ [pfx("advanced-list-item-active")]: isActive,
+ })}
+ startAdornment={item.icon || }
+ secondary={item.subtitle}
+ endAdornment={item.endAdornment}
+ onDragStart={event => onDragStart?.(item, group, event)}
+ >
+ {overrideTitle || item.title}
+
+ {isOver &&
+ !isDragging &&
+ !!renderPopover &&
+ !hidePopover &&
+ renderPopover(item, ref)}
+
+ );
+
+ const WrapComponent = item.wrapperElement;
+ const WrappedElement = WrapComponent ? (
+ {InnerItem}
+ ) : (
+ InnerItem
+ );
+
+ if (!draggable) {
+ return (
+
+ {WrappedElement}
+
+ );
+ }
+
+ return (
+
+ );
+};
+
+export default AdvancedListItem;
diff --git a/packages/client/src/components/AdvancedList/internalComponents/AdvancedListWithGroups.tsx b/packages/client/src/components/AdvancedList/internalComponents/AdvancedListWithGroups.tsx
new file mode 100644
index 000000000..9bfff2544
--- /dev/null
+++ b/packages/client/src/components/AdvancedList/internalComponents/AdvancedListWithGroups.tsx
@@ -0,0 +1,312 @@
+import { cx } from "@emotion/css";
+import groupBy from "lodash/groupBy";
+import type { DragEvent, MouseEvent, ReactNode, Ref, RefObject } from "react";
+import { forwardRef, memo, useEffect, useMemo, useState } from "react";
+import type { VirtuosoHandle } from "react-virtuoso";
+import { GroupedVirtuoso } from "react-virtuoso";
+import { useWithTheme, withClassNamePrefix } from "../../../core";
+import useDebounceValue from "../../../hooks/useDebounceValue";
+import { ChevronDownIcon, DetailsIcon, FileIcon } from "../../icons";
+import Section from "../../Section";
+import type {
+ AdvancedListItemType,
+ AdvancedListMouseEvent,
+} from "../AdvancedList";
+import styles from "../AdvancedList.styles";
+import ElementsListItem from "./AdvancedListItem";
+import EmptyState from "./EmptyState";
+import Footer from "./Footer";
+
+type ElementsListWithGroupsProps = {
+ ref?: Ref;
+ items: AdvancedListItemType[];
+ classNamePrefix?: string;
+ selectedItemsIds?: string[];
+ draggable?: boolean;
+ search?: string;
+ category?: string;
+ onItemClick?: (
+ event: MouseEvent,
+ item: AdvancedListItemType,
+ index: number
+ ) => void;
+ onItemMouseOver?: (
+ event: MouseEvent,
+ item: AdvancedListItemType,
+ index: number
+ ) => void;
+ onItemMouseOut?: (
+ event: MouseEvent,
+ item: AdvancedListItemType,
+ index: number
+ ) => void;
+ onItemMouseEnter?: AdvancedListMouseEvent;
+ onItemMouseLeave?: AdvancedListMouseEvent;
+ onDragStart?: (
+ item: AdvancedListItemType,
+ group: AdvancedListItemType | undefined,
+ event: DragEvent
+ ) => void;
+ emptyState?: {
+ noSearchResultsTitle?: string;
+ noSearchResultsSubtitle?: string;
+ noSearchResultsIcon?: string;
+ noElementsTitle?: string;
+ noElementsSubtitle?: string;
+ noElementsIcon?: string;
+ };
+ defaultItemType?: string;
+ hideFooter?: boolean;
+ hideCount?: boolean;
+ renderPopover?: (
+ item: AdvancedListItemType,
+ itemRef: RefObject
+ ) => ReactNode;
+ hidePopover?: boolean;
+ activeItemIds?: string[];
+};
+
+const AdvancedListWithGroups = (
+ {
+ items,
+ classNamePrefix = "ft",
+ search,
+ category = "all",
+ draggable,
+ onItemClick,
+ onItemMouseOver,
+ onItemMouseOut,
+ onItemMouseEnter,
+ onItemMouseLeave,
+ selectedItemsIds,
+ emptyState,
+ onDragStart,
+ defaultItemType,
+ hideFooter,
+ hideCount,
+ renderPopover,
+ hidePopover,
+ activeItemIds,
+ }: ElementsListWithGroupsProps,
+ ref: Ref
+) => {
+ const [filteredItems, setFilteredItems] = useState[]>(
+ []
+ );
+ const [filteredGroups, setFilteredGroups] = useState<
+ AdvancedListItemType[]
+ >([]);
+ const [groupsCounts, setGroupsCounts] = useState([]);
+ const debouncedSearch = useDebounceValue(search, 300);
+ const [collapsedSections, setCollapsedSection] = useState>(
+ new Set()
+ );
+ const styleWithTheme = useWithTheme();
+ const pfx = withClassNamePrefix(classNamePrefix);
+ const allGroups = useMemo(() => {
+ const groupedItems = items.filter(el => !!el.items);
+ const unGroupedItems = items.filter(el => !el.items);
+ if (unGroupedItems.length) {
+ groupedItems.push({
+ id: "ungrouped",
+ title: "Uncategorized",
+ items: unGroupedItems,
+ icon: ,
+ });
+ }
+ return groupedItems;
+ }, [items]);
+
+ const allItems: AdvancedListItemType[] = useMemo(() => {
+ let plainItems: AdvancedListItemType[] = [];
+ allGroups.forEach(group => {
+ const groupItems = group.items?.map(item => ({
+ ...item,
+ group: group.id,
+ }));
+ plainItems = [...plainItems, ...(groupItems || [])];
+ });
+ return plainItems;
+ }, [allGroups]);
+
+ useEffect(() => {
+ if (!debouncedSearch && category === "all") {
+ setFilteredGroups(allGroups);
+ setGroupsCounts(
+ allGroups.map(group =>
+ collapsedSections.has(group.id)
+ ? 0
+ : (group.items as AdvancedListItemType[]).length
+ )
+ );
+ setFilteredItems(
+ collapsedSections.size > 0
+ ? allItems.filter(
+ item => !collapsedSections.has(item.group as string)
+ )
+ : allItems
+ );
+ return;
+ }
+
+ const searchValue = (debouncedSearch || "").toLowerCase();
+ const filterFn = (item: AdvancedListItemType) =>
+ !!item.items || item.title.toLowerCase().includes(searchValue);
+ const byCategory =
+ category !== "all"
+ ? allItems.filter(item => item.group === category)
+ : allItems;
+
+ const filtered = byCategory.filter(filterFn);
+ const groupedItems = groupBy(filtered, "group");
+ const groups: string[] = Object.keys(groupedItems);
+ const filteredG = allGroups.filter(group => groups.includes(group.id));
+ const filteredAndCollapsed = filtered.filter(
+ item => !collapsedSections.has(item.group as string)
+ );
+ setFilteredGroups(filteredG);
+ setGroupsCounts(
+ groups.map((groupKey: string) =>
+ collapsedSections.size > 0 && collapsedSections.has(groupKey)
+ ? 0
+ : groupedItems[groupKey].length
+ )
+ );
+ setFilteredItems(filteredAndCollapsed);
+ }, [
+ debouncedSearch,
+ setFilteredItems,
+ setFilteredGroups,
+ setGroupsCounts,
+ category,
+ allItems,
+ allGroups,
+ collapsedSections,
+ ]);
+
+ const showEmptyState = useMemo(() => {
+ if (!search && allItems.length) {
+ return false;
+ }
+
+ return !filteredItems.length;
+ }, [filteredItems, search, allItems]);
+
+ if (showEmptyState) {
+ return (
+
+ );
+ }
+
+ return (
+ <>
+
+ {
+ const item = filteredGroups[index];
+ return (
+
+ {item.icon || }
+ {item.title || item.title}
+ {!hideCount &&
+ `(${(item.items as AdvancedListItemType[]).length})`}
+ >
+ }
+ disablePadding
+ collapsible
+ collapseAction="all"
+ collapseIndicatorPosition="start"
+ isCollapse={collapsedSections.has(item.id)}
+ onCollapseChange={isCollapse => {
+ const newCollapseSections = new Set([...collapsedSections]);
+ if (newCollapseSections.has(item.id) && !isCollapse) {
+ newCollapseSections.delete(item.id);
+ setCollapsedSection(newCollapseSections);
+ }
+ if (isCollapse) {
+ setCollapsedSection(newCollapseSections.add(item.id));
+ }
+ }}
+ collapseAdornment={
+
+ }
+ classNamePrefix={classNamePrefix}
+ showWhenEmpty
+ className={cx(pfx("advanced-list-category"), {
+ [pfx("advanced-list-category-first")]: index === 0,
+ })}
+ />
+ );
+ }}
+ itemContent={(index, groupIndex) => {
+ const innerItem = filteredItems[index];
+ const group = filteredGroups[groupIndex];
+
+ return (
+ onItemClick?.(event, item, index)
+ : undefined
+ }
+ onMouseOver={(event, item) =>
+ onItemMouseOver?.(event, item, index)
+ }
+ onMouseOut={(event, item) =>
+ onItemMouseOut?.(event, item, index)
+ }
+ onMouseEnter={event => onItemMouseEnter?.(event, index)}
+ onMouseLeave={event => onItemMouseLeave?.(event, index)}
+ group={group}
+ classNamePrefix={classNamePrefix}
+ draggable={draggable}
+ isSelected={
+ !!innerItem.id && selectedItemsIds?.includes(innerItem.id)
+ }
+ isActive={activeItemIds?.includes(innerItem.id)}
+ key={innerItem.id}
+ onDragStart={onDragStart}
+ defaultItemType={defaultItemType}
+ renderPopover={renderPopover}
+ hidePopover={hidePopover}
+ overrideTitle={innerItem.titleComponent}
+ />
+ );
+ }}
+ />
+
+ {!hideFooter && (
+
+ )}
+ >
+ );
+};
+
+export default memo(forwardRef(AdvancedListWithGroups));
diff --git a/packages/client/src/components/AdvancedList/internalComponents/EmptyState.tsx b/packages/client/src/components/AdvancedList/internalComponents/EmptyState.tsx
new file mode 100644
index 000000000..03f9473ff
--- /dev/null
+++ b/packages/client/src/components/AdvancedList/internalComponents/EmptyState.tsx
@@ -0,0 +1,69 @@
+import type { ReactNode } from "react";
+import { NoWidgetIcon, SearchSadIcon } from "../../icons";
+import { PanelEmptyState } from "../../PanelEmptyState";
+
+const getEmptyStateItems = (
+ empty: boolean,
+ noSearchResults: boolean,
+ emptyState?: {
+ noSearchResultsTitle?: ReactNode;
+ noSearchResultsSubtitle?: ReactNode;
+ noSearchResultsIcon?: ReactNode;
+ noElementsTitle?: ReactNode;
+ noElementsSubtitle?: ReactNode;
+ noElementsIcon?: ReactNode;
+ }
+) => {
+ if (noSearchResults) {
+ return {
+ title: emptyState?.noSearchResultsTitle || "No results found",
+ subtitle:
+ emptyState?.noSearchResultsSubtitle ||
+ "Your search returned with no results",
+ icon: emptyState?.noSearchResultsIcon || ,
+ };
+ }
+
+ return {
+ title: emptyState?.noElementsTitle || "No elements",
+ subtitle:
+ emptyState?.noElementsSubtitle || "No Elements available in this list",
+ icon: emptyState?.noElementsIcon || ,
+ };
+};
+
+export type EmptyStateProps = {
+ empty: boolean;
+ noSearchResults: boolean;
+ classNamePrefix?: string;
+ className?: string;
+ emptyState?: {
+ noSearchResultsTitle?: ReactNode;
+ noSearchResultsSubtitle?: ReactNode;
+ noSearchResultsIcon?: ReactNode;
+ noElementsTitle?: ReactNode;
+ noElementsSubtitle?: ReactNode;
+ noElementsIcon?: ReactNode;
+ };
+};
+
+const EmptyState = ({
+ empty,
+ noSearchResults,
+ emptyState,
+ classNamePrefix = "ft",
+ className,
+}: EmptyStateProps) => {
+ const state = getEmptyStateItems(empty, noSearchResults, emptyState);
+ return (
+
+ );
+};
+
+export default EmptyState;
diff --git a/packages/client/src/components/AdvancedList/internalComponents/Footer.tsx b/packages/client/src/components/AdvancedList/internalComponents/Footer.tsx
new file mode 100644
index 000000000..7cfb3e2f2
--- /dev/null
+++ b/packages/client/src/components/AdvancedList/internalComponents/Footer.tsx
@@ -0,0 +1,23 @@
+import { memo } from "react";
+import Section from "../../Section";
+
+type FooterProps = {
+ count: number;
+ total: number;
+ className: string;
+ classNamePrefix: string;
+};
+
+const Footer = ({ count, total, className, classNamePrefix }: FooterProps) => {
+ return (
+
+ );
+};
+
+export default memo(Footer);
diff --git a/packages/client/src/components/AdvancedList/internalComponents/SearchBar.tsx b/packages/client/src/components/AdvancedList/internalComponents/SearchBar.tsx
new file mode 100644
index 000000000..fc26bff43
--- /dev/null
+++ b/packages/client/src/components/AdvancedList/internalComponents/SearchBar.tsx
@@ -0,0 +1,57 @@
+import { memo } from "react";
+import { withClassNamePrefix } from "../../../core";
+import SearchIcon from "../../icons/SearchIcon";
+import Input from "../../Input";
+import type { SelectOption } from "../../Select";
+import Select from "../../Select";
+
+type SearchBarProps = {
+ types: SelectOption[];
+ search?: string;
+ searchPlaceholder?: string;
+ classNamePrefix?: string;
+ onSearch: (search: string) => void;
+ type: string;
+ onTypeChange?: (type: string) => void;
+};
+
+const SearchBar = ({
+ types,
+ search,
+ searchPlaceholder,
+ onSearch,
+ onTypeChange,
+ type,
+ classNamePrefix,
+}: SearchBarProps) => {
+ const pfx = withClassNamePrefix(classNamePrefix);
+ return (
+ <>
+ }
+ />
+ {!!types.length && onTypeChange && (
+ onTypeChange?.(value as string)}
+ noMargin
+ size="sm"
+ hideError
+ />
+ )}
+ >
+ );
+};
+
+export default memo(SearchBar);
diff --git a/packages/client/src/components/Button/Button.model.ts b/packages/client/src/components/Button/Button.model.ts
new file mode 100644
index 000000000..93f5a60eb
--- /dev/null
+++ b/packages/client/src/components/Button/Button.model.ts
@@ -0,0 +1,49 @@
+type BaseButtonTheme = {
+ background: string;
+ color: string;
+ border: {
+ width: string;
+ color: string;
+ radius: string;
+ };
+ hover: {
+ background: string;
+ color: string;
+ border: {
+ width: string;
+ color: string;
+ };
+ };
+ active: {
+ background: string;
+ color: string;
+ border: {
+ width: string;
+ color: string;
+ };
+ };
+ disabled: {
+ background: string;
+ color: string;
+ border: {
+ width: string;
+ color: string;
+ };
+ };
+};
+
+type ButtonThemeVariants = BaseButtonTheme & {
+ variants: {
+ filled: ButtonThemeVariants;
+ text: ButtonThemeVariants;
+ };
+ sizes: {
+ small: string;
+ base: string;
+ large: string;
+ };
+};
+
+export type ButtonTheme = {
+ button?: DeepPartial;
+};
diff --git a/packages/client/src/components/Button/Button.styles.ts b/packages/client/src/components/Button/Button.styles.ts
new file mode 100644
index 000000000..d31a31d07
--- /dev/null
+++ b/packages/client/src/components/Button/Button.styles.ts
@@ -0,0 +1,216 @@
+import { css, cx } from "@emotion/css";
+import type { ProcessedTheme, ThemeStyleFn } from "../../core";
+import { fade } from "../../core";
+import type { ButtonTheme } from "./Button.model";
+
+export const getHeightBySize = (
+ theme: ProcessedTheme,
+ size: "small" | "base" | "large"
+) => {
+ const sizeMap = {
+ small: theme.button?.sizes?.small || "24px",
+ base: theme.button?.sizes?.base || "30px",
+ large: theme.button?.sizes?.large || "38px",
+ };
+
+ return sizeMap[size];
+};
+
+export const getFontSizeBySize = (size: "small" | "base" | "large") => {
+ const sizeMap = {
+ small: "0.85em",
+ base: "1em",
+ large: "1.15em",
+ };
+
+ return sizeMap[size];
+};
+
+export const getIconFontSizeBySize = (size: "small" | "base" | "large") => {
+ const sizeMap = {
+ small: "1.513em",
+ base: "1.715em",
+ large: "1.988em",
+ };
+
+ return sizeMap[size];
+};
+
+export const baseStyles = (
+ theme: ProcessedTheme,
+ size: "small" | "base" | "large"
+) => css`
+ display: flex;
+ justify-content: center;
+ align-items: center;
+ height: ${getHeightBySize(theme, size)};
+ font-size: ${getFontSizeBySize(size)};
+ font-family: ${theme.typography.fontFamily || "sans-serif"};
+ cursor: pointer;
+
+ svg {
+ font-size: ${getIconFontSizeBySize(size)};
+ }
+`;
+
+type StylesProps = {
+ variant: "filled" | "default" | "text";
+ size: "small" | "base" | "large";
+ rounded?: boolean;
+ isDisabled?: boolean;
+};
+
+export const defaultStyles = ({
+ variant,
+ size,
+}: StylesProps): ThemeStyleFn => activeTheme => {
+ const { isDarkTheme, theme } = activeTheme;
+ const {
+ palette: { primary, text, background },
+ } = theme;
+ const themeByVariant =
+ variant !== "default" ? theme?.button?.variants?.[variant] : theme.button;
+
+ const variants: {
+ filled: string;
+ default: string;
+ text: string;
+ } = {
+ filled: css`
+ position: relative;
+ background-color: ${themeByVariant?.background ||
+ (isDarkTheme ? primary?.dark : primary?.main)};
+ color: ${themeByVariant?.color || primary?.contrastText};
+ border: ${themeByVariant?.border?.width || "1px"} solid
+ ${themeByVariant?.border?.color || "transparent"};
+ border-radius: ${themeByVariant?.border?.radius || "5px"};
+
+ &:disabled,
+ &[disabled] {
+ pointer-events: none;
+ background-color: ${themeByVariant?.disabled?.background ||
+ fade(background?.contrast, 1)};
+ color: ${themeByVariant?.disabled?.color || text?.disabled};
+ border: ${themeByVariant?.disabled?.border?.width || "1px"} solid
+ ${themeByVariant?.disabled?.border?.color || "transparent"};
+ }
+
+ &:hover {
+ background-color: ${themeByVariant?.hover?.background ||
+ (isDarkTheme ? primary?.main : primary?.light)};
+ color: ${themeByVariant?.hover?.color || primary?.contrastText};
+ border: ${themeByVariant?.hover?.border?.width || "1px"} solid
+ ${themeByVariant?.hover?.border?.color || "transparent"};
+ }
+
+ &:active {
+ background-color: ${themeByVariant?.active?.background ||
+ (isDarkTheme ? primary?.dark : primary?.main)};
+ color: ${themeByVariant?.active?.color || primary?.contrastText};
+ border: ${themeByVariant?.active?.border?.width || "1px"} solid
+ ${themeByVariant?.active?.border?.color || "transparent"};
+ }
+
+ &:focus {
+ box-shadow: ${isDarkTheme
+ ? "none"
+ : `0 0 3px ${themeByVariant?.hover?.background || primary?.main}`};
+ outline: ${isDarkTheme
+ ? `1px solid ${themeByVariant?.hover?.background || primary?.light}`
+ : "none"};
+ }
+ `,
+ default: css`
+ background-color: ${themeByVariant?.background ||
+ (isDarkTheme ? background?.secondary : background?.contrast)};
+ color: ${themeByVariant?.color ||
+ (isDarkTheme ? primary?.main : primary?.dark)};
+ border: ${themeByVariant?.border?.width || "1px"} solid
+ ${themeByVariant?.border?.color || "transparent"};
+ border-radius: ${themeByVariant?.border?.radius || "5px"};
+
+ &:disabled,
+ &[disabled] {
+ pointer-events: none;
+ background-color: ${fade(
+ themeByVariant?.disabled?.background || background?.contrast,
+ 0.8
+ )};
+ color: ${themeByVariant?.disabled?.color || text?.disabled};
+ border: ${themeByVariant?.disabled?.border?.width || "1px"} solid
+ ${themeByVariant?.disabled?.border?.color || "transparent"};
+ }
+
+ &:hover {
+ background-color: ${themeByVariant?.hover?.background ||
+ background?.contrast};
+ color: ${themeByVariant?.hover?.color ||
+ (isDarkTheme ? primary?.light : primary?.main)};
+ border: ${themeByVariant?.hover?.border?.width || "1px"} solid
+ ${themeByVariant?.hover?.border?.color || "transparent"};
+ }
+
+ &:active {
+ background-color: ${themeByVariant?.active?.background ||
+ background?.contrast};
+ color: ${themeByVariant?.active?.color || primary?.dark};
+ border: ${themeByVariant?.active?.border?.width || "1px"} solid
+ ${themeByVariant?.active?.border?.color || "transparent"};
+ }
+
+ &:focus {
+ box-shadow: ${isDarkTheme
+ ? "none"
+ : `0 0 3px ${themeByVariant?.hover?.background || primary?.main}`};
+ outline: ${isDarkTheme
+ ? `1px solid ${themeByVariant?.hover?.background || primary?.light}`
+ : "none"};
+ }
+ `,
+ text: css`
+ background-color: ${themeByVariant?.background || "transparent"};
+ color: ${themeByVariant?.color ||
+ (isDarkTheme ? primary?.main : primary?.dark)};
+ border: ${themeByVariant?.border?.width || "1px"} solid
+ ${themeByVariant?.border?.color || "transparent"};
+
+ &:disabled,
+ &[disabled] {
+ pointer-events: none;
+ background-color: ${themeByVariant?.disabled?.background ||
+ "transparent"};
+ color: ${themeByVariant?.disabled?.color || text?.disabled};
+ border: ${themeByVariant?.disabled?.border?.width || "1px"} solid
+ ${themeByVariant?.disabled?.border?.color || "transparent"};
+ }
+
+ &:hover {
+ background-color: ${themeByVariant?.hover?.background || "transparent"};
+ color: ${themeByVariant?.hover?.color ||
+ (isDarkTheme ? primary?.light : primary?.main)};
+ border: ${themeByVariant?.hover?.border?.width || "1px"} solid
+ ${themeByVariant?.hover?.border?.color || "transparent"};
+ border-radius: ${themeByVariant?.border?.radius || "5px"};
+ }
+
+ &:active {
+ background-color: ${themeByVariant?.active?.background ||
+ "transparent"};
+ color: ${themeByVariant?.active?.color || primary?.dark};
+ border: ${themeByVariant?.active?.border?.width || "1px"} solid
+ ${themeByVariant?.active?.border?.color || "transparent"};
+ }
+
+ &:focus {
+ box-shadow: ${isDarkTheme
+ ? "none"
+ : `0 0 3px ${themeByVariant?.hover?.background || primary?.main}`};
+ outline: ${isDarkTheme
+ ? `1px solid ${themeByVariant?.hover?.background || primary?.light}`
+ : "none"};
+ }
+ `,
+ };
+
+ return cx(variants[variant], baseStyles(theme, size));
+};
diff --git a/packages/client/src/components/Button/Button.tsx b/packages/client/src/components/Button/Button.tsx
new file mode 100644
index 000000000..6e727e742
--- /dev/null
+++ b/packages/client/src/components/Button/Button.tsx
@@ -0,0 +1,63 @@
+import { cx } from "@emotion/css";
+import { useButton } from "@react-aria/button";
+import type { AriaButtonProps } from "@react-types/button";
+import type { ElementType, ForwardedRef, ReactNode, RefObject } from "react";
+import { forwardRef } from "react";
+import { useWithTheme } from "../../core";
+import { defaultStyles } from "./Button.styles";
+
+export interface ButtonProps
+ extends Omit, "elementType"> {
+ className?: string;
+ variant?: "filled" | "default" | "text";
+ size?: "small" | "base" | "large";
+ rounded?: boolean;
+ icon?: ReactNode;
+ iconPlacement?: "start" | "end";
+ as?: ElementType;
+}
+
+export const Button = (
+ props: ButtonProps,
+ ref: ForwardedRef
+) => {
+ const styleWithTheme = useWithTheme();
+ const { buttonProps } = useButton(
+ // eslint-disable-next-line @typescript-eslint/ban-ts-comment
+ // @ts-ignore
+ props,
+ ref as RefObject
+ );
+ const {
+ children,
+ icon,
+ iconPlacement = "start",
+ className,
+ variant = "default",
+ size = "base",
+ rounded = false,
+ as,
+ } = props;
+ const Component: ElementType = as ? as : "button";
+
+ return (
+
+ {icon && iconPlacement === "start" && (
+ {icon}
+ )}
+ {children}
+ {icon && iconPlacement === "end" && (
+ {icon}
+ )}
+
+ );
+};
+
+export default forwardRef(Button);
diff --git a/packages/client/src/components/Button/index.ts b/packages/client/src/components/Button/index.ts
new file mode 100644
index 000000000..c82601dda
--- /dev/null
+++ b/packages/client/src/components/Button/index.ts
@@ -0,0 +1,2 @@
+export { default } from "./Button";
+export type { ButtonProps } from "./Button";
diff --git a/packages/client/src/components/Card/Card.styles.ts b/packages/client/src/components/Card/Card.styles.ts
new file mode 100644
index 000000000..a2620a583
--- /dev/null
+++ b/packages/client/src/components/Card/Card.styles.ts
@@ -0,0 +1,97 @@
+import { css } from "@emotion/css";
+import type { ProcessedTheme, ThemeStyleFn } from "../../core";
+
+type DefaultStylesProps = {
+ elevation: 0 | 1 | 2 | 3 | 4;
+ classNamePrefix: string;
+ disablePadding?: boolean;
+ isDarkTheme?: boolean;
+ transparent?: boolean;
+};
+
+const getStylesByElevation = (
+ classNamePrefix: string,
+ elevation: 0 | 1 | 2 | 3 | 4,
+ theme: ProcessedTheme,
+ isDarkTheme?: boolean
+) => css`
+ box-shadow: ${!isDarkTheme ? shadowMap(theme)[elevation] : "none"};
+ &.${classNamePrefix}-card-elevation-0 {
+ background-color: ${theme.card?.background?.elevation?.["0"] ||
+ theme.card?.background?.base ||
+ theme.palette.background.default};
+ }
+
+ &.${classNamePrefix}-card-elevation-1 {
+ background-color: ${theme.card?.background?.elevation?.["1"] ||
+ theme.card?.background?.base ||
+ isDarkTheme
+ ? theme.palette.background.secondary
+ : theme.palette.background.default};
+ }
+
+ &.${classNamePrefix}-card-elevation-2 {
+ background-color: ${theme.card?.background?.elevation?.["2"] ||
+ theme.card?.background?.base ||
+ isDarkTheme
+ ? theme.palette.background.contrast
+ : theme.palette.background.default};
+ }
+
+ //elevation 3 and 4 is the same as elevation 2 because the grey-500 and grey-400 are way too light for the text to stand out
+ &.${classNamePrefix}-card-elevation-3 {
+ background-color: ${theme.card?.background?.elevation?.["3"] ||
+ theme.card?.background?.base ||
+ isDarkTheme
+ ? theme.palette.background.contrastSecondary
+ : theme.palette.background.default};
+ }
+
+ &.${classNamePrefix}-card-elevation-4 {
+ background-color: ${theme.card?.background?.elevation?.["4"] ||
+ theme.card?.background?.base ||
+ isDarkTheme
+ ? theme.palette.grey["600"]
+ : theme.palette.background.default};
+ }
+`;
+
+const shadowMap = (
+ theme: ProcessedTheme
+): Record<0 | 1 | 2 | 3 | 4, string> => ({
+ 0: theme.card?.shadow?.elevation?.["0"] || theme.shadow.none,
+ 1: theme.card?.shadow?.elevation?.["1"] || theme.shadow.base,
+ 2: theme.card?.shadow?.elevation?.["2"] || theme.shadow.md,
+ 3: theme.card?.shadow?.elevation?.["3"] || theme.shadow.lg,
+ 4: theme.card?.shadow?.elevation?.["3"] || theme.shadow.xl,
+});
+
+const defaultStyles = ({
+ elevation,
+ classNamePrefix,
+ disablePadding,
+ transparent,
+}: DefaultStylesProps): ThemeStyleFn => ({ theme, isDarkTheme }) =>
+ css`
+ display: flex;
+ flex-direction: column;
+ flex-grow: 1;
+ position: relative;
+ color: ${theme.card?.color || theme.palette.text.primary};
+ border-radius: ${theme.card?.borderRadius || theme.shape.borderRadius};
+ padding: ${disablePadding ? 0 : theme.spacing["2x"]};
+ background-color: ${theme.card?.background?.base ||
+ theme.palette.background.default};
+ box-shadow: ${!isDarkTheme ? shadowMap(theme)[elevation] : "none"};
+ border: 1px solid ${isDarkTheme ? theme.palette.border : "transparent"};
+ ${!transparent &&
+ getStylesByElevation(classNamePrefix, elevation, theme, isDarkTheme)}
+ &.${classNamePrefix}-card-clickable {
+ cursor: pointer;
+ &:hover {
+ border-color: ${theme.palette.primary.main};
+ }
+ }
+ `;
+
+export default defaultStyles;
diff --git a/packages/client/src/components/Card/Card.tsx b/packages/client/src/components/Card/Card.tsx
new file mode 100644
index 000000000..e4e88d6e9
--- /dev/null
+++ b/packages/client/src/components/Card/Card.tsx
@@ -0,0 +1,64 @@
+import { cx } from "@emotion/css";
+import type { ForwardedRef, HTMLAttributes, PropsWithChildren } from "react";
+import { forwardRef } from "react";
+import { useWithTheme, withClassNamePrefix } from "../../core";
+import defaultStyles from "./Card.styles";
+
+export interface CardProps
+ extends Pick, "style"> {
+ id?: string;
+ className?: string;
+ elevation?: 0 | 1 | 2 | 3 | 4;
+ classNamePrefix?: string;
+ transparent?: boolean;
+ /**
+ * Allows to remove the default padding.
+ */
+ disablePadding?: boolean;
+ onClick?: () => void;
+}
+
+export const Card = (
+ {
+ id,
+ className,
+ classNamePrefix = "ft",
+ children,
+ elevation = 1,
+ disablePadding,
+ transparent,
+ onClick,
+ ...restProps
+ }: PropsWithChildren,
+ ref: ForwardedRef
+) => {
+ const pfx = withClassNamePrefix(classNamePrefix);
+ const styleWithTheme = useWithTheme();
+ return (
+
+ {children}
+
+ );
+};
+
+export default forwardRef>(Card);
diff --git a/packages/client/src/components/Card/index.ts b/packages/client/src/components/Card/index.ts
new file mode 100644
index 000000000..1b5dabbed
--- /dev/null
+++ b/packages/client/src/components/Card/index.ts
@@ -0,0 +1,2 @@
+export { default } from "./Card";
+export type { CardProps } from "./Card";
diff --git a/packages/client/src/components/Carousel/Carousel.styles.ts b/packages/client/src/components/Carousel/Carousel.styles.ts
new file mode 100644
index 000000000..a16df27a9
--- /dev/null
+++ b/packages/client/src/components/Carousel/Carousel.styles.ts
@@ -0,0 +1,44 @@
+import { css } from "@emotion/css";
+import { ActiveThemeType, fade, ProcessedTheme } from "../../core";
+
+export const defaultStyles = () => css`
+ display: flex;
+ .swiper {
+ height: 484px;
+ width: 320px;
+ }
+`;
+
+export const navArrowsStyles = ({
+ theme,
+}: ActiveThemeType) => css`
+ color: ${theme.palette.primary.main};
+ font-size: 18px;
+ height: 100%;
+ display: flex;
+ align-items: center;
+ background-color: ${fade(theme.palette.primary.main, 0.1)};
+ border-radius: ${theme.shape.borderRadius};
+ box-shadow: ${theme.shadow.base};
+ cursor: pointer;
+ &:hover {
+ background-color: ${fade(theme.palette.primary.main, 0.3)};
+ }
+ &.swiper-button-lock {
+ color: ${theme.palette.text.disabled};
+ background-color: ${fade(theme.palette.text.disabled, 0.05)};
+ cursor: default;
+ &:hover {
+ background-color: ${fade(theme.palette.text.disabled, 0.05)};
+ }
+ }
+
+ &.swiper-button-disabled {
+ color: ${theme.palette.text.disabled};
+ background-color: ${fade(theme.palette.text.disabled, 0.05)};
+ cursor: default;
+ &:hover {
+ background-color: ${fade(theme.palette.text.disabled, 0.05)};
+ }
+ }
+`;
diff --git a/packages/client/src/components/Carousel/Carousel.tsx b/packages/client/src/components/Carousel/Carousel.tsx
new file mode 100644
index 000000000..f00e3dcf5
--- /dev/null
+++ b/packages/client/src/components/Carousel/Carousel.tsx
@@ -0,0 +1,184 @@
+import { cx } from "@emotion/css";
+import isObject from "lodash/isObject";
+import {
+ Children,
+ CSSProperties,
+ forwardRef,
+ MouseEventHandler,
+ PropsWithChildren,
+ useImperativeHandle,
+ useMemo,
+ useRef,
+ useState,
+} from "react";
+import { CustomArrowProps } from "react-slick";
+import { Navigation, Pagination } from "swiper";
+import "swiper/css";
+import "swiper/css/navigation";
+import { Swiper, SwiperSlide } from "swiper/react";
+import {
+ PaginationOptions,
+ Swiper as SwiperClass,
+ SwiperOptions,
+} from "swiper/types";
+import { useWithTheme, withClassNamePrefix } from "../../core";
+import { ChevronLeftIcon, ChevronRightIcon } from "../icons";
+import { defaultStyles, navArrowsStyles } from "./Carousel.styles";
+
+export interface CarouselProps {
+ className?: string;
+ classNamePrefix?: string;
+ centerMode?: boolean;
+ pagination?: PaginationOptions;
+ draggable?: boolean;
+ effect?: SwiperOptions["effect"];
+ nextArrow?: JSX.Element;
+ onInit?(): void;
+ prevArrow?: JSX.Element;
+ slidesToShow?: number;
+ swipe?: boolean;
+ variableWidth?: boolean;
+}
+
+const PrevArrow = forwardRef<
+ HTMLDivElement,
+ {
+ className?: string;
+ style?: CSSProperties;
+ onClick?: MouseEventHandler | undefined;
+ classNamePrefix?: string;
+ }
+>(({ className, onClick, style, classNamePrefix = "ft" }, ref) => {
+ const pfx = withClassNamePrefix(classNamePrefix);
+ const stylesWithTheme = useWithTheme();
+
+ return (
+
+
+
+ );
+});
+
+const NextArrow = forwardRef<
+ HTMLDivElement,
+ CustomArrowProps & { classNamePrefix?: string }
+>(({ className, onClick, style, classNamePrefix = "ft" }, ref) => {
+ const pfx = withClassNamePrefix(classNamePrefix);
+ const stylesWithTheme = useWithTheme();
+
+ return (
+
+
+
+ );
+});
+
+export type CarouselRef = SwiperClass | undefined;
+
+export const Carousel = forwardRef<
+ CarouselRef,
+ PropsWithChildren
+>(
+ (
+ {
+ children,
+ effect,
+ className,
+ draggable = true,
+ slidesToShow = 5,
+ centerMode,
+ pagination,
+ ...props
+ },
+ ref
+ ) => {
+ const nextRef = useRef(null);
+ const prevRef = useRef(null);
+
+ const childrenComputed = useMemo(
+ () =>
+ Children.map(children, (child, index) => {
+ return (
+
+ {child}
+
+ );
+ }),
+ [children, props.variableWidth]
+ );
+
+ const stylesWithTheme = useWithTheme();
+
+ const [swiper, setSwiper] = useState(undefined);
+ useImperativeHandle(ref, () => swiper, [swiper]);
+
+ if (!childrenComputed) {
+ return null;
+ }
+
+ return (
+
+
+
{
+ // run this on next tick
+ setTimeout(() => {
+ if (
+ swiper.params.navigation &&
+ isObject(swiper.params.navigation)
+ ) {
+ swiper.params.navigation.prevEl = prevRef.current;
+ swiper.params.navigation.nextEl = nextRef.current;
+ }
+ }, 0);
+ setTimeout(() => {
+ swiper.updateSize();
+ swiper.updateSlides();
+ swiper.navigation.update();
+ }, 1000);
+ }}
+ modules={[Pagination, Navigation]}
+ >
+ {childrenComputed}
+
+
+
+ );
+ }
+);
+
+export default Carousel;
diff --git a/packages/client/src/components/Carousel/index.ts b/packages/client/src/components/Carousel/index.ts
new file mode 100644
index 000000000..5a1dabc97
--- /dev/null
+++ b/packages/client/src/components/Carousel/index.ts
@@ -0,0 +1,2 @@
+export { default } from "./Carousel";
+export type { CarouselProps } from "./Carousel";
diff --git a/packages/client/src/components/Checkbox/Checkbox.model.ts b/packages/client/src/components/Checkbox/Checkbox.model.ts
new file mode 100644
index 000000000..b159fbb33
--- /dev/null
+++ b/packages/client/src/components/Checkbox/Checkbox.model.ts
@@ -0,0 +1,31 @@
+import { CheckboxSizes } from "./Checkbox";
+
+type BaseCheckboxTheme = {
+ fill: string;
+ stroke: string;
+ label: {
+ color: string;
+ };
+ error: {
+ stroke: string;
+ };
+ checked: {
+ fill: string;
+ tickColor: string;
+ stroke: string;
+ };
+ indeterminate: {
+ fill: string;
+ tickColor: string;
+ stroke: string;
+ };
+ focus: {
+ outlineColor: string;
+ };
+ disabledOpacity: string;
+ sizes: Record;
+};
+
+export type CheckboxTheme = {
+ checkbox?: DeepPartial;
+};
diff --git a/packages/client/src/components/Checkbox/Checkbox.styles.ts b/packages/client/src/components/Checkbox/Checkbox.styles.ts
new file mode 100644
index 000000000..2c5c76ee2
--- /dev/null
+++ b/packages/client/src/components/Checkbox/Checkbox.styles.ts
@@ -0,0 +1,84 @@
+import { css } from "@emotion/css";
+import { fade, ThemeStyleFn } from "../../core";
+import { CheckboxTheme } from "./Checkbox.model";
+
+export const checkboxStyles = (pfx: string): ThemeStyleFn => ({
+ theme,
+}) => {
+ const { forms, checkbox, palette } = theme;
+ return css`
+ margin-right: 4px;
+ cursor: pointer;
+
+ &.${pfx}-checkbox-readonly {
+ pointer-events: none;
+ cursor: auto;
+ }
+ &.${pfx}-checkbox-disabled {
+ filter: opacity(30%);
+ pointer-events: none;
+ cursor: not-allowed;
+ }
+
+ &.${pfx}-checkbox-selected {
+ rect:first-of-type {
+ fill: ${checkbox?.checked?.fill || palette.primary.main};
+ stroke: ${checkbox?.checked?.stroke || "none"};
+ }
+
+ path:first-of-type {
+ fill: ${checkbox?.checked?.tickColor || palette.primary.contrastText};
+ }
+ }
+
+ &.${pfx}-checkbox-indeterminate {
+ rect:first-of-type {
+ fill: ${checkbox?.indeterminate?.fill || palette.border};
+ stroke: ${checkbox?.indeterminate?.stroke || "none"};
+ }
+ }
+
+ &.${pfx}-checkbox-invalid {
+ rect:first-of-type {
+ stroke: ${checkbox?.error?.stroke || fade(palette.error.main, 0.7)};
+ }
+ }
+ rect:first-of-type {
+ fill: ${checkbox?.fill || "none"};
+ stroke: ${checkbox?.stroke || palette.border};
+ }
+
+ path:first-of-type {
+ fill: ${checkbox?.fill || palette.primary.contrastText};
+ }
+
+ rect ~ rect {
+ stroke: ${checkbox?.focus?.outlineColor ||
+ forms?.focus?.outlineColor ||
+ palette.primary.main};
+ }
+ `;
+};
+
+export const labelStyles = (pfx: string): ThemeStyleFn => ({
+ theme,
+}) =>
+ css`
+ display: flex;
+ align-items: center;
+ color: ${theme.checkbox?.label?.color ||
+ theme.forms?.label?.color ||
+ theme.palette.text.primary};
+ &.${pfx}-checkbox-label-invalid {
+ color: ${theme.checkbox?.error?.stroke ||
+ theme.forms?.error?.labelColor ||
+ theme.palette.error.main};
+ }
+ &.${pfx}-checkbox-label-readonly {
+ pointer-events: none;
+ }
+ &.${pfx}-checkbox-label-disabled {
+ cursor: not-allowed;
+ }
+ cursor: pointer;
+ `;
diff --git a/packages/client/src/components/Checkbox/Checkbox.tsx b/packages/client/src/components/Checkbox/Checkbox.tsx
new file mode 100644
index 000000000..5555c32b1
--- /dev/null
+++ b/packages/client/src/components/Checkbox/Checkbox.tsx
@@ -0,0 +1,146 @@
+import { cx } from "@emotion/css";
+import { useCheckbox } from "@react-aria/checkbox";
+import { useFocusRing } from "@react-aria/focus";
+import { VisuallyHidden } from "@react-aria/visually-hidden";
+import type { AriaCheckboxProps } from "@react-types/checkbox";
+import type { PropsWithChildren } from "react";
+import { useCallback, useRef } from "react";
+import { useTheme, useWithTheme, withClassNamePrefix } from "../../core";
+import { checkboxStyles, labelStyles } from "./Checkbox.styles";
+
+export enum CheckboxSizes {
+ "sm" = "sm",
+ "md" = "md",
+ "lg" = "lg",
+}
+
+export interface CheckboxProps
+ extends Omit {
+ /* size of the Checkbox sm, md or lg*/
+ size?: CheckboxSizes | keyof typeof CheckboxSizes;
+ onChange: (isSelected: boolean) => void;
+ className?: string;
+ classNamePrefix?: string;
+}
+
+const defaultSizeMap: Record = {
+ sm: 24,
+ md: 28,
+ lg: 32,
+};
+
+const scaconstick = (size: number) => {
+ return size / defaultSizeMap.md;
+};
+
+// eslint-disable-next-line @typescript-eslint/no-empty-function
+const NOOP = () => {};
+
+export const Checkbox = ({
+ size = "md",
+ classNamePrefix = "ft",
+ className,
+ ...props
+}: PropsWithChildren) => {
+ const ref = useRef(null);
+ const [theme] = useTheme();
+ const sizeMap = theme?.theme?.checkbox?.sizes || defaultSizeMap;
+
+ const { isSelected, isIndeterminate, onChange, children } = props;
+
+ const handleChange = useCallback(
+ (isSelected: boolean) => {
+ onChange(isSelected);
+ },
+ [onChange]
+ );
+
+ const { inputProps } = useCheckbox(
+ props,
+ {
+ isSelected: isSelected || false,
+ setSelected: handleChange,
+ toggle: NOOP,
+ },
+ ref
+ );
+ const { isFocusVisible, focusProps } = useFocusRing();
+
+ const isSelectedOrIndeterminate = isSelected || isIndeterminate;
+ const computedSize = sizeMap[size] || 28;
+
+ const pfx = withClassNamePrefix(classNamePrefix);
+ const styleWithTheme = useWithTheme();
+ return (
+
+
+
+
+
+
+ {isSelected && !isIndeterminate && (
+
+ )}
+ {isIndeterminate && (
+
+ )}
+ {isFocusVisible && (
+
+ )}
+
+ {children}
+
+ );
+};
+
+export default Checkbox;
diff --git a/packages/client/src/components/Checkbox/index.ts b/packages/client/src/components/Checkbox/index.ts
new file mode 100644
index 000000000..c391828bd
--- /dev/null
+++ b/packages/client/src/components/Checkbox/index.ts
@@ -0,0 +1,2 @@
+export { default } from "./Checkbox";
+export type { CheckboxProps } from "./Checkbox";
diff --git a/packages/client/src/components/CheckboxList/CheckboxList.styles.ts b/packages/client/src/components/CheckboxList/CheckboxList.styles.ts
new file mode 100644
index 000000000..a9087cfe1
--- /dev/null
+++ b/packages/client/src/components/CheckboxList/CheckboxList.styles.ts
@@ -0,0 +1,71 @@
+import { css } from "@emotion/css";
+import type { ThemeStyleFn } from "../../core";
+
+const defaultStyles = (pfx: string): ThemeStyleFn => ({ theme, isDarkTheme }) =>
+ css`
+ &.${pfx}-checkbox-list {
+ display: flex;
+ flex-grow: 1;
+ flex-direction: column;
+ width: 100%;
+ height: 100%;
+
+ .${pfx}-title {
+ padding: ${theme.spacing["2x"]} 0;
+ font-weight: bold;
+ font-size: ${theme.typography.sizes.xs};
+ }
+
+ .${pfx}-content {
+ position: relative;
+ display: flex;
+ flex-direction: column;
+ overflow: auto;
+ row-gap: ${theme.spacing["2x"]};
+ padding: ${theme.spacing["2x"]} 0 0;
+ border: solid 1px ${theme.palette.border};
+ border-radius: ${theme.shape.borderRadius};
+ margin-bottom: ${theme.spacing["4x"]};
+ }
+
+ .${pfx}-checkbox-container {
+ padding: 0 ${theme.spacing["2x"]};
+ }
+ .${pfx}-checkbox {
+ svg {
+ min-width: 28px;
+ }
+ }
+
+ .${pfx}-checkbox-content {
+ user-select: none;
+ width: 100%;
+ display: flex;
+ justify-content: space-between;
+ align-items: center;
+ word-break: break-word;
+ gap: ${theme.spacing["2x"]};
+ }
+
+ .${pfx}-icon {
+ > svg {
+ width: 16px;
+ height: 16px;
+ color: ${theme.palette.primary.main};
+ }
+ }
+
+ .${pfx}-selector {
+ user-select: none;
+ position: sticky;
+ bottom: 0;
+ background: ${isDarkTheme
+ ? theme.palette.background.secondary
+ : theme.palette.background.default};
+ border-top: solid 1px ${theme.palette.border};
+ padding-top: ${theme.spacing.base};
+ }
+ }
+ `;
+
+export default defaultStyles;
diff --git a/packages/client/src/components/CheckboxList/CheckboxList.tsx b/packages/client/src/components/CheckboxList/CheckboxList.tsx
new file mode 100644
index 000000000..aebfad673
--- /dev/null
+++ b/packages/client/src/components/CheckboxList/CheckboxList.tsx
@@ -0,0 +1,126 @@
+import { cx } from "@emotion/css";
+import { ReactNode } from "react";
+import { useWithTheme, withClassNamePrefix } from "../../core";
+import Checkbox from "../Checkbox/Checkbox";
+import defaultStyles from "./CheckboxList.styles";
+
+export type CheckboxListItemProps = {
+ id: string;
+ text: ReactNode;
+ endAdornment?: ReactNode;
+ isDisabled?: boolean;
+};
+
+export type CheckboxListProps = {
+ /**
+ * Prefix for style classes.
+ */
+ classNamePrefix?: string;
+ /**
+ * Override or extend the styles applied to the component.
+ */
+ className?: string;
+ /**
+ * The content to display as element title.
+ */
+ title?: string;
+ /**
+ * Checkboxes array to be displayed.
+ */
+ checkboxes: Array;
+ /**
+ * Id values shown as selected checkboxes
+ */
+ selectedIds: Set;
+ /**
+ * If true true
the component is disabled
+ */
+ isDisabled?: boolean;
+ /**
+ * Callback fired when the state is changed
+ */
+ onChange(id: string, isSelected: boolean): void;
+ /**
+ * Callback fired when the state of all checkboxes it wants to be changed.
+ * If this method is not defined, the "all/none" Checkbox is removed.
+ */
+ onChangeAll?(isSelected: boolean): void;
+};
+
+export const CheckboxList = ({
+ classNamePrefix = "ft",
+ className,
+ title,
+ checkboxes,
+ isDisabled,
+ selectedIds,
+ onChange,
+ onChangeAll,
+}: CheckboxListProps) => {
+ const pfx = withClassNamePrefix(classNamePrefix);
+ const stylesWithTheme = useWithTheme();
+
+ const numOfSelections = selectedIds.size;
+ const totalCheckboxes = checkboxes.length;
+ const allDisabled = checkboxes.reduce(
+ (disabled, ch) => disabled && !!ch.isDisabled,
+ true
+ );
+
+ return (
+
+ {title &&
{title}
}
+
+ {checkboxes.map(checkbox => {
+ return (
+
+
onChange(checkbox.id, isSelected)}
+ className={pfx("checkbox")}
+ >
+
+
{checkbox.text}
+
{checkbox.endAdornment}
+
+
+
+ );
+ })}
+ {onChangeAll && (
+
+
+
0 && numOfSelections !== totalCheckboxes
+ }
+ isSelected={numOfSelections === totalCheckboxes}
+ isDisabled={isDisabled || allDisabled}
+ onChange={isSelected => {
+ onChangeAll(isSelected);
+ }}
+ >
+
+
+ {numOfSelections} selected of {totalCheckboxes}
+
+
+
+
+
+ )}
+
+
+ );
+};
+
+export default CheckboxList;
diff --git a/packages/client/src/components/CheckboxList/index.ts b/packages/client/src/components/CheckboxList/index.ts
new file mode 100644
index 000000000..b9f489786
--- /dev/null
+++ b/packages/client/src/components/CheckboxList/index.ts
@@ -0,0 +1,2 @@
+export { default } from "./CheckboxList";
+export type { CheckboxListProps, CheckboxListItemProps } from "./CheckboxList";
diff --git a/packages/client/src/components/Chip/Chip.styles.ts b/packages/client/src/components/Chip/Chip.styles.ts
new file mode 100644
index 000000000..45142b962
--- /dev/null
+++ b/packages/client/src/components/Chip/Chip.styles.ts
@@ -0,0 +1,75 @@
+import { css } from "@emotion/css";
+import type { ThemeStyleFn } from "../../core";
+import { fade } from "../../core";
+
+const heightMap = {
+ xs: "18px",
+ sm: "22px",
+ md: "26px",
+ lg: "30px",
+};
+
+const defaultStyles = (
+ variant: "info" | "success" | "error" | "warning",
+ background?: string,
+ color?: string,
+ size?: "xs" | "sm" | "md" | "lg",
+ pfx?: string
+): ThemeStyleFn => ({ theme }) =>
+ css`
+ display: inline-flex;
+ border-radius: 16px;
+ align-items: center;
+ padding: ${theme.spacing.base || "4px"};
+ height: ${heightMap[size || "md"]};
+ font-size: ${theme.typography.sizes?.[
+ size === "md" ? "base" : size || "sm"
+ ]};
+ color: ${color
+ ? color
+ : theme.chip?.variants?.[variant]?.text || theme.palette.common.white};
+ background-color: ${background
+ ? background
+ : theme.chip?.variants?.[variant]?.background ||
+ theme.palette[variant === "info" ? "primary" : variant].main};
+
+ &.${pfx}-chip-clickable {
+ cursor: pointer;
+ &:hover {
+ color: ${color
+ ? color
+ : theme.chip?.variants?.[variant]?.clickable?.hover?.text ||
+ theme.palette.common.white};
+ background-color: ${background
+ ? background
+ : theme.chip?.variants?.[variant]?.clickable?.hover?.background ||
+ fade(
+ theme.palette[variant === "info" ? "primary" : variant].main,
+ 0.15
+ )};
+ }
+ }
+ .${pfx}-chip-label {
+ overflow: hidden;
+ text-overflow: ellipsis;
+ padding: 0 ${theme.spacing.base};
+ font-weight: ${theme.typography.weight.base};
+ white-space: nowrap;
+ }
+
+ .${pfx}-icon-delete {
+ padding: 0;
+ color: ${fade(theme.palette.grey[600], 0.7)};
+
+ &:hover {
+ transition: 0.3s;
+ color: ${theme.palette.grey[600]};
+ }
+ }
+
+ > svg {
+ font-size: ${theme.spacing["5x"]};
+ }
+ `;
+
+export default defaultStyles;
diff --git a/packages/client/src/components/Chip/Chip.tsx b/packages/client/src/components/Chip/Chip.tsx
new file mode 100644
index 000000000..20614f61e
--- /dev/null
+++ b/packages/client/src/components/Chip/Chip.tsx
@@ -0,0 +1,82 @@
+import { cx } from "@emotion/css";
+import type {
+ ForwardedRef,
+ HTMLAttributes,
+ PropsWithChildren,
+ ReactNode,
+} from "react";
+import { forwardRef } from "react";
+import { useWithTheme, withClassNamePrefix } from "../../core";
+import IconButton from "../IconButton";
+import CloseIcon from "../icons/CloseIcon";
+import defaultStyles from "./Chip.styles";
+
+export interface ChipProps extends HTMLAttributes {
+ className?: string;
+ classNamePrefix?: string;
+ /* Takes precedence over variants and theme*/
+ color?: string;
+ /* Takes precedence over variants and theme*/
+ background?: string;
+ startAdornment?: ReactNode;
+ endAdornment?: ReactNode;
+ deleteIcon?: ReactNode;
+ onDelete?(): void;
+ size?: "xs" | "sm" | "md" | "lg";
+ variant?: "info" | "success" | "error" | "warning";
+}
+
+export const Chip = (
+ {
+ children,
+ className,
+ classNamePrefix = "ft",
+ color,
+ background,
+ size = "sm",
+ variant = "info",
+ startAdornment,
+ endAdornment,
+ onDelete,
+ deleteIcon,
+ ...allProps
+ }: PropsWithChildren,
+ ref: ForwardedRef
+) => {
+ const styleWithTheme = useWithTheme();
+ const pfx = withClassNamePrefix(classNamePrefix);
+
+ return (
+
+ {startAdornment}
+ {children}
+ {endAdornment}
+ {onDelete && (
+ }
+ variant="text"
+ size="small"
+ />
+ )}
+
+ );
+};
+
+export default forwardRef>(Chip);
diff --git a/packages/client/src/components/Chip/index.ts b/packages/client/src/components/Chip/index.ts
new file mode 100644
index 000000000..b6c6e9ebb
--- /dev/null
+++ b/packages/client/src/components/Chip/index.ts
@@ -0,0 +1,3 @@
+export { default } from "./Chip";
+export { default as useChipColor } from "./useChipColor";
+export type { ChipProps } from "./Chip";
diff --git a/packages/client/src/components/Chip/useChipColor.tsx b/packages/client/src/components/Chip/useChipColor.tsx
new file mode 100644
index 000000000..452d28878
--- /dev/null
+++ b/packages/client/src/components/Chip/useChipColor.tsx
@@ -0,0 +1,49 @@
+import { useCallback } from "react";
+import { useTheme } from "../../core";
+import type { ChipProps } from "./Chip";
+
+const isColorVariant = (
+ color: string | undefined
+): color is ChipProps["variant"] => {
+ if (!color) return false;
+ return ["error", "warning", "info", "success"].includes(color);
+};
+
+const useChipColor = (
+ options: Record<
+ string,
+ {
+ label: string;
+ color?: string;
+ background?: string;
+ }
+ >
+) => {
+ const [{ theme }] = useTheme();
+
+ const getChipColor = useCallback(
+ (value: string) => {
+ const option = options[value];
+
+ if (!option) return;
+
+ const color = option.color;
+
+ if (color && isColorVariant(color)) {
+ return {
+ variant: color,
+ };
+ }
+
+ return {
+ color: option?.color || theme.palette.text.primary,
+ background: option?.background || theme.palette.background.contrast,
+ };
+ },
+ [options, theme.palette.text.primary, theme.palette.background.contrast]
+ );
+
+ return { getChipColor };
+};
+
+export default useChipColor;
diff --git a/packages/client/src/components/ColorInput/ColorInput.style.ts b/packages/client/src/components/ColorInput/ColorInput.style.ts
new file mode 100644
index 000000000..8c1642f52
--- /dev/null
+++ b/packages/client/src/components/ColorInput/ColorInput.style.ts
@@ -0,0 +1,26 @@
+import { css } from "@emotion/css";
+import type { ThemeStyleFn } from "../../core";
+
+const defaultStyles = (pfx?: string): ThemeStyleFn => () =>
+ css`
+ .${pfx}-color-input {
+ min-width: 105px;
+ position: relative;
+ .${pfx}-input {
+ margin: 0px;
+ .${pfx}-end-adornment {
+ height: 100%;
+ }
+ }
+ }
+ `;
+
+export const colorPickerStyle = (): ThemeStyleFn => ({ theme }) =>
+ css`
+ background: ${theme.palette.background.default};
+ padding: ${theme.spacing["2x"]};
+ box-shadow: ${theme.shadow.lg};
+ border-radius: ${theme.shape.borderRadius};
+ `;
+
+export default defaultStyles;
diff --git a/packages/client/src/components/ColorInput/ColorInput.tsx b/packages/client/src/components/ColorInput/ColorInput.tsx
new file mode 100644
index 000000000..02fdb5def
--- /dev/null
+++ b/packages/client/src/components/ColorInput/ColorInput.tsx
@@ -0,0 +1,102 @@
+import { cx } from "@emotion/css";
+import { ColorPicker, ColorPickerProps } from "@mantine/core";
+import { FC, useEffect, useState } from "react";
+import { useWithTheme, withClassNamePrefix } from "../../core";
+import {
+ Input,
+ InputProps,
+ UseLayer,
+ UseLayerOverlay,
+ UseLayerTrigger,
+} from "../index";
+import defaultStyles, { colorPickerStyle } from "./ColorInput.style";
+
+const validHexColorRegex = /^#([0-9a-f]{3}){1,2}$/i;
+
+export type ColorInputProps = Pick & {
+ classNamePrefix?: string;
+ startColor?: string;
+ onChange(color: string): void;
+};
+
+const ColorInput: FC = ({
+ classNamePrefix = "ft",
+ className,
+ startColor = "#128ee5",
+ onChange,
+ label,
+ labelPlacement,
+ ...props
+}) => {
+ const styleWithTheme = useWithTheme();
+ const pfx = withClassNamePrefix(classNamePrefix);
+
+ const [lastColor, setLastColor] = useState(startColor);
+ const [color, setColor] = useState(startColor);
+ const [colorPickerOpen, setColorPickerOpen] = useState(false);
+
+ if (lastColor !== startColor) {
+ setLastColor(startColor);
+ setColor(startColor);
+ }
+
+ useEffect(() => {
+ if (
+ startColor !== color &&
+ lastColor === startColor &&
+ validHexColorRegex.test(color)
+ ) {
+ onChange(color);
+ }
+ }, [startColor, color, lastColor, onChange]);
+
+ return (
+
+
+
setColorPickerOpen(false)}
+ isOpen={colorPickerOpen}
+ placement={"bottom-start"}
+ >
+
+ setColorPickerOpen(true)}
+ type={"text"}
+ value={color}
+ onChange={(newColor: string) => setColor(newColor)}
+ endAdornment={
+ setColorPickerOpen(true)}
+ style={{
+ backgroundColor: startColor,
+ height: "60%",
+ aspectRatio: "1",
+ borderRadius: "4px",
+ }}
+ />
+ }
+ />
+
+
+
+ setColor(newColor)}
+ value={color}
+ {...props}
+ />
+
+
+
+
+
+ );
+};
+
+export default ColorInput;
diff --git a/packages/client/src/components/Graph/Graph.model.ts b/packages/client/src/components/Graph/Graph.model.ts
new file mode 100644
index 000000000..47b4004fb
--- /dev/null
+++ b/packages/client/src/components/Graph/Graph.model.ts
@@ -0,0 +1,219 @@
+import cytoscape from "cytoscape";
+
+export type CytoscapeCanvas = {
+ cyCanvas: () => CytoscapeCanvas;
+ getCanvas: () => HTMLCanvasElement;
+ clear: (context: CanvasRenderingContext2D) => void;
+ resetTransform: (context: CanvasRenderingContext2D) => void;
+ setTransform: (context: CanvasRenderingContext2D) => void;
+};
+
+export type CytoscapeType = cytoscape.Core & Partial
;
+
+export type Config = {
+ minZoom?: number;
+ maxZoom?: number;
+ motionBlur?: boolean;
+ hideEdgesOnViewport?: boolean;
+ boxSelectionEnabled?: boolean;
+ zoom?: number;
+ autounselectify?: boolean;
+ autolock?: boolean;
+ /**
+ * Nodes are locked while adding or removing nodes from the canvas.
+ * By setting disableLockOnChange to true, every time that a node is added or removed
+ * the entire layout is recomputed.
+ */
+ disableLockOnChange?: boolean;
+ autoungrabify?: boolean;
+ selectionType?: "additive" | "single";
+ userPanningEnabled?: boolean;
+ userZoomingEnabled?: boolean;
+ pan?: {
+ x: number;
+ y: number;
+ };
+};
+
+export type Selection = {
+ selectedNodesIds?: Array | Set;
+ selectedEdgesIds?: Array | Set;
+ selectedGroupsIds?: Array | Set;
+ onSelectedNodesIdsChange?(nodesIds: Array | Set): void;
+ onSelectedGroupsIdsChange?(
+ groupsIds: Array | Set,
+ visibleChildrenIds: Array | Set
+ ): void;
+ onSelectedEdgesIdsChange?(edgesIds: Array | Set): void;
+};
+
+export type LayoutName =
+ | "CONCENTRIC"
+ | "DAGRE_HORIZONTAL"
+ | "DAGRE_VERTICAL"
+ | "F_COSE"
+ | "D3"
+ | "KLAY"
+ | "SUBWAY_HORIZONTAL"
+ | "SUBWAY_VERTICAL";
+
+export type GraphNode = {
+ data: {
+ id: string;
+ };
+};
+
+export type GraphEdge = {
+ data: {
+ id: string;
+ source: string;
+ target: string;
+ };
+};
+
+export type TextStyle = {
+ background: string;
+ border: {
+ width: number;
+ opacity: number;
+ color: string;
+ style: cytoscape.Css.LineStyle;
+ };
+ color: string;
+ fontSize: number;
+ hAlign: "left" | "right" | "center";
+ maxWidth: number;
+ minZoomedFontSize: number;
+ opacity: number;
+ padding: number;
+ rotation: "autorotate" | string;
+ shape: "rectangle" | "round-rectangle";
+ vAlign: "bottom" | "top" | "center";
+ vMargin: number;
+ wrap: "none" | "wrap" | "ellipsis";
+};
+
+export type NodeStyle = {
+ background: string;
+ backgroundFit?: "none" | "contain" | "cover";
+ backgroundWidth?: string;
+ backgroundHeight?: string;
+ backgroundImage?: string;
+ backgroundOpacity: number;
+ borderColor: string;
+ borderOpacity: number;
+ borderStyle: cytoscape.Css.LineStyle;
+ borderWidth: number;
+ color: string;
+ height: number;
+ label?: string | ((node: cytoscape.NodeSingular) => string);
+ opacity: number;
+ padding: number;
+ shape: cytoscape.Css.NodeShape;
+ text: TextStyle;
+ transitionDuration?: string;
+ transitionProperty?: string;
+ visible?: boolean;
+ width: number;
+ underlayOpacity?: number;
+ underlayColor?: string;
+};
+
+export type CyTextStyle = {
+ textBackgroundColor: string;
+ textBackgroundOpacity: number;
+ textBackgroundPadding: number;
+ textBackgroundShape: "rectangle" | "round-rectangle";
+ textBorderColor: string;
+ textBorderOpacity: number;
+ textBorderStyle: "solid" | "dotted" | "dashed" | "double";
+ textBorderWidth: number;
+ color: string;
+ textHalign: "left" | "right" | "center";
+ textMarginY: number;
+ textMaxWidth: number;
+ minZoomedFontSize: number;
+ textRotation: "autorotate" | string;
+ textValign: "bottom" | "top" | "center";
+ textWrap: "none" | "wrap" | "ellipsis";
+};
+
+export type CyNodeStyle = CyTextStyle & {
+ backgroundColor: string;
+ backgroundFit?: "none" | "contain" | "cover";
+ backgroundHeight?: string;
+ backgroundImage?: string;
+ backgroundOpacity: number;
+ backgroundWidth?: string;
+ borderColor: string;
+ borderOpacity: number;
+ borderStyle: cytoscape.Css.LineStyle;
+ borderWidth: number;
+ color: string;
+ display?: string;
+ fontSize: number;
+ height: number;
+ label?: string | ((node: cytoscape.NodeSingular) => string);
+ opacity: number;
+ padding?: number;
+ shape: cytoscape.Css.NodeShape;
+ transitionDuration?: string;
+ transitionProperty?: string;
+ underlayColor?: string;
+ underlayOpacity?: number;
+ width: number;
+};
+
+export type CurveStyle =
+ | "haystack"
+ | "straight"
+ | "bezier"
+ | "unbundled-bezier"
+ | "segments"
+ | "taxi";
+
+export type EdgeStyle = {
+ color: string;
+ curveStyle: CurveStyle;
+ label?: string | ((edge: cytoscape.EdgeSingular) => string);
+ lineCap: "butt" | "round" | "square";
+ lineColor: string;
+ lineStyle: cytoscape.Css.LineStyle;
+ opacity: number;
+ sourceArrowColor: string;
+ sourceArrowShape: cytoscape.Css.ArrowShape;
+ targetArrowColor: string;
+ targetArrowShape: cytoscape.Css.ArrowShape;
+ taxiDirection?: string;
+ text: TextStyle;
+ transitionDuration?: string;
+ transitionProperty?: string;
+ visible: boolean;
+ width: number;
+ underlayOpacity?: number;
+ underlayColor?: string;
+ underlayPadding?: number;
+};
+
+export type CyEdgeStyle = CyTextStyle & {
+ background: string;
+ color: string;
+ curveStyle: CurveStyle;
+ display?: string;
+ fontSize: number;
+ label?: string | ((edge: cytoscape.EdgeSingular) => string);
+ lineCap: "butt" | "round" | "square";
+ lineColor: string;
+ lineStyle: cytoscape.Css.LineStyle;
+ opacity: number;
+ sourceArrowColor: string;
+ sourceArrowShape: cytoscape.Css.ArrowShape;
+ targetArrowColor: string;
+ targetArrowShape: cytoscape.Css.ArrowShape;
+ transitionDuration?: string;
+ transitionProperty?: string;
+ width: number;
+ underlayOpacity?: number;
+ underlayColor?: string;
+ underlayPadding?: number;
+};
diff --git a/packages/client/src/components/Graph/Graph.tsx b/packages/client/src/components/Graph/Graph.tsx
new file mode 100755
index 000000000..c743b5075
--- /dev/null
+++ b/packages/client/src/components/Graph/Graph.tsx
@@ -0,0 +1,410 @@
+import { css, cx } from "@emotion/css";
+import cytoscape from "cytoscape";
+import cyCanvas from "cytoscape-canvas";
+import d3Force from "cytoscape-d3-force";
+import dagre from "cytoscape-dagre";
+import fcose from "cytoscape-fcose";
+import klay from "cytoscape-klay";
+import {
+ ForwardedRef,
+ forwardRef,
+ memo,
+ useCallback,
+ useImperativeHandle,
+ useState,
+} from "react";
+import { withClassNamePrefix } from "../../core";
+import type {
+ Config,
+ CytoscapeType,
+ GraphEdge,
+ GraphNode,
+ Selection,
+} from "./Graph.model";
+import { runLayout } from "./helpers/layout";
+import type { UseAddClickEvents } from "./hooks/useAddClickEvents";
+import useAddClickEvents from "./hooks/useAddClickEvents";
+import type { BlastRadiusConfig } from "./hooks/useBlastRadius";
+import useBlastRadius from "./hooks/useBlastRadius";
+import type { ConnectionsFilterConfig } from "./hooks/useConnectionsFilter";
+import useConnectionsFilter from "./hooks/useConnectionsFilter";
+import useInitCytoscape from "./hooks/useInitCytoscape";
+import { useManageConfigChanges } from "./hooks/useManageConfigChanges";
+import useManageElementsLock from "./hooks/useManageElementsLock";
+import useManageElementsSelection from "./hooks/useManageElementsSelection";
+import useManageElementsVisibility from "./hooks/useManageElementsVisibility";
+import type { StyleSelector } from "./hooks/useManageStyles";
+import useManageStyles from "./hooks/useManageStyles";
+import type { BadgeRenderer } from "./hooks/useRenderBadges";
+import useRenderBadges from "./hooks/useRenderBadges";
+import useUpdateLayout from "./hooks/useRunLayout";
+import useUpdateGraphElements from "./hooks/useUpdateGraphElements";
+import EmptyState from "./internalComponents/EmptyState";
+import GraphLoading from "./internalComponents/GraphLoading";
+
+cytoscape.use(klay);
+cytoscape.use(dagre);
+cytoscape.use(d3Force);
+cytoscape.use(fcose);
+cyCanvas(cytoscape);
+
+const defaultStyles = (pfx: string) => css`
+ width: 100%;
+ height: 100%;
+ position: relative;
+ overflow: hidden;
+ .${pfx}-graph-container {
+ width: 100%;
+ height: 100%;
+ position: absolute;
+ > div:first-child {
+ // Allow to render layers below the main nodes/edges layer
+ // E.g. animation layer should be at the bottom
+ z-index: 10 !important;
+ }
+ }
+`;
+
+const EMPTY_SET = new Set();
+
+export type GraphRef = { cytoscape?: CytoscapeType; runLayout(): void };
+
+export interface GraphProps<
+ TNode extends object = any,
+ TEdge extends object = any
+> extends Config,
+ Selection,
+ Omit, "cy"> {
+ children?: (graphRef: CytoscapeType) => JSX.Element;
+ //Data inputs
+ nodes: GraphNode[];
+ edges: GraphEdge[];
+ //styling
+ className?: string;
+ classNamePrefix?: string;
+ styles?: {
+ [selector: string]: StyleSelector;
+ };
+ useAnimation?: boolean;
+ // internal state of the graph
+ layout?: string;
+ additionalLayoutsConfig?: { [key: string]: Partial };
+ loading?: boolean;
+ onLayoutUpdated?: (cy: CytoscapeType, layout: string) => any;
+ //callbacks
+ // TODO: Update callbacks type
+ onGraphClick?: (...args: any) => any;
+ onLayoutRunningChanged?: (...args: any) => any;
+ onZoomChanged?: (...args: any) => any;
+ onPanChanged?: (...args: any) => any;
+ //components
+ emptyComponent?: (...args: any) => any;
+ loadingComponent?: (...args: any) => any;
+ hiddenEdgesIds?: Set;
+ hiddenNodesIds?: Set;
+ outOfFocusNodesIds?: Set;
+ outOfFocusEdgesIds?: Set;
+ lockedNodesIds?: Set;
+ //property getters
+ /**
+ * Blast Radius Config will configure how the graph will visualize elements near a reference node (inside the blast
+ * radius) or far from any reference nodes (outside the blast radius).
+ * Elements inside the blast radius will get the "blast-radius-filter-in" class
+ * Elements outside the blast radius will get the "blast-radius-filter-out" class.
+ */
+ blastRadiusConfig?: BlastRadiusConfig;
+ /**
+ * Connection Filters will configure how the graph will visualize elements
+ * connected to a reference node.
+ * Elements with connections greater than or equal to the startValue
+ * or less than or equal to the endValue will get the "connections-filter-in" class
+ * Elements with connections less than or equal to the startValue
+ * or greater than or equal to the endValue will get the "connections-filter-out" class.
+ */
+ connectionsFilterConfig?: ConnectionsFilterConfig;
+ badgesEnabled?: boolean;
+ /**
+ * Allows to define as many node badges as needed
+ * @param node - node data
+ * @param boundingBox - actual node bounding box.
+ * - (x, y) coordinates are the top-left corner of square that contains the node
+ * @param context - CanvasRenderingContext2D allows to draw any figure into the badge canvas
+ */
+ getNodeBadges?: BadgeRenderer;
+ /**
+ * Allows to define as many group badges as needed
+ * @param group - node data
+ * @param boundingBox - actual node bounding box.
+ * - (x, y) coordinates are the top-left corner of square that contains the node
+ * @param context - CanvasRenderingContext2D allows to draw any figure into the badge canvas
+ */
+ getGroupBadges?: BadgeRenderer;
+ /**
+ * (Optional) Node Id set as primary
+ */
+ primaryNodeId?: string;
+ /**
+ * By default, if clicking on graph, nodes, or edges, the selection
+ * state change. If "disableSelectionEvents" is true, the selection is
+ * only managed by changes in "selectedNodesIds", "selectedEdgesIds", and
+ * "selectedGroupsIds".
+ * If "autounselectify" is true, all selection states will be disabled.
+ */
+ disableSelectionEvents?: boolean;
+
+ hideDefaultNodeLabels?: boolean;
+ defaultNodeLabelAttribute?: string;
+ hideDefaultEdgeLabels?: boolean;
+ defaultEdgeLabelAttribute?: string;
+ hideEdges?: boolean;
+}
+
+const DEFAULT_LAYOUT_CONFIG = {};
+
+export const Graph = (
+ {
+ primaryNodeId,
+ children,
+ nodes,
+ edges,
+ selectedNodesIds,
+ selectedEdgesIds,
+ selectedGroupsIds,
+ onSelectedNodesIdsChange,
+ onSelectedGroupsIdsChange,
+ onSelectedEdgesIdsChange,
+ className = "",
+ classNamePrefix = "ft",
+ styles,
+ onEdgeClick,
+ onEdgeRightClick,
+ onEdgeDoubleClick,
+ onNodeDoubleClick,
+ onNodeClick,
+ onNodeRightClick,
+ onGraphClick,
+ onGraphRightClick,
+ layout = "F_COSE",
+ badgesEnabled = false,
+ useAnimation = true,
+ pan,
+ additionalLayoutsConfig = DEFAULT_LAYOUT_CONFIG,
+ blastRadiusConfig,
+ connectionsFilterConfig,
+ onLayoutRunningChanged,
+ onLayoutUpdated,
+ emptyComponent,
+ loadingComponent,
+ loading = false,
+ minZoom = 0.01,
+ maxZoom = 5,
+ motionBlur = true,
+ hideEdgesOnViewport = false,
+ boxSelectionEnabled = true,
+ zoom = 1,
+ autounselectify = false,
+ autolock = false,
+ disableLockOnChange = false,
+ autoungrabify = false,
+ selectionType = "single",
+ userPanningEnabled = true,
+ userZoomingEnabled = true,
+ onZoomChanged,
+ onPanChanged,
+ hiddenNodesIds = EMPTY_SET,
+ hiddenEdgesIds = EMPTY_SET,
+ lockedNodesIds = EMPTY_SET,
+ outOfFocusNodesIds = EMPTY_SET,
+ outOfFocusEdgesIds = EMPTY_SET,
+ getNodeBadges,
+ getGroupBadges,
+ onGroupClick,
+ onGroupDoubleClick,
+ onNodeMouseDown,
+ onNodeMouseOver,
+ onNodeMouseOut,
+ onEdgeMouseOut,
+ onEdgeMouseOver,
+ disableSelectionEvents = false,
+ defaultNodeLabelAttribute,
+ hideDefaultNodeLabels = false,
+ defaultEdgeLabelAttribute,
+ hideDefaultEdgeLabels = false,
+ hideEdges,
+ }: GraphProps,
+ ref: ForwardedRef
+) => {
+ // capture wrapper via callbackRef so it triggers a re-render (and thus our cy mounting effect)
+ // https://reactjs.org/docs/hooks-faq.html#how-can-i-measure-a-dom-node
+ const [wrapper, setWrapper] = useState();
+ const wrapperRefCb = useCallback(domElement => setWrapper(domElement), []);
+ // init cytoscape instance and attach some events listeners
+ const cy = useInitCytoscape({
+ wrapper,
+ onLayoutRunningChanged,
+ onPanChanged,
+ onZoomChanged,
+ zoom,
+ minZoom,
+ pan,
+ maxZoom,
+ motionBlur,
+ hideEdgesOnViewport,
+ boxSelectionEnabled,
+ autounselectify,
+ autolock,
+ disableLockOnChange,
+ autoungrabify,
+ selectionType,
+ userPanningEnabled,
+ userZoomingEnabled,
+ });
+
+ const mounted = !!cy;
+
+ useManageConfigChanges(
+ {
+ minZoom,
+ maxZoom,
+ motionBlur,
+ hideEdgesOnViewport,
+ boxSelectionEnabled,
+ zoom,
+ autounselectify,
+ autolock,
+ autoungrabify,
+ selectionType,
+ userPanningEnabled,
+ userZoomingEnabled,
+ },
+ cy
+ );
+
+ // this hook return a different version number each time a node/edge is added or removed, it's used to trigger
+ // effects that need to run when the shape of the graph changes (like layouts)
+ const graphStructureVersion = useUpdateGraphElements({
+ cy,
+ nodes,
+ edges,
+ lockedNodesIds,
+ disableLockOnChange,
+ });
+
+ useManageElementsSelection(
+ {
+ cy,
+ selectedEdgesIds,
+ selectedNodesIds,
+ selectedGroupsIds,
+ onSelectedEdgesIdsChange,
+ onSelectedNodesIdsChange,
+ onSelectedGroupsIdsChange,
+ graphStructureVersion,
+ },
+ {
+ autounselectify,
+ disableSelectionEvents,
+ }
+ );
+
+ useManageElementsVisibility({
+ cy,
+ hiddenEdgesIds,
+ hiddenNodesIds,
+ outOfFocusNodesIds,
+ outOfFocusEdgesIds,
+ graphStructureVersion,
+ hideEdges,
+ });
+
+ useManageElementsLock({
+ cy,
+ autolock,
+ lockedNodesIds,
+ graphStructureVersion,
+ });
+
+ useManageStyles({
+ cy,
+ styles,
+ layout,
+ badgesEnabled,
+ defaultNodeLabelAttribute,
+ hideDefaultNodeLabels,
+ defaultEdgeLabelAttribute,
+ hideDefaultEdgeLabels,
+ });
+
+ useAddClickEvents({
+ cy,
+ onEdgeClick,
+ onEdgeDoubleClick,
+ onGraphClick,
+ onGraphRightClick,
+ onNodeClick,
+ onNodeDoubleClick,
+ onNodeRightClick,
+ onEdgeRightClick,
+ onGroupClick,
+ onGroupDoubleClick,
+ onNodeMouseDown,
+ onNodeMouseOver,
+ onNodeMouseOut,
+ onEdgeMouseOut,
+ onEdgeMouseOver,
+ });
+
+ useRenderBadges({
+ cy,
+ badgesEnabled,
+ mounted,
+ getNodeBadges,
+ getGroupBadges,
+ primaryNodeId,
+ });
+
+ useBlastRadius(graphStructureVersion, cy, blastRadiusConfig);
+ useConnectionsFilter(graphStructureVersion, cy, connectionsFilterConfig);
+
+ useUpdateLayout({
+ cy,
+ layout,
+ onLayoutUpdated,
+ useAnimation,
+ additionalLayoutsConfig,
+ graphStructureVersion,
+ mounted,
+ nodes,
+ });
+
+ useImperativeHandle(
+ ref,
+ () => ({
+ cytoscape: cy,
+ runLayout: () => {
+ if (!cy) {
+ return;
+ }
+ runLayout(cy, layout, additionalLayoutsConfig, true);
+ },
+ }),
+ [additionalLayoutsConfig, cy, layout]
+ );
+
+ const EmptyComponent = emptyComponent ? emptyComponent : EmptyState;
+ const LoadingComponent = loadingComponent ? loadingComponent : GraphLoading;
+
+ const pfx = withClassNamePrefix(classNamePrefix);
+ const isEmpty = !nodes.length && !edges.length;
+ const isLoading = loading;
+ return (
+
+
+ {cy && children ? children(cy) : null}
+ {isEmpty && !isLoading ?
: null}
+ {isLoading ?
: null}
+
+ );
+};
+
+export default memo(forwardRef(Graph));
diff --git a/packages/client/src/components/Graph/helpers/getNodeBoundingBox.ts b/packages/client/src/components/Graph/helpers/getNodeBoundingBox.ts
new file mode 100644
index 000000000..6eeb4753f
--- /dev/null
+++ b/packages/client/src/components/Graph/helpers/getNodeBoundingBox.ts
@@ -0,0 +1,18 @@
+import cytoscape from "cytoscape";
+
+const getNodeBoundingBox = (node: cytoscape.NodeSingular) => {
+ const { x1, y1, x2, y2 } = node.boundingbox({
+ includeEdges: false,
+ includeLabels: false,
+ includeOverlays: false,
+ });
+
+ return {
+ x: x1,
+ y: y1,
+ width: x2 - x1,
+ height: y2 - y1,
+ };
+};
+
+export default getNodeBoundingBox;
diff --git a/packages/client/src/components/Graph/helpers/getZoomLevel.ts b/packages/client/src/components/Graph/helpers/getZoomLevel.ts
new file mode 100644
index 000000000..1e5d63fce
--- /dev/null
+++ b/packages/client/src/components/Graph/helpers/getZoomLevel.ts
@@ -0,0 +1,21 @@
+import type { CytoscapeType } from "../Graph.model";
+
+const getZoomLevel = (cy?: CytoscapeType) => {
+ if (!cy) {
+ return "small";
+ }
+
+ const zoomRange = cy.maxZoom() - cy.minZoom();
+ const zoomLevel = cy.zoom() - cy.minZoom();
+
+ if (zoomLevel / zoomRange <= 0.15) {
+ return "small";
+ }
+ if (zoomLevel / zoomRange <= 0.35) {
+ return "medium";
+ }
+
+ return "large";
+};
+
+export default getZoomLevel;
diff --git a/packages/client/src/components/Graph/helpers/layout.ts b/packages/client/src/components/Graph/helpers/layout.ts
new file mode 100755
index 000000000..1d3a2611b
--- /dev/null
+++ b/packages/client/src/components/Graph/helpers/layout.ts
@@ -0,0 +1,48 @@
+import type { CytoscapeType } from "../Graph.model";
+import { availableLayoutsConfig } from "./layoutConfig";
+
+type ExpandedCytoscapeLayoutOptions = {
+ fixedNodeConstraint?: {
+ nodeId: string | number;
+ position: { x: number; y: number };
+ }[];
+};
+export const runLayout = (
+ cyReference: CytoscapeType,
+ layoutName: string,
+ additionalLayoutsConfig: {
+ [layoutName: string]: Partial<
+ cytoscape.LayoutOptions & ExpandedCytoscapeLayoutOptions
+ >;
+ } = {},
+ useAnimation = false
+) => {
+ const _layout = {
+ ...availableLayoutsConfig[layoutName],
+ ...additionalLayoutsConfig[layoutName],
+ };
+ if (_layout) {
+ // eslint-disable-next-line @typescript-eslint/ban-ts-comment
+ // @ts-ignore: Animate is not a cytoscape.LayoutOption. Need to check
+ _layout.animate = useAnimation;
+ if (layoutName === "F_COSE") {
+ // using the fixedNodeConstraint of the newer version of cytoscape-fcose to achieve a better relayout when
+ // there are locked nodes
+ const nodesToRunLayout = cyReference.nodes("[!__isGroupNode]:locked");
+ _layout.fixedNodeConstraint = nodesToRunLayout.map(node => ({
+ nodeId: node.data().id,
+ position: node.position(),
+ }));
+ }
+ const layout = cyReference.layout(_layout);
+ layout.run();
+ return;
+ }
+
+ throw new Error(
+ "Layout configuration not found, if you are using a custom layout make sure to pass down the" +
+ " layout configuration through the additionalLayouts Prop "
+ );
+};
+
+export const graphLayouts = Object.keys(availableLayoutsConfig);
diff --git a/packages/client/src/components/Graph/helpers/layoutConfig.ts b/packages/client/src/components/Graph/helpers/layoutConfig.ts
new file mode 100644
index 000000000..3fc002a2d
--- /dev/null
+++ b/packages/client/src/components/Graph/helpers/layoutConfig.ts
@@ -0,0 +1,305 @@
+import cytoscape from "cytoscape";
+
+export const concentricLayout = {
+ name: "concentric",
+
+ fit: true, // whether to fit the viewport to the graph
+ padding: 50, // the padding on fit
+ startAngle: 0, // where nodes start in radians
+ sweep: undefined, // how many radians should be between the first and last node (defaults to full circle)
+ clockwise: true, // whether the layout should go clockwise (true) or counterclockwise/anticlockwise (false)
+ equidistant: false, // whether levels have an equal radial distance betwen them, may cause bounding box overflow
+ minNodeSpacing: 10, // min spacing between outside of nodes (used for radius adjustment)
+ boundingBox: undefined, // constrain layout bounds; { x1, y1, x2, y2 } or { x1, y1, w, h }
+ avoidOverlap: true, // prevents node overlap, may overflow boundingBox if not enough space
+ /*
+ Excludes the label when calculating node bounding boxes for the layout algorithm
+ */
+ nodeDimensionsIncludeLabels: false,
+ height: undefined, // height of layout area (overrides container height)
+ width: undefined, // width of layout area (overrides container width)
+ // Applies a multiplicative factor (>0) to expand or compress the overall area that the nodes take up
+ spacingFactor: 1.5,
+ concentric: function (node: cytoscape.NodeSingular) {
+ // returns numeric value for each node, placing higher nodes in levels towards the centre
+ return node.degree(false);
+ },
+ levelWidth: function () {
+ return 1;
+ },
+ animate: true, // whether to transition the node positions
+ animationDuration: 300, // duration of animation in ms if enabled
+ animationEasing: undefined, // easing of animation if enabled
+ /*
+ a function that determines whether the node should be animated. All nodes animated by default on animate enabled.
+ Non-animated nodes are positioned immediately when the layout starts
+ */
+ animateFilter: function () {
+ return true;
+ },
+ ready: undefined, // callback on layoutready
+ stop: undefined, // callback on layoutstop
+ transform: function (_node: cytoscape.NodeSingular, position: unknown) {
+ return position;
+ }, // transform a given node position. Useful for changing flow direction in discrete layouts
+};
+
+export const dagreLayoutHorizontal = {
+ name: "dagre",
+
+ // dagre algo options, uses default value on undefined
+ nodeSep: 130, // the separation between adjacent nodes in the same rank
+ edgeSep: 10, // the separation between adjacent edges in the same rank
+ rankSep: 70, // the separation between adjacent nodes in the same rank
+ rankDir: "TB", // 'TB' for top to bottom flow, 'LR' for left to right,
+ /*
+ Type of algorithm to assign a rank to each node in the Input graph. Possible values: 'network-simplex',
+ 'tight-tree' or 'longest-path'
+ */
+ ranker: undefined,
+ minLen: function () {
+ return 1;
+ }, // number of ranks to keep between the source and target of the edge
+ edgeWeight: function () {
+ return 1;
+ }, // higher weight edges are generally made shorter and straighter than lower weight edges
+
+ // general layout options
+ fit: true, // whether to fit to viewport
+ padding: 100, // fit padding
+ // Applies a multiplicative factor (>0) to expand or compress the overall area that the nodes take up
+ spacingFactor: undefined,
+ nodeDimensionsIncludeLabels: false, // whether labels should be included in determining the space used by a node
+ animate: true, // whether to transition the node positions
+ // whether to animate specific nodes when animation is on; non-animated nodes immediately go to their final positions
+ animateFilter: function () {
+ return true;
+ },
+ animationDuration: 500, // duration of animation in ms if enabled
+ animationEasing: undefined, // easing of animation if enabled
+ boundingBox: undefined, // constrain layout bounds; { x1, y1, x2, y2 } or { x1, y1, w, h }
+ transform: function (_node: cytoscape.NodeSingular, position: unknown) {
+ return position;
+ }, // a function that applies a transform to the final node position
+ // ready: function () {}, // on layoutready
+ // stop: function () {}, // on layoutstop
+};
+
+export const dagreLayoutVertical = {
+ ...dagreLayoutHorizontal,
+ rankDir: "LR",
+};
+
+export const subwayLayoutHorizontal = {
+ name: "dagre",
+
+ // dagre algo options, uses default value on undefined
+ nodeSep: 100, // the separation between adjacent nodes in the same rank
+ edgeSep: 10, // the separation between adjacent edges in the same rank
+ rankSep: 120, // the separation between adjacent nodes in the same rank
+ rankDir: "TB", // 'BT' bottom top, 'TB' for top to bottom flow, 'LR' for left to right,
+ ranker: "tight-tree", // Type of algorithm to assign a rank to each node in the Input graph. Possible values: 'network-simplex', 'tight-tree' or 'longest-path'
+ minLen: function () {
+ return 1;
+ }, // number of ranks to keep between the source and target of the edge
+ edgeWeight: function () {
+ return 1;
+ }, // higher weight edges are generally made shorter and straighter than lower weight edges
+
+ // general layout options
+ fit: true, // whether to fit to viewport
+ padding: 30, // fit padding
+ spacingFactor: undefined, // Applies a multiplicative factor (>0) to expand or compress the overall area that the nodes take up
+ nodeDimensionsIncludeLabels: false, // whether labels should be included in determining the space used by a node
+ animate: true, // whether to transition the node positions
+ animateFilter: function () {
+ return true;
+ }, // whether to animate specific nodes when animation is on; non-animated nodes immediately go to their final positions
+ animationDuration: 500, // duration of animation in ms if enabled
+ animationEasing: undefined, // easing of animation if enabled
+ boundingBox: undefined, // constrain layout bounds; { x1, y1, x2, y2 } or { x1, y1, w, h }
+ transform: function (_node: cytoscape.NodeSingular, position: unknown) {
+ return position;
+ }, // a function that applies a transform to the final node position
+ // ready: function () {}, // on layoutready
+ // stop: function () {}, // on layoutstop
+};
+
+export const subwayLayoutVertical = {
+ ...subwayLayoutHorizontal,
+ rankDir: "LR",
+};
+
+const d3force = {
+ name: "d3-force",
+ animate: "end",
+ padding: 60,
+ alphaMin: 0.3,
+ ungrabifyWhileSimulating: true,
+ fit: true,
+ linkId: function id(d: { id: unknown }) {
+ return d.id;
+ },
+ linkDistance: 200,
+ manyBodyStrength: -600,
+ collideRadius: 2,
+ manyBodyDistanceMin: 20,
+ // ready: function () {},
+ // stop: function () {},
+ // tick: function (progress: any) {},
+ randomize: false,
+ infinite: false,
+};
+
+const cose = {
+ name: "fcose",
+ // 'draft', 'default' or 'proof'
+ // - "draft" only applies spectral layout
+ // - "default" improves the quality with incremental layout (fast cooling rate)
+ // - "proof" improves the quality with incremental layout (slow cooling rate)
+ quality: "default",
+ // Use random node positions at beginning of layout
+ // if this is set to false, then quality option must be "proof"
+ randomize: true,
+ // Type of layout animation. The option set is {'during', 'end', false}
+ animate: "end",
+ // Duration of animation in ms, if enabled
+ animationDuration: 400,
+ // Easing of animation, if enabled
+ animationEasing: undefined,
+ // Fit the viewport to the repositioned nodes
+ fit: true,
+ // Padding around layout
+ padding: 30,
+ animationThreshold: 200,
+ // number of ticks per frame; higher is faster but more jerky
+ refresh: 1,
+ // Whether to include labels in node dimensions. Valid in "proof" quality
+ nodeDimensionsIncludeLabels: false,
+ // Whether or not simple nodes (non-compound nodes) are of uniform dimensions
+ uniformNodeDimensions: false,
+ // Whether to pack disconnected components - valid only if randomize: true
+ packComponents: true,
+
+ /* spectral layout options */
+
+ // False for random, true for greedy sampling
+ samplingType: false,
+ // Sample size to construct distance matrix
+ sampleSize: 50,
+ // Separation amount between nodes
+ nodeSeparation: 1000,
+ // Power iteration tolerance
+ piTol: 0.0000001,
+
+ /* incremental layout options */
+
+ // Node repulsion (non overlapping) multiplier
+ nodeRepulsion: 4500,
+ // Ideal edge (non nested) length
+ idealEdgeLength: 100,
+ // Divisor to compute edge forces
+ edgeElasticity: 0.55,
+ // Nesting factor (multiplier) to compute ideal edge length for nested edges
+ nestingFactor: 0.1,
+ // Maximum number of iterations to perform
+ numIter: 2500,
+ // For enabling tiling
+ tile: true,
+ /*
+ Represents the amount of the vertical space to put between the zero degree members during the tiling
+ operation(can also be a function)
+ */
+ tilingPaddingVertical: 20,
+ /*
+ Represents the amount of the horizontal space to put between the zero degree members during the tiling
+ operation(can also be a function)
+ */
+ tilingPaddingHorizontal: 20,
+ // Gravity force (constant)
+ gravity: 0.25,
+ // Gravity range (constant) for compounds
+ gravityRangeCompound: 1.5,
+ // Gravity force (constant) for compounds
+ gravityCompound: 1.0,
+ // Gravity range (constant)
+ gravityRange: 2,
+ // Initial cooling factor for incremental layout
+ initialEnergyOnIncremental: 1,
+};
+
+const klayLayout = {
+ name: "klay",
+ nodeDimensionsIncludeLabels: false, // Boolean which changes whether label dimensions are included when calculating node dimensions
+ fit: true, // Whether to fit
+ padding: 20, // Padding on fit
+ animate: true, // Whether to transition the node positions
+ animateFilter: function () {
+ return true;
+ }, // Whether to animate specific nodes when animation is on; non-animated nodes immediately go to their final positions
+ animationDuration: 200, // Duration of animation in ms if enabled
+ animationEasing: undefined, // Easing of animation if enabled
+ transform: function (_node: cytoscape.NodeSingular, position: unknown) {
+ return position;
+ }, // A function that applies a transform to the final node position
+ ready: undefined, // Callback on layoutready
+ stop: undefined, // Callback on layoutstop
+ klay: {
+ // Following descriptions taken from http://layout.rtsys.informatik.uni-kiel.de:9444/Providedlayout.html?algorithm=de.cau.cs.kieler.klay.layered
+ addUnnecessaryBendpoints: true, // Adds bend points even if an edge does not change direction.
+ aspectRatio: 1.6, // The aimed aspect ratio of the drawing, that is the quotient of width by height
+ borderSpacing: 20, // Minimal amount of space to be left to the border
+ compactComponents: false, // Tries to further compact components (disconnected sub-graphs).
+ crossingMinimization: "LAYER_SWEEP", // Strategy for crossing minimization.
+ /* LAYER_SWEEP The layer sweep algorithm iterates multiple times over the layers, trying to find node orderings that minimize the number of crossings. The algorithm uses randomization to increase the odds of finding a good result. To improve its results, consider increasing the Thoroughness option, which influences the number of iterations done. The Randomization seed also influences results.
+ INTERACTIVE Orders the nodes of each layer by comparing their positions before the layout algorithm was started. The idea is that the relative order of nodes as it was before layout was applied is not changed. This of course requires valid positions for all nodes to have been set on the Input graph before calling the layout algorithm. The interactive layer sweep algorithm uses the Interactive Reference Point option to determine which reference point of nodes are used to compare positions. */
+ cycleBreaking: "GREEDY", // Strategy for cycle breaking. Cycle breaking looks for cycles in the graph and determines which edges to reverse to break the cycles. Reversed edges will end up pointing to the opposite direction of regular edges (that is, reversed edges will point left if edges usually point right).
+ /* GREEDY This algorithm reverses edges greedily. The algorithm tries to avoid edges that have the Priority property set.
+ INTERACTIVE The interactive algorithm tries to reverse edges that already pointed leftwards in the Input graph. This requires node and port coordinates to have been set to sensible values.*/
+ direction: "RIGHT", // Overall direction of edges: horizontal (right / left) or vertical (down / up)
+ /* UNDEFINED, RIGHT, LEFT, DOWN, UP */
+ edgeRouting: "ORTHOGONAL", // Defines how edges are routed (POLYLINE, ORTHOGONAL, SPLINES)
+ edgeSpacingFactor: 0.5, // Factor by which the object spacing is multiplied to arrive at the minimal spacing between edges.
+ feedbackEdges: false, // Whether feedback edges should be highlighted by routing around the nodes.
+ fixedAlignment: "NONE", // Tells the BK node placer to use a certain alignment instead of taking the optimal result. This option should usually be left alone.
+ /* NONE Chooses the smallest layout from the four possible candidates.
+ LEFTUP Chooses the left-up candidate from the four possible candidates.
+ RIGHTUP Chooses the right-up candidate from the four possible candidates.
+ LEFTDOWN Chooses the left-down candidate from the four possible candidates.
+ RIGHTDOWN Chooses the right-down candidate from the four possible candidates.
+ BALANCED Creates a balanced layout from the four possible candidates. */
+ inLayerSpacingFactor: 1.0, // Factor by which the usual spacing is multiplied to determine the in-layer spacing between objects.
+ layoutHierarchy: false, // Whether the selected layouter should consider the full hierarchy
+ linearSegmentsDeflectionDampening: 0.3, // Dampens the movement of nodes to keep the diagram from getting too large.
+ mergeEdges: false, // Edges that have no ports are merged so they touch the connected nodes at the same points.
+ mergeHierarchyCrossingEdges: true, // If hierarchical layout is active, hierarchy-crossing edges use as few hierarchical ports as possible.
+ nodeLayering: "NETWORK_SIMPLEX", // Strategy for node layering.
+ /* NETWORK_SIMPLEX This algorithm tries to minimize the length of edges. This is the most computationally intensive algorithm. The number of iterations after which it aborts if it hasn't found a result yet can be set with the Maximal Iterations option.
+ LONGEST_PATH A very simple algorithm that distributes nodes along their longest path to a sink node.
+ INTERACTIVE Distributes the nodes into layers by comparing their positions before the layout algorithm was started. The idea is that the relative horizontal order of nodes as it was before layout was applied is not changed. This of course requires valid positions for all nodes to have been set on the Input graph before calling the layout algorithm. The interactive node layering algorithm uses the Interactive Reference Point option to determine which reference point of nodes are used to compare positions. */
+ nodePlacement: "LINEAR_SEGMENTS", // Strategy for Node Placement
+ /* BRANDES_KOEPF Minimizes the number of edge bends at the expense of diagram size: diagrams drawn with this algorithm are usually higher than diagrams drawn with other algorithms.
+ LINEAR_SEGMENTS Computes a balanced placement.
+ INTERACTIVE Tries to keep the preset y coordinates of nodes from the original layout. For dummy nodes, a guess is made to infer their coordinates. Requires the other interactive phase implementations to have run as well.
+ SIMPLE Minimizes the area at the expense of... well, pretty much everything else. */
+ randomizationSeed: 1, // Seed used for pseudo-random number generators to control the layout algorithm; 0 means a new seed is generated
+ routeSelfLoopInside: false, // Whether a self-loop is routed around or inside its node.
+ separateConnectedComponents: true, // Whether each connected component should be processed separately
+ spacing: 64, // Overall setting for the minimal amount of space to be left between objects
+ thoroughness: 7, // How much effort should be spent to produce a nice layout..
+ },
+ priority: function () {
+ return null;
+ }, // Edges with a non-nil value are skipped when greedy edge cycle breaking is enabled
+};
+
+export const availableLayoutsConfig: Record = {
+ CONCENTRIC: concentricLayout,
+ DAGRE_HORIZONTAL: dagreLayoutHorizontal,
+ DAGRE_VERTICAL: dagreLayoutVertical,
+ F_COSE: cose,
+ D3: d3force,
+ KLAY: klayLayout,
+ SUBWAY_HORIZONTAL: subwayLayoutHorizontal,
+ SUBWAY_VERTICAL: subwayLayoutVertical,
+};
diff --git a/packages/client/src/components/Graph/hooks/useAddClickEvents.ts b/packages/client/src/components/Graph/hooks/useAddClickEvents.ts
new file mode 100755
index 000000000..cc9c5d3d0
--- /dev/null
+++ b/packages/client/src/components/Graph/hooks/useAddClickEvents.ts
@@ -0,0 +1,282 @@
+import cytoscape from "cytoscape";
+import { useEffect, useRef } from "react";
+
+import { CytoscapeType } from "../Graph.model";
+
+export type Position = {
+ top: number;
+ left: number;
+};
+
+export type BoundingRect = {
+ top: number;
+ left: number;
+ width: number;
+ height: number;
+};
+
+export type GraphEventCallback = (
+ event: cytoscape.EventObject,
+ position: Position
+) => void;
+
+export type ElementEventCallback = (
+ event: cytoscape.EventObject,
+ element: TElement,
+ bounds: BoundingRect
+) => void;
+
+type GroupElementEventCallback = (
+ event: cytoscape.EventObject,
+ node: TNode,
+ children: TNode[],
+ bounds: BoundingRect
+) => void;
+
+export interface UseAddClickEvents<
+ TNode extends object = any,
+ TEdge extends object = any
+> {
+ cy?: CytoscapeType;
+ // Graph events
+ onGraphClick?: GraphEventCallback;
+ onGraphRightClick?: GraphEventCallback;
+
+ // Node events
+ onNodeClick?: ElementEventCallback;
+ onNodeDoubleClick?: ElementEventCallback;
+ onNodeRightClick?: ElementEventCallback;
+ onNodeMouseOver?: ElementEventCallback;
+ onNodeMouseOut?: ElementEventCallback;
+ onNodeMouseDown?: ElementEventCallback;
+
+ // Edge events
+ onEdgeClick?: ElementEventCallback;
+ onEdgeMouseOver?: ElementEventCallback;
+ onEdgeMouseOut?: ElementEventCallback;
+ onEdgeRightClick?: ElementEventCallback;
+ onEdgeDoubleClick?: ElementEventCallback;
+
+ // Group events
+ onGroupClick?: GroupElementEventCallback;
+ onGroupDoubleClick?: GroupElementEventCallback;
+}
+
+const DOUBLE_CLICK_DELAY_MS = 200;
+
+const useAddClickEvents = ({
+ cy,
+ onGraphClick,
+ onGraphRightClick,
+ onNodeClick,
+ onEdgeClick,
+ onNodeDoubleClick,
+ onNodeRightClick,
+ onEdgeDoubleClick,
+ onEdgeRightClick,
+ onGroupClick,
+ onGroupDoubleClick,
+ onNodeMouseOver,
+ onNodeMouseOut,
+ onNodeMouseDown,
+ onEdgeMouseOut,
+ onEdgeMouseOver,
+}: UseAddClickEvents) => {
+ const lastTapTimestamp = useRef(0);
+
+ useEffect(() => {
+ if (!cy) {
+ return;
+ }
+
+ const handleDoubleTap = (event: cytoscape.EventObject) => {
+ if (
+ lastTapTimestamp.current + DOUBLE_CLICK_DELAY_MS >=
+ new Date().getTime()
+ ) {
+ event.target.trigger("doubleTap", event);
+ return;
+ }
+
+ lastTapTimestamp.current = new Date().getTime();
+ };
+
+ cy.on("tap", handleDoubleTap);
+
+ return () => {
+ cy.off("tap", handleDoubleTap);
+ };
+ }, [cy]);
+
+ useEffect(() => {
+ if (!cy) {
+ return;
+ }
+
+ const withMousePosition = (
+ e: cytoscape.EventObject,
+ cb?: GraphEventCallback
+ ) => {
+ if (!cb) {
+ return;
+ }
+
+ const { clientY, clientX } = e.originalEvent;
+ cb(e, { top: clientY, left: clientX });
+ };
+
+ const withElementAndBounds = (
+ e: cytoscape.EventObject,
+ cb?: ElementEventCallback
+ ) => {
+ if (!cb) {
+ return;
+ }
+
+ const { x1, y1, x2, y2 } = e.target.renderedBoundingBox({
+ includeEdges: false,
+ includeLabels: false,
+ includeOverlays: false,
+ });
+
+ cb(e, e.target.data(), {
+ top: y1,
+ left: x1,
+ width: x2 - x1,
+ height: y2 - y1,
+ });
+ };
+
+ const withGroupElementAndBounds = (
+ e: cytoscape.EventObject,
+ cb?: GroupElementEventCallback
+ ) => {
+ if (!cb) {
+ return;
+ }
+
+ const { x1, y1, x2, y2 } = e.target.renderedBoundingBox({
+ includeEdges: false,
+ includeLabels: false,
+ includeOverlays: false,
+ });
+
+ const groupElement = e.target as cytoscape.CollectionReturnValue;
+ cb(
+ e,
+ e.target.data(),
+ groupElement
+ .children()
+ .nodes()
+ .toArray()
+ .map(node => node.data()),
+ {
+ top: y1,
+ left: x1,
+ width: x2 - x1,
+ height: y2 - y1,
+ }
+ );
+ };
+
+ const handleOnGraphClick = (e: cytoscape.EventObject) =>
+ withMousePosition(e, onGraphClick);
+ const handleOnGraphRightClick = (e: cytoscape.EventObject) =>
+ withMousePosition(e, onGraphRightClick);
+ const handleOnNodeClick = (e: cytoscape.EventObject) =>
+ withElementAndBounds(e, onNodeClick);
+ const handleOnNodeMouseOver = (e: cytoscape.EventObject) =>
+ withElementAndBounds(e, onNodeMouseOver);
+ const handleOnNodeMouseOut = (e: cytoscape.EventObject) =>
+ withElementAndBounds(e, onNodeMouseOut);
+ const handleOnNodeMouseDown = (e: cytoscape.EventObject) =>
+ withElementAndBounds(e, onNodeMouseDown);
+ const handleOnNodeDoubleClick = (e: cytoscape.EventObject) =>
+ withElementAndBounds(e, onNodeDoubleClick);
+ const handleOnNodeRightClick = (e: cytoscape.EventObject) =>
+ withElementAndBounds(e, onNodeRightClick);
+
+ const handleOnEdgeClick = (e: cytoscape.EventObject) =>
+ withElementAndBounds(e, onEdgeClick);
+ const handleOnEdgeRightClick = (e: cytoscape.EventObject) =>
+ withElementAndBounds(e, onEdgeRightClick);
+ const handleOnEdgeDoubleClick = (e: cytoscape.EventObject) =>
+ withElementAndBounds(e, onEdgeDoubleClick);
+ const handleOnEdgeMouseOver = (e: cytoscape.EventObject) =>
+ withElementAndBounds(e, onEdgeMouseOver);
+ const handleOnEdgeMouseOut = (e: cytoscape.EventObject) =>
+ withElementAndBounds(e, onEdgeMouseOut);
+ const handleOnGroupClick = (e: cytoscape.EventObject) =>
+ withGroupElementAndBounds(e, onGroupClick);
+ const handleOnGroupDoubleClick = (e: cytoscape.EventObject) =>
+ withGroupElementAndBounds(e, onGroupDoubleClick);
+
+ // Graph events
+ cy.on("tap", handleOnGraphClick);
+ cy.on("cxttap", handleOnGraphRightClick);
+
+ // Node events
+ cy.on("tap", "node[!__isGroupNode]", handleOnNodeClick);
+ cy.on("tapstart", "node[!__isGroupNode]", handleOnNodeMouseDown);
+ cy.on("doubleTap", "node[!__isGroupNode]", handleOnNodeDoubleClick);
+ cy.on("cxttap", "node[!__isGroupNode]", handleOnNodeRightClick);
+ cy.on("mouseover", "node[!__isGroupNode]", handleOnNodeMouseOver);
+ cy.on("mouseout", "node[!__isGroupNode]", handleOnNodeMouseOut);
+
+ // Edge events
+ cy.on("tap", "edge", handleOnEdgeClick);
+ cy.on("cxttap", "edge", handleOnEdgeRightClick);
+ cy.on("doubleTap", "edge", handleOnEdgeDoubleClick);
+ cy.on("mouseover", "edge", handleOnEdgeMouseOver);
+ cy.on("mouseout", "edge", handleOnEdgeMouseOut);
+
+ // Group events
+ onGroupClick && cy.on("tap", "node[?__isGroupNode]", handleOnGroupClick);
+ onGroupDoubleClick &&
+ cy.on("doubleTap", "node[?__isGroupNode]", handleOnGroupDoubleClick);
+ return () => {
+ // Graph events
+ cy.off("tap", handleOnGraphClick);
+ cy.off("cxttap", handleOnGraphRightClick);
+
+ // Node events
+ cy.off("tap", "node[!__isGroupNode]", handleOnNodeClick);
+ cy.off("tapstart", "node[!__isGroupNode]", handleOnNodeMouseDown);
+ cy.off("doubleTap", "node[!__isGroupNode]", handleOnNodeDoubleClick);
+ cy.off("cxttap", "node[!__isGroupNode]", handleOnNodeRightClick);
+ cy.off("mouseover", "node[!__isGroupNode]", handleOnNodeMouseOver);
+ cy.off("mouseout", "node[!__isGroupNode]", handleOnNodeMouseOut);
+
+ // Edge events
+ cy.off("tap", "edge", handleOnEdgeClick);
+ cy.off("cxttap", "edge", handleOnEdgeRightClick);
+ cy.off("doubleTap", "edge", handleOnEdgeDoubleClick);
+ cy.off("mouseover", "edge", handleOnEdgeMouseOver);
+ cy.off("mouseout", "edge", handleOnGroupClick);
+
+ // Group events
+ onGroupClick && cy.off("tap", "node[?__isGroupNode]", handleOnGroupClick);
+ onGroupDoubleClick &&
+ cy.off("doubleTap", "node[?__isGroupNode]", handleOnGroupDoubleClick);
+ };
+ }, [
+ cy,
+ onNodeDoubleClick,
+ onNodeRightClick,
+ onEdgeClick,
+ onNodeClick,
+ onEdgeDoubleClick,
+ onGroupDoubleClick,
+ onNodeMouseOver,
+ onNodeMouseOut,
+ onGraphClick,
+ onNodeMouseDown,
+ onEdgeMouseOver,
+ onEdgeMouseOut,
+ onGraphRightClick,
+ onGroupClick,
+ onEdgeRightClick,
+ ]);
+};
+
+export default useAddClickEvents;
diff --git a/packages/client/src/components/Graph/hooks/useBlastRadius.ts b/packages/client/src/components/Graph/hooks/useBlastRadius.ts
new file mode 100644
index 000000000..d62699089
--- /dev/null
+++ b/packages/client/src/components/Graph/hooks/useBlastRadius.ts
@@ -0,0 +1,72 @@
+import { useCallback } from "react";
+import type { CytoscapeType } from "../Graph.model";
+import useFilter from "./useFilter";
+
+export type BlastRadiusConfig = {
+ isActive?: boolean;
+ numHops?: number;
+ referenceNodeIds?: string[];
+ referenceEdgeIds?: string[];
+};
+
+const useBlastRadius = (
+ graphStructureVersion: number,
+ cy?: CytoscapeType,
+ {
+ numHops = 3,
+ isActive = true,
+ referenceNodeIds,
+ referenceEdgeIds,
+ }: BlastRadiusConfig = {}
+): void => {
+ const applyFilter = useCallback(
+ (cy: CytoscapeType) => {
+ const elementsInRadius = cy.collection();
+
+ if (!referenceNodeIds?.length && referenceEdgeIds?.length) {
+ referenceEdgeIds.forEach(edgeId => {
+ const edge = cy.getElementById(edgeId);
+ const sourceNode = edge.source();
+ const targetNode = edge.target();
+ elementsInRadius.merge(sourceNode).merge(targetNode).merge(edge);
+ });
+
+ return elementsInRadius;
+ }
+
+ if (numHops <= 0 || !referenceNodeIds?.length) {
+ return null;
+ }
+
+ referenceNodeIds.forEach(nodeId => {
+ cy.elements().breadthFirstSearch({
+ root: cy.getElementById(nodeId),
+ visit: (node, edge, _pn, _i, depth) => {
+ if (depth > numHops) {
+ return false; // stop searching when we go out of depth
+ }
+
+ // Add node and edge to list
+ elementsInRadius.merge(node);
+ if (edge) {
+ elementsInRadius.merge(edge);
+ }
+ },
+ });
+ });
+
+ return elementsInRadius;
+ },
+ [referenceNodeIds, referenceEdgeIds, numHops]
+ );
+
+ useFilter({
+ cy,
+ graphStructureVersion,
+ isFilterActive: isActive,
+ applyFilter,
+ filterClassPrefix: "blast-radius-filter",
+ });
+};
+
+export default useBlastRadius;
diff --git a/packages/client/src/components/Graph/hooks/useClickAndHold.ts b/packages/client/src/components/Graph/hooks/useClickAndHold.ts
new file mode 100644
index 000000000..1ce544fb1
--- /dev/null
+++ b/packages/client/src/components/Graph/hooks/useClickAndHold.ts
@@ -0,0 +1,44 @@
+import { useCallback, useRef } from "react";
+
+// eslint-disable-next-line @typescript-eslint/no-empty-function
+const NOOP = () => {};
+
+const useClickAndHold = (effect = NOOP) => {
+ const isHeld = useRef(false);
+ const effectFn = useRef<() => void>();
+ effectFn.current = effect;
+
+ const runEffect = useCallback(() => {
+ effectFn.current?.();
+ }, []);
+
+ const checkLoop = useCallback(() => {
+ if (isHeld.current) {
+ runEffect();
+ setTimeout(() => {
+ checkLoop();
+ }, 25);
+ }
+ }, [runEffect]);
+
+ const onMouseDown = useCallback(() => {
+ isHeld.current = true;
+ checkLoop();
+ }, [checkLoop]);
+
+ const onMouseUp = useCallback(() => {
+ isHeld.current = false;
+ }, []);
+
+ const onMouseLeave = useCallback(() => {
+ isHeld.current = false;
+ }, []);
+
+ return {
+ onPressStart: onMouseDown,
+ onPressEnd: onMouseUp,
+ onMouseLeave,
+ };
+};
+
+export default useClickAndHold;
diff --git a/packages/client/src/components/Graph/hooks/useConnectionsFilter.ts b/packages/client/src/components/Graph/hooks/useConnectionsFilter.ts
new file mode 100644
index 000000000..3cfde47d5
--- /dev/null
+++ b/packages/client/src/components/Graph/hooks/useConnectionsFilter.ts
@@ -0,0 +1,60 @@
+import { useCallback } from "react";
+import type { CytoscapeType } from "../Graph.model";
+import useFilter from "./useFilter";
+
+export type ConnectionsFilterConfig = {
+ numConnections?: [number, number];
+ isActive?: boolean;
+ min?: number;
+ max?: number;
+};
+
+const DEFAULT_VALUE = [3, 100] as [number, number];
+
+const useConnectionsFilter = (
+ graphStructureVersion: number,
+ cy?: CytoscapeType,
+ {
+ numConnections = DEFAULT_VALUE,
+ min = 0,
+ max = Number.MAX_SAFE_INTEGER,
+ isActive = false,
+ }: ConnectionsFilterConfig = {}
+): void => {
+ const applyFilter = useCallback(
+ (cy: CytoscapeType) => {
+ if (numConnections[0] < min) {
+ return null;
+ }
+
+ const elementsWithinCutoff = cy.collection();
+
+ cy.$("node[!__isGroupNode]:childless")
+ .nodes()
+ .filter(node => {
+ if (
+ numConnections[0] <= node.degree(false) &&
+ (numConnections[1] >= max ||
+ node.degree(false) <= numConnections[1])
+ ) {
+ elementsWithinCutoff.merge(node);
+ return true;
+ }
+ return false;
+ });
+
+ return elementsWithinCutoff;
+ },
+ [numConnections, min, max]
+ );
+
+ useFilter({
+ graphStructureVersion,
+ cy,
+ isFilterActive: isActive,
+ applyFilter,
+ filterClassPrefix: "connections-filter",
+ });
+};
+
+export default useConnectionsFilter;
diff --git a/packages/client/src/components/Graph/hooks/useFilter.ts b/packages/client/src/components/Graph/hooks/useFilter.ts
new file mode 100644
index 000000000..74b5435e9
--- /dev/null
+++ b/packages/client/src/components/Graph/hooks/useFilter.ts
@@ -0,0 +1,91 @@
+import cytoscape from "cytoscape";
+import { useEffect } from "react";
+import type { CytoscapeType } from "../Graph.model";
+
+export type UseFilterOptions = {
+ /**
+ * The Cytoscape instance
+ */
+ cy: CytoscapeType | undefined;
+ /**
+ * A version number changed every time the set of graph elements changes.
+ */
+ graphStructureVersion: number;
+ /**
+ * Enabled or disable the filter.
+ */
+ isFilterActive: boolean;
+ /**
+ * The prefix that will be used for setting classes on elements included and
+ * excluded via the filter.
+ * Classes will be `${filterClassPrefix}-in` for
+ * included elements and `${filterClassPrefix}-out` for excluded elements.
+ */
+ filterClassPrefix: string;
+ /**
+ * Returns the list of entities to apply the filter
+ */
+ applyFilter(cy: CytoscapeType): cytoscape.CollectionReturnValue | null;
+};
+
+export default function useFilter({
+ cy,
+ isFilterActive,
+ filterClassPrefix,
+ graphStructureVersion,
+ applyFilter,
+}: UseFilterOptions) {
+ useEffect(() => {
+ const inClass = `${filterClassPrefix}-in`;
+ const outClass = `${filterClassPrefix}-out`;
+
+ cy?.batch(() => {
+ // Reset this filter's styling on all affected elements upfront,
+ // so that new styles can be applied appropriately
+ cy.elements(`.${inClass}`).removeClass(inClass);
+ cy.elements(`.${outClass}`).removeClass(outClass);
+
+ // If this filter isn't selected, then we can stop work here. Thus any
+ // applied styles will have been removed
+ if (!isFilterActive) {
+ return;
+ }
+
+ // Run the configured filter function and get the included elements. If
+ // this function returns false, then we encountered a condition within that
+ // has caused filtering to be skipped, so work stops there
+ const includedElements = applyFilter(cy);
+ if (!includedElements) {
+ return;
+ }
+
+ // Get the edges connected to the initial set of included nodes, then
+ // merge them into the set of included elements as appropriate
+ const includedElementsEdges = includedElements.connectedEdges();
+
+ includedElementsEdges.forEach((edgeElement: cytoscape.EdgeSingular) => {
+ const connectedNodes = edgeElement.connectedNodes();
+
+ if (includedElements.contains(connectedNodes)) {
+ includedElements.merge(edgeElement);
+ }
+ });
+
+ // Get all excluded nodes as the absolute complement of the included nodes PLUS
+ // any group nodes which should be considered completely unrelated to any filter operations
+ const excludedElements = includedElements
+ .union(cy.nodes("[?__isGroupNode]"))
+ .absoluteComplement();
+
+ // Apply all styling, including the defined filter effect
+ includedElements.addClass(inClass);
+ excludedElements.addClass(outClass);
+ });
+ }, [
+ cy,
+ graphStructureVersion,
+ filterClassPrefix,
+ applyFilter,
+ isFilterActive,
+ ]);
+}
diff --git a/packages/client/src/components/Graph/hooks/useGraphControls.ts b/packages/client/src/components/Graph/hooks/useGraphControls.ts
new file mode 100644
index 000000000..e6117a42e
--- /dev/null
+++ b/packages/client/src/components/Graph/hooks/useGraphControls.ts
@@ -0,0 +1,58 @@
+import { useCallback } from "react";
+
+import { CytoscapeType } from "../Graph.model";
+// Exposes common graph ui actions
+// Zoom, Fit, Center
+export const useGraphControls = (graph: CytoscapeType) => {
+ const increaseGraphZoom = useCallback(() => {
+ const current = graph.zoom();
+ graph.zoom(current + 0.015);
+ }, [graph]);
+
+ const decreaseGraphZoom = useCallback(() => {
+ const current = graph.zoom();
+ graph.zoom(current - 0.015);
+ }, [graph]);
+
+ const fitGraph = useCallback(() => {
+ graph.fit(graph.elements());
+ }, [graph]);
+
+ const centerGraph = useCallback(() => {
+ graph.center(graph.elements());
+ }, [graph]);
+
+ const centerSelectedElements = useCallback(() => {
+ graph.center(graph.elements(":selected"));
+ }, [graph]);
+
+ const exportGraphImage = useCallback(() => {
+ const imageBlob: Blob & {
+ lastModifiedDate?: Date;
+ name?: string;
+ } = graph.png({ output: "blob", full: true });
+ imageBlob.lastModifiedDate = new Date();
+ imageBlob.name = "GraphImage.png";
+ const a = document.createElement("a");
+ document.body.appendChild(a);
+ a.style.display = "none";
+
+ const url = window.URL.createObjectURL(imageBlob);
+ a.href = url;
+ a.download = "Graph.png";
+ a.click();
+ window.URL.revokeObjectURL(url);
+ a.remove();
+ }, [graph]);
+
+ return {
+ decreaseGraphZoom,
+ increaseGraphZoom,
+ fitGraph,
+ centerGraph,
+ centerSelectedElements,
+ exportGraphImage,
+ };
+};
+
+export default useGraphControls;
diff --git a/packages/client/src/components/Graph/hooks/useInitCytoscape.tsx b/packages/client/src/components/Graph/hooks/useInitCytoscape.tsx
new file mode 100644
index 000000000..19ba5af4e
--- /dev/null
+++ b/packages/client/src/components/Graph/hooks/useInitCytoscape.tsx
@@ -0,0 +1,111 @@
+import cytoscape from "cytoscape";
+import debounce from "lodash/debounce";
+import { useEffect, useRef, useState } from "react";
+
+import { GraphProps } from "../Graph";
+import { Config, CytoscapeType } from "../Graph.model";
+
+export interface UseInitCytoscapeProps
+ extends Required<
+ Pick>
+ > {
+ wrapper?: HTMLElement;
+ minZoom?: number;
+ maxZoom?: number;
+ pan?: { x: number; y: number };
+ onLayoutRunningChanged?: (isRunning: boolean) => void;
+ onZoomChanged?: (e: unknown) => void;
+ onPanChanged?: (e: unknown) => void;
+}
+
+const useInitCytoscape = ({
+ wrapper,
+ onLayoutRunningChanged,
+ onPanChanged,
+ onZoomChanged,
+ ...config
+}: UseInitCytoscapeProps) => {
+ const [cy, setCy] = useState();
+
+ const { autolock, userZoomingEnabled, userPanningEnabled } = config;
+ const layoutGraphConfig = useRef({
+ autolock,
+ userZoomingEnabled,
+ userPanningEnabled,
+ });
+
+ // holds the event handlers so we do not need to keep re-attaching them
+ const eventHandlerRefs = useRef({
+ onLayoutRunningChanged,
+ onPanChanged,
+ onZoomChanged,
+ });
+
+ useEffect(() => {
+ eventHandlerRefs.current = {
+ onLayoutRunningChanged,
+ onPanChanged,
+ onZoomChanged,
+ };
+ }, [onLayoutRunningChanged, onPanChanged, onZoomChanged]);
+
+ useEffect(() => {
+ layoutGraphConfig.current = {
+ autolock,
+ userZoomingEnabled,
+ userPanningEnabled,
+ };
+ }, [autolock, userZoomingEnabled, userPanningEnabled]);
+
+ useEffect(() => {
+ if (wrapper) {
+ const cy = cytoscape({
+ container: wrapper,
+ style: [],
+ ...config,
+ });
+
+ cy.on("layoutstart", () => {
+ cy.userPanningEnabled(false);
+ cy.userZoomingEnabled(false);
+ eventHandlerRefs.current.onLayoutRunningChanged?.(true);
+ });
+
+ cy.on("layoutstop", () => {
+ cy.userPanningEnabled(layoutGraphConfig.current.userPanningEnabled);
+ cy.userZoomingEnabled(layoutGraphConfig.current.userZoomingEnabled);
+ if (layoutGraphConfig.current.autolock) {
+ cy.nodes().lock();
+ }
+ eventHandlerRefs.current.onLayoutRunningChanged?.(false);
+ });
+
+ // Avoid to notify every single change during animation
+ const debouncedZoom = debounce(() => {
+ eventHandlerRefs.current.onZoomChanged?.(cy.zoom());
+ }, 100);
+ cy.on("zoom", debouncedZoom);
+
+ const debouncedPan = debounce(() => {
+ eventHandlerRefs.current.onPanChanged?.(cy.pan());
+ }, 100);
+ cy.on("pan", debouncedPan);
+
+ setCy(cy);
+
+ return () => {
+ (cy.elements() as any).removeAllListeners();
+ (cy as any).removeAllListeners();
+ cy.destroy();
+ cy.unmount();
+ setCy(undefined);
+ };
+ }
+ // since this is to init cytoscape, this should only run when wrapper is set
+ // eslint-disable-next-line react-hooks/exhaustive-deps
+ }, [wrapper]);
+
+ return cy;
+};
+
+export default useInitCytoscape;
diff --git a/packages/client/src/components/Graph/hooks/useManageConfigChanges.ts b/packages/client/src/components/Graph/hooks/useManageConfigChanges.ts
new file mode 100755
index 000000000..1e189fa54
--- /dev/null
+++ b/packages/client/src/components/Graph/hooks/useManageConfigChanges.ts
@@ -0,0 +1,85 @@
+import { useEffect, useRef } from "react";
+import type { Config, CytoscapeType } from "../Graph.model";
+
+function useChangeConfig(
+ cy?: CytoscapeType,
+ configValue?: unknown,
+ configFnName?: keyof CytoscapeType,
+ compareFn: (oldValue?: any, newValue?: any) => boolean = (
+ oldValue,
+ newValue
+ ) => oldValue !== newValue
+) {
+ const compare = useRef(compareFn);
+
+ useEffect(() => {
+ if (cy && configFnName && configValue !== undefined) {
+ if (compare.current((cy[configFnName] as () => void)(), configValue)) {
+ (cy[configFnName] as (...args: any[]) => void)(configValue);
+ }
+ }
+ }, [cy, configFnName, configValue]);
+}
+
+export const useManageConfigChanges = (config: Config, cy?: CytoscapeType) => {
+ const {
+ minZoom,
+ maxZoom,
+ boxSelectionEnabled,
+ zoom,
+ pan,
+ autounselectify,
+ autolock,
+ autoungrabify,
+ selectionType,
+ userPanningEnabled,
+ userZoomingEnabled,
+ } = config;
+
+ useEffect(() => {
+ if (cy && cy.zoom() !== zoom) {
+ cy.zoom(zoom);
+ }
+ }, [cy, zoom]);
+
+ useEffect(() => {
+ if (cy && minZoom !== undefined && cy.minZoom() !== minZoom) {
+ cy.minZoom(minZoom);
+ }
+
+ if (cy && maxZoom !== undefined && cy.maxZoom() !== maxZoom) {
+ cy.maxZoom(maxZoom);
+ }
+
+ if (cy && minZoom !== undefined && zoom !== undefined && zoom < minZoom) {
+ cy.zoom(minZoom);
+ }
+
+ if (cy && maxZoom !== undefined && zoom !== undefined && zoom > maxZoom) {
+ cy.zoom(maxZoom);
+ }
+ }, [cy, zoom, minZoom, maxZoom]);
+
+ useEffect(() => {
+ if (cy) {
+ //lock nodes instead of using cy.autolock(autolock) to allow layout to run on newly added nodes before locking
+ autolock ? cy.nodes().lock() : cy.nodes().unlock();
+ }
+ }, [autolock, cy]);
+
+ useChangeConfig(cy, boxSelectionEnabled, "boxSelectionEnabled");
+ useChangeConfig(
+ cy,
+ pan,
+ "pan",
+ (oldValue, newValue) =>
+ oldValue &&
+ newValue &&
+ (oldValue.x !== newValue.x || oldValue.y !== newValue.y)
+ );
+ useChangeConfig(cy, autounselectify, "autounselectify");
+ useChangeConfig(cy, autoungrabify, "autoungrabify");
+ useChangeConfig(cy, selectionType, "selectionType");
+ useChangeConfig(cy, userPanningEnabled, "userPanningEnabled");
+ useChangeConfig(cy, userZoomingEnabled, "userZoomingEnabled");
+};
diff --git a/packages/client/src/components/Graph/hooks/useManageElementsLock.ts b/packages/client/src/components/Graph/hooks/useManageElementsLock.ts
new file mode 100755
index 000000000..137219475
--- /dev/null
+++ b/packages/client/src/components/Graph/hooks/useManageElementsLock.ts
@@ -0,0 +1,35 @@
+import { useEffect } from "react";
+import type { CytoscapeType } from "../Graph.model";
+
+interface UseManageElementsSelection {
+ cy?: CytoscapeType;
+ autolock?: boolean;
+ lockedNodesIds: Set;
+ graphStructureVersion: number;
+}
+
+export default function useManageElementsLock({
+ cy,
+ autolock,
+ lockedNodesIds,
+ graphStructureVersion,
+}: UseManageElementsSelection) {
+ useEffect(() => {
+ if (!cy || autolock) {
+ return;
+ }
+
+ cy.batch(() => {
+ cy.nodes().forEach(node => {
+ const id = node.data("id");
+ if (lockedNodesIds.has(id)) {
+ node.lock();
+ node.addClass("locked");
+ } else {
+ node.unlock();
+ node.removeClass("locked");
+ }
+ });
+ });
+ }, [autolock, cy, lockedNodesIds, graphStructureVersion]);
+}
diff --git a/packages/client/src/components/Graph/hooks/useManageElementsSelection.ts b/packages/client/src/components/Graph/hooks/useManageElementsSelection.ts
new file mode 100755
index 000000000..bc7c0d40c
--- /dev/null
+++ b/packages/client/src/components/Graph/hooks/useManageElementsSelection.ts
@@ -0,0 +1,183 @@
+import debounce from "lodash/debounce";
+import differenceBy from "lodash/differenceBy";
+import { useEffect, useMemo, useRef } from "react";
+
+import { CytoscapeType, Selection } from "../Graph.model";
+
+interface UseManageElementsSelection extends Selection {
+ cy?: CytoscapeType;
+ graphStructureVersion: number;
+}
+
+type Handlers = Pick<
+ Selection,
+ | "onSelectedNodesIdsChange"
+ | "onSelectedEdgesIdsChange"
+ | "onSelectedGroupsIdsChange"
+>;
+
+type Options = {
+ autounselectify?: boolean;
+ disableSelectionEvents?: boolean;
+};
+
+const useEntitySelection = (
+ cy: CytoscapeType | undefined,
+ selector: string,
+ ids: Array | Set,
+ isSelectionDisabled?: boolean
+) => {
+ useEffect(() => {
+ if (!cy) {
+ return;
+ }
+
+ const arrayOfIds = Array.isArray(ids) ? ids : Array.from(ids);
+ if (isSelectionDisabled) {
+ cy.autounselectify(false);
+ }
+ cy.batch(() => {
+ const cyRefSelectedEntities = cy.$(selector);
+ const cyRefSelectedEntitiesIds = cyRefSelectedEntities.map(
+ p => p.data().id
+ );
+
+ const unSelectedEntities = differenceBy(
+ cyRefSelectedEntitiesIds,
+ arrayOfIds
+ );
+ // TODO: Determine what is going on with our id with Cytoscape selectors.
+ // When using an id which is simply a json string, these fail to Select
+ // appropriate nodes
+ unSelectedEntities.forEach(id => {
+ const entity = cy.getElementById(id);
+ entity.unselect();
+ });
+
+ // TODO: Determine what is going on with our id with Cytoscape selectors.
+ // When using an id which is simply a json string, these fail to Select
+ // appropriate nodes
+ arrayOfIds.forEach(id => {
+ const entity = cy.getElementById(id);
+ if (!entity.selected()) {
+ entity.select();
+ }
+ });
+ });
+ if (isSelectionDisabled) {
+ cy.autounselectify(true);
+ }
+ }, [cy, ids, isSelectionDisabled, selector]);
+};
+
+export default function useManageElementsSelection(
+ {
+ cy,
+ selectedNodesIds = [],
+ selectedEdgesIds = [],
+ selectedGroupsIds = [],
+ onSelectedNodesIdsChange,
+ onSelectedEdgesIdsChange,
+ onSelectedGroupsIdsChange,
+ }: UseManageElementsSelection,
+ options?: Options
+) {
+ const isSelectionDisabled = useMemo(() => {
+ return options?.disableSelectionEvents || !!options?.autounselectify;
+ }, [options?.autounselectify, options?.disableSelectionEvents]);
+
+ // Init cytoscape Select and unselect event handlers
+ const handlers = useRef({
+ onSelectedEdgesIdsChange,
+ onSelectedGroupsIdsChange,
+ onSelectedNodesIdsChange,
+ });
+
+ useEffect(() => {
+ if (!cy) {
+ return;
+ }
+
+ if (
+ cy.autounselectify() &&
+ !options?.disableSelectionEvents &&
+ !options?.autounselectify
+ ) {
+ cy.autounselectify(false);
+ }
+ }, [cy, options?.autounselectify, options?.disableSelectionEvents]);
+
+ useEffect(() => {
+ if (!cy) return;
+
+ // cy.on("Select unselect", ...) is called once by element selected/unselected.
+ // These debounce functions avoid repeatedly call once by element.
+ const debouncedNodeSelection = debounce(() => {
+ const selectedNodes = cy.$("node:selected[!__isGroupNode]");
+ const selectedNodesIds = selectedNodes.map(p => p.data().id);
+ if (handlers.current.onSelectedNodesIdsChange) {
+ handlers.current.onSelectedNodesIdsChange(selectedNodesIds);
+ }
+ }, 0);
+ cy.on("select unselect", "node[!__isGroupNode]", debouncedNodeSelection);
+
+ const debouncedGroupSelection = debounce(() => {
+ const selectedGroups = cy.$("node:selected[?__isGroupNode]");
+ const selectedGroupsIds: string[] = [];
+ let selectedNodesIds: string[] = [];
+ cy.batch(() => {
+ selectedGroups.forEach(group => {
+ selectedGroupsIds.push(group.data().id);
+ const visibleChildren = group.children(":visible").nodes();
+ selectedNodesIds = visibleChildren.map(node => node.data().id);
+ visibleChildren.select();
+ });
+ });
+ if (handlers.current.onSelectedGroupsIdsChange) {
+ handlers.current.onSelectedGroupsIdsChange(
+ selectedGroupsIds,
+ selectedNodesIds
+ );
+ }
+ }, 0);
+ cy.on("select unselect", "node[?__isGroupNode]", debouncedGroupSelection);
+
+ // handle edge selection
+ const debouncedEdgeSelection = debounce(() => {
+ const selectedEdges = cy.$("edge:selected");
+ const selectedEdgesIds = selectedEdges.map(p => p.data().id);
+ if (handlers.current.onSelectedEdgesIdsChange)
+ handlers.current.onSelectedEdgesIdsChange(selectedEdgesIds);
+ }, 0);
+ cy.on("select unselect", "edge", debouncedEdgeSelection);
+
+ return () => {
+ cy.off("select unselect", "node[!__isGroupNode]", debouncedNodeSelection);
+ cy.off(
+ "select unselect",
+ "node[?__isGroupNode]",
+ debouncedGroupSelection
+ );
+ cy.off("select unselect", "edge", debouncedEdgeSelection);
+ };
+ }, [cy]);
+
+ useEntitySelection(
+ cy,
+ "node:selected[!__isGroupNode]",
+ selectedNodesIds,
+ isSelectionDisabled
+ );
+ useEntitySelection(
+ cy,
+ "node:selected[?__isGroupNode]",
+ selectedGroupsIds,
+ isSelectionDisabled
+ );
+ useEntitySelection(
+ cy,
+ "edge:selected",
+ selectedEdgesIds,
+ isSelectionDisabled
+ );
+}
diff --git a/packages/client/src/components/Graph/hooks/useManageElementsVisibility.ts b/packages/client/src/components/Graph/hooks/useManageElementsVisibility.ts
new file mode 100755
index 000000000..c39370ed4
--- /dev/null
+++ b/packages/client/src/components/Graph/hooks/useManageElementsVisibility.ts
@@ -0,0 +1,95 @@
+import type { CollectionReturnValue } from "cytoscape";
+import { useEffect, useRef } from "react";
+import type { CytoscapeType } from "../Graph.model";
+
+interface UseManageElementsSelection {
+ cy?: CytoscapeType;
+ hiddenEdgesIds: Set;
+ hiddenNodesIds: Set