From addd3063677475830168ef4e1812aceafb66f1ae Mon Sep 17 00:00:00 2001 From: Dmytro Holub Date: Wed, 22 Mar 2023 12:08:38 +0100 Subject: [PATCH 01/31] some test --- .gitignore | 1 - 1 file changed, 1 deletion(-) diff --git a/.gitignore b/.gitignore index 1302549..e639f4e 100755 --- a/.gitignore +++ b/.gitignore @@ -1,6 +1,5 @@ .venv .idea -.vscode .mypy_cache docker-stack.yml frontent/node_modules From 25a63581639d12424bf2e2ff21a67f6273d033c0 Mon Sep 17 00:00:00 2001 From: Dmytro Holub Date: Wed, 22 Mar 2023 12:11:53 +0100 Subject: [PATCH 02/31] another test --- .gitignore | 1 - 1 file changed, 1 deletion(-) diff --git a/.gitignore b/.gitignore index e639f4e..b1c44e6 100755 --- a/.gitignore +++ b/.gitignore @@ -1,5 +1,4 @@ .venv .idea -.mypy_cache docker-stack.yml frontent/node_modules From 3cc8249ff795ce71d2631116d967616a2c718ce8 Mon Sep 17 00:00:00 2001 From: Dmytro Holub Date: Wed, 22 Mar 2023 12:19:07 +0100 Subject: [PATCH 03/31] another test --- .gitignore | 1 - 1 file changed, 1 deletion(-) diff --git a/.gitignore b/.gitignore index b1c44e6..f2c6566 100755 --- a/.gitignore +++ b/.gitignore @@ -1,4 +1,3 @@ .venv .idea -docker-stack.yml frontent/node_modules From 75a193cea43a0245fd564699a9dcd3b3b6202e6e Mon Sep 17 00:00:00 2001 From: Dmytro Holub Date: Wed, 22 Mar 2023 12:24:32 +0100 Subject: [PATCH 04/31] remove gitlab --- .gitlab-ci.yml | 94 -------------------------------------------------- 1 file changed, 94 deletions(-) delete mode 100644 .gitlab-ci.yml diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml deleted file mode 100644 index 80894f5..0000000 --- a/.gitlab-ci.yml +++ /dev/null @@ -1,94 +0,0 @@ -stages: - - test - -before_script: - - mkdir ~/.ssh - - echo "$SSH_PRIVATE_KEY" > ~/.ssh/id_rsa - - chmod 600 ~/.ssh/id_rsa - - ssh-keyscan -H mongodb.tech >> ~/.ssh/known_hosts - -black: - stage: test - image: tiangolo/uvicorn-gunicorn-fastapi:python3.9 - script: - - pip install black - - black backend/app/app - after_script: - - ./get-updated-badge.sh black - - scp black-badges.json ubuntu@mongodb.tech:mongodb/badges/black.json -bandit: - stage: test - image: tiangolo/uvicorn-gunicorn-fastapi:python3.9 - script: - - pip install bandit - - bandit backend/app/app - after_script: - - ./get-updated-badge.sh bandit - - scp bandit-badges.json ubuntu@mongodb.tech:mongodb/badges/bandit.json - -isort: - stage: test - image: tiangolo/uvicorn-gunicorn-fastapi:python3.9 - script: - - pip install isort - - isort backend/app/app - after_script: - - ./get-updated-badge.sh isort - - scp isort-badges.json ubuntu@mongodb.tech:mongodb/badges/isort.json - -flake8: - stage: test - image: tiangolo/uvicorn-gunicorn-fastapi:python3.9 - script: - - pip install flake8 - - flake8 backend/app/app - after_script: - - ./get-updated-badge.sh flake8 - - scp flake8-badges.json ubuntu@mongodb.tech:mongodb/badges/flake8.json - -mypy: - stage: test - image: tiangolo/uvicorn-gunicorn-fastapi:python3.9 - script: - - pip install mypy - - mypy backend/app/app - after_script: - - ./get-updated-badge.sh mypy - - scp mypy-badges.json ubuntu@mongodb.tech:mongodb/badges/mypy.json - -pytest: - stage: test - image: tiangolo/uvicorn-gunicorn-fastapi:python3.9 - variables: - PROJECT_NAME: "app.mongodb.tech" - SERVER_NAME: localhost - SERVER_HOST: "http://localhost" - FIRST_SUPERUSER: "admin@app.mongodb.tech" - FIRST_SUPERUSER_PASSWORD: 99d3b1f01aa639e4a76f4fc281fc834747a543720ba4c8a8648ba755aef9be7f - EMAIL_TEMPLATES_DIR: "email-templates/build" - before_script: - - cd ./backend/app - - python3.9 -m venv venv - - source ./venv/bin/activate - script: - - pip install pytest pytest-cov poetry - - poetry install - - cd ./app - - rm backend_pre_start.py - - rm tests_pre_start.py - - rm celeryworker_pre_start.py - - rm core/celery_app.py - - rm db/base.py - - rm db/init_db.py - - rm helpers.py - - rm initial_data.py - - rm worker.py - - python3.9 -m pytest --cov=app --cov-report=term --cov-report=html tests . - - coverage report - - coverage html - coverage: '/^TOTAL.+?(\d+\%)$/' - artifacts: - when: always - paths: - - ./backend/app/app/htmlcov - expire_in: 14 days From 00077f771976b13c1768a57fd5e61840446d8792 Mon Sep 17 00:00:00 2001 From: Dmytro Holub Date: Wed, 29 Mar 2023 23:18:43 +0200 Subject: [PATCH 05/31] id #78 update --- .env | 36 - .env.local | 33 + .env.prod | 30 + .env.stage | 30 + .vscode/extensions.json | 5 + .vscode/launch.json | 18 + backend/app/app/api/api_v1/endpoints/login.py | 99 +- backend/app/app/api/api_v1/endpoints/users.py | 104 +- backend/app/app/api/deps.py | 13 +- backend/app/app/core/config.py | 5 +- backend/app/app/crud/__init__.py | 1 + backend/app/app/crud/base.py | 62 +- backend/app/app/crud/crud_confirm.py | 18 + backend/app/app/crud/crud_user.py | 61 +- backend/app/app/db/init_db.py | 15 +- backend/app/app/db/session.py | 6 +- .../email-templates/build/reset_password.html | 290 +- .../app/email-templates/build/welcome.html | 264 + .../app/app/email-templates/src/button.mjml | 9 + .../app/email-templates/src/button_reset.mjml | 9 + .../app/app/email-templates/src/image.mjml | 9 + .../email-templates/src/reset_password.mjml | 40 +- .../app/app/email-templates/src/social.mjml | 14 + .../app/app/email-templates/src/style.mjml | 69 + .../app/email-templates/src/test_email.mjml | 11 - .../app/app/email-templates/src/welcome.mjml | 21 + backend/app/app/libs/__init__.py | 0 backend/app/app/libs/error.py | 10 + backend/app/app/main.py | 38 +- backend/app/app/models/__init__.py | 1 + backend/app/app/models/confirm.py | 12 + backend/app/app/models/user.py | 1 + backend/app/app/schemas/__init__.py | 1 + backend/app/app/schemas/base.py | 8 + backend/app/app/schemas/confirm.py | 39 + backend/app/app/schemas/user.py | 13 +- backend/app/app/utils.py | 46 +- backend/app/poetry.lock | 159 +- backend/app/pyproject.toml | 5 +- frontend/package-lock.json | 13769 ++-------------- frontend/package.json | 29 +- frontend/public/favicon.ico | Bin 3870 -> 946 bytes frontend/public/index.html | 2 +- frontend/public/logo192.png | Bin 5347 -> 0 bytes frontend/public/logo512.png | Bin 9664 -> 0 bytes frontend/public/manifest.json | 17 - frontend/src/App.css | 38 - frontend/src/App.js | 25 - frontend/src/App.test.js | 8 - frontend/src/assets/css/ionicons.min.css | 11 + frontend/src/assets/fonts/ionicons.eot | Bin 0 -> 112650 bytes frontend/src/assets/fonts/ionicons.svg | 2090 +++ frontend/src/assets/fonts/ionicons.ttf | Bin 0 -> 112472 bytes frontend/src/assets/fonts/ionicons.woff | Bin 0 -> 65908 bytes frontend/src/assets/fonts/ionicons.woff2 | Bin 0 -> 50556 bytes frontend/src/assets/scss/base/_base.scss | 3 + frontend/src/assets/scss/base/_common.scss | 167 + frontend/src/assets/scss/base/_import.scss | 1 + .../src/assets/scss/base/_typography.scss | 8 + frontend/src/assets/scss/layout/_header.scss | 274 + frontend/src/assets/scss/layout/_layout.scss | 1 + frontend/src/assets/scss/module/_error.scss | 25 + .../src/assets/scss/module/_form-access.scss | 56 + .../src/assets/scss/module/_market-book.scss | 152 + .../assets/scss/module/_market-history.scss | 39 + .../src/assets/scss/module/_market-news.scss | 40 + .../src/assets/scss/module/_market-order.scss | 26 + .../src/assets/scss/module/_market-pairs.scss | 83 + .../src/assets/scss/module/_market-trade.scss | 120 + frontend/src/assets/scss/module/_markets.scss | 209 + frontend/src/assets/scss/module/_module.scss | 11 + .../src/assets/scss/module/_settings.scss | 236 + .../src/assets/scss/module/_tradingview.scss | 12 + frontend/src/assets/scss/style.scss | 41 + frontend/src/assets/scss/theme/_dark.scss | 419 + .../src/assets/scss/theme/_responsive.scss | 105 + frontend/src/assets/scss/theme/_theme.scss | 2 + frontend/src/components/Googel.js | 27 + frontend/src/components/Header.js | 91 + frontend/src/components/HeaderAuth.js | 9 + frontend/src/components/HistoryOrder.js | 76 + frontend/src/components/Layout.js | 39 + frontend/src/components/LayoutAuth.js | 27 + frontend/src/components/Pagination.js | 26 + frontend/src/components/pages/auth/check.js | 15 + frontend/src/components/pages/auth/forgot.js | 30 + .../src/components/pages/auth/inactive.js | 16 + frontend/src/components/pages/auth/lock.js | 28 + frontend/src/components/pages/auth/login.js | 48 + .../src/components/pages/auth/otp-number.js | 31 + .../src/components/pages/auth/otp-verify.js | 27 + frontend/src/components/pages/auth/reset.js | 34 + frontend/src/components/pages/auth/signup.js | 73 + frontend/src/components/pages/notadmin.js | 10 + frontend/src/components/pages/profile.js | 80 + frontend/src/components/pages/users/form.js | 78 + frontend/src/components/pages/users/list.js | 49 + frontend/src/context/ThemeContext.js | 8 + frontend/src/hocs/withToken.js | 16 + frontend/src/index.css | 13 - frontend/src/index.js | 50 +- frontend/src/logo.svg | 1 - frontend/src/pages/auth/check.js | 4 + frontend/src/pages/auth/forgot.js | 26 + frontend/src/pages/auth/inactive.js | 21 + frontend/src/pages/auth/login.js | 44 + frontend/src/pages/auth/reset.js | 48 + frontend/src/pages/auth/signup.js | 54 + frontend/src/pages/dashboard.js | 32 + frontend/src/pages/start.js | 34 + frontend/src/pages/users/edit.js | 76 + frontend/src/pages/users/index.js | 49 + frontend/src/pages/users/new.js | 40 + frontend/src/reportWebVitals.js | 13 - frontend/src/services/api.js | 134 + frontend/src/services/const.js | 2 + frontend/src/services/token.js | 13 + frontend/src/setupTests.js | 5 - frontend/src/store.js | 9 + frontend/src/user.js | 27 + frontend/src/utils.js | 54 + 121 files changed, 8796 insertions(+), 12415 deletions(-) delete mode 100644 .env create mode 100644 .env.local create mode 100644 .env.prod create mode 100644 .env.stage create mode 100644 .vscode/extensions.json create mode 100644 .vscode/launch.json create mode 100644 backend/app/app/crud/crud_confirm.py create mode 100644 backend/app/app/email-templates/build/welcome.html create mode 100644 backend/app/app/email-templates/src/button.mjml create mode 100644 backend/app/app/email-templates/src/button_reset.mjml create mode 100644 backend/app/app/email-templates/src/image.mjml create mode 100644 backend/app/app/email-templates/src/social.mjml create mode 100644 backend/app/app/email-templates/src/style.mjml delete mode 100644 backend/app/app/email-templates/src/test_email.mjml create mode 100644 backend/app/app/email-templates/src/welcome.mjml create mode 100644 backend/app/app/libs/__init__.py create mode 100644 backend/app/app/libs/error.py create mode 100755 backend/app/app/models/confirm.py create mode 100644 backend/app/app/schemas/base.py create mode 100644 backend/app/app/schemas/confirm.py delete mode 100644 frontend/public/logo192.png delete mode 100644 frontend/public/logo512.png delete mode 100644 frontend/src/App.css delete mode 100644 frontend/src/App.js delete mode 100644 frontend/src/App.test.js create mode 100644 frontend/src/assets/css/ionicons.min.css create mode 100644 frontend/src/assets/fonts/ionicons.eot create mode 100644 frontend/src/assets/fonts/ionicons.svg create mode 100644 frontend/src/assets/fonts/ionicons.ttf create mode 100644 frontend/src/assets/fonts/ionicons.woff create mode 100644 frontend/src/assets/fonts/ionicons.woff2 create mode 100644 frontend/src/assets/scss/base/_base.scss create mode 100644 frontend/src/assets/scss/base/_common.scss create mode 100644 frontend/src/assets/scss/base/_import.scss create mode 100644 frontend/src/assets/scss/base/_typography.scss create mode 100644 frontend/src/assets/scss/layout/_header.scss create mode 100644 frontend/src/assets/scss/layout/_layout.scss create mode 100644 frontend/src/assets/scss/module/_error.scss create mode 100644 frontend/src/assets/scss/module/_form-access.scss create mode 100644 frontend/src/assets/scss/module/_market-book.scss create mode 100644 frontend/src/assets/scss/module/_market-history.scss create mode 100644 frontend/src/assets/scss/module/_market-news.scss create mode 100644 frontend/src/assets/scss/module/_market-order.scss create mode 100644 frontend/src/assets/scss/module/_market-pairs.scss create mode 100644 frontend/src/assets/scss/module/_market-trade.scss create mode 100644 frontend/src/assets/scss/module/_markets.scss create mode 100644 frontend/src/assets/scss/module/_module.scss create mode 100644 frontend/src/assets/scss/module/_settings.scss create mode 100644 frontend/src/assets/scss/module/_tradingview.scss create mode 100644 frontend/src/assets/scss/style.scss create mode 100644 frontend/src/assets/scss/theme/_dark.scss create mode 100644 frontend/src/assets/scss/theme/_responsive.scss create mode 100644 frontend/src/assets/scss/theme/_theme.scss create mode 100644 frontend/src/components/Googel.js create mode 100644 frontend/src/components/Header.js create mode 100644 frontend/src/components/HeaderAuth.js create mode 100644 frontend/src/components/HistoryOrder.js create mode 100644 frontend/src/components/Layout.js create mode 100644 frontend/src/components/LayoutAuth.js create mode 100644 frontend/src/components/Pagination.js create mode 100644 frontend/src/components/pages/auth/check.js create mode 100644 frontend/src/components/pages/auth/forgot.js create mode 100644 frontend/src/components/pages/auth/inactive.js create mode 100644 frontend/src/components/pages/auth/lock.js create mode 100644 frontend/src/components/pages/auth/login.js create mode 100644 frontend/src/components/pages/auth/otp-number.js create mode 100644 frontend/src/components/pages/auth/otp-verify.js create mode 100644 frontend/src/components/pages/auth/reset.js create mode 100644 frontend/src/components/pages/auth/signup.js create mode 100644 frontend/src/components/pages/notadmin.js create mode 100644 frontend/src/components/pages/profile.js create mode 100644 frontend/src/components/pages/users/form.js create mode 100644 frontend/src/components/pages/users/list.js create mode 100644 frontend/src/context/ThemeContext.js create mode 100644 frontend/src/hocs/withToken.js delete mode 100644 frontend/src/index.css delete mode 100644 frontend/src/logo.svg create mode 100644 frontend/src/pages/auth/check.js create mode 100644 frontend/src/pages/auth/forgot.js create mode 100644 frontend/src/pages/auth/inactive.js create mode 100644 frontend/src/pages/auth/login.js create mode 100644 frontend/src/pages/auth/reset.js create mode 100644 frontend/src/pages/auth/signup.js create mode 100644 frontend/src/pages/dashboard.js create mode 100644 frontend/src/pages/start.js create mode 100644 frontend/src/pages/users/edit.js create mode 100644 frontend/src/pages/users/index.js create mode 100644 frontend/src/pages/users/new.js delete mode 100644 frontend/src/reportWebVitals.js create mode 100644 frontend/src/services/api.js create mode 100644 frontend/src/services/const.js create mode 100644 frontend/src/services/token.js delete mode 100644 frontend/src/setupTests.js create mode 100644 frontend/src/store.js create mode 100644 frontend/src/user.js create mode 100644 frontend/src/utils.js diff --git a/.env b/.env deleted file mode 100644 index 4f7b825..0000000 --- a/.env +++ /dev/null @@ -1,36 +0,0 @@ -SERVER_NAME=localhost -HOSTNAME=d2df06456679 -DOMAIN=localhost -PROJECT_NAME=app.mongodb.tech -STACK_NAME=app.mongodb.tech -SERVER_HOST=http://localhost - -SECRET_KEY=99d3b1f01aa639e4a76f4fc281fc834747a543720ba4c8a8648ba755aef9be7f -USERS_OPEN_REGISTRATION=False -FIRST_SUPERUSER=admin@app.mongodb.tech -FIRST_SUPERUSER_PASSWORD=99d3b1f01aa639e4a76f4fc281fc834747a543720ba4c8a8648ba755aef9be7f - -EMAIL_TEMPLATES_DIR=email-templates/build -EMAILS_FROM_EMAIL=info@mongodb.tech -SMTP_HOST= -SMTP_USER= -SMTP_PASSWORD= -SMTP_TLS=True -SMTP_PORT=587 - -TRAEFIK_PUBLIC_NETWORK=traefik-public -TRAEFIK_TAG=mongodb.tech -TRAEFIK_PUBLIC_TAG=traefik-public - -DOCKER_IMAGE_BACKEND=backend -DOCKER_IMAGE_CELERYWORKER=celeryworker -DOCKER_IMAGE_FRONTEND=frontend - -SENTRY_DSN= - - -MONGO_USER=root -MONGO_PASS=mongo -MONGO_HOST=localhost -MONGO_DB=mongotech -MONGO_PORT=27017 diff --git a/.env.local b/.env.local new file mode 100644 index 0000000..541f8e9 --- /dev/null +++ b/.env.local @@ -0,0 +1,33 @@ +ENV=local + +SERVER_NAME=localhost +HOSTNAME=localhost +DOMAIN=localhost +PROJECT_NAME=MongoTech +STACK_NAME=app.mongo.one +SERVER_HOST=http://localhost + +SECRET_KEY=99d3b1f01aa639e4a76f4fc281fc834747a543720ba4c8a8648ba755aef9be7f +FIRST_SUPERUSER=admin@mongo.one +FIRST_SUPERUSER_PASSWORD=letmein + +EMAIL_TEMPLATES_DIR=email-templates/build +EMAILS_FROM_EMAIL=info@mongo.one +EMAILS_FROM_NAME=MongoTech + +SMTP_HOST=mongo.one +SMTP_USER=info +SMTP_PASSWORD=T3ip2info +SMTP_TLS=True +SMTP_PORT=25 + +SENTRY_DSN=https://d70ad76a32f44847b6d6bcb96b1862e3@o4504791095246848.ingest.sentry.io/4504898621734912 + +MONGO_USER=trader +MONGO_PASS=trader +MONGO_HOST=trader.uzfplyn.mongodb.net +MONGO_DB=mongo_local +MONGO_PORT=27017 + +CLIENT_ID=1010403550433-qneirdioe5pnujs5694mdrb5n5o1gqdn.apps.googleusercontent.com +CLIENT_SECRET=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 \ No newline at end of file diff --git a/.env.prod b/.env.prod new file mode 100644 index 0000000..f8a3647 --- /dev/null +++ b/.env.prod @@ -0,0 +1,30 @@ +ENV=production + +SERVER_NAME=app.mongo.one +HOSTNAME=app.mongo.one +DOMAIN=app.mongo.one +PROJECT_NAME=MongoTech +STACK_NAME=app.mongo.one +SERVER_HOST=http://app.mongo.one + +SECRET_KEY=99d3b1f01aa639e4a76f4fc281fc834747a543720ba4c8a8648ba755aef9be7f +FIRST_SUPERUSER=admin@mongo.one +FIRST_SUPERUSER_PASSWORD=letmein + +EMAIL_TEMPLATES_DIR=email-templates/build +EMAILS_FROM_EMAIL=info@mongo.one +EMAILS_FROM_NAME=MongoTech + +SMTP_HOST=mongo.one +SMTP_USER=info +SMTP_PASSWORD=T3ip2info +SMTP_TLS=True +SMTP_PORT=25 + +SENTRY_DSN=https://d70ad76a32f44847b6d6bcb96b1862e3@o4504791095246848.ingest.sentry.io/4504898621734912 + +MONGO_USER=trader +MONGO_PASS=trader +MONGO_HOST=trader.uzfplyn.mongodb.net +MONGO_DB=mongo_prod +MONGO_PORT=27017 diff --git a/.env.stage b/.env.stage new file mode 100644 index 0000000..e9e6eb8 --- /dev/null +++ b/.env.stage @@ -0,0 +1,30 @@ +ENV=stage + +SERVER_NAME=app-stage.mongo.one +HOSTNAME=app-stage.mongo.one +DOMAIN=app-stage.mongo.one +PROJECT_NAME=MongoTech +STACK_NAME=app.mongo.one +SERVER_HOST=http://app-stage.mongo.one + +SECRET_KEY=99d3b1f01aa639e4a76f4fc281fc834747a543720ba4c8a8648ba755aef9be7f +FIRST_SUPERUSER=admin@mongo.one +FIRST_SUPERUSER_PASSWORD=letmein + +EMAIL_TEMPLATES_DIR=email-templates/build +EMAILS_FROM_EMAIL=info@mongo.one +EMAILS_FROM_NAME=MongoTech + +SMTP_HOST=mongo.one +SMTP_USER=info +SMTP_PASSWORD=T3ip2info +SMTP_TLS=True +SMTP_PORT=25 + +SENTRY_DSN=https://d70ad76a32f44847b6d6bcb96b1862e3@o4504791095246848.ingest.sentry.io/4504898621734912 + +MONGO_USER=trader +MONGO_PASS=trader +MONGO_HOST=trader.uzfplyn.mongodb.net +MONGO_DB=mongo_stage +MONGO_PORT=27017 diff --git a/.vscode/extensions.json b/.vscode/extensions.json new file mode 100644 index 0000000..60d2386 --- /dev/null +++ b/.vscode/extensions.json @@ -0,0 +1,5 @@ +{ + "recommendations": [ + "ritwickdey.liveserver" + ] +} \ No newline at end of file diff --git a/.vscode/launch.json b/.vscode/launch.json new file mode 100644 index 0000000..e72e3ad --- /dev/null +++ b/.vscode/launch.json @@ -0,0 +1,18 @@ +{ + // Use IntelliSense to learn about possible attributes. + // Hover to view descriptions of existing attributes. + // For more information, visit: https://go.microsoft.com/fwlink/?linkid=830387 + "version": "0.2.0", + "configurations": [ + { + "name": "Python: Current File", + "type": "python", + "request": "launch", + "program": "/home/dg/web/mongotech/backend/app/app/main.py", + "cwd": "/home/dg/web/mongotech/backend/app/app", + "console": "integratedTerminal", + "justMyCode": true, + "envFile": "${workspaceFolder}/.env.local" + } + ] +} \ No newline at end of file diff --git a/backend/app/app/api/api_v1/endpoints/login.py b/backend/app/app/api/api_v1/endpoints/login.py index 0b5949c..3d15437 100644 --- a/backend/app/app/api/api_v1/endpoints/login.py +++ b/backend/app/app/api/api_v1/endpoints/login.py @@ -1,10 +1,12 @@ from datetime import timedelta from typing import Any - -from fastapi import APIRouter, Body, Depends, HTTPException +from google_auth_oauthlib.flow import InstalledAppFlow +from fastapi.responses import RedirectResponse +from fastapi import APIRouter, Response, Depends, HTTPException, Body from fastapi.security import OAuth2PasswordRequestForm from sqlalchemy.orm import Session # type: ignore - +from starlette.status import HTTP_302_FOUND +import requests from app import crud, models, schemas from app.api import deps from app.core import security @@ -15,12 +17,71 @@ send_reset_password_email, verify_password_reset_token, ) +import time router = APIRouter() -@router.post("/login/access-token", response_model=schemas.Token) +@router.get('/social') +def social(response: Response): + REDIRECT_URI = "http://localhost/api/response" + client_config = { + "auth_uri": "https://accounts.google.com/o/oauth2/auth", + "token_uri": "https://accounts.google.com/o/oauth2/token", + "client_id": settings.CLIENT_ID, + "client_secret": settings.CLIENT_SECRET, + } + flow = InstalledAppFlow.from_client_config({ + "web": client_config}, + redirect_uri=REDIRECT_URI, + scopes=["https://www.googleapis.com/auth/userinfo.profile", "https://www.googleapis.com/auth/userinfo.email"] + ) + + # Redirect the user to Google's authorization page + authorization_url, state = flow.authorization_url( + access_type='offline', # to get a refresh token + prompt='consent' # to force the user to grant consent again + ) + + return authorization_url + '×tamp=' + str(time.time()) + +@router.get('/response') +async def response(resp: Response, state: str, code: str, db: Session = Depends(deps.get_db)): + redirect_uri = "http://localhost/api/response" + token_url = 'https://accounts.google.com/o/oauth2/token' + token_payload = { + 'client_id': settings.CLIENT_ID, + 'client_secret': settings.CLIENT_SECRET, + 'redirect_uri': redirect_uri, + 'code': code, + 'grant_type': 'authorization_code' + } + data = requests.post(token_url, data=token_payload).json() + + response = requests.get('https://people.googleapis.com/v1/people/me?personFields=names,emailAddresses', + headers={'Authorization': 'Bearer ' + data["access_token"]}) + profile_data = response.json() + name = profile_data["names"][0]["displayName"] + email = profile_data["emailAddresses"][0]["value"].lower() + user = await crud.user.get_by_email(db=db, email=email) + if not user: + user = await crud.user.create(db=db, obj_in={"full_name": name, + "email": email, + "is_superuser": False, + "is_active": True, + "access_token": data["access_token"], + "refresh_token": data["refresh_token"] + }) + access_token_expires = timedelta(minutes=settings.ACCESS_TOKEN_EXPIRE_MINUTES) + token = security.create_access_token(str(user["_id"]), expires_delta=access_token_expires) + resp = RedirectResponse("/dashboard") + resp.set_cookie(key="token", value=token, expires=access_token_expires) + return resp + + +@router.post("/login/access-token", response_model=Any) async def login_access_token( + response: Response, db: Session = Depends(deps.get_db), form_data: OAuth2PasswordRequestForm = Depends() ) -> Any: """ @@ -30,25 +91,15 @@ async def login_access_token( db, email=form_data.username, password=form_data.password ) if not user: - raise HTTPException(status_code=400, detail="Incorrect email or password") - elif not crud.user.is_active(user): - raise HTTPException(status_code=400, detail="Inactive user") + raise HTTPException(status_code=403, detail="Incorrect email or password") + access_token_expires = timedelta(minutes=settings.ACCESS_TOKEN_EXPIRE_MINUTES) - return { - "access_token": security.create_access_token( + response.set_cookie(key="token", value=security.create_access_token( user["_id"], expires_delta=access_token_expires # type: ignore - ), - "token_type": "bearer", - } - - -@router.post("/login/test-token", response_model=schemas.User) -def test_token(current_user: models.User = Depends(deps.get_current_user)) -> Any: - """ - Test access token - """ - return current_user + ), expires=access_token_expires) + response.status_code = 200 + return response @router.post("/password-recovery/{email}", response_model=schemas.Msg) async def recover_password(email: str, db: Session = Depends(deps.get_db)) -> Any: @@ -69,12 +120,12 @@ async def recover_password(email: str, db: Session = Depends(deps.get_db)) -> An return {"msg": "Password recovery email sent"} -@router.post("/reset-password/", response_model=schemas.Msg) +@router.post("/reset-password/", response_model=schemas.User) async def reset_password( token: str = Body(...), new_password: str = Body(...), db: Session = Depends(deps.get_db), -) -> Any: +) -> schemas.User: """ Reset password """ @@ -90,7 +141,7 @@ async def reset_password( elif not crud.user.is_active(user): # type: ignore raise HTTPException(status_code=400, detail="Inactive user") hashed_password = get_password_hash(new_password) - await crud.user.update( + user = await crud.user.update( db=db, db_obj=user, obj_in={"hashed_password": hashed_password} ) - return {"msg": "Password updated successfully"} + return user diff --git a/backend/app/app/api/api_v1/endpoints/users.py b/backend/app/app/api/api_v1/endpoints/users.py index 60caa13..776e1e5 100644 --- a/backend/app/app/api/api_v1/endpoints/users.py +++ b/backend/app/app/api/api_v1/endpoints/users.py @@ -1,18 +1,57 @@ from typing import Any, List -from fastapi import APIRouter, Body, Depends, HTTPException +from starlette.status import HTTP_302_FOUND +import math +from app.core import security +from fastapi import APIRouter, Body, Depends, HTTPException, Response from fastapi.encoders import jsonable_encoder from pydantic.networks import EmailStr from sqlalchemy.orm import Session # type: ignore - +from datetime import datetime, timedelta from app import crud, models, schemas from app.api import deps from app.core.config import settings -from app.utils import send_new_account_email +from app.utils import send_new_account_email, create_confirmation_token + router = APIRouter() +@router.get("/pagination") +async def pagination( + per_page=10, + db: Session = Depends(deps.get_db), +) -> Any: + count = await crud.user.count(db=db) + return math.ceil(count/per_page) + + +@router.get("/activate", response_model=Any) +async def activate( + token: str, + response: Response, + db: Session = Depends(deps.get_db), +) -> Any: + """ + Create new user without the need to be logged in. + """ + confirm = await crud.confirm.get_by_token(db=db, token=token) + user_in = { + "confirmed": datetime.now(), + "email": confirm["email"], + "is_active": True + } + user = await crud.user.get(db=db, id=confirm["user_id"]) + await crud.user.update(db=db, db_obj=user, obj_in=user_in) + await crud.confirm.remove(db=db, id=confirm["_id"]) + access_token_expires = timedelta(minutes=settings.ACCESS_TOKEN_EXPIRE_MINUTES) + response.set_cookie(key="token", value=security.create_access_token( + user["_id"], expires_delta=access_token_expires # type: ignore + ), expires=access_token_expires) + headers = {"Location": "/dashboard"} + raise HTTPException(status_code=HTTP_302_FOUND, headers=headers) + + @router.get("/", response_model=List[schemas.User]) async def read_users( db: Session = Depends(deps.get_db), @@ -86,6 +125,19 @@ async def read_user_me( return current_user +@router.get("/stats", response_model=Any) +async def stat( + db: Session = Depends(deps.get_db), + current_user: models.User = Depends(deps.get_current_active_user), # noqa +) -> Any: + """ + Retrieve users. + """ + return { + "users": await crud.user.count(db=db) + } + + @router.get("/{user_id}", response_model=schemas.User) async def read_user_by_id( user_id: str, @@ -124,3 +176,49 @@ async def update_user( ) user = await crud.user.update(db, db_obj=user, obj_in=user_in) # type: ignore return user + + +@router.post("/open", response_model=schemas.User) +async def create_user_open( + *, + db: Session = Depends(deps.get_db), + password: str = Body(...), + email: EmailStr = Body(...), + full_name: str = Body(None), +) -> Any: + """ + Create new user without the need to be logged in. + """ + user = await crud.user.get_by_email(db, email=email) + if user: + raise HTTPException( + status_code=400, + detail="The user with this username already exists in the system", + ) + user_in = schemas.UserCreate(password=password, email=email, full_name=full_name) + user_in.is_superuser = False + user_in.is_active = False + user = await crud.user.create(db, obj_in=user_in) + await create_confirmation_token(db, user, user["email"]) + return user + + +@router.delete("/{id}", response_model=schemas.User) +async def delete_user( + *, + db: Session = Depends(deps.get_db), + id: str, + current_user: models.User = Depends(deps.get_current_active_user), # noqa +) -> schemas.User: + """ + Delete an quota_room. + """ + if id == 1: + raise HTTPException(status_code=403, detail="You can't delete superuser") + + user = await crud.user.get(db=db, id=id) + if not user: + raise HTTPException(status_code=404, detail="User doesn't exists") + + await crud.user.remove(db=db, id=id) + return user diff --git a/backend/app/app/api/deps.py b/backend/app/app/api/deps.py index 7b615bd..acc7790 100644 --- a/backend/app/app/api/deps.py +++ b/backend/app/app/api/deps.py @@ -1,6 +1,6 @@ from typing import Generator -from fastapi import Depends, HTTPException, status +from fastapi import Depends, HTTPException, status, Request from fastapi.security import OAuth2PasswordBearer from jose import jwt # type: ignore from pydantic import ValidationError @@ -24,11 +24,15 @@ def get_db() -> Generator: async def get_current_user( - db: Session = Depends(get_db), token: str = Depends(reusable_oauth2) + request: Request, + db: Session = Depends(get_db) ) -> models.User: + try: + if "token" not in request.cookies: + raise ValidationError payload = jwt.decode( - token, settings.SECRET_KEY, algorithms=[security.ALGORITHM] + request.cookies["token"], settings.SECRET_KEY, algorithms=[security.ALGORITHM] ) token_data = payload except (jwt.JWTError, ValidationError) as e: @@ -46,8 +50,7 @@ async def get_current_user( def get_current_active_user( current_user: models.User = Depends(get_current_user), ) -> models.User: - if not crud.user.is_active(current_user): - raise HTTPException(status_code=400, detail="Inactive user") + return current_user diff --git a/backend/app/app/core/config.py b/backend/app/app/core/config.py index edf62c4..ea441da 100644 --- a/backend/app/app/core/config.py +++ b/backend/app/app/core/config.py @@ -5,10 +5,11 @@ class Settings(BaseSettings): + ENV: str API_V1_STR: str = "/api/v1" SECRET_KEY: str = secrets.token_urlsafe(32) # 60 minutes * 24 hours * 8 days = 8 days - ACCESS_TOKEN_EXPIRE_MINUTES: int = 60 * 24 * 8 + ACCESS_TOKEN_EXPIRE_MINUTES: int = 60 * 24 * 30 SERVER_NAME: str SERVER_HOST: AnyHttpUrl BACKEND_CORS_ORIGINS: List[AnyHttpUrl] = [] @@ -62,6 +63,8 @@ def get_emails_enabled(cls, v: bool, values: Dict[str, Any]) -> bool: MONGO_HOST: str MONGO_DB: str + CLIENT_ID: str + CLIENT_SECRET: str class Config: case_sensitive = True diff --git a/backend/app/app/crud/__init__.py b/backend/app/app/crud/__init__.py index 37125db..e84767c 100644 --- a/backend/app/app/crud/__init__.py +++ b/backend/app/app/crud/__init__.py @@ -1 +1,2 @@ from .crud_user import user # noqa +from .crud_confirm import confirm # noqa diff --git a/backend/app/app/crud/base.py b/backend/app/app/crud/base.py index 6a20a9e..364abb3 100644 --- a/backend/app/app/crud/base.py +++ b/backend/app/app/crud/base.py @@ -1,8 +1,11 @@ from typing import Generic, Type, TypeVar - +from bson.objectid import ObjectId # type: ignore from pydantic import BaseModel - +from typing import Optional, List, Union, Dict, Any from app.db.base_class import Base +from fastapi.encoders import jsonable_encoder +from motor.motor_asyncio import AsyncIOMotorClient # type: ignore +from sqlalchemy.orm import Session # type: ignore ModelType = TypeVar("ModelType", bound=Base) CreateSchemaType = TypeVar("CreateSchemaType", bound=BaseModel) @@ -11,12 +14,53 @@ class CRUDBase(Generic[ModelType, CreateSchemaType, UpdateSchemaType]): def __init__(self, model: Type[ModelType]): - """ - CRUD object with default methods to Create, Read, Update, Delete (CRUD). + self.model = model - **Parameters** + async def get(self, db: Session, id: str) -> Optional[ModelType]: + current_user = await db[self.model.__tablename__].find_one({"_id": ObjectId(id)}) # type: ignore + if current_user: + current_user["id"] = str(current_user["_id"]) + return current_user + else: + return None + + async def count(self, db: Session): + return await db[self.model.__tablename__].count_documents({}) + + async def get_multi( + self, db: Session, *, skip: int = 0, limit: int = 100 + ) -> List[ModelType]: + result = [] + async for document in db[self.model.__tablename__].find().skip(skip).limit(limit): # type: ignore + document["id"] = str(document["_id"]) # noqa + result.append(document) + return result + + async def create(self, db: Session, obj_in: dict) -> ModelType: + data = jsonable_encoder(obj_in) + if hasattr(obj_in, "ttl"): + data["ttl"] = obj_in.ttl + if hasattr(obj_in, "created"): + data["created"] = obj_in.created + obj = await db[self.model.__tablename__].insert_one(document=data) # type: ignore + user = await db[self.model.__tablename__].find_one( # type: ignore + {"_id": ObjectId(obj.inserted_id)} + ) # type: ignore + user["id"] = str(obj.inserted_id) + return user + + async def update( + self, db: Session, *, db_obj: ModelType, obj_in: Union[UpdateSchemaType, Dict[str, Any]] + ) -> ModelType: + obj_in = jsonable_encoder(obj_in) + + user_id = db_obj["_id"] if db_obj["_id"] else ObjectId(db_obj["id"]) + await db[self.model.__tablename__].update_one({"_id": user_id}, {"$set": obj_in}) # type: ignore + user = await db[self.model.__tablename__].find_one({"_id": user_id}) # type: ignore + user["id"] = str(user["_id"]) + return user + + async def remove(self, db: AsyncIOMotorClient, id: str) -> None: + id = ObjectId(id) if type(id) == str else id + await db[self.model.__tablename__].delete_one({"_id": id}) - * `model`: A SQLAlchemy model class - * `schema`: A Pydantic model (schema) class - """ - self.model = model diff --git a/backend/app/app/crud/crud_confirm.py b/backend/app/app/crud/crud_confirm.py new file mode 100644 index 0000000..14ac6a7 --- /dev/null +++ b/backend/app/app/crud/crud_confirm.py @@ -0,0 +1,18 @@ +from typing import TypeVar, Any +from bson.objectid import ObjectId # type: ignore +from motor.motor_asyncio import AsyncIOMotorClient # type: ignore +from sqlalchemy.orm import Session # type: ignore +from app.crud.base import CRUDBase +from app.db.base_class import Base +from app.models.confirm import Confirm +from app.schemas.confirm import ConfirmCreate, ConfirmUpdate + +ModelType = TypeVar("ModelType", bound=Base) + + +class CRUDConfirm(CRUDBase[Confirm, ConfirmCreate, ConfirmUpdate]): + async def get_by_token(self, db: Session, token: str) -> Any: + return await db["confirm"].find_one({"token": token}) # type: ignore + + +confirm = CRUDConfirm(Confirm) diff --git a/backend/app/app/crud/crud_user.py b/backend/app/app/crud/crud_user.py index 1f2db3e..1792e68 100644 --- a/backend/app/app/crud/crud_user.py +++ b/backend/app/app/crud/crud_user.py @@ -4,7 +4,7 @@ from fastapi.encoders import jsonable_encoder from motor.motor_asyncio import AsyncIOMotorClient # type: ignore from sqlalchemy.orm import Session # type: ignore - +from datetime import datetime from app.core.security import get_password_hash, verify_password from app.crud.base import CRUDBase from app.db.base_class import Base @@ -15,35 +15,21 @@ class CRUDUser(CRUDBase[User, UserCreate, UserUpdate]): - async def get(self, db: Session, id: str) -> Optional[ModelType]: - current_user = await db["users"].find_one({"_id": ObjectId(id)}) # type: ignore - if current_user: - current_user["id"] = str(current_user["_id"]) - return current_user - else: - return None - - async def get_multi( - self, db: Session, *, skip: int = 0, limit: int = 100 - ) -> List[ModelType]: - result = [] - async for document in db["users"].find().skip(skip).limit(limit): # type: ignore - document["id"] = str(document["_id"]) # noqa - result.append(document) - return result - - async def get_by_email(self, db: Session, email: str) -> Optional[User]: - return await db["users"].find_one({"email": email}) # type: ignore - async def create(self, db: Session, obj_in: dict) -> User: - obj_in = jsonable_encoder(obj_in) + data = jsonable_encoder(obj_in) db_obj = { - "email": obj_in["email"], - "hashed_password": get_password_hash(obj_in["password"]), - "full_name": obj_in.get("full_name"), - "is_superuser": obj_in.get("is_superuser") or False, - "is_active": True, + "email": data["email"], + "full_name": data.get("full_name"), + "is_superuser": data.get("is_superuser") or False, + "is_active": data["is_active"], + "created": datetime.now(), + "access_token": data["access_token"] if "access_token" in data else '', + "refresh_token": data["refresh_token"] if "refresh_token" in data else '', } + if "password" in data: + db_obj.setdefault("hashed_password", get_password_hash(data["password"])) + if hasattr(obj_in, "created"): + db_obj["created"] = obj_in.created obj = await db["users"].insert_one(document=db_obj) # type: ignore user = await db["users"].find_one( # type: ignore {"_id": ObjectId(obj.inserted_id)} @@ -52,10 +38,10 @@ async def create(self, db: Session, obj_in: dict) -> User: return user async def update( - self, db: Session, *, db_obj: User, obj_in: Union[UserUpdate, Dict[str, Any]] + self, db: Session, *, db_obj: User, obj_in: Union[UserUpdate, Dict[str, Any]] ) -> User: - obj_in = jsonable_encoder(obj_in) - update_data = obj_in + + update_data = jsonable_encoder(obj_in) if "password" in update_data: # type: ignore hashed_password = get_password_hash(update_data["password"]) # type: ignore @@ -63,13 +49,20 @@ async def update( update_data["hashed_password"] = hashed_password # type: ignore if "email" in update_data: del update_data["email"] # type: ignore - await db["users"].update_one({"_id": ObjectId(db_obj["id"])}, {"$set": update_data}) # type: ignore - user = await db["users"].find_one({"_id": ObjectId(db_obj["id"])}) # type: ignore + + if hasattr(obj_in, "confirmed"): + update_data["confirmed"] = obj_in.created + elif type(obj_in) == dict and "confirmed" in obj_in: + update_data["confirmed"] = obj_in["confirmed"] + + user_id = db_obj["_id"] if db_obj["_id"] else ObjectId(db_obj["id"]) + await db["users"].update_one({"_id": user_id}, {"$set": update_data}) # type: ignore + user = await db["users"].find_one({"_id": user_id}) # type: ignore user["id"] = str(user["_id"]) return user - async def remove(self, db: AsyncIOMotorClient, user_id: str) -> None: - await db["users"].delete_one({"_id": user_id}) + async def get_by_email(self, db: Session, email: str) -> Optional[User]: + return await db["users"].find_one({"email": email}) # type: ignore async def authenticate( self, db: AsyncIOMotorClient, *, email: str, password: str diff --git a/backend/app/app/db/init_db.py b/backend/app/app/db/init_db.py index cdb2f65..de896ab 100644 --- a/backend/app/app/db/init_db.py +++ b/backend/app/app/db/init_db.py @@ -1,5 +1,5 @@ from sqlalchemy.orm import Session - +from app.schemas.user import UserCreate from app import crud from app.core.config import settings from app.db import base # noqa: F401 @@ -8,10 +8,11 @@ async def init_db(db: Session) -> None: user = await crud.user.get_by_email(db, email=settings.FIRST_SUPERUSER) if not user: - user_in = { - "email": settings.FIRST_SUPERUSER, - "password": settings.FIRST_SUPERUSER_PASSWORD, - "is_superuser": True, - "full_name": "Admin", - } + user_in = UserCreate( + email=settings.FIRST_SUPERUSER, + password=settings.FIRST_SUPERUSER_PASSWORD, + is_superuser=True, + is_active=True, + full_name="Admin", + ) user = await crud.user.create(db, obj_in=user_in) # noqa: F841 diff --git a/backend/app/app/db/session.py b/backend/app/app/db/session.py index 8cc9f6e..cf98986 100644 --- a/backend/app/app/db/session.py +++ b/backend/app/app/db/session.py @@ -4,9 +4,9 @@ from app.core.config import settings -MONGO_URL = f"{settings.MONGO_USER}:{settings.MONGO_PASS}@{settings.MONGO_HOST}:27017" +MONGO_URL = f"{settings.MONGO_USER}:{settings.MONGO_PASS}@{settings.MONGO_HOST}" client = motor.motor_asyncio.AsyncIOMotorClient( - f"mongodb://{MONGO_URL}/?authMechanism=DEFAULT" + f"mongodb+srv://{MONGO_URL}/?authMechanism=DEFAULT" ) client.get_io_loop = asyncio.get_event_loop -database = client.mongotech +database = client[settings.MONGO_DB] diff --git a/backend/app/app/email-templates/build/reset_password.html b/backend/app/app/email-templates/build/reset_password.html index 7fbf368..364afd0 100644 --- a/backend/app/app/email-templates/build/reset_password.html +++ b/backend/app/app/email-templates/build/reset_password.html @@ -1,26 +1,264 @@ -

{{ project_name }} - Password Recovery
We received a request to recover the password for user {{ username }} with email {{ email }}
Reset your password by clicking the button below:
Reset Password
Or open the following link:

The reset password link / button will expire in {{ valid_hours }} hours.
If you didn't request a password recovery you can disregard this email.
\ No newline at end of file + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+ + + + + + +
+ +
+ + + + + + +
+ + + + + + +
+ +
+
+
+ +
+
+ +
+ + + + + + +
+ +
+ + + + + + + + + + + + +
+
+

{{ project_name }} - Password Recovery

+
+
+
+

We received a request to recover the password for user {{ username }} with email {{ email }}

+

Or open the following link:

+
+
+ + + + + + +
+ + Reset password + +
+
+
+ +
+
+ + +
+ + + diff --git a/backend/app/app/email-templates/build/welcome.html b/backend/app/app/email-templates/build/welcome.html new file mode 100644 index 0000000..2aa6259 --- /dev/null +++ b/backend/app/app/email-templates/build/welcome.html @@ -0,0 +1,264 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+ + + + + + +
+ +
+ + + + + + +
+ + + + + + +
+ +
+
+
+ +
+
+ +
+ + + + + + +
+ +
+ + + + + + + + + + + + +
+
+

You're almost there!

+
+
+
+

Hi {{ full_name }}, Thank you for signing up to.

+

To confirm your account, simply click on the button below:

+
+
+ + + + + + +
+ + Activate my account + +
+
+
+ +
+
+ + +
+ + + diff --git a/backend/app/app/email-templates/src/button.mjml b/backend/app/app/email-templates/src/button.mjml new file mode 100644 index 0000000..e9403f7 --- /dev/null +++ b/backend/app/app/email-templates/src/button.mjml @@ -0,0 +1,9 @@ + + + + Activate my account + + + diff --git a/backend/app/app/email-templates/src/button_reset.mjml b/backend/app/app/email-templates/src/button_reset.mjml new file mode 100644 index 0000000..7a9f560 --- /dev/null +++ b/backend/app/app/email-templates/src/button_reset.mjml @@ -0,0 +1,9 @@ + + + + Reset password + + + diff --git a/backend/app/app/email-templates/src/image.mjml b/backend/app/app/email-templates/src/image.mjml new file mode 100644 index 0000000..d31cb05 --- /dev/null +++ b/backend/app/app/email-templates/src/image.mjml @@ -0,0 +1,9 @@ + + + + + diff --git a/backend/app/app/email-templates/src/reset_password.mjml b/backend/app/app/email-templates/src/reset_password.mjml index 4f45ea2..66cdd82 100644 --- a/backend/app/app/email-templates/src/reset_password.mjml +++ b/backend/app/app/email-templates/src/reset_password.mjml @@ -1,19 +1,21 @@ - - - - - - {{ project_name }} - Password Recovery - We received a request to recover the password for user {{ username }} - with email {{ email }} - Reset your password by clicking the button below: - Reset Password - Or open the following link: - {{ link }} - - The reset password link / button will expire in {{ valid_hours }} hours. - If you didn't request a password recovery you can disregard this email. - - - - + + + + + + + + + +

{{ project_name }} - Password Recovery

+
+ +

We received a request to recover the password for user {{ username }} with email {{ email }}

+

Or open the following link:

+
+ +
+
+ +
+
\ No newline at end of file diff --git a/backend/app/app/email-templates/src/social.mjml b/backend/app/app/email-templates/src/social.mjml new file mode 100644 index 0000000..e2b30b0 --- /dev/null +++ b/backend/app/app/email-templates/src/social.mjml @@ -0,0 +1,14 @@ + + + + + + + + + \ No newline at end of file diff --git a/backend/app/app/email-templates/src/style.mjml b/backend/app/app/email-templates/src/style.mjml new file mode 100644 index 0000000..86b6ef6 --- /dev/null +++ b/backend/app/app/email-templates/src/style.mjml @@ -0,0 +1,69 @@ + + @import url('https://fonts.googleapis.com/css?family=Montserrat'); + @import url('https://fonts.googleapis.com/css?family=Raleway'); + @import url('https://fonts.googleapis.com/css?family=Open Sans'); + + h1 { + text-align: center; + color: #000000; + line-height: 32px; + } + + p { + margin: 10px 0; + text-align: center; + } + + mj-body { + background-color: #f8f8f8; + color: #797e82; + font-family: "Open Sans", Helvetica, Arial, sans-serif; + } + + mj-section { + background-color: #ffffff; + background-repeat: repeat; + background-size: auto; + padding-bottom: 70px; + padding-top: 30px; + padding: 20px 0; + text-align: center; + vertical-align: top; + } + + mj-text { + align: left; + color: #797e82; + font-family: "Open Sans", Helvetica, Arial, sans-serif; + font-size: 13px; + line-height: 22px; + padding-bottom: 0; + padding-left: 50px; + padding-right: 50px; + padding-top: 0; + padding: 0 25px; + } + + mj-button { + align: center; + background-color: #90ee90; + border-radius: 100px; + border: none; + color: #222; + font-family: "Open Sans", Helvetica, Arial, sans-serif; + font-size: 13px; + font-weight: normal; + inner-padding: 15px 25px; + padding-bottom: 20px; + padding-top: 20px; + padding: 10px 25px; + text-decoration: none; + text-transform: none; + vertical-align: middle; + } + + b { + font-weight: 700; + } + + \ No newline at end of file diff --git a/backend/app/app/email-templates/src/test_email.mjml b/backend/app/app/email-templates/src/test_email.mjml deleted file mode 100644 index 5b9baa4..0000000 --- a/backend/app/app/email-templates/src/test_email.mjml +++ /dev/null @@ -1,11 +0,0 @@ - - - - - - {{ project_name }} - Test email for: {{ email }} - - - - diff --git a/backend/app/app/email-templates/src/welcome.mjml b/backend/app/app/email-templates/src/welcome.mjml new file mode 100644 index 0000000..37f1fa0 --- /dev/null +++ b/backend/app/app/email-templates/src/welcome.mjml @@ -0,0 +1,21 @@ + + + + + + + + + +

You're almost there!

+
+ +

Hi {{ full_name }}, Thank you for signing up to.

+

To confirm your account, simply click on the button below:

+
+ +
+
+ +
+
\ No newline at end of file diff --git a/backend/app/app/libs/__init__.py b/backend/app/app/libs/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/backend/app/app/libs/error.py b/backend/app/app/libs/error.py new file mode 100644 index 0000000..3bedae0 --- /dev/null +++ b/backend/app/app/libs/error.py @@ -0,0 +1,10 @@ +from sentry_sdk.integrations.fastapi import FastApiIntegration +import sentry_sdk +from app.core.config import settings + + +def log_errors(message): + sentry_sdk.init(dsn=settings.SENTRY_DSN, environment=settings.ENV, integrations=[FastApiIntegration()]) + with sentry_sdk.push_scope() as scope: + sentry_sdk.capture_exception(Exception(message)) + scope.clear() diff --git a/backend/app/app/main.py b/backend/app/app/main.py index 786d2e2..6feaefa 100644 --- a/backend/app/app/main.py +++ b/backend/app/app/main.py @@ -1,27 +1,41 @@ import uvicorn # type: ignore -from fastapi import FastAPI +from fastapi import FastAPI, Request +from fastapi.responses import JSONResponse from starlette.middleware.cors import CORSMiddleware - from app.api.api_v1.api import api_router from app.core.config import settings +from sentry_sdk.integrations.fastapi import FastApiIntegration +import sentry_sdk app = FastAPI( title=settings.PROJECT_NAME, openapi_url=f"{settings.API_V1_STR}/openapi.json" ) -# Set all CORS enabled origins -if settings.BACKEND_CORS_ORIGINS: - app.add_middleware( - CORSMiddleware, - allow_origins=["*"], - allow_credentials=True, - allow_methods=["*"], - allow_headers=["*"], - ) +@app.middleware("http") +async def exception_handling(request: Request, call_next): + try: + return await call_next(request) + except Exception as exc: + sentry_sdk.init(dsn=settings.SENTRY_DSN, environment=settings.ENV, integrations=[FastApiIntegration()]) + with sentry_sdk.push_scope() as scope: + sentry_sdk.capture_exception(exc) + scope.clear() + + return JSONResponse(status_code=400, content=f"Something going wrong {exc}") + +origins = ["*"] + +app.add_middleware( + CORSMiddleware, + allow_origins=origins, + allow_credentials=True, + allow_methods=["*"], + allow_headers=["*"], +) app.include_router(api_router, prefix=settings.API_V1_STR) if __name__ == "__main__": - uvicorn.run(app, host="0.0.0.0", port=8001, debug=True) # nosec + uvicorn.run(app, host="0.0.0.0", port=8000, debug=True) # nosec diff --git a/backend/app/app/models/__init__.py b/backend/app/app/models/__init__.py index a5057a0..f90a8bb 100644 --- a/backend/app/app/models/__init__.py +++ b/backend/app/app/models/__init__.py @@ -1 +1,2 @@ from .user import User # noqa +from .confirm import Confirm # noqa diff --git a/backend/app/app/models/confirm.py b/backend/app/app/models/confirm.py new file mode 100755 index 0000000..3cc0715 --- /dev/null +++ b/backend/app/app/models/confirm.py @@ -0,0 +1,12 @@ +from sqlalchemy import Boolean, Column, String # type: ignore + +from app.db.base_class import Base + + +class Confirm(Base): + __tablename__ = "confirm" + _id = Column(String, primary_key=True, index=True) + user_id = Column(String, index=True) + email = Column(String, unique=True, index=True, nullable=False) + token = Column(String) + ttl = Column(String) diff --git a/backend/app/app/models/user.py b/backend/app/app/models/user.py index 600d531..64bb0a9 100755 --- a/backend/app/app/models/user.py +++ b/backend/app/app/models/user.py @@ -4,6 +4,7 @@ class User(Base): + __tablename__ = "users" _id = Column(String, primary_key=True, index=True) full_name = Column(String, index=True) email = Column(String, unique=True, index=True, nullable=False) diff --git a/backend/app/app/schemas/__init__.py b/backend/app/app/schemas/__init__.py index ce34404..9c8689b 100644 --- a/backend/app/app/schemas/__init__.py +++ b/backend/app/app/schemas/__init__.py @@ -1,3 +1,4 @@ from .msg import Msg # noqa from .token import Token, TokenPayload # noqa from .user import User, UserCreate, UserInDB, UserUpdate # noqa +from .confirm import Confirm, ConfirmCreate, ConfirmInDB, ConfirmUpdate # noqa diff --git a/backend/app/app/schemas/base.py b/backend/app/app/schemas/base.py new file mode 100644 index 0000000..cb997a7 --- /dev/null +++ b/backend/app/app/schemas/base.py @@ -0,0 +1,8 @@ +from datetime import datetime +from pydantic import BaseModel + + +# Shared properties +class Base(BaseModel): + created: datetime = datetime.now() + diff --git a/backend/app/app/schemas/confirm.py b/backend/app/app/schemas/confirm.py new file mode 100644 index 0000000..e2bfa42 --- /dev/null +++ b/backend/app/app/schemas/confirm.py @@ -0,0 +1,39 @@ +from typing import List +from pydantic import EmailStr +from app.schemas.base import Base +from datetime import datetime + +# Shared properties +class ConfirmBase(Base): + user_id: str + email: EmailStr + token: str + ttl: datetime + + +# Properties to receive via API on creation +class ConfirmCreate(ConfirmBase): + pass + + +# Properties to receive via API on update +class ConfirmUpdate(ConfirmBase): + pass + + +class ConfirmInDBBase(ConfirmBase): + id: str + _id: str + + class Config: + orm_mode = True + + +# Additional properties to return via API +class Confirm(ConfirmInDBBase): + pass + + +# Additional properties stored in DB +class ConfirmInDB(ConfirmInDBBase): + hashed_password: str diff --git a/backend/app/app/schemas/user.py b/backend/app/app/schemas/user.py index 928eafb..83bc522 100644 --- a/backend/app/app/schemas/user.py +++ b/backend/app/app/schemas/user.py @@ -1,20 +1,23 @@ from typing import Optional - -from pydantic import BaseModel, EmailStr - +from pydantic import EmailStr +from app.schemas.base import Base +from datetime import datetime # Shared properties -class UserBase(BaseModel): +class UserBase(Base): email: Optional[EmailStr] = None is_active: Optional[bool] = True is_superuser: bool = False full_name: Optional[str] = None + confirmed: Optional[datetime] = None + access_token: Optional[str] = None + refresh_token: Optional[str] = None # Properties to receive via API on creation class UserCreate(UserBase): email: EmailStr - password: str + password: Optional[str] # Properties to receive via API on update diff --git a/backend/app/app/utils.py b/backend/app/app/utils.py index 12b3ddc..b32f039 100644 --- a/backend/app/app/utils.py +++ b/backend/app/app/utils.py @@ -2,11 +2,11 @@ from datetime import datetime, timedelta from pathlib import Path from typing import Any, Dict, Optional - +from app import schemas, crud import emails # type: ignore from emails.template import JinjaTemplate # type: ignore from jose import jwt # type: ignore - +import hashlib from app.core.config import settings @@ -34,26 +34,13 @@ def send_email( logging.info(f"send email result: {response}") -def send_test_email(email_to: str) -> None: - project_name = settings.PROJECT_NAME - subject = f"{project_name} - Test email" - with open(Path(settings.EMAIL_TEMPLATES_DIR) / "test_email.html") as f: - template_str = f.read() - send_email( - email_to=email_to, - subject_template=subject, - html_template=template_str, - environment={"project_name": settings.PROJECT_NAME, "email": email_to}, - ) - - def send_reset_password_email(email_to: str, email: str, token: str) -> None: project_name = settings.PROJECT_NAME subject = f"{project_name} - Password recovery for user {email}" with open(Path(settings.EMAIL_TEMPLATES_DIR) / "reset_password.html") as f: template_str = f.read() server_host = settings.SERVER_HOST - link = f"{server_host}/reset-password?token={token}" + link = f"{server_host}/reset?token={token}" send_email( email_to=email_to, subject_template=subject, @@ -68,6 +55,33 @@ def send_reset_password_email(email_to: str, email: str, token: str) -> None: ) +async def create_confirmation_token(db, user, email): + token = hashlib.md5(user["id"].encode()).hexdigest() + confirm = schemas.ConfirmCreate(user_id=user["id"], + email=email, + token=token, + ttl=datetime.now() + timedelta(minutes=1)) + token = await crud.confirm.create(db=db, obj_in=confirm) + send_welcome_email(user["email"], user["full_name"], token=token["token"]) + + +def send_welcome_email(email_to: str, full_name: str, token: str) -> None: + + subject = f"Congratulation you register account on MongoTech" + with open(Path(settings.EMAIL_TEMPLATES_DIR) / "welcome.html") as f: + template_str = f.read() + + send_email( + email_to=email_to, + subject_template=subject, + html_template=template_str, + environment={ + "full_name": full_name, + "link": settings.SERVER_HOST + "/api/users/activate?token=" + token + }, + ) + + def send_new_account_email(email_to: str, username: str, password: str) -> None: project_name = settings.PROJECT_NAME subject = f"{project_name} - New account for user {username}" diff --git a/backend/app/poetry.lock b/backend/app/poetry.lock index af6da66..43cac2c 100644 --- a/backend/app/poetry.lock +++ b/backend/app/poetry.lock @@ -976,6 +976,50 @@ files = [ [package.dependencies] gitdb = ">=4.0.1,<5" +[[package]] +name = "google-auth" +version = "2.16.3" +description = "Google Authentication Library" +category = "main" +optional = false +python-versions = ">=2.7,!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*,!=3.4.*,!=3.5.*" +files = [ + {file = "google-auth-2.16.3.tar.gz", hash = "sha256:611779ce33a3aee265b94b74d4bb8c188f33010f5814761250a0ebbde94cc745"}, + {file = "google_auth-2.16.3-py2.py3-none-any.whl", hash = "sha256:4dfcfd8ecd1cf03ddc97fddfb3b1f2973ea4f3f664aa0d8cfaf582ef9f0c60e7"}, +] + +[package.dependencies] +cachetools = ">=2.0.0,<6.0" +pyasn1-modules = ">=0.2.1" +rsa = {version = ">=3.1.4,<5", markers = "python_version >= \"3.6\""} +six = ">=1.9.0" + +[package.extras] +aiohttp = ["aiohttp (>=3.6.2,<4.0.0dev)", "requests (>=2.20.0,<3.0.0dev)"] +enterprise-cert = ["cryptography (==36.0.2)", "pyopenssl (==22.0.0)"] +pyopenssl = ["cryptography (>=38.0.3)", "pyopenssl (>=20.0.0)"] +reauth = ["pyu2f (>=0.1.5)"] +requests = ["requests (>=2.20.0,<3.0.0dev)"] + +[[package]] +name = "google-auth-oauthlib" +version = "1.0.0" +description = "Google Authentication Library" +category = "main" +optional = false +python-versions = ">=3.6" +files = [ + {file = "google-auth-oauthlib-1.0.0.tar.gz", hash = "sha256:e375064964820b47221a7e1b7ee1fd77051b6323c3f9e3e19785f78ab67ecfc5"}, + {file = "google_auth_oauthlib-1.0.0-py2.py3-none-any.whl", hash = "sha256:95880ca704928c300f48194d1770cf5b1462835b6e49db61445a520f793fd5fb"}, +] + +[package.dependencies] +google-auth = ">=2.15.0" +requests-oauthlib = ">=0.7.0" + +[package.extras] +tool = ["click (>=6.0.0)"] + [[package]] name = "greenlet" version = "1.1.2" @@ -1579,6 +1623,23 @@ files = [ {file = "mypy_extensions-1.0.0.tar.gz", hash = "sha256:75dbf8955dc00442a438fc4d0666508a9a97b6bd41aa2f0ffe9d2f2725af0782"}, ] +[[package]] +name = "oauthlib" +version = "3.2.2" +description = "A generic, spec-compliant, thorough implementation of the OAuth request-signing logic" +category = "main" +optional = false +python-versions = ">=3.6" +files = [ + {file = "oauthlib-3.2.2-py3-none-any.whl", hash = "sha256:8139f29aac13e25d502680e9e19963e83f16838d48a0d71c287fe40e7067fbca"}, + {file = "oauthlib-3.2.2.tar.gz", hash = "sha256:9859c40929662bec5d64f34d01c99e093149682a3f38915dc0655d5a633dd918"}, +] + +[package.extras] +rsa = ["cryptography (>=3.0.0)"] +signals = ["blinker (>=1.4.0)"] +signedtoken = ["cryptography (>=3.0.0)", "pyjwt (>=2.0.0,<3)"] + [[package]] name = "packaging" version = "23.0" @@ -1729,6 +1790,21 @@ files = [ {file = "pyasn1-0.4.8.tar.gz", hash = "sha256:aef77c9fb94a3ac588e87841208bdec464471d9871bd5050a287cc9a475cd0ba"}, ] +[[package]] +name = "pyasn1-modules" +version = "0.2.8" +description = "A collection of ASN.1-based protocols modules." +category = "main" +optional = false +python-versions = "*" +files = [ + {file = "pyasn1-modules-0.2.8.tar.gz", hash = "sha256:905f84c712230b2c592c19470d3ca8d552de726050d1d1716282a1f6146be65e"}, + {file = "pyasn1_modules-0.2.8-py2.py3-none-any.whl", hash = "sha256:a50b808ffeb97cb3601dd25981f6b016cbb3d31fbf57a8b8a87428e6158d0c74"}, +] + +[package.dependencies] +pyasn1 = ">=0.4.6,<0.5.0" + [[package]] name = "pycodestyle" version = "2.10.0" @@ -2190,25 +2266,44 @@ tests = ["Flask (>=0.8)", "Flask-Login (>=0.2.0)", "ZConfig", "aiohttp", "anyjso [[package]] name = "requests" -version = "2.28.0" +version = "2.28.2" description = "Python HTTP for Humans." category = "main" optional = false python-versions = ">=3.7, <4" files = [ - {file = "requests-2.28.0-py3-none-any.whl", hash = "sha256:bc7861137fbce630f17b03d3ad02ad0bf978c844f3536d0edda6499dafce2b6f"}, - {file = "requests-2.28.0.tar.gz", hash = "sha256:d568723a7ebd25875d8d1eaf5dfa068cd2fc8194b2e483d7b1f7c81918dbec6b"}, + {file = "requests-2.28.2-py3-none-any.whl", hash = "sha256:64299f4909223da747622c030b781c0d7811e359c37124b4bd368fb8c6518baa"}, + {file = "requests-2.28.2.tar.gz", hash = "sha256:98b1b2782e3c6c4904938b84c0eb932721069dfdb9134313beff7c83c2df24bf"}, ] [package.dependencies] certifi = ">=2017.4.17" -charset-normalizer = ">=2.0.0,<2.1.0" +charset-normalizer = ">=2,<4" idna = ">=2.5,<4" urllib3 = ">=1.21.1,<1.27" [package.extras] socks = ["PySocks (>=1.5.6,!=1.5.7)"] -use-chardet-on-py3 = ["chardet (>=3.0.2,<5)"] +use-chardet-on-py3 = ["chardet (>=3.0.2,<6)"] + +[[package]] +name = "requests-oauthlib" +version = "1.3.1" +description = "OAuthlib authentication support for Requests." +category = "main" +optional = false +python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*" +files = [ + {file = "requests-oauthlib-1.3.1.tar.gz", hash = "sha256:75beac4a47881eeb94d5ea5d6ad31ef88856affe2332b9aafb52c6452ccf0d7a"}, + {file = "requests_oauthlib-1.3.1-py2.py3-none-any.whl", hash = "sha256:2577c501a2fb8d05a304c09d090d6e47c306fef15809d102b327cf8364bddab5"}, +] + +[package.dependencies] +oauthlib = ">=3.0.0" +requests = ">=2.0.0" + +[package.extras] +rsa = ["oauthlib[signedtoken] (>=3.0.0)"] [[package]] name = "rfc3986" @@ -2262,6 +2357,48 @@ files = [ [package.dependencies] pyasn1 = ">=0.1.3" +[[package]] +name = "sentry-sdk" +version = "1.17.0" +description = "Python client for Sentry (https://sentry.io)" +category = "main" +optional = false +python-versions = "*" +files = [ + {file = "sentry-sdk-1.17.0.tar.gz", hash = "sha256:ad40860325c94d1a656da70fba5a7c4dbb2f6809d3cc2d00f74ca0b608330f14"}, + {file = "sentry_sdk-1.17.0-py2.py3-none-any.whl", hash = "sha256:3c4e898f7a3edf5a2042cd0dcab6ee124e2112189228c272c08ad15d3850c201"}, +] + +[package.dependencies] +certifi = "*" +fastapi = {version = ">=0.79.0", optional = true, markers = "extra == \"fastapi\""} +urllib3 = {version = ">=1.26.11", markers = "python_version >= \"3.6\""} + +[package.extras] +aiohttp = ["aiohttp (>=3.5)"] +arq = ["arq (>=0.23)"] +beam = ["apache-beam (>=2.12)"] +bottle = ["bottle (>=0.12.13)"] +celery = ["celery (>=3)"] +chalice = ["chalice (>=1.16.0)"] +django = ["django (>=1.8)"] +falcon = ["falcon (>=1.4)"] +fastapi = ["fastapi (>=0.79.0)"] +flask = ["blinker (>=1.1)", "flask (>=0.11)"] +httpx = ["httpx (>=0.16.0)"] +huey = ["huey (>=2)"] +opentelemetry = ["opentelemetry-distro (>=0.35b0)"] +pure-eval = ["asttokens", "executing", "pure-eval"] +pymongo = ["pymongo (>=3.1)"] +pyspark = ["pyspark (>=2.4.4)"] +quart = ["blinker (>=1.1)", "quart (>=0.16.1)"] +rq = ["rq (>=0.6)"] +sanic = ["sanic (>=0.8)"] +sqlalchemy = ["sqlalchemy (>=1.2)"] +starlette = ["starlette (>=0.19.1)"] +starlite = ["starlite (>=1.48)"] +tornado = ["tornado (>=5)"] + [[package]] name = "setuptools" version = "67.6.0" @@ -2516,19 +2653,19 @@ typing-extensions = ">=3.7.4" [[package]] name = "urllib3" -version = "1.26.9" +version = "1.26.15" description = "HTTP library with thread-safe connection pooling, file post, and more." category = "main" optional = false -python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*, <4" +python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*, !=3.5.*" files = [ - {file = "urllib3-1.26.9-py2.py3-none-any.whl", hash = "sha256:44ece4d53fb1706f667c9bd1c648f5469a2ec925fcf3a776667042d645472c14"}, - {file = "urllib3-1.26.9.tar.gz", hash = "sha256:aabaf16477806a5e1dd19aa41f8c2b7950dd3c746362d7e3223dbe6de6ac448e"}, + {file = "urllib3-1.26.15-py2.py3-none-any.whl", hash = "sha256:aa751d169e23c7479ce47a0cb0da579e3ede798f994f5816a74e4f4500dcea42"}, + {file = "urllib3-1.26.15.tar.gz", hash = "sha256:8a388717b9476f934a21484e8c8e61875ab60644d29b9b39e11e4b9dc1c6b305"}, ] [package.extras] brotli = ["brotli (>=1.0.9)", "brotlicffi (>=0.8.0)", "brotlipy (>=0.6.0)"] -secure = ["certifi", "cryptography (>=1.3.4)", "idna (>=2.0.0)", "ipaddress", "pyOpenSSL (>=0.14)"] +secure = ["certifi", "cryptography (>=1.3.4)", "idna (>=2.0.0)", "ipaddress", "pyOpenSSL (>=0.14)", "urllib3-secure-extra"] socks = ["PySocks (>=1.5.6,!=1.5.7,<2.0)"] [[package]] @@ -2680,4 +2817,4 @@ testing = ["func-timeout", "jaraco.itertools", "pytest (>=6)", "pytest-black (>= [metadata] lock-version = "2.0" python-versions = "^3.10" -content-hash = "f77547c2850aaf70707f19ce6531d488719e848cd9ee03942ec0909f40b0d1cb" +content-hash = "480a4706a8c53d723f0a7431797ce868669f04b841d04240a85672493448bed8" diff --git a/backend/app/pyproject.toml b/backend/app/pyproject.toml index dbb55b7..be3e351 100644 --- a/backend/app/pyproject.toml +++ b/backend/app/pyproject.toml @@ -14,7 +14,6 @@ typer = "^0.4.0" progress = "^1.6" pymotyc = "^0.9.0" python-multipart = "^0.0.5" -requests = "^2.27.1" emails = "^0.6" gunicorn = "^20.1.0" Jinja2 = "^3.1.2" @@ -32,6 +31,10 @@ sqlalchemy-stubs = "^0.4" platformdirs = "2.6.2" fastapi = "^0.95.0" httpx = "^0.23.3" +sentry-sdk = {extras = ["fastapi"], version = "^1.17.0"} +requests = "^2.28.2" +google-auth = "^2.16.3" +google-auth-oauthlib = "^1.0.0" [tool.poetry.group.dev.dependencies] mypy = "^1.1.1" diff --git a/frontend/package-lock.json b/frontend/package-lock.json index feb8544..e83e6fe 100644 --- a/frontend/package-lock.json +++ b/frontend/package-lock.json @@ -1,20 +1,39 @@ { "name": "frontend", "version": "0.1.0", - "lockfileVersion": 2, + "lockfileVersion": 3, "requires": true, "packages": { "": { "name": "frontend", "version": "0.1.0", "dependencies": { - "@testing-library/jest-dom": "^5.16.4", - "@testing-library/react": "^13.3.0", - "@testing-library/user-event": "^13.5.0", + "@emotion/react": "^11.10.5", + "@emotion/styled": "^11.10.5", + "@mui/icons-material": "^5.11.0", + "@mui/material": "^5.11.6", + "@reduxjs/toolkit": "^1.9.3", + "axios": "^1.2.2", + "bootstrap": "^4.6.2", + "eslint": "^8.34.0", + "form-data": "^4.0.0", + "jest-watcher": "^29.4.1", + "jslint": "^0.12.1", "react": "^18.2.0", + "react-alert": "^7.0.3", + "react-alert-template-basic": "^1.0.2", + "react-bootstrap": "^1.5.2", + "react-datepicker": "^4.10.0", "react-dom": "^18.2.0", - "react-scripts": "5.0.1", - "web-vitals": "^2.1.4" + "react-redux": "^8.0.5", + "react-router-dom": "^5.2.0", + "react-scripts": "5.0.0", + "react-select": "^5.7.0", + "react-slick": "^0.28.1", + "react-tradingview-embed": "^2.2.6", + "sass": "^1.47.0", + "slick-carousel": "^1.8.1", + "web-vitals": "^2.1.3" } }, "node_modules/@ampproject/remapping": { @@ -1799,11 +1818,11 @@ } }, "node_modules/@babel/runtime": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.18.6.tgz", - "integrity": "sha512-t9wi7/AW6XtKahAe20Yw0/mMljKq0B1r2fPdvaAdV/KPDZewFXdaaa6K7lxmZBZ8FBNpCiAT6iHPmd6QO9bKfQ==", + "version": "7.21.0", + "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.21.0.tgz", + "integrity": "sha512-xwII0//EObnq89Ji5AKYQaRYiW/nZ3llSv29d49IuxPhKbtJoLP+9QUUZ4nVragQVtaVGeZrpB+ZtG/Pdy/POw==", "dependencies": { - "regenerator-runtime": "^0.13.4" + "regenerator-runtime": "^0.13.11" }, "engines": { "node": ">=6.9.0" @@ -2106,15 +2125,189 @@ "postcss-selector-parser": "^6.0.10" } }, + "node_modules/@emotion/babel-plugin": { + "version": "11.10.6", + "resolved": "https://registry.npmjs.org/@emotion/babel-plugin/-/babel-plugin-11.10.6.tgz", + "integrity": "sha512-p2dAqtVrkhSa7xz1u/m9eHYdLi+en8NowrmXeF/dKtJpU8lCWli8RUAati7NcSl0afsBott48pdnANuD0wh9QQ==", + "dependencies": { + "@babel/helper-module-imports": "^7.16.7", + "@babel/runtime": "^7.18.3", + "@emotion/hash": "^0.9.0", + "@emotion/memoize": "^0.8.0", + "@emotion/serialize": "^1.1.1", + "babel-plugin-macros": "^3.1.0", + "convert-source-map": "^1.5.0", + "escape-string-regexp": "^4.0.0", + "find-root": "^1.1.0", + "source-map": "^0.5.7", + "stylis": "4.1.3" + } + }, + "node_modules/@emotion/babel-plugin/node_modules/escape-string-regexp": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz", + "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@emotion/babel-plugin/node_modules/source-map": { + "version": "0.5.7", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", + "integrity": "sha512-LbrmJOMUSdEVxIKvdcJzQC+nQhe8FUZQTXQy6+I75skNgn3OoQ0DZA8YnFa7gp8tqtL3KPf1kmo0R5DoApeSGQ==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/@emotion/cache": { + "version": "11.10.5", + "resolved": "https://registry.npmjs.org/@emotion/cache/-/cache-11.10.5.tgz", + "integrity": "sha512-dGYHWyzTdmK+f2+EnIGBpkz1lKc4Zbj2KHd4cX3Wi8/OWr5pKslNjc3yABKH4adRGCvSX4VDC0i04mrrq0aiRA==", + "dependencies": { + "@emotion/memoize": "^0.8.0", + "@emotion/sheet": "^1.2.1", + "@emotion/utils": "^1.2.0", + "@emotion/weak-memoize": "^0.3.0", + "stylis": "4.1.3" + } + }, + "node_modules/@emotion/hash": { + "version": "0.9.0", + "resolved": "https://registry.npmjs.org/@emotion/hash/-/hash-0.9.0.tgz", + "integrity": "sha512-14FtKiHhy2QoPIzdTcvh//8OyBlknNs2nXRwIhG904opCby3l+9Xaf/wuPvICBF0rc1ZCNBd3nKe9cd2mecVkQ==" + }, + "node_modules/@emotion/is-prop-valid": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/@emotion/is-prop-valid/-/is-prop-valid-1.2.0.tgz", + "integrity": "sha512-3aDpDprjM0AwaxGE09bOPkNxHpBd+kA6jty3RnaEXdweX1DF1U3VQpPYb0g1IStAuK7SVQ1cy+bNBBKp4W3Fjg==", + "dependencies": { + "@emotion/memoize": "^0.8.0" + } + }, + "node_modules/@emotion/memoize": { + "version": "0.8.0", + "resolved": "https://registry.npmjs.org/@emotion/memoize/-/memoize-0.8.0.tgz", + "integrity": "sha512-G/YwXTkv7Den9mXDO7AhLWkE3q+I92B+VqAE+dYG4NGPaHZGvt3G8Q0p9vmE+sq7rTGphUbAvmQ9YpbfMQGGlA==" + }, + "node_modules/@emotion/react": { + "version": "11.10.6", + "resolved": "https://registry.npmjs.org/@emotion/react/-/react-11.10.6.tgz", + "integrity": "sha512-6HT8jBmcSkfzO7mc+N1L9uwvOnlcGoix8Zn7srt+9ga0MjREo6lRpuVX0kzo6Jp6oTqDhREOFsygN6Ew4fEQbw==", + "dependencies": { + "@babel/runtime": "^7.18.3", + "@emotion/babel-plugin": "^11.10.6", + "@emotion/cache": "^11.10.5", + "@emotion/serialize": "^1.1.1", + "@emotion/use-insertion-effect-with-fallbacks": "^1.0.0", + "@emotion/utils": "^1.2.0", + "@emotion/weak-memoize": "^0.3.0", + "hoist-non-react-statics": "^3.3.1" + }, + "peerDependencies": { + "react": ">=16.8.0" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/@emotion/serialize": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/@emotion/serialize/-/serialize-1.1.1.tgz", + "integrity": "sha512-Zl/0LFggN7+L1liljxXdsVSVlg6E/Z/olVWpfxUTxOAmi8NU7YoeWeLfi1RmnB2TATHoaWwIBRoL+FvAJiTUQA==", + "dependencies": { + "@emotion/hash": "^0.9.0", + "@emotion/memoize": "^0.8.0", + "@emotion/unitless": "^0.8.0", + "@emotion/utils": "^1.2.0", + "csstype": "^3.0.2" + } + }, + "node_modules/@emotion/sheet": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/@emotion/sheet/-/sheet-1.2.1.tgz", + "integrity": "sha512-zxRBwl93sHMsOj4zs+OslQKg/uhF38MB+OMKoCrVuS0nyTkqnau+BM3WGEoOptg9Oz45T/aIGs1qbVAsEFo3nA==" + }, + "node_modules/@emotion/styled": { + "version": "11.10.6", + "resolved": "https://registry.npmjs.org/@emotion/styled/-/styled-11.10.6.tgz", + "integrity": "sha512-OXtBzOmDSJo5Q0AFemHCfl+bUueT8BIcPSxu0EGTpGk6DmI5dnhSzQANm1e1ze0YZL7TDyAyy6s/b/zmGOS3Og==", + "dependencies": { + "@babel/runtime": "^7.18.3", + "@emotion/babel-plugin": "^11.10.6", + "@emotion/is-prop-valid": "^1.2.0", + "@emotion/serialize": "^1.1.1", + "@emotion/use-insertion-effect-with-fallbacks": "^1.0.0", + "@emotion/utils": "^1.2.0" + }, + "peerDependencies": { + "@emotion/react": "^11.0.0-rc.0", + "react": ">=16.8.0" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/@emotion/unitless": { + "version": "0.8.0", + "resolved": "https://registry.npmjs.org/@emotion/unitless/-/unitless-0.8.0.tgz", + "integrity": "sha512-VINS5vEYAscRl2ZUDiT3uMPlrFQupiKgHz5AA4bCH1miKBg4qtwkim1qPmJj/4WG6TreYMY111rEFsjupcOKHw==" + }, + "node_modules/@emotion/use-insertion-effect-with-fallbacks": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/@emotion/use-insertion-effect-with-fallbacks/-/use-insertion-effect-with-fallbacks-1.0.0.tgz", + "integrity": "sha512-1eEgUGmkaljiBnRMTdksDV1W4kUnmwgp7X9G8B++9GYwl1lUdqSndSriIrTJ0N7LQaoauY9JJ2yhiOYK5+NI4A==", + "peerDependencies": { + "react": ">=16.8.0" + } + }, + "node_modules/@emotion/utils": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/@emotion/utils/-/utils-1.2.0.tgz", + "integrity": "sha512-sn3WH53Kzpw8oQ5mgMmIzzyAaH2ZqFEbozVVBSYp538E06OSE6ytOp7pRAjNQR+Q/orwqdQYJSe2m3hCOeznkw==" + }, + "node_modules/@emotion/weak-memoize": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/@emotion/weak-memoize/-/weak-memoize-0.3.0.tgz", + "integrity": "sha512-AHPmaAx+RYfZz0eYu6Gviiagpmiyw98ySSlQvCUhVGDRtDFe4DBS0x1bSjdF3gqUDYOczB+yYvBTtEylYSdRhg==" + }, + "node_modules/@eslint-community/eslint-utils": { + "version": "4.4.0", + "resolved": "https://registry.npmjs.org/@eslint-community/eslint-utils/-/eslint-utils-4.4.0.tgz", + "integrity": "sha512-1/sA4dwrzBAyeUoQ6oxahHKmrZvsnLCg4RfxW3ZFGGmQkSNQPFNLV9CUEFQP1x9EYXHTo5p6xdhZM1Ne9p/AfA==", + "dependencies": { + "eslint-visitor-keys": "^3.3.0" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "peerDependencies": { + "eslint": "^6.0.0 || ^7.0.0 || >=8.0.0" + } + }, + "node_modules/@eslint-community/regexpp": { + "version": "4.4.1", + "resolved": "https://registry.npmjs.org/@eslint-community/regexpp/-/regexpp-4.4.1.tgz", + "integrity": "sha512-BISJ6ZE4xQsuL/FmsyRaiffpq977bMlsKfGHTQrOGFErfByxIe6iZTxPf/00Zon9b9a7iUykfQwejN3s2ZW/Bw==", + "engines": { + "node": "^12.0.0 || ^14.0.0 || >=16.0.0" + } + }, "node_modules/@eslint/eslintrc": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-1.3.0.tgz", - "integrity": "sha512-UWW0TMTmk2d7hLcWD1/e2g5HDM/HQ3csaLSqXCfqwh4uNDuNqlaKWXmEsL4Cs41Z0KnILNvwbHAah3C2yt06kw==", + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-2.0.1.tgz", + "integrity": "sha512-eFRmABvW2E5Ho6f5fHLqgena46rOj7r7OKHYfLElqcBfGFHHpjBhivyi5+jOEQuSpdc/1phIZJlbC2te+tZNIw==", "dependencies": { "ajv": "^6.12.4", "debug": "^4.3.2", - "espree": "^9.3.2", - "globals": "^13.15.0", + "espree": "^9.5.0", + "globals": "^13.19.0", "ignore": "^5.2.0", "import-fresh": "^3.2.1", "js-yaml": "^4.1.0", @@ -2123,6 +2316,9 @@ }, "engines": { "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" } }, "node_modules/@eslint/eslintrc/node_modules/argparse": { @@ -2131,9 +2327,9 @@ "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==" }, "node_modules/@eslint/eslintrc/node_modules/globals": { - "version": "13.16.0", - "resolved": "https://registry.npmjs.org/globals/-/globals-13.16.0.tgz", - "integrity": "sha512-A1lrQfpNF+McdPOnnFqY3kSN0AFTy485bTi1bkLk4mVPODIUEcSfhHgRqA+QdXPksrSTTztYXx37NFV+GpGk3Q==", + "version": "13.20.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-13.20.0.tgz", + "integrity": "sha512-Qg5QtVkCy/kv3FUSlu4ukeZDVf9ee0iXLAUYX13gbR17bnejFTzr4iS9bY7kwCf1NztRNm1t91fjOiyx4CSwPQ==", "dependencies": { "type-fest": "^0.20.2" }, @@ -2166,19 +2362,52 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/@eslint/js": { + "version": "8.36.0", + "resolved": "https://registry.npmjs.org/@eslint/js/-/js-8.36.0.tgz", + "integrity": "sha512-lxJ9R5ygVm8ZWgYdUweoq5ownDlJ4upvoWmO4eLxBYHdMo+vZ/Rx0EN6MbKWDJOSUGrqJy2Gt+Dyv/VKml0fjg==", + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + } + }, + "node_modules/@floating-ui/core": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/@floating-ui/core/-/core-1.2.4.tgz", + "integrity": "sha512-SQOeVbMwb1di+mVWWJLpsUTToKfqVNioXys011beCAhyOIFtS+GQoW4EQSneuxzmQKddExDwQ+X0hLl4lJJaSQ==" + }, + "node_modules/@floating-ui/dom": { + "version": "1.2.5", + "resolved": "https://registry.npmjs.org/@floating-ui/dom/-/dom-1.2.5.tgz", + "integrity": "sha512-+sAUfpQ3Frz+VCbPCqj+cZzvEESy3fjSeT/pDWkYCWOBXYNNKZfuVsHuv8/JO2zze8+Eb/Q7a6hZVgzS81fLbQ==", + "dependencies": { + "@floating-ui/core": "^1.2.4" + } + }, "node_modules/@humanwhocodes/config-array": { - "version": "0.9.5", - "resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.9.5.tgz", - "integrity": "sha512-ObyMyWxZiCu/yTisA7uzx81s40xR2fD5Cg/2Kq7G02ajkNubJf6BopgDTmDyc3U7sXpNKM8cYOw7s7Tyr+DnCw==", + "version": "0.11.8", + "resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.11.8.tgz", + "integrity": "sha512-UybHIJzJnR5Qc/MsD9Kr+RpO2h+/P1GhOwdiLPXK5TWk5sgTdu88bTD9UP+CKbPPh5Rni1u0GjAdYQLemG8g+g==", "dependencies": { "@humanwhocodes/object-schema": "^1.2.1", "debug": "^4.1.1", - "minimatch": "^3.0.4" + "minimatch": "^3.0.5" }, "engines": { "node": ">=10.10.0" } }, + "node_modules/@humanwhocodes/module-importer": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@humanwhocodes/module-importer/-/module-importer-1.0.1.tgz", + "integrity": "sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA==", + "engines": { + "node": ">=12.22" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/nzakas" + } + }, "node_modules/@humanwhocodes/object-schema": { "version": "1.2.1", "resolved": "https://registry.npmjs.org/@humanwhocodes/object-schema/-/object-schema-1.2.1.tgz", @@ -2442,6 +2671,23 @@ "node": ">=8" } }, + "node_modules/@jest/core/node_modules/jest-watcher": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/jest-watcher/-/jest-watcher-27.5.1.tgz", + "integrity": "sha512-z676SuD6Z8o8qbmEGhoEUFOM1+jfEiL3DXHK/xgEiG2EyNYfFG60jluWcupY6dATjfEsKQuibReS1djInQnoVw==", + "dependencies": { + "@jest/test-result": "^27.5.1", + "@jest/types": "^27.5.1", + "@types/node": "*", + "ansi-escapes": "^4.2.1", + "chalk": "^4.0.0", + "jest-util": "^27.5.1", + "string-length": "^4.0.1" + }, + "engines": { + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + } + }, "node_modules/@jest/core/node_modules/supports-color": { "version": "7.2.0", "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", @@ -2916,135 +3162,451 @@ "resolved": "https://registry.npmjs.org/@leichtgewicht/ip-codec/-/ip-codec-2.0.4.tgz", "integrity": "sha512-Hcv+nVC0kZnQ3tD9GVu5xSMR4VVYOteQIr/hwFPVEvPdlXqgGEuRjiheChHgdM+JyqdgNcmzZOX/tnl0JOiI7A==" }, - "node_modules/@nodelib/fs.scandir": { - "version": "2.1.5", - "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz", - "integrity": "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==", - "dependencies": { - "@nodelib/fs.stat": "2.0.5", - "run-parallel": "^1.1.9" + "node_modules/@mui/base": { + "version": "5.0.0-alpha.122", + "resolved": "https://registry.npmjs.org/@mui/base/-/base-5.0.0-alpha.122.tgz", + "integrity": "sha512-IgZEFQyHa39J1+Q3tekVdhPuUm1fr3icddaNLmiAIeYTVXmR7KR5FhBAIL0P+4shlPq0liUPGlXryoTm0iCeFg==", + "dependencies": { + "@babel/runtime": "^7.21.0", + "@emotion/is-prop-valid": "^1.2.0", + "@mui/types": "^7.2.3", + "@mui/utils": "^5.11.13", + "@popperjs/core": "^2.11.6", + "clsx": "^1.2.1", + "prop-types": "^15.8.1", + "react-is": "^18.2.0" }, "engines": { - "node": ">= 8" + "node": ">=12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/mui" + }, + "peerDependencies": { + "@types/react": "^17.0.0 || ^18.0.0", + "react": "^17.0.0 || ^18.0.0", + "react-dom": "^17.0.0 || ^18.0.0" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } } }, - "node_modules/@nodelib/fs.stat": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz", - "integrity": "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==", - "engines": { - "node": ">= 8" + "node_modules/@mui/base/node_modules/react-is": { + "version": "18.2.0", + "resolved": "https://registry.npmjs.org/react-is/-/react-is-18.2.0.tgz", + "integrity": "sha512-xWGDIW6x921xtzPkhiULtthJHoJvBbF3q26fzloPCK0hsvxtPVelvftw3zjbHWSkR2km9Z+4uxbDDK/6Zw9B8w==" + }, + "node_modules/@mui/core-downloads-tracker": { + "version": "5.11.14", + "resolved": "https://registry.npmjs.org/@mui/core-downloads-tracker/-/core-downloads-tracker-5.11.14.tgz", + "integrity": "sha512-rfc08z6+3Fif+Gopx2/qmk+MEQlwYeA+gOcSK048BHkTty/ol/boHuVeL2BNC/cf9OVRjJLYHtVb/DeW791LSQ==", + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/mui" } }, - "node_modules/@nodelib/fs.walk": { - "version": "1.2.8", - "resolved": "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz", - "integrity": "sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==", + "node_modules/@mui/icons-material": { + "version": "5.11.11", + "resolved": "https://registry.npmjs.org/@mui/icons-material/-/icons-material-5.11.11.tgz", + "integrity": "sha512-Eell3ADmQVE8HOpt/LZ3zIma8JSvPh3XgnhwZLT0k5HRqZcd6F/QDHc7xsWtgz09t+UEFvOYJXjtrwKmLdwwpw==", "dependencies": { - "@nodelib/fs.scandir": "2.1.5", - "fastq": "^1.6.0" + "@babel/runtime": "^7.21.0" }, "engines": { - "node": ">= 8" + "node": ">=12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/mui" + }, + "peerDependencies": { + "@mui/material": "^5.0.0", + "@types/react": "^17.0.0 || ^18.0.0", + "react": "^17.0.0 || ^18.0.0" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } } }, - "node_modules/@pmmmwh/react-refresh-webpack-plugin": { - "version": "0.5.7", - "resolved": "https://registry.npmjs.org/@pmmmwh/react-refresh-webpack-plugin/-/react-refresh-webpack-plugin-0.5.7.tgz", - "integrity": "sha512-bcKCAzF0DV2IIROp9ZHkRJa6O4jy7NlnHdWL3GmcUxYWNjLXkK5kfELELwEfSP5hXPfVL/qOGMAROuMQb9GG8Q==", - "dependencies": { - "ansi-html-community": "^0.0.8", - "common-path-prefix": "^3.0.0", - "core-js-pure": "^3.8.1", - "error-stack-parser": "^2.0.6", - "find-up": "^5.0.0", - "html-entities": "^2.1.0", - "loader-utils": "^2.0.0", - "schema-utils": "^3.0.0", - "source-map": "^0.7.3" + "node_modules/@mui/material": { + "version": "5.11.14", + "resolved": "https://registry.npmjs.org/@mui/material/-/material-5.11.14.tgz", + "integrity": "sha512-uoiUyybmo+M+nYARBygmbXgX6s/hH0NKD56LCAv9XvmdGVoXhEGjOvxI5/Bng6FS3NNybnA8V+rgZW1Z/9OJtA==", + "dependencies": { + "@babel/runtime": "^7.21.0", + "@mui/base": "5.0.0-alpha.122", + "@mui/core-downloads-tracker": "^5.11.14", + "@mui/system": "^5.11.14", + "@mui/types": "^7.2.3", + "@mui/utils": "^5.11.13", + "@types/react-transition-group": "^4.4.5", + "clsx": "^1.2.1", + "csstype": "^3.1.1", + "prop-types": "^15.8.1", + "react-is": "^18.2.0", + "react-transition-group": "^4.4.5" }, "engines": { - "node": ">= 10.13" + "node": ">=12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/mui" }, "peerDependencies": { - "@types/webpack": "4.x || 5.x", - "react-refresh": ">=0.10.0 <1.0.0", - "sockjs-client": "^1.4.0", - "type-fest": ">=0.17.0 <3.0.0", - "webpack": ">=4.43.0 <6.0.0", - "webpack-dev-server": "3.x || 4.x", - "webpack-hot-middleware": "2.x", - "webpack-plugin-serve": "0.x || 1.x" + "@emotion/react": "^11.5.0", + "@emotion/styled": "^11.3.0", + "@types/react": "^17.0.0 || ^18.0.0", + "react": "^17.0.0 || ^18.0.0", + "react-dom": "^17.0.0 || ^18.0.0" }, "peerDependenciesMeta": { - "@types/webpack": { - "optional": true - }, - "sockjs-client": { - "optional": true - }, - "type-fest": { + "@emotion/react": { "optional": true }, - "webpack-dev-server": { - "optional": true - }, - "webpack-hot-middleware": { + "@emotion/styled": { "optional": true }, - "webpack-plugin-serve": { + "@types/react": { "optional": true } } }, - "node_modules/@rollup/plugin-babel": { - "version": "5.3.1", - "resolved": "https://registry.npmjs.org/@rollup/plugin-babel/-/plugin-babel-5.3.1.tgz", - "integrity": "sha512-WFfdLWU/xVWKeRQnKmIAQULUI7Il0gZnBIH/ZFO069wYIfPu+8zrfp/KMW0atmELoRDq8FbiP3VCss9MhCut7Q==", + "node_modules/@mui/material/node_modules/react-is": { + "version": "18.2.0", + "resolved": "https://registry.npmjs.org/react-is/-/react-is-18.2.0.tgz", + "integrity": "sha512-xWGDIW6x921xtzPkhiULtthJHoJvBbF3q26fzloPCK0hsvxtPVelvftw3zjbHWSkR2km9Z+4uxbDDK/6Zw9B8w==" + }, + "node_modules/@mui/private-theming": { + "version": "5.11.13", + "resolved": "https://registry.npmjs.org/@mui/private-theming/-/private-theming-5.11.13.tgz", + "integrity": "sha512-PJnYNKzW5LIx3R+Zsp6WZVPs6w5sEKJ7mgLNnUXuYB1zo5aX71FVLtV7geyPXRcaN2tsoRNK7h444ED0t7cIjA==", "dependencies": { - "@babel/helper-module-imports": "^7.10.4", - "@rollup/pluginutils": "^3.1.0" + "@babel/runtime": "^7.21.0", + "@mui/utils": "^5.11.13", + "prop-types": "^15.8.1" }, "engines": { - "node": ">= 10.0.0" + "node": ">=12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/mui" }, "peerDependencies": { - "@babel/core": "^7.0.0", - "@types/babel__core": "^7.1.9", - "rollup": "^1.20.0||^2.0.0" + "@types/react": "^17.0.0 || ^18.0.0", + "react": "^17.0.0 || ^18.0.0" }, "peerDependenciesMeta": { - "@types/babel__core": { + "@types/react": { "optional": true } } }, - "node_modules/@rollup/plugin-node-resolve": { - "version": "11.2.1", - "resolved": "https://registry.npmjs.org/@rollup/plugin-node-resolve/-/plugin-node-resolve-11.2.1.tgz", - "integrity": "sha512-yc2n43jcqVyGE2sqV5/YCmocy9ArjVAP/BeXyTtADTBBX6V0e5UMqwO8CdQ0kzjb6zu5P1qMzsScCMRvE9OlVg==", + "node_modules/@mui/styled-engine": { + "version": "5.11.11", + "resolved": "https://registry.npmjs.org/@mui/styled-engine/-/styled-engine-5.11.11.tgz", + "integrity": "sha512-wV0UgW4lN5FkDBXefN8eTYeuE9sjyQdg5h94vtwZCUamGQEzmCOtir4AakgmbWMy0x8OLjdEUESn9wnf5J9MOg==", "dependencies": { - "@rollup/pluginutils": "^3.1.0", - "@types/resolve": "1.17.1", - "builtin-modules": "^3.1.0", - "deepmerge": "^4.2.2", - "is-module": "^1.0.0", - "resolve": "^1.19.0" + "@babel/runtime": "^7.21.0", + "@emotion/cache": "^11.10.5", + "csstype": "^3.1.1", + "prop-types": "^15.8.1" }, "engines": { - "node": ">= 10.0.0" + "node": ">=12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/mui" }, "peerDependencies": { - "rollup": "^1.20.0||^2.0.0" + "@emotion/react": "^11.4.1", + "@emotion/styled": "^11.3.0", + "react": "^17.0.0 || ^18.0.0" + }, + "peerDependenciesMeta": { + "@emotion/react": { + "optional": true + }, + "@emotion/styled": { + "optional": true + } } }, - "node_modules/@rollup/plugin-replace": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/@rollup/plugin-replace/-/plugin-replace-2.4.2.tgz", - "integrity": "sha512-IGcu+cydlUMZ5En85jxHH4qj2hta/11BHq95iHEyb2sbgiN0eCdzvUcHw5gt9pBL5lTi4JDYJ1acCoMGpTvEZg==", + "node_modules/@mui/system": { + "version": "5.11.14", + "resolved": "https://registry.npmjs.org/@mui/system/-/system-5.11.14.tgz", + "integrity": "sha512-/MBv5dUoijJNEKEGi5tppIszGN0o2uejmeISi5vl0CLcaQsI1cd+uBgK+JYUP1VWvI/MtkWRLVSWtF2FWhu5Nw==", "dependencies": { - "@rollup/pluginutils": "^3.1.0", - "magic-string": "^0.25.7" + "@babel/runtime": "^7.21.0", + "@mui/private-theming": "^5.11.13", + "@mui/styled-engine": "^5.11.11", + "@mui/types": "^7.2.3", + "@mui/utils": "^5.11.13", + "clsx": "^1.2.1", + "csstype": "^3.1.1", + "prop-types": "^15.8.1" + }, + "engines": { + "node": ">=12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/mui" + }, + "peerDependencies": { + "@emotion/react": "^11.5.0", + "@emotion/styled": "^11.3.0", + "@types/react": "^17.0.0 || ^18.0.0", + "react": "^17.0.0 || ^18.0.0" + }, + "peerDependenciesMeta": { + "@emotion/react": { + "optional": true + }, + "@emotion/styled": { + "optional": true + }, + "@types/react": { + "optional": true + } + } + }, + "node_modules/@mui/types": { + "version": "7.2.3", + "resolved": "https://registry.npmjs.org/@mui/types/-/types-7.2.3.tgz", + "integrity": "sha512-tZ+CQggbe9Ol7e/Fs5RcKwg/woU+o8DCtOnccX6KmbBc7YrfqMYEYuaIcXHuhpT880QwNkZZ3wQwvtlDFA2yOw==", + "peerDependencies": { + "@types/react": "*" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/@mui/utils": { + "version": "5.11.13", + "resolved": "https://registry.npmjs.org/@mui/utils/-/utils-5.11.13.tgz", + "integrity": "sha512-5ltA58MM9euOuUcnvwFJqpLdEugc9XFsRR8Gt4zZNb31XzMfSKJPR4eumulyhsOTK1rWf7K4D63NKFPfX0AxqA==", + "dependencies": { + "@babel/runtime": "^7.21.0", + "@types/prop-types": "^15.7.5", + "@types/react-is": "^16.7.1 || ^17.0.0", + "prop-types": "^15.8.1", + "react-is": "^18.2.0" + }, + "engines": { + "node": ">=12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/mui" + }, + "peerDependencies": { + "react": "^17.0.0 || ^18.0.0" + } + }, + "node_modules/@mui/utils/node_modules/react-is": { + "version": "18.2.0", + "resolved": "https://registry.npmjs.org/react-is/-/react-is-18.2.0.tgz", + "integrity": "sha512-xWGDIW6x921xtzPkhiULtthJHoJvBbF3q26fzloPCK0hsvxtPVelvftw3zjbHWSkR2km9Z+4uxbDDK/6Zw9B8w==" + }, + "node_modules/@nodelib/fs.scandir": { + "version": "2.1.5", + "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz", + "integrity": "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==", + "dependencies": { + "@nodelib/fs.stat": "2.0.5", + "run-parallel": "^1.1.9" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/@nodelib/fs.stat": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz", + "integrity": "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==", + "engines": { + "node": ">= 8" + } + }, + "node_modules/@nodelib/fs.walk": { + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz", + "integrity": "sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==", + "dependencies": { + "@nodelib/fs.scandir": "2.1.5", + "fastq": "^1.6.0" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/@pmmmwh/react-refresh-webpack-plugin": { + "version": "0.5.7", + "resolved": "https://registry.npmjs.org/@pmmmwh/react-refresh-webpack-plugin/-/react-refresh-webpack-plugin-0.5.7.tgz", + "integrity": "sha512-bcKCAzF0DV2IIROp9ZHkRJa6O4jy7NlnHdWL3GmcUxYWNjLXkK5kfELELwEfSP5hXPfVL/qOGMAROuMQb9GG8Q==", + "dependencies": { + "ansi-html-community": "^0.0.8", + "common-path-prefix": "^3.0.0", + "core-js-pure": "^3.8.1", + "error-stack-parser": "^2.0.6", + "find-up": "^5.0.0", + "html-entities": "^2.1.0", + "loader-utils": "^2.0.0", + "schema-utils": "^3.0.0", + "source-map": "^0.7.3" + }, + "engines": { + "node": ">= 10.13" + }, + "peerDependencies": { + "@types/webpack": "4.x || 5.x", + "react-refresh": ">=0.10.0 <1.0.0", + "sockjs-client": "^1.4.0", + "type-fest": ">=0.17.0 <3.0.0", + "webpack": ">=4.43.0 <6.0.0", + "webpack-dev-server": "3.x || 4.x", + "webpack-hot-middleware": "2.x", + "webpack-plugin-serve": "0.x || 1.x" + }, + "peerDependenciesMeta": { + "@types/webpack": { + "optional": true + }, + "sockjs-client": { + "optional": true + }, + "type-fest": { + "optional": true + }, + "webpack-dev-server": { + "optional": true + }, + "webpack-hot-middleware": { + "optional": true + }, + "webpack-plugin-serve": { + "optional": true + } + } + }, + "node_modules/@popperjs/core": { + "version": "2.11.7", + "resolved": "https://registry.npmjs.org/@popperjs/core/-/core-2.11.7.tgz", + "integrity": "sha512-Cr4OjIkipTtcXKjAsm8agyleBuDHvxzeBoa1v543lbv1YaIwQjESsVcmjiWiPEbC1FIeHOG/Op9kdCmAmiS3Kw==", + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/popperjs" + } + }, + "node_modules/@reduxjs/toolkit": { + "version": "1.9.3", + "resolved": "https://registry.npmjs.org/@reduxjs/toolkit/-/toolkit-1.9.3.tgz", + "integrity": "sha512-GU2TNBQVofL09VGmuSioNPQIu6Ml0YLf4EJhgj0AvBadRlCGzUWet8372LjvO4fqKZF2vH1xU0htAa7BrK9pZg==", + "dependencies": { + "immer": "^9.0.16", + "redux": "^4.2.0", + "redux-thunk": "^2.4.2", + "reselect": "^4.1.7" + }, + "peerDependencies": { + "react": "^16.9.0 || ^17.0.0 || ^18", + "react-redux": "^7.2.1 || ^8.0.2" + }, + "peerDependenciesMeta": { + "react": { + "optional": true + }, + "react-redux": { + "optional": true + } + } + }, + "node_modules/@reduxjs/toolkit/node_modules/immer": { + "version": "9.0.21", + "resolved": "https://registry.npmjs.org/immer/-/immer-9.0.21.tgz", + "integrity": "sha512-bc4NBHqOqSfRW7POMkHd51LvClaeMXpm8dx0e8oE2GORbq5aRK7Bxl4FyzVLdGtLmvLKL7BTDBG5ACQm4HWjTA==", + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/immer" + } + }, + "node_modules/@restart/context": { + "version": "2.1.4", + "resolved": "https://registry.npmjs.org/@restart/context/-/context-2.1.4.tgz", + "integrity": "sha512-INJYZQJP7g+IoDUh/475NlGiTeMfwTXUEr3tmRneckHIxNolGOW9CTq83S8cxq0CgJwwcMzMJFchxvlwe7Rk8Q==", + "peerDependencies": { + "react": ">=16.3.2" + } + }, + "node_modules/@restart/hooks": { + "version": "0.4.9", + "resolved": "https://registry.npmjs.org/@restart/hooks/-/hooks-0.4.9.tgz", + "integrity": "sha512-3BekqcwB6Umeya+16XPooARn4qEPW6vNvwYnlofIYe6h9qG1/VeD7UvShCWx11eFz5ELYmwIEshz+MkPX3wjcQ==", + "dependencies": { + "dequal": "^2.0.2" + }, + "peerDependencies": { + "react": ">=16.8.0" + } + }, + "node_modules/@rollup/plugin-babel": { + "version": "5.3.1", + "resolved": "https://registry.npmjs.org/@rollup/plugin-babel/-/plugin-babel-5.3.1.tgz", + "integrity": "sha512-WFfdLWU/xVWKeRQnKmIAQULUI7Il0gZnBIH/ZFO069wYIfPu+8zrfp/KMW0atmELoRDq8FbiP3VCss9MhCut7Q==", + "dependencies": { + "@babel/helper-module-imports": "^7.10.4", + "@rollup/pluginutils": "^3.1.0" + }, + "engines": { + "node": ">= 10.0.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0", + "@types/babel__core": "^7.1.9", + "rollup": "^1.20.0||^2.0.0" + }, + "peerDependenciesMeta": { + "@types/babel__core": { + "optional": true + } + } + }, + "node_modules/@rollup/plugin-node-resolve": { + "version": "11.2.1", + "resolved": "https://registry.npmjs.org/@rollup/plugin-node-resolve/-/plugin-node-resolve-11.2.1.tgz", + "integrity": "sha512-yc2n43jcqVyGE2sqV5/YCmocy9ArjVAP/BeXyTtADTBBX6V0e5UMqwO8CdQ0kzjb6zu5P1qMzsScCMRvE9OlVg==", + "dependencies": { + "@rollup/pluginutils": "^3.1.0", + "@types/resolve": "1.17.1", + "builtin-modules": "^3.1.0", + "deepmerge": "^4.2.2", + "is-module": "^1.0.0", + "resolve": "^1.19.0" + }, + "engines": { + "node": ">= 10.0.0" + }, + "peerDependencies": { + "rollup": "^1.20.0||^2.0.0" + } + }, + "node_modules/@rollup/plugin-replace": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/@rollup/plugin-replace/-/plugin-replace-2.4.2.tgz", + "integrity": "sha512-IGcu+cydlUMZ5En85jxHH4qj2hta/11BHq95iHEyb2sbgiN0eCdzvUcHw5gt9pBL5lTi4JDYJ1acCoMGpTvEZg==", + "dependencies": { + "@rollup/pluginutils": "^3.1.0", + "magic-string": "^0.25.7" }, "peerDependencies": { "rollup": "^1.20.0 || ^2.0.0" @@ -3495,23 +4057,6 @@ "node": ">=8" } }, - "node_modules/@testing-library/react": { - "version": "13.3.0", - "resolved": "https://registry.npmjs.org/@testing-library/react/-/react-13.3.0.tgz", - "integrity": "sha512-DB79aA426+deFgGSjnf5grczDPiL4taK3hFaa+M5q7q20Kcve9eQottOG5kZ74KEr55v0tU2CQormSSDK87zYQ==", - "dependencies": { - "@babel/runtime": "^7.12.5", - "@testing-library/dom": "^8.5.0", - "@types/react-dom": "^18.0.0" - }, - "engines": { - "node": ">=12" - }, - "peerDependencies": { - "react": "^18.0.0", - "react-dom": "^18.0.0" - } - }, "node_modules/@testing-library/user-event": { "version": "13.5.0", "resolved": "https://registry.npmjs.org/@testing-library/user-event/-/user-event-13.5.0.tgz", @@ -3671,6 +4216,15 @@ "@types/node": "*" } }, + "node_modules/@types/hoist-non-react-statics": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/@types/hoist-non-react-statics/-/hoist-non-react-statics-3.3.1.tgz", + "integrity": "sha512-iMIqiko6ooLrTh1joXodJK5X9xeEALT1kM5G3ZLhD3hszxBdIEd5C75U834D9mLcINgD4OyZf5uQXjkuYydWvA==", + "dependencies": { + "@types/react": "*", + "hoist-non-react-statics": "^3.3.0" + } + }, "node_modules/@types/html-minifier-terser": { "version": "6.1.0", "resolved": "https://registry.npmjs.org/@types/html-minifier-terser/-/html-minifier-terser-6.1.0.tgz", @@ -3684,6 +4238,11 @@ "@types/node": "*" } }, + "node_modules/@types/invariant": { + "version": "2.2.35", + "resolved": "https://registry.npmjs.org/@types/invariant/-/invariant-2.2.35.tgz", + "integrity": "sha512-DxX1V9P8zdJPYQat1gHyY0xj3efl8gnMVjiM9iCY6y27lj+PoQWkgjt8jDqmovPqULkKVpKRg8J36iQiA+EtEg==" + }, "node_modules/@types/istanbul-lib-coverage": { "version": "2.0.4", "resolved": "https://registry.npmjs.org/@types/istanbul-lib-coverage/-/istanbul-lib-coverage-2.0.4.tgz", @@ -3912,10 +4471,18 @@ "csstype": "^3.0.2" } }, - "node_modules/@types/react-dom": { - "version": "18.0.6", - "resolved": "https://registry.npmjs.org/@types/react-dom/-/react-dom-18.0.6.tgz", - "integrity": "sha512-/5OFZgfIPSwy+YuIBP/FgJnQnsxhZhjjrnxudMddeblOouIodEQ75X14Rr4wGSG/bknL+Omy9iWlLo1u/9GzAA==", + "node_modules/@types/react-is": { + "version": "17.0.3", + "resolved": "https://registry.npmjs.org/@types/react-is/-/react-is-17.0.3.tgz", + "integrity": "sha512-aBTIWg1emtu95bLTLx0cpkxwGW3ueZv71nE2YFBpL8k/z5czEW8yYpOo8Dp+UUAFAtKwNaOsh/ioSeQnWlZcfw==", + "dependencies": { + "@types/react": "*" + } + }, + "node_modules/@types/react-transition-group": { + "version": "4.4.5", + "resolved": "https://registry.npmjs.org/@types/react-transition-group/-/react-transition-group-4.4.5.tgz", + "integrity": "sha512-juKD/eiSM3/xZYzjuzH6ZwpP+/lejltmiS3QEzV/vmb/Q8+HfDmxu+Baga8UEMGBqV88Nbg4l2hY/K2DkyaLLA==", "dependencies": { "@types/react": "*" } @@ -3981,6 +4548,16 @@ "resolved": "https://registry.npmjs.org/@types/trusted-types/-/trusted-types-2.0.2.tgz", "integrity": "sha512-F5DIZ36YVLE+PN+Zwws4kJogq47hNgX3Nx6WyDJ3kcplxyke3XIzB8uK5n/Lpm1HBsbGzd6nmGehL8cPekP+Tg==" }, + "node_modules/@types/use-sync-external-store": { + "version": "0.0.3", + "resolved": "https://registry.npmjs.org/@types/use-sync-external-store/-/use-sync-external-store-0.0.3.tgz", + "integrity": "sha512-EwmlvuaxPNej9+T4v5AuBPJa2x2UOJVdjCtDHgcDqitUeOtjnJKJ+apYjVcAoBEMjKW1VVFGZLUb5+qqa09XFA==" + }, + "node_modules/@types/warning": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/@types/warning/-/warning-3.0.0.tgz", + "integrity": "sha512-t/Tvs5qR47OLOr+4E9ckN8AmP2Tf16gWq+/qA4iUGS/OOyHVO8wv2vjJuX8SNOUTJyWb+2t7wJm6cXILFnOROA==" + }, "node_modules/@types/ws": { "version": "8.5.3", "resolved": "https://registry.npmjs.org/@types/ws/-/ws-8.5.3.tgz", @@ -4362,6 +4939,11 @@ "resolved": "https://registry.npmjs.org/abab/-/abab-2.0.6.tgz", "integrity": "sha512-j2afSsaIENvHZN2B8GOpF566vZ5WVk5opAiMTvWgaQT8DkbOqsTfvNAvHoRGU2zzP8cPoqys+xHTRDWW8L+/BA==" }, + "node_modules/abbrev": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/abbrev/-/abbrev-1.1.1.tgz", + "integrity": "sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q==" + }, "node_modules/accepts": { "version": "1.3.8", "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.8.tgz", @@ -4375,9 +4957,9 @@ } }, "node_modules/acorn": { - "version": "8.7.1", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.7.1.tgz", - "integrity": "sha512-Xx54uLJQZ19lKygFXOWsscKUbsBZW0CPykPhVQdhIeIwrbPmJzqeASDInc8nKBnp/JT6igTs82qPXz069H8I/A==", + "version": "8.8.2", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.8.2.tgz", + "integrity": "sha512-xjIYgE8HBrkpd/sJqOGNspf8uHG+NOHGOw6a/Urj8taM2EXfdNAH2oFcPeIFfsv3+kz/mJrS5VuMqbNLjCa2vw==", "bin": { "acorn": "bin/acorn" }, @@ -4783,6 +5365,16 @@ "node": ">=12" } }, + "node_modules/axios": { + "version": "1.3.4", + "resolved": "https://registry.npmjs.org/axios/-/axios-1.3.4.tgz", + "integrity": "sha512-toYm+Bsyl6VC5wSkfkbbNB6ROv7KY93PEBBL6xyDczaIHasAiv4wPqQ/c4RjoQzipxRD2W5g21cOqQulZ7rHwQ==", + "dependencies": { + "follow-redirects": "^1.15.0", + "form-data": "^4.0.0", + "proxy-from-env": "^1.1.0" + } + }, "node_modules/axobject-query": { "version": "2.2.0", "resolved": "https://registry.npmjs.org/axobject-query/-/axobject-query-2.2.0.tgz", @@ -5192,6 +5784,25 @@ "resolved": "https://registry.npmjs.org/boolbase/-/boolbase-1.0.0.tgz", "integrity": "sha512-JZOSA7Mo9sNGB8+UjSgzdLtokWAky1zbztM3WRLCbZ70/3cTANmQmOdR7y2g+J0e2WXywy1yS468tY+IruqEww==" }, + "node_modules/bootstrap": { + "version": "4.6.2", + "resolved": "https://registry.npmjs.org/bootstrap/-/bootstrap-4.6.2.tgz", + "integrity": "sha512-51Bbp/Uxr9aTuy6ca/8FbFloBUJZLHwnhTcnjIeRn2suQWsWzcuJhGjKDB5eppVte/8oCdOL3VuwxvZDUggwGQ==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/twbs" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/bootstrap" + } + ], + "peerDependencies": { + "jquery": "1.9.1 - 3", + "popper.js": "^1.16.1" + } + }, "node_modules/brace-expansion": { "version": "1.1.11", "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", @@ -5257,6 +5868,11 @@ "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.2.tgz", "integrity": "sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==" }, + "node_modules/buffer-shims": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/buffer-shims/-/buffer-shims-1.0.0.tgz", + "integrity": "sha512-Zy8ZXMyxIT6RMTeY7OP/bDndfj6bwCan7SS98CEndS6deHwWPpseeHlwarNcBim+etXnF9HBc1non5JgDaJU1g==" + }, "node_modules/builtin-modules": { "version": "3.3.0", "resolved": "https://registry.npmjs.org/builtin-modules/-/builtin-modules-3.3.0.tgz", @@ -5439,6 +6055,11 @@ "resolved": "https://registry.npmjs.org/cjs-module-lexer/-/cjs-module-lexer-1.2.2.tgz", "integrity": "sha512-cOU9usZw8/dXIXKtwa8pM0OTJQuJkxMN6w30csNRUerHfeQ5R6U3kkU/FtJeIf3M202OHfY2U8ccInBG7/xogA==" }, + "node_modules/classnames": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/classnames/-/classnames-2.3.2.tgz", + "integrity": "sha512-CSbhY4cFEJRe6/GQzIk5qXZ4Jeg5pcsP7b5peFSDpffpe1cqjASH/n9UTjBwOp6XpMSTwQ8Za2K5V02ueA7Tmw==" + }, "node_modules/clean-css": { "version": "5.3.0", "resolved": "https://registry.npmjs.org/clean-css/-/clean-css-5.3.0.tgz", @@ -5468,6 +6089,14 @@ "wrap-ansi": "^7.0.0" } }, + "node_modules/clsx": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/clsx/-/clsx-1.2.1.tgz", + "integrity": "sha512-EcR6r5a8bj6pu3ycsa/E/cKVGuTgZJZdsyUYHOksG/UHIiKfjxzRxYJpyVBwYaQeOvghal9fcc4PidlgzugAQg==", + "engines": { + "node": ">=6" + } + }, "node_modules/co": { "version": "4.6.0", "resolved": "https://registry.npmjs.org/co/-/co-4.6.0.tgz", @@ -6158,9 +6787,9 @@ "integrity": "sha512-b0tGHbfegbhPJpxpiBPU2sCkigAqtM9O121le6bbOlgyV+NyGyCmVfJ6QW9eRjz8CpNfWEOYBIMIGRYkLwsIYg==" }, "node_modules/csstype": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/csstype/-/csstype-3.1.0.tgz", - "integrity": "sha512-uX1KG+x9h5hIJsaKR9xHUeUraxf8IODOwq9JLNPq6BwB04a/xgpq3rcx47l5BZu5zBPlgD342tdke3Hom/nJRA==" + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/csstype/-/csstype-3.1.1.tgz", + "integrity": "sha512-DJR/VvkAvSZW9bTouZue2sSxDwdTN92uHjqeKVm+0dAqdfNykRzQ95tay8aXMBAAPpUiq4Qcug2L7neoRh2Egw==" }, "node_modules/damerau-levenshtein": { "version": "1.0.8", @@ -6180,10 +6809,22 @@ "node": ">=10" } }, - "node_modules/debug": { - "version": "4.3.4", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", - "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", + "node_modules/date-fns": { + "version": "2.29.3", + "resolved": "https://registry.npmjs.org/date-fns/-/date-fns-2.29.3.tgz", + "integrity": "sha512-dDCnyH2WnnKusqvZZ6+jA1O51Ibt8ZMRNkDZdyAyK4YfbDwa/cEmuztzG5pk6hqlp9aSBPYcjOlktquahGwGeA==", + "engines": { + "node": ">=0.11" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/date-fns" + } + }, + "node_modules/debug": { + "version": "4.3.4", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", + "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", "dependencies": { "ms": "2.1.2" }, @@ -6282,6 +6923,14 @@ "node": ">= 0.8" } }, + "node_modules/dequal": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/dequal/-/dequal-2.0.3.tgz", + "integrity": "sha512-0je+qPKHEMohvfRTCEo3CrPG6cAzAYgmzKyxRiYSSDkS6eGJdyVJm7WaYA5ECaAD9wLB2T4EEeymA5aFVcYXCA==", + "engines": { + "node": ">=6" + } + }, "node_modules/destroy": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/destroy/-/destroy-1.2.0.tgz", @@ -6418,6 +7067,15 @@ "utila": "~0.4" } }, + "node_modules/dom-helpers": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/dom-helpers/-/dom-helpers-5.2.1.tgz", + "integrity": "sha512-nRCa7CK3VTrM2NmGkIy4cbK7IZlgBE/PYMn55rrXefr5xXDP0LdtfPnblFDoVdcAfslJ7or6iqAUnx0CCGIWQA==", + "dependencies": { + "@babel/runtime": "^7.8.7", + "csstype": "^3.0.2" + } + }, "node_modules/dom-serializer": { "version": "1.4.1", "resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-1.4.1.tgz", @@ -6583,6 +7241,11 @@ "node": ">=10.13.0" } }, + "node_modules/enquire.js": { + "version": "2.1.6", + "resolved": "https://registry.npmjs.org/enquire.js/-/enquire.js-2.1.6.tgz", + "integrity": "sha512-/KujNpO+PT63F7Hlpu4h3pE3TokKRHN26JYmQpPyjkRD/N57R7bPDNojMXdi7uveAKjYB7yQnartCxZnFWr0Xw==" + }, "node_modules/entities": { "version": "2.2.0", "resolved": "https://registry.npmjs.org/entities/-/entities-2.2.0.tgz", @@ -6776,12 +7439,17 @@ } }, "node_modules/eslint": { - "version": "8.19.0", - "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.19.0.tgz", - "integrity": "sha512-SXOPj3x9VKvPe81TjjUJCYlV4oJjQw68Uek+AM0X4p+33dj2HY5bpTZOgnQHcG2eAm1mtCU9uNMnJi7exU/kYw==", - "dependencies": { - "@eslint/eslintrc": "^1.3.0", - "@humanwhocodes/config-array": "^0.9.2", + "version": "8.36.0", + "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.36.0.tgz", + "integrity": "sha512-Y956lmS7vDqomxlaaQAHVmeb4tNMp2FWIvU/RnU5BD3IKMD/MJPr76xdyr68P8tV1iNMvN2mRK0yy3c+UjL+bw==", + "dependencies": { + "@eslint-community/eslint-utils": "^4.2.0", + "@eslint-community/regexpp": "^4.4.0", + "@eslint/eslintrc": "^2.0.1", + "@eslint/js": "8.36.0", + "@humanwhocodes/config-array": "^0.11.8", + "@humanwhocodes/module-importer": "^1.0.1", + "@nodelib/fs.walk": "^1.2.8", "ajv": "^6.10.0", "chalk": "^4.0.0", "cross-spawn": "^7.0.2", @@ -6789,20 +7457,22 @@ "doctrine": "^3.0.0", "escape-string-regexp": "^4.0.0", "eslint-scope": "^7.1.1", - "eslint-utils": "^3.0.0", "eslint-visitor-keys": "^3.3.0", - "espree": "^9.3.2", - "esquery": "^1.4.0", + "espree": "^9.5.0", + "esquery": "^1.4.2", "esutils": "^2.0.2", "fast-deep-equal": "^3.1.3", "file-entry-cache": "^6.0.1", - "functional-red-black-tree": "^1.0.1", - "glob-parent": "^6.0.1", - "globals": "^13.15.0", + "find-up": "^5.0.0", + "glob-parent": "^6.0.2", + "globals": "^13.19.0", + "grapheme-splitter": "^1.0.4", "ignore": "^5.2.0", "import-fresh": "^3.0.0", "imurmurhash": "^0.1.4", "is-glob": "^4.0.0", + "is-path-inside": "^3.0.3", + "js-sdsl": "^4.1.4", "js-yaml": "^4.1.0", "json-stable-stringify-without-jsonify": "^1.0.1", "levn": "^0.4.1", @@ -6810,11 +7480,9 @@ "minimatch": "^3.1.2", "natural-compare": "^1.4.0", "optionator": "^0.9.1", - "regexpp": "^3.2.0", "strip-ansi": "^6.0.1", "strip-json-comments": "^3.1.0", - "text-table": "^0.2.0", - "v8-compile-cache": "^2.0.3" + "text-table": "^0.2.0" }, "bin": { "eslint": "bin/eslint.js" @@ -7377,9 +8045,9 @@ } }, "node_modules/eslint/node_modules/globals": { - "version": "13.16.0", - "resolved": "https://registry.npmjs.org/globals/-/globals-13.16.0.tgz", - "integrity": "sha512-A1lrQfpNF+McdPOnnFqY3kSN0AFTy485bTi1bkLk4mVPODIUEcSfhHgRqA+QdXPksrSTTztYXx37NFV+GpGk3Q==", + "version": "13.20.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-13.20.0.tgz", + "integrity": "sha512-Qg5QtVkCy/kv3FUSlu4ukeZDVf9ee0iXLAUYX13gbR17bnejFTzr4iS9bY7kwCf1NztRNm1t91fjOiyx4CSwPQ==", "dependencies": { "type-fest": "^0.20.2" }, @@ -7432,16 +8100,19 @@ } }, "node_modules/espree": { - "version": "9.3.2", - "resolved": "https://registry.npmjs.org/espree/-/espree-9.3.2.tgz", - "integrity": "sha512-D211tC7ZwouTIuY5x9XnS0E9sWNChB7IYKX/Xp5eQj3nFXhqmiUDB9q27y76oFl8jTg3pXcQx/bpxMfs3CIZbA==", + "version": "9.5.0", + "resolved": "https://registry.npmjs.org/espree/-/espree-9.5.0.tgz", + "integrity": "sha512-JPbJGhKc47++oo4JkEoTe2wjy4fmMwvFpgJT9cQzmfXKp22Dr6Hf1tdCteLz1h0P3t+mGvWZ+4Uankvh8+c6zw==", "dependencies": { - "acorn": "^8.7.1", + "acorn": "^8.8.0", "acorn-jsx": "^5.3.2", "eslint-visitor-keys": "^3.3.0" }, "engines": { "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" } }, "node_modules/esprima": { @@ -7457,9 +8128,9 @@ } }, "node_modules/esquery": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.4.0.tgz", - "integrity": "sha512-cCDispWt5vHHtwMY2YrAQ4ibFkAL8RbH5YGBnZBc90MolvvfkkQcJro/aZiAQUlQ3qgrYS6D6v8Gc5G5CQsc9w==", + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.5.0.tgz", + "integrity": "sha512-YQLXUplAwJgCydQ78IMJywZCceoqk1oH01OERdSAJc/7U2AylwjhSCLDEtqwg811idIS/9fIU5GjG73IgjKMVg==", "dependencies": { "estraverse": "^5.1.0" }, @@ -7832,6 +8503,11 @@ "url": "https://github.com/avajs/find-cache-dir?sponsor=1" } }, + "node_modules/find-root": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/find-root/-/find-root-1.1.0.tgz", + "integrity": "sha512-NKfW6bec6GfKc0SGx1e07QZY9PE99u0Bft/0rzSD5k3sO/vwkVUpDUKVm5Gpp5Ue3YfShPFTX2070tDs5kB9Ng==" + }, "node_modules/find-up": { "version": "5.0.0", "resolved": "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz", @@ -8040,9 +8716,9 @@ } }, "node_modules/form-data": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/form-data/-/form-data-3.0.1.tgz", - "integrity": "sha512-RHkBKtLWUVwd7SqRIvCZMEvAMoGUp0XU+seQiZejj0COz3RI3hWP4sCv3gZWWLjJTd7rGwcsF5eKZGii0r/hbg==", + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/form-data/-/form-data-4.0.0.tgz", + "integrity": "sha512-ETEklSGi5t0QMZuiXoA/Q6vcnxcLQP5vdugSpuAyi6SVGi2clPPp+xgEhuMaHC+zGgn31Kd235W35f7Hykkaww==", "dependencies": { "asynckit": "^0.4.0", "combined-stream": "^1.0.8", @@ -8321,6 +8997,11 @@ "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.10.tgz", "integrity": "sha512-9ByhssR2fPVsNZj478qUUbKfmL0+t5BDVyjShtyZZLiK7ZDAArFFfopyOTj0M05wE2tJPisA4iTnnXl2YoPvOA==" }, + "node_modules/grapheme-splitter": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/grapheme-splitter/-/grapheme-splitter-1.0.4.tgz", + "integrity": "sha512-bzh50DW9kTPM00T8y4o8vQg89Di9oLJVLW/KaOGIXJWP/iqCN6WKYkbNOF04vFLJhwcpYUh9ydh/+5vpOqV4YQ==" + }, "node_modules/gzip-size": { "version": "6.0.0", "resolved": "https://registry.npmjs.org/gzip-size/-/gzip-size-6.0.0.tgz", @@ -8416,6 +9097,32 @@ "he": "bin/he" } }, + "node_modules/history": { + "version": "4.10.1", + "resolved": "https://registry.npmjs.org/history/-/history-4.10.1.tgz", + "integrity": "sha512-36nwAD620w12kuzPAsyINPWJqlNbij+hpK1k9XRloDtym8mxzGYl2c17LnV6IAGB2Dmg4tEa7G7DlawS0+qjew==", + "dependencies": { + "@babel/runtime": "^7.1.2", + "loose-envify": "^1.2.0", + "resolve-pathname": "^3.0.0", + "tiny-invariant": "^1.0.2", + "tiny-warning": "^1.0.0", + "value-equal": "^1.0.1" + } + }, + "node_modules/hoist-non-react-statics": { + "version": "3.3.2", + "resolved": "https://registry.npmjs.org/hoist-non-react-statics/-/hoist-non-react-statics-3.3.2.tgz", + "integrity": "sha512-/gGivxi8JPKWNm/W0jSmzcMPpfpPLc3dY/6GxhX2hQ9iGj3aDfklV4ET7NjKpSinLpJ5vafa9iiGIEZg10SfBw==", + "dependencies": { + "react-is": "^16.7.0" + } + }, + "node_modules/hoist-non-react-statics/node_modules/react-is": { + "version": "16.13.1", + "resolved": "https://registry.npmjs.org/react-is/-/react-is-16.13.1.tgz", + "integrity": "sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==" + }, "node_modules/hoopy": { "version": "0.1.4", "resolved": "https://registry.npmjs.org/hoopy/-/hoopy-0.1.4.tgz", @@ -8687,6 +9394,11 @@ "url": "https://opencollective.com/immer" } }, + "node_modules/immutable": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/immutable/-/immutable-4.3.0.tgz", + "integrity": "sha512-0AOCmOip+xgJwEVTQj1EfiDDOkPmuyllDuTuEX+DDXUgapLAsBIfkg3sxCYyCEA8mQqZrrxPUGjcOQ2JS3WLkg==" + }, "node_modules/import-fresh": { "version": "3.3.0", "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.0.tgz", @@ -8776,6 +9488,14 @@ "node": ">= 0.4" } }, + "node_modules/invariant": { + "version": "2.2.4", + "resolved": "https://registry.npmjs.org/invariant/-/invariant-2.2.4.tgz", + "integrity": "sha512-phJfQVBuaJM5raOpJjSfkiD6BpbCE4Ns//LaXl6wGYtUBY83nWS6Rf9tXm2e8VaK60JEjYldbPif/A2B1C2gNA==", + "dependencies": { + "loose-envify": "^1.0.0" + } + }, "node_modules/ipaddr.js": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-2.0.1.tgz", @@ -8957,6 +9677,14 @@ "node": ">=0.10.0" } }, + "node_modules/is-path-inside": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/is-path-inside/-/is-path-inside-3.0.3.tgz", + "integrity": "sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ==", + "engines": { + "node": ">=8" + } + }, "node_modules/is-plain-obj": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-3.0.0.tgz", @@ -11030,20 +11758,91 @@ } }, "node_modules/jest-watcher": { - "version": "27.5.1", - "resolved": "https://registry.npmjs.org/jest-watcher/-/jest-watcher-27.5.1.tgz", - "integrity": "sha512-z676SuD6Z8o8qbmEGhoEUFOM1+jfEiL3DXHK/xgEiG2EyNYfFG60jluWcupY6dATjfEsKQuibReS1djInQnoVw==", + "version": "29.5.0", + "resolved": "https://registry.npmjs.org/jest-watcher/-/jest-watcher-29.5.0.tgz", + "integrity": "sha512-KmTojKcapuqYrKDpRwfqcQ3zjMlwu27SYext9pt4GlF5FUgB+7XE1mcCnSm6a4uUpFyQIkb6ZhzZvHl+jiBCiA==", "dependencies": { - "@jest/test-result": "^27.5.1", - "@jest/types": "^27.5.1", + "@jest/test-result": "^29.5.0", + "@jest/types": "^29.5.0", "@types/node": "*", "ansi-escapes": "^4.2.1", "chalk": "^4.0.0", - "jest-util": "^27.5.1", + "emittery": "^0.13.1", + "jest-util": "^29.5.0", "string-length": "^4.0.1" }, "engines": { - "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-watcher/node_modules/@jest/console": { + "version": "29.5.0", + "resolved": "https://registry.npmjs.org/@jest/console/-/console-29.5.0.tgz", + "integrity": "sha512-NEpkObxPwyw/XxZVLPmAGKE89IQRp4puc6IQRPru6JKd1M3fW9v1xM1AnzIJE65hbCkzQAdnL8P47e9hzhiYLQ==", + "dependencies": { + "@jest/types": "^29.5.0", + "@types/node": "*", + "chalk": "^4.0.0", + "jest-message-util": "^29.5.0", + "jest-util": "^29.5.0", + "slash": "^3.0.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-watcher/node_modules/@jest/schemas": { + "version": "29.4.3", + "resolved": "https://registry.npmjs.org/@jest/schemas/-/schemas-29.4.3.tgz", + "integrity": "sha512-VLYKXQmtmuEz6IxJsrZwzG9NvtkQsWNnWMsKxqWNu3+CnfzJQhp0WDDKWLVV9hLKr0l3SLLFRqcYHjhtyuDVxg==", + "dependencies": { + "@sinclair/typebox": "^0.25.16" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-watcher/node_modules/@jest/test-result": { + "version": "29.5.0", + "resolved": "https://registry.npmjs.org/@jest/test-result/-/test-result-29.5.0.tgz", + "integrity": "sha512-fGl4rfitnbfLsrfx1uUpDEESS7zM8JdgZgOCQuxQvL1Sn/I6ijeAVQWGfXI9zb1i9Mzo495cIpVZhA0yr60PkQ==", + "dependencies": { + "@jest/console": "^29.5.0", + "@jest/types": "^29.5.0", + "@types/istanbul-lib-coverage": "^2.0.0", + "collect-v8-coverage": "^1.0.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-watcher/node_modules/@jest/types": { + "version": "29.5.0", + "resolved": "https://registry.npmjs.org/@jest/types/-/types-29.5.0.tgz", + "integrity": "sha512-qbu7kN6czmVRc3xWFQcAN03RAUamgppVUdXrvl1Wr3jlNF93o9mJbGcDWrwGB6ht44u7efB1qCFgVQmca24Uog==", + "dependencies": { + "@jest/schemas": "^29.4.3", + "@types/istanbul-lib-coverage": "^2.0.0", + "@types/istanbul-reports": "^3.0.0", + "@types/node": "*", + "@types/yargs": "^17.0.8", + "chalk": "^4.0.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-watcher/node_modules/@sinclair/typebox": { + "version": "0.25.24", + "resolved": "https://registry.npmjs.org/@sinclair/typebox/-/typebox-0.25.24.tgz", + "integrity": "sha512-XJfwUVUKDHF5ugKwIcxEgc9k8b7HbznCp6eUfWgu710hMPNIO4aw4/zB5RogDQz8nd6gyCDpU9O/m6qYEWY6yQ==" + }, + "node_modules/jest-watcher/node_modules/@types/yargs": { + "version": "17.0.23", + "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-17.0.23.tgz", + "integrity": "sha512-yuogunc04OnzGQCrfHx+Kk883Q4X0aSwmYZhKjI21m+SVYzjIbrWl8dOOwSv5hf2Um2pdCOXWo9isteZTNXUZQ==", + "dependencies": { + "@types/yargs-parser": "*" } }, "node_modules/jest-watcher/node_modules/ansi-styles": { @@ -11091,6 +11890,17 @@ "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" }, + "node_modules/jest-watcher/node_modules/emittery": { + "version": "0.13.1", + "resolved": "https://registry.npmjs.org/emittery/-/emittery-0.13.1.tgz", + "integrity": "sha512-DeWwawk6r5yR9jFgnDKYt4sLS0LmHJJi3ZOnb5/JdbYwj3nW+FxQnHIjhBKz8YLC7oRNPVM9NQ47I3CVx34eqQ==", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sindresorhus/emittery?sponsor=1" + } + }, "node_modules/jest-watcher/node_modules/has-flag": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", @@ -11099,6 +11909,70 @@ "node": ">=8" } }, + "node_modules/jest-watcher/node_modules/jest-message-util": { + "version": "29.5.0", + "resolved": "https://registry.npmjs.org/jest-message-util/-/jest-message-util-29.5.0.tgz", + "integrity": "sha512-Kijeg9Dag6CKtIDA7O21zNTACqD5MD/8HfIV8pdD94vFyFuer52SigdC3IQMhab3vACxXMiFk+yMHNdbqtyTGA==", + "dependencies": { + "@babel/code-frame": "^7.12.13", + "@jest/types": "^29.5.0", + "@types/stack-utils": "^2.0.0", + "chalk": "^4.0.0", + "graceful-fs": "^4.2.9", + "micromatch": "^4.0.4", + "pretty-format": "^29.5.0", + "slash": "^3.0.0", + "stack-utils": "^2.0.3" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-watcher/node_modules/jest-util": { + "version": "29.5.0", + "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-29.5.0.tgz", + "integrity": "sha512-RYMgG/MTadOr5t8KdhejfvUU82MxsCu5MF6KuDUHl+NuwzUt+Sm6jJWxTJVrDR1j5M/gJVCPKQEpWXY+yIQ6lQ==", + "dependencies": { + "@jest/types": "^29.5.0", + "@types/node": "*", + "chalk": "^4.0.0", + "ci-info": "^3.2.0", + "graceful-fs": "^4.2.9", + "picomatch": "^2.2.3" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-watcher/node_modules/pretty-format": { + "version": "29.5.0", + "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-29.5.0.tgz", + "integrity": "sha512-V2mGkI31qdttvTFX7Mt4efOqHXqJWMu4/r66Xh3Z3BwZaPfPJgp6/gbwoujRpPUtfEF6AUUWx3Jim3GCw5g/Qw==", + "dependencies": { + "@jest/schemas": "^29.4.3", + "ansi-styles": "^5.0.0", + "react-is": "^18.0.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-watcher/node_modules/pretty-format/node_modules/ansi-styles": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-5.2.0.tgz", + "integrity": "sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/jest-watcher/node_modules/react-is": { + "version": "18.2.0", + "resolved": "https://registry.npmjs.org/react-is/-/react-is-18.2.0.tgz", + "integrity": "sha512-xWGDIW6x921xtzPkhiULtthJHoJvBbF3q26fzloPCK0hsvxtPVelvftw3zjbHWSkR2km9Z+4uxbDDK/6Zw9B8w==" + }, "node_modules/jest-watcher/node_modules/supports-color": { "version": "7.2.0", "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", @@ -11145,6 +12019,15 @@ "url": "https://github.com/chalk/supports-color?sponsor=1" } }, + "node_modules/js-sdsl": { + "version": "4.4.0", + "resolved": "https://registry.npmjs.org/js-sdsl/-/js-sdsl-4.4.0.tgz", + "integrity": "sha512-FfVSdx6pJ41Oa+CF7RDaFmTnCaFhua+SNYQX74riGOpl96x+2jQCqEfQ2bnXu/5DPCqlRuiqyvTJM0Qjz26IVg==", + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/js-sdsl" + } + }, "node_modules/js-tokens": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", @@ -11207,6 +12090,19 @@ } } }, + "node_modules/jsdom/node_modules/form-data": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/form-data/-/form-data-3.0.1.tgz", + "integrity": "sha512-RHkBKtLWUVwd7SqRIvCZMEvAMoGUp0XU+seQiZejj0COz3RI3hWP4sCv3gZWWLjJTd7rGwcsF5eKZGii0r/hbg==", + "dependencies": { + "asynckit": "^0.4.0", + "combined-stream": "^1.0.8", + "mime-types": "^2.1.12" + }, + "engines": { + "node": ">= 6" + } + }, "node_modules/jsesc": { "version": "2.5.2", "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-2.5.2.tgz", @@ -11218,6 +12114,66 @@ "node": ">=4" } }, + "node_modules/jslint": { + "version": "0.12.1", + "resolved": "https://registry.npmjs.org/jslint/-/jslint-0.12.1.tgz", + "integrity": "sha512-q5iHswjOmJffbsGVq/1umGh4YBxb5pCArNHCZeHpkuVDDKM6IldqUn4hLehKSwQr7Bn07VXjD34Lx3nw+6j8eA==", + "dependencies": { + "exit": "~0.1.2", + "glob": "~7.1.3", + "nopt": "~4.0.1", + "readable-stream": "~2.1.5" + }, + "bin": { + "jslint": "bin/jslint.js" + }, + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/jslint/node_modules/glob": { + "version": "7.1.7", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.7.tgz", + "integrity": "sha512-OvD9ENzPLbegENnYP5UUfJIirTg4+XwMWGaQfQTY0JenxNvvIKP3U3/tAQSPIu/lHxXYSZmpXlUHeqAIdKzBLQ==", + "dependencies": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.0.4", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + }, + "engines": { + "node": "*" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/jslint/node_modules/process-nextick-args": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-1.0.7.tgz", + "integrity": "sha512-yN0WQmuCX63LP/TMvAg31nvT6m4vDqJEiiv2CAZqWOGNWutc9DfDk1NPYYmKUFmaVM2UwDowH4u5AHWYP/jxKw==" + }, + "node_modules/jslint/node_modules/readable-stream": { + "version": "2.1.5", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.1.5.tgz", + "integrity": "sha512-NkXT2AER7VKXeXtJNSaWLpWIhmtSE3K2PguaLEeWr4JILghcIKqoLt1A3wHrnpDC5+ekf8gfk1GKWkFXe4odMw==", + "dependencies": { + "buffer-shims": "^1.0.0", + "core-util-is": "~1.0.0", + "inherits": "~2.0.1", + "isarray": "~1.0.0", + "process-nextick-args": "~1.0.6", + "string_decoder": "~0.10.x", + "util-deprecate": "~1.0.1" + } + }, + "node_modules/jslint/node_modules/string_decoder": { + "version": "0.10.31", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz", + "integrity": "sha512-ev2QzSzWPYmy9GuqfIVildA4OdcGLeFZQrq5ys6RtiuF+RQQiZWr8TZNyAcuVXyQRYfEO+MsoB/1BuQVhOJuoQ==" + }, "node_modules/json-parse-even-better-errors": { "version": "2.3.1", "resolved": "https://registry.npmjs.org/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz", @@ -11238,6 +12194,14 @@ "resolved": "https://registry.npmjs.org/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz", "integrity": "sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==" }, + "node_modules/json2mq": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/json2mq/-/json2mq-0.2.0.tgz", + "integrity": "sha512-SzoRg7ux5DWTII9J2qkrZrqV1gt+rTaoufMxEzXbS26Uid0NwaJd123HcoB80TgubEppxxIGdNxCx50fEoEWQA==", + "dependencies": { + "string-convert": "^0.2.0" + } + }, "node_modules/json5": { "version": "2.2.1", "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.1.tgz", @@ -11515,6 +12479,11 @@ "node": ">= 4.0.0" } }, + "node_modules/memoize-one": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/memoize-one/-/memoize-one-6.0.0.tgz", + "integrity": "sha512-rkpe71W0N0c0Xz6QD0eJETuWAJGnJ9afsl1srmwPrI+yBCkge5EycXXbYRyvL29zZVUWQCY7InPRCv3GDXuZNw==" + }, "node_modules/merge-descriptors": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-1.0.1.tgz", @@ -11771,6 +12740,18 @@ "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.6.tgz", "integrity": "sha512-PiVXnNuFm5+iYkLBNeq5211hvO38y63T0i2KKh2KnUs3RpzJ+JtODFjkD8yjLwnDkTYF1eKXheUwdssR+NRZdg==" }, + "node_modules/nopt": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/nopt/-/nopt-4.0.3.tgz", + "integrity": "sha512-CvaGwVMztSMJLOeXPrez7fyfObdZqNUK1cPAEzLHrTybIua9pMdmmPR5YwtfNftIOMv3DPUhFaxsZMNTQO20Kg==", + "dependencies": { + "abbrev": "1", + "osenv": "^0.1.4" + }, + "bin": { + "nopt": "bin/nopt.js" + } + }, "node_modules/normalize-path": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", @@ -12026,6 +13007,31 @@ "node": ">= 0.8.0" } }, + "node_modules/os-homedir": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/os-homedir/-/os-homedir-1.0.2.tgz", + "integrity": "sha512-B5JU3cabzk8c67mRRd3ECmROafjYMXbuzlwtqdM8IbS8ktlTix8aFGb2bAGKrSRIlnfKwovGUUr72JUPyOb6kQ==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/os-tmpdir": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/os-tmpdir/-/os-tmpdir-1.0.2.tgz", + "integrity": "sha512-D2FR03Vir7FIu45XBY20mTb+/ZSWB00sjU9jdQXt83gDrI4Ztz5Fs7/yy74g2N5SVQY4xY1qDr4rNddwYRVX0g==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/osenv": { + "version": "0.1.5", + "resolved": "https://registry.npmjs.org/osenv/-/osenv-0.1.5.tgz", + "integrity": "sha512-0CWcCECdMVc2Rw3U5w9ZjqX6ga6ubk1xDVKxtBQPK7wis/0F2r9T6k4ydGYhecl7YUBxBVxhL5oisPsNxAPe2g==", + "dependencies": { + "os-homedir": "^1.0.0", + "os-tmpdir": "^1.0.0" + } + }, "node_modules/p-limit": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz", @@ -13587,6 +14593,23 @@ "react-is": "^16.13.1" } }, + "node_modules/prop-types-extra": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/prop-types-extra/-/prop-types-extra-1.1.1.tgz", + "integrity": "sha512-59+AHNnHYCdiC+vMwY52WmvP5dM3QLeoumYuEyceQDi9aEhtwN9zIQ2ZNo25sMyXnbh32h+P1ezDsUpUH3JAew==", + "dependencies": { + "react-is": "^16.3.2", + "warning": "^4.0.0" + }, + "peerDependencies": { + "react": ">=0.14.0" + } + }, + "node_modules/prop-types-extra/node_modules/react-is": { + "version": "16.13.1", + "resolved": "https://registry.npmjs.org/react-is/-/react-is-16.13.1.tgz", + "integrity": "sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==" + }, "node_modules/prop-types/node_modules/react-is": { "version": "16.13.1", "resolved": "https://registry.npmjs.org/react-is/-/react-is-16.13.1.tgz", @@ -13612,6 +14635,11 @@ "node": ">= 0.10" } }, + "node_modules/proxy-from-env": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/proxy-from-env/-/proxy-from-env-1.1.0.tgz", + "integrity": "sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg==" + }, "node_modules/psl": { "version": "1.9.0", "resolved": "https://registry.npmjs.org/psl/-/psl-1.9.0.tgz", @@ -13746,6 +14774,27 @@ "node": ">=0.10.0" } }, + "node_modules/react-alert": { + "version": "7.0.3", + "resolved": "https://registry.npmjs.org/react-alert/-/react-alert-7.0.3.tgz", + "integrity": "sha512-cZ2ZhxytECTxljDfBKpQmwWbfJQFzFf2Qf03L/IB5shbEXtWhDD2JjiW60rwmKT1oZoU+GEnUQw5MFM5+f0B6A==", + "dependencies": { + "prop-types": "^15.7.2", + "react-transition-group": "^4.4.1" + }, + "peerDependencies": { + "react": "^16.8.1 || ^17", + "react-dom": "^16.8.1 || ^17" + } + }, + "node_modules/react-alert-template-basic": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/react-alert-template-basic/-/react-alert-template-basic-1.0.2.tgz", + "integrity": "sha512-nJSIknM5xN/GzKdKkb5/X9zdiLxSqctww3mEouyeR891nUGP8guqFpCGD8vCjFYSZtq8z3tGcAKBG1XjtLHFHQ==", + "peerDependencies": { + "react": "^16.2.0 || ^17" + } + }, "node_modules/react-app-polyfill": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/react-app-polyfill/-/react-app-polyfill-3.0.0.tgz", @@ -13762,10 +14811,55 @@ "node": ">=14" } }, - "node_modules/react-dev-utils": { - "version": "12.0.1", - "resolved": "https://registry.npmjs.org/react-dev-utils/-/react-dev-utils-12.0.1.tgz", - "integrity": "sha512-84Ivxmr17KjUupyqzFode6xKhjwuEJDROWKJy/BthkL7Wn6NJ8h4WE6k/exAv6ImS+0oZLRRW5j/aINMHyeGeQ==", + "node_modules/react-bootstrap": { + "version": "1.6.6", + "resolved": "https://registry.npmjs.org/react-bootstrap/-/react-bootstrap-1.6.6.tgz", + "integrity": "sha512-pSzYyJT5u4rc8+5myM8Vid2JG52L8AmYSkpznReH/GM4+FhLqEnxUa0+6HRTaGwjdEixQNGchwY+b3xCdYWrDA==", + "dependencies": { + "@babel/runtime": "^7.14.0", + "@restart/context": "^2.1.4", + "@restart/hooks": "^0.4.7", + "@types/invariant": "^2.2.33", + "@types/prop-types": "^15.7.3", + "@types/react": ">=16.14.8", + "@types/react-transition-group": "^4.4.1", + "@types/warning": "^3.0.0", + "classnames": "^2.3.1", + "dom-helpers": "^5.2.1", + "invariant": "^2.2.4", + "prop-types": "^15.7.2", + "prop-types-extra": "^1.1.0", + "react-overlays": "^5.1.2", + "react-transition-group": "^4.4.1", + "uncontrollable": "^7.2.1", + "warning": "^4.0.3" + }, + "peerDependencies": { + "react": ">=16.8.0", + "react-dom": ">=16.8.0" + } + }, + "node_modules/react-datepicker": { + "version": "4.10.0", + "resolved": "https://registry.npmjs.org/react-datepicker/-/react-datepicker-4.10.0.tgz", + "integrity": "sha512-6IfBCZyWj54ZZGLmEZJ9c4Yph0s9MVfEGDC2evOvf9AmVz+RRcfP2Czqad88Ff9wREbcbqa4dk7IFYeXF1d3Ag==", + "dependencies": { + "@popperjs/core": "^2.9.2", + "classnames": "^2.2.6", + "date-fns": "^2.24.0", + "prop-types": "^15.7.2", + "react-onclickoutside": "^6.12.2", + "react-popper": "^2.3.0" + }, + "peerDependencies": { + "react": "^16.9.0 || ^17 || ^18", + "react-dom": "^16.9.0 || ^17 || ^18" + } + }, + "node_modules/react-dev-utils": { + "version": "12.0.1", + "resolved": "https://registry.npmjs.org/react-dev-utils/-/react-dev-utils-12.0.1.tgz", + "integrity": "sha512-84Ivxmr17KjUupyqzFode6xKhjwuEJDROWKJy/BthkL7Wn6NJ8h4WE6k/exAv6ImS+0oZLRRW5j/aINMHyeGeQ==", "dependencies": { "@babel/code-frame": "^7.16.0", "address": "^1.1.2", @@ -13896,11 +14990,110 @@ "resolved": "https://registry.npmjs.org/react-error-overlay/-/react-error-overlay-6.0.11.tgz", "integrity": "sha512-/6UZ2qgEyH2aqzYZgQPxEnz33NJ2gNsnHA2o5+o4wW9bLM/JYQitNP9xPhsXwC08hMMovfGe/8retsdDsczPRg==" }, + "node_modules/react-fast-compare": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/react-fast-compare/-/react-fast-compare-3.2.1.tgz", + "integrity": "sha512-xTYf9zFim2pEif/Fw16dBiXpe0hoy5PxcD8+OwBnTtNLfIm3g6WxhKNurY+6OmdH1u6Ta/W/Vl6vjbYP1MFnDg==" + }, "node_modules/react-is": { "version": "17.0.2", "resolved": "https://registry.npmjs.org/react-is/-/react-is-17.0.2.tgz", "integrity": "sha512-w2GsyukL62IJnlaff/nRegPQR94C/XXamvMWmSHRJ4y7Ts/4ocGRmTHvOs8PSE6pB3dWOrD/nueuU5sduBsQ4w==" }, + "node_modules/react-lifecycles-compat": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/react-lifecycles-compat/-/react-lifecycles-compat-3.0.4.tgz", + "integrity": "sha512-fBASbA6LnOU9dOU2eW7aQ8xmYBSXUIWr+UmF9b1efZBazGNO+rcXT/icdKnYm2pTwcRylVUYwW7H1PHfLekVzA==" + }, + "node_modules/react-onclickoutside": { + "version": "6.13.0", + "resolved": "https://registry.npmjs.org/react-onclickoutside/-/react-onclickoutside-6.13.0.tgz", + "integrity": "sha512-ty8So6tcUpIb+ZE+1HAhbLROvAIJYyJe/1vRrrcmW+jLsaM+/powDRqxzo6hSh9CuRZGSL1Q8mvcF5WRD93a0A==", + "funding": { + "type": "individual", + "url": "https://github.com/Pomax/react-onclickoutside/blob/master/FUNDING.md" + }, + "peerDependencies": { + "react": "^15.5.x || ^16.x || ^17.x || ^18.x", + "react-dom": "^15.5.x || ^16.x || ^17.x || ^18.x" + } + }, + "node_modules/react-overlays": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/react-overlays/-/react-overlays-5.2.1.tgz", + "integrity": "sha512-GLLSOLWr21CqtJn8geSwQfoJufdt3mfdsnIiQswouuQ2MMPns+ihZklxvsTDKD3cR2tF8ELbi5xUsvqVhR6WvA==", + "dependencies": { + "@babel/runtime": "^7.13.8", + "@popperjs/core": "^2.11.6", + "@restart/hooks": "^0.4.7", + "@types/warning": "^3.0.0", + "dom-helpers": "^5.2.0", + "prop-types": "^15.7.2", + "uncontrollable": "^7.2.1", + "warning": "^4.0.3" + }, + "peerDependencies": { + "react": ">=16.3.0", + "react-dom": ">=16.3.0" + } + }, + "node_modules/react-popper": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/react-popper/-/react-popper-2.3.0.tgz", + "integrity": "sha512-e1hj8lL3uM+sgSR4Lxzn5h1GxBlpa4CQz0XLF8kx4MDrDRWY0Ena4c97PUeSX9i5W3UAfDP0z0FXCTQkoXUl3Q==", + "dependencies": { + "react-fast-compare": "^3.0.1", + "warning": "^4.0.2" + }, + "peerDependencies": { + "@popperjs/core": "^2.0.0", + "react": "^16.8.0 || ^17 || ^18", + "react-dom": "^16.8.0 || ^17 || ^18" + } + }, + "node_modules/react-redux": { + "version": "8.0.5", + "resolved": "https://registry.npmjs.org/react-redux/-/react-redux-8.0.5.tgz", + "integrity": "sha512-Q2f6fCKxPFpkXt1qNRZdEDLlScsDWyrgSj0mliK59qU6W5gvBiKkdMEG2lJzhd1rCctf0hb6EtePPLZ2e0m1uw==", + "dependencies": { + "@babel/runtime": "^7.12.1", + "@types/hoist-non-react-statics": "^3.3.1", + "@types/use-sync-external-store": "^0.0.3", + "hoist-non-react-statics": "^3.3.2", + "react-is": "^18.0.0", + "use-sync-external-store": "^1.0.0" + }, + "peerDependencies": { + "@types/react": "^16.8 || ^17.0 || ^18.0", + "@types/react-dom": "^16.8 || ^17.0 || ^18.0", + "react": "^16.8 || ^17.0 || ^18.0", + "react-dom": "^16.8 || ^17.0 || ^18.0", + "react-native": ">=0.59", + "redux": "^4" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "@types/react-dom": { + "optional": true + }, + "react-dom": { + "optional": true + }, + "react-native": { + "optional": true + }, + "redux": { + "optional": true + } + } + }, + "node_modules/react-redux/node_modules/react-is": { + "version": "18.2.0", + "resolved": "https://registry.npmjs.org/react-is/-/react-is-18.2.0.tgz", + "integrity": "sha512-xWGDIW6x921xtzPkhiULtthJHoJvBbF3q26fzloPCK0hsvxtPVelvftw3zjbHWSkR2km9Z+4uxbDDK/6Zw9B8w==" + }, "node_modules/react-refresh": { "version": "0.11.0", "resolved": "https://registry.npmjs.org/react-refresh/-/react-refresh-0.11.0.tgz", @@ -13909,10 +15102,64 @@ "node": ">=0.10.0" } }, + "node_modules/react-router": { + "version": "5.3.4", + "resolved": "https://registry.npmjs.org/react-router/-/react-router-5.3.4.tgz", + "integrity": "sha512-Ys9K+ppnJah3QuaRiLxk+jDWOR1MekYQrlytiXxC1RyfbdsZkS5pvKAzCCr031xHixZwpnsYNT5xysdFHQaYsA==", + "dependencies": { + "@babel/runtime": "^7.12.13", + "history": "^4.9.0", + "hoist-non-react-statics": "^3.1.0", + "loose-envify": "^1.3.1", + "path-to-regexp": "^1.7.0", + "prop-types": "^15.6.2", + "react-is": "^16.6.0", + "tiny-invariant": "^1.0.2", + "tiny-warning": "^1.0.0" + }, + "peerDependencies": { + "react": ">=15" + } + }, + "node_modules/react-router-dom": { + "version": "5.3.4", + "resolved": "https://registry.npmjs.org/react-router-dom/-/react-router-dom-5.3.4.tgz", + "integrity": "sha512-m4EqFMHv/Ih4kpcBCONHbkT68KoAeHN4p3lAGoNryfHi0dMy0kCzEZakiKRsvg5wHZ/JLrLW8o8KomWiz/qbYQ==", + "dependencies": { + "@babel/runtime": "^7.12.13", + "history": "^4.9.0", + "loose-envify": "^1.3.1", + "prop-types": "^15.6.2", + "react-router": "5.3.4", + "tiny-invariant": "^1.0.2", + "tiny-warning": "^1.0.0" + }, + "peerDependencies": { + "react": ">=15" + } + }, + "node_modules/react-router/node_modules/isarray": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz", + "integrity": "sha512-D2S+3GLxWH+uhrNEcoh/fnmYeP8E8/zHl644d/jdA0g2uyXvy3sb0qxotE+ne0LtccHknQzWwZEzhak7oJ0COQ==" + }, + "node_modules/react-router/node_modules/path-to-regexp": { + "version": "1.8.0", + "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-1.8.0.tgz", + "integrity": "sha512-n43JRhlUKUAlibEJhPeir1ncUID16QnEjNpwzNdO3Lm4ywrBpBZ5oLD0I6br9evr1Y9JTqwRtAh7JLoOzAQdVA==", + "dependencies": { + "isarray": "0.0.1" + } + }, + "node_modules/react-router/node_modules/react-is": { + "version": "16.13.1", + "resolved": "https://registry.npmjs.org/react-is/-/react-is-16.13.1.tgz", + "integrity": "sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==" + }, "node_modules/react-scripts": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/react-scripts/-/react-scripts-5.0.1.tgz", - "integrity": "sha512-8VAmEm/ZAwQzJ+GOMLbBsTdDKOpuZh7RPs0UymvBR2vRk4iZWCskjbFnxqjrzoIvlNNRZ3QJFx6/qDSi6zSnaQ==", + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/react-scripts/-/react-scripts-5.0.0.tgz", + "integrity": "sha512-3i0L2CyIlROz7mxETEdfif6Sfhh9Lfpzi10CtcGs1emDQStmZfWjJbAIMtRD0opVUjQuFWqHZyRZ9PPzKCFxWg==", "dependencies": { "@babel/core": "^7.16.0", "@pmmmwh/react-refresh-webpack-plugin": "^0.5.3", @@ -13930,7 +15177,7 @@ "dotenv": "^10.0.0", "dotenv-expand": "^5.1.0", "eslint": "^8.3.0", - "eslint-config-react-app": "^7.0.1", + "eslint-config-react-app": "^7.0.0", "eslint-webpack-plugin": "^3.1.1", "file-loader": "^6.2.0", "fs-extra": "^10.0.0", @@ -13947,7 +15194,7 @@ "postcss-preset-env": "^7.0.1", "prompts": "^2.4.2", "react-app-polyfill": "^3.0.0", - "react-dev-utils": "^12.0.1", + "react-dev-utils": "^12.0.0", "react-refresh": "^0.11.0", "resolve": "^1.20.0", "resolve-url-loader": "^4.0.0", @@ -13981,6 +15228,159 @@ } } }, + "node_modules/react-select": { + "version": "5.7.2", + "resolved": "https://registry.npmjs.org/react-select/-/react-select-5.7.2.tgz", + "integrity": "sha512-cTlJkQ8YjV6T/js8wW0owTzht0hHGABh29vjLscY4HfZGkv7hc3FFTmRp9NzY/Ib1uQ36GieAKEjxpHdpCFpcA==", + "dependencies": { + "@babel/runtime": "^7.12.0", + "@emotion/cache": "^11.4.0", + "@emotion/react": "^11.8.1", + "@floating-ui/dom": "^1.0.1", + "@types/react-transition-group": "^4.4.0", + "memoize-one": "^6.0.0", + "prop-types": "^15.6.0", + "react-transition-group": "^4.3.0", + "use-isomorphic-layout-effect": "^1.1.2" + }, + "peerDependencies": { + "react": "^16.8.0 || ^17.0.0 || ^18.0.0", + "react-dom": "^16.8.0 || ^17.0.0 || ^18.0.0" + } + }, + "node_modules/react-slick": { + "version": "0.28.1", + "resolved": "https://registry.npmjs.org/react-slick/-/react-slick-0.28.1.tgz", + "integrity": "sha512-JwRQXoWGJRbUTE7eZI1rGIHaXX/4YuwX6gn7ulfvUZ4vFDVQAA25HcsHSYaUiRCduTr6rskyIuyPMpuG6bbluw==", + "dependencies": { + "classnames": "^2.2.5", + "enquire.js": "^2.1.6", + "json2mq": "^0.2.0", + "lodash.debounce": "^4.0.8", + "resize-observer-polyfill": "^1.5.0" + }, + "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" + } + }, + "node_modules/react-tradingview-embed": { + "version": "2.2.8", + "resolved": "https://registry.npmjs.org/react-tradingview-embed/-/react-tradingview-embed-2.2.8.tgz", + "integrity": "sha512-x6XvlT57sTr2gfP/mSYVfar0tXZ43FRLA/dFr5L+zg7p6xnyJthdbRFhXH/FmLMnSrnGFEifLwJCpgI7fAZGLw==", + "dependencies": { + "@testing-library/jest-dom": "^5.16.3", + "@testing-library/react": "^12.1.4", + "@testing-library/user-event": "^13.5.0", + "@types/jest": "^27.4.1", + "@types/node": "^17.0.23", + "@types/react": "^17.0.43", + "@types/react-dom": "^17.0.14", + "react": "^17.0.2", + "react-dom": "^17.0.2", + "react-scripts": "5.0.0", + "typescript": "^4.6.3", + "web-vitals": "^2.1.4" + } + }, + "node_modules/react-tradingview-embed/node_modules/@testing-library/react": { + "version": "12.1.5", + "resolved": "https://registry.npmjs.org/@testing-library/react/-/react-12.1.5.tgz", + "integrity": "sha512-OfTXCJUFgjd/digLUuPxa0+/3ZxsQmE7ub9kcbW/wi96Bh3o/p5vrETcBGfP17NWPGqeYYl5LTRpwyGoMC4ysg==", + "dependencies": { + "@babel/runtime": "^7.12.5", + "@testing-library/dom": "^8.0.0", + "@types/react-dom": "<18.0.0" + }, + "engines": { + "node": ">=12" + }, + "peerDependencies": { + "react": "<18.0.0", + "react-dom": "<18.0.0" + } + }, + "node_modules/react-tradingview-embed/node_modules/@types/jest": { + "version": "27.5.2", + "resolved": "https://registry.npmjs.org/@types/jest/-/jest-27.5.2.tgz", + "integrity": "sha512-mpT8LJJ4CMeeahobofYWIjFo0xonRS/HfxnVEPMPFSQdGUt1uHCnoPT7Zhb+sjDU2wz0oKV0OLUR0WzrHNgfeA==", + "dependencies": { + "jest-matcher-utils": "^27.0.0", + "pretty-format": "^27.0.0" + } + }, + "node_modules/react-tradingview-embed/node_modules/@types/node": { + "version": "17.0.45", + "resolved": "https://registry.npmjs.org/@types/node/-/node-17.0.45.tgz", + "integrity": "sha512-w+tIMs3rq2afQdsPJlODhoUEKzFP1ayaoyl1CcnwtIlsVe7K7bA1NGm4s3PraqTLlXnbIN84zuBlxBWo1u9BLw==" + }, + "node_modules/react-tradingview-embed/node_modules/@types/react": { + "version": "17.0.53", + "resolved": "https://registry.npmjs.org/@types/react/-/react-17.0.53.tgz", + "integrity": "sha512-1yIpQR2zdYu1Z/dc1OxC+MA6GR240u3gcnP4l6mvj/PJiVaqHsQPmWttsvHsfnhfPbU2FuGmo0wSITPygjBmsw==", + "dependencies": { + "@types/prop-types": "*", + "@types/scheduler": "*", + "csstype": "^3.0.2" + } + }, + "node_modules/react-tradingview-embed/node_modules/@types/react-dom": { + "version": "17.0.19", + "resolved": "https://registry.npmjs.org/@types/react-dom/-/react-dom-17.0.19.tgz", + "integrity": "sha512-PiYG40pnQRdPHnlf7tZnp0aQ6q9tspYr72vD61saO6zFCybLfMqwUCN0va1/P+86DXn18ZWeW30Bk7xlC5eEAQ==", + "dependencies": { + "@types/react": "^17" + } + }, + "node_modules/react-tradingview-embed/node_modules/react": { + "version": "17.0.2", + "resolved": "https://registry.npmjs.org/react/-/react-17.0.2.tgz", + "integrity": "sha512-gnhPt75i/dq/z3/6q/0asP78D0u592D5L1pd7M8P+dck6Fu/jJeL6iVVK23fptSUZj8Vjf++7wXA8UNclGQcbA==", + "dependencies": { + "loose-envify": "^1.1.0", + "object-assign": "^4.1.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/react-tradingview-embed/node_modules/react-dom": { + "version": "17.0.2", + "resolved": "https://registry.npmjs.org/react-dom/-/react-dom-17.0.2.tgz", + "integrity": "sha512-s4h96KtLDUQlsENhMn1ar8t2bEa+q/YAtj8pPPdIjPDGBDIVNsrD9aXNWqspUe6AzKCIG0C1HZZLqLV7qpOBGA==", + "dependencies": { + "loose-envify": "^1.1.0", + "object-assign": "^4.1.1", + "scheduler": "^0.20.2" + }, + "peerDependencies": { + "react": "17.0.2" + } + }, + "node_modules/react-tradingview-embed/node_modules/scheduler": { + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/scheduler/-/scheduler-0.20.2.tgz", + "integrity": "sha512-2eWfGgAqqWFGqtdMmcL5zCMK1U8KlXv8SQFGglL3CEtd0aDVDWgeF/YoCmvln55m5zSk3J/20hTaSBeSObsQDQ==", + "dependencies": { + "loose-envify": "^1.1.0", + "object-assign": "^4.1.1" + } + }, + "node_modules/react-transition-group": { + "version": "4.4.5", + "resolved": "https://registry.npmjs.org/react-transition-group/-/react-transition-group-4.4.5.tgz", + "integrity": "sha512-pZcd1MCJoiKiBR2NRxeCRg13uCXbydPnmB4EOeRrY7480qNWO8IIgQG6zlDkm6uRMsURXPuKq0GWtiM59a5Q6g==", + "dependencies": { + "@babel/runtime": "^7.5.5", + "dom-helpers": "^5.0.1", + "loose-envify": "^1.4.0", + "prop-types": "^15.6.2" + }, + "peerDependencies": { + "react": ">=16.6.0", + "react-dom": ">=16.6.0" + } + }, "node_modules/read-cache": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/read-cache/-/read-cache-1.0.0.tgz", @@ -14047,6 +15447,22 @@ "node": ">=8" } }, + "node_modules/redux": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/redux/-/redux-4.2.1.tgz", + "integrity": "sha512-LAUYz4lc+Do8/g7aeRa8JkyDErK6ekstQaqWQrNRW//MY1TvCEpMtpTWvlQ+FPbWCx+Xixu/6SHt5N0HR+SB4w==", + "dependencies": { + "@babel/runtime": "^7.9.2" + } + }, + "node_modules/redux-thunk": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/redux-thunk/-/redux-thunk-2.4.2.tgz", + "integrity": "sha512-+P3TjtnP0k/FEjcBL5FZpoovtvrTNT/UXd4/sluaSyrURlSlhLSzEdfsTBW7WsKB6yPvgd7q/iZPICFjW4o57Q==", + "peerDependencies": { + "redux": "^4" + } + }, "node_modules/regenerate": { "version": "1.4.2", "resolved": "https://registry.npmjs.org/regenerate/-/regenerate-1.4.2.tgz", @@ -14064,9 +15480,9 @@ } }, "node_modules/regenerator-runtime": { - "version": "0.13.9", - "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.13.9.tgz", - "integrity": "sha512-p3VT+cOEgxFsRRA9X4lkI1E+k2/CtnKtU4gcxyaCUreilL/vqI6CdZ3wxVUx3UOUg+gnUOQQcRI7BmSI656MYA==" + "version": "0.13.11", + "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.13.11.tgz", + "integrity": "sha512-kY1AZVr2Ra+t+piVaJ4gxaFaReZVH40AKNo7UCX6W+dEwBo/2oZJzqfuN1qLq1oL45o56cPaTXELwrTh8Fpggg==" }, "node_modules/regenerator-transform": { "version": "0.15.0", @@ -14189,6 +15605,16 @@ "resolved": "https://registry.npmjs.org/requires-port/-/requires-port-1.0.0.tgz", "integrity": "sha512-KigOCHcocU3XODJxsu8i/j8T9tzT4adHiecwORRQ0ZZFcp7ahwXuRU1m+yuO90C5ZUyGeGfocHDI14M3L3yDAQ==" }, + "node_modules/reselect": { + "version": "4.1.7", + "resolved": "https://registry.npmjs.org/reselect/-/reselect-4.1.7.tgz", + "integrity": "sha512-Zu1xbUt3/OPwsXL46hvOOoQrap2azE7ZQbokq61BQfiXvhewsKDwhMeZjTX9sX0nvw1t/U5Audyn1I9P/m9z0A==" + }, + "node_modules/resize-observer-polyfill": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/resize-observer-polyfill/-/resize-observer-polyfill-1.5.1.tgz", + "integrity": "sha512-LwZrotdHOo12nQuZlHEmtuXdqGoOD0OhaxopaNFxWzInpEgaLWoVuAMbTzixuosCx2nEG58ngzW3vxdWoxIgdg==" + }, "node_modules/resolve": { "version": "1.22.1", "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.1.tgz", @@ -14224,6 +15650,11 @@ "node": ">=8" } }, + "node_modules/resolve-pathname": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/resolve-pathname/-/resolve-pathname-3.0.0.tgz", + "integrity": "sha512-C7rARubxI8bXFNB/hqcp/4iUeIXJhJZvFPFPiSPRnhU5UPxzMFIl+2E6yY6c4k9giDJAhtV+enfA+G89N6Csng==" + }, "node_modules/resolve-url-loader": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/resolve-url-loader/-/resolve-url-loader-4.0.0.tgz", @@ -14337,6 +15768,7 @@ "version": "7.0.2", "resolved": "https://registry.npmjs.org/rollup-plugin-terser/-/rollup-plugin-terser-7.0.2.tgz", "integrity": "sha512-w3iIaU4OxcF52UUXiZNsNeuXIMDvFrr+ZXK6bFZ0Q60qyVfq4uLptoS4bbq3paG3x216eQllFZX7zt6TIImguQ==", + "deprecated": "This package has been deprecated and is no longer maintained. Please use @rollup/plugin-terser", "dependencies": { "@babel/code-frame": "^7.10.4", "jest-worker": "^26.2.1", @@ -14424,6 +15856,22 @@ "resolved": "https://registry.npmjs.org/sanitize.css/-/sanitize.css-13.0.0.tgz", "integrity": "sha512-ZRwKbh/eQ6w9vmTjkuG0Ioi3HBwPFce0O+v//ve+aOq1oeCy7jMV2qzzAlpsNuqpqCBjjriM1lbtZbF/Q8jVyA==" }, + "node_modules/sass": { + "version": "1.60.0", + "resolved": "https://registry.npmjs.org/sass/-/sass-1.60.0.tgz", + "integrity": "sha512-updbwW6fNb5gGm8qMXzVO7V4sWf7LMXnMly/JEyfbfERbVH46Fn6q02BX7/eHTdKpE7d+oTkMMQpFWNUMfFbgQ==", + "dependencies": { + "chokidar": ">=3.0.0 <4.0.0", + "immutable": "^4.0.0", + "source-map-js": ">=0.6.2 <2.0.0" + }, + "bin": { + "sass": "sass.js" + }, + "engines": { + "node": ">=12.0.0" + } + }, "node_modules/sass-loader": { "version": "12.6.0", "resolved": "https://registry.npmjs.org/sass-loader/-/sass-loader-12.6.0.tgz", @@ -14725,6 +16173,14 @@ "node": ">=8" } }, + "node_modules/slick-carousel": { + "version": "1.8.1", + "resolved": "https://registry.npmjs.org/slick-carousel/-/slick-carousel-1.8.1.tgz", + "integrity": "sha512-XB9Ftrf2EEKfzoQXt3Nitrt/IPbT+f1fgqBdoxO3W/+JYvtEOW6EgxnWfr9GH6nmULv7Y2tPmEX3koxThVmebA==", + "peerDependencies": { + "jquery": ">=1.8.0" + } + }, "node_modules/sockjs": { "version": "0.3.24", "resolved": "https://registry.npmjs.org/sockjs/-/sockjs-0.3.24.tgz", @@ -14806,7 +16262,8 @@ "node_modules/sourcemap-codec": { "version": "1.4.8", "resolved": "https://registry.npmjs.org/sourcemap-codec/-/sourcemap-codec-1.4.8.tgz", - "integrity": "sha512-9NykojV5Uih4lgo5So5dtw+f0JgJX30KCNI8gwhz2J9A15wD0Ml6tjHKwf6fTSa6fAdVBdZeNOs9eJ71qCk8vA==" + "integrity": "sha512-9NykojV5Uih4lgo5So5dtw+f0JgJX30KCNI8gwhz2J9A15wD0Ml6tjHKwf6fTSa6fAdVBdZeNOs9eJ71qCk8vA==", + "deprecated": "Please use @jridgewell/sourcemap-codec instead" }, "node_modules/spdy": { "version": "4.0.2", @@ -14906,6 +16363,11 @@ } ] }, + "node_modules/string-convert": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/string-convert/-/string-convert-0.2.1.tgz", + "integrity": "sha512-u/1tdPl4yQnPBjnVrmdLo9gtuLvELKsAoRapekWggdiQNvvvum+jYF329d84NAa660KQw7pB2n36KrIKVoXa3A==" + }, "node_modules/string-length": { "version": "4.0.2", "resolved": "https://registry.npmjs.org/string-length/-/string-length-4.0.2.tgz", @@ -15085,6 +16547,11 @@ "postcss": "^8.2.15" } }, + "node_modules/stylis": { + "version": "4.1.3", + "resolved": "https://registry.npmjs.org/stylis/-/stylis-4.1.3.tgz", + "integrity": "sha512-GP6WDNWf+o403jrEp9c5jibKavrtLW+/qYGhFxFrG8maXhwTBI7gLLhiBb0o7uFccWN+EOS9aMO6cGHWAO07OA==" + }, "node_modules/supports-color": { "version": "5.5.0", "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", @@ -15414,6 +16881,16 @@ "resolved": "https://registry.npmjs.org/thunky/-/thunky-1.1.0.tgz", "integrity": "sha512-eHY7nBftgThBqOyHGVN+l8gF0BucP09fMo0oO/Lb0w1OF80dJv+lDVpXG60WMQvkcxAkNybKsrEIE3ZtKGmPrA==" }, + "node_modules/tiny-invariant": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/tiny-invariant/-/tiny-invariant-1.3.1.tgz", + "integrity": "sha512-AD5ih2NlSssTCwsMznbvwMZpJ1cbhkGd2uueNxzv2jDlEeZdU04JQfRnggJQ8DrcVBGjAsCKwFBbDlVNtEMlzw==" + }, + "node_modules/tiny-warning": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/tiny-warning/-/tiny-warning-1.0.3.tgz", + "integrity": "sha512-lBN9zLN/oAf68o3zNXYrdCt1kP8WsiGW8Oo2ka41b2IM5JL/S1CTyX1rW0mb/zSuJun0ZUrDxx4sqvYS2FWzPA==" + }, "node_modules/tmpl": { "version": "1.0.5", "resolved": "https://registry.npmjs.org/tmpl/-/tmpl-1.0.5.tgz", @@ -15588,10 +17065,9 @@ } }, "node_modules/typescript": { - "version": "4.7.4", - "resolved": "https://registry.npmjs.org/typescript/-/typescript-4.7.4.tgz", - "integrity": "sha512-C0WQT0gezHuw6AdY1M2jxUO83Rjf0HP7Sk1DtXj6j1EwkQNZrHAg2XPWlq62oqEhYvONq5pkC2Y9oPljWToLmQ==", - "peer": true, + "version": "4.9.5", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-4.9.5.tgz", + "integrity": "sha512-1FXk9E2Hm+QzZQ7z+McJiHL4NW1F2EzMu9Nq9i3zAaGqibafqYwCVU6WyWAuyQRRzOlxou8xZSyXLEN8oKj24g==", "bin": { "tsc": "bin/tsc", "tsserver": "bin/tsserver" @@ -15614,6 +17090,20 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/uncontrollable": { + "version": "7.2.1", + "resolved": "https://registry.npmjs.org/uncontrollable/-/uncontrollable-7.2.1.tgz", + "integrity": "sha512-svtcfoTADIB0nT9nltgjujTi7BzVmwjZClOmskKu/E8FW9BXzg9os8OLr4f8Dlnk0rYWJIWr4wv9eKUXiQvQwQ==", + "dependencies": { + "@babel/runtime": "^7.6.3", + "@types/react": ">=16.9.11", + "invariant": "^2.2.4", + "react-lifecycles-compat": "^3.0.4" + }, + "peerDependencies": { + "react": ">=15.0.0" + } + }, "node_modules/unicode-canonical-property-names-ecmascript": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/unicode-canonical-property-names-ecmascript/-/unicode-canonical-property-names-ecmascript-2.0.0.tgz", @@ -15724,6 +17214,27 @@ "punycode": "^2.1.0" } }, + "node_modules/use-isomorphic-layout-effect": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/use-isomorphic-layout-effect/-/use-isomorphic-layout-effect-1.1.2.tgz", + "integrity": "sha512-49L8yCO3iGT/ZF9QttjwLF/ZD9Iwto5LnH5LmEdk/6cFmXddqi2ulF0edxTwjj+7mqvpVVGQWvbXZdn32wRSHA==", + "peerDependencies": { + "react": "^16.8.0 || ^17.0.0 || ^18.0.0" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/use-sync-external-store": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/use-sync-external-store/-/use-sync-external-store-1.2.0.tgz", + "integrity": "sha512-eEgnFxGQ1Ife9bzYs6VLi8/4X6CObHMw9Qr9tPY43iKwsPw8xE8+EFsf/2cFZ5S3esXgpWgtSCtLNS41F+sKPA==", + "peerDependencies": { + "react": "^16.8.0 || ^17.0.0 || ^18.0.0" + } + }, "node_modules/util-deprecate": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", @@ -15764,11 +17275,6 @@ "uuid": "dist/bin/uuid" } }, - "node_modules/v8-compile-cache": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/v8-compile-cache/-/v8-compile-cache-2.3.0.tgz", - "integrity": "sha512-l8lCEmLcLYZh4nbunNZvQCJc5pv7+RCwa8q/LdUx8u7lsWvPDKmpodJAJNwkAhJC//dFY48KuIEmjtd4RViDrA==" - }, "node_modules/v8-to-istanbul": { "version": "8.1.1", "resolved": "https://registry.npmjs.org/v8-to-istanbul/-/v8-to-istanbul-8.1.1.tgz", @@ -15782,6 +17288,11 @@ "node": ">=10.12.0" } }, + "node_modules/value-equal": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/value-equal/-/value-equal-1.0.1.tgz", + "integrity": "sha512-NOJ6JZCAWr0zlxZt+xqCHNTEKOsrks2HQd4MqhP1qy4z1SkbEP467eNx6TgDKXMvUOb+OENfJCZwM+16n7fRfw==" + }, "node_modules/vary": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz", @@ -15794,6 +17305,7 @@ "version": "1.0.2", "resolved": "https://registry.npmjs.org/w3c-hr-time/-/w3c-hr-time-1.0.2.tgz", "integrity": "sha512-z8P5DvDNjKDoFIHK7q8r8lackT6l+jo/Ye3HOle7l9nICP9lf1Ci25fy9vHd0JOWewkIFzXIEig3TdKT7JQ5fQ==", + "deprecated": "Use your platform's native performance.now() and performance.timeOrigin.", "dependencies": { "browser-process-hrtime": "^1.0.0" } @@ -15817,6 +17329,14 @@ "makeerror": "1.0.12" } }, + "node_modules/warning": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/warning/-/warning-4.0.3.tgz", + "integrity": "sha512-rpJyN222KWIvHJ/F53XSZv0Zl/accqHR8et1kpaMTD/fLCRxtV8iX8czMzY7sVZupTI3zcUTg8eycS2kNF9l6w==", + "dependencies": { + "loose-envify": "^1.0.0" + } + }, "node_modules/watchpack": { "version": "2.4.0", "resolved": "https://registry.npmjs.org/watchpack/-/watchpack-2.4.0.tgz", @@ -16709,11864 +18229,5 @@ "url": "https://github.com/sponsors/sindresorhus" } } - }, - "dependencies": { - "@ampproject/remapping": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/@ampproject/remapping/-/remapping-2.2.0.tgz", - "integrity": "sha512-qRmjj8nj9qmLTQXXmaR1cck3UXSRMPrbsLJAasZpF+t3riI71BXed5ebIOYwQntykeZuhjsdweEc9BxH5Jc26w==", - "requires": { - "@jridgewell/gen-mapping": "^0.1.0", - "@jridgewell/trace-mapping": "^0.3.9" - } - }, - "@babel/code-frame": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.18.6.tgz", - "integrity": "sha512-TDCmlK5eOvH+eH7cdAFlNXeVJqWIQ7gW9tY1GJIpUtFb6CmjVyq2VM3u71bOyR8CRihcCgMUYoDNyLXao3+70Q==", - "requires": { - "@babel/highlight": "^7.18.6" - } - }, - "@babel/compat-data": { - "version": "7.18.8", - "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.18.8.tgz", - "integrity": "sha512-HSmX4WZPPK3FUxYp7g2T6EyO8j96HlZJlxmKPSh6KAcqwyDrfx7hKjXpAW/0FhFfTJsR0Yt4lAjLI2coMptIHQ==" - }, - "@babel/core": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.18.6.tgz", - "integrity": "sha512-cQbWBpxcbbs/IUredIPkHiAGULLV8iwgNRMFzvbhEXISp4f3rUUXE5+TIw6KwUWUR3DwyI6gmBRnmAtYaWehwQ==", - "requires": { - "@ampproject/remapping": "^2.1.0", - "@babel/code-frame": "^7.18.6", - "@babel/generator": "^7.18.6", - "@babel/helper-compilation-targets": "^7.18.6", - "@babel/helper-module-transforms": "^7.18.6", - "@babel/helpers": "^7.18.6", - "@babel/parser": "^7.18.6", - "@babel/template": "^7.18.6", - "@babel/traverse": "^7.18.6", - "@babel/types": "^7.18.6", - "convert-source-map": "^1.7.0", - "debug": "^4.1.0", - "gensync": "^1.0.0-beta.2", - "json5": "^2.2.1", - "semver": "^6.3.0" - }, - "dependencies": { - "semver": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", - "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==" - } - } - }, - "@babel/eslint-parser": { - "version": "7.18.2", - "resolved": "https://registry.npmjs.org/@babel/eslint-parser/-/eslint-parser-7.18.2.tgz", - "integrity": "sha512-oFQYkE8SuH14+uR51JVAmdqwKYXGRjEXx7s+WiagVjqQ+HPE+nnwyF2qlVG8evUsUHmPcA+6YXMEDbIhEyQc5A==", - "requires": { - "eslint-scope": "^5.1.1", - "eslint-visitor-keys": "^2.1.0", - "semver": "^6.3.0" - }, - "dependencies": { - "eslint-scope": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-5.1.1.tgz", - "integrity": "sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw==", - "requires": { - "esrecurse": "^4.3.0", - "estraverse": "^4.1.1" - } - }, - "eslint-visitor-keys": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-2.1.0.tgz", - "integrity": "sha512-0rSmRBzXgDzIsD6mGdJgevzgezI534Cer5L/vyMX0kHzT/jiB43jRhd9YUlMGYLQy2zprNmoT8qasCGtY+QaKw==" - }, - "estraverse": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.3.0.tgz", - "integrity": "sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==" - }, - "semver": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", - "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==" - } - } - }, - "@babel/generator": { - "version": "7.18.7", - "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.18.7.tgz", - "integrity": "sha512-shck+7VLlY72a2w9c3zYWuE1pwOKEiQHV7GTUbSnhyl5eu3i04t30tBY82ZRWrDfo3gkakCFtevExnxbkf2a3A==", - "requires": { - "@babel/types": "^7.18.7", - "@jridgewell/gen-mapping": "^0.3.2", - "jsesc": "^2.5.1" - }, - "dependencies": { - "@jridgewell/gen-mapping": { - "version": "0.3.2", - "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.2.tgz", - "integrity": "sha512-mh65xKQAzI6iBcFzwv28KVWSmCkdRBWoOh+bYQGW3+6OZvbbN3TqMGo5hqYxQniRcH9F2VZIoJCm4pa3BPDK/A==", - "requires": { - "@jridgewell/set-array": "^1.0.1", - "@jridgewell/sourcemap-codec": "^1.4.10", - "@jridgewell/trace-mapping": "^0.3.9" - } - } - } - }, - "@babel/helper-annotate-as-pure": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.18.6.tgz", - "integrity": "sha512-duORpUiYrEpzKIop6iNbjnwKLAKnJ47csTyRACyEmWj0QdUrm5aqNJGHSSEQSUAvNW0ojX0dOmK9dZduvkfeXA==", - "requires": { - "@babel/types": "^7.18.6" - } - }, - "@babel/helper-builder-binary-assignment-operator-visitor": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/helper-builder-binary-assignment-operator-visitor/-/helper-builder-binary-assignment-operator-visitor-7.18.6.tgz", - "integrity": "sha512-KT10c1oWEpmrIRYnthbzHgoOf6B+Xd6a5yhdbNtdhtG7aO1or5HViuf1TQR36xY/QprXA5nvxO6nAjhJ4y38jw==", - "requires": { - "@babel/helper-explode-assignable-expression": "^7.18.6", - "@babel/types": "^7.18.6" - } - }, - "@babel/helper-compilation-targets": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.18.6.tgz", - "integrity": "sha512-vFjbfhNCzqdeAtZflUFrG5YIFqGTqsctrtkZ1D/NB0mDW9TwW3GmmUepYY4G9wCET5rY5ugz4OGTcLd614IzQg==", - "requires": { - "@babel/compat-data": "^7.18.6", - "@babel/helper-validator-option": "^7.18.6", - "browserslist": "^4.20.2", - "semver": "^6.3.0" - }, - "dependencies": { - "semver": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", - "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==" - } - } - }, - "@babel/helper-create-class-features-plugin": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.18.6.tgz", - "integrity": "sha512-YfDzdnoxHGV8CzqHGyCbFvXg5QESPFkXlHtvdCkesLjjVMT2Adxe4FGUR5ChIb3DxSaXO12iIOCWoXdsUVwnqw==", - "requires": { - "@babel/helper-annotate-as-pure": "^7.18.6", - "@babel/helper-environment-visitor": "^7.18.6", - "@babel/helper-function-name": "^7.18.6", - "@babel/helper-member-expression-to-functions": "^7.18.6", - "@babel/helper-optimise-call-expression": "^7.18.6", - "@babel/helper-replace-supers": "^7.18.6", - "@babel/helper-split-export-declaration": "^7.18.6" - } - }, - "@babel/helper-create-regexp-features-plugin": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/helper-create-regexp-features-plugin/-/helper-create-regexp-features-plugin-7.18.6.tgz", - "integrity": "sha512-7LcpH1wnQLGrI+4v+nPp+zUvIkF9x0ddv1Hkdue10tg3gmRnLy97DXh4STiOf1qeIInyD69Qv5kKSZzKD8B/7A==", - "requires": { - "@babel/helper-annotate-as-pure": "^7.18.6", - "regexpu-core": "^5.1.0" - } - }, - "@babel/helper-define-polyfill-provider": { - "version": "0.3.1", - "resolved": "https://registry.npmjs.org/@babel/helper-define-polyfill-provider/-/helper-define-polyfill-provider-0.3.1.tgz", - "integrity": "sha512-J9hGMpJQmtWmj46B3kBHmL38UhJGhYX7eqkcq+2gsstyYt341HmPeWspihX43yVRA0mS+8GGk2Gckc7bY/HCmA==", - "requires": { - "@babel/helper-compilation-targets": "^7.13.0", - "@babel/helper-module-imports": "^7.12.13", - "@babel/helper-plugin-utils": "^7.13.0", - "@babel/traverse": "^7.13.0", - "debug": "^4.1.1", - "lodash.debounce": "^4.0.8", - "resolve": "^1.14.2", - "semver": "^6.1.2" - }, - "dependencies": { - "semver": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", - "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==" - } - } - }, - "@babel/helper-environment-visitor": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/helper-environment-visitor/-/helper-environment-visitor-7.18.6.tgz", - "integrity": "sha512-8n6gSfn2baOY+qlp+VSzsosjCVGFqWKmDF0cCWOybh52Dw3SEyoWR1KrhMJASjLwIEkkAufZ0xvr+SxLHSpy2Q==" - }, - "@babel/helper-explode-assignable-expression": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/helper-explode-assignable-expression/-/helper-explode-assignable-expression-7.18.6.tgz", - "integrity": "sha512-eyAYAsQmB80jNfg4baAtLeWAQHfHFiR483rzFK+BhETlGZaQC9bsfrugfXDCbRHLQbIA7U5NxhhOxN7p/dWIcg==", - "requires": { - "@babel/types": "^7.18.6" - } - }, - "@babel/helper-function-name": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.18.6.tgz", - "integrity": "sha512-0mWMxV1aC97dhjCah5U5Ua7668r5ZmSC2DLfH2EZnf9c3/dHZKiFa5pRLMH5tjSl471tY6496ZWk/kjNONBxhw==", - "requires": { - "@babel/template": "^7.18.6", - "@babel/types": "^7.18.6" - } - }, - "@babel/helper-hoist-variables": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/helper-hoist-variables/-/helper-hoist-variables-7.18.6.tgz", - "integrity": "sha512-UlJQPkFqFULIcyW5sbzgbkxn2FKRgwWiRexcuaR8RNJRy8+LLveqPjwZV/bwrLZCN0eUHD/x8D0heK1ozuoo6Q==", - "requires": { - "@babel/types": "^7.18.6" - } - }, - "@babel/helper-member-expression-to-functions": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.18.6.tgz", - "integrity": "sha512-CeHxqwwipekotzPDUuJOfIMtcIHBuc7WAzLmTYWctVigqS5RktNMQ5bEwQSuGewzYnCtTWa3BARXeiLxDTv+Ng==", - "requires": { - "@babel/types": "^7.18.6" - } - }, - "@babel/helper-module-imports": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.18.6.tgz", - "integrity": "sha512-0NFvs3VkuSYbFi1x2Vd6tKrywq+z/cLeYC/RJNFrIX/30Bf5aiGYbtvGXolEktzJH8o5E5KJ3tT+nkxuuZFVlA==", - "requires": { - "@babel/types": "^7.18.6" - } - }, - "@babel/helper-module-transforms": { - "version": "7.18.8", - "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.18.8.tgz", - "integrity": "sha512-che3jvZwIcZxrwh63VfnFTUzcAM9v/lznYkkRxIBGMPt1SudOKHAEec0SIRCfiuIzTcF7VGj/CaTT6gY4eWxvA==", - "requires": { - "@babel/helper-environment-visitor": "^7.18.6", - "@babel/helper-module-imports": "^7.18.6", - "@babel/helper-simple-access": "^7.18.6", - "@babel/helper-split-export-declaration": "^7.18.6", - "@babel/helper-validator-identifier": "^7.18.6", - "@babel/template": "^7.18.6", - "@babel/traverse": "^7.18.8", - "@babel/types": "^7.18.8" - } - }, - "@babel/helper-optimise-call-expression": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.18.6.tgz", - "integrity": "sha512-HP59oD9/fEHQkdcbgFCnbmgH5vIQTJbxh2yf+CdM89/glUNnuzr87Q8GIjGEnOktTROemO0Pe0iPAYbqZuOUiA==", - "requires": { - "@babel/types": "^7.18.6" - } - }, - "@babel/helper-plugin-utils": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.18.6.tgz", - "integrity": "sha512-gvZnm1YAAxh13eJdkb9EWHBnF3eAub3XTLCZEehHT2kWxiKVRL64+ae5Y6Ivne0mVHmMYKT+xWgZO+gQhuLUBg==" - }, - "@babel/helper-remap-async-to-generator": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/helper-remap-async-to-generator/-/helper-remap-async-to-generator-7.18.6.tgz", - "integrity": "sha512-z5wbmV55TveUPZlCLZvxWHtrjuJd+8inFhk7DG0WW87/oJuGDcjDiu7HIvGcpf5464L6xKCg3vNkmlVVz9hwyQ==", - "requires": { - "@babel/helper-annotate-as-pure": "^7.18.6", - "@babel/helper-environment-visitor": "^7.18.6", - "@babel/helper-wrap-function": "^7.18.6", - "@babel/types": "^7.18.6" - } - }, - "@babel/helper-replace-supers": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/helper-replace-supers/-/helper-replace-supers-7.18.6.tgz", - "integrity": "sha512-fTf7zoXnUGl9gF25fXCWE26t7Tvtyn6H4hkLSYhATwJvw2uYxd3aoXplMSe0g9XbwK7bmxNes7+FGO0rB/xC0g==", - "requires": { - "@babel/helper-environment-visitor": "^7.18.6", - "@babel/helper-member-expression-to-functions": "^7.18.6", - "@babel/helper-optimise-call-expression": "^7.18.6", - "@babel/traverse": "^7.18.6", - "@babel/types": "^7.18.6" - } - }, - "@babel/helper-simple-access": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.18.6.tgz", - "integrity": "sha512-iNpIgTgyAvDQpDj76POqg+YEt8fPxx3yaNBg3S30dxNKm2SWfYhD0TGrK/Eu9wHpUW63VQU894TsTg+GLbUa1g==", - "requires": { - "@babel/types": "^7.18.6" - } - }, - "@babel/helper-skip-transparent-expression-wrappers": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/helper-skip-transparent-expression-wrappers/-/helper-skip-transparent-expression-wrappers-7.18.6.tgz", - "integrity": "sha512-4KoLhwGS9vGethZpAhYnMejWkX64wsnHPDwvOsKWU6Fg4+AlK2Jz3TyjQLMEPvz+1zemi/WBdkYxCD0bAfIkiw==", - "requires": { - "@babel/types": "^7.18.6" - } - }, - "@babel/helper-split-export-declaration": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.18.6.tgz", - "integrity": "sha512-bde1etTx6ZyTmobl9LLMMQsaizFVZrquTEHOqKeQESMKo4PlObf+8+JA25ZsIpZhT/WEd39+vOdLXAFG/nELpA==", - "requires": { - "@babel/types": "^7.18.6" - } - }, - "@babel/helper-validator-identifier": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.18.6.tgz", - "integrity": "sha512-MmetCkz9ej86nJQV+sFCxoGGrUbU3q02kgLciwkrt9QqEB7cP39oKEY0PakknEO0Gu20SskMRi+AYZ3b1TpN9g==" - }, - "@babel/helper-validator-option": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.18.6.tgz", - "integrity": "sha512-XO7gESt5ouv/LRJdrVjkShckw6STTaB7l9BrpBaAHDeF5YZT+01PCwmR0SJHnkW6i8OwW/EVWRShfi4j2x+KQw==" - }, - "@babel/helper-wrap-function": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/helper-wrap-function/-/helper-wrap-function-7.18.6.tgz", - "integrity": "sha512-I5/LZfozwMNbwr/b1vhhuYD+J/mU+gfGAj5td7l5Rv9WYmH6i3Om69WGKNmlIpsVW/mF6O5bvTKbvDQZVgjqOw==", - "requires": { - "@babel/helper-function-name": "^7.18.6", - "@babel/template": "^7.18.6", - "@babel/traverse": "^7.18.6", - "@babel/types": "^7.18.6" - } - }, - "@babel/helpers": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.18.6.tgz", - "integrity": "sha512-vzSiiqbQOghPngUYt/zWGvK3LAsPhz55vc9XNN0xAl2gV4ieShI2OQli5duxWHD+72PZPTKAcfcZDE1Cwc5zsQ==", - "requires": { - "@babel/template": "^7.18.6", - "@babel/traverse": "^7.18.6", - "@babel/types": "^7.18.6" - } - }, - "@babel/highlight": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.18.6.tgz", - "integrity": "sha512-u7stbOuYjaPezCuLj29hNW1v64M2Md2qupEKP1fHc7WdOA3DgLh37suiSrZYY7haUB7iBeQZ9P1uiRF359do3g==", - "requires": { - "@babel/helper-validator-identifier": "^7.18.6", - "chalk": "^2.0.0", - "js-tokens": "^4.0.0" - } - }, - "@babel/parser": { - "version": "7.18.8", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.18.8.tgz", - "integrity": "sha512-RSKRfYX20dyH+elbJK2uqAkVyucL+xXzhqlMD5/ZXx+dAAwpyB7HsvnHe/ZUGOF+xLr5Wx9/JoXVTj6BQE2/oA==" - }, - "@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression/-/plugin-bugfix-safari-id-destructuring-collision-in-function-expression-7.18.6.tgz", - "integrity": "sha512-Dgxsyg54Fx1d4Nge8UnvTrED63vrwOdPmyvPzlNN/boaliRP54pm3pGzZD1SJUwrBA+Cs/xdG8kXX6Mn/RfISQ==", - "requires": { - "@babel/helper-plugin-utils": "^7.18.6" - } - }, - "@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining/-/plugin-bugfix-v8-spread-parameters-in-optional-chaining-7.18.6.tgz", - "integrity": "sha512-Udgu8ZRgrBrttVz6A0EVL0SJ1z+RLbIeqsu632SA1hf0awEppD6TvdznoH+orIF8wtFFAV/Enmw9Y+9oV8TQcw==", - "requires": { - "@babel/helper-plugin-utils": "^7.18.6", - "@babel/helper-skip-transparent-expression-wrappers": "^7.18.6", - "@babel/plugin-proposal-optional-chaining": "^7.18.6" - } - }, - "@babel/plugin-proposal-async-generator-functions": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-async-generator-functions/-/plugin-proposal-async-generator-functions-7.18.6.tgz", - "integrity": "sha512-WAz4R9bvozx4qwf74M+sfqPMKfSqwM0phxPTR6iJIi8robgzXwkEgmeJG1gEKhm6sDqT/U9aV3lfcqybIpev8w==", - "requires": { - "@babel/helper-environment-visitor": "^7.18.6", - "@babel/helper-plugin-utils": "^7.18.6", - "@babel/helper-remap-async-to-generator": "^7.18.6", - "@babel/plugin-syntax-async-generators": "^7.8.4" - } - }, - "@babel/plugin-proposal-class-properties": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-class-properties/-/plugin-proposal-class-properties-7.18.6.tgz", - "integrity": "sha512-cumfXOF0+nzZrrN8Rf0t7M+tF6sZc7vhQwYQck9q1/5w2OExlD+b4v4RpMJFaV1Z7WcDRgO6FqvxqxGlwo+RHQ==", - "requires": { - "@babel/helper-create-class-features-plugin": "^7.18.6", - "@babel/helper-plugin-utils": "^7.18.6" - } - }, - "@babel/plugin-proposal-class-static-block": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-class-static-block/-/plugin-proposal-class-static-block-7.18.6.tgz", - "integrity": "sha512-+I3oIiNxrCpup3Gi8n5IGMwj0gOCAjcJUSQEcotNnCCPMEnixawOQ+KeJPlgfjzx+FKQ1QSyZOWe7wmoJp7vhw==", - "requires": { - "@babel/helper-create-class-features-plugin": "^7.18.6", - "@babel/helper-plugin-utils": "^7.18.6", - "@babel/plugin-syntax-class-static-block": "^7.14.5" - } - }, - "@babel/plugin-proposal-decorators": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-decorators/-/plugin-proposal-decorators-7.18.6.tgz", - "integrity": "sha512-gAdhsjaYmiZVxx5vTMiRfj31nB7LhwBJFMSLzeDxc7X4tKLixup0+k9ughn0RcpBrv9E3PBaXJW7jF5TCihAOg==", - "requires": { - "@babel/helper-create-class-features-plugin": "^7.18.6", - "@babel/helper-plugin-utils": "^7.18.6", - "@babel/helper-replace-supers": "^7.18.6", - "@babel/helper-split-export-declaration": "^7.18.6", - "@babel/plugin-syntax-decorators": "^7.18.6" - } - }, - "@babel/plugin-proposal-dynamic-import": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-dynamic-import/-/plugin-proposal-dynamic-import-7.18.6.tgz", - "integrity": "sha512-1auuwmK+Rz13SJj36R+jqFPMJWyKEDd7lLSdOj4oJK0UTgGueSAtkrCvz9ewmgyU/P941Rv2fQwZJN8s6QruXw==", - "requires": { - "@babel/helper-plugin-utils": "^7.18.6", - "@babel/plugin-syntax-dynamic-import": "^7.8.3" - } - }, - "@babel/plugin-proposal-export-namespace-from": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-export-namespace-from/-/plugin-proposal-export-namespace-from-7.18.6.tgz", - "integrity": "sha512-zr/QcUlUo7GPo6+X1wC98NJADqmy5QTFWWhqeQWiki4XHafJtLl/YMGkmRB2szDD2IYJCCdBTd4ElwhId9T7Xw==", - "requires": { - "@babel/helper-plugin-utils": "^7.18.6", - "@babel/plugin-syntax-export-namespace-from": "^7.8.3" - } - }, - "@babel/plugin-proposal-json-strings": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-json-strings/-/plugin-proposal-json-strings-7.18.6.tgz", - "integrity": "sha512-lr1peyn9kOdbYc0xr0OdHTZ5FMqS6Di+H0Fz2I/JwMzGmzJETNeOFq2pBySw6X/KFL5EWDjlJuMsUGRFb8fQgQ==", - "requires": { - "@babel/helper-plugin-utils": "^7.18.6", - "@babel/plugin-syntax-json-strings": "^7.8.3" - } - }, - "@babel/plugin-proposal-logical-assignment-operators": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-logical-assignment-operators/-/plugin-proposal-logical-assignment-operators-7.18.6.tgz", - "integrity": "sha512-zMo66azZth/0tVd7gmkxOkOjs2rpHyhpcFo565PUP37hSp6hSd9uUKIfTDFMz58BwqgQKhJ9YxtM5XddjXVn+Q==", - "requires": { - "@babel/helper-plugin-utils": "^7.18.6", - "@babel/plugin-syntax-logical-assignment-operators": "^7.10.4" - } - }, - "@babel/plugin-proposal-nullish-coalescing-operator": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-nullish-coalescing-operator/-/plugin-proposal-nullish-coalescing-operator-7.18.6.tgz", - "integrity": "sha512-wQxQzxYeJqHcfppzBDnm1yAY0jSRkUXR2z8RePZYrKwMKgMlE8+Z6LUno+bd6LvbGh8Gltvy74+9pIYkr+XkKA==", - "requires": { - "@babel/helper-plugin-utils": "^7.18.6", - "@babel/plugin-syntax-nullish-coalescing-operator": "^7.8.3" - } - }, - "@babel/plugin-proposal-numeric-separator": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-numeric-separator/-/plugin-proposal-numeric-separator-7.18.6.tgz", - "integrity": "sha512-ozlZFogPqoLm8WBr5Z8UckIoE4YQ5KESVcNudyXOR8uqIkliTEgJ3RoketfG6pmzLdeZF0H/wjE9/cCEitBl7Q==", - "requires": { - "@babel/helper-plugin-utils": "^7.18.6", - "@babel/plugin-syntax-numeric-separator": "^7.10.4" - } - }, - "@babel/plugin-proposal-object-rest-spread": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-object-rest-spread/-/plugin-proposal-object-rest-spread-7.18.6.tgz", - "integrity": "sha512-9yuM6wr4rIsKa1wlUAbZEazkCrgw2sMPEXCr4Rnwetu7cEW1NydkCWytLuYletbf8vFxdJxFhwEZqMpOx2eZyw==", - "requires": { - "@babel/compat-data": "^7.18.6", - "@babel/helper-compilation-targets": "^7.18.6", - "@babel/helper-plugin-utils": "^7.18.6", - "@babel/plugin-syntax-object-rest-spread": "^7.8.3", - "@babel/plugin-transform-parameters": "^7.18.6" - } - }, - "@babel/plugin-proposal-optional-catch-binding": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-optional-catch-binding/-/plugin-proposal-optional-catch-binding-7.18.6.tgz", - "integrity": "sha512-Q40HEhs9DJQyaZfUjjn6vE8Cv4GmMHCYuMGIWUnlxH6400VGxOuwWsPt4FxXxJkC/5eOzgn0z21M9gMT4MOhbw==", - "requires": { - "@babel/helper-plugin-utils": "^7.18.6", - "@babel/plugin-syntax-optional-catch-binding": "^7.8.3" - } - }, - "@babel/plugin-proposal-optional-chaining": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-optional-chaining/-/plugin-proposal-optional-chaining-7.18.6.tgz", - "integrity": "sha512-PatI6elL5eMzoypFAiYDpYQyMtXTn+iMhuxxQt5mAXD4fEmKorpSI3PHd+i3JXBJN3xyA6MvJv7at23HffFHwA==", - "requires": { - "@babel/helper-plugin-utils": "^7.18.6", - "@babel/helper-skip-transparent-expression-wrappers": "^7.18.6", - "@babel/plugin-syntax-optional-chaining": "^7.8.3" - } - }, - "@babel/plugin-proposal-private-methods": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-private-methods/-/plugin-proposal-private-methods-7.18.6.tgz", - "integrity": "sha512-nutsvktDItsNn4rpGItSNV2sz1XwS+nfU0Rg8aCx3W3NOKVzdMjJRu0O5OkgDp3ZGICSTbgRpxZoWsxoKRvbeA==", - "requires": { - "@babel/helper-create-class-features-plugin": "^7.18.6", - "@babel/helper-plugin-utils": "^7.18.6" - } - }, - "@babel/plugin-proposal-private-property-in-object": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-private-property-in-object/-/plugin-proposal-private-property-in-object-7.18.6.tgz", - "integrity": "sha512-9Rysx7FOctvT5ouj5JODjAFAkgGoudQuLPamZb0v1TGLpapdNaftzifU8NTWQm0IRjqoYypdrSmyWgkocDQ8Dw==", - "requires": { - "@babel/helper-annotate-as-pure": "^7.18.6", - "@babel/helper-create-class-features-plugin": "^7.18.6", - "@babel/helper-plugin-utils": "^7.18.6", - "@babel/plugin-syntax-private-property-in-object": "^7.14.5" - } - }, - "@babel/plugin-proposal-unicode-property-regex": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-unicode-property-regex/-/plugin-proposal-unicode-property-regex-7.18.6.tgz", - "integrity": "sha512-2BShG/d5yoZyXZfVePH91urL5wTG6ASZU9M4o03lKK8u8UW1y08OMttBSOADTcJrnPMpvDXRG3G8fyLh4ovs8w==", - "requires": { - "@babel/helper-create-regexp-features-plugin": "^7.18.6", - "@babel/helper-plugin-utils": "^7.18.6" - } - }, - "@babel/plugin-syntax-async-generators": { - "version": "7.8.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-async-generators/-/plugin-syntax-async-generators-7.8.4.tgz", - "integrity": "sha512-tycmZxkGfZaxhMRbXlPXuVFpdWlXpir2W4AMhSJgRKzk/eDlIXOhb2LHWoLpDF7TEHylV5zNhykX6KAgHJmTNw==", - "requires": { - "@babel/helper-plugin-utils": "^7.8.0" - } - }, - "@babel/plugin-syntax-bigint": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-bigint/-/plugin-syntax-bigint-7.8.3.tgz", - "integrity": "sha512-wnTnFlG+YxQm3vDxpGE57Pj0srRU4sHE/mDkt1qv2YJJSeUAec2ma4WLUnUPeKjyrfntVwe/N6dCXpU+zL3Npg==", - "requires": { - "@babel/helper-plugin-utils": "^7.8.0" - } - }, - "@babel/plugin-syntax-class-properties": { - "version": "7.12.13", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-class-properties/-/plugin-syntax-class-properties-7.12.13.tgz", - "integrity": "sha512-fm4idjKla0YahUNgFNLCB0qySdsoPiZP3iQE3rky0mBUtMZ23yDJ9SJdg6dXTSDnulOVqiF3Hgr9nbXvXTQZYA==", - "requires": { - "@babel/helper-plugin-utils": "^7.12.13" - } - }, - "@babel/plugin-syntax-class-static-block": { - "version": "7.14.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-class-static-block/-/plugin-syntax-class-static-block-7.14.5.tgz", - "integrity": "sha512-b+YyPmr6ldyNnM6sqYeMWE+bgJcJpO6yS4QD7ymxgH34GBPNDM/THBh8iunyvKIZztiwLH4CJZ0RxTk9emgpjw==", - "requires": { - "@babel/helper-plugin-utils": "^7.14.5" - } - }, - "@babel/plugin-syntax-decorators": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-decorators/-/plugin-syntax-decorators-7.18.6.tgz", - "integrity": "sha512-fqyLgjcxf/1yhyZ6A+yo1u9gJ7eleFQod2lkaUsF9DQ7sbbY3Ligym3L0+I2c0WmqNKDpoD9UTb1AKP3qRMOAQ==", - "requires": { - "@babel/helper-plugin-utils": "^7.18.6" - } - }, - "@babel/plugin-syntax-dynamic-import": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-dynamic-import/-/plugin-syntax-dynamic-import-7.8.3.tgz", - "integrity": "sha512-5gdGbFon+PszYzqs83S3E5mpi7/y/8M9eC90MRTZfduQOYW76ig6SOSPNe41IG5LoP3FGBn2N0RjVDSQiS94kQ==", - "requires": { - "@babel/helper-plugin-utils": "^7.8.0" - } - }, - "@babel/plugin-syntax-export-namespace-from": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-export-namespace-from/-/plugin-syntax-export-namespace-from-7.8.3.tgz", - "integrity": "sha512-MXf5laXo6c1IbEbegDmzGPwGNTsHZmEy6QGznu5Sh2UCWvueywb2ee+CCE4zQiZstxU9BMoQO9i6zUFSY0Kj0Q==", - "requires": { - "@babel/helper-plugin-utils": "^7.8.3" - } - }, - "@babel/plugin-syntax-flow": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-flow/-/plugin-syntax-flow-7.18.6.tgz", - "integrity": "sha512-LUbR+KNTBWCUAqRG9ex5Gnzu2IOkt8jRJbHHXFT9q+L9zm7M/QQbEqXyw1n1pohYvOyWC8CjeyjrSaIwiYjK7A==", - "requires": { - "@babel/helper-plugin-utils": "^7.18.6" - } - }, - "@babel/plugin-syntax-import-assertions": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-assertions/-/plugin-syntax-import-assertions-7.18.6.tgz", - "integrity": "sha512-/DU3RXad9+bZwrgWJQKbr39gYbJpLJHezqEzRzi/BHRlJ9zsQb4CK2CA/5apllXNomwA1qHwzvHl+AdEmC5krQ==", - "requires": { - "@babel/helper-plugin-utils": "^7.18.6" - } - }, - "@babel/plugin-syntax-import-meta": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-meta/-/plugin-syntax-import-meta-7.10.4.tgz", - "integrity": "sha512-Yqfm+XDx0+Prh3VSeEQCPU81yC+JWZ2pDPFSS4ZdpfZhp4MkFMaDC1UqseovEKwSUpnIL7+vK+Clp7bfh0iD7g==", - "requires": { - "@babel/helper-plugin-utils": "^7.10.4" - } - }, - "@babel/plugin-syntax-json-strings": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-json-strings/-/plugin-syntax-json-strings-7.8.3.tgz", - "integrity": "sha512-lY6kdGpWHvjoe2vk4WrAapEuBR69EMxZl+RoGRhrFGNYVK8mOPAW8VfbT/ZgrFbXlDNiiaxQnAtgVCZ6jv30EA==", - "requires": { - "@babel/helper-plugin-utils": "^7.8.0" - } - }, - "@babel/plugin-syntax-jsx": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.18.6.tgz", - "integrity": "sha512-6mmljtAedFGTWu2p/8WIORGwy+61PLgOMPOdazc7YoJ9ZCWUyFy3A6CpPkRKLKD1ToAesxX8KGEViAiLo9N+7Q==", - "requires": { - "@babel/helper-plugin-utils": "^7.18.6" - } - }, - "@babel/plugin-syntax-logical-assignment-operators": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-logical-assignment-operators/-/plugin-syntax-logical-assignment-operators-7.10.4.tgz", - "integrity": "sha512-d8waShlpFDinQ5MtvGU9xDAOzKH47+FFoney2baFIoMr952hKOLp1HR7VszoZvOsV/4+RRszNY7D17ba0te0ig==", - "requires": { - "@babel/helper-plugin-utils": "^7.10.4" - } - }, - "@babel/plugin-syntax-nullish-coalescing-operator": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-nullish-coalescing-operator/-/plugin-syntax-nullish-coalescing-operator-7.8.3.tgz", - "integrity": "sha512-aSff4zPII1u2QD7y+F8oDsz19ew4IGEJg9SVW+bqwpwtfFleiQDMdzA/R+UlWDzfnHFCxxleFT0PMIrR36XLNQ==", - "requires": { - "@babel/helper-plugin-utils": "^7.8.0" - } - }, - "@babel/plugin-syntax-numeric-separator": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-numeric-separator/-/plugin-syntax-numeric-separator-7.10.4.tgz", - "integrity": "sha512-9H6YdfkcK/uOnY/K7/aA2xpzaAgkQn37yzWUMRK7OaPOqOpGS1+n0H5hxT9AUw9EsSjPW8SVyMJwYRtWs3X3ug==", - "requires": { - "@babel/helper-plugin-utils": "^7.10.4" - } - }, - "@babel/plugin-syntax-object-rest-spread": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-object-rest-spread/-/plugin-syntax-object-rest-spread-7.8.3.tgz", - "integrity": "sha512-XoqMijGZb9y3y2XskN+P1wUGiVwWZ5JmoDRwx5+3GmEplNyVM2s2Dg8ILFQm8rWM48orGy5YpI5Bl8U1y7ydlA==", - "requires": { - "@babel/helper-plugin-utils": "^7.8.0" - } - }, - "@babel/plugin-syntax-optional-catch-binding": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-optional-catch-binding/-/plugin-syntax-optional-catch-binding-7.8.3.tgz", - "integrity": "sha512-6VPD0Pc1lpTqw0aKoeRTMiB+kWhAoT24PA+ksWSBrFtl5SIRVpZlwN3NNPQjehA2E/91FV3RjLWoVTglWcSV3Q==", - "requires": { - "@babel/helper-plugin-utils": "^7.8.0" - } - }, - "@babel/plugin-syntax-optional-chaining": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-optional-chaining/-/plugin-syntax-optional-chaining-7.8.3.tgz", - "integrity": "sha512-KoK9ErH1MBlCPxV0VANkXW2/dw4vlbGDrFgz8bmUsBGYkFRcbRwMh6cIJubdPrkxRwuGdtCk0v/wPTKbQgBjkg==", - "requires": { - "@babel/helper-plugin-utils": "^7.8.0" - } - }, - "@babel/plugin-syntax-private-property-in-object": { - "version": "7.14.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-private-property-in-object/-/plugin-syntax-private-property-in-object-7.14.5.tgz", - "integrity": "sha512-0wVnp9dxJ72ZUJDV27ZfbSj6iHLoytYZmh3rFcxNnvsJF3ktkzLDZPy/mA17HGsaQT3/DQsWYX1f1QGWkCoVUg==", - "requires": { - "@babel/helper-plugin-utils": "^7.14.5" - } - }, - "@babel/plugin-syntax-top-level-await": { - "version": "7.14.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-top-level-await/-/plugin-syntax-top-level-await-7.14.5.tgz", - "integrity": "sha512-hx++upLv5U1rgYfwe1xBQUhRmU41NEvpUvrp8jkrSCdvGSnM5/qdRMtylJ6PG5OFkBaHkbTAKTnd3/YyESRHFw==", - "requires": { - "@babel/helper-plugin-utils": "^7.14.5" - } - }, - "@babel/plugin-syntax-typescript": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-typescript/-/plugin-syntax-typescript-7.18.6.tgz", - "integrity": "sha512-mAWAuq4rvOepWCBid55JuRNvpTNf2UGVgoz4JV0fXEKolsVZDzsa4NqCef758WZJj/GDu0gVGItjKFiClTAmZA==", - "requires": { - "@babel/helper-plugin-utils": "^7.18.6" - } - }, - "@babel/plugin-transform-arrow-functions": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-arrow-functions/-/plugin-transform-arrow-functions-7.18.6.tgz", - "integrity": "sha512-9S9X9RUefzrsHZmKMbDXxweEH+YlE8JJEuat9FdvW9Qh1cw7W64jELCtWNkPBPX5En45uy28KGvA/AySqUh8CQ==", - "requires": { - "@babel/helper-plugin-utils": "^7.18.6" - } - }, - "@babel/plugin-transform-async-to-generator": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-async-to-generator/-/plugin-transform-async-to-generator-7.18.6.tgz", - "integrity": "sha512-ARE5wZLKnTgPW7/1ftQmSi1CmkqqHo2DNmtztFhvgtOWSDfq0Cq9/9L+KnZNYSNrydBekhW3rwShduf59RoXag==", - "requires": { - "@babel/helper-module-imports": "^7.18.6", - "@babel/helper-plugin-utils": "^7.18.6", - "@babel/helper-remap-async-to-generator": "^7.18.6" - } - }, - "@babel/plugin-transform-block-scoped-functions": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoped-functions/-/plugin-transform-block-scoped-functions-7.18.6.tgz", - "integrity": "sha512-ExUcOqpPWnliRcPqves5HJcJOvHvIIWfuS4sroBUenPuMdmW+SMHDakmtS7qOo13sVppmUijqeTv7qqGsvURpQ==", - "requires": { - "@babel/helper-plugin-utils": "^7.18.6" - } - }, - "@babel/plugin-transform-block-scoping": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.18.6.tgz", - "integrity": "sha512-pRqwb91C42vs1ahSAWJkxOxU1RHWDn16XAa6ggQ72wjLlWyYeAcLvTtE0aM8ph3KNydy9CQF2nLYcjq1WysgxQ==", - "requires": { - "@babel/helper-plugin-utils": "^7.18.6" - } - }, - "@babel/plugin-transform-classes": { - "version": "7.18.8", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-classes/-/plugin-transform-classes-7.18.8.tgz", - "integrity": "sha512-RySDoXdF6hgHSHuAW4aLGyVQdmvEX/iJtjVre52k0pxRq4hzqze+rAVP++NmNv596brBpYmaiKgTZby7ziBnVg==", - "requires": { - "@babel/helper-annotate-as-pure": "^7.18.6", - "@babel/helper-environment-visitor": "^7.18.6", - "@babel/helper-function-name": "^7.18.6", - "@babel/helper-optimise-call-expression": "^7.18.6", - "@babel/helper-plugin-utils": "^7.18.6", - "@babel/helper-replace-supers": "^7.18.6", - "@babel/helper-split-export-declaration": "^7.18.6", - "globals": "^11.1.0" - } - }, - "@babel/plugin-transform-computed-properties": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-computed-properties/-/plugin-transform-computed-properties-7.18.6.tgz", - "integrity": "sha512-9repI4BhNrR0KenoR9vm3/cIc1tSBIo+u1WVjKCAynahj25O8zfbiE6JtAtHPGQSs4yZ+bA8mRasRP+qc+2R5A==", - "requires": { - "@babel/helper-plugin-utils": "^7.18.6" - } - }, - "@babel/plugin-transform-destructuring": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.18.6.tgz", - "integrity": "sha512-tgy3u6lRp17ilY8r1kP4i2+HDUwxlVqq3RTc943eAWSzGgpU1qhiKpqZ5CMyHReIYPHdo3Kg8v8edKtDqSVEyQ==", - "requires": { - "@babel/helper-plugin-utils": "^7.18.6" - } - }, - "@babel/plugin-transform-dotall-regex": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-dotall-regex/-/plugin-transform-dotall-regex-7.18.6.tgz", - "integrity": "sha512-6S3jpun1eEbAxq7TdjLotAsl4WpQI9DxfkycRcKrjhQYzU87qpXdknpBg/e+TdcMehqGnLFi7tnFUBR02Vq6wg==", - "requires": { - "@babel/helper-create-regexp-features-plugin": "^7.18.6", - "@babel/helper-plugin-utils": "^7.18.6" - } - }, - "@babel/plugin-transform-duplicate-keys": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-duplicate-keys/-/plugin-transform-duplicate-keys-7.18.6.tgz", - "integrity": "sha512-NJU26U/208+sxYszf82nmGYqVF9QN8py2HFTblPT9hbawi8+1C5a9JubODLTGFuT0qlkqVinmkwOD13s0sZktg==", - "requires": { - "@babel/helper-plugin-utils": "^7.18.6" - } - }, - "@babel/plugin-transform-exponentiation-operator": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-exponentiation-operator/-/plugin-transform-exponentiation-operator-7.18.6.tgz", - "integrity": "sha512-wzEtc0+2c88FVR34aQmiz56dxEkxr2g8DQb/KfaFa1JYXOFVsbhvAonFN6PwVWj++fKmku8NP80plJ5Et4wqHw==", - "requires": { - "@babel/helper-builder-binary-assignment-operator-visitor": "^7.18.6", - "@babel/helper-plugin-utils": "^7.18.6" - } - }, - "@babel/plugin-transform-flow-strip-types": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-flow-strip-types/-/plugin-transform-flow-strip-types-7.18.6.tgz", - "integrity": "sha512-wE0xtA7csz+hw4fKPwxmu5jnzAsXPIO57XnRwzXP3T19jWh1BODnPGoG9xKYwvAwusP7iUktHayRFbMPGtODaQ==", - "requires": { - "@babel/helper-plugin-utils": "^7.18.6", - "@babel/plugin-syntax-flow": "^7.18.6" - } - }, - "@babel/plugin-transform-for-of": { - "version": "7.18.8", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-for-of/-/plugin-transform-for-of-7.18.8.tgz", - "integrity": "sha512-yEfTRnjuskWYo0k1mHUqrVWaZwrdq8AYbfrpqULOJOaucGSp4mNMVps+YtA8byoevxS/urwU75vyhQIxcCgiBQ==", - "requires": { - "@babel/helper-plugin-utils": "^7.18.6" - } - }, - "@babel/plugin-transform-function-name": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-function-name/-/plugin-transform-function-name-7.18.6.tgz", - "integrity": "sha512-kJha/Gbs5RjzIu0CxZwf5e3aTTSlhZnHMT8zPWnJMjNpLOUgqevg+PN5oMH68nMCXnfiMo4Bhgxqj59KHTlAnA==", - "requires": { - "@babel/helper-compilation-targets": "^7.18.6", - "@babel/helper-function-name": "^7.18.6", - "@babel/helper-plugin-utils": "^7.18.6" - } - }, - "@babel/plugin-transform-literals": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-literals/-/plugin-transform-literals-7.18.6.tgz", - "integrity": "sha512-x3HEw0cJZVDoENXOp20HlypIHfl0zMIhMVZEBVTfmqbObIpsMxMbmU5nOEO8R7LYT+z5RORKPlTI5Hj4OsO9/Q==", - "requires": { - "@babel/helper-plugin-utils": "^7.18.6" - } - }, - "@babel/plugin-transform-member-expression-literals": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-member-expression-literals/-/plugin-transform-member-expression-literals-7.18.6.tgz", - "integrity": "sha512-qSF1ihLGO3q+/g48k85tUjD033C29TNTVB2paCwZPVmOsjn9pClvYYrM2VeJpBY2bcNkuny0YUyTNRyRxJ54KA==", - "requires": { - "@babel/helper-plugin-utils": "^7.18.6" - } - }, - "@babel/plugin-transform-modules-amd": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-amd/-/plugin-transform-modules-amd-7.18.6.tgz", - "integrity": "sha512-Pra5aXsmTsOnjM3IajS8rTaLCy++nGM4v3YR4esk5PCsyg9z8NA5oQLwxzMUtDBd8F+UmVza3VxoAaWCbzH1rg==", - "requires": { - "@babel/helper-module-transforms": "^7.18.6", - "@babel/helper-plugin-utils": "^7.18.6", - "babel-plugin-dynamic-import-node": "^2.3.3" - } - }, - "@babel/plugin-transform-modules-commonjs": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.18.6.tgz", - "integrity": "sha512-Qfv2ZOWikpvmedXQJDSbxNqy7Xr/j2Y8/KfijM0iJyKkBTmWuvCA1yeH1yDM7NJhBW/2aXxeucLj6i80/LAJ/Q==", - "requires": { - "@babel/helper-module-transforms": "^7.18.6", - "@babel/helper-plugin-utils": "^7.18.6", - "@babel/helper-simple-access": "^7.18.6", - "babel-plugin-dynamic-import-node": "^2.3.3" - } - }, - "@babel/plugin-transform-modules-systemjs": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.18.6.tgz", - "integrity": "sha512-UbPYpXxLjTw6w6yXX2BYNxF3p6QY225wcTkfQCy3OMnSlS/C3xGtwUjEzGkldb/sy6PWLiCQ3NbYfjWUTI3t4g==", - "requires": { - "@babel/helper-hoist-variables": "^7.18.6", - "@babel/helper-module-transforms": "^7.18.6", - "@babel/helper-plugin-utils": "^7.18.6", - "@babel/helper-validator-identifier": "^7.18.6", - "babel-plugin-dynamic-import-node": "^2.3.3" - } - }, - "@babel/plugin-transform-modules-umd": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-umd/-/plugin-transform-modules-umd-7.18.6.tgz", - "integrity": "sha512-dcegErExVeXcRqNtkRU/z8WlBLnvD4MRnHgNs3MytRO1Mn1sHRyhbcpYbVMGclAqOjdW+9cfkdZno9dFdfKLfQ==", - "requires": { - "@babel/helper-module-transforms": "^7.18.6", - "@babel/helper-plugin-utils": "^7.18.6" - } - }, - "@babel/plugin-transform-named-capturing-groups-regex": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-named-capturing-groups-regex/-/plugin-transform-named-capturing-groups-regex-7.18.6.tgz", - "integrity": "sha512-UmEOGF8XgaIqD74bC8g7iV3RYj8lMf0Bw7NJzvnS9qQhM4mg+1WHKotUIdjxgD2RGrgFLZZPCFPFj3P/kVDYhg==", - "requires": { - "@babel/helper-create-regexp-features-plugin": "^7.18.6", - "@babel/helper-plugin-utils": "^7.18.6" - } - }, - "@babel/plugin-transform-new-target": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-new-target/-/plugin-transform-new-target-7.18.6.tgz", - "integrity": "sha512-DjwFA/9Iu3Z+vrAn+8pBUGcjhxKguSMlsFqeCKbhb9BAV756v0krzVK04CRDi/4aqmk8BsHb4a/gFcaA5joXRw==", - "requires": { - "@babel/helper-plugin-utils": "^7.18.6" - } - }, - "@babel/plugin-transform-object-super": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-object-super/-/plugin-transform-object-super-7.18.6.tgz", - "integrity": "sha512-uvGz6zk+pZoS1aTZrOvrbj6Pp/kK2mp45t2B+bTDre2UgsZZ8EZLSJtUg7m/no0zOJUWgFONpB7Zv9W2tSaFlA==", - "requires": { - "@babel/helper-plugin-utils": "^7.18.6", - "@babel/helper-replace-supers": "^7.18.6" - } - }, - "@babel/plugin-transform-parameters": { - "version": "7.18.8", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.18.8.tgz", - "integrity": "sha512-ivfbE3X2Ss+Fj8nnXvKJS6sjRG4gzwPMsP+taZC+ZzEGjAYlvENixmt1sZ5Ca6tWls+BlKSGKPJ6OOXvXCbkFg==", - "requires": { - "@babel/helper-plugin-utils": "^7.18.6" - } - }, - "@babel/plugin-transform-property-literals": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-property-literals/-/plugin-transform-property-literals-7.18.6.tgz", - "integrity": "sha512-cYcs6qlgafTud3PAzrrRNbQtfpQ8+y/+M5tKmksS9+M1ckbH6kzY8MrexEM9mcA6JDsukE19iIRvAyYl463sMg==", - "requires": { - "@babel/helper-plugin-utils": "^7.18.6" - } - }, - "@babel/plugin-transform-react-constant-elements": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-constant-elements/-/plugin-transform-react-constant-elements-7.18.6.tgz", - "integrity": "sha512-4g5H1bonF1dqgMe+wQ2fvDlRZ/mN/KwArk13teDv+xxn+pUDEiiDluQd6D2B30MJcL1u3qr0WZpfq0mw9/zSqA==", - "requires": { - "@babel/helper-plugin-utils": "^7.18.6" - } - }, - "@babel/plugin-transform-react-display-name": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-display-name/-/plugin-transform-react-display-name-7.18.6.tgz", - "integrity": "sha512-TV4sQ+T013n61uMoygyMRm+xf04Bd5oqFpv2jAEQwSZ8NwQA7zeRPg1LMVg2PWi3zWBz+CLKD+v5bcpZ/BS0aA==", - "requires": { - "@babel/helper-plugin-utils": "^7.18.6" - } - }, - "@babel/plugin-transform-react-jsx": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx/-/plugin-transform-react-jsx-7.18.6.tgz", - "integrity": "sha512-Mz7xMPxoy9kPS/JScj6fJs03TZ/fZ1dJPlMjRAgTaxaS0fUBk8FV/A2rRgfPsVCZqALNwMexD+0Uaf5zlcKPpw==", - "requires": { - "@babel/helper-annotate-as-pure": "^7.18.6", - "@babel/helper-module-imports": "^7.18.6", - "@babel/helper-plugin-utils": "^7.18.6", - "@babel/plugin-syntax-jsx": "^7.18.6", - "@babel/types": "^7.18.6" - } - }, - "@babel/plugin-transform-react-jsx-development": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx-development/-/plugin-transform-react-jsx-development-7.18.6.tgz", - "integrity": "sha512-SA6HEjwYFKF7WDjWcMcMGUimmw/nhNRDWxr+KaLSCrkD/LMDBvWRmHAYgE1HDeF8KUuI8OAu+RT6EOtKxSW2qA==", - "requires": { - "@babel/plugin-transform-react-jsx": "^7.18.6" - } - }, - "@babel/plugin-transform-react-pure-annotations": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-pure-annotations/-/plugin-transform-react-pure-annotations-7.18.6.tgz", - "integrity": "sha512-I8VfEPg9r2TRDdvnHgPepTKvuRomzA8+u+nhY7qSI1fR2hRNebasZEETLyM5mAUr0Ku56OkXJ0I7NHJnO6cJiQ==", - "requires": { - "@babel/helper-annotate-as-pure": "^7.18.6", - "@babel/helper-plugin-utils": "^7.18.6" - } - }, - "@babel/plugin-transform-regenerator": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-regenerator/-/plugin-transform-regenerator-7.18.6.tgz", - "integrity": "sha512-poqRI2+qiSdeldcz4wTSTXBRryoq3Gc70ye7m7UD5Ww0nE29IXqMl6r7Nd15WBgRd74vloEMlShtH6CKxVzfmQ==", - "requires": { - "@babel/helper-plugin-utils": "^7.18.6", - "regenerator-transform": "^0.15.0" - } - }, - "@babel/plugin-transform-reserved-words": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-reserved-words/-/plugin-transform-reserved-words-7.18.6.tgz", - "integrity": "sha512-oX/4MyMoypzHjFrT1CdivfKZ+XvIPMFXwwxHp/r0Ddy2Vuomt4HDFGmft1TAY2yiTKiNSsh3kjBAzcM8kSdsjA==", - "requires": { - "@babel/helper-plugin-utils": "^7.18.6" - } - }, - "@babel/plugin-transform-runtime": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-runtime/-/plugin-transform-runtime-7.18.6.tgz", - "integrity": "sha512-8uRHk9ZmRSnWqUgyae249EJZ94b0yAGLBIqzZzl+0iEdbno55Pmlt/32JZsHwXD9k/uZj18Aqqk35wBX4CBTXA==", - "requires": { - "@babel/helper-module-imports": "^7.18.6", - "@babel/helper-plugin-utils": "^7.18.6", - "babel-plugin-polyfill-corejs2": "^0.3.1", - "babel-plugin-polyfill-corejs3": "^0.5.2", - "babel-plugin-polyfill-regenerator": "^0.3.1", - "semver": "^6.3.0" - }, - "dependencies": { - "semver": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", - "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==" - } - } - }, - "@babel/plugin-transform-shorthand-properties": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-shorthand-properties/-/plugin-transform-shorthand-properties-7.18.6.tgz", - "integrity": "sha512-eCLXXJqv8okzg86ywZJbRn19YJHU4XUa55oz2wbHhaQVn/MM+XhukiT7SYqp/7o00dg52Rj51Ny+Ecw4oyoygw==", - "requires": { - "@babel/helper-plugin-utils": "^7.18.6" - } - }, - "@babel/plugin-transform-spread": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-spread/-/plugin-transform-spread-7.18.6.tgz", - "integrity": "sha512-ayT53rT/ENF8WWexIRg9AiV9h0aIteyWn5ptfZTZQrjk/+f3WdrJGCY4c9wcgl2+MKkKPhzbYp97FTsquZpDCw==", - "requires": { - "@babel/helper-plugin-utils": "^7.18.6", - "@babel/helper-skip-transparent-expression-wrappers": "^7.18.6" - } - }, - "@babel/plugin-transform-sticky-regex": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-sticky-regex/-/plugin-transform-sticky-regex-7.18.6.tgz", - "integrity": "sha512-kfiDrDQ+PBsQDO85yj1icueWMfGfJFKN1KCkndygtu/C9+XUfydLC8Iv5UYJqRwy4zk8EcplRxEOeLyjq1gm6Q==", - "requires": { - "@babel/helper-plugin-utils": "^7.18.6" - } - }, - "@babel/plugin-transform-template-literals": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-template-literals/-/plugin-transform-template-literals-7.18.6.tgz", - "integrity": "sha512-UuqlRrQmT2SWRvahW46cGSany0uTlcj8NYOS5sRGYi8FxPYPoLd5DDmMd32ZXEj2Jq+06uGVQKHxa/hJx2EzKw==", - "requires": { - "@babel/helper-plugin-utils": "^7.18.6" - } - }, - "@babel/plugin-transform-typeof-symbol": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-typeof-symbol/-/plugin-transform-typeof-symbol-7.18.6.tgz", - "integrity": "sha512-7m71iS/QhsPk85xSjFPovHPcH3H9qeyzsujhTc+vcdnsXavoWYJ74zx0lP5RhpC5+iDnVLO+PPMHzC11qels1g==", - "requires": { - "@babel/helper-plugin-utils": "^7.18.6" - } - }, - "@babel/plugin-transform-typescript": { - "version": "7.18.8", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-typescript/-/plugin-transform-typescript-7.18.8.tgz", - "integrity": "sha512-p2xM8HI83UObjsZGofMV/EdYjamsDm6MoN3hXPYIT0+gxIoopE+B7rPYKAxfrz9K9PK7JafTTjqYC6qipLExYA==", - "requires": { - "@babel/helper-create-class-features-plugin": "^7.18.6", - "@babel/helper-plugin-utils": "^7.18.6", - "@babel/plugin-syntax-typescript": "^7.18.6" - } - }, - "@babel/plugin-transform-unicode-escapes": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-escapes/-/plugin-transform-unicode-escapes-7.18.6.tgz", - "integrity": "sha512-XNRwQUXYMP7VLuy54cr/KS/WeL3AZeORhrmeZ7iewgu+X2eBqmpaLI/hzqr9ZxCeUoq0ASK4GUzSM0BDhZkLFw==", - "requires": { - "@babel/helper-plugin-utils": "^7.18.6" - } - }, - "@babel/plugin-transform-unicode-regex": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-regex/-/plugin-transform-unicode-regex-7.18.6.tgz", - "integrity": "sha512-gE7A6Lt7YLnNOL3Pb9BNeZvi+d8l7tcRrG4+pwJjK9hD2xX4mEvjlQW60G9EEmfXVYRPv9VRQcyegIVHCql/AA==", - "requires": { - "@babel/helper-create-regexp-features-plugin": "^7.18.6", - "@babel/helper-plugin-utils": "^7.18.6" - } - }, - "@babel/preset-env": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/preset-env/-/preset-env-7.18.6.tgz", - "integrity": "sha512-WrthhuIIYKrEFAwttYzgRNQ5hULGmwTj+D6l7Zdfsv5M7IWV/OZbUfbeL++Qrzx1nVJwWROIFhCHRYQV4xbPNw==", - "requires": { - "@babel/compat-data": "^7.18.6", - "@babel/helper-compilation-targets": "^7.18.6", - "@babel/helper-plugin-utils": "^7.18.6", - "@babel/helper-validator-option": "^7.18.6", - "@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression": "^7.18.6", - "@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining": "^7.18.6", - "@babel/plugin-proposal-async-generator-functions": "^7.18.6", - "@babel/plugin-proposal-class-properties": "^7.18.6", - "@babel/plugin-proposal-class-static-block": "^7.18.6", - "@babel/plugin-proposal-dynamic-import": "^7.18.6", - "@babel/plugin-proposal-export-namespace-from": "^7.18.6", - "@babel/plugin-proposal-json-strings": "^7.18.6", - "@babel/plugin-proposal-logical-assignment-operators": "^7.18.6", - "@babel/plugin-proposal-nullish-coalescing-operator": "^7.18.6", - "@babel/plugin-proposal-numeric-separator": "^7.18.6", - "@babel/plugin-proposal-object-rest-spread": "^7.18.6", - "@babel/plugin-proposal-optional-catch-binding": "^7.18.6", - "@babel/plugin-proposal-optional-chaining": "^7.18.6", - "@babel/plugin-proposal-private-methods": "^7.18.6", - "@babel/plugin-proposal-private-property-in-object": "^7.18.6", - "@babel/plugin-proposal-unicode-property-regex": "^7.18.6", - "@babel/plugin-syntax-async-generators": "^7.8.4", - "@babel/plugin-syntax-class-properties": "^7.12.13", - "@babel/plugin-syntax-class-static-block": "^7.14.5", - "@babel/plugin-syntax-dynamic-import": "^7.8.3", - "@babel/plugin-syntax-export-namespace-from": "^7.8.3", - "@babel/plugin-syntax-import-assertions": "^7.18.6", - "@babel/plugin-syntax-json-strings": "^7.8.3", - "@babel/plugin-syntax-logical-assignment-operators": "^7.10.4", - "@babel/plugin-syntax-nullish-coalescing-operator": "^7.8.3", - "@babel/plugin-syntax-numeric-separator": "^7.10.4", - "@babel/plugin-syntax-object-rest-spread": "^7.8.3", - "@babel/plugin-syntax-optional-catch-binding": "^7.8.3", - "@babel/plugin-syntax-optional-chaining": "^7.8.3", - "@babel/plugin-syntax-private-property-in-object": "^7.14.5", - "@babel/plugin-syntax-top-level-await": "^7.14.5", - "@babel/plugin-transform-arrow-functions": "^7.18.6", - "@babel/plugin-transform-async-to-generator": "^7.18.6", - "@babel/plugin-transform-block-scoped-functions": "^7.18.6", - "@babel/plugin-transform-block-scoping": "^7.18.6", - "@babel/plugin-transform-classes": "^7.18.6", - "@babel/plugin-transform-computed-properties": "^7.18.6", - "@babel/plugin-transform-destructuring": "^7.18.6", - "@babel/plugin-transform-dotall-regex": "^7.18.6", - "@babel/plugin-transform-duplicate-keys": "^7.18.6", - "@babel/plugin-transform-exponentiation-operator": "^7.18.6", - "@babel/plugin-transform-for-of": "^7.18.6", - "@babel/plugin-transform-function-name": "^7.18.6", - "@babel/plugin-transform-literals": "^7.18.6", - "@babel/plugin-transform-member-expression-literals": "^7.18.6", - "@babel/plugin-transform-modules-amd": "^7.18.6", - "@babel/plugin-transform-modules-commonjs": "^7.18.6", - "@babel/plugin-transform-modules-systemjs": "^7.18.6", - "@babel/plugin-transform-modules-umd": "^7.18.6", - "@babel/plugin-transform-named-capturing-groups-regex": "^7.18.6", - "@babel/plugin-transform-new-target": "^7.18.6", - "@babel/plugin-transform-object-super": "^7.18.6", - "@babel/plugin-transform-parameters": "^7.18.6", - "@babel/plugin-transform-property-literals": "^7.18.6", - "@babel/plugin-transform-regenerator": "^7.18.6", - "@babel/plugin-transform-reserved-words": "^7.18.6", - "@babel/plugin-transform-shorthand-properties": "^7.18.6", - "@babel/plugin-transform-spread": "^7.18.6", - "@babel/plugin-transform-sticky-regex": "^7.18.6", - "@babel/plugin-transform-template-literals": "^7.18.6", - "@babel/plugin-transform-typeof-symbol": "^7.18.6", - "@babel/plugin-transform-unicode-escapes": "^7.18.6", - "@babel/plugin-transform-unicode-regex": "^7.18.6", - "@babel/preset-modules": "^0.1.5", - "@babel/types": "^7.18.6", - "babel-plugin-polyfill-corejs2": "^0.3.1", - "babel-plugin-polyfill-corejs3": "^0.5.2", - "babel-plugin-polyfill-regenerator": "^0.3.1", - "core-js-compat": "^3.22.1", - "semver": "^6.3.0" - }, - "dependencies": { - "semver": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", - "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==" - } - } - }, - "@babel/preset-modules": { - "version": "0.1.5", - "resolved": "https://registry.npmjs.org/@babel/preset-modules/-/preset-modules-0.1.5.tgz", - "integrity": "sha512-A57th6YRG7oR3cq/yt/Y84MvGgE0eJG2F1JLhKuyG+jFxEgrd/HAMJatiFtmOiZurz+0DkrvbheCLaV5f2JfjA==", - "requires": { - "@babel/helper-plugin-utils": "^7.0.0", - "@babel/plugin-proposal-unicode-property-regex": "^7.4.4", - "@babel/plugin-transform-dotall-regex": "^7.4.4", - "@babel/types": "^7.4.4", - "esutils": "^2.0.2" - } - }, - "@babel/preset-react": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/preset-react/-/preset-react-7.18.6.tgz", - "integrity": "sha512-zXr6atUmyYdiWRVLOZahakYmOBHtWc2WGCkP8PYTgZi0iJXDY2CN180TdrIW4OGOAdLc7TifzDIvtx6izaRIzg==", - "requires": { - "@babel/helper-plugin-utils": "^7.18.6", - "@babel/helper-validator-option": "^7.18.6", - "@babel/plugin-transform-react-display-name": "^7.18.6", - "@babel/plugin-transform-react-jsx": "^7.18.6", - "@babel/plugin-transform-react-jsx-development": "^7.18.6", - "@babel/plugin-transform-react-pure-annotations": "^7.18.6" - } - }, - "@babel/preset-typescript": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/preset-typescript/-/preset-typescript-7.18.6.tgz", - "integrity": "sha512-s9ik86kXBAnD760aybBucdpnLsAt0jK1xqJn2juOn9lkOvSHV60os5hxoVJsPzMQxvnUJFAlkont2DvvaYEBtQ==", - "requires": { - "@babel/helper-plugin-utils": "^7.18.6", - "@babel/helper-validator-option": "^7.18.6", - "@babel/plugin-transform-typescript": "^7.18.6" - } - }, - "@babel/runtime": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.18.6.tgz", - "integrity": "sha512-t9wi7/AW6XtKahAe20Yw0/mMljKq0B1r2fPdvaAdV/KPDZewFXdaaa6K7lxmZBZ8FBNpCiAT6iHPmd6QO9bKfQ==", - "requires": { - "regenerator-runtime": "^0.13.4" - } - }, - "@babel/runtime-corejs3": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/runtime-corejs3/-/runtime-corejs3-7.18.6.tgz", - "integrity": "sha512-cOu5wH2JFBgMjje+a+fz2JNIWU4GzYpl05oSob3UDvBEh6EuIn+TXFHMmBbhSb+k/4HMzgKCQfEEDArAWNF9Cw==", - "requires": { - "core-js-pure": "^3.20.2", - "regenerator-runtime": "^0.13.4" - } - }, - "@babel/template": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.18.6.tgz", - "integrity": "sha512-JoDWzPe+wgBsTTgdnIma3iHNFC7YVJoPssVBDjiHfNlyt4YcunDtcDOUmfVDfCK5MfdsaIoX9PkijPhjH3nYUw==", - "requires": { - "@babel/code-frame": "^7.18.6", - "@babel/parser": "^7.18.6", - "@babel/types": "^7.18.6" - } - }, - "@babel/traverse": { - "version": "7.18.8", - "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.18.8.tgz", - "integrity": "sha512-UNg/AcSySJYR/+mIcJQDCv00T+AqRO7j/ZEJLzpaYtgM48rMg5MnkJgyNqkzo88+p4tfRvZJCEiwwfG6h4jkRg==", - "requires": { - "@babel/code-frame": "^7.18.6", - "@babel/generator": "^7.18.7", - "@babel/helper-environment-visitor": "^7.18.6", - "@babel/helper-function-name": "^7.18.6", - "@babel/helper-hoist-variables": "^7.18.6", - "@babel/helper-split-export-declaration": "^7.18.6", - "@babel/parser": "^7.18.8", - "@babel/types": "^7.18.8", - "debug": "^4.1.0", - "globals": "^11.1.0" - } - }, - "@babel/types": { - "version": "7.18.8", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.18.8.tgz", - "integrity": "sha512-qwpdsmraq0aJ3osLJRApsc2ouSJCdnMeZwB0DhbtHAtRpZNZCdlbRnHIgcRKzdE1g0iOGg644fzjOBcdOz9cPw==", - "requires": { - "@babel/helper-validator-identifier": "^7.18.6", - "to-fast-properties": "^2.0.0" - } - }, - "@bcoe/v8-coverage": { - "version": "0.2.3", - "resolved": "https://registry.npmjs.org/@bcoe/v8-coverage/-/v8-coverage-0.2.3.tgz", - "integrity": "sha512-0hYQ8SB4Db5zvZB4axdMHGwEaQjkZzFjQiN9LVYvIFB2nSUHW9tYpxWriPrWDASIxiaXax83REcLxuSdnGPZtw==" - }, - "@csstools/normalize.css": { - "version": "12.0.0", - "resolved": "https://registry.npmjs.org/@csstools/normalize.css/-/normalize.css-12.0.0.tgz", - "integrity": "sha512-M0qqxAcwCsIVfpFQSlGN5XjXWu8l5JDZN+fPt1LeW5SZexQTgnaEvgXAY+CeygRw0EeppWHi12JxESWiWrB0Sg==" - }, - "@csstools/postcss-cascade-layers": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/@csstools/postcss-cascade-layers/-/postcss-cascade-layers-1.0.5.tgz", - "integrity": "sha512-Id/9wBT7FkgFzdEpiEWrsVd4ltDxN0rI0QS0SChbeQiSuux3z21SJCRLu6h2cvCEUmaRi+VD0mHFj+GJD4GFnw==", - "requires": { - "@csstools/selector-specificity": "^2.0.2", - "postcss-selector-parser": "^6.0.10" - } - }, - "@csstools/postcss-color-function": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/@csstools/postcss-color-function/-/postcss-color-function-1.1.1.tgz", - "integrity": "sha512-Bc0f62WmHdtRDjf5f3e2STwRAl89N2CLb+9iAwzrv4L2hncrbDwnQD9PCq0gtAt7pOI2leIV08HIBUd4jxD8cw==", - "requires": { - "@csstools/postcss-progressive-custom-properties": "^1.1.0", - "postcss-value-parser": "^4.2.0" - } - }, - "@csstools/postcss-font-format-keywords": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/@csstools/postcss-font-format-keywords/-/postcss-font-format-keywords-1.0.1.tgz", - "integrity": "sha512-ZgrlzuUAjXIOc2JueK0X5sZDjCtgimVp/O5CEqTcs5ShWBa6smhWYbS0x5cVc/+rycTDbjjzoP0KTDnUneZGOg==", - "requires": { - "postcss-value-parser": "^4.2.0" - } - }, - "@csstools/postcss-hwb-function": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/@csstools/postcss-hwb-function/-/postcss-hwb-function-1.0.2.tgz", - "integrity": "sha512-YHdEru4o3Rsbjmu6vHy4UKOXZD+Rn2zmkAmLRfPet6+Jz4Ojw8cbWxe1n42VaXQhD3CQUXXTooIy8OkVbUcL+w==", - "requires": { - "postcss-value-parser": "^4.2.0" - } - }, - "@csstools/postcss-ic-unit": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/@csstools/postcss-ic-unit/-/postcss-ic-unit-1.0.1.tgz", - "integrity": "sha512-Ot1rcwRAaRHNKC9tAqoqNZhjdYBzKk1POgWfhN4uCOE47ebGcLRqXjKkApVDpjifL6u2/55ekkpnFcp+s/OZUw==", - "requires": { - "@csstools/postcss-progressive-custom-properties": "^1.1.0", - "postcss-value-parser": "^4.2.0" - } - }, - "@csstools/postcss-is-pseudo-class": { - "version": "2.0.7", - "resolved": "https://registry.npmjs.org/@csstools/postcss-is-pseudo-class/-/postcss-is-pseudo-class-2.0.7.tgz", - "integrity": "sha512-7JPeVVZHd+jxYdULl87lvjgvWldYu+Bc62s9vD/ED6/QTGjy0jy0US/f6BG53sVMTBJ1lzKZFpYmofBN9eaRiA==", - "requires": { - "@csstools/selector-specificity": "^2.0.0", - "postcss-selector-parser": "^6.0.10" - } - }, - "@csstools/postcss-normalize-display-values": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/@csstools/postcss-normalize-display-values/-/postcss-normalize-display-values-1.0.1.tgz", - "integrity": "sha512-jcOanIbv55OFKQ3sYeFD/T0Ti7AMXc9nM1hZWu8m/2722gOTxFg7xYu4RDLJLeZmPUVQlGzo4jhzvTUq3x4ZUw==", - "requires": { - "postcss-value-parser": "^4.2.0" - } - }, - "@csstools/postcss-oklab-function": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/@csstools/postcss-oklab-function/-/postcss-oklab-function-1.1.1.tgz", - "integrity": "sha512-nJpJgsdA3dA9y5pgyb/UfEzE7W5Ka7u0CX0/HIMVBNWzWemdcTH3XwANECU6anWv/ao4vVNLTMxhiPNZsTK6iA==", - "requires": { - "@csstools/postcss-progressive-custom-properties": "^1.1.0", - "postcss-value-parser": "^4.2.0" - } - }, - "@csstools/postcss-progressive-custom-properties": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/@csstools/postcss-progressive-custom-properties/-/postcss-progressive-custom-properties-1.3.0.tgz", - "integrity": "sha512-ASA9W1aIy5ygskZYuWams4BzafD12ULvSypmaLJT2jvQ8G0M3I8PRQhC0h7mG0Z3LI05+agZjqSR9+K9yaQQjA==", - "requires": { - "postcss-value-parser": "^4.2.0" - } - }, - "@csstools/postcss-stepped-value-functions": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/@csstools/postcss-stepped-value-functions/-/postcss-stepped-value-functions-1.0.1.tgz", - "integrity": "sha512-dz0LNoo3ijpTOQqEJLY8nyaapl6umbmDcgj4AD0lgVQ572b2eqA1iGZYTTWhrcrHztWDDRAX2DGYyw2VBjvCvQ==", - "requires": { - "postcss-value-parser": "^4.2.0" - } - }, - "@csstools/postcss-trigonometric-functions": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/@csstools/postcss-trigonometric-functions/-/postcss-trigonometric-functions-1.0.2.tgz", - "integrity": "sha512-woKaLO///4bb+zZC2s80l+7cm07M7268MsyG3M0ActXXEFi6SuhvriQYcb58iiKGbjwwIU7n45iRLEHypB47Og==", - "requires": { - "postcss-value-parser": "^4.2.0" - } - }, - "@csstools/postcss-unset-value": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/@csstools/postcss-unset-value/-/postcss-unset-value-1.0.2.tgz", - "integrity": "sha512-c8J4roPBILnelAsdLr4XOAR/GsTm0GJi4XpcfvoWk3U6KiTCqiFYc63KhRMQQX35jYMp4Ao8Ij9+IZRgMfJp1g==", - "requires": {} - }, - "@csstools/selector-specificity": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/@csstools/selector-specificity/-/selector-specificity-2.0.2.tgz", - "integrity": "sha512-IkpVW/ehM1hWKln4fCA3NzJU8KwD+kIOvPZA4cqxoJHtE21CCzjyp+Kxbu0i5I4tBNOlXPL9mjwnWlL0VEG4Fg==", - "requires": {} - }, - "@eslint/eslintrc": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-1.3.0.tgz", - "integrity": "sha512-UWW0TMTmk2d7hLcWD1/e2g5HDM/HQ3csaLSqXCfqwh4uNDuNqlaKWXmEsL4Cs41Z0KnILNvwbHAah3C2yt06kw==", - "requires": { - "ajv": "^6.12.4", - "debug": "^4.3.2", - "espree": "^9.3.2", - "globals": "^13.15.0", - "ignore": "^5.2.0", - "import-fresh": "^3.2.1", - "js-yaml": "^4.1.0", - "minimatch": "^3.1.2", - "strip-json-comments": "^3.1.1" - }, - "dependencies": { - "argparse": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", - "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==" - }, - "globals": { - "version": "13.16.0", - "resolved": "https://registry.npmjs.org/globals/-/globals-13.16.0.tgz", - "integrity": "sha512-A1lrQfpNF+McdPOnnFqY3kSN0AFTy485bTi1bkLk4mVPODIUEcSfhHgRqA+QdXPksrSTTztYXx37NFV+GpGk3Q==", - "requires": { - "type-fest": "^0.20.2" - } - }, - "js-yaml": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz", - "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==", - "requires": { - "argparse": "^2.0.1" - } - }, - "type-fest": { - "version": "0.20.2", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.20.2.tgz", - "integrity": "sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==" - } - } - }, - "@humanwhocodes/config-array": { - "version": "0.9.5", - "resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.9.5.tgz", - "integrity": "sha512-ObyMyWxZiCu/yTisA7uzx81s40xR2fD5Cg/2Kq7G02ajkNubJf6BopgDTmDyc3U7sXpNKM8cYOw7s7Tyr+DnCw==", - "requires": { - "@humanwhocodes/object-schema": "^1.2.1", - "debug": "^4.1.1", - "minimatch": "^3.0.4" - } - }, - "@humanwhocodes/object-schema": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/@humanwhocodes/object-schema/-/object-schema-1.2.1.tgz", - "integrity": "sha512-ZnQMnLV4e7hDlUvw8H+U8ASL02SS2Gn6+9Ac3wGGLIe7+je2AeAOxPY+izIPJDfFDb7eDjev0Us8MO1iFRN8hA==" - }, - "@istanbuljs/load-nyc-config": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/@istanbuljs/load-nyc-config/-/load-nyc-config-1.1.0.tgz", - "integrity": "sha512-VjeHSlIzpv/NyD3N0YuHfXOPDIixcA1q2ZV98wsMqcYlPmv2n3Yb2lYP9XMElnaFVXg5A7YLTeLu6V84uQDjmQ==", - "requires": { - "camelcase": "^5.3.1", - "find-up": "^4.1.0", - "get-package-type": "^0.1.0", - "js-yaml": "^3.13.1", - "resolve-from": "^5.0.0" - }, - "dependencies": { - "camelcase": { - "version": "5.3.1", - "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz", - "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==" - }, - "find-up": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", - "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", - "requires": { - "locate-path": "^5.0.0", - "path-exists": "^4.0.0" - } - }, - "locate-path": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", - "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", - "requires": { - "p-locate": "^4.1.0" - } - }, - "p-limit": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", - "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", - "requires": { - "p-try": "^2.0.0" - } - }, - "p-locate": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", - "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", - "requires": { - "p-limit": "^2.2.0" - } - } - } - }, - "@istanbuljs/schema": { - "version": "0.1.3", - "resolved": "https://registry.npmjs.org/@istanbuljs/schema/-/schema-0.1.3.tgz", - "integrity": "sha512-ZXRY4jNvVgSVQ8DL3LTcakaAtXwTVUxE81hslsyD2AtoXW/wVob10HkOJ1X/pAlcI7D+2YoZKg5do8G/w6RYgA==" - }, - "@jest/console": { - "version": "27.5.1", - "resolved": "https://registry.npmjs.org/@jest/console/-/console-27.5.1.tgz", - "integrity": "sha512-kZ/tNpS3NXn0mlXXXPNuDZnb4c0oZ20r4K5eemM2k30ZC3G0T02nXUvyhf5YdbXWHPEJLc9qGLxEZ216MdL+Zg==", - "requires": { - "@jest/types": "^27.5.1", - "@types/node": "*", - "chalk": "^4.0.0", - "jest-message-util": "^27.5.1", - "jest-util": "^27.5.1", - "slash": "^3.0.0" - }, - "dependencies": { - "ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "requires": { - "color-convert": "^2.0.1" - } - }, - "chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", - "requires": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - } - }, - "color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "requires": { - "color-name": "~1.1.4" - } - }, - "color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" - }, - "has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==" - }, - "supports-color": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", - "requires": { - "has-flag": "^4.0.0" - } - } - } - }, - "@jest/core": { - "version": "27.5.1", - "resolved": "https://registry.npmjs.org/@jest/core/-/core-27.5.1.tgz", - "integrity": "sha512-AK6/UTrvQD0Cd24NSqmIA6rKsu0tKIxfiCducZvqxYdmMisOYAsdItspT+fQDQYARPf8XgjAFZi0ogW2agH5nQ==", - "requires": { - "@jest/console": "^27.5.1", - "@jest/reporters": "^27.5.1", - "@jest/test-result": "^27.5.1", - "@jest/transform": "^27.5.1", - "@jest/types": "^27.5.1", - "@types/node": "*", - "ansi-escapes": "^4.2.1", - "chalk": "^4.0.0", - "emittery": "^0.8.1", - "exit": "^0.1.2", - "graceful-fs": "^4.2.9", - "jest-changed-files": "^27.5.1", - "jest-config": "^27.5.1", - "jest-haste-map": "^27.5.1", - "jest-message-util": "^27.5.1", - "jest-regex-util": "^27.5.1", - "jest-resolve": "^27.5.1", - "jest-resolve-dependencies": "^27.5.1", - "jest-runner": "^27.5.1", - "jest-runtime": "^27.5.1", - "jest-snapshot": "^27.5.1", - "jest-util": "^27.5.1", - "jest-validate": "^27.5.1", - "jest-watcher": "^27.5.1", - "micromatch": "^4.0.4", - "rimraf": "^3.0.0", - "slash": "^3.0.0", - "strip-ansi": "^6.0.0" - }, - "dependencies": { - "ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "requires": { - "color-convert": "^2.0.1" - } - }, - "chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", - "requires": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - } - }, - "color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "requires": { - "color-name": "~1.1.4" - } - }, - "color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" - }, - "has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==" - }, - "supports-color": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", - "requires": { - "has-flag": "^4.0.0" - } - } - } - }, - "@jest/environment": { - "version": "27.5.1", - "resolved": "https://registry.npmjs.org/@jest/environment/-/environment-27.5.1.tgz", - "integrity": "sha512-/WQjhPJe3/ghaol/4Bq480JKXV/Rfw8nQdN7f41fM8VDHLcxKXou6QyXAh3EFr9/bVG3x74z1NWDkP87EiY8gA==", - "requires": { - "@jest/fake-timers": "^27.5.1", - "@jest/types": "^27.5.1", - "@types/node": "*", - "jest-mock": "^27.5.1" - } - }, - "@jest/fake-timers": { - "version": "27.5.1", - "resolved": "https://registry.npmjs.org/@jest/fake-timers/-/fake-timers-27.5.1.tgz", - "integrity": "sha512-/aPowoolwa07k7/oM3aASneNeBGCmGQsc3ugN4u6s4C/+s5M64MFo/+djTdiwcbQlRfFElGuDXWzaWj6QgKObQ==", - "requires": { - "@jest/types": "^27.5.1", - "@sinonjs/fake-timers": "^8.0.1", - "@types/node": "*", - "jest-message-util": "^27.5.1", - "jest-mock": "^27.5.1", - "jest-util": "^27.5.1" - } - }, - "@jest/globals": { - "version": "27.5.1", - "resolved": "https://registry.npmjs.org/@jest/globals/-/globals-27.5.1.tgz", - "integrity": "sha512-ZEJNB41OBQQgGzgyInAv0UUfDDj3upmHydjieSxFvTRuZElrx7tXg/uVQ5hYVEwiXs3+aMsAeEc9X7xiSKCm4Q==", - "requires": { - "@jest/environment": "^27.5.1", - "@jest/types": "^27.5.1", - "expect": "^27.5.1" - } - }, - "@jest/reporters": { - "version": "27.5.1", - "resolved": "https://registry.npmjs.org/@jest/reporters/-/reporters-27.5.1.tgz", - "integrity": "sha512-cPXh9hWIlVJMQkVk84aIvXuBB4uQQmFqZiacloFuGiP3ah1sbCxCosidXFDfqG8+6fO1oR2dTJTlsOy4VFmUfw==", - "requires": { - "@bcoe/v8-coverage": "^0.2.3", - "@jest/console": "^27.5.1", - "@jest/test-result": "^27.5.1", - "@jest/transform": "^27.5.1", - "@jest/types": "^27.5.1", - "@types/node": "*", - "chalk": "^4.0.0", - "collect-v8-coverage": "^1.0.0", - "exit": "^0.1.2", - "glob": "^7.1.2", - "graceful-fs": "^4.2.9", - "istanbul-lib-coverage": "^3.0.0", - "istanbul-lib-instrument": "^5.1.0", - "istanbul-lib-report": "^3.0.0", - "istanbul-lib-source-maps": "^4.0.0", - "istanbul-reports": "^3.1.3", - "jest-haste-map": "^27.5.1", - "jest-resolve": "^27.5.1", - "jest-util": "^27.5.1", - "jest-worker": "^27.5.1", - "slash": "^3.0.0", - "source-map": "^0.6.0", - "string-length": "^4.0.1", - "terminal-link": "^2.0.0", - "v8-to-istanbul": "^8.1.0" - }, - "dependencies": { - "ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "requires": { - "color-convert": "^2.0.1" - } - }, - "chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", - "requires": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - } - }, - "color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "requires": { - "color-name": "~1.1.4" - } - }, - "color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" - }, - "has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==" - }, - "source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==" - }, - "supports-color": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", - "requires": { - "has-flag": "^4.0.0" - } - } - } - }, - "@jest/schemas": { - "version": "28.0.2", - "resolved": "https://registry.npmjs.org/@jest/schemas/-/schemas-28.0.2.tgz", - "integrity": "sha512-YVDJZjd4izeTDkij00vHHAymNXQ6WWsdChFRK86qck6Jpr3DCL5W3Is3vslviRlP+bLuMYRLbdp98amMvqudhA==", - "requires": { - "@sinclair/typebox": "^0.23.3" - } - }, - "@jest/source-map": { - "version": "27.5.1", - "resolved": "https://registry.npmjs.org/@jest/source-map/-/source-map-27.5.1.tgz", - "integrity": "sha512-y9NIHUYF3PJRlHk98NdC/N1gl88BL08aQQgu4k4ZopQkCw9t9cV8mtl3TV8b/YCB8XaVTFrmUTAJvjsntDireg==", - "requires": { - "callsites": "^3.0.0", - "graceful-fs": "^4.2.9", - "source-map": "^0.6.0" - }, - "dependencies": { - "source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==" - } - } - }, - "@jest/test-result": { - "version": "27.5.1", - "resolved": "https://registry.npmjs.org/@jest/test-result/-/test-result-27.5.1.tgz", - "integrity": "sha512-EW35l2RYFUcUQxFJz5Cv5MTOxlJIQs4I7gxzi2zVU7PJhOwfYq1MdC5nhSmYjX1gmMmLPvB3sIaC+BkcHRBfag==", - "requires": { - "@jest/console": "^27.5.1", - "@jest/types": "^27.5.1", - "@types/istanbul-lib-coverage": "^2.0.0", - "collect-v8-coverage": "^1.0.0" - } - }, - "@jest/test-sequencer": { - "version": "27.5.1", - "resolved": "https://registry.npmjs.org/@jest/test-sequencer/-/test-sequencer-27.5.1.tgz", - "integrity": "sha512-LCheJF7WB2+9JuCS7VB/EmGIdQuhtqjRNI9A43idHv3E4KltCTsPsLxvdaubFHSYwY/fNjMWjl6vNRhDiN7vpQ==", - "requires": { - "@jest/test-result": "^27.5.1", - "graceful-fs": "^4.2.9", - "jest-haste-map": "^27.5.1", - "jest-runtime": "^27.5.1" - } - }, - "@jest/transform": { - "version": "27.5.1", - "resolved": "https://registry.npmjs.org/@jest/transform/-/transform-27.5.1.tgz", - "integrity": "sha512-ipON6WtYgl/1329g5AIJVbUuEh0wZVbdpGwC99Jw4LwuoBNS95MVphU6zOeD9pDkon+LLbFL7lOQRapbB8SCHw==", - "requires": { - "@babel/core": "^7.1.0", - "@jest/types": "^27.5.1", - "babel-plugin-istanbul": "^6.1.1", - "chalk": "^4.0.0", - "convert-source-map": "^1.4.0", - "fast-json-stable-stringify": "^2.0.0", - "graceful-fs": "^4.2.9", - "jest-haste-map": "^27.5.1", - "jest-regex-util": "^27.5.1", - "jest-util": "^27.5.1", - "micromatch": "^4.0.4", - "pirates": "^4.0.4", - "slash": "^3.0.0", - "source-map": "^0.6.1", - "write-file-atomic": "^3.0.0" - }, - "dependencies": { - "ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "requires": { - "color-convert": "^2.0.1" - } - }, - "chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", - "requires": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - } - }, - "color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "requires": { - "color-name": "~1.1.4" - } - }, - "color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" - }, - "has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==" - }, - "source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==" - }, - "supports-color": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", - "requires": { - "has-flag": "^4.0.0" - } - } - } - }, - "@jest/types": { - "version": "27.5.1", - "resolved": "https://registry.npmjs.org/@jest/types/-/types-27.5.1.tgz", - "integrity": "sha512-Cx46iJ9QpwQTjIdq5VJu2QTMMs3QlEjI0x1QbBP5W1+nMzyc2XmimiRR/CbX9TO0cPTeUlxWMOu8mslYsJ8DEw==", - "requires": { - "@types/istanbul-lib-coverage": "^2.0.0", - "@types/istanbul-reports": "^3.0.0", - "@types/node": "*", - "@types/yargs": "^16.0.0", - "chalk": "^4.0.0" - }, - "dependencies": { - "ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "requires": { - "color-convert": "^2.0.1" - } - }, - "chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", - "requires": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - } - }, - "color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "requires": { - "color-name": "~1.1.4" - } - }, - "color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" - }, - "has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==" - }, - "supports-color": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", - "requires": { - "has-flag": "^4.0.0" - } - } - } - }, - "@jridgewell/gen-mapping": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.1.1.tgz", - "integrity": "sha512-sQXCasFk+U8lWYEe66WxRDOE9PjVz4vSM51fTu3Hw+ClTpUSQb718772vH3pyS5pShp6lvQM7SxgIDXXXmOX7w==", - "requires": { - "@jridgewell/set-array": "^1.0.0", - "@jridgewell/sourcemap-codec": "^1.4.10" - } - }, - "@jridgewell/resolve-uri": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.0.tgz", - "integrity": "sha512-F2msla3tad+Mfht5cJq7LSXcdudKTWCVYUgw6pLFOOHSTtZlj6SWNYAp+AhuqLmWdBO2X5hPrLcu8cVP8fy28w==" - }, - "@jridgewell/set-array": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/@jridgewell/set-array/-/set-array-1.1.2.tgz", - "integrity": "sha512-xnkseuNADM0gt2bs+BvhO0p78Mk762YnZdsuzFV018NoG1Sj1SCQvpSqa7XUaTam5vAGasABV9qXASMKnFMwMw==" - }, - "@jridgewell/source-map": { - "version": "0.3.2", - "resolved": "https://registry.npmjs.org/@jridgewell/source-map/-/source-map-0.3.2.tgz", - "integrity": "sha512-m7O9o2uR8k2ObDysZYzdfhb08VuEml5oWGiosa1VdaPZ/A6QyPkAJuwN0Q1lhULOf6B7MtQmHENS743hWtCrgw==", - "requires": { - "@jridgewell/gen-mapping": "^0.3.0", - "@jridgewell/trace-mapping": "^0.3.9" - }, - "dependencies": { - "@jridgewell/gen-mapping": { - "version": "0.3.2", - "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.2.tgz", - "integrity": "sha512-mh65xKQAzI6iBcFzwv28KVWSmCkdRBWoOh+bYQGW3+6OZvbbN3TqMGo5hqYxQniRcH9F2VZIoJCm4pa3BPDK/A==", - "requires": { - "@jridgewell/set-array": "^1.0.1", - "@jridgewell/sourcemap-codec": "^1.4.10", - "@jridgewell/trace-mapping": "^0.3.9" - } - } - } - }, - "@jridgewell/sourcemap-codec": { - "version": "1.4.14", - "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.14.tgz", - "integrity": "sha512-XPSJHWmi394fuUuzDnGz1wiKqWfo1yXecHQMRf2l6hztTO+nPru658AyDngaBe7isIxEkRsPR3FZh+s7iVa4Uw==" - }, - "@jridgewell/trace-mapping": { - "version": "0.3.14", - "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.14.tgz", - "integrity": "sha512-bJWEfQ9lPTvm3SneWwRFVLzrh6nhjwqw7TUFFBEMzwvg7t7PCDenf2lDwqo4NQXzdpgBXyFgDWnQA+2vkruksQ==", - "requires": { - "@jridgewell/resolve-uri": "^3.0.3", - "@jridgewell/sourcemap-codec": "^1.4.10" - } - }, - "@leichtgewicht/ip-codec": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/@leichtgewicht/ip-codec/-/ip-codec-2.0.4.tgz", - "integrity": "sha512-Hcv+nVC0kZnQ3tD9GVu5xSMR4VVYOteQIr/hwFPVEvPdlXqgGEuRjiheChHgdM+JyqdgNcmzZOX/tnl0JOiI7A==" - }, - "@nodelib/fs.scandir": { - "version": "2.1.5", - "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz", - "integrity": "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==", - "requires": { - "@nodelib/fs.stat": "2.0.5", - "run-parallel": "^1.1.9" - } - }, - "@nodelib/fs.stat": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz", - "integrity": "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==" - }, - "@nodelib/fs.walk": { - "version": "1.2.8", - "resolved": "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz", - "integrity": "sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==", - "requires": { - "@nodelib/fs.scandir": "2.1.5", - "fastq": "^1.6.0" - } - }, - "@pmmmwh/react-refresh-webpack-plugin": { - "version": "0.5.7", - "resolved": "https://registry.npmjs.org/@pmmmwh/react-refresh-webpack-plugin/-/react-refresh-webpack-plugin-0.5.7.tgz", - "integrity": "sha512-bcKCAzF0DV2IIROp9ZHkRJa6O4jy7NlnHdWL3GmcUxYWNjLXkK5kfELELwEfSP5hXPfVL/qOGMAROuMQb9GG8Q==", - "requires": { - "ansi-html-community": "^0.0.8", - "common-path-prefix": "^3.0.0", - "core-js-pure": "^3.8.1", - "error-stack-parser": "^2.0.6", - "find-up": "^5.0.0", - "html-entities": "^2.1.0", - "loader-utils": "^2.0.0", - "schema-utils": "^3.0.0", - "source-map": "^0.7.3" - } - }, - "@rollup/plugin-babel": { - "version": "5.3.1", - "resolved": "https://registry.npmjs.org/@rollup/plugin-babel/-/plugin-babel-5.3.1.tgz", - "integrity": "sha512-WFfdLWU/xVWKeRQnKmIAQULUI7Il0gZnBIH/ZFO069wYIfPu+8zrfp/KMW0atmELoRDq8FbiP3VCss9MhCut7Q==", - "requires": { - "@babel/helper-module-imports": "^7.10.4", - "@rollup/pluginutils": "^3.1.0" - } - }, - "@rollup/plugin-node-resolve": { - "version": "11.2.1", - "resolved": "https://registry.npmjs.org/@rollup/plugin-node-resolve/-/plugin-node-resolve-11.2.1.tgz", - "integrity": "sha512-yc2n43jcqVyGE2sqV5/YCmocy9ArjVAP/BeXyTtADTBBX6V0e5UMqwO8CdQ0kzjb6zu5P1qMzsScCMRvE9OlVg==", - "requires": { - "@rollup/pluginutils": "^3.1.0", - "@types/resolve": "1.17.1", - "builtin-modules": "^3.1.0", - "deepmerge": "^4.2.2", - "is-module": "^1.0.0", - "resolve": "^1.19.0" - } - }, - "@rollup/plugin-replace": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/@rollup/plugin-replace/-/plugin-replace-2.4.2.tgz", - "integrity": "sha512-IGcu+cydlUMZ5En85jxHH4qj2hta/11BHq95iHEyb2sbgiN0eCdzvUcHw5gt9pBL5lTi4JDYJ1acCoMGpTvEZg==", - "requires": { - "@rollup/pluginutils": "^3.1.0", - "magic-string": "^0.25.7" - } - }, - "@rollup/pluginutils": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/@rollup/pluginutils/-/pluginutils-3.1.0.tgz", - "integrity": "sha512-GksZ6pr6TpIjHm8h9lSQ8pi8BE9VeubNT0OMJ3B5uZJ8pz73NPiqOtCog/x2/QzM1ENChPKxMDhiQuRHsqc+lg==", - "requires": { - "@types/estree": "0.0.39", - "estree-walker": "^1.0.1", - "picomatch": "^2.2.2" - }, - "dependencies": { - "@types/estree": { - "version": "0.0.39", - "resolved": "https://registry.npmjs.org/@types/estree/-/estree-0.0.39.tgz", - "integrity": "sha512-EYNwp3bU+98cpU4lAWYYL7Zz+2gryWH1qbdDTidVd6hkiR6weksdbMadyXKXNPEkQFhXM+hVO9ZygomHXp+AIw==" - } - } - }, - "@rushstack/eslint-patch": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/@rushstack/eslint-patch/-/eslint-patch-1.1.4.tgz", - "integrity": "sha512-LwzQKA4vzIct1zNZzBmRKI9QuNpLgTQMEjsQLf3BXuGYb3QPTP4Yjf6mkdX+X1mYttZ808QpOwAzZjv28kq7DA==" - }, - "@sinclair/typebox": { - "version": "0.23.5", - "resolved": "https://registry.npmjs.org/@sinclair/typebox/-/typebox-0.23.5.tgz", - "integrity": "sha512-AFBVi/iT4g20DHoujvMH1aEDn8fGJh4xsRGCP6d8RpLPMqsNPvW01Jcn0QysXTsg++/xj25NmJsGyH9xug/wKg==" - }, - "@sinonjs/commons": { - "version": "1.8.3", - "resolved": "https://registry.npmjs.org/@sinonjs/commons/-/commons-1.8.3.tgz", - "integrity": "sha512-xkNcLAn/wZaX14RPlwizcKicDk9G3F8m2nU3L7Ukm5zBgTwiT0wsoFAHx9Jq56fJA1z/7uKGtCRu16sOUCLIHQ==", - "requires": { - "type-detect": "4.0.8" - } - }, - "@sinonjs/fake-timers": { - "version": "8.1.0", - "resolved": "https://registry.npmjs.org/@sinonjs/fake-timers/-/fake-timers-8.1.0.tgz", - "integrity": "sha512-OAPJUAtgeINhh/TAlUID4QTs53Njm7xzddaVlEs/SXwgtiD1tW22zAB/W1wdqfrpmikgaWQ9Fw6Ws+hsiRm5Vg==", - "requires": { - "@sinonjs/commons": "^1.7.0" - } - }, - "@surma/rollup-plugin-off-main-thread": { - "version": "2.2.3", - "resolved": "https://registry.npmjs.org/@surma/rollup-plugin-off-main-thread/-/rollup-plugin-off-main-thread-2.2.3.tgz", - "integrity": "sha512-lR8q/9W7hZpMWweNiAKU7NQerBnzQQLvi8qnTDU/fxItPhtZVMbPV3lbCwjhIlNBe9Bbr5V+KHshvWmVSG9cxQ==", - "requires": { - "ejs": "^3.1.6", - "json5": "^2.2.0", - "magic-string": "^0.25.0", - "string.prototype.matchall": "^4.0.6" - } - }, - "@svgr/babel-plugin-add-jsx-attribute": { - "version": "5.4.0", - "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-add-jsx-attribute/-/babel-plugin-add-jsx-attribute-5.4.0.tgz", - "integrity": "sha512-ZFf2gs/8/6B8PnSofI0inYXr2SDNTDScPXhN7k5EqD4aZ3gi6u+rbmZHVB8IM3wDyx8ntKACZbtXSm7oZGRqVg==" - }, - "@svgr/babel-plugin-remove-jsx-attribute": { - "version": "5.4.0", - "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-remove-jsx-attribute/-/babel-plugin-remove-jsx-attribute-5.4.0.tgz", - "integrity": "sha512-yaS4o2PgUtwLFGTKbsiAy6D0o3ugcUhWK0Z45umJ66EPWunAz9fuFw2gJuje6wqQvQWOTJvIahUwndOXb7QCPg==" - }, - "@svgr/babel-plugin-remove-jsx-empty-expression": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-remove-jsx-empty-expression/-/babel-plugin-remove-jsx-empty-expression-5.0.1.tgz", - "integrity": "sha512-LA72+88A11ND/yFIMzyuLRSMJ+tRKeYKeQ+mR3DcAZ5I4h5CPWN9AHyUzJbWSYp/u2u0xhmgOe0+E41+GjEueA==" - }, - "@svgr/babel-plugin-replace-jsx-attribute-value": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-replace-jsx-attribute-value/-/babel-plugin-replace-jsx-attribute-value-5.0.1.tgz", - "integrity": "sha512-PoiE6ZD2Eiy5mK+fjHqwGOS+IXX0wq/YDtNyIgOrc6ejFnxN4b13pRpiIPbtPwHEc+NT2KCjteAcq33/F1Y9KQ==" - }, - "@svgr/babel-plugin-svg-dynamic-title": { - "version": "5.4.0", - "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-svg-dynamic-title/-/babel-plugin-svg-dynamic-title-5.4.0.tgz", - "integrity": "sha512-zSOZH8PdZOpuG1ZVx/cLVePB2ibo3WPpqo7gFIjLV9a0QsuQAzJiwwqmuEdTaW2pegyBE17Uu15mOgOcgabQZg==" - }, - "@svgr/babel-plugin-svg-em-dimensions": { - "version": "5.4.0", - "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-svg-em-dimensions/-/babel-plugin-svg-em-dimensions-5.4.0.tgz", - "integrity": "sha512-cPzDbDA5oT/sPXDCUYoVXEmm3VIoAWAPT6mSPTJNbQaBNUuEKVKyGH93oDY4e42PYHRW67N5alJx/eEol20abw==" - }, - "@svgr/babel-plugin-transform-react-native-svg": { - "version": "5.4.0", - "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-transform-react-native-svg/-/babel-plugin-transform-react-native-svg-5.4.0.tgz", - "integrity": "sha512-3eYP/SaopZ41GHwXma7Rmxcv9uRslRDTY1estspeB1w1ueZWd/tPlMfEOoccYpEMZU3jD4OU7YitnXcF5hLW2Q==" - }, - "@svgr/babel-plugin-transform-svg-component": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-transform-svg-component/-/babel-plugin-transform-svg-component-5.5.0.tgz", - "integrity": "sha512-q4jSH1UUvbrsOtlo/tKcgSeiCHRSBdXoIoqX1pgcKK/aU3JD27wmMKwGtpB8qRYUYoyXvfGxUVKchLuR5pB3rQ==" - }, - "@svgr/babel-preset": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/@svgr/babel-preset/-/babel-preset-5.5.0.tgz", - "integrity": "sha512-4FiXBjvQ+z2j7yASeGPEi8VD/5rrGQk4Xrq3EdJmoZgz/tpqChpo5hgXDvmEauwtvOc52q8ghhZK4Oy7qph4ig==", - "requires": { - "@svgr/babel-plugin-add-jsx-attribute": "^5.4.0", - "@svgr/babel-plugin-remove-jsx-attribute": "^5.4.0", - "@svgr/babel-plugin-remove-jsx-empty-expression": "^5.0.1", - "@svgr/babel-plugin-replace-jsx-attribute-value": "^5.0.1", - "@svgr/babel-plugin-svg-dynamic-title": "^5.4.0", - "@svgr/babel-plugin-svg-em-dimensions": "^5.4.0", - "@svgr/babel-plugin-transform-react-native-svg": "^5.4.0", - "@svgr/babel-plugin-transform-svg-component": "^5.5.0" - } - }, - "@svgr/core": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/@svgr/core/-/core-5.5.0.tgz", - "integrity": "sha512-q52VOcsJPvV3jO1wkPtzTuKlvX7Y3xIcWRpCMtBF3MrteZJtBfQw/+u0B1BHy5ColpQc1/YVTrPEtSYIMNZlrQ==", - "requires": { - "@svgr/plugin-jsx": "^5.5.0", - "camelcase": "^6.2.0", - "cosmiconfig": "^7.0.0" - } - }, - "@svgr/hast-util-to-babel-ast": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/@svgr/hast-util-to-babel-ast/-/hast-util-to-babel-ast-5.5.0.tgz", - "integrity": "sha512-cAaR/CAiZRB8GP32N+1jocovUtvlj0+e65TB50/6Lcime+EA49m/8l+P2ko+XPJ4dw3xaPS3jOL4F2X4KWxoeQ==", - "requires": { - "@babel/types": "^7.12.6" - } - }, - "@svgr/plugin-jsx": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/@svgr/plugin-jsx/-/plugin-jsx-5.5.0.tgz", - "integrity": "sha512-V/wVh33j12hGh05IDg8GpIUXbjAPnTdPTKuP4VNLggnwaHMPNQNae2pRnyTAILWCQdz5GyMqtO488g7CKM8CBA==", - "requires": { - "@babel/core": "^7.12.3", - "@svgr/babel-preset": "^5.5.0", - "@svgr/hast-util-to-babel-ast": "^5.5.0", - "svg-parser": "^2.0.2" - } - }, - "@svgr/plugin-svgo": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/@svgr/plugin-svgo/-/plugin-svgo-5.5.0.tgz", - "integrity": "sha512-r5swKk46GuQl4RrVejVwpeeJaydoxkdwkM1mBKOgJLBUJPGaLci6ylg/IjhrRsREKDkr4kbMWdgOtbXEh0fyLQ==", - "requires": { - "cosmiconfig": "^7.0.0", - "deepmerge": "^4.2.2", - "svgo": "^1.2.2" - } - }, - "@svgr/webpack": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/@svgr/webpack/-/webpack-5.5.0.tgz", - "integrity": "sha512-DOBOK255wfQxguUta2INKkzPj6AIS6iafZYiYmHn6W3pHlycSRRlvWKCfLDG10fXfLWqE3DJHgRUOyJYmARa7g==", - "requires": { - "@babel/core": "^7.12.3", - "@babel/plugin-transform-react-constant-elements": "^7.12.1", - "@babel/preset-env": "^7.12.1", - "@babel/preset-react": "^7.12.5", - "@svgr/core": "^5.5.0", - "@svgr/plugin-jsx": "^5.5.0", - "@svgr/plugin-svgo": "^5.5.0", - "loader-utils": "^2.0.0" - } - }, - "@testing-library/dom": { - "version": "8.16.0", - "resolved": "https://registry.npmjs.org/@testing-library/dom/-/dom-8.16.0.tgz", - "integrity": "sha512-uxF4zmnLHHDlmW4l+0WDjcgLVwCvH+OVLpD8Dfp+Bjfz85prwxWGbwXgJdLtkgjD0qfOzkJF9SmA6YZPsMYX4w==", - "requires": { - "@babel/code-frame": "^7.10.4", - "@babel/runtime": "^7.12.5", - "@types/aria-query": "^4.2.0", - "aria-query": "^5.0.0", - "chalk": "^4.1.0", - "dom-accessibility-api": "^0.5.9", - "lz-string": "^1.4.4", - "pretty-format": "^27.0.2" - }, - "dependencies": { - "ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "requires": { - "color-convert": "^2.0.1" - } - }, - "aria-query": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/aria-query/-/aria-query-5.0.0.tgz", - "integrity": "sha512-V+SM7AbUwJ+EBnB8+DXs0hPZHO0W6pqBcc0dW90OwtVG02PswOu/teuARoLQjdDOH+t9pJgGnW5/Qmouf3gPJg==" - }, - "chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", - "requires": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - } - }, - "color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "requires": { - "color-name": "~1.1.4" - } - }, - "color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" - }, - "has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==" - }, - "supports-color": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", - "requires": { - "has-flag": "^4.0.0" - } - } - } - }, - "@testing-library/jest-dom": { - "version": "5.16.4", - "resolved": "https://registry.npmjs.org/@testing-library/jest-dom/-/jest-dom-5.16.4.tgz", - "integrity": "sha512-Gy+IoFutbMQcky0k+bqqumXZ1cTGswLsFqmNLzNdSKkU9KGV2u9oXhukCbbJ9/LRPKiqwxEE8VpV/+YZlfkPUA==", - "requires": { - "@babel/runtime": "^7.9.2", - "@types/testing-library__jest-dom": "^5.9.1", - "aria-query": "^5.0.0", - "chalk": "^3.0.0", - "css": "^3.0.0", - "css.escape": "^1.5.1", - "dom-accessibility-api": "^0.5.6", - "lodash": "^4.17.15", - "redent": "^3.0.0" - }, - "dependencies": { - "ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "requires": { - "color-convert": "^2.0.1" - } - }, - "aria-query": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/aria-query/-/aria-query-5.0.0.tgz", - "integrity": "sha512-V+SM7AbUwJ+EBnB8+DXs0hPZHO0W6pqBcc0dW90OwtVG02PswOu/teuARoLQjdDOH+t9pJgGnW5/Qmouf3gPJg==" - }, - "chalk": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-3.0.0.tgz", - "integrity": "sha512-4D3B6Wf41KOYRFdszmDqMCGq5VV/uMAB273JILmO+3jAlh8X4qDtdtgCR3fxtbLEMzSx22QdhnDcJvu2u1fVwg==", - "requires": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - } - }, - "color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "requires": { - "color-name": "~1.1.4" - } - }, - "color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" - }, - "has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==" - }, - "supports-color": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", - "requires": { - "has-flag": "^4.0.0" - } - } - } - }, - "@testing-library/react": { - "version": "13.3.0", - "resolved": "https://registry.npmjs.org/@testing-library/react/-/react-13.3.0.tgz", - "integrity": "sha512-DB79aA426+deFgGSjnf5grczDPiL4taK3hFaa+M5q7q20Kcve9eQottOG5kZ74KEr55v0tU2CQormSSDK87zYQ==", - "requires": { - "@babel/runtime": "^7.12.5", - "@testing-library/dom": "^8.5.0", - "@types/react-dom": "^18.0.0" - } - }, - "@testing-library/user-event": { - "version": "13.5.0", - "resolved": "https://registry.npmjs.org/@testing-library/user-event/-/user-event-13.5.0.tgz", - "integrity": "sha512-5Kwtbo3Y/NowpkbRuSepbyMFkZmHgD+vPzYB/RJ4oxt5Gj/avFFBYjhw27cqSVPVw/3a67NK1PbiIr9k4Gwmdg==", - "requires": { - "@babel/runtime": "^7.12.5" - } - }, - "@tootallnate/once": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/@tootallnate/once/-/once-1.1.2.tgz", - "integrity": "sha512-RbzJvlNzmRq5c3O09UipeuXno4tA1FE6ikOjxZK0tuxVv3412l64l5t1W5pj4+rJq9vpkm/kwiR07aZXnsKPxw==" - }, - "@trysound/sax": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/@trysound/sax/-/sax-0.2.0.tgz", - "integrity": "sha512-L7z9BgrNEcYyUYtF+HaEfiS5ebkh9jXqbszz7pC0hRBPaatV0XjSD3+eHrpqFemQfgwiFF0QPIarnIihIDn7OA==" - }, - "@types/aria-query": { - "version": "4.2.2", - "resolved": "https://registry.npmjs.org/@types/aria-query/-/aria-query-4.2.2.tgz", - "integrity": "sha512-HnYpAE1Y6kRyKM/XkEuiRQhTHvkzMBurTHnpFLYLBGPIylZNPs9jJcuOOYWxPLJCSEtmZT0Y8rHDokKN7rRTig==" - }, - "@types/babel__core": { - "version": "7.1.19", - "resolved": "https://registry.npmjs.org/@types/babel__core/-/babel__core-7.1.19.tgz", - "integrity": "sha512-WEOTgRsbYkvA/KCsDwVEGkd7WAr1e3g31VHQ8zy5gul/V1qKullU/BU5I68X5v7V3GnB9eotmom4v5a5gjxorw==", - "requires": { - "@babel/parser": "^7.1.0", - "@babel/types": "^7.0.0", - "@types/babel__generator": "*", - "@types/babel__template": "*", - "@types/babel__traverse": "*" - } - }, - "@types/babel__generator": { - "version": "7.6.4", - "resolved": "https://registry.npmjs.org/@types/babel__generator/-/babel__generator-7.6.4.tgz", - "integrity": "sha512-tFkciB9j2K755yrTALxD44McOrk+gfpIpvC3sxHjRawj6PfnQxrse4Clq5y/Rq+G3mrBurMax/lG8Qn2t9mSsg==", - "requires": { - "@babel/types": "^7.0.0" - } - }, - "@types/babel__template": { - "version": "7.4.1", - "resolved": "https://registry.npmjs.org/@types/babel__template/-/babel__template-7.4.1.tgz", - "integrity": "sha512-azBFKemX6kMg5Io+/rdGT0dkGreboUVR0Cdm3fz9QJWpaQGJRQXl7C+6hOTCZcMll7KFyEQpgbYI2lHdsS4U7g==", - "requires": { - "@babel/parser": "^7.1.0", - "@babel/types": "^7.0.0" - } - }, - "@types/babel__traverse": { - "version": "7.17.1", - "resolved": "https://registry.npmjs.org/@types/babel__traverse/-/babel__traverse-7.17.1.tgz", - "integrity": "sha512-kVzjari1s2YVi77D3w1yuvohV2idweYXMCDzqBiVNN63TcDWrIlTVOYpqVrvbbyOE/IyzBoTKF0fdnLPEORFxA==", - "requires": { - "@babel/types": "^7.3.0" - } - }, - "@types/body-parser": { - "version": "1.19.2", - "resolved": "https://registry.npmjs.org/@types/body-parser/-/body-parser-1.19.2.tgz", - "integrity": "sha512-ALYone6pm6QmwZoAgeyNksccT9Q4AWZQ6PvfwR37GT6r6FWUPguq6sUmNGSMV2Wr761oQoBxwGGa6DR5o1DC9g==", - "requires": { - "@types/connect": "*", - "@types/node": "*" - } - }, - "@types/bonjour": { - "version": "3.5.10", - "resolved": "https://registry.npmjs.org/@types/bonjour/-/bonjour-3.5.10.tgz", - "integrity": "sha512-p7ienRMiS41Nu2/igbJxxLDWrSZ0WxM8UQgCeO9KhoVF7cOVFkrKsiDr1EsJIla8vV3oEEjGcz11jc5yimhzZw==", - "requires": { - "@types/node": "*" - } - }, - "@types/connect": { - "version": "3.4.35", - "resolved": "https://registry.npmjs.org/@types/connect/-/connect-3.4.35.tgz", - "integrity": "sha512-cdeYyv4KWoEgpBISTxWvqYsVy444DOqehiF3fM3ne10AmJ62RSyNkUnxMJXHQWRQQX2eR94m5y1IZyDwBjV9FQ==", - "requires": { - "@types/node": "*" - } - }, - "@types/connect-history-api-fallback": { - "version": "1.3.5", - "resolved": "https://registry.npmjs.org/@types/connect-history-api-fallback/-/connect-history-api-fallback-1.3.5.tgz", - "integrity": "sha512-h8QJa8xSb1WD4fpKBDcATDNGXghFj6/3GRWG6dhmRcu0RX1Ubasur2Uvx5aeEwlf0MwblEC2bMzzMQntxnw/Cw==", - "requires": { - "@types/express-serve-static-core": "*", - "@types/node": "*" - } - }, - "@types/eslint": { - "version": "8.4.5", - "resolved": "https://registry.npmjs.org/@types/eslint/-/eslint-8.4.5.tgz", - "integrity": "sha512-dhsC09y1gpJWnK+Ff4SGvCuSnk9DaU0BJZSzOwa6GVSg65XtTugLBITDAAzRU5duGBoXBHpdR/9jHGxJjNflJQ==", - "requires": { - "@types/estree": "*", - "@types/json-schema": "*" - } - }, - "@types/eslint-scope": { - "version": "3.7.4", - "resolved": "https://registry.npmjs.org/@types/eslint-scope/-/eslint-scope-3.7.4.tgz", - "integrity": "sha512-9K4zoImiZc3HlIp6AVUDE4CWYx22a+lhSZMYNpbjW04+YF0KWj4pJXnEMjdnFTiQibFFmElcsasJXDbdI/EPhA==", - "requires": { - "@types/eslint": "*", - "@types/estree": "*" - } - }, - "@types/estree": { - "version": "0.0.52", - "resolved": "https://registry.npmjs.org/@types/estree/-/estree-0.0.52.tgz", - "integrity": "sha512-BZWrtCU0bMVAIliIV+HJO1f1PR41M7NKjfxrFJwwhKI1KwhwOxYw1SXg9ao+CIMt774nFuGiG6eU+udtbEI9oQ==" - }, - "@types/express": { - "version": "4.17.13", - "resolved": "https://registry.npmjs.org/@types/express/-/express-4.17.13.tgz", - "integrity": "sha512-6bSZTPaTIACxn48l50SR+axgrqm6qXFIxrdAKaG6PaJk3+zuUr35hBlgT7vOmJcum+OEaIBLtHV/qloEAFITeA==", - "requires": { - "@types/body-parser": "*", - "@types/express-serve-static-core": "^4.17.18", - "@types/qs": "*", - "@types/serve-static": "*" - } - }, - "@types/express-serve-static-core": { - "version": "4.17.29", - "resolved": "https://registry.npmjs.org/@types/express-serve-static-core/-/express-serve-static-core-4.17.29.tgz", - "integrity": "sha512-uMd++6dMKS32EOuw1Uli3e3BPgdLIXmezcfHv7N4c1s3gkhikBplORPpMq3fuWkxncZN1reb16d5n8yhQ80x7Q==", - "requires": { - "@types/node": "*", - "@types/qs": "*", - "@types/range-parser": "*" - } - }, - "@types/graceful-fs": { - "version": "4.1.5", - "resolved": "https://registry.npmjs.org/@types/graceful-fs/-/graceful-fs-4.1.5.tgz", - "integrity": "sha512-anKkLmZZ+xm4p8JWBf4hElkM4XR+EZeA2M9BAkkTldmcyDY4mbdIJnRghDJH3Ov5ooY7/UAoENtmdMSkaAd7Cw==", - "requires": { - "@types/node": "*" - } - }, - "@types/html-minifier-terser": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/@types/html-minifier-terser/-/html-minifier-terser-6.1.0.tgz", - "integrity": "sha512-oh/6byDPnL1zeNXFrDXFLyZjkr1MsBG667IM792caf1L2UPOOMf65NFzjUH/ltyfwjAGfs1rsX1eftK0jC/KIg==" - }, - "@types/http-proxy": { - "version": "1.17.9", - "resolved": "https://registry.npmjs.org/@types/http-proxy/-/http-proxy-1.17.9.tgz", - "integrity": "sha512-QsbSjA/fSk7xB+UXlCT3wHBy5ai9wOcNDWwZAtud+jXhwOM3l+EYZh8Lng4+/6n8uar0J7xILzqftJdJ/Wdfkw==", - "requires": { - "@types/node": "*" - } - }, - "@types/istanbul-lib-coverage": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/@types/istanbul-lib-coverage/-/istanbul-lib-coverage-2.0.4.tgz", - "integrity": "sha512-z/QT1XN4K4KYuslS23k62yDIDLwLFkzxOuMplDtObz0+y7VqJCaO2o+SPwHCvLFZh7xazvvoor2tA/hPz9ee7g==" - }, - "@types/istanbul-lib-report": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/@types/istanbul-lib-report/-/istanbul-lib-report-3.0.0.tgz", - "integrity": "sha512-plGgXAPfVKFoYfa9NpYDAkseG+g6Jr294RqeqcqDixSbU34MZVJRi/P+7Y8GDpzkEwLaGZZOpKIEmeVZNtKsrg==", - "requires": { - "@types/istanbul-lib-coverage": "*" - } - }, - "@types/istanbul-reports": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/@types/istanbul-reports/-/istanbul-reports-3.0.1.tgz", - "integrity": "sha512-c3mAZEuK0lvBp8tmuL74XRKn1+y2dcwOUpH7x4WrF6gk1GIgiluDRgMYQtw2OFcBvAJWlt6ASU3tSqxp0Uu0Aw==", - "requires": { - "@types/istanbul-lib-report": "*" - } - }, - "@types/jest": { - "version": "28.1.4", - "resolved": "https://registry.npmjs.org/@types/jest/-/jest-28.1.4.tgz", - "integrity": "sha512-telv6G5N7zRJiLcI3Rs3o+ipZ28EnE+7EvF0pSrt2pZOMnAVI/f+6/LucDxOvcBcTeTL3JMF744BbVQAVBUQRA==", - "requires": { - "jest-matcher-utils": "^28.0.0", - "pretty-format": "^28.0.0" - }, - "dependencies": { - "ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "requires": { - "color-convert": "^2.0.1" - } - }, - "chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", - "requires": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - } - }, - "color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "requires": { - "color-name": "~1.1.4" - } - }, - "color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" - }, - "diff-sequences": { - "version": "28.1.1", - "resolved": "https://registry.npmjs.org/diff-sequences/-/diff-sequences-28.1.1.tgz", - "integrity": "sha512-FU0iFaH/E23a+a718l8Qa/19bF9p06kgE0KipMOMadwa3SjnaElKzPaUC0vnibs6/B/9ni97s61mcejk8W1fQw==" - }, - "has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==" - }, - "jest-diff": { - "version": "28.1.1", - "resolved": "https://registry.npmjs.org/jest-diff/-/jest-diff-28.1.1.tgz", - "integrity": "sha512-/MUUxeR2fHbqHoMMiffe/Afm+U8U4olFRJ0hiVG2lZatPJcnGxx292ustVu7bULhjV65IYMxRdploAKLbcrsyg==", - "requires": { - "chalk": "^4.0.0", - "diff-sequences": "^28.1.1", - "jest-get-type": "^28.0.2", - "pretty-format": "^28.1.1" - } - }, - "jest-get-type": { - "version": "28.0.2", - "resolved": "https://registry.npmjs.org/jest-get-type/-/jest-get-type-28.0.2.tgz", - "integrity": "sha512-ioj2w9/DxSYHfOm5lJKCdcAmPJzQXmbM/Url3rhlghrPvT3tt+7a/+oXc9azkKmLvoiXjtV83bEWqi+vs5nlPA==" - }, - "jest-matcher-utils": { - "version": "28.1.1", - "resolved": "https://registry.npmjs.org/jest-matcher-utils/-/jest-matcher-utils-28.1.1.tgz", - "integrity": "sha512-NPJPRWrbmR2nAJ+1nmnfcKKzSwgfaciCCrYZzVnNoxVoyusYWIjkBMNvu0RHJe7dNj4hH3uZOPZsQA+xAYWqsw==", - "requires": { - "chalk": "^4.0.0", - "jest-diff": "^28.1.1", - "jest-get-type": "^28.0.2", - "pretty-format": "^28.1.1" - } - }, - "pretty-format": { - "version": "28.1.1", - "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-28.1.1.tgz", - "integrity": "sha512-wwJbVTGFHeucr5Jw2bQ9P+VYHyLdAqedFLEkdQUVaBF/eiidDwH5OpilINq4mEfhbCjLnirt6HTTDhv1HaTIQw==", - "requires": { - "@jest/schemas": "^28.0.2", - "ansi-regex": "^5.0.1", - "ansi-styles": "^5.0.0", - "react-is": "^18.0.0" - }, - "dependencies": { - "ansi-styles": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-5.2.0.tgz", - "integrity": "sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==" - } - } - }, - "react-is": { - "version": "18.2.0", - "resolved": "https://registry.npmjs.org/react-is/-/react-is-18.2.0.tgz", - "integrity": "sha512-xWGDIW6x921xtzPkhiULtthJHoJvBbF3q26fzloPCK0hsvxtPVelvftw3zjbHWSkR2km9Z+4uxbDDK/6Zw9B8w==" - }, - "supports-color": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", - "requires": { - "has-flag": "^4.0.0" - } - } - } - }, - "@types/json-schema": { - "version": "7.0.11", - "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.11.tgz", - "integrity": "sha512-wOuvG1SN4Us4rez+tylwwwCV1psiNVOkJeM3AUWUNWg/jDQY2+HE/444y5gc+jBmRqASOm2Oeh5c1axHobwRKQ==" - }, - "@types/json5": { - "version": "0.0.29", - "resolved": "https://registry.npmjs.org/@types/json5/-/json5-0.0.29.tgz", - "integrity": "sha512-dRLjCWHYg4oaA77cxO64oO+7JwCwnIzkZPdrrC71jQmQtlhM556pwKo5bUzqvZndkVbeFLIIi+9TC40JNF5hNQ==" - }, - "@types/mime": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/@types/mime/-/mime-1.3.2.tgz", - "integrity": "sha512-YATxVxgRqNH6nHEIsvg6k2Boc1JHI9ZbH5iWFFv/MTkchz3b1ieGDa5T0a9RznNdI0KhVbdbWSN+KWWrQZRxTw==" - }, - "@types/node": { - "version": "18.0.3", - "resolved": "https://registry.npmjs.org/@types/node/-/node-18.0.3.tgz", - "integrity": "sha512-HzNRZtp4eepNitP+BD6k2L6DROIDG4Q0fm4x+dwfsr6LGmROENnok75VGw40628xf+iR24WeMFcHuuBDUAzzsQ==" - }, - "@types/parse-json": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/@types/parse-json/-/parse-json-4.0.0.tgz", - "integrity": "sha512-//oorEZjL6sbPcKUaCdIGlIUeH26mgzimjBB77G6XRgnDl/L5wOnpyBGRe/Mmf5CVW3PwEBE1NjiMZ/ssFh4wA==" - }, - "@types/prettier": { - "version": "2.6.3", - "resolved": "https://registry.npmjs.org/@types/prettier/-/prettier-2.6.3.tgz", - "integrity": "sha512-ymZk3LEC/fsut+/Q5qejp6R9O1rMxz3XaRHDV6kX8MrGAhOSPqVARbDi+EZvInBpw+BnCX3TD240byVkOfQsHg==" - }, - "@types/prop-types": { - "version": "15.7.5", - "resolved": "https://registry.npmjs.org/@types/prop-types/-/prop-types-15.7.5.tgz", - "integrity": "sha512-JCB8C6SnDoQf0cNycqd/35A7MjcnK+ZTqE7judS6o7utxUCg6imJg3QK2qzHKszlTjcj2cn+NwMB2i96ubpj7w==" - }, - "@types/q": { - "version": "1.5.5", - "resolved": "https://registry.npmjs.org/@types/q/-/q-1.5.5.tgz", - "integrity": "sha512-L28j2FcJfSZOnL1WBjDYp2vUHCeIFlyYI/53EwD/rKUBQ7MtUUfbQWiyKJGpcnv4/WgrhWsFKrcPstcAt/J0tQ==" - }, - "@types/qs": { - "version": "6.9.7", - "resolved": "https://registry.npmjs.org/@types/qs/-/qs-6.9.7.tgz", - "integrity": "sha512-FGa1F62FT09qcrueBA6qYTrJPVDzah9a+493+o2PCXsesWHIn27G98TsSMs3WPNbZIEj4+VJf6saSFpvD+3Zsw==" - }, - "@types/range-parser": { - "version": "1.2.4", - "resolved": "https://registry.npmjs.org/@types/range-parser/-/range-parser-1.2.4.tgz", - "integrity": "sha512-EEhsLsD6UsDM1yFhAvy0Cjr6VwmpMWqFBCb9w07wVugF7w9nfajxLuVmngTIpgS6svCnm6Vaw+MZhoDCKnOfsw==" - }, - "@types/react": { - "version": "18.0.15", - "resolved": "https://registry.npmjs.org/@types/react/-/react-18.0.15.tgz", - "integrity": "sha512-iz3BtLuIYH1uWdsv6wXYdhozhqj20oD4/Hk2DNXIn1kFsmp9x8d9QB6FnPhfkbhd2PgEONt9Q1x/ebkwjfFLow==", - "requires": { - "@types/prop-types": "*", - "@types/scheduler": "*", - "csstype": "^3.0.2" - } - }, - "@types/react-dom": { - "version": "18.0.6", - "resolved": "https://registry.npmjs.org/@types/react-dom/-/react-dom-18.0.6.tgz", - "integrity": "sha512-/5OFZgfIPSwy+YuIBP/FgJnQnsxhZhjjrnxudMddeblOouIodEQ75X14Rr4wGSG/bknL+Omy9iWlLo1u/9GzAA==", - "requires": { - "@types/react": "*" - } - }, - "@types/resolve": { - "version": "1.17.1", - "resolved": "https://registry.npmjs.org/@types/resolve/-/resolve-1.17.1.tgz", - "integrity": "sha512-yy7HuzQhj0dhGpD8RLXSZWEkLsV9ibvxvi6EiJ3bkqLAO1RGo0WbkWQiwpRlSFymTJRz0d3k5LM3kkx8ArDbLw==", - "requires": { - "@types/node": "*" - } - }, - "@types/retry": { - "version": "0.12.0", - "resolved": "https://registry.npmjs.org/@types/retry/-/retry-0.12.0.tgz", - "integrity": "sha512-wWKOClTTiizcZhXnPY4wikVAwmdYHp8q6DmC+EJUzAMsycb7HB32Kh9RN4+0gExjmPmZSAQjgURXIGATPegAvA==" - }, - "@types/scheduler": { - "version": "0.16.2", - "resolved": "https://registry.npmjs.org/@types/scheduler/-/scheduler-0.16.2.tgz", - "integrity": "sha512-hppQEBDmlwhFAXKJX2KnWLYu5yMfi91yazPb2l+lbJiwW+wdo1gNeRA+3RgNSO39WYX2euey41KEwnqesU2Jew==" - }, - "@types/serve-index": { - "version": "1.9.1", - "resolved": "https://registry.npmjs.org/@types/serve-index/-/serve-index-1.9.1.tgz", - "integrity": "sha512-d/Hs3nWDxNL2xAczmOVZNj92YZCS6RGxfBPjKzuu/XirCgXdpKEb88dYNbrYGint6IVWLNP+yonwVAuRC0T2Dg==", - "requires": { - "@types/express": "*" - } - }, - "@types/serve-static": { - "version": "1.13.10", - "resolved": "https://registry.npmjs.org/@types/serve-static/-/serve-static-1.13.10.tgz", - "integrity": "sha512-nCkHGI4w7ZgAdNkrEu0bv+4xNV/XDqW+DydknebMOQwkpDGx8G+HTlj7R7ABI8i8nKxVw0wtKPi1D+lPOkh4YQ==", - "requires": { - "@types/mime": "^1", - "@types/node": "*" - } - }, - "@types/sockjs": { - "version": "0.3.33", - "resolved": "https://registry.npmjs.org/@types/sockjs/-/sockjs-0.3.33.tgz", - "integrity": "sha512-f0KEEe05NvUnat+boPTZ0dgaLZ4SfSouXUgv5noUiefG2ajgKjmETo9ZJyuqsl7dfl2aHlLJUiki6B4ZYldiiw==", - "requires": { - "@types/node": "*" - } - }, - "@types/stack-utils": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/@types/stack-utils/-/stack-utils-2.0.1.tgz", - "integrity": "sha512-Hl219/BT5fLAaz6NDkSuhzasy49dwQS/DSdu4MdggFB8zcXv7vflBI3xp7FEmkmdDkBUI2bPUNeMttp2knYdxw==" - }, - "@types/testing-library__jest-dom": { - "version": "5.14.5", - "resolved": "https://registry.npmjs.org/@types/testing-library__jest-dom/-/testing-library__jest-dom-5.14.5.tgz", - "integrity": "sha512-SBwbxYoyPIvxHbeHxTZX2Pe/74F/tX2/D3mMvzabdeJ25bBojfW0TyB8BHrbq/9zaaKICJZjLP+8r6AeZMFCuQ==", - "requires": { - "@types/jest": "*" - } - }, - "@types/trusted-types": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/@types/trusted-types/-/trusted-types-2.0.2.tgz", - "integrity": "sha512-F5DIZ36YVLE+PN+Zwws4kJogq47hNgX3Nx6WyDJ3kcplxyke3XIzB8uK5n/Lpm1HBsbGzd6nmGehL8cPekP+Tg==" - }, - "@types/ws": { - "version": "8.5.3", - "resolved": "https://registry.npmjs.org/@types/ws/-/ws-8.5.3.tgz", - "integrity": "sha512-6YOoWjruKj1uLf3INHH7D3qTXwFfEsg1kf3c0uDdSBJwfa/llkwIjrAGV7j7mVgGNbzTQ3HiHKKDXl6bJPD97w==", - "requires": { - "@types/node": "*" - } - }, - "@types/yargs": { - "version": "16.0.4", - "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-16.0.4.tgz", - "integrity": "sha512-T8Yc9wt/5LbJyCaLiHPReJa0kApcIgJ7Bn735GjItUfh08Z1pJvu8QZqb9s+mMvKV6WUQRV7K2R46YbjMXTTJw==", - "requires": { - "@types/yargs-parser": "*" - } - }, - "@types/yargs-parser": { - "version": "21.0.0", - "resolved": "https://registry.npmjs.org/@types/yargs-parser/-/yargs-parser-21.0.0.tgz", - "integrity": "sha512-iO9ZQHkZxHn4mSakYV0vFHAVDyEOIJQrV2uZ06HxEPcx+mt8swXoZHIbaaJ2crJYFfErySgktuTZ3BeLz+XmFA==" - }, - "@typescript-eslint/eslint-plugin": { - "version": "5.30.6", - "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-5.30.6.tgz", - "integrity": "sha512-J4zYMIhgrx4MgnZrSDD7sEnQp7FmhKNOaqaOpaoQ/SfdMfRB/0yvK74hTnvH+VQxndZynqs5/Hn4t+2/j9bADg==", - "requires": { - "@typescript-eslint/scope-manager": "5.30.6", - "@typescript-eslint/type-utils": "5.30.6", - "@typescript-eslint/utils": "5.30.6", - "debug": "^4.3.4", - "functional-red-black-tree": "^1.0.1", - "ignore": "^5.2.0", - "regexpp": "^3.2.0", - "semver": "^7.3.7", - "tsutils": "^3.21.0" - } - }, - "@typescript-eslint/experimental-utils": { - "version": "5.30.6", - "resolved": "https://registry.npmjs.org/@typescript-eslint/experimental-utils/-/experimental-utils-5.30.6.tgz", - "integrity": "sha512-bqvT+0L8IjtW7MCrMgm9oVNxs4g7mESro1mm5c1/SNfTnHuFTf9OUX1WzVkTz75M9cp//UrTrSmGvK48NEKshQ==", - "requires": { - "@typescript-eslint/utils": "5.30.6" - } - }, - "@typescript-eslint/parser": { - "version": "5.30.6", - "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-5.30.6.tgz", - "integrity": "sha512-gfF9lZjT0p2ZSdxO70Xbw8w9sPPJGfAdjK7WikEjB3fcUI/yr9maUVEdqigBjKincUYNKOmf7QBMiTf719kbrA==", - "requires": { - "@typescript-eslint/scope-manager": "5.30.6", - "@typescript-eslint/types": "5.30.6", - "@typescript-eslint/typescript-estree": "5.30.6", - "debug": "^4.3.4" - } - }, - "@typescript-eslint/scope-manager": { - "version": "5.30.6", - "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-5.30.6.tgz", - "integrity": "sha512-Hkq5PhLgtVoW1obkqYH0i4iELctEKixkhWLPTYs55doGUKCASvkjOXOd/pisVeLdO24ZX9D6yymJ/twqpJiG3g==", - "requires": { - "@typescript-eslint/types": "5.30.6", - "@typescript-eslint/visitor-keys": "5.30.6" - } - }, - "@typescript-eslint/type-utils": { - "version": "5.30.6", - "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-5.30.6.tgz", - "integrity": "sha512-GFVVzs2j0QPpM+NTDMXtNmJKlF842lkZKDSanIxf+ArJsGeZUIaeT4jGg+gAgHt7AcQSFwW7htzF/rbAh2jaVA==", - "requires": { - "@typescript-eslint/utils": "5.30.6", - "debug": "^4.3.4", - "tsutils": "^3.21.0" - } - }, - "@typescript-eslint/types": { - "version": "5.30.6", - "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-5.30.6.tgz", - "integrity": "sha512-HdnP8HioL1F7CwVmT4RaaMX57RrfqsOMclZc08wGMiDYJBsLGBM7JwXM4cZJmbWLzIR/pXg1kkrBBVpxTOwfUg==" - }, - "@typescript-eslint/typescript-estree": { - "version": "5.30.6", - "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-5.30.6.tgz", - "integrity": "sha512-Z7TgPoeYUm06smfEfYF0RBkpF8csMyVnqQbLYiGgmUSTaSXTP57bt8f0UFXstbGxKIreTwQCujtaH0LY9w9B+A==", - "requires": { - "@typescript-eslint/types": "5.30.6", - "@typescript-eslint/visitor-keys": "5.30.6", - "debug": "^4.3.4", - "globby": "^11.1.0", - "is-glob": "^4.0.3", - "semver": "^7.3.7", - "tsutils": "^3.21.0" - } - }, - "@typescript-eslint/utils": { - "version": "5.30.6", - "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-5.30.6.tgz", - "integrity": "sha512-xFBLc/esUbLOJLk9jKv0E9gD/OH966M40aY9jJ8GiqpSkP2xOV908cokJqqhVd85WoIvHVHYXxSFE4cCSDzVvA==", - "requires": { - "@types/json-schema": "^7.0.9", - "@typescript-eslint/scope-manager": "5.30.6", - "@typescript-eslint/types": "5.30.6", - "@typescript-eslint/typescript-estree": "5.30.6", - "eslint-scope": "^5.1.1", - "eslint-utils": "^3.0.0" - }, - "dependencies": { - "eslint-scope": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-5.1.1.tgz", - "integrity": "sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw==", - "requires": { - "esrecurse": "^4.3.0", - "estraverse": "^4.1.1" - } - }, - "estraverse": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.3.0.tgz", - "integrity": "sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==" - } - } - }, - "@typescript-eslint/visitor-keys": { - "version": "5.30.6", - "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-5.30.6.tgz", - "integrity": "sha512-41OiCjdL2mCaSDi2SvYbzFLlqqlm5v1ZW9Ym55wXKL/Rx6OOB1IbuFGo71Fj6Xy90gJDFTlgOS+vbmtGHPTQQA==", - "requires": { - "@typescript-eslint/types": "5.30.6", - "eslint-visitor-keys": "^3.3.0" - } - }, - "@webassemblyjs/ast": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/ast/-/ast-1.11.1.tgz", - "integrity": "sha512-ukBh14qFLjxTQNTXocdyksN5QdM28S1CxHt2rdskFyL+xFV7VremuBLVbmCePj+URalXBENx/9Lm7lnhihtCSw==", - "requires": { - "@webassemblyjs/helper-numbers": "1.11.1", - "@webassemblyjs/helper-wasm-bytecode": "1.11.1" - } - }, - "@webassemblyjs/floating-point-hex-parser": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/floating-point-hex-parser/-/floating-point-hex-parser-1.11.1.tgz", - "integrity": "sha512-iGRfyc5Bq+NnNuX8b5hwBrRjzf0ocrJPI6GWFodBFzmFnyvrQ83SHKhmilCU/8Jv67i4GJZBMhEzltxzcNagtQ==" - }, - "@webassemblyjs/helper-api-error": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-api-error/-/helper-api-error-1.11.1.tgz", - "integrity": "sha512-RlhS8CBCXfRUR/cwo2ho9bkheSXG0+NwooXcc3PAILALf2QLdFyj7KGsKRbVc95hZnhnERon4kW/D3SZpp6Tcg==" - }, - "@webassemblyjs/helper-buffer": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-buffer/-/helper-buffer-1.11.1.tgz", - "integrity": "sha512-gwikF65aDNeeXa8JxXa2BAk+REjSyhrNC9ZwdT0f8jc4dQQeDQ7G4m0f2QCLPJiMTTO6wfDmRmj/pW0PsUvIcA==" - }, - "@webassemblyjs/helper-numbers": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-numbers/-/helper-numbers-1.11.1.tgz", - "integrity": "sha512-vDkbxiB8zfnPdNK9Rajcey5C0w+QJugEglN0of+kmO8l7lDb77AnlKYQF7aarZuCrv+l0UvqL+68gSDr3k9LPQ==", - "requires": { - "@webassemblyjs/floating-point-hex-parser": "1.11.1", - "@webassemblyjs/helper-api-error": "1.11.1", - "@xtuc/long": "4.2.2" - } - }, - "@webassemblyjs/helper-wasm-bytecode": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-bytecode/-/helper-wasm-bytecode-1.11.1.tgz", - "integrity": "sha512-PvpoOGiJwXeTrSf/qfudJhwlvDQxFgelbMqtq52WWiXC6Xgg1IREdngmPN3bs4RoO83PnL/nFrxucXj1+BX62Q==" - }, - "@webassemblyjs/helper-wasm-section": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-section/-/helper-wasm-section-1.11.1.tgz", - "integrity": "sha512-10P9No29rYX1j7F3EVPX3JvGPQPae+AomuSTPiF9eBQeChHI6iqjMIwR9JmOJXwpnn/oVGDk7I5IlskuMwU/pg==", - "requires": { - "@webassemblyjs/ast": "1.11.1", - "@webassemblyjs/helper-buffer": "1.11.1", - "@webassemblyjs/helper-wasm-bytecode": "1.11.1", - "@webassemblyjs/wasm-gen": "1.11.1" - } - }, - "@webassemblyjs/ieee754": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/ieee754/-/ieee754-1.11.1.tgz", - "integrity": "sha512-hJ87QIPtAMKbFq6CGTkZYJivEwZDbQUgYd3qKSadTNOhVY7p+gfP6Sr0lLRVTaG1JjFj+r3YchoqRYxNH3M0GQ==", - "requires": { - "@xtuc/ieee754": "^1.2.0" - } - }, - "@webassemblyjs/leb128": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/leb128/-/leb128-1.11.1.tgz", - "integrity": "sha512-BJ2P0hNZ0u+Th1YZXJpzW6miwqQUGcIHT1G/sf72gLVD9DZ5AdYTqPNbHZh6K1M5VmKvFXwGSWZADz+qBWxeRw==", - "requires": { - "@xtuc/long": "4.2.2" - } - }, - "@webassemblyjs/utf8": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/utf8/-/utf8-1.11.1.tgz", - "integrity": "sha512-9kqcxAEdMhiwQkHpkNiorZzqpGrodQQ2IGrHHxCy+Ozng0ofyMA0lTqiLkVs1uzTRejX+/O0EOT7KxqVPuXosQ==" - }, - "@webassemblyjs/wasm-edit": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-edit/-/wasm-edit-1.11.1.tgz", - "integrity": "sha512-g+RsupUC1aTHfR8CDgnsVRVZFJqdkFHpsHMfJuWQzWU3tvnLC07UqHICfP+4XyL2tnr1amvl1Sdp06TnYCmVkA==", - "requires": { - "@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" - } - }, - "@webassemblyjs/wasm-gen": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-gen/-/wasm-gen-1.11.1.tgz", - "integrity": "sha512-F7QqKXwwNlMmsulj6+O7r4mmtAlCWfO/0HdgOxSklZfQcDu0TpLiD1mRt/zF25Bk59FIjEuGAIyn5ei4yMfLhA==", - "requires": { - "@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" - } - }, - "@webassemblyjs/wasm-opt": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-opt/-/wasm-opt-1.11.1.tgz", - "integrity": "sha512-VqnkNqnZlU5EB64pp1l7hdm3hmQw7Vgqa0KF/KCNO9sIpI6Fk6brDEiX+iCOYrvMuBWDws0NkTOxYEb85XQHHw==", - "requires": { - "@webassemblyjs/ast": "1.11.1", - "@webassemblyjs/helper-buffer": "1.11.1", - "@webassemblyjs/wasm-gen": "1.11.1", - "@webassemblyjs/wasm-parser": "1.11.1" - } - }, - "@webassemblyjs/wasm-parser": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-parser/-/wasm-parser-1.11.1.tgz", - "integrity": "sha512-rrBujw+dJu32gYB7/Lup6UhdkPx9S9SnobZzRVL7VcBH9Bt9bCBLEuX/YXOOtBsOZ4NQrRykKhffRWHvigQvOA==", - "requires": { - "@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" - } - }, - "@webassemblyjs/wast-printer": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wast-printer/-/wast-printer-1.11.1.tgz", - "integrity": "sha512-IQboUWM4eKzWW+N/jij2sRatKMh99QEelo3Eb2q0qXkvPRISAj8Qxtmw5itwqK+TTkBuUIE45AxYPToqPtL5gg==", - "requires": { - "@webassemblyjs/ast": "1.11.1", - "@xtuc/long": "4.2.2" - } - }, - "@xtuc/ieee754": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/@xtuc/ieee754/-/ieee754-1.2.0.tgz", - "integrity": "sha512-DX8nKgqcGwsc0eJSqYt5lwP4DH5FlHnmuWWBRy7X0NcaGR0ZtuyeESgMwTYVEtxmsNGY+qit4QYT/MIYTOTPeA==" - }, - "@xtuc/long": { - "version": "4.2.2", - "resolved": "https://registry.npmjs.org/@xtuc/long/-/long-4.2.2.tgz", - "integrity": "sha512-NuHqBY1PB/D8xU6s/thBgOAiAP7HOYDQ32+BFZILJ8ivkUkAHQnWfn6WhL79Owj1qmUnoN/YPhktdIoucipkAQ==" - }, - "abab": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/abab/-/abab-2.0.6.tgz", - "integrity": "sha512-j2afSsaIENvHZN2B8GOpF566vZ5WVk5opAiMTvWgaQT8DkbOqsTfvNAvHoRGU2zzP8cPoqys+xHTRDWW8L+/BA==" - }, - "accepts": { - "version": "1.3.8", - "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.8.tgz", - "integrity": "sha512-PYAthTa2m2VKxuvSD3DPC/Gy+U+sOA1LAuT8mkmRuvw+NACSaeXEQ+NHcVF7rONl6qcaxV3Uuemwawk+7+SJLw==", - "requires": { - "mime-types": "~2.1.34", - "negotiator": "0.6.3" - } - }, - "acorn": { - "version": "8.7.1", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.7.1.tgz", - "integrity": "sha512-Xx54uLJQZ19lKygFXOWsscKUbsBZW0CPykPhVQdhIeIwrbPmJzqeASDInc8nKBnp/JT6igTs82qPXz069H8I/A==" - }, - "acorn-globals": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/acorn-globals/-/acorn-globals-6.0.0.tgz", - "integrity": "sha512-ZQl7LOWaF5ePqqcX4hLuv/bLXYQNfNWw2c0/yX/TsPRKamzHcTGQnlCjHT3TsmkOUVEPS3crCxiPfdzE/Trlhg==", - "requires": { - "acorn": "^7.1.1", - "acorn-walk": "^7.1.1" - }, - "dependencies": { - "acorn": { - "version": "7.4.1", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-7.4.1.tgz", - "integrity": "sha512-nQyp0o1/mNdbTO1PO6kHkwSrmgZ0MT/jCCpNiwbUjGoRN4dlBhqJtoQuCnEOKzgTVwg0ZWiCoQy6SxMebQVh8A==" - } - } - }, - "acorn-import-assertions": { - "version": "1.8.0", - "resolved": "https://registry.npmjs.org/acorn-import-assertions/-/acorn-import-assertions-1.8.0.tgz", - "integrity": "sha512-m7VZ3jwz4eK6A4Vtt8Ew1/mNbP24u0FhdyfA7fSvnJR6LMdfOYnmuIrrJAgrYfYJ10F/otaHTtrtrtmHdMNzEw==", - "requires": {} - }, - "acorn-jsx": { - "version": "5.3.2", - "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.2.tgz", - "integrity": "sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==", - "requires": {} - }, - "acorn-node": { - "version": "1.8.2", - "resolved": "https://registry.npmjs.org/acorn-node/-/acorn-node-1.8.2.tgz", - "integrity": "sha512-8mt+fslDufLYntIoPAaIMUe/lrbrehIiwmR3t2k9LljIzoigEPF27eLk2hy8zSGzmR/ogr7zbRKINMo1u0yh5A==", - "requires": { - "acorn": "^7.0.0", - "acorn-walk": "^7.0.0", - "xtend": "^4.0.2" - }, - "dependencies": { - "acorn": { - "version": "7.4.1", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-7.4.1.tgz", - "integrity": "sha512-nQyp0o1/mNdbTO1PO6kHkwSrmgZ0MT/jCCpNiwbUjGoRN4dlBhqJtoQuCnEOKzgTVwg0ZWiCoQy6SxMebQVh8A==" - } - } - }, - "acorn-walk": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/acorn-walk/-/acorn-walk-7.2.0.tgz", - "integrity": "sha512-OPdCF6GsMIP+Az+aWfAAOEt2/+iVDKE7oy6lJ098aoe59oAmK76qV6Gw60SbZ8jHuG2wH058GF4pLFbYamYrVA==" - }, - "address": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/address/-/address-1.2.0.tgz", - "integrity": "sha512-tNEZYz5G/zYunxFm7sfhAxkXEuLj3K6BKwv6ZURlsF6yiUQ65z0Q2wZW9L5cPUl9ocofGvXOdFYbFHp0+6MOig==" - }, - "adjust-sourcemap-loader": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/adjust-sourcemap-loader/-/adjust-sourcemap-loader-4.0.0.tgz", - "integrity": "sha512-OXwN5b9pCUXNQHJpwwD2qP40byEmSgzj8B4ydSN0uMNYWiFmJ6x6KwUllMmfk8Rwu/HJDFR7U8ubsWBoN0Xp0A==", - "requires": { - "loader-utils": "^2.0.0", - "regex-parser": "^2.2.11" - } - }, - "agent-base": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-6.0.2.tgz", - "integrity": "sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ==", - "requires": { - "debug": "4" - } - }, - "ajv": { - "version": "6.12.6", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", - "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", - "requires": { - "fast-deep-equal": "^3.1.1", - "fast-json-stable-stringify": "^2.0.0", - "json-schema-traverse": "^0.4.1", - "uri-js": "^4.2.2" - } - }, - "ajv-formats": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/ajv-formats/-/ajv-formats-2.1.1.tgz", - "integrity": "sha512-Wx0Kx52hxE7C18hkMEggYlEifqWZtYaRgouJor+WMdPnQyEK13vgEWyVNup7SoeeoLMsr4kf5h6dOW11I15MUA==", - "requires": { - "ajv": "^8.0.0" - }, - "dependencies": { - "ajv": { - "version": "8.11.0", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.11.0.tgz", - "integrity": "sha512-wGgprdCvMalC0BztXvitD2hC04YffAvtsUn93JbGXYLAtCUO4xd17mCCZQxUOItiBwZvJScWo8NIvQMQ71rdpg==", - "requires": { - "fast-deep-equal": "^3.1.1", - "json-schema-traverse": "^1.0.0", - "require-from-string": "^2.0.2", - "uri-js": "^4.2.2" - } - }, - "json-schema-traverse": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", - "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==" - } - } - }, - "ajv-keywords": { - "version": "3.5.2", - "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-3.5.2.tgz", - "integrity": "sha512-5p6WTN0DdTGVQk6VjcEju19IgaHudalcfabD7yhDGeA6bcQnmL+CpveLJq/3hvfwd1aof6L386Ougkx6RfyMIQ==", - "requires": {} - }, - "ansi-escapes": { - "version": "4.3.2", - "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-4.3.2.tgz", - "integrity": "sha512-gKXj5ALrKWQLsYG9jlTRmR/xKluxHV+Z9QEwNIgCfM1/uwPMCuzVVnh5mwTd+OuBZcwSIMbqssNWRm1lE51QaQ==", - "requires": { - "type-fest": "^0.21.3" - } - }, - "ansi-html-community": { - "version": "0.0.8", - "resolved": "https://registry.npmjs.org/ansi-html-community/-/ansi-html-community-0.0.8.tgz", - "integrity": "sha512-1APHAyr3+PCamwNw3bXCPp4HFLONZt/yIH0sZp0/469KWNTEy+qN5jQ3GVX6DMZ1UXAi34yVwtTeaG/HpBuuzw==" - }, - "ansi-regex": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", - "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==" - }, - "ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "requires": { - "color-convert": "^1.9.0" - } - }, - "anymatch": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.2.tgz", - "integrity": "sha512-P43ePfOAIupkguHUycrc4qJ9kz8ZiuOUijaETwX7THt0Y/GNK7v0aa8rY816xWjZ7rJdA5XdMcpVFTKMq+RvWg==", - "requires": { - "normalize-path": "^3.0.0", - "picomatch": "^2.0.4" - } - }, - "arg": { - "version": "5.0.2", - "resolved": "https://registry.npmjs.org/arg/-/arg-5.0.2.tgz", - "integrity": "sha512-PYjyFOLKQ9y57JvQ6QLo8dAgNqswh8M1RMJYdQduT6xbWSgK36P/Z/v+p888pM69jMMfS8Xd8F6I1kQ/I9HUGg==" - }, - "argparse": { - "version": "1.0.10", - "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", - "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", - "requires": { - "sprintf-js": "~1.0.2" - } - }, - "aria-query": { - "version": "4.2.2", - "resolved": "https://registry.npmjs.org/aria-query/-/aria-query-4.2.2.tgz", - "integrity": "sha512-o/HelwhuKpTj/frsOsbNLNgnNGVIFsVP/SW2BSF14gVl7kAfMOJ6/8wUAUvG1R1NHKrfG+2sHZTu0yauT1qBrA==", - "requires": { - "@babel/runtime": "^7.10.2", - "@babel/runtime-corejs3": "^7.10.2" - } - }, - "array-flatten": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-2.1.2.tgz", - "integrity": "sha512-hNfzcOV8W4NdualtqBFPyVO+54DSJuZGY9qT4pRroB6S9e3iiido2ISIC5h9R2sPJ8H3FHCIiEnsv1lPXO3KtQ==" - }, - "array-includes": { - "version": "3.1.5", - "resolved": "https://registry.npmjs.org/array-includes/-/array-includes-3.1.5.tgz", - "integrity": "sha512-iSDYZMMyTPkiFasVqfuAQnWAYcvO/SeBSCGKePoEthjp4LEMTe4uLc7b025o4jAZpHhihh8xPo99TNWUWWkGDQ==", - "requires": { - "call-bind": "^1.0.2", - "define-properties": "^1.1.4", - "es-abstract": "^1.19.5", - "get-intrinsic": "^1.1.1", - "is-string": "^1.0.7" - } - }, - "array-union": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/array-union/-/array-union-2.1.0.tgz", - "integrity": "sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==" - }, - "array.prototype.flat": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/array.prototype.flat/-/array.prototype.flat-1.3.0.tgz", - "integrity": "sha512-12IUEkHsAhA4DY5s0FPgNXIdc8VRSqD9Zp78a5au9abH/SOBrsp082JOWFNTjkMozh8mqcdiKuaLGhPeYztxSw==", - "requires": { - "call-bind": "^1.0.2", - "define-properties": "^1.1.3", - "es-abstract": "^1.19.2", - "es-shim-unscopables": "^1.0.0" - } - }, - "array.prototype.flatmap": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/array.prototype.flatmap/-/array.prototype.flatmap-1.3.0.tgz", - "integrity": "sha512-PZC9/8TKAIxcWKdyeb77EzULHPrIX/tIZebLJUQOMR1OwYosT8yggdfWScfTBCDj5utONvOuPQQumYsU2ULbkg==", - "requires": { - "call-bind": "^1.0.2", - "define-properties": "^1.1.3", - "es-abstract": "^1.19.2", - "es-shim-unscopables": "^1.0.0" - } - }, - "array.prototype.reduce": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/array.prototype.reduce/-/array.prototype.reduce-1.0.4.tgz", - "integrity": "sha512-WnM+AjG/DvLRLo4DDl+r+SvCzYtD2Jd9oeBYMcEaI7t3fFrHY9M53/wdLcTvmZNQ70IU6Htj0emFkZ5TS+lrdw==", - "requires": { - "call-bind": "^1.0.2", - "define-properties": "^1.1.3", - "es-abstract": "^1.19.2", - "es-array-method-boxes-properly": "^1.0.0", - "is-string": "^1.0.7" - } - }, - "asap": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/asap/-/asap-2.0.6.tgz", - "integrity": "sha512-BSHWgDSAiKs50o2Re8ppvp3seVHXSRM44cdSsT9FfNEUUZLOGWVCsiWaRPWM1Znn+mqZ1OfVZ3z3DWEzSp7hRA==" - }, - "ast-types-flow": { - "version": "0.0.7", - "resolved": "https://registry.npmjs.org/ast-types-flow/-/ast-types-flow-0.0.7.tgz", - "integrity": "sha512-eBvWn1lvIApYMhzQMsu9ciLfkBY499mFZlNqG+/9WR7PVlroQw0vG30cOQQbaKz3sCEc44TAOu2ykzqXSNnwag==" - }, - "async": { - "version": "3.2.4", - "resolved": "https://registry.npmjs.org/async/-/async-3.2.4.tgz", - "integrity": "sha512-iAB+JbDEGXhyIUavoDl9WP/Jj106Kz9DEn1DPgYw5ruDn0e3Wgi3sKFm55sASdGBNOQB8F59d9qQ7deqrHA8wQ==" - }, - "asynckit": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", - "integrity": "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==" - }, - "at-least-node": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/at-least-node/-/at-least-node-1.0.0.tgz", - "integrity": "sha512-+q/t7Ekv1EDY2l6Gda6LLiX14rU9TV20Wa3ofeQmwPFZbOMo9DXrLbOjFaaclkXKWidIaopwAObQDqwWtGUjqg==" - }, - "atob": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/atob/-/atob-2.1.2.tgz", - "integrity": "sha512-Wm6ukoaOGJi/73p/cl2GvLjTI5JM1k/O14isD73YML8StrH/7/lRFgmg8nICZgD3bZZvjwCGxtMOD3wWNAu8cg==" - }, - "autoprefixer": { - "version": "10.4.7", - "resolved": "https://registry.npmjs.org/autoprefixer/-/autoprefixer-10.4.7.tgz", - "integrity": "sha512-ypHju4Y2Oav95SipEcCcI5J7CGPuvz8oat7sUtYj3ClK44bldfvtvcxK6IEK++7rqB7YchDGzweZIBG+SD0ZAA==", - "requires": { - "browserslist": "^4.20.3", - "caniuse-lite": "^1.0.30001335", - "fraction.js": "^4.2.0", - "normalize-range": "^0.1.2", - "picocolors": "^1.0.0", - "postcss-value-parser": "^4.2.0" - } - }, - "axe-core": { - "version": "4.4.2", - "resolved": "https://registry.npmjs.org/axe-core/-/axe-core-4.4.2.tgz", - "integrity": "sha512-LVAaGp/wkkgYJcjmHsoKx4juT1aQvJyPcW09MLCjVTh3V2cc6PnyempiLMNH5iMdfIX/zdbjUx2KDjMLCTdPeA==" - }, - "axobject-query": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/axobject-query/-/axobject-query-2.2.0.tgz", - "integrity": "sha512-Td525n+iPOOyUQIeBfcASuG6uJsDOITl7Mds5gFyerkWiX7qhUTdYUBlSgNMyVqtSJqwpt1kXGLdUt6SykLMRA==" - }, - "babel-jest": { - "version": "27.5.1", - "resolved": "https://registry.npmjs.org/babel-jest/-/babel-jest-27.5.1.tgz", - "integrity": "sha512-cdQ5dXjGRd0IBRATiQ4mZGlGlRE8kJpjPOixdNRdT+m3UcNqmYWN6rK6nvtXYfY3D76cb8s/O1Ss8ea24PIwcg==", - "requires": { - "@jest/transform": "^27.5.1", - "@jest/types": "^27.5.1", - "@types/babel__core": "^7.1.14", - "babel-plugin-istanbul": "^6.1.1", - "babel-preset-jest": "^27.5.1", - "chalk": "^4.0.0", - "graceful-fs": "^4.2.9", - "slash": "^3.0.0" - }, - "dependencies": { - "ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "requires": { - "color-convert": "^2.0.1" - } - }, - "chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", - "requires": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - } - }, - "color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "requires": { - "color-name": "~1.1.4" - } - }, - "color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" - }, - "has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==" - }, - "supports-color": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", - "requires": { - "has-flag": "^4.0.0" - } - } - } - }, - "babel-loader": { - "version": "8.2.5", - "resolved": "https://registry.npmjs.org/babel-loader/-/babel-loader-8.2.5.tgz", - "integrity": "sha512-OSiFfH89LrEMiWd4pLNqGz4CwJDtbs2ZVc+iGu2HrkRfPxId9F2anQj38IxWpmRfsUY0aBZYi1EFcd3mhtRMLQ==", - "requires": { - "find-cache-dir": "^3.3.1", - "loader-utils": "^2.0.0", - "make-dir": "^3.1.0", - "schema-utils": "^2.6.5" - }, - "dependencies": { - "schema-utils": { - "version": "2.7.1", - "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-2.7.1.tgz", - "integrity": "sha512-SHiNtMOUGWBQJwzISiVYKu82GiV4QYGePp3odlY1tuKO7gPtphAT5R/py0fA6xtbgLL/RvtJZnU9b8s0F1q0Xg==", - "requires": { - "@types/json-schema": "^7.0.5", - "ajv": "^6.12.4", - "ajv-keywords": "^3.5.2" - } - } - } - }, - "babel-plugin-dynamic-import-node": { - "version": "2.3.3", - "resolved": "https://registry.npmjs.org/babel-plugin-dynamic-import-node/-/babel-plugin-dynamic-import-node-2.3.3.tgz", - "integrity": "sha512-jZVI+s9Zg3IqA/kdi0i6UDCybUI3aSBLnglhYbSSjKlV7yF1F/5LWv8MakQmvYpnbJDS6fcBL2KzHSxNCMtWSQ==", - "requires": { - "object.assign": "^4.1.0" - } - }, - "babel-plugin-istanbul": { - "version": "6.1.1", - "resolved": "https://registry.npmjs.org/babel-plugin-istanbul/-/babel-plugin-istanbul-6.1.1.tgz", - "integrity": "sha512-Y1IQok9821cC9onCx5otgFfRm7Lm+I+wwxOx738M/WLPZ9Q42m4IG5W0FNX8WLL2gYMZo3JkuXIH2DOpWM+qwA==", - "requires": { - "@babel/helper-plugin-utils": "^7.0.0", - "@istanbuljs/load-nyc-config": "^1.0.0", - "@istanbuljs/schema": "^0.1.2", - "istanbul-lib-instrument": "^5.0.4", - "test-exclude": "^6.0.0" - } - }, - "babel-plugin-jest-hoist": { - "version": "27.5.1", - "resolved": "https://registry.npmjs.org/babel-plugin-jest-hoist/-/babel-plugin-jest-hoist-27.5.1.tgz", - "integrity": "sha512-50wCwD5EMNW4aRpOwtqzyZHIewTYNxLA4nhB+09d8BIssfNfzBRhkBIHiaPv1Si226TQSvp8gxAJm2iY2qs2hQ==", - "requires": { - "@babel/template": "^7.3.3", - "@babel/types": "^7.3.3", - "@types/babel__core": "^7.0.0", - "@types/babel__traverse": "^7.0.6" - } - }, - "babel-plugin-macros": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/babel-plugin-macros/-/babel-plugin-macros-3.1.0.tgz", - "integrity": "sha512-Cg7TFGpIr01vOQNODXOOaGz2NpCU5gl8x1qJFbb6hbZxR7XrcE2vtbAsTAbJ7/xwJtUuJEw8K8Zr/AE0LHlesg==", - "requires": { - "@babel/runtime": "^7.12.5", - "cosmiconfig": "^7.0.0", - "resolve": "^1.19.0" - } - }, - "babel-plugin-named-asset-import": { - "version": "0.3.8", - "resolved": "https://registry.npmjs.org/babel-plugin-named-asset-import/-/babel-plugin-named-asset-import-0.3.8.tgz", - "integrity": "sha512-WXiAc++qo7XcJ1ZnTYGtLxmBCVbddAml3CEXgWaBzNzLNoxtQ8AiGEFDMOhot9XjTCQbvP5E77Fj9Gk924f00Q==", - "requires": {} - }, - "babel-plugin-polyfill-corejs2": { - "version": "0.3.1", - "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-corejs2/-/babel-plugin-polyfill-corejs2-0.3.1.tgz", - "integrity": "sha512-v7/T6EQcNfVLfcN2X8Lulb7DjprieyLWJK/zOWH5DUYcAgex9sP3h25Q+DLsX9TloXe3y1O8l2q2Jv9q8UVB9w==", - "requires": { - "@babel/compat-data": "^7.13.11", - "@babel/helper-define-polyfill-provider": "^0.3.1", - "semver": "^6.1.1" - }, - "dependencies": { - "semver": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", - "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==" - } - } - }, - "babel-plugin-polyfill-corejs3": { - "version": "0.5.2", - "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-corejs3/-/babel-plugin-polyfill-corejs3-0.5.2.tgz", - "integrity": "sha512-G3uJih0XWiID451fpeFaYGVuxHEjzKTHtc9uGFEjR6hHrvNzeS/PX+LLLcetJcytsB5m4j+K3o/EpXJNb/5IEQ==", - "requires": { - "@babel/helper-define-polyfill-provider": "^0.3.1", - "core-js-compat": "^3.21.0" - } - }, - "babel-plugin-polyfill-regenerator": { - "version": "0.3.1", - "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-regenerator/-/babel-plugin-polyfill-regenerator-0.3.1.tgz", - "integrity": "sha512-Y2B06tvgHYt1x0yz17jGkGeeMr5FeKUu+ASJ+N6nB5lQ8Dapfg42i0OVrf8PNGJ3zKL4A23snMi1IRwrqqND7A==", - "requires": { - "@babel/helper-define-polyfill-provider": "^0.3.1" - } - }, - "babel-plugin-transform-react-remove-prop-types": { - "version": "0.4.24", - "resolved": "https://registry.npmjs.org/babel-plugin-transform-react-remove-prop-types/-/babel-plugin-transform-react-remove-prop-types-0.4.24.tgz", - "integrity": "sha512-eqj0hVcJUR57/Ug2zE1Yswsw4LhuqqHhD+8v120T1cl3kjg76QwtyBrdIk4WVwK+lAhBJVYCd/v+4nc4y+8JsA==" - }, - "babel-preset-current-node-syntax": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/babel-preset-current-node-syntax/-/babel-preset-current-node-syntax-1.0.1.tgz", - "integrity": "sha512-M7LQ0bxarkxQoN+vz5aJPsLBn77n8QgTFmo8WK0/44auK2xlCXrYcUxHFxgU7qW5Yzw/CjmLRK2uJzaCd7LvqQ==", - "requires": { - "@babel/plugin-syntax-async-generators": "^7.8.4", - "@babel/plugin-syntax-bigint": "^7.8.3", - "@babel/plugin-syntax-class-properties": "^7.8.3", - "@babel/plugin-syntax-import-meta": "^7.8.3", - "@babel/plugin-syntax-json-strings": "^7.8.3", - "@babel/plugin-syntax-logical-assignment-operators": "^7.8.3", - "@babel/plugin-syntax-nullish-coalescing-operator": "^7.8.3", - "@babel/plugin-syntax-numeric-separator": "^7.8.3", - "@babel/plugin-syntax-object-rest-spread": "^7.8.3", - "@babel/plugin-syntax-optional-catch-binding": "^7.8.3", - "@babel/plugin-syntax-optional-chaining": "^7.8.3", - "@babel/plugin-syntax-top-level-await": "^7.8.3" - } - }, - "babel-preset-jest": { - "version": "27.5.1", - "resolved": "https://registry.npmjs.org/babel-preset-jest/-/babel-preset-jest-27.5.1.tgz", - "integrity": "sha512-Nptf2FzlPCWYuJg41HBqXVT8ym6bXOevuCTbhxlUpjwtysGaIWFvDEjp4y+G7fl13FgOdjs7P/DmErqH7da0Ag==", - "requires": { - "babel-plugin-jest-hoist": "^27.5.1", - "babel-preset-current-node-syntax": "^1.0.0" - } - }, - "babel-preset-react-app": { - "version": "10.0.1", - "resolved": "https://registry.npmjs.org/babel-preset-react-app/-/babel-preset-react-app-10.0.1.tgz", - "integrity": "sha512-b0D9IZ1WhhCWkrTXyFuIIgqGzSkRIH5D5AmB0bXbzYAB1OBAwHcUeyWW2LorutLWF5btNo/N7r/cIdmvvKJlYg==", - "requires": { - "@babel/core": "^7.16.0", - "@babel/plugin-proposal-class-properties": "^7.16.0", - "@babel/plugin-proposal-decorators": "^7.16.4", - "@babel/plugin-proposal-nullish-coalescing-operator": "^7.16.0", - "@babel/plugin-proposal-numeric-separator": "^7.16.0", - "@babel/plugin-proposal-optional-chaining": "^7.16.0", - "@babel/plugin-proposal-private-methods": "^7.16.0", - "@babel/plugin-transform-flow-strip-types": "^7.16.0", - "@babel/plugin-transform-react-display-name": "^7.16.0", - "@babel/plugin-transform-runtime": "^7.16.4", - "@babel/preset-env": "^7.16.4", - "@babel/preset-react": "^7.16.0", - "@babel/preset-typescript": "^7.16.0", - "@babel/runtime": "^7.16.3", - "babel-plugin-macros": "^3.1.0", - "babel-plugin-transform-react-remove-prop-types": "^0.4.24" - } - }, - "balanced-match": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", - "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==" - }, - "batch": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/batch/-/batch-0.6.1.tgz", - "integrity": "sha512-x+VAiMRL6UPkx+kudNvxTl6hB2XNNCG2r+7wixVfIYwu/2HKRXimwQyaumLjMveWvT2Hkd/cAJw+QBMfJ/EKVw==" - }, - "bfj": { - "version": "7.0.2", - "resolved": "https://registry.npmjs.org/bfj/-/bfj-7.0.2.tgz", - "integrity": "sha512-+e/UqUzwmzJamNF50tBV6tZPTORow7gQ96iFow+8b562OdMpEK0BcJEq2OSPEDmAbSMBQ7PKZ87ubFkgxpYWgw==", - "requires": { - "bluebird": "^3.5.5", - "check-types": "^11.1.1", - "hoopy": "^0.1.4", - "tryer": "^1.0.1" - } - }, - "big.js": { - "version": "5.2.2", - "resolved": "https://registry.npmjs.org/big.js/-/big.js-5.2.2.tgz", - "integrity": "sha512-vyL2OymJxmarO8gxMr0mhChsO9QGwhynfuu4+MHTAW6czfq9humCB7rKpUjDd9YUiDPU4mzpyupFSvOClAwbmQ==" - }, - "binary-extensions": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.2.0.tgz", - "integrity": "sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA==" - }, - "bluebird": { - "version": "3.7.2", - "resolved": "https://registry.npmjs.org/bluebird/-/bluebird-3.7.2.tgz", - "integrity": "sha512-XpNj6GDQzdfW+r2Wnn7xiSAd7TM3jzkxGXBGTtWKuSXv1xUV+azxAm8jdWZN06QTQk+2N2XB9jRDkvbmQmcRtg==" - }, - "body-parser": { - "version": "1.20.0", - "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.20.0.tgz", - "integrity": "sha512-DfJ+q6EPcGKZD1QWUjSpqp+Q7bDQTsQIF4zfUAtZ6qk+H/3/QRhg9CEp39ss+/T2vw0+HaidC0ecJj/DRLIaKg==", - "requires": { - "bytes": "3.1.2", - "content-type": "~1.0.4", - "debug": "2.6.9", - "depd": "2.0.0", - "destroy": "1.2.0", - "http-errors": "2.0.0", - "iconv-lite": "0.4.24", - "on-finished": "2.4.1", - "qs": "6.10.3", - "raw-body": "2.5.1", - "type-is": "~1.6.18", - "unpipe": "1.0.0" - }, - "dependencies": { - "bytes": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.2.tgz", - "integrity": "sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==" - }, - "debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", - "requires": { - "ms": "2.0.0" - } - }, - "iconv-lite": { - "version": "0.4.24", - "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", - "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", - "requires": { - "safer-buffer": ">= 2.1.2 < 3" - } - }, - "ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==" - } - } - }, - "bonjour-service": { - "version": "1.0.13", - "resolved": "https://registry.npmjs.org/bonjour-service/-/bonjour-service-1.0.13.tgz", - "integrity": "sha512-LWKRU/7EqDUC9CTAQtuZl5HzBALoCYwtLhffW3et7vZMwv3bWLpJf8bRYlMD5OCcDpTfnPgNCV4yo9ZIaJGMiA==", - "requires": { - "array-flatten": "^2.1.2", - "dns-equal": "^1.0.0", - "fast-deep-equal": "^3.1.3", - "multicast-dns": "^7.2.5" - } - }, - "boolbase": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/boolbase/-/boolbase-1.0.0.tgz", - "integrity": "sha512-JZOSA7Mo9sNGB8+UjSgzdLtokWAky1zbztM3WRLCbZ70/3cTANmQmOdR7y2g+J0e2WXywy1yS468tY+IruqEww==" - }, - "brace-expansion": { - "version": "1.1.11", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", - "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", - "requires": { - "balanced-match": "^1.0.0", - "concat-map": "0.0.1" - } - }, - "braces": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", - "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", - "requires": { - "fill-range": "^7.0.1" - } - }, - "browser-process-hrtime": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/browser-process-hrtime/-/browser-process-hrtime-1.0.0.tgz", - "integrity": "sha512-9o5UecI3GhkpM6DrXr69PblIuWxPKk9Y0jHBRhdocZ2y7YECBFCsHm79Pr3OyR2AvjhDkabFJaDJMYRazHgsow==" - }, - "browserslist": { - "version": "4.21.1", - "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.21.1.tgz", - "integrity": "sha512-Nq8MFCSrnJXSc88yliwlzQe3qNe3VntIjhsArW9IJOEPSHNx23FalwApUVbzAWABLhYJJ7y8AynWI/XM8OdfjQ==", - "requires": { - "caniuse-lite": "^1.0.30001359", - "electron-to-chromium": "^1.4.172", - "node-releases": "^2.0.5", - "update-browserslist-db": "^1.0.4" - } - }, - "bser": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/bser/-/bser-2.1.1.tgz", - "integrity": "sha512-gQxTNE/GAfIIrmHLUE3oJyp5FO6HRBfhjnw4/wMmA63ZGDJnWBmgY/lyQBpnDUkGmAhbSe39tx2d/iTOAfglwQ==", - "requires": { - "node-int64": "^0.4.0" - } - }, - "buffer-from": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.2.tgz", - "integrity": "sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==" - }, - "builtin-modules": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/builtin-modules/-/builtin-modules-3.3.0.tgz", - "integrity": "sha512-zhaCDicdLuWN5UbN5IMnFqNMhNfo919sH85y2/ea+5Yg9TsTkeZxpL+JLbp6cgYFS4sRLp3YV4S6yDuqVWHYOw==" - }, - "bytes": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.0.0.tgz", - "integrity": "sha512-pMhOfFDPiv9t5jjIXkHosWmkSyQbvsgEVNkz0ERHbuLh2T/7j4Mqqpz523Fe8MVY89KC6Sh/QfS2sM+SjgFDcw==" - }, - "call-bind": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.2.tgz", - "integrity": "sha512-7O+FbCihrB5WGbFYesctwmTKae6rOiIzmz1icreWJ+0aA7LJfuqhEso2T9ncpcFtzMQtzXf2QGGueWJGTYsqrA==", - "requires": { - "function-bind": "^1.1.1", - "get-intrinsic": "^1.0.2" - } - }, - "callsites": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", - "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==" - }, - "camel-case": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/camel-case/-/camel-case-4.1.2.tgz", - "integrity": "sha512-gxGWBrTT1JuMx6R+o5PTXMmUnhnVzLQ9SNutD4YqKtI6ap897t3tKECYla6gCWEkplXnlNybEkZg9GEGxKFCgw==", - "requires": { - "pascal-case": "^3.1.2", - "tslib": "^2.0.3" - } - }, - "camelcase": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-6.3.0.tgz", - "integrity": "sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA==" - }, - "camelcase-css": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/camelcase-css/-/camelcase-css-2.0.1.tgz", - "integrity": "sha512-QOSvevhslijgYwRx6Rv7zKdMF8lbRmx+uQGx2+vDc+KI/eBnsy9kit5aj23AgGu3pa4t9AgwbnXWqS+iOY+2aA==" - }, - "caniuse-api": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/caniuse-api/-/caniuse-api-3.0.0.tgz", - "integrity": "sha512-bsTwuIg/BZZK/vreVTYYbSWoe2F+71P7K5QGEX+pT250DZbfU1MQ5prOKpPR+LL6uWKK3KMwMCAS74QB3Um1uw==", - "requires": { - "browserslist": "^4.0.0", - "caniuse-lite": "^1.0.0", - "lodash.memoize": "^4.1.2", - "lodash.uniq": "^4.5.0" - } - }, - "caniuse-lite": { - "version": "1.0.30001365", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001365.tgz", - "integrity": "sha512-VDQZ8OtpuIPMBA4YYvZXECtXbddMCUFJk1qu8Mqxfm/SZJNSr1cy4IuLCOL7RJ/YASrvJcYg1Zh+UEUQ5m6z8Q==" - }, - "case-sensitive-paths-webpack-plugin": { - "version": "2.4.0", - "resolved": "https://registry.npmjs.org/case-sensitive-paths-webpack-plugin/-/case-sensitive-paths-webpack-plugin-2.4.0.tgz", - "integrity": "sha512-roIFONhcxog0JSSWbvVAh3OocukmSgpqOH6YpMkCvav/ySIV3JKg4Dc8vYtQjYi/UxpNE36r/9v+VqTQqgkYmw==" - }, - "chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", - "requires": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - } - }, - "char-regex": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/char-regex/-/char-regex-1.0.2.tgz", - "integrity": "sha512-kWWXztvZ5SBQV+eRgKFeh8q5sLuZY2+8WUIzlxWVTg+oGwY14qylx1KbKzHd8P6ZYkAg0xyIDU9JMHhyJMZ1jw==" - }, - "check-types": { - "version": "11.1.2", - "resolved": "https://registry.npmjs.org/check-types/-/check-types-11.1.2.tgz", - "integrity": "sha512-tzWzvgePgLORb9/3a0YenggReLKAIb2owL03H2Xdoe5pKcUyWRSEQ8xfCar8t2SIAuEDwtmx2da1YB52YuHQMQ==" - }, - "chokidar": { - "version": "3.5.3", - "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.5.3.tgz", - "integrity": "sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw==", - "requires": { - "anymatch": "~3.1.2", - "braces": "~3.0.2", - "fsevents": "~2.3.2", - "glob-parent": "~5.1.2", - "is-binary-path": "~2.1.0", - "is-glob": "~4.0.1", - "normalize-path": "~3.0.0", - "readdirp": "~3.6.0" - }, - "dependencies": { - "glob-parent": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", - "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", - "requires": { - "is-glob": "^4.0.1" - } - } - } - }, - "chrome-trace-event": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/chrome-trace-event/-/chrome-trace-event-1.0.3.tgz", - "integrity": "sha512-p3KULyQg4S7NIHixdwbGX+nFHkoBiA4YQmyWtjb8XngSKV124nJmRysgAeujbUVb15vh+RvFUfCPqU7rXk+hZg==" - }, - "ci-info": { - "version": "3.3.2", - "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-3.3.2.tgz", - "integrity": "sha512-xmDt/QIAdeZ9+nfdPsaBCpMvHNLFiLdjj59qjqn+6iPe6YmHGQ35sBnQ8uslRBXFmXkiZQOJRjvQeoGppoTjjg==" - }, - "cjs-module-lexer": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/cjs-module-lexer/-/cjs-module-lexer-1.2.2.tgz", - "integrity": "sha512-cOU9usZw8/dXIXKtwa8pM0OTJQuJkxMN6w30csNRUerHfeQ5R6U3kkU/FtJeIf3M202OHfY2U8ccInBG7/xogA==" - }, - "clean-css": { - "version": "5.3.0", - "resolved": "https://registry.npmjs.org/clean-css/-/clean-css-5.3.0.tgz", - "integrity": "sha512-YYuuxv4H/iNb1Z/5IbMRoxgrzjWGhOEFfd+groZ5dMCVkpENiMZmwspdrzBo9286JjM1gZJPAyL7ZIdzuvu2AQ==", - "requires": { - "source-map": "~0.6.0" - }, - "dependencies": { - "source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==" - } - } - }, - "cliui": { - "version": "7.0.4", - "resolved": "https://registry.npmjs.org/cliui/-/cliui-7.0.4.tgz", - "integrity": "sha512-OcRE68cOsVMXp1Yvonl/fzkQOyjLSu/8bhPDfQt0e0/Eb283TKP20Fs2MqoPsr9SwA595rRCA+QMzYc9nBP+JQ==", - "requires": { - "string-width": "^4.2.0", - "strip-ansi": "^6.0.0", - "wrap-ansi": "^7.0.0" - } - }, - "co": { - "version": "4.6.0", - "resolved": "https://registry.npmjs.org/co/-/co-4.6.0.tgz", - "integrity": "sha512-QVb0dM5HvG+uaxitm8wONl7jltx8dqhfU33DcqtOZcLSVIKSDDLDi7+0LbAKiyI8hD9u42m2YxXSkMGWThaecQ==" - }, - "coa": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/coa/-/coa-2.0.2.tgz", - "integrity": "sha512-q5/jG+YQnSy4nRTV4F7lPepBJZ8qBNJJDBuJdoejDyLXgmL7IEo+Le2JDZudFTFt7mrCqIRaSjws4ygRCTCAXA==", - "requires": { - "@types/q": "^1.5.1", - "chalk": "^2.4.1", - "q": "^1.1.2" - } - }, - "collect-v8-coverage": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/collect-v8-coverage/-/collect-v8-coverage-1.0.1.tgz", - "integrity": "sha512-iBPtljfCNcTKNAto0KEtDfZ3qzjJvqE3aTGZsbhjSBlorqpXJlaWWtPO35D+ZImoC3KWejX64o+yPGxhWSTzfg==" - }, - "color-convert": { - "version": "1.9.3", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", - "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", - "requires": { - "color-name": "1.1.3" - } - }, - "color-name": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", - "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==" - }, - "colord": { - "version": "2.9.2", - "resolved": "https://registry.npmjs.org/colord/-/colord-2.9.2.tgz", - "integrity": "sha512-Uqbg+J445nc1TKn4FoDPS6ZZqAvEDnwrH42yo8B40JSOgSLxMZ/gt3h4nmCtPLQeXhjJJkqBx7SCY35WnIixaQ==" - }, - "colorette": { - "version": "2.0.19", - "resolved": "https://registry.npmjs.org/colorette/-/colorette-2.0.19.tgz", - "integrity": "sha512-3tlv/dIP7FWvj3BsbHrGLJ6l/oKh1O3TcgBqMn+yyCagOxc23fyzDS6HypQbgxWbkpDnf52p1LuR4eWDQ/K9WQ==" - }, - "combined-stream": { - "version": "1.0.8", - "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz", - "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==", - "requires": { - "delayed-stream": "~1.0.0" - } - }, - "commander": { - "version": "8.3.0", - "resolved": "https://registry.npmjs.org/commander/-/commander-8.3.0.tgz", - "integrity": "sha512-OkTL9umf+He2DZkUq8f8J9of7yL6RJKI24dVITBmNfZBmri9zYZQrKkuXiKhyfPSu8tUhnVBB1iKXevvnlR4Ww==" - }, - "common-path-prefix": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/common-path-prefix/-/common-path-prefix-3.0.0.tgz", - "integrity": "sha512-QE33hToZseCH3jS0qN96O/bSh3kaw/h+Tq7ngyY9eWDUnTlTNUyqfqvCXioLe5Na5jFsL78ra/wuBU4iuEgd4w==" - }, - "common-tags": { - "version": "1.8.2", - "resolved": "https://registry.npmjs.org/common-tags/-/common-tags-1.8.2.tgz", - "integrity": "sha512-gk/Z852D2Wtb//0I+kRFNKKE9dIIVirjoqPoA1wJU+XePVXZfGeBpk45+A1rKO4Q43prqWBNY/MiIeRLbPWUaA==" - }, - "commondir": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/commondir/-/commondir-1.0.1.tgz", - "integrity": "sha512-W9pAhw0ja1Edb5GVdIF1mjZw/ASI0AlShXM83UUGe2DVr5TdAPEA1OA8m/g8zWp9x6On7gqufY+FatDbC3MDQg==" - }, - "compressible": { - "version": "2.0.18", - "resolved": "https://registry.npmjs.org/compressible/-/compressible-2.0.18.tgz", - "integrity": "sha512-AF3r7P5dWxL8MxyITRMlORQNaOA2IkAFaTr4k7BUumjPtRpGDTZpl0Pb1XCO6JeDCBdp126Cgs9sMxqSjgYyRg==", - "requires": { - "mime-db": ">= 1.43.0 < 2" - } - }, - "compression": { - "version": "1.7.4", - "resolved": "https://registry.npmjs.org/compression/-/compression-1.7.4.tgz", - "integrity": "sha512-jaSIDzP9pZVS4ZfQ+TzvtiWhdpFhE2RDHz8QJkpX9SIpLq88VueF5jJw6t+6CUQcAoA6t+x89MLrWAqpfDE8iQ==", - "requires": { - "accepts": "~1.3.5", - "bytes": "3.0.0", - "compressible": "~2.0.16", - "debug": "2.6.9", - "on-headers": "~1.0.2", - "safe-buffer": "5.1.2", - "vary": "~1.1.2" - }, - "dependencies": { - "debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", - "requires": { - "ms": "2.0.0" - } - }, - "ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==" - } - } - }, - "concat-map": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", - "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==" - }, - "confusing-browser-globals": { - "version": "1.0.11", - "resolved": "https://registry.npmjs.org/confusing-browser-globals/-/confusing-browser-globals-1.0.11.tgz", - "integrity": "sha512-JsPKdmh8ZkmnHxDk55FZ1TqVLvEQTvoByJZRN9jzI0UjxK/QgAmsphz7PGtqgPieQZ/CQcHWXCR7ATDNhGe+YA==" - }, - "connect-history-api-fallback": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/connect-history-api-fallback/-/connect-history-api-fallback-2.0.0.tgz", - "integrity": "sha512-U73+6lQFmfiNPrYbXqr6kZ1i1wiRqXnp2nhMsINseWXO8lDau0LGEffJ8kQi4EjLZympVgRdvqjAgiZ1tgzDDA==" - }, - "content-disposition": { - "version": "0.5.4", - "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.4.tgz", - "integrity": "sha512-FveZTNuGw04cxlAiWbzi6zTAL/lhehaWbTtgluJh4/E95DqMwTmha3KZN1aAWA8cFIhHzMZUvLevkw5Rqk+tSQ==", - "requires": { - "safe-buffer": "5.2.1" - }, - "dependencies": { - "safe-buffer": { - "version": "5.2.1", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", - "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==" - } - } - }, - "content-type": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/content-type/-/content-type-1.0.4.tgz", - "integrity": "sha512-hIP3EEPs8tB9AT1L+NUqtwOAps4mk2Zob89MWXMHjHWg9milF/j4osnnQLXBCBFBk/tvIG/tUc9mOUJiPBhPXA==" - }, - "convert-source-map": { - "version": "1.8.0", - "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.8.0.tgz", - "integrity": "sha512-+OQdjP49zViI/6i7nIJpA8rAl4sV/JdPfU9nZs3VqOwGIgizICvuN2ru6fMd+4llL0tar18UYJXfZ/TWtmhUjA==", - "requires": { - "safe-buffer": "~5.1.1" - } - }, - "cookie": { - "version": "0.5.0", - "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.5.0.tgz", - "integrity": "sha512-YZ3GUyn/o8gfKJlnlX7g7xq4gyO6OSuhGPKaaGssGB2qgDUS0gPgtTvoyZLTt9Ab6dC4hfc9dV5arkvc/OCmrw==" - }, - "cookie-signature": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.0.6.tgz", - "integrity": "sha512-QADzlaHc8icV8I7vbaJXJwod9HWYp8uCqf1xa4OfNu1T7JVxQIrUgOWtHdNDtPiywmFbiS12VjotIXLrKM3orQ==" - }, - "core-js": { - "version": "3.23.4", - "resolved": "https://registry.npmjs.org/core-js/-/core-js-3.23.4.tgz", - "integrity": "sha512-vjsKqRc1RyAJC3Ye2kYqgfdThb3zYnx9CrqoCcjMOENMtQPC7ZViBvlDxwYU/2z2NI/IPuiXw5mT4hWhddqjzQ==" - }, - "core-js-compat": { - "version": "3.23.4", - "resolved": "https://registry.npmjs.org/core-js-compat/-/core-js-compat-3.23.4.tgz", - "integrity": "sha512-RkSRPe+JYEoflcsuxJWaiMPhnZoFS51FcIxm53k4KzhISCBTmaGlto9dTIrYuk0hnJc3G6pKufAKepHnBq6B6Q==", - "requires": { - "browserslist": "^4.21.1", - "semver": "7.0.0" - }, - "dependencies": { - "semver": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.0.0.tgz", - "integrity": "sha512-+GB6zVA9LWh6zovYQLALHwv5rb2PHGlJi3lfiqIHxR0uuwCgefcOJc59v9fv1w8GbStwxuuqqAjI9NMAOOgq1A==" - } - } - }, - "core-js-pure": { - "version": "3.23.4", - "resolved": "https://registry.npmjs.org/core-js-pure/-/core-js-pure-3.23.4.tgz", - "integrity": "sha512-lizxkcgj3XDmi7TUBFe+bQ1vNpD5E4t76BrBWI3HdUxdw/Mq1VF4CkiHzIKyieECKtcODK2asJttoofEeUKICQ==" - }, - "core-util-is": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.3.tgz", - "integrity": "sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ==" - }, - "cosmiconfig": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-7.0.1.tgz", - "integrity": "sha512-a1YWNUV2HwGimB7dU2s1wUMurNKjpx60HxBB6xUM8Re+2s1g1IIfJvFR0/iCF+XHdE0GMTKTuLR32UQff4TEyQ==", - "requires": { - "@types/parse-json": "^4.0.0", - "import-fresh": "^3.2.1", - "parse-json": "^5.0.0", - "path-type": "^4.0.0", - "yaml": "^1.10.0" - } - }, - "cross-spawn": { - "version": "7.0.3", - "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz", - "integrity": "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==", - "requires": { - "path-key": "^3.1.0", - "shebang-command": "^2.0.0", - "which": "^2.0.1" - } - }, - "crypto-random-string": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/crypto-random-string/-/crypto-random-string-2.0.0.tgz", - "integrity": "sha512-v1plID3y9r/lPhviJ1wrXpLeyUIGAZ2SHNYTEapm7/8A9nLPoyvVp3RK/EPFqn5kEznyWgYZNsRtYYIWbuG8KA==" - }, - "css": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/css/-/css-3.0.0.tgz", - "integrity": "sha512-DG9pFfwOrzc+hawpmqX/dHYHJG+Bsdb0klhyi1sDneOgGOXy9wQIC8hzyVp1e4NRYDBdxcylvywPkkXCHAzTyQ==", - "requires": { - "inherits": "^2.0.4", - "source-map": "^0.6.1", - "source-map-resolve": "^0.6.0" - }, - "dependencies": { - "source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==" - } - } - }, - "css-blank-pseudo": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/css-blank-pseudo/-/css-blank-pseudo-3.0.3.tgz", - "integrity": "sha512-VS90XWtsHGqoM0t4KpH053c4ehxZ2E6HtGI7x68YFV0pTo/QmkV/YFA+NnlvK8guxZVNWGQhVNJGC39Q8XF4OQ==", - "requires": { - "postcss-selector-parser": "^6.0.9" - } - }, - "css-declaration-sorter": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/css-declaration-sorter/-/css-declaration-sorter-6.3.0.tgz", - "integrity": "sha512-OGT677UGHJTAVMRhPO+HJ4oKln3wkBTwtDFH0ojbqm+MJm6xuDMHp2nkhh/ThaBqq20IbraBQSWKfSLNHQO9Og==", - "requires": {} - }, - "css-has-pseudo": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/css-has-pseudo/-/css-has-pseudo-3.0.4.tgz", - "integrity": "sha512-Vse0xpR1K9MNlp2j5w1pgWIJtm1a8qS0JwS9goFYcImjlHEmywP9VUF05aGBXzGpDJF86QXk4L0ypBmwPhGArw==", - "requires": { - "postcss-selector-parser": "^6.0.9" - } - }, - "css-loader": { - "version": "6.7.1", - "resolved": "https://registry.npmjs.org/css-loader/-/css-loader-6.7.1.tgz", - "integrity": "sha512-yB5CNFa14MbPJcomwNh3wLThtkZgcNyI2bNMRt8iE5Z8Vwl7f8vQXFAzn2HDOJvtDq2NTZBUGMSUNNyrv3/+cw==", - "requires": { - "icss-utils": "^5.1.0", - "postcss": "^8.4.7", - "postcss-modules-extract-imports": "^3.0.0", - "postcss-modules-local-by-default": "^4.0.0", - "postcss-modules-scope": "^3.0.0", - "postcss-modules-values": "^4.0.0", - "postcss-value-parser": "^4.2.0", - "semver": "^7.3.5" - } - }, - "css-minimizer-webpack-plugin": { - "version": "3.4.1", - "resolved": "https://registry.npmjs.org/css-minimizer-webpack-plugin/-/css-minimizer-webpack-plugin-3.4.1.tgz", - "integrity": "sha512-1u6D71zeIfgngN2XNRJefc/hY7Ybsxd74Jm4qngIXyUEk7fss3VUzuHxLAq/R8NAba4QU9OUSaMZlbpRc7bM4Q==", - "requires": { - "cssnano": "^5.0.6", - "jest-worker": "^27.0.2", - "postcss": "^8.3.5", - "schema-utils": "^4.0.0", - "serialize-javascript": "^6.0.0", - "source-map": "^0.6.1" - }, - "dependencies": { - "ajv": { - "version": "8.11.0", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.11.0.tgz", - "integrity": "sha512-wGgprdCvMalC0BztXvitD2hC04YffAvtsUn93JbGXYLAtCUO4xd17mCCZQxUOItiBwZvJScWo8NIvQMQ71rdpg==", - "requires": { - "fast-deep-equal": "^3.1.1", - "json-schema-traverse": "^1.0.0", - "require-from-string": "^2.0.2", - "uri-js": "^4.2.2" - } - }, - "ajv-keywords": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-5.1.0.tgz", - "integrity": "sha512-YCS/JNFAUyr5vAuhk1DWm1CBxRHW9LbJ2ozWeemrIqpbsqKjHVxYPyi5GC0rjZIT5JxJ3virVTS8wk4i/Z+krw==", - "requires": { - "fast-deep-equal": "^3.1.3" - } - }, - "json-schema-traverse": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", - "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==" - }, - "schema-utils": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-4.0.0.tgz", - "integrity": "sha512-1edyXKgh6XnJsJSQ8mKWXnN/BVaIbFMLpouRUrXgVq7WYne5kw3MW7UPhO44uRXQSIpTSXoJbmrR2X0w9kUTyg==", - "requires": { - "@types/json-schema": "^7.0.9", - "ajv": "^8.8.0", - "ajv-formats": "^2.1.1", - "ajv-keywords": "^5.0.0" - } - }, - "source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==" - } - } - }, - "css-prefers-color-scheme": { - "version": "6.0.3", - "resolved": "https://registry.npmjs.org/css-prefers-color-scheme/-/css-prefers-color-scheme-6.0.3.tgz", - "integrity": "sha512-4BqMbZksRkJQx2zAjrokiGMd07RqOa2IxIrrN10lyBe9xhn9DEvjUK79J6jkeiv9D9hQFXKb6g1jwU62jziJZA==", - "requires": {} - }, - "css-select": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/css-select/-/css-select-4.3.0.tgz", - "integrity": "sha512-wPpOYtnsVontu2mODhA19JrqWxNsfdatRKd64kmpRbQgh1KtItko5sTnEpPdpSaJszTOhEMlF/RPz28qj4HqhQ==", - "requires": { - "boolbase": "^1.0.0", - "css-what": "^6.0.1", - "domhandler": "^4.3.1", - "domutils": "^2.8.0", - "nth-check": "^2.0.1" - } - }, - "css-select-base-adapter": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/css-select-base-adapter/-/css-select-base-adapter-0.1.1.tgz", - "integrity": "sha512-jQVeeRG70QI08vSTwf1jHxp74JoZsr2XSgETae8/xC8ovSnL2WF87GTLO86Sbwdt2lK4Umg4HnnwMO4YF3Ce7w==" - }, - "css-tree": { - "version": "1.0.0-alpha.37", - "resolved": "https://registry.npmjs.org/css-tree/-/css-tree-1.0.0-alpha.37.tgz", - "integrity": "sha512-DMxWJg0rnz7UgxKT0Q1HU/L9BeJI0M6ksor0OgqOnF+aRCDWg/N2641HmVyU9KVIu0OVVWOb2IpC9A+BJRnejg==", - "requires": { - "mdn-data": "2.0.4", - "source-map": "^0.6.1" - }, - "dependencies": { - "source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==" - } - } - }, - "css-what": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/css-what/-/css-what-6.1.0.tgz", - "integrity": "sha512-HTUrgRJ7r4dsZKU6GjmpfRK1O76h97Z8MfS1G0FozR+oF2kG6Vfe8JE6zwrkbxigziPHinCJ+gCPjA9EaBDtRw==" - }, - "css.escape": { - "version": "1.5.1", - "resolved": "https://registry.npmjs.org/css.escape/-/css.escape-1.5.1.tgz", - "integrity": "sha512-YUifsXXuknHlUsmlgyY0PKzgPOr7/FjCePfHNt0jxm83wHZi44VDMQ7/fGNkjY3/jV1MC+1CmZbaHzugyeRtpg==" - }, - "cssdb": { - "version": "6.6.3", - "resolved": "https://registry.npmjs.org/cssdb/-/cssdb-6.6.3.tgz", - "integrity": "sha512-7GDvDSmE+20+WcSMhP17Q1EVWUrLlbxxpMDqG731n8P99JhnQZHR9YvtjPvEHfjFUjvQJvdpKCjlKOX+xe4UVA==" - }, - "cssesc": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/cssesc/-/cssesc-3.0.0.tgz", - "integrity": "sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg==" - }, - "cssnano": { - "version": "5.1.12", - "resolved": "https://registry.npmjs.org/cssnano/-/cssnano-5.1.12.tgz", - "integrity": "sha512-TgvArbEZu0lk/dvg2ja+B7kYoD7BBCmn3+k58xD0qjrGHsFzXY/wKTo9M5egcUCabPol05e/PVoIu79s2JN4WQ==", - "requires": { - "cssnano-preset-default": "^5.2.12", - "lilconfig": "^2.0.3", - "yaml": "^1.10.2" - } - }, - "cssnano-preset-default": { - "version": "5.2.12", - "resolved": "https://registry.npmjs.org/cssnano-preset-default/-/cssnano-preset-default-5.2.12.tgz", - "integrity": "sha512-OyCBTZi+PXgylz9HAA5kHyoYhfGcYdwFmyaJzWnzxuGRtnMw/kR6ilW9XzlzlRAtB6PLT/r+prYgkef7hngFew==", - "requires": { - "css-declaration-sorter": "^6.3.0", - "cssnano-utils": "^3.1.0", - "postcss-calc": "^8.2.3", - "postcss-colormin": "^5.3.0", - "postcss-convert-values": "^5.1.2", - "postcss-discard-comments": "^5.1.2", - "postcss-discard-duplicates": "^5.1.0", - "postcss-discard-empty": "^5.1.1", - "postcss-discard-overridden": "^5.1.0", - "postcss-merge-longhand": "^5.1.6", - "postcss-merge-rules": "^5.1.2", - "postcss-minify-font-values": "^5.1.0", - "postcss-minify-gradients": "^5.1.1", - "postcss-minify-params": "^5.1.3", - "postcss-minify-selectors": "^5.2.1", - "postcss-normalize-charset": "^5.1.0", - "postcss-normalize-display-values": "^5.1.0", - "postcss-normalize-positions": "^5.1.1", - "postcss-normalize-repeat-style": "^5.1.1", - "postcss-normalize-string": "^5.1.0", - "postcss-normalize-timing-functions": "^5.1.0", - "postcss-normalize-unicode": "^5.1.0", - "postcss-normalize-url": "^5.1.0", - "postcss-normalize-whitespace": "^5.1.1", - "postcss-ordered-values": "^5.1.3", - "postcss-reduce-initial": "^5.1.0", - "postcss-reduce-transforms": "^5.1.0", - "postcss-svgo": "^5.1.0", - "postcss-unique-selectors": "^5.1.1" - } - }, - "cssnano-utils": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/cssnano-utils/-/cssnano-utils-3.1.0.tgz", - "integrity": "sha512-JQNR19/YZhz4psLX/rQ9M83e3z2Wf/HdJbryzte4a3NSuafyp9w/I4U+hx5C2S9g41qlstH7DEWnZaaj83OuEA==", - "requires": {} - }, - "csso": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/csso/-/csso-4.2.0.tgz", - "integrity": "sha512-wvlcdIbf6pwKEk7vHj8/Bkc0B4ylXZruLvOgs9doS5eOsOpuodOV2zJChSpkp+pRpYQLQMeF04nr3Z68Sta9jA==", - "requires": { - "css-tree": "^1.1.2" - }, - "dependencies": { - "css-tree": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/css-tree/-/css-tree-1.1.3.tgz", - "integrity": "sha512-tRpdppF7TRazZrjJ6v3stzv93qxRcSsFmW6cX0Zm2NVKpxE1WV1HblnghVv9TreireHkqI/VDEsfolRF1p6y7Q==", - "requires": { - "mdn-data": "2.0.14", - "source-map": "^0.6.1" - } - }, - "mdn-data": { - "version": "2.0.14", - "resolved": "https://registry.npmjs.org/mdn-data/-/mdn-data-2.0.14.tgz", - "integrity": "sha512-dn6wd0uw5GsdswPFfsgMp5NSB0/aDe6fK94YJV/AJDYXL6HVLWBsxeq7js7Ad+mU2K9LAlwpk6kN2D5mwCPVow==" - }, - "source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==" - } - } - }, - "cssom": { - "version": "0.4.4", - "resolved": "https://registry.npmjs.org/cssom/-/cssom-0.4.4.tgz", - "integrity": "sha512-p3pvU7r1MyyqbTk+WbNJIgJjG2VmTIaB10rI93LzVPrmDJKkzKYMtxxyAvQXR/NS6otuzveI7+7BBq3SjBS2mw==" - }, - "cssstyle": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/cssstyle/-/cssstyle-2.3.0.tgz", - "integrity": "sha512-AZL67abkUzIuvcHqk7c09cezpGNcxUxU4Ioi/05xHk4DQeTkWmGYftIE6ctU6AEt+Gn4n1lDStOtj7FKycP71A==", - "requires": { - "cssom": "~0.3.6" - }, - "dependencies": { - "cssom": { - "version": "0.3.8", - "resolved": "https://registry.npmjs.org/cssom/-/cssom-0.3.8.tgz", - "integrity": "sha512-b0tGHbfegbhPJpxpiBPU2sCkigAqtM9O121le6bbOlgyV+NyGyCmVfJ6QW9eRjz8CpNfWEOYBIMIGRYkLwsIYg==" - } - } - }, - "csstype": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/csstype/-/csstype-3.1.0.tgz", - "integrity": "sha512-uX1KG+x9h5hIJsaKR9xHUeUraxf8IODOwq9JLNPq6BwB04a/xgpq3rcx47l5BZu5zBPlgD342tdke3Hom/nJRA==" - }, - "damerau-levenshtein": { - "version": "1.0.8", - "resolved": "https://registry.npmjs.org/damerau-levenshtein/-/damerau-levenshtein-1.0.8.tgz", - "integrity": "sha512-sdQSFB7+llfUcQHUQO3+B8ERRj0Oa4w9POWMI/puGtuf7gFywGmkaLCElnudfTiKZV+NvHqL0ifzdrI8Ro7ESA==" - }, - "data-urls": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/data-urls/-/data-urls-2.0.0.tgz", - "integrity": "sha512-X5eWTSXO/BJmpdIKCRuKUgSCgAN0OwliVK3yPKbwIWU1Tdw5BRajxlzMidvh+gwko9AfQ9zIj52pzF91Q3YAvQ==", - "requires": { - "abab": "^2.0.3", - "whatwg-mimetype": "^2.3.0", - "whatwg-url": "^8.0.0" - } - }, - "debug": { - "version": "4.3.4", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", - "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", - "requires": { - "ms": "2.1.2" - } - }, - "decimal.js": { - "version": "10.3.1", - "resolved": "https://registry.npmjs.org/decimal.js/-/decimal.js-10.3.1.tgz", - "integrity": "sha512-V0pfhfr8suzyPGOx3nmq4aHqabehUZn6Ch9kyFpV79TGDTWFmHqUqXdabR7QHqxzrYolF4+tVmJhUG4OURg5dQ==" - }, - "decode-uri-component": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/decode-uri-component/-/decode-uri-component-0.2.0.tgz", - "integrity": "sha512-hjf+xovcEn31w/EUYdTXQh/8smFL/dzYjohQGEIgjyNavaJfBY2p5F527Bo1VPATxv0VYTUC2bOcXvqFwk78Og==" - }, - "dedent": { - "version": "0.7.0", - "resolved": "https://registry.npmjs.org/dedent/-/dedent-0.7.0.tgz", - "integrity": "sha512-Q6fKUPqnAHAyhiUgFU7BUzLiv0kd8saH9al7tnu5Q/okj6dnupxyTgFIBjVzJATdfIAm9NAsvXNzjaKa+bxVyA==" - }, - "deep-is": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.4.tgz", - "integrity": "sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==" - }, - "deepmerge": { - "version": "4.2.2", - "resolved": "https://registry.npmjs.org/deepmerge/-/deepmerge-4.2.2.tgz", - "integrity": "sha512-FJ3UgI4gIl+PHZm53knsuSFpE+nESMr7M4v9QcgB7S63Kj/6WqMiFQJpBBYz1Pt+66bZpP3Q7Lye0Oo9MPKEdg==" - }, - "default-gateway": { - "version": "6.0.3", - "resolved": "https://registry.npmjs.org/default-gateway/-/default-gateway-6.0.3.tgz", - "integrity": "sha512-fwSOJsbbNzZ/CUFpqFBqYfYNLj1NbMPm8MMCIzHjC83iSJRBEGmDUxU+WP661BaBQImeC2yHwXtz+P/O9o+XEg==", - "requires": { - "execa": "^5.0.0" - } - }, - "define-lazy-prop": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/define-lazy-prop/-/define-lazy-prop-2.0.0.tgz", - "integrity": "sha512-Ds09qNh8yw3khSjiJjiUInaGX9xlqZDY7JVryGxdxV7NPeuqQfplOpQ66yJFZut3jLa5zOwkXw1g9EI2uKh4Og==" - }, - "define-properties": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.1.4.tgz", - "integrity": "sha512-uckOqKcfaVvtBdsVkdPv3XjveQJsNQqmhXgRi8uhvWWuPYZCNlzT8qAyblUgNoXdHdjMTzAqeGjAoli8f+bzPA==", - "requires": { - "has-property-descriptors": "^1.0.0", - "object-keys": "^1.1.1" - } - }, - "defined": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/defined/-/defined-1.0.0.tgz", - "integrity": "sha512-Y2caI5+ZwS5c3RiNDJ6u53VhQHv+hHKwhkI1iHvceKUHw9Df6EK2zRLfjejRgMuCuxK7PfSWIMwWecceVvThjQ==" - }, - "delayed-stream": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", - "integrity": "sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==" - }, - "depd": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/depd/-/depd-2.0.0.tgz", - "integrity": "sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==" - }, - "destroy": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/destroy/-/destroy-1.2.0.tgz", - "integrity": "sha512-2sJGJTaXIIaR1w4iJSNoN0hnMY7Gpc/n8D4qSCJw8QqFWXf7cuAgnEHxBpweaVcPevC2l3KpjYCx3NypQQgaJg==" - }, - "detect-newline": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/detect-newline/-/detect-newline-3.1.0.tgz", - "integrity": "sha512-TLz+x/vEXm/Y7P7wn1EJFNLxYpUD4TgMosxY6fAVJUnJMbupHBOncxyWUG9OpTaH9EBD7uFI5LfEgmMOc54DsA==" - }, - "detect-node": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/detect-node/-/detect-node-2.1.0.tgz", - "integrity": "sha512-T0NIuQpnTvFDATNuHN5roPwSBG83rFsuO+MXXH9/3N1eFbn4wcPjttvjMLEPWJ0RGUYgQE7cGgS3tNxbqCGM7g==" - }, - "detect-port-alt": { - "version": "1.1.6", - "resolved": "https://registry.npmjs.org/detect-port-alt/-/detect-port-alt-1.1.6.tgz", - "integrity": "sha512-5tQykt+LqfJFBEYaDITx7S7cR7mJ/zQmLXZ2qt5w04ainYZw6tBf9dBunMjVeVOdYVRUzUOE4HkY5J7+uttb5Q==", - "requires": { - "address": "^1.0.1", - "debug": "^2.6.0" - }, - "dependencies": { - "debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", - "requires": { - "ms": "2.0.0" - } - }, - "ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==" - } - } - }, - "detective": { - "version": "5.2.1", - "resolved": "https://registry.npmjs.org/detective/-/detective-5.2.1.tgz", - "integrity": "sha512-v9XE1zRnz1wRtgurGu0Bs8uHKFSTdteYZNbIPFVhUZ39L/S79ppMpdmVOZAnoz1jfEFodc48n6MX483Xo3t1yw==", - "requires": { - "acorn-node": "^1.8.2", - "defined": "^1.0.0", - "minimist": "^1.2.6" - } - }, - "didyoumean": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/didyoumean/-/didyoumean-1.2.2.tgz", - "integrity": "sha512-gxtyfqMg7GKyhQmb056K7M3xszy/myH8w+B4RT+QXBQsvAOdc3XymqDDPHx1BgPgsdAA5SIifona89YtRATDzw==" - }, - "diff-sequences": { - "version": "27.5.1", - "resolved": "https://registry.npmjs.org/diff-sequences/-/diff-sequences-27.5.1.tgz", - "integrity": "sha512-k1gCAXAsNgLwEL+Y8Wvl+M6oEFj5bgazfZULpS5CneoPPXRaCCW7dm+q21Ky2VEE5X+VeRDBVg1Pcvvsr4TtNQ==" - }, - "dir-glob": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/dir-glob/-/dir-glob-3.0.1.tgz", - "integrity": "sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==", - "requires": { - "path-type": "^4.0.0" - } - }, - "dlv": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/dlv/-/dlv-1.1.3.tgz", - "integrity": "sha512-+HlytyjlPKnIG8XuRG8WvmBP8xs8P71y+SKKS6ZXWoEgLuePxtDoUEiH7WkdePWrQ5JBpE6aoVqfZfJUQkjXwA==" - }, - "dns-equal": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/dns-equal/-/dns-equal-1.0.0.tgz", - "integrity": "sha512-z+paD6YUQsk+AbGCEM4PrOXSss5gd66QfcVBFTKR/HpFL9jCqikS94HYwKww6fQyO7IxrIIyUu+g0Ka9tUS2Cg==" - }, - "dns-packet": { - "version": "5.4.0", - "resolved": "https://registry.npmjs.org/dns-packet/-/dns-packet-5.4.0.tgz", - "integrity": "sha512-EgqGeaBB8hLiHLZtp/IbaDQTL8pZ0+IvwzSHA6d7VyMDM+B9hgddEMa9xjK5oYnw0ci0JQ6g2XCD7/f6cafU6g==", - "requires": { - "@leichtgewicht/ip-codec": "^2.0.1" - } - }, - "doctrine": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-3.0.0.tgz", - "integrity": "sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==", - "requires": { - "esutils": "^2.0.2" - } - }, - "dom-accessibility-api": { - "version": "0.5.14", - "resolved": "https://registry.npmjs.org/dom-accessibility-api/-/dom-accessibility-api-0.5.14.tgz", - "integrity": "sha512-NMt+m9zFMPZe0JcY9gN224Qvk6qLIdqex29clBvc/y75ZBX9YA9wNK3frsYvu2DI1xcCIwxwnX+TlsJ2DSOADg==" - }, - "dom-converter": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/dom-converter/-/dom-converter-0.2.0.tgz", - "integrity": "sha512-gd3ypIPfOMr9h5jIKq8E3sHOTCjeirnl0WK5ZdS1AW0Odt0b1PaWaHdJ4Qk4klv+YB9aJBS7mESXjFoDQPu6DA==", - "requires": { - "utila": "~0.4" - } - }, - "dom-serializer": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-1.4.1.tgz", - "integrity": "sha512-VHwB3KfrcOOkelEG2ZOfxqLZdfkil8PtJi4P8N2MMXucZq2yLp75ClViUlOVwyoHEDjYU433Aq+5zWP61+RGag==", - "requires": { - "domelementtype": "^2.0.1", - "domhandler": "^4.2.0", - "entities": "^2.0.0" - } - }, - "domelementtype": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-2.3.0.tgz", - "integrity": "sha512-OLETBj6w0OsagBwdXnPdN0cnMfF9opN69co+7ZrbfPGrdpPVNBUj02spi6B1N7wChLQiPn4CSH/zJvXw56gmHw==" - }, - "domexception": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/domexception/-/domexception-2.0.1.tgz", - "integrity": "sha512-yxJ2mFy/sibVQlu5qHjOkf9J3K6zgmCxgJ94u2EdvDOV09H+32LtRswEcUsmUWN72pVLOEnTSRaIVVzVQgS0dg==", - "requires": { - "webidl-conversions": "^5.0.0" - }, - "dependencies": { - "webidl-conversions": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-5.0.0.tgz", - "integrity": "sha512-VlZwKPCkYKxQgeSbH5EyngOmRp7Ww7I9rQLERETtf5ofd9pGeswWiOtogpEO850jziPRarreGxn5QIiTqpb2wA==" - } - } - }, - "domhandler": { - "version": "4.3.1", - "resolved": "https://registry.npmjs.org/domhandler/-/domhandler-4.3.1.tgz", - "integrity": "sha512-GrwoxYN+uWlzO8uhUXRl0P+kHE4GtVPfYzVLcUxPL7KNdHKj66vvlhiweIHqYYXWlw+T8iLMp42Lm67ghw4WMQ==", - "requires": { - "domelementtype": "^2.2.0" - } - }, - "domutils": { - "version": "2.8.0", - "resolved": "https://registry.npmjs.org/domutils/-/domutils-2.8.0.tgz", - "integrity": "sha512-w96Cjofp72M5IIhpjgobBimYEfoPjx1Vx0BSX9P30WBdZW2WIKU0T1Bd0kz2eNZ9ikjKgHbEyKx8BB6H1L3h3A==", - "requires": { - "dom-serializer": "^1.0.1", - "domelementtype": "^2.2.0", - "domhandler": "^4.2.0" - } - }, - "dot-case": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/dot-case/-/dot-case-3.0.4.tgz", - "integrity": "sha512-Kv5nKlh6yRrdrGvxeJ2e5y2eRUpkUosIW4A2AS38zwSz27zu7ufDwQPi5Jhs3XAlGNetl3bmnGhQsMtkKJnj3w==", - "requires": { - "no-case": "^3.0.4", - "tslib": "^2.0.3" - } - }, - "dotenv": { - "version": "10.0.0", - "resolved": "https://registry.npmjs.org/dotenv/-/dotenv-10.0.0.tgz", - "integrity": "sha512-rlBi9d8jpv9Sf1klPjNfFAuWDjKLwTIJJ/VxtoTwIR6hnZxcEOQCZg2oIL3MWBYw5GpUDKOEnND7LXTbIpQ03Q==" - }, - "dotenv-expand": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/dotenv-expand/-/dotenv-expand-5.1.0.tgz", - "integrity": "sha512-YXQl1DSa4/PQyRfgrv6aoNjhasp/p4qs9FjJ4q4cQk+8m4r6k4ZSiEyytKG8f8W9gi8WsQtIObNmKd+tMzNTmA==" - }, - "duplexer": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/duplexer/-/duplexer-0.1.2.tgz", - "integrity": "sha512-jtD6YG370ZCIi/9GTaJKQxWTZD045+4R4hTk/x1UyoqadyJ9x9CgSi1RlVDQF8U2sxLLSnFkCaMihqljHIWgMg==" - }, - "ee-first": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz", - "integrity": "sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow==" - }, - "ejs": { - "version": "3.1.8", - "resolved": "https://registry.npmjs.org/ejs/-/ejs-3.1.8.tgz", - "integrity": "sha512-/sXZeMlhS0ArkfX2Aw780gJzXSMPnKjtspYZv+f3NiKLlubezAHDU5+9xz6gd3/NhG3txQCo6xlglmTS+oTGEQ==", - "requires": { - "jake": "^10.8.5" - } - }, - "electron-to-chromium": { - "version": "1.4.186", - "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.186.tgz", - "integrity": "sha512-YoVeFrGd/7ROjz4R9uPoND1K/hSRC/xADy9639ZmIZeJSaBnKdYx3I6LMPsY7CXLpK7JFgKQVzeZ/dk2br6Eaw==" - }, - "emittery": { - "version": "0.8.1", - "resolved": "https://registry.npmjs.org/emittery/-/emittery-0.8.1.tgz", - "integrity": "sha512-uDfvUjVrfGJJhymx/kz6prltenw1u7WrCg1oa94zYY8xxVpLLUu045LAT0dhDZdXG58/EpPL/5kA180fQ/qudg==" - }, - "emoji-regex": { - "version": "9.2.2", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-9.2.2.tgz", - "integrity": "sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==" - }, - "emojis-list": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/emojis-list/-/emojis-list-3.0.0.tgz", - "integrity": "sha512-/kyM18EfinwXZbno9FyUGeFh87KC8HRQBQGildHZbEuRyWFOmv1U10o9BBp8XVZDVNNuQKyIGIu5ZYAAXJ0V2Q==" - }, - "encodeurl": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.2.tgz", - "integrity": "sha512-TPJXq8JqFaVYm2CWmPvnP2Iyo4ZSM7/QKcSmuMLDObfpH5fi7RUGmd/rTDf+rut/saiDiQEeVTNgAmJEdAOx0w==" - }, - "enhanced-resolve": { - "version": "5.10.0", - "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-5.10.0.tgz", - "integrity": "sha512-T0yTFjdpldGY8PmuXXR0PyQ1ufZpEGiHVrp7zHKB7jdR4qlmZHhONVM5AQOAWXuF/w3dnHbEQVrNptJgt7F+cQ==", - "requires": { - "graceful-fs": "^4.2.4", - "tapable": "^2.2.0" - } - }, - "entities": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/entities/-/entities-2.2.0.tgz", - "integrity": "sha512-p92if5Nz619I0w+akJrLZH0MX0Pb5DX39XOwQTtXSdQQOaYH03S1uIQp4mhOZtAXrxq4ViO67YTiLBo2638o9A==" - }, - "error-ex": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.2.tgz", - "integrity": "sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==", - "requires": { - "is-arrayish": "^0.2.1" - } - }, - "error-stack-parser": { - "version": "2.1.4", - "resolved": "https://registry.npmjs.org/error-stack-parser/-/error-stack-parser-2.1.4.tgz", - "integrity": "sha512-Sk5V6wVazPhq5MhpO+AUxJn5x7XSXGl1R93Vn7i+zS15KDVxQijejNCrz8340/2bgLBjR9GtEG8ZVKONDjcqGQ==", - "requires": { - "stackframe": "^1.3.4" - } - }, - "es-abstract": { - "version": "1.20.1", - "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.20.1.tgz", - "integrity": "sha512-WEm2oBhfoI2sImeM4OF2zE2V3BYdSF+KnSi9Sidz51fQHd7+JuF8Xgcj9/0o+OWeIeIS/MiuNnlruQrJf16GQA==", - "requires": { - "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.1", - "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.4", - "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.0", - "object-keys": "^1.1.1", - "object.assign": "^4.1.2", - "regexp.prototype.flags": "^1.4.3", - "string.prototype.trimend": "^1.0.5", - "string.prototype.trimstart": "^1.0.5", - "unbox-primitive": "^1.0.2" - } - }, - "es-array-method-boxes-properly": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/es-array-method-boxes-properly/-/es-array-method-boxes-properly-1.0.0.tgz", - "integrity": "sha512-wd6JXUmyHmt8T5a2xreUwKcGPq6f1f+WwIJkijUqiGcJz1qqnZgP6XIK+QyIWU5lT7imeNxUll48bziG+TSYcA==" - }, - "es-module-lexer": { - "version": "0.9.3", - "resolved": "https://registry.npmjs.org/es-module-lexer/-/es-module-lexer-0.9.3.tgz", - "integrity": "sha512-1HQ2M2sPtxwnvOvT1ZClHyQDiggdNjURWpY2we6aMKCQiUVxTmVs2UYPLIrD84sS+kMdUwfBSylbJPwNnBrnHQ==" - }, - "es-shim-unscopables": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/es-shim-unscopables/-/es-shim-unscopables-1.0.0.tgz", - "integrity": "sha512-Jm6GPcCdC30eMLbZ2x8z2WuRwAws3zTBBKuusffYVUrNj/GVSUAZ+xKMaUpfNDR5IbyNA5LJbaecoUVbmUcB1w==", - "requires": { - "has": "^1.0.3" - } - }, - "es-to-primitive": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/es-to-primitive/-/es-to-primitive-1.2.1.tgz", - "integrity": "sha512-QCOllgZJtaUo9miYBcLChTUaHNjJF3PYs1VidD7AwiEj1kYxKeQTctLAezAOH5ZKRH0g2IgPn6KwB4IT8iRpvA==", - "requires": { - "is-callable": "^1.1.4", - "is-date-object": "^1.0.1", - "is-symbol": "^1.0.2" - } - }, - "escalade": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.1.tgz", - "integrity": "sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==" - }, - "escape-html": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz", - "integrity": "sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow==" - }, - "escape-string-regexp": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", - "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==" - }, - "escodegen": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/escodegen/-/escodegen-2.0.0.tgz", - "integrity": "sha512-mmHKys/C8BFUGI+MAWNcSYoORYLMdPzjrknd2Vc+bUsjN5bXcr8EhrNB+UTqfL1y3I9c4fw2ihgtMPQLBRiQxw==", - "requires": { - "esprima": "^4.0.1", - "estraverse": "^5.2.0", - "esutils": "^2.0.2", - "optionator": "^0.8.1", - "source-map": "~0.6.1" - }, - "dependencies": { - "levn": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/levn/-/levn-0.3.0.tgz", - "integrity": "sha512-0OO4y2iOHix2W6ujICbKIaEQXvFQHue65vUG3pb5EUomzPI90z9hsA1VsO/dbIIpC53J8gxM9Q4Oho0jrCM/yA==", - "requires": { - "prelude-ls": "~1.1.2", - "type-check": "~0.3.2" - } - }, - "optionator": { - "version": "0.8.3", - "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.8.3.tgz", - "integrity": "sha512-+IW9pACdk3XWmmTXG8m3upGUJst5XRGzxMRjXzAuJ1XnIFNvfhjjIuYkDvysnPQ7qzqVzLt78BCruntqRhWQbA==", - "requires": { - "deep-is": "~0.1.3", - "fast-levenshtein": "~2.0.6", - "levn": "~0.3.0", - "prelude-ls": "~1.1.2", - "type-check": "~0.3.2", - "word-wrap": "~1.2.3" - } - }, - "prelude-ls": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.1.2.tgz", - "integrity": "sha512-ESF23V4SKG6lVSGZgYNpbsiaAkdab6ZgOxe52p7+Kid3W3u3bxR4Vfd/o21dmN7jSt0IwgZ4v5MUd26FEtXE9w==" - }, - "source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", - "optional": true - }, - "type-check": { - "version": "0.3.2", - "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.3.2.tgz", - "integrity": "sha512-ZCmOJdvOWDBYJlzAoFkC+Q0+bUyEOS1ltgp1MGU03fqHG+dbi9tBFU2Rd9QKiDZFAYrhPh2JUf7rZRIuHRKtOg==", - "requires": { - "prelude-ls": "~1.1.2" - } - } - } - }, - "eslint": { - "version": "8.19.0", - "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.19.0.tgz", - "integrity": "sha512-SXOPj3x9VKvPe81TjjUJCYlV4oJjQw68Uek+AM0X4p+33dj2HY5bpTZOgnQHcG2eAm1mtCU9uNMnJi7exU/kYw==", - "requires": { - "@eslint/eslintrc": "^1.3.0", - "@humanwhocodes/config-array": "^0.9.2", - "ajv": "^6.10.0", - "chalk": "^4.0.0", - "cross-spawn": "^7.0.2", - "debug": "^4.3.2", - "doctrine": "^3.0.0", - "escape-string-regexp": "^4.0.0", - "eslint-scope": "^7.1.1", - "eslint-utils": "^3.0.0", - "eslint-visitor-keys": "^3.3.0", - "espree": "^9.3.2", - "esquery": "^1.4.0", - "esutils": "^2.0.2", - "fast-deep-equal": "^3.1.3", - "file-entry-cache": "^6.0.1", - "functional-red-black-tree": "^1.0.1", - "glob-parent": "^6.0.1", - "globals": "^13.15.0", - "ignore": "^5.2.0", - "import-fresh": "^3.0.0", - "imurmurhash": "^0.1.4", - "is-glob": "^4.0.0", - "js-yaml": "^4.1.0", - "json-stable-stringify-without-jsonify": "^1.0.1", - "levn": "^0.4.1", - "lodash.merge": "^4.6.2", - "minimatch": "^3.1.2", - "natural-compare": "^1.4.0", - "optionator": "^0.9.1", - "regexpp": "^3.2.0", - "strip-ansi": "^6.0.1", - "strip-json-comments": "^3.1.0", - "text-table": "^0.2.0", - "v8-compile-cache": "^2.0.3" - }, - "dependencies": { - "ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "requires": { - "color-convert": "^2.0.1" - } - }, - "argparse": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", - "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==" - }, - "chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", - "requires": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - } - }, - "color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "requires": { - "color-name": "~1.1.4" - } - }, - "color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" - }, - "escape-string-regexp": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz", - "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==" - }, - "globals": { - "version": "13.16.0", - "resolved": "https://registry.npmjs.org/globals/-/globals-13.16.0.tgz", - "integrity": "sha512-A1lrQfpNF+McdPOnnFqY3kSN0AFTy485bTi1bkLk4mVPODIUEcSfhHgRqA+QdXPksrSTTztYXx37NFV+GpGk3Q==", - "requires": { - "type-fest": "^0.20.2" - } - }, - "has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==" - }, - "js-yaml": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz", - "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==", - "requires": { - "argparse": "^2.0.1" - } - }, - "supports-color": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", - "requires": { - "has-flag": "^4.0.0" - } - }, - "type-fest": { - "version": "0.20.2", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.20.2.tgz", - "integrity": "sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==" - } - } - }, - "eslint-config-react-app": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/eslint-config-react-app/-/eslint-config-react-app-7.0.1.tgz", - "integrity": "sha512-K6rNzvkIeHaTd8m/QEh1Zko0KI7BACWkkneSs6s9cKZC/J27X3eZR6Upt1jkmZ/4FK+XUOPPxMEN7+lbUXfSlA==", - "requires": { - "@babel/core": "^7.16.0", - "@babel/eslint-parser": "^7.16.3", - "@rushstack/eslint-patch": "^1.1.0", - "@typescript-eslint/eslint-plugin": "^5.5.0", - "@typescript-eslint/parser": "^5.5.0", - "babel-preset-react-app": "^10.0.1", - "confusing-browser-globals": "^1.0.11", - "eslint-plugin-flowtype": "^8.0.3", - "eslint-plugin-import": "^2.25.3", - "eslint-plugin-jest": "^25.3.0", - "eslint-plugin-jsx-a11y": "^6.5.1", - "eslint-plugin-react": "^7.27.1", - "eslint-plugin-react-hooks": "^4.3.0", - "eslint-plugin-testing-library": "^5.0.1" - } - }, - "eslint-import-resolver-node": { - "version": "0.3.6", - "resolved": "https://registry.npmjs.org/eslint-import-resolver-node/-/eslint-import-resolver-node-0.3.6.tgz", - "integrity": "sha512-0En0w03NRVMn9Uiyn8YRPDKvWjxCWkslUEhGNTdGx15RvPJYQ+lbOlqrlNI2vEAs4pDYK4f/HN2TbDmk5TP0iw==", - "requires": { - "debug": "^3.2.7", - "resolve": "^1.20.0" - }, - "dependencies": { - "debug": { - "version": "3.2.7", - "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", - "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", - "requires": { - "ms": "^2.1.1" - } - } - } - }, - "eslint-module-utils": { - "version": "2.7.3", - "resolved": "https://registry.npmjs.org/eslint-module-utils/-/eslint-module-utils-2.7.3.tgz", - "integrity": "sha512-088JEC7O3lDZM9xGe0RerkOMd0EjFl+Yvd1jPWIkMT5u3H9+HC34mWWPnqPrN13gieT9pBOO+Qt07Nb/6TresQ==", - "requires": { - "debug": "^3.2.7", - "find-up": "^2.1.0" - }, - "dependencies": { - "debug": { - "version": "3.2.7", - "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", - "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", - "requires": { - "ms": "^2.1.1" - } - }, - "find-up": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-2.1.0.tgz", - "integrity": "sha512-NWzkk0jSJtTt08+FBFMvXoeZnOJD+jTtsRmBYbAIzJdX6l7dLgR7CTubCM5/eDdPUBvLCeVasP1brfVR/9/EZQ==", - "requires": { - "locate-path": "^2.0.0" - } - }, - "locate-path": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-2.0.0.tgz", - "integrity": "sha512-NCI2kiDkyR7VeEKm27Kda/iQHyKJe1Bu0FlTbYp3CqJu+9IFe9bLyAjMxf5ZDDbEg+iMPzB5zYyUTSm8wVTKmA==", - "requires": { - "p-locate": "^2.0.0", - "path-exists": "^3.0.0" - } - }, - "p-limit": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-1.3.0.tgz", - "integrity": "sha512-vvcXsLAJ9Dr5rQOPk7toZQZJApBl2K4J6dANSsEuh6QI41JYcsS/qhTGa9ErIUUgK3WNQoJYvylxvjqmiqEA9Q==", - "requires": { - "p-try": "^1.0.0" - } - }, - "p-locate": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-2.0.0.tgz", - "integrity": "sha512-nQja7m7gSKuewoVRen45CtVfODR3crN3goVQ0DDZ9N3yHxgpkuBhZqsaiotSQRrADUrne346peY7kT3TSACykg==", - "requires": { - "p-limit": "^1.1.0" - } - }, - "p-try": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/p-try/-/p-try-1.0.0.tgz", - "integrity": "sha512-U1etNYuMJoIz3ZXSrrySFjsXQTWOx2/jdi86L+2pRvph/qMKL6sbcCYdH23fqsbm8TH2Gn0OybpT4eSFlCVHww==" - }, - "path-exists": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz", - "integrity": "sha512-bpC7GYwiDYQ4wYLe+FA8lhRjhQCMcQGuSgGGqDkg/QerRWw9CmGRT0iSOVRSZJ29NMLZgIzqaljJ63oaL4NIJQ==" - } - } - }, - "eslint-plugin-flowtype": { - "version": "8.0.3", - "resolved": "https://registry.npmjs.org/eslint-plugin-flowtype/-/eslint-plugin-flowtype-8.0.3.tgz", - "integrity": "sha512-dX8l6qUL6O+fYPtpNRideCFSpmWOUVx5QcaGLVqe/vlDiBSe4vYljDWDETwnyFzpl7By/WVIu6rcrniCgH9BqQ==", - "requires": { - "lodash": "^4.17.21", - "string-natural-compare": "^3.0.1" - } - }, - "eslint-plugin-import": { - "version": "2.26.0", - "resolved": "https://registry.npmjs.org/eslint-plugin-import/-/eslint-plugin-import-2.26.0.tgz", - "integrity": "sha512-hYfi3FXaM8WPLf4S1cikh/r4IxnO6zrhZbEGz2b660EJRbuxgpDS5gkCuYgGWg2xxh2rBuIr4Pvhve/7c31koA==", - "requires": { - "array-includes": "^3.1.4", - "array.prototype.flat": "^1.2.5", - "debug": "^2.6.9", - "doctrine": "^2.1.0", - "eslint-import-resolver-node": "^0.3.6", - "eslint-module-utils": "^2.7.3", - "has": "^1.0.3", - "is-core-module": "^2.8.1", - "is-glob": "^4.0.3", - "minimatch": "^3.1.2", - "object.values": "^1.1.5", - "resolve": "^1.22.0", - "tsconfig-paths": "^3.14.1" - }, - "dependencies": { - "debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", - "requires": { - "ms": "2.0.0" - } - }, - "doctrine": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-2.1.0.tgz", - "integrity": "sha512-35mSku4ZXK0vfCuHEDAwt55dg2jNajHZ1odvF+8SSr82EsZY4QmXfuWso8oEd8zRhVObSN18aM0CjSdoBX7zIw==", - "requires": { - "esutils": "^2.0.2" - } - }, - "ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==" - } - } - }, - "eslint-plugin-jest": { - "version": "25.7.0", - "resolved": "https://registry.npmjs.org/eslint-plugin-jest/-/eslint-plugin-jest-25.7.0.tgz", - "integrity": "sha512-PWLUEXeeF7C9QGKqvdSbzLOiLTx+bno7/HC9eefePfEb257QFHg7ye3dh80AZVkaa/RQsBB1Q/ORQvg2X7F0NQ==", - "requires": { - "@typescript-eslint/experimental-utils": "^5.0.0" - } - }, - "eslint-plugin-jsx-a11y": { - "version": "6.6.0", - "resolved": "https://registry.npmjs.org/eslint-plugin-jsx-a11y/-/eslint-plugin-jsx-a11y-6.6.0.tgz", - "integrity": "sha512-kTeLuIzpNhXL2CwLlc8AHI0aFRwWHcg483yepO9VQiHzM9bZwJdzTkzBszbuPrbgGmq2rlX/FaT2fJQsjUSHsw==", - "requires": { - "@babel/runtime": "^7.18.3", - "aria-query": "^4.2.2", - "array-includes": "^3.1.5", - "ast-types-flow": "^0.0.7", - "axe-core": "^4.4.2", - "axobject-query": "^2.2.0", - "damerau-levenshtein": "^1.0.8", - "emoji-regex": "^9.2.2", - "has": "^1.0.3", - "jsx-ast-utils": "^3.3.1", - "language-tags": "^1.0.5", - "minimatch": "^3.1.2", - "semver": "^6.3.0" - }, - "dependencies": { - "semver": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", - "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==" - } - } - }, - "eslint-plugin-react": { - "version": "7.30.1", - "resolved": "https://registry.npmjs.org/eslint-plugin-react/-/eslint-plugin-react-7.30.1.tgz", - "integrity": "sha512-NbEvI9jtqO46yJA3wcRF9Mo0lF9T/jhdHqhCHXiXtD+Zcb98812wvokjWpU7Q4QH5edo6dmqrukxVvWWXHlsUg==", - "requires": { - "array-includes": "^3.1.5", - "array.prototype.flatmap": "^1.3.0", - "doctrine": "^2.1.0", - "estraverse": "^5.3.0", - "jsx-ast-utils": "^2.4.1 || ^3.0.0", - "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.3", - "semver": "^6.3.0", - "string.prototype.matchall": "^4.0.7" - }, - "dependencies": { - "doctrine": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-2.1.0.tgz", - "integrity": "sha512-35mSku4ZXK0vfCuHEDAwt55dg2jNajHZ1odvF+8SSr82EsZY4QmXfuWso8oEd8zRhVObSN18aM0CjSdoBX7zIw==", - "requires": { - "esutils": "^2.0.2" - } - }, - "resolve": { - "version": "2.0.0-next.4", - "resolved": "https://registry.npmjs.org/resolve/-/resolve-2.0.0-next.4.tgz", - "integrity": "sha512-iMDbmAWtfU+MHpxt/I5iWI7cY6YVEZUQ3MBgPQ++XD1PELuJHIl82xBmObyP2KyQmkNB2dsqF7seoQQiAn5yDQ==", - "requires": { - "is-core-module": "^2.9.0", - "path-parse": "^1.0.7", - "supports-preserve-symlinks-flag": "^1.0.0" - } - }, - "semver": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", - "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==" - } - } - }, - "eslint-plugin-react-hooks": { - "version": "4.6.0", - "resolved": "https://registry.npmjs.org/eslint-plugin-react-hooks/-/eslint-plugin-react-hooks-4.6.0.tgz", - "integrity": "sha512-oFc7Itz9Qxh2x4gNHStv3BqJq54ExXmfC+a1NjAta66IAN87Wu0R/QArgIS9qKzX3dXKPI9H5crl9QchNMY9+g==", - "requires": {} - }, - "eslint-plugin-testing-library": { - "version": "5.5.1", - "resolved": "https://registry.npmjs.org/eslint-plugin-testing-library/-/eslint-plugin-testing-library-5.5.1.tgz", - "integrity": "sha512-plLEkkbAKBjPxsLj7x4jNapcHAg2ernkQlKKrN2I8NrQwPISZHyCUNvg5Hv3EDqOQReToQb5bnqXYbkijJPE/g==", - "requires": { - "@typescript-eslint/utils": "^5.13.0" - } - }, - "eslint-scope": { - "version": "7.1.1", - "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-7.1.1.tgz", - "integrity": "sha512-QKQM/UXpIiHcLqJ5AOyIW7XZmzjkzQXYE54n1++wb0u9V/abW3l9uQnxX8Z5Xd18xyKIMTUAyQ0k1e8pz6LUrw==", - "requires": { - "esrecurse": "^4.3.0", - "estraverse": "^5.2.0" - } - }, - "eslint-utils": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/eslint-utils/-/eslint-utils-3.0.0.tgz", - "integrity": "sha512-uuQC43IGctw68pJA1RgbQS8/NP7rch6Cwd4j3ZBtgo4/8Flj4eGE7ZYSZRN3iq5pVUv6GPdW5Z1RFleo84uLDA==", - "requires": { - "eslint-visitor-keys": "^2.0.0" - }, - "dependencies": { - "eslint-visitor-keys": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-2.1.0.tgz", - "integrity": "sha512-0rSmRBzXgDzIsD6mGdJgevzgezI534Cer5L/vyMX0kHzT/jiB43jRhd9YUlMGYLQy2zprNmoT8qasCGtY+QaKw==" - } - } - }, - "eslint-visitor-keys": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.3.0.tgz", - "integrity": "sha512-mQ+suqKJVyeuwGYHAdjMFqjCyfl8+Ldnxuyp3ldiMBFKkvytrXUZWaiPCEav8qDHKty44bD+qV1IP4T+w+xXRA==" - }, - "eslint-webpack-plugin": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/eslint-webpack-plugin/-/eslint-webpack-plugin-3.2.0.tgz", - "integrity": "sha512-avrKcGncpPbPSUHX6B3stNGzkKFto3eL+DKM4+VyMrVnhPc3vRczVlCq3uhuFOdRvDHTVXuzwk1ZKUrqDQHQ9w==", - "requires": { - "@types/eslint": "^7.29.0 || ^8.4.1", - "jest-worker": "^28.0.2", - "micromatch": "^4.0.5", - "normalize-path": "^3.0.0", - "schema-utils": "^4.0.0" - }, - "dependencies": { - "ajv": { - "version": "8.11.0", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.11.0.tgz", - "integrity": "sha512-wGgprdCvMalC0BztXvitD2hC04YffAvtsUn93JbGXYLAtCUO4xd17mCCZQxUOItiBwZvJScWo8NIvQMQ71rdpg==", - "requires": { - "fast-deep-equal": "^3.1.1", - "json-schema-traverse": "^1.0.0", - "require-from-string": "^2.0.2", - "uri-js": "^4.2.2" - } - }, - "ajv-keywords": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-5.1.0.tgz", - "integrity": "sha512-YCS/JNFAUyr5vAuhk1DWm1CBxRHW9LbJ2ozWeemrIqpbsqKjHVxYPyi5GC0rjZIT5JxJ3virVTS8wk4i/Z+krw==", - "requires": { - "fast-deep-equal": "^3.1.3" - } - }, - "has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==" - }, - "jest-worker": { - "version": "28.1.1", - "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-28.1.1.tgz", - "integrity": "sha512-Au7slXB08C6h+xbJPp7VIb6U0XX5Kc9uel/WFc6/rcTzGiaVCBRngBExSYuXSLFPULPSYU3cJ3ybS988lNFQhQ==", - "requires": { - "@types/node": "*", - "merge-stream": "^2.0.0", - "supports-color": "^8.0.0" - } - }, - "json-schema-traverse": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", - "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==" - }, - "schema-utils": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-4.0.0.tgz", - "integrity": "sha512-1edyXKgh6XnJsJSQ8mKWXnN/BVaIbFMLpouRUrXgVq7WYne5kw3MW7UPhO44uRXQSIpTSXoJbmrR2X0w9kUTyg==", - "requires": { - "@types/json-schema": "^7.0.9", - "ajv": "^8.8.0", - "ajv-formats": "^2.1.1", - "ajv-keywords": "^5.0.0" - } - }, - "supports-color": { - "version": "8.1.1", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz", - "integrity": "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==", - "requires": { - "has-flag": "^4.0.0" - } - } - } - }, - "espree": { - "version": "9.3.2", - "resolved": "https://registry.npmjs.org/espree/-/espree-9.3.2.tgz", - "integrity": "sha512-D211tC7ZwouTIuY5x9XnS0E9sWNChB7IYKX/Xp5eQj3nFXhqmiUDB9q27y76oFl8jTg3pXcQx/bpxMfs3CIZbA==", - "requires": { - "acorn": "^8.7.1", - "acorn-jsx": "^5.3.2", - "eslint-visitor-keys": "^3.3.0" - } - }, - "esprima": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz", - "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==" - }, - "esquery": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.4.0.tgz", - "integrity": "sha512-cCDispWt5vHHtwMY2YrAQ4ibFkAL8RbH5YGBnZBc90MolvvfkkQcJro/aZiAQUlQ3qgrYS6D6v8Gc5G5CQsc9w==", - "requires": { - "estraverse": "^5.1.0" - } - }, - "esrecurse": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.3.0.tgz", - "integrity": "sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==", - "requires": { - "estraverse": "^5.2.0" - } - }, - "estraverse": { - "version": "5.3.0", - "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", - "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==" - }, - "estree-walker": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-1.0.1.tgz", - "integrity": "sha512-1fMXF3YP4pZZVozF8j/ZLfvnR8NSIljt56UhbZ5PeeDmmGHpgpdwQt7ITlGvYaQukCvuBRMLEiKiYC+oeIg4cg==" - }, - "esutils": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz", - "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==" - }, - "etag": { - "version": "1.8.1", - "resolved": "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz", - "integrity": "sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg==" - }, - "eventemitter3": { - "version": "4.0.7", - "resolved": "https://registry.npmjs.org/eventemitter3/-/eventemitter3-4.0.7.tgz", - "integrity": "sha512-8guHBZCwKnFhYdHr2ysuRWErTwhoN2X8XELRlrRwpmfeY2jjuUN4taQMsULKUVo1K4DvZl+0pgfyoysHxvmvEw==" - }, - "events": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/events/-/events-3.3.0.tgz", - "integrity": "sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q==" - }, - "execa": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/execa/-/execa-5.1.1.tgz", - "integrity": "sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg==", - "requires": { - "cross-spawn": "^7.0.3", - "get-stream": "^6.0.0", - "human-signals": "^2.1.0", - "is-stream": "^2.0.0", - "merge-stream": "^2.0.0", - "npm-run-path": "^4.0.1", - "onetime": "^5.1.2", - "signal-exit": "^3.0.3", - "strip-final-newline": "^2.0.0" - } - }, - "exit": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/exit/-/exit-0.1.2.tgz", - "integrity": "sha512-Zk/eNKV2zbjpKzrsQ+n1G6poVbErQxJ0LBOJXaKZ1EViLzH+hrLu9cdXI4zw9dBQJslwBEpbQ2P1oS7nDxs6jQ==" - }, - "expect": { - "version": "27.5.1", - "resolved": "https://registry.npmjs.org/expect/-/expect-27.5.1.tgz", - "integrity": "sha512-E1q5hSUG2AmYQwQJ041nvgpkODHQvB+RKlB4IYdru6uJsyFTRyZAP463M+1lINorwbqAmUggi6+WwkD8lCS/Dw==", - "requires": { - "@jest/types": "^27.5.1", - "jest-get-type": "^27.5.1", - "jest-matcher-utils": "^27.5.1", - "jest-message-util": "^27.5.1" - } - }, - "express": { - "version": "4.18.1", - "resolved": "https://registry.npmjs.org/express/-/express-4.18.1.tgz", - "integrity": "sha512-zZBcOX9TfehHQhtupq57OF8lFZ3UZi08Y97dwFCkD8p9d/d2Y3M+ykKcwaMDEL+4qyUolgBDX6AblpR3fL212Q==", - "requires": { - "accepts": "~1.3.8", - "array-flatten": "1.1.1", - "body-parser": "1.20.0", - "content-disposition": "0.5.4", - "content-type": "~1.0.4", - "cookie": "0.5.0", - "cookie-signature": "1.0.6", - "debug": "2.6.9", - "depd": "2.0.0", - "encodeurl": "~1.0.2", - "escape-html": "~1.0.3", - "etag": "~1.8.1", - "finalhandler": "1.2.0", - "fresh": "0.5.2", - "http-errors": "2.0.0", - "merge-descriptors": "1.0.1", - "methods": "~1.1.2", - "on-finished": "2.4.1", - "parseurl": "~1.3.3", - "path-to-regexp": "0.1.7", - "proxy-addr": "~2.0.7", - "qs": "6.10.3", - "range-parser": "~1.2.1", - "safe-buffer": "5.2.1", - "send": "0.18.0", - "serve-static": "1.15.0", - "setprototypeof": "1.2.0", - "statuses": "2.0.1", - "type-is": "~1.6.18", - "utils-merge": "1.0.1", - "vary": "~1.1.2" - }, - "dependencies": { - "array-flatten": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-1.1.1.tgz", - "integrity": "sha512-PCVAQswWemu6UdxsDFFX/+gVeYqKAod3D3UVm91jHwynguOwAvYPhx8nNlM++NqRcK6CxxpUafjmhIdKiHibqg==" - }, - "debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", - "requires": { - "ms": "2.0.0" - } - }, - "ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==" - }, - "safe-buffer": { - "version": "5.2.1", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", - "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==" - } - } - }, - "fast-deep-equal": { - "version": "3.1.3", - "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", - "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==" - }, - "fast-glob": { - "version": "3.2.11", - "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.2.11.tgz", - "integrity": "sha512-xrO3+1bxSo3ZVHAnqzyuewYT6aMFHRAd4Kcs92MAonjwQZLsK9d0SF1IyQ3k5PoirxTW0Oe/RqFgMQ6TcNE5Ew==", - "requires": { - "@nodelib/fs.stat": "^2.0.2", - "@nodelib/fs.walk": "^1.2.3", - "glob-parent": "^5.1.2", - "merge2": "^1.3.0", - "micromatch": "^4.0.4" - }, - "dependencies": { - "glob-parent": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", - "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", - "requires": { - "is-glob": "^4.0.1" - } - } - } - }, - "fast-json-stable-stringify": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz", - "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==" - }, - "fast-levenshtein": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz", - "integrity": "sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==" - }, - "fastq": { - "version": "1.13.0", - "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.13.0.tgz", - "integrity": "sha512-YpkpUnK8od0o1hmeSc7UUs/eB/vIPWJYjKck2QKIzAf71Vm1AAQ3EbuZB3g2JIy+pg+ERD0vqI79KyZiB2e2Nw==", - "requires": { - "reusify": "^1.0.4" - } - }, - "faye-websocket": { - "version": "0.11.4", - "resolved": "https://registry.npmjs.org/faye-websocket/-/faye-websocket-0.11.4.tgz", - "integrity": "sha512-CzbClwlXAuiRQAlUyfqPgvPoNKTckTPGfwZV4ZdAhVcP2lh9KUxJg2b5GkE7XbjKQ3YJnQ9z6D9ntLAlB+tP8g==", - "requires": { - "websocket-driver": ">=0.5.1" - } - }, - "fb-watchman": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/fb-watchman/-/fb-watchman-2.0.1.tgz", - "integrity": "sha512-DkPJKQeY6kKwmuMretBhr7G6Vodr7bFwDYTXIkfG1gjvNpaxBTQV3PbXg6bR1c1UP4jPOX0jHUbbHANL9vRjVg==", - "requires": { - "bser": "2.1.1" - } - }, - "file-entry-cache": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-6.0.1.tgz", - "integrity": "sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg==", - "requires": { - "flat-cache": "^3.0.4" - } - }, - "file-loader": { - "version": "6.2.0", - "resolved": "https://registry.npmjs.org/file-loader/-/file-loader-6.2.0.tgz", - "integrity": "sha512-qo3glqyTa61Ytg4u73GultjHGjdRyig3tG6lPtyX/jOEJvHif9uB0/OCI2Kif6ctF3caQTW2G5gym21oAsI4pw==", - "requires": { - "loader-utils": "^2.0.0", - "schema-utils": "^3.0.0" - } - }, - "filelist": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/filelist/-/filelist-1.0.4.tgz", - "integrity": "sha512-w1cEuf3S+DrLCQL7ET6kz+gmlJdbq9J7yXCSjK/OZCPA+qEN1WyF4ZAf0YYJa4/shHJra2t/d/r8SV4Ji+x+8Q==", - "requires": { - "minimatch": "^5.0.1" - }, - "dependencies": { - "brace-expansion": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", - "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", - "requires": { - "balanced-match": "^1.0.0" - } - }, - "minimatch": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-5.1.0.tgz", - "integrity": "sha512-9TPBGGak4nHfGZsPBohm9AWg6NoT7QTCehS3BIJABslyZbzxfV78QM2Y6+i741OPZIafFAaiiEMh5OyIrJPgtg==", - "requires": { - "brace-expansion": "^2.0.1" - } - } - } - }, - "filesize": { - "version": "8.0.7", - "resolved": "https://registry.npmjs.org/filesize/-/filesize-8.0.7.tgz", - "integrity": "sha512-pjmC+bkIF8XI7fWaH8KxHcZL3DPybs1roSKP4rKDvy20tAWwIObE4+JIseG2byfGKhud5ZnM4YSGKBz7Sh0ndQ==" - }, - "fill-range": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", - "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", - "requires": { - "to-regex-range": "^5.0.1" - } - }, - "finalhandler": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.2.0.tgz", - "integrity": "sha512-5uXcUVftlQMFnWC9qu/svkWv3GTd2PfUhK/3PLkYNAe7FbqJMt3515HaxE6eRL74GdsriiwujiawdaB1BpEISg==", - "requires": { - "debug": "2.6.9", - "encodeurl": "~1.0.2", - "escape-html": "~1.0.3", - "on-finished": "2.4.1", - "parseurl": "~1.3.3", - "statuses": "2.0.1", - "unpipe": "~1.0.0" - }, - "dependencies": { - "debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", - "requires": { - "ms": "2.0.0" - } - }, - "ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==" - } - } - }, - "find-cache-dir": { - "version": "3.3.2", - "resolved": "https://registry.npmjs.org/find-cache-dir/-/find-cache-dir-3.3.2.tgz", - "integrity": "sha512-wXZV5emFEjrridIgED11OoUKLxiYjAcqot/NJdAkOhlJ+vGzwhOAfcG5OX1jP+S0PcjEn8bdMJv+g2jwQ3Onig==", - "requires": { - "commondir": "^1.0.1", - "make-dir": "^3.0.2", - "pkg-dir": "^4.1.0" - } - }, - "find-up": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz", - "integrity": "sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==", - "requires": { - "locate-path": "^6.0.0", - "path-exists": "^4.0.0" - } - }, - "flat-cache": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-3.0.4.tgz", - "integrity": "sha512-dm9s5Pw7Jc0GvMYbshN6zchCA9RgQlzzEZX3vylR9IqFfS8XciblUXOKfW6SiuJ0e13eDYZoZV5wdrev7P3Nwg==", - "requires": { - "flatted": "^3.1.0", - "rimraf": "^3.0.2" - } - }, - "flatted": { - "version": "3.2.6", - "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.2.6.tgz", - "integrity": "sha512-0sQoMh9s0BYsm+12Huy/rkKxVu4R1+r96YX5cG44rHV0pQ6iC3Q+mkoMFaGWObMFYQxCVT+ssG1ksneA2MI9KQ==" - }, - "follow-redirects": { - "version": "1.15.1", - "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.1.tgz", - "integrity": "sha512-yLAMQs+k0b2m7cVxpS1VKJVvoz7SS9Td1zss3XRwXj+ZDH00RJgnuLx7E44wx02kQLrdM3aOOy+FpzS7+8OizA==" - }, - "fork-ts-checker-webpack-plugin": { - "version": "6.5.2", - "resolved": "https://registry.npmjs.org/fork-ts-checker-webpack-plugin/-/fork-ts-checker-webpack-plugin-6.5.2.tgz", - "integrity": "sha512-m5cUmF30xkZ7h4tWUgTAcEaKmUW7tfyUyTqNNOz7OxWJ0v1VWKTcOvH8FWHUwSjlW/356Ijc9vi3XfcPstpQKA==", - "requires": { - "@babel/code-frame": "^7.8.3", - "@types/json-schema": "^7.0.5", - "chalk": "^4.1.0", - "chokidar": "^3.4.2", - "cosmiconfig": "^6.0.0", - "deepmerge": "^4.2.2", - "fs-extra": "^9.0.0", - "glob": "^7.1.6", - "memfs": "^3.1.2", - "minimatch": "^3.0.4", - "schema-utils": "2.7.0", - "semver": "^7.3.2", - "tapable": "^1.0.0" - }, - "dependencies": { - "ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "requires": { - "color-convert": "^2.0.1" - } - }, - "chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", - "requires": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - } - }, - "color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "requires": { - "color-name": "~1.1.4" - } - }, - "color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" - }, - "cosmiconfig": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-6.0.0.tgz", - "integrity": "sha512-xb3ZL6+L8b9JLLCx3ZdoZy4+2ECphCMo2PwqgP1tlfVq6M6YReyzBJtvWWtbDSpNr9hn96pkCiZqUcFEc+54Qg==", - "requires": { - "@types/parse-json": "^4.0.0", - "import-fresh": "^3.1.0", - "parse-json": "^5.0.0", - "path-type": "^4.0.0", - "yaml": "^1.7.2" - } - }, - "fs-extra": { - "version": "9.1.0", - "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-9.1.0.tgz", - "integrity": "sha512-hcg3ZmepS30/7BSFqRvoo3DOMQu7IjqxO5nCDt+zM9XWjb33Wg7ziNT+Qvqbuc3+gWpzO02JubVyk2G4Zvo1OQ==", - "requires": { - "at-least-node": "^1.0.0", - "graceful-fs": "^4.2.0", - "jsonfile": "^6.0.1", - "universalify": "^2.0.0" - } - }, - "has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==" - }, - "schema-utils": { - "version": "2.7.0", - "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-2.7.0.tgz", - "integrity": "sha512-0ilKFI6QQF5nxDZLFn2dMjvc4hjg/Wkg7rHd3jK6/A4a1Hl9VFdQWvgB1UMGoU94pad1P/8N7fMcEnLnSiju8A==", - "requires": { - "@types/json-schema": "^7.0.4", - "ajv": "^6.12.2", - "ajv-keywords": "^3.4.1" - } - }, - "supports-color": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", - "requires": { - "has-flag": "^4.0.0" - } - }, - "tapable": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/tapable/-/tapable-1.1.3.tgz", - "integrity": "sha512-4WK/bYZmj8xLr+HUCODHGF1ZFzsYffasLUgEiMBY4fgtltdO6B4WJtlSbPaDTLpYTcGVwM2qLnFTICEcNxs3kA==" - } - } - }, - "form-data": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/form-data/-/form-data-3.0.1.tgz", - "integrity": "sha512-RHkBKtLWUVwd7SqRIvCZMEvAMoGUp0XU+seQiZejj0COz3RI3hWP4sCv3gZWWLjJTd7rGwcsF5eKZGii0r/hbg==", - "requires": { - "asynckit": "^0.4.0", - "combined-stream": "^1.0.8", - "mime-types": "^2.1.12" - } - }, - "forwarded": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.2.0.tgz", - "integrity": "sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow==" - }, - "fraction.js": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/fraction.js/-/fraction.js-4.2.0.tgz", - "integrity": "sha512-MhLuK+2gUcnZe8ZHlaaINnQLl0xRIGRfcGk2yl8xoQAfHrSsL3rYu6FCmBdkdbhc9EPlwyGHewaRsvwRMJtAlA==" - }, - "fresh": { - "version": "0.5.2", - "resolved": "https://registry.npmjs.org/fresh/-/fresh-0.5.2.tgz", - "integrity": "sha512-zJ2mQYM18rEFOudeV4GShTGIQ7RbzA7ozbU9I/XBpm7kqgMywgmylMwXHxZJmkVoYkna9d2pVXVXPdYTP9ej8Q==" - }, - "fs-extra": { - "version": "10.1.0", - "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-10.1.0.tgz", - "integrity": "sha512-oRXApq54ETRj4eMiFzGnHWGy+zo5raudjuxN0b8H7s/RU2oW0Wvsx9O0ACRN/kRq9E8Vu/ReskGB5o3ji+FzHQ==", - "requires": { - "graceful-fs": "^4.2.0", - "jsonfile": "^6.0.1", - "universalify": "^2.0.0" - } - }, - "fs-monkey": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/fs-monkey/-/fs-monkey-1.0.3.tgz", - "integrity": "sha512-cybjIfiiE+pTWicSCLFHSrXZ6EilF30oh91FDP9S2B051prEa7QWfrVTQm10/dDpswBDXZugPa1Ogu8Yh+HV0Q==" - }, - "fs.realpath": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", - "integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==" - }, - "fsevents": { - "version": "2.3.2", - "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.2.tgz", - "integrity": "sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==", - "optional": true - }, - "function-bind": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", - "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==" - }, - "function.prototype.name": { - "version": "1.1.5", - "resolved": "https://registry.npmjs.org/function.prototype.name/-/function.prototype.name-1.1.5.tgz", - "integrity": "sha512-uN7m/BzVKQnCUF/iW8jYea67v++2u7m5UgENbHRtdDVclOUP+FMPlCNdmk0h/ysGyo2tavMJEDqJAkJdRa1vMA==", - "requires": { - "call-bind": "^1.0.2", - "define-properties": "^1.1.3", - "es-abstract": "^1.19.0", - "functions-have-names": "^1.2.2" - } - }, - "functional-red-black-tree": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/functional-red-black-tree/-/functional-red-black-tree-1.0.1.tgz", - "integrity": "sha512-dsKNQNdj6xA3T+QlADDA7mOSlX0qiMINjn0cgr+eGHGsbSHzTabcIogz2+p/iqP1Xs6EP/sS2SbqH+brGTbq0g==" - }, - "functions-have-names": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/functions-have-names/-/functions-have-names-1.2.3.tgz", - "integrity": "sha512-xckBUXyTIqT97tq2x2AMb+g163b5JFysYk0x4qxNFwbfQkmNZoiRHb6sPzI9/QV33WeuvVYBUIiD4NzNIyqaRQ==" - }, - "gensync": { - "version": "1.0.0-beta.2", - "resolved": "https://registry.npmjs.org/gensync/-/gensync-1.0.0-beta.2.tgz", - "integrity": "sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==" - }, - "get-caller-file": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", - "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==" - }, - "get-intrinsic": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.1.2.tgz", - "integrity": "sha512-Jfm3OyCxHh9DJyc28qGk+JmfkpO41A4XkneDSujN9MDXrm4oDKdHvndhZ2dN94+ERNfkYJWDclW6k2L/ZGHjXA==", - "requires": { - "function-bind": "^1.1.1", - "has": "^1.0.3", - "has-symbols": "^1.0.3" - } - }, - "get-own-enumerable-property-symbols": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/get-own-enumerable-property-symbols/-/get-own-enumerable-property-symbols-3.0.2.tgz", - "integrity": "sha512-I0UBV/XOz1XkIJHEUDMZAbzCThU/H8DxmSfmdGcKPnVhu2VfFqr34jr9777IyaTYvxjedWhqVIilEDsCdP5G6g==" - }, - "get-package-type": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/get-package-type/-/get-package-type-0.1.0.tgz", - "integrity": "sha512-pjzuKtY64GYfWizNAJ0fr9VqttZkNiK2iS430LtIHzjBEr6bX8Am2zm4sW4Ro5wjWW5cAlRL1qAMTcXbjNAO2Q==" - }, - "get-stream": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-6.0.1.tgz", - "integrity": "sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==" - }, - "get-symbol-description": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/get-symbol-description/-/get-symbol-description-1.0.0.tgz", - "integrity": "sha512-2EmdH1YvIQiZpltCNgkuiUnyukzxM/R6NDJX31Ke3BG1Nq5b0S2PhX59UKi9vZpPDQVdqn+1IcaAwnzTT5vCjw==", - "requires": { - "call-bind": "^1.0.2", - "get-intrinsic": "^1.1.1" - } - }, - "glob": { - "version": "7.2.3", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", - "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", - "requires": { - "fs.realpath": "^1.0.0", - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "^3.1.1", - "once": "^1.3.0", - "path-is-absolute": "^1.0.0" - } - }, - "glob-parent": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-6.0.2.tgz", - "integrity": "sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==", - "requires": { - "is-glob": "^4.0.3" - } - }, - "glob-to-regexp": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/glob-to-regexp/-/glob-to-regexp-0.4.1.tgz", - "integrity": "sha512-lkX1HJXwyMcprw/5YUZc2s7DrpAiHB21/V+E1rHUrVNokkvB6bqMzT0VfV6/86ZNabt1k14YOIaT7nDvOX3Iiw==" - }, - "global-modules": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/global-modules/-/global-modules-2.0.0.tgz", - "integrity": "sha512-NGbfmJBp9x8IxyJSd1P+otYK8vonoJactOogrVfFRIAEY1ukil8RSKDz2Yo7wh1oihl51l/r6W4epkeKJHqL8A==", - "requires": { - "global-prefix": "^3.0.0" - } - }, - "global-prefix": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/global-prefix/-/global-prefix-3.0.0.tgz", - "integrity": "sha512-awConJSVCHVGND6x3tmMaKcQvwXLhjdkmomy2W+Goaui8YPgYgXJZewhg3fWC+DlfqqQuWg8AwqjGTD2nAPVWg==", - "requires": { - "ini": "^1.3.5", - "kind-of": "^6.0.2", - "which": "^1.3.1" - }, - "dependencies": { - "which": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz", - "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==", - "requires": { - "isexe": "^2.0.0" - } - } - } - }, - "globals": { - "version": "11.12.0", - "resolved": "https://registry.npmjs.org/globals/-/globals-11.12.0.tgz", - "integrity": "sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==" - }, - "globby": { - "version": "11.1.0", - "resolved": "https://registry.npmjs.org/globby/-/globby-11.1.0.tgz", - "integrity": "sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g==", - "requires": { - "array-union": "^2.1.0", - "dir-glob": "^3.0.1", - "fast-glob": "^3.2.9", - "ignore": "^5.2.0", - "merge2": "^1.4.1", - "slash": "^3.0.0" - } - }, - "graceful-fs": { - "version": "4.2.10", - "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.10.tgz", - "integrity": "sha512-9ByhssR2fPVsNZj478qUUbKfmL0+t5BDVyjShtyZZLiK7ZDAArFFfopyOTj0M05wE2tJPisA4iTnnXl2YoPvOA==" - }, - "gzip-size": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/gzip-size/-/gzip-size-6.0.0.tgz", - "integrity": "sha512-ax7ZYomf6jqPTQ4+XCpUGyXKHk5WweS+e05MBO4/y3WJ5RkmPXNKvX+bx1behVILVwr6JSQvZAku021CHPXG3Q==", - "requires": { - "duplexer": "^0.1.2" - } - }, - "handle-thing": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/handle-thing/-/handle-thing-2.0.1.tgz", - "integrity": "sha512-9Qn4yBxelxoh2Ow62nP+Ka/kMnOXRi8BXnRaUwezLNhqelnN49xKz4F/dPP8OYLxLxq6JDtZb2i9XznUQbNPTg==" - }, - "harmony-reflect": { - "version": "1.6.2", - "resolved": "https://registry.npmjs.org/harmony-reflect/-/harmony-reflect-1.6.2.tgz", - "integrity": "sha512-HIp/n38R9kQjDEziXyDTuW3vvoxxyxjxFzXLrBr18uB47GnSt+G9D29fqrpM5ZkspMcPICud3XsBJQ4Y2URg8g==" - }, - "has": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz", - "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==", - "requires": { - "function-bind": "^1.1.1" - } - }, - "has-bigints": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/has-bigints/-/has-bigints-1.0.2.tgz", - "integrity": "sha512-tSvCKtBr9lkF0Ex0aQiP9N+OpV4zi2r/Nee5VkRDbaqv35RLYMzbwQfFSZZH0kR+Rd6302UJZ2p/bJCEoR3VoQ==" - }, - "has-flag": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", - "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==" - }, - "has-property-descriptors": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/has-property-descriptors/-/has-property-descriptors-1.0.0.tgz", - "integrity": "sha512-62DVLZGoiEBDHQyqG4w9xCuZ7eJEwNmJRWw2VY84Oedb7WFcA27fiEVe8oUQx9hAUJ4ekurquucTGwsyO1XGdQ==", - "requires": { - "get-intrinsic": "^1.1.1" - } - }, - "has-symbols": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.3.tgz", - "integrity": "sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==" - }, - "has-tostringtag": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/has-tostringtag/-/has-tostringtag-1.0.0.tgz", - "integrity": "sha512-kFjcSNhnlGV1kyoGk7OXKSawH5JOb/LzUc5w9B02hOTO0dfFRjbHQKvg1d6cf3HbeUmtU9VbbV3qzZ2Teh97WQ==", - "requires": { - "has-symbols": "^1.0.2" - } - }, - "he": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/he/-/he-1.2.0.tgz", - "integrity": "sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw==" - }, - "hoopy": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/hoopy/-/hoopy-0.1.4.tgz", - "integrity": "sha512-HRcs+2mr52W0K+x8RzcLzuPPmVIKMSv97RGHy0Ea9y/mpcaK+xTrjICA04KAHi4GRzxliNqNJEFYWHghy3rSfQ==" - }, - "hpack.js": { - "version": "2.1.6", - "resolved": "https://registry.npmjs.org/hpack.js/-/hpack.js-2.1.6.tgz", - "integrity": "sha512-zJxVehUdMGIKsRaNt7apO2Gqp0BdqW5yaiGHXXmbpvxgBYVZnAql+BJb4RO5ad2MgpbZKn5G6nMnegrH1FcNYQ==", - "requires": { - "inherits": "^2.0.1", - "obuf": "^1.0.0", - "readable-stream": "^2.0.1", - "wbuf": "^1.1.0" - }, - "dependencies": { - "readable-stream": { - "version": "2.3.7", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz", - "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==", - "requires": { - "core-util-is": "~1.0.0", - "inherits": "~2.0.3", - "isarray": "~1.0.0", - "process-nextick-args": "~2.0.0", - "safe-buffer": "~5.1.1", - "string_decoder": "~1.1.1", - "util-deprecate": "~1.0.1" - } - }, - "string_decoder": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", - "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", - "requires": { - "safe-buffer": "~5.1.0" - } - } - } - }, - "html-encoding-sniffer": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/html-encoding-sniffer/-/html-encoding-sniffer-2.0.1.tgz", - "integrity": "sha512-D5JbOMBIR/TVZkubHT+OyT2705QvogUW4IBn6nHd756OwieSF9aDYFj4dv6HHEVGYbHaLETa3WggZYWWMyy3ZQ==", - "requires": { - "whatwg-encoding": "^1.0.5" - } - }, - "html-entities": { - "version": "2.3.3", - "resolved": "https://registry.npmjs.org/html-entities/-/html-entities-2.3.3.tgz", - "integrity": "sha512-DV5Ln36z34NNTDgnz0EWGBLZENelNAtkiFA4kyNOG2tDI6Mz1uSWiq1wAKdyjnJwyDiDO7Fa2SO1CTxPXL8VxA==" - }, - "html-escaper": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/html-escaper/-/html-escaper-2.0.2.tgz", - "integrity": "sha512-H2iMtd0I4Mt5eYiapRdIDjp+XzelXQ0tFE4JS7YFwFevXXMmOp9myNrUvCg0D6ws8iqkRPBfKHgbwig1SmlLfg==" - }, - "html-minifier-terser": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/html-minifier-terser/-/html-minifier-terser-6.1.0.tgz", - "integrity": "sha512-YXxSlJBZTP7RS3tWnQw74ooKa6L9b9i9QYXY21eUEvhZ3u9XLfv6OnFsQq6RxkhHygsaUMvYsZRV5rU/OVNZxw==", - "requires": { - "camel-case": "^4.1.2", - "clean-css": "^5.2.2", - "commander": "^8.3.0", - "he": "^1.2.0", - "param-case": "^3.0.4", - "relateurl": "^0.2.7", - "terser": "^5.10.0" - } - }, - "html-webpack-plugin": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/html-webpack-plugin/-/html-webpack-plugin-5.5.0.tgz", - "integrity": "sha512-sy88PC2cRTVxvETRgUHFrL4No3UxvcH8G1NepGhqaTT+GXN2kTamqasot0inS5hXeg1cMbFDt27zzo9p35lZVw==", - "requires": { - "@types/html-minifier-terser": "^6.0.0", - "html-minifier-terser": "^6.0.2", - "lodash": "^4.17.21", - "pretty-error": "^4.0.0", - "tapable": "^2.0.0" - } - }, - "htmlparser2": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/htmlparser2/-/htmlparser2-6.1.0.tgz", - "integrity": "sha512-gyyPk6rgonLFEDGoeRgQNaEUvdJ4ktTmmUh/h2t7s+M8oPpIPxgNACWa+6ESR57kXstwqPiCut0V8NRpcwgU7A==", - "requires": { - "domelementtype": "^2.0.1", - "domhandler": "^4.0.0", - "domutils": "^2.5.2", - "entities": "^2.0.0" - } - }, - "http-deceiver": { - "version": "1.2.7", - "resolved": "https://registry.npmjs.org/http-deceiver/-/http-deceiver-1.2.7.tgz", - "integrity": "sha512-LmpOGxTfbpgtGVxJrj5k7asXHCgNZp5nLfp+hWc8QQRqtb7fUy6kRY3BO1h9ddF6yIPYUARgxGOwB42DnxIaNw==" - }, - "http-errors": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-2.0.0.tgz", - "integrity": "sha512-FtwrG/euBzaEjYeRqOgly7G0qviiXoJWnvEH2Z1plBdXgbyjv34pHTSb9zoeHMyDy33+DWy5Wt9Wo+TURtOYSQ==", - "requires": { - "depd": "2.0.0", - "inherits": "2.0.4", - "setprototypeof": "1.2.0", - "statuses": "2.0.1", - "toidentifier": "1.0.1" - } - }, - "http-parser-js": { - "version": "0.5.8", - "resolved": "https://registry.npmjs.org/http-parser-js/-/http-parser-js-0.5.8.tgz", - "integrity": "sha512-SGeBX54F94Wgu5RH3X5jsDtf4eHyRogWX1XGT3b4HuW3tQPM4AaBzoUji/4AAJNXCEOWZ5O0DgZmJw1947gD5Q==" - }, - "http-proxy": { - "version": "1.18.1", - "resolved": "https://registry.npmjs.org/http-proxy/-/http-proxy-1.18.1.tgz", - "integrity": "sha512-7mz/721AbnJwIVbnaSv1Cz3Am0ZLT/UBwkC92VlxhXv/k/BBQfM2fXElQNC27BVGr0uwUpplYPQM9LnaBMR5NQ==", - "requires": { - "eventemitter3": "^4.0.0", - "follow-redirects": "^1.0.0", - "requires-port": "^1.0.0" - } - }, - "http-proxy-agent": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/http-proxy-agent/-/http-proxy-agent-4.0.1.tgz", - "integrity": "sha512-k0zdNgqWTGA6aeIRVpvfVob4fL52dTfaehylg0Y4UvSySvOq/Y+BOyPrgpUrA7HylqvU8vIZGsRuXmspskV0Tg==", - "requires": { - "@tootallnate/once": "1", - "agent-base": "6", - "debug": "4" - } - }, - "http-proxy-middleware": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/http-proxy-middleware/-/http-proxy-middleware-2.0.6.tgz", - "integrity": "sha512-ya/UeJ6HVBYxrgYotAZo1KvPWlgB48kUJLDePFeneHsVujFaW5WNj2NgWCAE//B1Dl02BIfYlpNgBy8Kf8Rjmw==", - "requires": { - "@types/http-proxy": "^1.17.8", - "http-proxy": "^1.18.1", - "is-glob": "^4.0.1", - "is-plain-obj": "^3.0.0", - "micromatch": "^4.0.2" - } - }, - "https-proxy-agent": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-5.0.1.tgz", - "integrity": "sha512-dFcAjpTQFgoLMzC2VwU+C/CbS7uRL0lWmxDITmqm7C+7F0Odmj6s9l6alZc6AELXhrnggM2CeWSXHGOdX2YtwA==", - "requires": { - "agent-base": "6", - "debug": "4" - } - }, - "human-signals": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-2.1.0.tgz", - "integrity": "sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw==" - }, - "iconv-lite": { - "version": "0.6.3", - "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.6.3.tgz", - "integrity": "sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==", - "requires": { - "safer-buffer": ">= 2.1.2 < 3.0.0" - } - }, - "icss-utils": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/icss-utils/-/icss-utils-5.1.0.tgz", - "integrity": "sha512-soFhflCVWLfRNOPU3iv5Z9VUdT44xFRbzjLsEzSr5AQmgqPMTHdU3PMT1Cf1ssx8fLNJDA1juftYl+PUcv3MqA==", - "requires": {} - }, - "idb": { - "version": "6.1.5", - "resolved": "https://registry.npmjs.org/idb/-/idb-6.1.5.tgz", - "integrity": "sha512-IJtugpKkiVXQn5Y+LteyBCNk1N8xpGV3wWZk9EVtZWH8DYkjBn0bX1XnGP9RkyZF0sAcywa6unHqSWKe7q4LGw==" - }, - "identity-obj-proxy": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/identity-obj-proxy/-/identity-obj-proxy-3.0.0.tgz", - "integrity": "sha512-00n6YnVHKrinT9t0d9+5yZC6UBNJANpYEQvL2LlX6Ab9lnmxzIRcEmTPuyGScvl1+jKuCICX1Z0Ab1pPKKdikA==", - "requires": { - "harmony-reflect": "^1.4.6" - } - }, - "ignore": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.2.0.tgz", - "integrity": "sha512-CmxgYGiEPCLhfLnpPp1MoRmifwEIOgjcHXxOBjv7mY96c+eWScsOP9c112ZyLdWHi0FxHjI+4uVhKYp/gcdRmQ==" - }, - "immer": { - "version": "9.0.15", - "resolved": "https://registry.npmjs.org/immer/-/immer-9.0.15.tgz", - "integrity": "sha512-2eB/sswms9AEUSkOm4SbV5Y7Vmt/bKRwByd52jfLkW4OLYeaTP3EEiJ9agqU0O/tq6Dk62Zfj+TJSqfm1rLVGQ==" - }, - "import-fresh": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.0.tgz", - "integrity": "sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==", - "requires": { - "parent-module": "^1.0.0", - "resolve-from": "^4.0.0" - }, - "dependencies": { - "resolve-from": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz", - "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==" - } - } - }, - "import-local": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/import-local/-/import-local-3.1.0.tgz", - "integrity": "sha512-ASB07uLtnDs1o6EHjKpX34BKYDSqnFerfTOJL2HvMqF70LnxpjkzDB8J44oT9pu4AMPkQwf8jl6szgvNd2tRIg==", - "requires": { - "pkg-dir": "^4.2.0", - "resolve-cwd": "^3.0.0" - } - }, - "imurmurhash": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", - "integrity": "sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==" - }, - "indent-string": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-4.0.0.tgz", - "integrity": "sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg==" - }, - "inflight": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", - "integrity": "sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==", - "requires": { - "once": "^1.3.0", - "wrappy": "1" - } - }, - "inherits": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", - "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==" - }, - "ini": { - "version": "1.3.8", - "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.8.tgz", - "integrity": "sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==" - }, - "internal-slot": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/internal-slot/-/internal-slot-1.0.3.tgz", - "integrity": "sha512-O0DB1JC/sPyZl7cIo78n5dR7eUSwwpYPiXRhTzNxZVAMUuB8vlnRFyLxdrVToks6XPLVnFfbzaVd5WLjhgg+vA==", - "requires": { - "get-intrinsic": "^1.1.0", - "has": "^1.0.3", - "side-channel": "^1.0.4" - } - }, - "ipaddr.js": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-2.0.1.tgz", - "integrity": "sha512-1qTgH9NG+IIJ4yfKs2e6Pp1bZg8wbDbKHT21HrLIeYBTRLgMYKnMTPAuI3Lcs61nfx5h1xlXnbJtH1kX5/d/ng==" - }, - "is-arrayish": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz", - "integrity": "sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg==" - }, - "is-bigint": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/is-bigint/-/is-bigint-1.0.4.tgz", - "integrity": "sha512-zB9CruMamjym81i2JZ3UMn54PKGsQzsJeo6xvN3HJJ4CAsQNB6iRutp2To77OfCNuoxspsIhzaPoO1zyCEhFOg==", - "requires": { - "has-bigints": "^1.0.1" - } - }, - "is-binary-path": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz", - "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==", - "requires": { - "binary-extensions": "^2.0.0" - } - }, - "is-boolean-object": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/is-boolean-object/-/is-boolean-object-1.1.2.tgz", - "integrity": "sha512-gDYaKHJmnj4aWxyj6YHyXVpdQawtVLHU5cb+eztPGczf6cjuTdwve5ZIEfgXqH4e57An1D1AKf8CZ3kYrQRqYA==", - "requires": { - "call-bind": "^1.0.2", - "has-tostringtag": "^1.0.0" - } - }, - "is-callable": { - "version": "1.2.4", - "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.2.4.tgz", - "integrity": "sha512-nsuwtxZfMX67Oryl9LCQ+upnC0Z0BgpwntpS89m1H/TLF0zNfzfLMV/9Wa/6MZsj0acpEjAO0KF1xT6ZdLl95w==" - }, - "is-core-module": { - "version": "2.9.0", - "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.9.0.tgz", - "integrity": "sha512-+5FPy5PnwmO3lvfMb0AsoPaBG+5KHUI0wYFXOtYPnVVVspTFUuMZNfNaNVRt3FZadstu2c8x23vykRW/NBoU6A==", - "requires": { - "has": "^1.0.3" - } - }, - "is-date-object": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/is-date-object/-/is-date-object-1.0.5.tgz", - "integrity": "sha512-9YQaSxsAiSwcvS33MBk3wTCVnWK+HhF8VZR2jRxehM16QcVOdHqPn4VPHmRK4lSr38n9JriurInLcP90xsYNfQ==", - "requires": { - "has-tostringtag": "^1.0.0" - } - }, - "is-docker": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/is-docker/-/is-docker-2.2.1.tgz", - "integrity": "sha512-F+i2BKsFrH66iaUFc0woD8sLy8getkwTwtOBjvs56Cx4CgJDeKQeqfz8wAYiSb8JOprWhHH5p77PbmYCvvUuXQ==" - }, - "is-extglob": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", - "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==" - }, - "is-fullwidth-code-point": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", - "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==" - }, - "is-generator-fn": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/is-generator-fn/-/is-generator-fn-2.1.0.tgz", - "integrity": "sha512-cTIB4yPYL/Grw0EaSzASzg6bBy9gqCofvWN8okThAYIxKJZC+udlRAmGbM0XLeniEJSs8uEgHPGuHSe1XsOLSQ==" - }, - "is-glob": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", - "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", - "requires": { - "is-extglob": "^2.1.1" - } - }, - "is-module": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-module/-/is-module-1.0.0.tgz", - "integrity": "sha512-51ypPSPCoTEIN9dy5Oy+h4pShgJmPCygKfyRCISBI+JoWT/2oJvK8QPxmwv7b/p239jXrm9M1mlQbyKJ5A152g==" - }, - "is-negative-zero": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/is-negative-zero/-/is-negative-zero-2.0.2.tgz", - "integrity": "sha512-dqJvarLawXsFbNDeJW7zAz8ItJ9cd28YufuuFzh0G8pNHjJMnY08Dv7sYX2uF5UpQOwieAeOExEYAWWfu7ZZUA==" - }, - "is-number": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", - "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==" - }, - "is-number-object": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/is-number-object/-/is-number-object-1.0.7.tgz", - "integrity": "sha512-k1U0IRzLMo7ZlYIfzRu23Oh6MiIFasgpb9X76eqfFZAqwH44UI4KTBvBYIZ1dSL9ZzChTB9ShHfLkR4pdW5krQ==", - "requires": { - "has-tostringtag": "^1.0.0" - } - }, - "is-obj": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/is-obj/-/is-obj-1.0.1.tgz", - "integrity": "sha512-l4RyHgRqGN4Y3+9JHVrNqO+tN0rV5My76uW5/nuO4K1b6vw5G8d/cmFjP9tRfEsdhZNt0IFdZuK/c2Vr4Nb+Qg==" - }, - "is-plain-obj": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-3.0.0.tgz", - "integrity": "sha512-gwsOE28k+23GP1B6vFl1oVh/WOzmawBrKwo5Ev6wMKzPkaXaCDIQKzLnvsA42DRlbVTWorkgTKIviAKCWkfUwA==" - }, - "is-potential-custom-element-name": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/is-potential-custom-element-name/-/is-potential-custom-element-name-1.0.1.tgz", - "integrity": "sha512-bCYeRA2rVibKZd+s2625gGnGF/t7DSqDs4dP7CrLA1m7jKWz6pps0LpYLJN8Q64HtmPKJ1hrN3nzPNKFEKOUiQ==" - }, - "is-regex": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.1.4.tgz", - "integrity": "sha512-kvRdxDsxZjhzUX07ZnLydzS1TU/TJlTUHHY4YLL87e37oUA49DfkLqgy+VjFocowy29cKvcSiu+kIv728jTTVg==", - "requires": { - "call-bind": "^1.0.2", - "has-tostringtag": "^1.0.0" - } - }, - "is-regexp": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-regexp/-/is-regexp-1.0.0.tgz", - "integrity": "sha512-7zjFAPO4/gwyQAAgRRmqeEeyIICSdmCqa3tsVHMdBzaXXRiqopZL4Cyghg/XulGWrtABTpbnYYzzIRffLkP4oA==" - }, - "is-root": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/is-root/-/is-root-2.1.0.tgz", - "integrity": "sha512-AGOriNp96vNBd3HtU+RzFEc75FfR5ymiYv8E553I71SCeXBiMsVDUtdio1OEFvrPyLIQ9tVR5RxXIFe5PUFjMg==" - }, - "is-shared-array-buffer": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/is-shared-array-buffer/-/is-shared-array-buffer-1.0.2.tgz", - "integrity": "sha512-sqN2UDu1/0y6uvXyStCOzyhAjCSlHceFoMKJW8W9EU9cvic/QdsZ0kEU93HEy3IUEFZIiH/3w+AH/UQbPHNdhA==", - "requires": { - "call-bind": "^1.0.2" - } - }, - "is-stream": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-2.0.1.tgz", - "integrity": "sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==" - }, - "is-string": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/is-string/-/is-string-1.0.7.tgz", - "integrity": "sha512-tE2UXzivje6ofPW7l23cjDOMa09gb7xlAqG6jG5ej6uPV32TlWP3NKPigtaGeHNu9fohccRYvIiZMfOOnOYUtg==", - "requires": { - "has-tostringtag": "^1.0.0" - } - }, - "is-symbol": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/is-symbol/-/is-symbol-1.0.4.tgz", - "integrity": "sha512-C/CPBqKWnvdcxqIARxyOh4v1UUEOCHpgDa0WYgpKDFMszcrPcffg5uhwSgPCLD2WWxmq6isisz87tzT01tuGhg==", - "requires": { - "has-symbols": "^1.0.2" - } - }, - "is-typedarray": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz", - "integrity": "sha512-cyA56iCMHAh5CdzjJIa4aohJyeO1YbwLi3Jc35MmRU6poroFjIGZzUzupGiRPOjgHg9TLu43xbpwXk523fMxKA==" - }, - "is-weakref": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/is-weakref/-/is-weakref-1.0.2.tgz", - "integrity": "sha512-qctsuLZmIQ0+vSSMfoVvyFe2+GSEvnmZ2ezTup1SBse9+twCCeial6EEi3Nc2KFcf6+qz2FBPnjXsk8xhKSaPQ==", - "requires": { - "call-bind": "^1.0.2" - } - }, - "is-wsl": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/is-wsl/-/is-wsl-2.2.0.tgz", - "integrity": "sha512-fKzAra0rGJUUBwGBgNkHZuToZcn+TtXHpeCgmkMJMMYx1sQDYaCSyjJBSCa2nH1DGm7s3n1oBnohoVTBaN7Lww==", - "requires": { - "is-docker": "^2.0.0" - } - }, - "isarray": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", - "integrity": "sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==" - }, - "isexe": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", - "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==" - }, - "istanbul-lib-coverage": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/istanbul-lib-coverage/-/istanbul-lib-coverage-3.2.0.tgz", - "integrity": "sha512-eOeJ5BHCmHYvQK7xt9GkdHuzuCGS1Y6g9Gvnx3Ym33fz/HpLRYxiS0wHNr+m/MBC8B647Xt608vCDEvhl9c6Mw==" - }, - "istanbul-lib-instrument": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/istanbul-lib-instrument/-/istanbul-lib-instrument-5.2.0.tgz", - "integrity": "sha512-6Lthe1hqXHBNsqvgDzGO6l03XNeu3CrG4RqQ1KM9+l5+jNGpEJfIELx1NS3SEHmJQA8np/u+E4EPRKRiu6m19A==", - "requires": { - "@babel/core": "^7.12.3", - "@babel/parser": "^7.14.7", - "@istanbuljs/schema": "^0.1.2", - "istanbul-lib-coverage": "^3.2.0", - "semver": "^6.3.0" - }, - "dependencies": { - "semver": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", - "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==" - } - } - }, - "istanbul-lib-report": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/istanbul-lib-report/-/istanbul-lib-report-3.0.0.tgz", - "integrity": "sha512-wcdi+uAKzfiGT2abPpKZ0hSU1rGQjUQnLvtY5MpQ7QCTahD3VODhcu4wcfY1YtkGaDD5yuydOLINXsfbus9ROw==", - "requires": { - "istanbul-lib-coverage": "^3.0.0", - "make-dir": "^3.0.0", - "supports-color": "^7.1.0" - }, - "dependencies": { - "has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==" - }, - "supports-color": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", - "requires": { - "has-flag": "^4.0.0" - } - } - } - }, - "istanbul-lib-source-maps": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/istanbul-lib-source-maps/-/istanbul-lib-source-maps-4.0.1.tgz", - "integrity": "sha512-n3s8EwkdFIJCG3BPKBYvskgXGoy88ARzvegkitk60NxRdwltLOTaH7CUiMRXvwYorl0Q712iEjcWB+fK/MrWVw==", - "requires": { - "debug": "^4.1.1", - "istanbul-lib-coverage": "^3.0.0", - "source-map": "^0.6.1" - }, - "dependencies": { - "source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==" - } - } - }, - "istanbul-reports": { - "version": "3.1.4", - "resolved": "https://registry.npmjs.org/istanbul-reports/-/istanbul-reports-3.1.4.tgz", - "integrity": "sha512-r1/DshN4KSE7xWEknZLLLLDn5CJybV3nw01VTkp6D5jzLuELlcbudfj/eSQFvrKsJuTVCGnePO7ho82Nw9zzfw==", - "requires": { - "html-escaper": "^2.0.0", - "istanbul-lib-report": "^3.0.0" - } - }, - "jake": { - "version": "10.8.5", - "resolved": "https://registry.npmjs.org/jake/-/jake-10.8.5.tgz", - "integrity": "sha512-sVpxYeuAhWt0OTWITwT98oyV0GsXyMlXCF+3L1SuafBVUIr/uILGRB+NqwkzhgXKvoJpDIpQvqkUALgdmQsQxw==", - "requires": { - "async": "^3.2.3", - "chalk": "^4.0.2", - "filelist": "^1.0.1", - "minimatch": "^3.0.4" - }, - "dependencies": { - "ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "requires": { - "color-convert": "^2.0.1" - } - }, - "chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", - "requires": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - } - }, - "color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "requires": { - "color-name": "~1.1.4" - } - }, - "color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" - }, - "has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==" - }, - "supports-color": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", - "requires": { - "has-flag": "^4.0.0" - } - } - } - }, - "jest": { - "version": "27.5.1", - "resolved": "https://registry.npmjs.org/jest/-/jest-27.5.1.tgz", - "integrity": "sha512-Yn0mADZB89zTtjkPJEXwrac3LHudkQMR+Paqa8uxJHCBr9agxztUifWCyiYrjhMPBoUVBjyny0I7XH6ozDr7QQ==", - "requires": { - "@jest/core": "^27.5.1", - "import-local": "^3.0.2", - "jest-cli": "^27.5.1" - } - }, - "jest-changed-files": { - "version": "27.5.1", - "resolved": "https://registry.npmjs.org/jest-changed-files/-/jest-changed-files-27.5.1.tgz", - "integrity": "sha512-buBLMiByfWGCoMsLLzGUUSpAmIAGnbR2KJoMN10ziLhOLvP4e0SlypHnAel8iqQXTrcbmfEY9sSqae5sgUsTvw==", - "requires": { - "@jest/types": "^27.5.1", - "execa": "^5.0.0", - "throat": "^6.0.1" - } - }, - "jest-circus": { - "version": "27.5.1", - "resolved": "https://registry.npmjs.org/jest-circus/-/jest-circus-27.5.1.tgz", - "integrity": "sha512-D95R7x5UtlMA5iBYsOHFFbMD/GVA4R/Kdq15f7xYWUfWHBto9NYRsOvnSauTgdF+ogCpJ4tyKOXhUifxS65gdw==", - "requires": { - "@jest/environment": "^27.5.1", - "@jest/test-result": "^27.5.1", - "@jest/types": "^27.5.1", - "@types/node": "*", - "chalk": "^4.0.0", - "co": "^4.6.0", - "dedent": "^0.7.0", - "expect": "^27.5.1", - "is-generator-fn": "^2.0.0", - "jest-each": "^27.5.1", - "jest-matcher-utils": "^27.5.1", - "jest-message-util": "^27.5.1", - "jest-runtime": "^27.5.1", - "jest-snapshot": "^27.5.1", - "jest-util": "^27.5.1", - "pretty-format": "^27.5.1", - "slash": "^3.0.0", - "stack-utils": "^2.0.3", - "throat": "^6.0.1" - }, - "dependencies": { - "ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "requires": { - "color-convert": "^2.0.1" - } - }, - "chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", - "requires": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - } - }, - "color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "requires": { - "color-name": "~1.1.4" - } - }, - "color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" - }, - "has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==" - }, - "supports-color": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", - "requires": { - "has-flag": "^4.0.0" - } - } - } - }, - "jest-cli": { - "version": "27.5.1", - "resolved": "https://registry.npmjs.org/jest-cli/-/jest-cli-27.5.1.tgz", - "integrity": "sha512-Hc6HOOwYq4/74/c62dEE3r5elx8wjYqxY0r0G/nFrLDPMFRu6RA/u8qINOIkvhxG7mMQ5EJsOGfRpI8L6eFUVw==", - "requires": { - "@jest/core": "^27.5.1", - "@jest/test-result": "^27.5.1", - "@jest/types": "^27.5.1", - "chalk": "^4.0.0", - "exit": "^0.1.2", - "graceful-fs": "^4.2.9", - "import-local": "^3.0.2", - "jest-config": "^27.5.1", - "jest-util": "^27.5.1", - "jest-validate": "^27.5.1", - "prompts": "^2.0.1", - "yargs": "^16.2.0" - }, - "dependencies": { - "ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "requires": { - "color-convert": "^2.0.1" - } - }, - "chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", - "requires": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - } - }, - "color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "requires": { - "color-name": "~1.1.4" - } - }, - "color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" - }, - "has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==" - }, - "supports-color": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", - "requires": { - "has-flag": "^4.0.0" - } - } - } - }, - "jest-config": { - "version": "27.5.1", - "resolved": "https://registry.npmjs.org/jest-config/-/jest-config-27.5.1.tgz", - "integrity": "sha512-5sAsjm6tGdsVbW9ahcChPAFCk4IlkQUknH5AvKjuLTSlcO/wCZKyFdn7Rg0EkC+OGgWODEy2hDpWB1PgzH0JNA==", - "requires": { - "@babel/core": "^7.8.0", - "@jest/test-sequencer": "^27.5.1", - "@jest/types": "^27.5.1", - "babel-jest": "^27.5.1", - "chalk": "^4.0.0", - "ci-info": "^3.2.0", - "deepmerge": "^4.2.2", - "glob": "^7.1.1", - "graceful-fs": "^4.2.9", - "jest-circus": "^27.5.1", - "jest-environment-jsdom": "^27.5.1", - "jest-environment-node": "^27.5.1", - "jest-get-type": "^27.5.1", - "jest-jasmine2": "^27.5.1", - "jest-regex-util": "^27.5.1", - "jest-resolve": "^27.5.1", - "jest-runner": "^27.5.1", - "jest-util": "^27.5.1", - "jest-validate": "^27.5.1", - "micromatch": "^4.0.4", - "parse-json": "^5.2.0", - "pretty-format": "^27.5.1", - "slash": "^3.0.0", - "strip-json-comments": "^3.1.1" - }, - "dependencies": { - "ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "requires": { - "color-convert": "^2.0.1" - } - }, - "chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", - "requires": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - } - }, - "color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "requires": { - "color-name": "~1.1.4" - } - }, - "color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" - }, - "has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==" - }, - "supports-color": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", - "requires": { - "has-flag": "^4.0.0" - } - } - } - }, - "jest-diff": { - "version": "27.5.1", - "resolved": "https://registry.npmjs.org/jest-diff/-/jest-diff-27.5.1.tgz", - "integrity": "sha512-m0NvkX55LDt9T4mctTEgnZk3fmEg3NRYutvMPWM/0iPnkFj2wIeF45O1718cMSOFO1vINkqmxqD8vE37uTEbqw==", - "requires": { - "chalk": "^4.0.0", - "diff-sequences": "^27.5.1", - "jest-get-type": "^27.5.1", - "pretty-format": "^27.5.1" - }, - "dependencies": { - "ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "requires": { - "color-convert": "^2.0.1" - } - }, - "chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", - "requires": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - } - }, - "color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "requires": { - "color-name": "~1.1.4" - } - }, - "color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" - }, - "has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==" - }, - "supports-color": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", - "requires": { - "has-flag": "^4.0.0" - } - } - } - }, - "jest-docblock": { - "version": "27.5.1", - "resolved": "https://registry.npmjs.org/jest-docblock/-/jest-docblock-27.5.1.tgz", - "integrity": "sha512-rl7hlABeTsRYxKiUfpHrQrG4e2obOiTQWfMEH3PxPjOtdsfLQO4ReWSZaQ7DETm4xu07rl4q/h4zcKXyU0/OzQ==", - "requires": { - "detect-newline": "^3.0.0" - } - }, - "jest-each": { - "version": "27.5.1", - "resolved": "https://registry.npmjs.org/jest-each/-/jest-each-27.5.1.tgz", - "integrity": "sha512-1Ff6p+FbhT/bXQnEouYy00bkNSY7OUpfIcmdl8vZ31A1UUaurOLPA8a8BbJOF2RDUElwJhmeaV7LnagI+5UwNQ==", - "requires": { - "@jest/types": "^27.5.1", - "chalk": "^4.0.0", - "jest-get-type": "^27.5.1", - "jest-util": "^27.5.1", - "pretty-format": "^27.5.1" - }, - "dependencies": { - "ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "requires": { - "color-convert": "^2.0.1" - } - }, - "chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", - "requires": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - } - }, - "color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "requires": { - "color-name": "~1.1.4" - } - }, - "color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" - }, - "has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==" - }, - "supports-color": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", - "requires": { - "has-flag": "^4.0.0" - } - } - } - }, - "jest-environment-jsdom": { - "version": "27.5.1", - "resolved": "https://registry.npmjs.org/jest-environment-jsdom/-/jest-environment-jsdom-27.5.1.tgz", - "integrity": "sha512-TFBvkTC1Hnnnrka/fUb56atfDtJ9VMZ94JkjTbggl1PEpwrYtUBKMezB3inLmWqQsXYLcMwNoDQwoBTAvFfsfw==", - "requires": { - "@jest/environment": "^27.5.1", - "@jest/fake-timers": "^27.5.1", - "@jest/types": "^27.5.1", - "@types/node": "*", - "jest-mock": "^27.5.1", - "jest-util": "^27.5.1", - "jsdom": "^16.6.0" - } - }, - "jest-environment-node": { - "version": "27.5.1", - "resolved": "https://registry.npmjs.org/jest-environment-node/-/jest-environment-node-27.5.1.tgz", - "integrity": "sha512-Jt4ZUnxdOsTGwSRAfKEnE6BcwsSPNOijjwifq5sDFSA2kesnXTvNqKHYgM0hDq3549Uf/KzdXNYn4wMZJPlFLw==", - "requires": { - "@jest/environment": "^27.5.1", - "@jest/fake-timers": "^27.5.1", - "@jest/types": "^27.5.1", - "@types/node": "*", - "jest-mock": "^27.5.1", - "jest-util": "^27.5.1" - } - }, - "jest-get-type": { - "version": "27.5.1", - "resolved": "https://registry.npmjs.org/jest-get-type/-/jest-get-type-27.5.1.tgz", - "integrity": "sha512-2KY95ksYSaK7DMBWQn6dQz3kqAf3BB64y2udeG+hv4KfSOb9qwcYQstTJc1KCbsix+wLZWZYN8t7nwX3GOBLRw==" - }, - "jest-haste-map": { - "version": "27.5.1", - "resolved": "https://registry.npmjs.org/jest-haste-map/-/jest-haste-map-27.5.1.tgz", - "integrity": "sha512-7GgkZ4Fw4NFbMSDSpZwXeBiIbx+t/46nJ2QitkOjvwPYyZmqttu2TDSimMHP1EkPOi4xUZAN1doE5Vd25H4Jng==", - "requires": { - "@jest/types": "^27.5.1", - "@types/graceful-fs": "^4.1.2", - "@types/node": "*", - "anymatch": "^3.0.3", - "fb-watchman": "^2.0.0", - "fsevents": "^2.3.2", - "graceful-fs": "^4.2.9", - "jest-regex-util": "^27.5.1", - "jest-serializer": "^27.5.1", - "jest-util": "^27.5.1", - "jest-worker": "^27.5.1", - "micromatch": "^4.0.4", - "walker": "^1.0.7" - } - }, - "jest-jasmine2": { - "version": "27.5.1", - "resolved": "https://registry.npmjs.org/jest-jasmine2/-/jest-jasmine2-27.5.1.tgz", - "integrity": "sha512-jtq7VVyG8SqAorDpApwiJJImd0V2wv1xzdheGHRGyuT7gZm6gG47QEskOlzsN1PG/6WNaCo5pmwMHDf3AkG2pQ==", - "requires": { - "@jest/environment": "^27.5.1", - "@jest/source-map": "^27.5.1", - "@jest/test-result": "^27.5.1", - "@jest/types": "^27.5.1", - "@types/node": "*", - "chalk": "^4.0.0", - "co": "^4.6.0", - "expect": "^27.5.1", - "is-generator-fn": "^2.0.0", - "jest-each": "^27.5.1", - "jest-matcher-utils": "^27.5.1", - "jest-message-util": "^27.5.1", - "jest-runtime": "^27.5.1", - "jest-snapshot": "^27.5.1", - "jest-util": "^27.5.1", - "pretty-format": "^27.5.1", - "throat": "^6.0.1" - }, - "dependencies": { - "ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "requires": { - "color-convert": "^2.0.1" - } - }, - "chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", - "requires": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - } - }, - "color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "requires": { - "color-name": "~1.1.4" - } - }, - "color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" - }, - "has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==" - }, - "supports-color": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", - "requires": { - "has-flag": "^4.0.0" - } - } - } - }, - "jest-leak-detector": { - "version": "27.5.1", - "resolved": "https://registry.npmjs.org/jest-leak-detector/-/jest-leak-detector-27.5.1.tgz", - "integrity": "sha512-POXfWAMvfU6WMUXftV4HolnJfnPOGEu10fscNCA76KBpRRhcMN2c8d3iT2pxQS3HLbA+5X4sOUPzYO2NUyIlHQ==", - "requires": { - "jest-get-type": "^27.5.1", - "pretty-format": "^27.5.1" - } - }, - "jest-matcher-utils": { - "version": "27.5.1", - "resolved": "https://registry.npmjs.org/jest-matcher-utils/-/jest-matcher-utils-27.5.1.tgz", - "integrity": "sha512-z2uTx/T6LBaCoNWNFWwChLBKYxTMcGBRjAt+2SbP929/Fflb9aa5LGma654Rz8z9HLxsrUaYzxE9T/EFIL/PAw==", - "requires": { - "chalk": "^4.0.0", - "jest-diff": "^27.5.1", - "jest-get-type": "^27.5.1", - "pretty-format": "^27.5.1" - }, - "dependencies": { - "ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "requires": { - "color-convert": "^2.0.1" - } - }, - "chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", - "requires": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - } - }, - "color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "requires": { - "color-name": "~1.1.4" - } - }, - "color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" - }, - "has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==" - }, - "supports-color": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", - "requires": { - "has-flag": "^4.0.0" - } - } - } - }, - "jest-message-util": { - "version": "27.5.1", - "resolved": "https://registry.npmjs.org/jest-message-util/-/jest-message-util-27.5.1.tgz", - "integrity": "sha512-rMyFe1+jnyAAf+NHwTclDz0eAaLkVDdKVHHBFWsBWHnnh5YeJMNWWsv7AbFYXfK3oTqvL7VTWkhNLu1jX24D+g==", - "requires": { - "@babel/code-frame": "^7.12.13", - "@jest/types": "^27.5.1", - "@types/stack-utils": "^2.0.0", - "chalk": "^4.0.0", - "graceful-fs": "^4.2.9", - "micromatch": "^4.0.4", - "pretty-format": "^27.5.1", - "slash": "^3.0.0", - "stack-utils": "^2.0.3" - }, - "dependencies": { - "ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "requires": { - "color-convert": "^2.0.1" - } - }, - "chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", - "requires": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - } - }, - "color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "requires": { - "color-name": "~1.1.4" - } - }, - "color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" - }, - "has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==" - }, - "supports-color": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", - "requires": { - "has-flag": "^4.0.0" - } - } - } - }, - "jest-mock": { - "version": "27.5.1", - "resolved": "https://registry.npmjs.org/jest-mock/-/jest-mock-27.5.1.tgz", - "integrity": "sha512-K4jKbY1d4ENhbrG2zuPWaQBvDly+iZ2yAW+T1fATN78hc0sInwn7wZB8XtlNnvHug5RMwV897Xm4LqmPM4e2Og==", - "requires": { - "@jest/types": "^27.5.1", - "@types/node": "*" - } - }, - "jest-pnp-resolver": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/jest-pnp-resolver/-/jest-pnp-resolver-1.2.2.tgz", - "integrity": "sha512-olV41bKSMm8BdnuMsewT4jqlZ8+3TCARAXjZGT9jcoSnrfUnRCqnMoF9XEeoWjbzObpqF9dRhHQj0Xb9QdF6/w==", - "requires": {} - }, - "jest-regex-util": { - "version": "27.5.1", - "resolved": "https://registry.npmjs.org/jest-regex-util/-/jest-regex-util-27.5.1.tgz", - "integrity": "sha512-4bfKq2zie+x16okqDXjXn9ql2B0dScQu+vcwe4TvFVhkVyuWLqpZrZtXxLLWoXYgn0E87I6r6GRYHF7wFZBUvg==" - }, - "jest-resolve": { - "version": "27.5.1", - "resolved": "https://registry.npmjs.org/jest-resolve/-/jest-resolve-27.5.1.tgz", - "integrity": "sha512-FFDy8/9E6CV83IMbDpcjOhumAQPDyETnU2KZ1O98DwTnz8AOBsW/Xv3GySr1mOZdItLR+zDZ7I/UdTFbgSOVCw==", - "requires": { - "@jest/types": "^27.5.1", - "chalk": "^4.0.0", - "graceful-fs": "^4.2.9", - "jest-haste-map": "^27.5.1", - "jest-pnp-resolver": "^1.2.2", - "jest-util": "^27.5.1", - "jest-validate": "^27.5.1", - "resolve": "^1.20.0", - "resolve.exports": "^1.1.0", - "slash": "^3.0.0" - }, - "dependencies": { - "ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "requires": { - "color-convert": "^2.0.1" - } - }, - "chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", - "requires": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - } - }, - "color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "requires": { - "color-name": "~1.1.4" - } - }, - "color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" - }, - "has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==" - }, - "supports-color": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", - "requires": { - "has-flag": "^4.0.0" - } - } - } - }, - "jest-resolve-dependencies": { - "version": "27.5.1", - "resolved": "https://registry.npmjs.org/jest-resolve-dependencies/-/jest-resolve-dependencies-27.5.1.tgz", - "integrity": "sha512-QQOOdY4PE39iawDn5rzbIePNigfe5B9Z91GDD1ae/xNDlu9kaat8QQ5EKnNmVWPV54hUdxCVwwj6YMgR2O7IOg==", - "requires": { - "@jest/types": "^27.5.1", - "jest-regex-util": "^27.5.1", - "jest-snapshot": "^27.5.1" - } - }, - "jest-runner": { - "version": "27.5.1", - "resolved": "https://registry.npmjs.org/jest-runner/-/jest-runner-27.5.1.tgz", - "integrity": "sha512-g4NPsM4mFCOwFKXO4p/H/kWGdJp9V8kURY2lX8Me2drgXqG7rrZAx5kv+5H7wtt/cdFIjhqYx1HrlqWHaOvDaQ==", - "requires": { - "@jest/console": "^27.5.1", - "@jest/environment": "^27.5.1", - "@jest/test-result": "^27.5.1", - "@jest/transform": "^27.5.1", - "@jest/types": "^27.5.1", - "@types/node": "*", - "chalk": "^4.0.0", - "emittery": "^0.8.1", - "graceful-fs": "^4.2.9", - "jest-docblock": "^27.5.1", - "jest-environment-jsdom": "^27.5.1", - "jest-environment-node": "^27.5.1", - "jest-haste-map": "^27.5.1", - "jest-leak-detector": "^27.5.1", - "jest-message-util": "^27.5.1", - "jest-resolve": "^27.5.1", - "jest-runtime": "^27.5.1", - "jest-util": "^27.5.1", - "jest-worker": "^27.5.1", - "source-map-support": "^0.5.6", - "throat": "^6.0.1" - }, - "dependencies": { - "ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "requires": { - "color-convert": "^2.0.1" - } - }, - "chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", - "requires": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - } - }, - "color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "requires": { - "color-name": "~1.1.4" - } - }, - "color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" - }, - "has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==" - }, - "supports-color": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", - "requires": { - "has-flag": "^4.0.0" - } - } - } - }, - "jest-runtime": { - "version": "27.5.1", - "resolved": "https://registry.npmjs.org/jest-runtime/-/jest-runtime-27.5.1.tgz", - "integrity": "sha512-o7gxw3Gf+H2IGt8fv0RiyE1+r83FJBRruoA+FXrlHw6xEyBsU8ugA6IPfTdVyA0w8HClpbK+DGJxH59UrNMx8A==", - "requires": { - "@jest/environment": "^27.5.1", - "@jest/fake-timers": "^27.5.1", - "@jest/globals": "^27.5.1", - "@jest/source-map": "^27.5.1", - "@jest/test-result": "^27.5.1", - "@jest/transform": "^27.5.1", - "@jest/types": "^27.5.1", - "chalk": "^4.0.0", - "cjs-module-lexer": "^1.0.0", - "collect-v8-coverage": "^1.0.0", - "execa": "^5.0.0", - "glob": "^7.1.3", - "graceful-fs": "^4.2.9", - "jest-haste-map": "^27.5.1", - "jest-message-util": "^27.5.1", - "jest-mock": "^27.5.1", - "jest-regex-util": "^27.5.1", - "jest-resolve": "^27.5.1", - "jest-snapshot": "^27.5.1", - "jest-util": "^27.5.1", - "slash": "^3.0.0", - "strip-bom": "^4.0.0" - }, - "dependencies": { - "ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "requires": { - "color-convert": "^2.0.1" - } - }, - "chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", - "requires": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - } - }, - "color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "requires": { - "color-name": "~1.1.4" - } - }, - "color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" - }, - "has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==" - }, - "supports-color": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", - "requires": { - "has-flag": "^4.0.0" - } - } - } - }, - "jest-serializer": { - "version": "27.5.1", - "resolved": "https://registry.npmjs.org/jest-serializer/-/jest-serializer-27.5.1.tgz", - "integrity": "sha512-jZCyo6iIxO1aqUxpuBlwTDMkzOAJS4a3eYz3YzgxxVQFwLeSA7Jfq5cbqCY+JLvTDrWirgusI/0KwxKMgrdf7w==", - "requires": { - "@types/node": "*", - "graceful-fs": "^4.2.9" - } - }, - "jest-snapshot": { - "version": "27.5.1", - "resolved": "https://registry.npmjs.org/jest-snapshot/-/jest-snapshot-27.5.1.tgz", - "integrity": "sha512-yYykXI5a0I31xX67mgeLw1DZ0bJB+gpq5IpSuCAoyDi0+BhgU/RIrL+RTzDmkNTchvDFWKP8lp+w/42Z3us5sA==", - "requires": { - "@babel/core": "^7.7.2", - "@babel/generator": "^7.7.2", - "@babel/plugin-syntax-typescript": "^7.7.2", - "@babel/traverse": "^7.7.2", - "@babel/types": "^7.0.0", - "@jest/transform": "^27.5.1", - "@jest/types": "^27.5.1", - "@types/babel__traverse": "^7.0.4", - "@types/prettier": "^2.1.5", - "babel-preset-current-node-syntax": "^1.0.0", - "chalk": "^4.0.0", - "expect": "^27.5.1", - "graceful-fs": "^4.2.9", - "jest-diff": "^27.5.1", - "jest-get-type": "^27.5.1", - "jest-haste-map": "^27.5.1", - "jest-matcher-utils": "^27.5.1", - "jest-message-util": "^27.5.1", - "jest-util": "^27.5.1", - "natural-compare": "^1.4.0", - "pretty-format": "^27.5.1", - "semver": "^7.3.2" - }, - "dependencies": { - "ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "requires": { - "color-convert": "^2.0.1" - } - }, - "chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", - "requires": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - } - }, - "color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "requires": { - "color-name": "~1.1.4" - } - }, - "color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" - }, - "has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==" - }, - "supports-color": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", - "requires": { - "has-flag": "^4.0.0" - } - } - } - }, - "jest-util": { - "version": "27.5.1", - "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-27.5.1.tgz", - "integrity": "sha512-Kv2o/8jNvX1MQ0KGtw480E/w4fBCDOnH6+6DmeKi6LZUIlKA5kwY0YNdlzaWTiVgxqAqik11QyxDOKk543aKXw==", - "requires": { - "@jest/types": "^27.5.1", - "@types/node": "*", - "chalk": "^4.0.0", - "ci-info": "^3.2.0", - "graceful-fs": "^4.2.9", - "picomatch": "^2.2.3" - }, - "dependencies": { - "ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "requires": { - "color-convert": "^2.0.1" - } - }, - "chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", - "requires": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - } - }, - "color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "requires": { - "color-name": "~1.1.4" - } - }, - "color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" - }, - "has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==" - }, - "supports-color": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", - "requires": { - "has-flag": "^4.0.0" - } - } - } - }, - "jest-validate": { - "version": "27.5.1", - "resolved": "https://registry.npmjs.org/jest-validate/-/jest-validate-27.5.1.tgz", - "integrity": "sha512-thkNli0LYTmOI1tDB3FI1S1RTp/Bqyd9pTarJwL87OIBFuqEb5Apv5EaApEudYg4g86e3CT6kM0RowkhtEnCBQ==", - "requires": { - "@jest/types": "^27.5.1", - "camelcase": "^6.2.0", - "chalk": "^4.0.0", - "jest-get-type": "^27.5.1", - "leven": "^3.1.0", - "pretty-format": "^27.5.1" - }, - "dependencies": { - "ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "requires": { - "color-convert": "^2.0.1" - } - }, - "chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", - "requires": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - } - }, - "color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "requires": { - "color-name": "~1.1.4" - } - }, - "color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" - }, - "has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==" - }, - "supports-color": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", - "requires": { - "has-flag": "^4.0.0" - } - } - } - }, - "jest-watch-typeahead": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/jest-watch-typeahead/-/jest-watch-typeahead-1.1.0.tgz", - "integrity": "sha512-Va5nLSJTN7YFtC2jd+7wsoe1pNe5K4ShLux/E5iHEwlB9AxaxmggY7to9KUqKojhaJw3aXqt5WAb4jGPOolpEw==", - "requires": { - "ansi-escapes": "^4.3.1", - "chalk": "^4.0.0", - "jest-regex-util": "^28.0.0", - "jest-watcher": "^28.0.0", - "slash": "^4.0.0", - "string-length": "^5.0.1", - "strip-ansi": "^7.0.1" - }, - "dependencies": { - "@jest/console": { - "version": "28.1.1", - "resolved": "https://registry.npmjs.org/@jest/console/-/console-28.1.1.tgz", - "integrity": "sha512-0RiUocPVFEm3WRMOStIHbRWllG6iW6E3/gUPnf4lkrVFyXIIDeCe+vlKeYyFOMhB2EPE6FLFCNADSOOQMaqvyA==", - "requires": { - "@jest/types": "^28.1.1", - "@types/node": "*", - "chalk": "^4.0.0", - "jest-message-util": "^28.1.1", - "jest-util": "^28.1.1", - "slash": "^3.0.0" - }, - "dependencies": { - "slash": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", - "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==" - } - } - }, - "@jest/test-result": { - "version": "28.1.1", - "resolved": "https://registry.npmjs.org/@jest/test-result/-/test-result-28.1.1.tgz", - "integrity": "sha512-hPmkugBktqL6rRzwWAtp1JtYT4VHwv8OQ+9lE5Gymj6dHzubI/oJHMUpPOt8NrdVWSrz9S7bHjJUmv2ggFoUNQ==", - "requires": { - "@jest/console": "^28.1.1", - "@jest/types": "^28.1.1", - "@types/istanbul-lib-coverage": "^2.0.0", - "collect-v8-coverage": "^1.0.0" - } - }, - "@jest/types": { - "version": "28.1.1", - "resolved": "https://registry.npmjs.org/@jest/types/-/types-28.1.1.tgz", - "integrity": "sha512-vRXVqSg1VhDnB8bWcmvLzmg0Bt9CRKVgHPXqYwvWMX3TvAjeO+nRuK6+VdTKCtWOvYlmkF/HqNAL/z+N3B53Kw==", - "requires": { - "@jest/schemas": "^28.0.2", - "@types/istanbul-lib-coverage": "^2.0.0", - "@types/istanbul-reports": "^3.0.0", - "@types/node": "*", - "@types/yargs": "^17.0.8", - "chalk": "^4.0.0" - } - }, - "@types/yargs": { - "version": "17.0.10", - "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-17.0.10.tgz", - "integrity": "sha512-gmEaFwpj/7f/ROdtIlci1R1VYU1J4j95m8T+Tj3iBgiBFKg1foE/PSl93bBd5T9LDXNPo8UlNN6W0qwD8O5OaA==", - "requires": { - "@types/yargs-parser": "*" - } - }, - "ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "requires": { - "color-convert": "^2.0.1" - } - }, - "chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", - "requires": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - } - }, - "color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "requires": { - "color-name": "~1.1.4" - } - }, - "color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" - }, - "emittery": { - "version": "0.10.2", - "resolved": "https://registry.npmjs.org/emittery/-/emittery-0.10.2.tgz", - "integrity": "sha512-aITqOwnLanpHLNXZJENbOgjUBeHocD+xsSJmNrjovKBW5HbSpW3d1pEls7GFQPUWXiwG9+0P4GtHfEqC/4M0Iw==" - }, - "has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==" - }, - "jest-message-util": { - "version": "28.1.1", - "resolved": "https://registry.npmjs.org/jest-message-util/-/jest-message-util-28.1.1.tgz", - "integrity": "sha512-xoDOOT66fLfmTRiqkoLIU7v42mal/SqwDKvfmfiWAdJMSJiU+ozgluO7KbvoAgiwIrrGZsV7viETjc8GNrA/IQ==", - "requires": { - "@babel/code-frame": "^7.12.13", - "@jest/types": "^28.1.1", - "@types/stack-utils": "^2.0.0", - "chalk": "^4.0.0", - "graceful-fs": "^4.2.9", - "micromatch": "^4.0.4", - "pretty-format": "^28.1.1", - "slash": "^3.0.0", - "stack-utils": "^2.0.3" - }, - "dependencies": { - "slash": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", - "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==" - } - } - }, - "jest-regex-util": { - "version": "28.0.2", - "resolved": "https://registry.npmjs.org/jest-regex-util/-/jest-regex-util-28.0.2.tgz", - "integrity": "sha512-4s0IgyNIy0y9FK+cjoVYoxamT7Zeo7MhzqRGx7YDYmaQn1wucY9rotiGkBzzcMXTtjrCAP/f7f+E0F7+fxPNdw==" - }, - "jest-util": { - "version": "28.1.1", - "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-28.1.1.tgz", - "integrity": "sha512-FktOu7ca1DZSyhPAxgxB6hfh2+9zMoJ7aEQA759Z6p45NuO8mWcqujH+UdHlCm/V6JTWwDztM2ITCzU1ijJAfw==", - "requires": { - "@jest/types": "^28.1.1", - "@types/node": "*", - "chalk": "^4.0.0", - "ci-info": "^3.2.0", - "graceful-fs": "^4.2.9", - "picomatch": "^2.2.3" - } - }, - "jest-watcher": { - "version": "28.1.1", - "resolved": "https://registry.npmjs.org/jest-watcher/-/jest-watcher-28.1.1.tgz", - "integrity": "sha512-RQIpeZ8EIJMxbQrXpJQYIIlubBnB9imEHsxxE41f54ZwcqWLysL/A0ZcdMirf+XsMn3xfphVQVV4EW0/p7i7Ug==", - "requires": { - "@jest/test-result": "^28.1.1", - "@jest/types": "^28.1.1", - "@types/node": "*", - "ansi-escapes": "^4.2.1", - "chalk": "^4.0.0", - "emittery": "^0.10.2", - "jest-util": "^28.1.1", - "string-length": "^4.0.1" - }, - "dependencies": { - "string-length": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/string-length/-/string-length-4.0.2.tgz", - "integrity": "sha512-+l6rNN5fYHNhZZy41RXsYptCjA2Igmq4EG7kZAYFQI1E1VTXarr6ZPXBg6eq7Y6eK4FEhY6AJlyuFIb/v/S0VQ==", - "requires": { - "char-regex": "^1.0.2", - "strip-ansi": "^6.0.0" - } - }, - "strip-ansi": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", - "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", - "requires": { - "ansi-regex": "^5.0.1" - } - } - } - }, - "pretty-format": { - "version": "28.1.1", - "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-28.1.1.tgz", - "integrity": "sha512-wwJbVTGFHeucr5Jw2bQ9P+VYHyLdAqedFLEkdQUVaBF/eiidDwH5OpilINq4mEfhbCjLnirt6HTTDhv1HaTIQw==", - "requires": { - "@jest/schemas": "^28.0.2", - "ansi-regex": "^5.0.1", - "ansi-styles": "^5.0.0", - "react-is": "^18.0.0" - }, - "dependencies": { - "ansi-styles": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-5.2.0.tgz", - "integrity": "sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==" - } - } - }, - "react-is": { - "version": "18.2.0", - "resolved": "https://registry.npmjs.org/react-is/-/react-is-18.2.0.tgz", - "integrity": "sha512-xWGDIW6x921xtzPkhiULtthJHoJvBbF3q26fzloPCK0hsvxtPVelvftw3zjbHWSkR2km9Z+4uxbDDK/6Zw9B8w==" - }, - "slash": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/slash/-/slash-4.0.0.tgz", - "integrity": "sha512-3dOsAHXXUkQTpOYcoAxLIorMTp4gIQr5IW3iVb7A7lFIp0VHhnynm9izx6TssdrIcVIESAlVjtnO2K8bg+Coew==" - }, - "string-length": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/string-length/-/string-length-5.0.1.tgz", - "integrity": "sha512-9Ep08KAMUn0OadnVaBuRdE2l615CQ508kr0XMadjClfYpdCyvrbFp6Taebo8yyxokQ4viUd/xPPUA4FGgUa0ow==", - "requires": { - "char-regex": "^2.0.0", - "strip-ansi": "^7.0.1" - }, - "dependencies": { - "char-regex": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/char-regex/-/char-regex-2.0.1.tgz", - "integrity": "sha512-oSvEeo6ZUD7NepqAat3RqoucZ5SeqLJgOvVIwkafu6IP3V0pO38s/ypdVUmDDK6qIIHNlYHJAKX9E7R7HoKElw==" - } - } - }, - "strip-ansi": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.0.1.tgz", - "integrity": "sha512-cXNxvT8dFNRVfhVME3JAe98mkXDYN2O1l7jmcwMnOslDeESg1rF/OZMtK0nRAhiari1unG5cD4jG3rapUAkLbw==", - "requires": { - "ansi-regex": "^6.0.1" - }, - "dependencies": { - "ansi-regex": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.0.1.tgz", - "integrity": "sha512-n5M855fKb2SsfMIiFFoVrABHJC8QtHwVx+mHWP3QcEqBHYienj5dHSgjbxtC0WEZXYt4wcD6zrQElDPhFuZgfA==" - } - } - }, - "supports-color": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", - "requires": { - "has-flag": "^4.0.0" - } - } - } - }, - "jest-watcher": { - "version": "27.5.1", - "resolved": "https://registry.npmjs.org/jest-watcher/-/jest-watcher-27.5.1.tgz", - "integrity": "sha512-z676SuD6Z8o8qbmEGhoEUFOM1+jfEiL3DXHK/xgEiG2EyNYfFG60jluWcupY6dATjfEsKQuibReS1djInQnoVw==", - "requires": { - "@jest/test-result": "^27.5.1", - "@jest/types": "^27.5.1", - "@types/node": "*", - "ansi-escapes": "^4.2.1", - "chalk": "^4.0.0", - "jest-util": "^27.5.1", - "string-length": "^4.0.1" - }, - "dependencies": { - "ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "requires": { - "color-convert": "^2.0.1" - } - }, - "chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", - "requires": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - } - }, - "color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "requires": { - "color-name": "~1.1.4" - } - }, - "color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" - }, - "has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==" - }, - "supports-color": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", - "requires": { - "has-flag": "^4.0.0" - } - } - } - }, - "jest-worker": { - "version": "27.5.1", - "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-27.5.1.tgz", - "integrity": "sha512-7vuh85V5cdDofPyxn58nrPjBktZo0u9x1g8WtjQol+jZDaE+fhN+cIvTj11GndBnMnyfrUOG1sZQxCdjKh+DKg==", - "requires": { - "@types/node": "*", - "merge-stream": "^2.0.0", - "supports-color": "^8.0.0" - }, - "dependencies": { - "has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==" - }, - "supports-color": { - "version": "8.1.1", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz", - "integrity": "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==", - "requires": { - "has-flag": "^4.0.0" - } - } - } - }, - "js-tokens": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", - "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==" - }, - "js-yaml": { - "version": "3.14.1", - "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.1.tgz", - "integrity": "sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==", - "requires": { - "argparse": "^1.0.7", - "esprima": "^4.0.0" - } - }, - "jsdom": { - "version": "16.7.0", - "resolved": "https://registry.npmjs.org/jsdom/-/jsdom-16.7.0.tgz", - "integrity": "sha512-u9Smc2G1USStM+s/x1ru5Sxrl6mPYCbByG1U/hUmqaVsm4tbNyS7CicOSRyuGQYZhTu0h84qkZZQ/I+dzizSVw==", - "requires": { - "abab": "^2.0.5", - "acorn": "^8.2.4", - "acorn-globals": "^6.0.0", - "cssom": "^0.4.4", - "cssstyle": "^2.3.0", - "data-urls": "^2.0.0", - "decimal.js": "^10.2.1", - "domexception": "^2.0.1", - "escodegen": "^2.0.0", - "form-data": "^3.0.0", - "html-encoding-sniffer": "^2.0.1", - "http-proxy-agent": "^4.0.1", - "https-proxy-agent": "^5.0.0", - "is-potential-custom-element-name": "^1.0.1", - "nwsapi": "^2.2.0", - "parse5": "6.0.1", - "saxes": "^5.0.1", - "symbol-tree": "^3.2.4", - "tough-cookie": "^4.0.0", - "w3c-hr-time": "^1.0.2", - "w3c-xmlserializer": "^2.0.0", - "webidl-conversions": "^6.1.0", - "whatwg-encoding": "^1.0.5", - "whatwg-mimetype": "^2.3.0", - "whatwg-url": "^8.5.0", - "ws": "^7.4.6", - "xml-name-validator": "^3.0.0" - } - }, - "jsesc": { - "version": "2.5.2", - "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-2.5.2.tgz", - "integrity": "sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==" - }, - "json-parse-even-better-errors": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz", - "integrity": "sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==" - }, - "json-schema": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/json-schema/-/json-schema-0.4.0.tgz", - "integrity": "sha512-es94M3nTIfsEPisRafak+HDLfHXnKBhV3vU5eqPcS3flIWqcxJWgXHXiey3YrpaNsanY5ei1VoYEbOzijuq9BA==" - }, - "json-schema-traverse": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", - "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==" - }, - "json-stable-stringify-without-jsonify": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz", - "integrity": "sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==" - }, - "json5": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.1.tgz", - "integrity": "sha512-1hqLFMSrGHRHxav9q9gNjJ5EXznIxGVO09xQRrwplcS8qs28pZ8s8hupZAmqDwZUmVZ2Qb2jnyPOWcDH8m8dlA==" - }, - "jsonfile": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.1.0.tgz", - "integrity": "sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==", - "requires": { - "graceful-fs": "^4.1.6", - "universalify": "^2.0.0" - } - }, - "jsonpointer": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/jsonpointer/-/jsonpointer-5.0.0.tgz", - "integrity": "sha512-PNYZIdMjVIvVgDSYKTT63Y+KZ6IZvGRNNWcxwD+GNnUz1MKPfv30J8ueCjdwcN0nDx2SlshgyB7Oy0epAzVRRg==" - }, - "jsx-ast-utils": { - "version": "3.3.2", - "resolved": "https://registry.npmjs.org/jsx-ast-utils/-/jsx-ast-utils-3.3.2.tgz", - "integrity": "sha512-4ZCADZHRkno244xlNnn4AOG6sRQ7iBZ5BbgZ4vW4y5IZw7cVUD1PPeblm1xx/nfmMxPdt/LHsXZW8z/j58+l9Q==", - "requires": { - "array-includes": "^3.1.5", - "object.assign": "^4.1.2" - } - }, - "kind-of": { - "version": "6.0.3", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.3.tgz", - "integrity": "sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==" - }, - "kleur": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/kleur/-/kleur-3.0.3.tgz", - "integrity": "sha512-eTIzlVOSUR+JxdDFepEYcBMtZ9Qqdef+rnzWdRZuMbOywu5tO2w2N7rqjoANZ5k9vywhL6Br1VRjUIgTQx4E8w==" - }, - "klona": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/klona/-/klona-2.0.5.tgz", - "integrity": "sha512-pJiBpiXMbt7dkzXe8Ghj/u4FfXOOa98fPW+bihOJ4SjnoijweJrNThJfd3ifXpXhREjpoF2mZVH1GfS9LV3kHQ==" - }, - "language-subtag-registry": { - "version": "0.3.22", - "resolved": "https://registry.npmjs.org/language-subtag-registry/-/language-subtag-registry-0.3.22.tgz", - "integrity": "sha512-tN0MCzyWnoz/4nHS6uxdlFWoUZT7ABptwKPQ52Ea7URk6vll88bWBVhodtnlfEuCcKWNGoc+uGbw1cwa9IKh/w==" - }, - "language-tags": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/language-tags/-/language-tags-1.0.5.tgz", - "integrity": "sha512-qJhlO9cGXi6hBGKoxEG/sKZDAHD5Hnu9Hs4WbOY3pCWXDhw0N8x1NenNzm2EnNLkLkk7J2SdxAkDSbb6ftT+UQ==", - "requires": { - "language-subtag-registry": "~0.3.2" - } - }, - "leven": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/leven/-/leven-3.1.0.tgz", - "integrity": "sha512-qsda+H8jTaUaN/x5vzW2rzc+8Rw4TAQ/4KjB46IwK5VH+IlVeeeje/EoZRpiXvIqjFgK84QffqPztGI3VBLG1A==" - }, - "levn": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/levn/-/levn-0.4.1.tgz", - "integrity": "sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==", - "requires": { - "prelude-ls": "^1.2.1", - "type-check": "~0.4.0" - } - }, - "lilconfig": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/lilconfig/-/lilconfig-2.0.6.tgz", - "integrity": "sha512-9JROoBW7pobfsx+Sq2JsASvCo6Pfo6WWoUW79HuB1BCoBXD4PLWJPqDF6fNj67pqBYTbAHkE57M1kS/+L1neOg==" - }, - "lines-and-columns": { - "version": "1.2.4", - "resolved": "https://registry.npmjs.org/lines-and-columns/-/lines-and-columns-1.2.4.tgz", - "integrity": "sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==" - }, - "loader-runner": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/loader-runner/-/loader-runner-4.3.0.tgz", - "integrity": "sha512-3R/1M+yS3j5ou80Me59j7F9IMs4PXs3VqRrm0TU3AbKPxlmpoY1TNscJV/oGJXo8qCatFGTfDbY6W6ipGOYXfg==" - }, - "loader-utils": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-2.0.2.tgz", - "integrity": "sha512-TM57VeHptv569d/GKh6TAYdzKblwDNiumOdkFnejjD0XwTH87K90w3O7AiJRqdQoXygvi1VQTJTLGhJl7WqA7A==", - "requires": { - "big.js": "^5.2.2", - "emojis-list": "^3.0.0", - "json5": "^2.1.2" - } - }, - "locate-path": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz", - "integrity": "sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==", - "requires": { - "p-locate": "^5.0.0" - } - }, - "lodash": { - "version": "4.17.21", - "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz", - "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==" - }, - "lodash.debounce": { - "version": "4.0.8", - "resolved": "https://registry.npmjs.org/lodash.debounce/-/lodash.debounce-4.0.8.tgz", - "integrity": "sha512-FT1yDzDYEoYWhnSGnpE/4Kj1fLZkDFyqRb7fNt6FdYOSxlUWAtp42Eh6Wb0rGIv/m9Bgo7x4GhQbm5Ys4SG5ow==" - }, - "lodash.memoize": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/lodash.memoize/-/lodash.memoize-4.1.2.tgz", - "integrity": "sha512-t7j+NzmgnQzTAYXcsHYLgimltOV1MXHtlOWf6GjL9Kj8GK5FInw5JotxvbOs+IvV1/Dzo04/fCGfLVs7aXb4Ag==" - }, - "lodash.merge": { - "version": "4.6.2", - "resolved": "https://registry.npmjs.org/lodash.merge/-/lodash.merge-4.6.2.tgz", - "integrity": "sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==" - }, - "lodash.sortby": { - "version": "4.7.0", - "resolved": "https://registry.npmjs.org/lodash.sortby/-/lodash.sortby-4.7.0.tgz", - "integrity": "sha512-HDWXG8isMntAyRF5vZ7xKuEvOhT4AhlRt/3czTSjvGUxjYCBVRQY48ViDHyfYz9VIoBkW4TMGQNapx+l3RUwdA==" - }, - "lodash.uniq": { - "version": "4.5.0", - "resolved": "https://registry.npmjs.org/lodash.uniq/-/lodash.uniq-4.5.0.tgz", - "integrity": "sha512-xfBaXQd9ryd9dlSDvnvI0lvxfLJlYAZzXomUYzLKtUeOQvOP5piqAWuGtrhWeqaXK9hhoM/iyJc5AV+XfsX3HQ==" - }, - "loose-envify": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/loose-envify/-/loose-envify-1.4.0.tgz", - "integrity": "sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==", - "requires": { - "js-tokens": "^3.0.0 || ^4.0.0" - } - }, - "lower-case": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/lower-case/-/lower-case-2.0.2.tgz", - "integrity": "sha512-7fm3l3NAF9WfN6W3JOmf5drwpVqX78JtoGJ3A6W0a6ZnldM41w2fV5D490psKFTpMds8TJse/eHLFFsNHHjHgg==", - "requires": { - "tslib": "^2.0.3" - } - }, - "lru-cache": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", - "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", - "requires": { - "yallist": "^4.0.0" - } - }, - "lz-string": { - "version": "1.4.4", - "resolved": "https://registry.npmjs.org/lz-string/-/lz-string-1.4.4.tgz", - "integrity": "sha512-0ckx7ZHRPqb0oUm8zNr+90mtf9DQB60H1wMCjBtfi62Kl3a7JbHob6gA2bC+xRvZoOL+1hzUK8jeuEIQE8svEQ==" - }, - "magic-string": { - "version": "0.25.9", - "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.25.9.tgz", - "integrity": "sha512-RmF0AsMzgt25qzqqLc1+MbHmhdx0ojF2Fvs4XnOqz2ZOBXzzkEwc/dJQZCYHAn7v1jbVOjAZfK8msRn4BxO4VQ==", - "requires": { - "sourcemap-codec": "^1.4.8" - } - }, - "make-dir": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-3.1.0.tgz", - "integrity": "sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw==", - "requires": { - "semver": "^6.0.0" - }, - "dependencies": { - "semver": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", - "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==" - } - } - }, - "makeerror": { - "version": "1.0.12", - "resolved": "https://registry.npmjs.org/makeerror/-/makeerror-1.0.12.tgz", - "integrity": "sha512-JmqCvUhmt43madlpFzG4BQzG2Z3m6tvQDNKdClZnO3VbIudJYmxsT0FNJMeiB2+JTSlTQTSbU8QdesVmwJcmLg==", - "requires": { - "tmpl": "1.0.5" - } - }, - "mdn-data": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/mdn-data/-/mdn-data-2.0.4.tgz", - "integrity": "sha512-iV3XNKw06j5Q7mi6h+9vbx23Tv7JkjEVgKHW4pimwyDGWm0OIQntJJ+u1C6mg6mK1EaTv42XQ7w76yuzH7M2cA==" - }, - "media-typer": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz", - "integrity": "sha512-dq+qelQ9akHpcOl/gUVRTxVIOkAJ1wR3QAvb4RsVjS8oVoFjDGTc679wJYmUmknUF5HwMLOgb5O+a3KxfWapPQ==" - }, - "memfs": { - "version": "3.4.7", - "resolved": "https://registry.npmjs.org/memfs/-/memfs-3.4.7.tgz", - "integrity": "sha512-ygaiUSNalBX85388uskeCyhSAoOSgzBbtVCr9jA2RROssFL9Q19/ZXFqS+2Th2sr1ewNIWgFdLzLC3Yl1Zv+lw==", - "requires": { - "fs-monkey": "^1.0.3" - } - }, - "merge-descriptors": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-1.0.1.tgz", - "integrity": "sha512-cCi6g3/Zr1iqQi6ySbseM1Xvooa98N0w31jzUYrXPX2xqObmFGHJ0tQ5u74H3mVh7wLouTseZyYIq39g8cNp1w==" - }, - "merge-stream": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/merge-stream/-/merge-stream-2.0.0.tgz", - "integrity": "sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==" - }, - "merge2": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz", - "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==" - }, - "methods": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/methods/-/methods-1.1.2.tgz", - "integrity": "sha512-iclAHeNqNm68zFtnZ0e+1L2yUIdvzNoauKU4WBA3VvH/vPFieF7qfRlwUZU+DA9P9bPXIS90ulxoUoCH23sV2w==" - }, - "micromatch": { - "version": "4.0.5", - "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.5.tgz", - "integrity": "sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA==", - "requires": { - "braces": "^3.0.2", - "picomatch": "^2.3.1" - } - }, - "mime": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/mime/-/mime-1.6.0.tgz", - "integrity": "sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==" - }, - "mime-db": { - "version": "1.52.0", - "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", - "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==" - }, - "mime-types": { - "version": "2.1.35", - "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz", - "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", - "requires": { - "mime-db": "1.52.0" - } - }, - "mimic-fn": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz", - "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==" - }, - "min-indent": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/min-indent/-/min-indent-1.0.1.tgz", - "integrity": "sha512-I9jwMn07Sy/IwOj3zVkVik2JTvgpaykDZEigL6Rx6N9LbMywwUSMtxET+7lVoDLLd3O3IXwJwvuuns8UB/HeAg==" - }, - "mini-css-extract-plugin": { - "version": "2.6.1", - "resolved": "https://registry.npmjs.org/mini-css-extract-plugin/-/mini-css-extract-plugin-2.6.1.tgz", - "integrity": "sha512-wd+SD57/K6DiV7jIR34P+s3uckTRuQvx0tKPcvjFlrEylk6P4mQ2KSWk1hblj1Kxaqok7LogKOieygXqBczNlg==", - "requires": { - "schema-utils": "^4.0.0" - }, - "dependencies": { - "ajv": { - "version": "8.11.0", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.11.0.tgz", - "integrity": "sha512-wGgprdCvMalC0BztXvitD2hC04YffAvtsUn93JbGXYLAtCUO4xd17mCCZQxUOItiBwZvJScWo8NIvQMQ71rdpg==", - "requires": { - "fast-deep-equal": "^3.1.1", - "json-schema-traverse": "^1.0.0", - "require-from-string": "^2.0.2", - "uri-js": "^4.2.2" - } - }, - "ajv-keywords": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-5.1.0.tgz", - "integrity": "sha512-YCS/JNFAUyr5vAuhk1DWm1CBxRHW9LbJ2ozWeemrIqpbsqKjHVxYPyi5GC0rjZIT5JxJ3virVTS8wk4i/Z+krw==", - "requires": { - "fast-deep-equal": "^3.1.3" - } - }, - "json-schema-traverse": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", - "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==" - }, - "schema-utils": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-4.0.0.tgz", - "integrity": "sha512-1edyXKgh6XnJsJSQ8mKWXnN/BVaIbFMLpouRUrXgVq7WYne5kw3MW7UPhO44uRXQSIpTSXoJbmrR2X0w9kUTyg==", - "requires": { - "@types/json-schema": "^7.0.9", - "ajv": "^8.8.0", - "ajv-formats": "^2.1.1", - "ajv-keywords": "^5.0.0" - } - } - } - }, - "minimalistic-assert": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/minimalistic-assert/-/minimalistic-assert-1.0.1.tgz", - "integrity": "sha512-UtJcAD4yEaGtjPezWuO9wC4nwUnVH/8/Im3yEHQP4b67cXlD/Qr9hdITCU1xDbSEXg2XKNaP8jsReV7vQd00/A==" - }, - "minimatch": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", - "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", - "requires": { - "brace-expansion": "^1.1.7" - } - }, - "minimist": { - "version": "1.2.6", - "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.6.tgz", - "integrity": "sha512-Jsjnk4bw3YJqYzbdyBiNsPWHPfO++UGG749Cxs6peCu5Xg4nrena6OVxOYxrQTqww0Jmwt+Ref8rggumkTLz9Q==" - }, - "mkdirp": { - "version": "0.5.6", - "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.6.tgz", - "integrity": "sha512-FP+p8RB8OWpF3YZBCrP5gtADmtXApB5AMLn+vdyA+PyxCjrCs00mjyUozssO33cwDeT3wNGdLxJ5M//YqtHAJw==", - "requires": { - "minimist": "^1.2.6" - } - }, - "ms": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", - "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" - }, - "multicast-dns": { - "version": "7.2.5", - "resolved": "https://registry.npmjs.org/multicast-dns/-/multicast-dns-7.2.5.tgz", - "integrity": "sha512-2eznPJP8z2BFLX50tf0LuODrpINqP1RVIm/CObbTcBRITQgmC/TjcREF1NeTBzIcR5XO/ukWo+YHOjBbFwIupg==", - "requires": { - "dns-packet": "^5.2.2", - "thunky": "^1.0.2" - } - }, - "nanoid": { - "version": "3.3.4", - "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.4.tgz", - "integrity": "sha512-MqBkQh/OHTS2egovRtLk45wEyNXwF+cokD+1YPf9u5VfJiRdAiRwB2froX5Co9Rh20xs4siNPm8naNotSD6RBw==" - }, - "natural-compare": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz", - "integrity": "sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==" - }, - "negotiator": { - "version": "0.6.3", - "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.3.tgz", - "integrity": "sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg==" - }, - "neo-async": { - "version": "2.6.2", - "resolved": "https://registry.npmjs.org/neo-async/-/neo-async-2.6.2.tgz", - "integrity": "sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw==" - }, - "no-case": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/no-case/-/no-case-3.0.4.tgz", - "integrity": "sha512-fgAN3jGAh+RoxUGZHTSOLJIqUc2wmoBwGR4tbpNAKmmovFoWq0OdRkb0VkldReO2a2iBT/OEulG9XSUc10r3zg==", - "requires": { - "lower-case": "^2.0.2", - "tslib": "^2.0.3" - } - }, - "node-forge": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/node-forge/-/node-forge-1.3.1.tgz", - "integrity": "sha512-dPEtOeMvF9VMcYV/1Wb8CPoVAXtp6MKMlcbAt4ddqmGqUJ6fQZFXkNZNkNlfevtNkGtaSoXf/vNNNSvgrdXwtA==" - }, - "node-int64": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/node-int64/-/node-int64-0.4.0.tgz", - "integrity": "sha512-O5lz91xSOeoXP6DulyHfllpq+Eg00MWitZIbtPfoSEvqIHdl5gfcY6hYzDWnj0qD5tz52PI08u9qUvSVeUBeHw==" - }, - "node-releases": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.6.tgz", - "integrity": "sha512-PiVXnNuFm5+iYkLBNeq5211hvO38y63T0i2KKh2KnUs3RpzJ+JtODFjkD8yjLwnDkTYF1eKXheUwdssR+NRZdg==" - }, - "normalize-path": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", - "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==" - }, - "normalize-range": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/normalize-range/-/normalize-range-0.1.2.tgz", - "integrity": "sha512-bdok/XvKII3nUpklnV6P2hxtMNrCboOjAcyBuQnWEhO665FwrSNRxU+AqpsyvO6LgGYPspN+lu5CLtw4jPRKNA==" - }, - "normalize-url": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/normalize-url/-/normalize-url-6.1.0.tgz", - "integrity": "sha512-DlL+XwOy3NxAQ8xuC0okPgK46iuVNAK01YN7RueYBqqFeGsBjV9XmCAzAdgt+667bCl5kPh9EqKKDwnaPG1I7A==" - }, - "npm-run-path": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-4.0.1.tgz", - "integrity": "sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw==", - "requires": { - "path-key": "^3.0.0" - } - }, - "nth-check": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/nth-check/-/nth-check-2.1.1.tgz", - "integrity": "sha512-lqjrjmaOoAnWfMmBPL+XNnynZh2+swxiX3WUE0s4yEHI6m+AwrK2UZOimIRl3X/4QctVqS8AiZjFqyOGrMXb/w==", - "requires": { - "boolbase": "^1.0.0" - } - }, - "nwsapi": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/nwsapi/-/nwsapi-2.2.1.tgz", - "integrity": "sha512-JYOWTeFoS0Z93587vRJgASD5Ut11fYl5NyihP3KrYBvMe1FRRs6RN7m20SA/16GM4P6hTnZjT+UmDOt38UeXNg==" - }, - "object-assign": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", - "integrity": "sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==" - }, - "object-hash": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/object-hash/-/object-hash-3.0.0.tgz", - "integrity": "sha512-RSn9F68PjH9HqtltsSnqYC1XXoWe9Bju5+213R98cNGttag9q9yAOTzdbsqvIa7aNm5WffBZFpWYr2aWrklWAw==" - }, - "object-inspect": { - "version": "1.12.2", - "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.12.2.tgz", - "integrity": "sha512-z+cPxW0QGUp0mcqcsgQyLVRDoXFQbXOwBaqyF7VIgI4TWNQsDHrBpUQslRmIfAoYWdYzs6UlKJtB2XJpTaNSpQ==" - }, - "object-keys": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.1.1.tgz", - "integrity": "sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==" - }, - "object.assign": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.2.tgz", - "integrity": "sha512-ixT2L5THXsApyiUPYKmW+2EHpXXe5Ii3M+f4e+aJFAHao5amFRW6J0OO6c/LU8Be47utCx2GL89hxGB6XSmKuQ==", - "requires": { - "call-bind": "^1.0.0", - "define-properties": "^1.1.3", - "has-symbols": "^1.0.1", - "object-keys": "^1.1.1" - } - }, - "object.entries": { - "version": "1.1.5", - "resolved": "https://registry.npmjs.org/object.entries/-/object.entries-1.1.5.tgz", - "integrity": "sha512-TyxmjUoZggd4OrrU1W66FMDG6CuqJxsFvymeyXI51+vQLN67zYfZseptRge703kKQdo4uccgAKebXFcRCzk4+g==", - "requires": { - "call-bind": "^1.0.2", - "define-properties": "^1.1.3", - "es-abstract": "^1.19.1" - } - }, - "object.fromentries": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/object.fromentries/-/object.fromentries-2.0.5.tgz", - "integrity": "sha512-CAyG5mWQRRiBU57Re4FKoTBjXfDoNwdFVH2Y1tS9PqCsfUTymAohOkEMSG3aRNKmv4lV3O7p1et7c187q6bynw==", - "requires": { - "call-bind": "^1.0.2", - "define-properties": "^1.1.3", - "es-abstract": "^1.19.1" - } - }, - "object.getownpropertydescriptors": { - "version": "2.1.4", - "resolved": "https://registry.npmjs.org/object.getownpropertydescriptors/-/object.getownpropertydescriptors-2.1.4.tgz", - "integrity": "sha512-sccv3L/pMModT6dJAYF3fzGMVcb38ysQ0tEE6ixv2yXJDtEIPph268OlAdJj5/qZMZDq2g/jqvwppt36uS/uQQ==", - "requires": { - "array.prototype.reduce": "^1.0.4", - "call-bind": "^1.0.2", - "define-properties": "^1.1.4", - "es-abstract": "^1.20.1" - } - }, - "object.hasown": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/object.hasown/-/object.hasown-1.1.1.tgz", - "integrity": "sha512-LYLe4tivNQzq4JdaWW6WO3HMZZJWzkkH8fnI6EebWl0VZth2wL2Lovm74ep2/gZzlaTdV62JZHEqHQ2yVn8Q/A==", - "requires": { - "define-properties": "^1.1.4", - "es-abstract": "^1.19.5" - } - }, - "object.values": { - "version": "1.1.5", - "resolved": "https://registry.npmjs.org/object.values/-/object.values-1.1.5.tgz", - "integrity": "sha512-QUZRW0ilQ3PnPpbNtgdNV1PDbEqLIiSFB3l+EnGtBQ/8SUTLj1PZwtQHABZtLgwpJZTSZhuGLOGk57Drx2IvYg==", - "requires": { - "call-bind": "^1.0.2", - "define-properties": "^1.1.3", - "es-abstract": "^1.19.1" - } - }, - "obuf": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/obuf/-/obuf-1.1.2.tgz", - "integrity": "sha512-PX1wu0AmAdPqOL1mWhqmlOd8kOIZQwGZw6rh7uby9fTc5lhaOWFLX3I6R1hrF9k3zUY40e6igsLGkDXK92LJNg==" - }, - "on-finished": { - "version": "2.4.1", - "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.4.1.tgz", - "integrity": "sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg==", - "requires": { - "ee-first": "1.1.1" - } - }, - "on-headers": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/on-headers/-/on-headers-1.0.2.tgz", - "integrity": "sha512-pZAE+FJLoyITytdqK0U5s+FIpjN0JP3OzFi/u8Rx+EV5/W+JTWGXG8xFzevE7AjBfDqHv/8vL8qQsIhHnqRkrA==" - }, - "once": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", - "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==", - "requires": { - "wrappy": "1" - } - }, - "onetime": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/onetime/-/onetime-5.1.2.tgz", - "integrity": "sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==", - "requires": { - "mimic-fn": "^2.1.0" - } - }, - "open": { - "version": "8.4.0", - "resolved": "https://registry.npmjs.org/open/-/open-8.4.0.tgz", - "integrity": "sha512-XgFPPM+B28FtCCgSb9I+s9szOC1vZRSwgWsRUA5ylIxRTgKozqjOCrVOqGsYABPYK5qnfqClxZTFBa8PKt2v6Q==", - "requires": { - "define-lazy-prop": "^2.0.0", - "is-docker": "^2.1.1", - "is-wsl": "^2.2.0" - } - }, - "optionator": { - "version": "0.9.1", - "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.9.1.tgz", - "integrity": "sha512-74RlY5FCnhq4jRxVUPKDaRwrVNXMqsGsiW6AJw4XK8hmtm10wC0ypZBLw5IIp85NZMr91+qd1RvvENwg7jjRFw==", - "requires": { - "deep-is": "^0.1.3", - "fast-levenshtein": "^2.0.6", - "levn": "^0.4.1", - "prelude-ls": "^1.2.1", - "type-check": "^0.4.0", - "word-wrap": "^1.2.3" - } - }, - "p-limit": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz", - "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==", - "requires": { - "yocto-queue": "^0.1.0" - } - }, - "p-locate": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-5.0.0.tgz", - "integrity": "sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==", - "requires": { - "p-limit": "^3.0.2" - } - }, - "p-retry": { - "version": "4.6.2", - "resolved": "https://registry.npmjs.org/p-retry/-/p-retry-4.6.2.tgz", - "integrity": "sha512-312Id396EbJdvRONlngUx0NydfrIQ5lsYu0znKVUzVvArzEIt08V1qhtyESbGVd1FGX7UKtiFp5uwKZdM8wIuQ==", - "requires": { - "@types/retry": "0.12.0", - "retry": "^0.13.1" - } - }, - "p-try": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz", - "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==" - }, - "param-case": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/param-case/-/param-case-3.0.4.tgz", - "integrity": "sha512-RXlj7zCYokReqWpOPH9oYivUzLYZ5vAPIfEmCTNViosC78F8F0H9y7T7gG2M39ymgutxF5gcFEsyZQSph9Bp3A==", - "requires": { - "dot-case": "^3.0.4", - "tslib": "^2.0.3" - } - }, - "parent-module": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz", - "integrity": "sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==", - "requires": { - "callsites": "^3.0.0" - } - }, - "parse-json": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-5.2.0.tgz", - "integrity": "sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg==", - "requires": { - "@babel/code-frame": "^7.0.0", - "error-ex": "^1.3.1", - "json-parse-even-better-errors": "^2.3.0", - "lines-and-columns": "^1.1.6" - } - }, - "parse5": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/parse5/-/parse5-6.0.1.tgz", - "integrity": "sha512-Ofn/CTFzRGTTxwpNEs9PP93gXShHcTq255nzRYSKe8AkVpZY7e1fpmTfOyoIvjP5HG7Z2ZM7VS9PPhQGW2pOpw==" - }, - "parseurl": { - "version": "1.3.3", - "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz", - "integrity": "sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==" - }, - "pascal-case": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/pascal-case/-/pascal-case-3.1.2.tgz", - "integrity": "sha512-uWlGT3YSnK9x3BQJaOdcZwrnV6hPpd8jFH1/ucpiLRPh/2zCVJKS19E4GvYHvaCcACn3foXZ0cLB9Wrx1KGe5g==", - "requires": { - "no-case": "^3.0.4", - "tslib": "^2.0.3" - } - }, - "path-exists": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", - "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==" - }, - "path-is-absolute": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", - "integrity": "sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==" - }, - "path-key": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", - "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==" - }, - "path-parse": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz", - "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==" - }, - "path-to-regexp": { - "version": "0.1.7", - "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.7.tgz", - "integrity": "sha512-5DFkuoqlv1uYQKxy8omFBeJPQcdoE07Kv2sferDCrAq1ohOU+MSDswDIbnx3YAM60qIOnYa53wBhXW0EbMonrQ==" - }, - "path-type": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/path-type/-/path-type-4.0.0.tgz", - "integrity": "sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==" - }, - "performance-now": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/performance-now/-/performance-now-2.1.0.tgz", - "integrity": "sha512-7EAHlyLHI56VEIdK57uwHdHKIaAGbnXPiw0yWbarQZOKaKpvUIgW0jWRVLiatnM+XXlSwsanIBH/hzGMJulMow==" - }, - "picocolors": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.0.0.tgz", - "integrity": "sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==" - }, - "picomatch": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", - "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==" - }, - "pify": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", - "integrity": "sha512-udgsAY+fTnvv7kI7aaxbqwWNb0AHiB0qBO89PZKPkoTmGOgdbrHDKD+0B2X4uTfJ/FT1R09r9gTsjUjNJotuog==" - }, - "pirates": { - "version": "4.0.5", - "resolved": "https://registry.npmjs.org/pirates/-/pirates-4.0.5.tgz", - "integrity": "sha512-8V9+HQPupnaXMA23c5hvl69zXvTwTzyAYasnkb0Tts4XvO4CliqONMOnvlq26rkhLC3nWDFBJf73LU1e1VZLaQ==" - }, - "pkg-dir": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-4.2.0.tgz", - "integrity": "sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ==", - "requires": { - "find-up": "^4.0.0" - }, - "dependencies": { - "find-up": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", - "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", - "requires": { - "locate-path": "^5.0.0", - "path-exists": "^4.0.0" - } - }, - "locate-path": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", - "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", - "requires": { - "p-locate": "^4.1.0" - } - }, - "p-limit": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", - "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", - "requires": { - "p-try": "^2.0.0" - } - }, - "p-locate": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", - "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", - "requires": { - "p-limit": "^2.2.0" - } - } - } - }, - "pkg-up": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/pkg-up/-/pkg-up-3.1.0.tgz", - "integrity": "sha512-nDywThFk1i4BQK4twPQ6TA4RT8bDY96yeuCVBWL3ePARCiEKDRSrNGbFIgUJpLp+XeIR65v8ra7WuJOFUBtkMA==", - "requires": { - "find-up": "^3.0.0" - }, - "dependencies": { - "find-up": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-3.0.0.tgz", - "integrity": "sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg==", - "requires": { - "locate-path": "^3.0.0" - } - }, - "locate-path": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-3.0.0.tgz", - "integrity": "sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A==", - "requires": { - "p-locate": "^3.0.0", - "path-exists": "^3.0.0" - } - }, - "p-limit": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", - "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", - "requires": { - "p-try": "^2.0.0" - } - }, - "p-locate": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-3.0.0.tgz", - "integrity": "sha512-x+12w/To+4GFfgJhBEpiDcLozRJGegY+Ei7/z0tSLkMmxGZNybVMSfWj9aJn8Z5Fc7dBUNJOOVgPv2H7IwulSQ==", - "requires": { - "p-limit": "^2.0.0" - } - }, - "path-exists": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz", - "integrity": "sha512-bpC7GYwiDYQ4wYLe+FA8lhRjhQCMcQGuSgGGqDkg/QerRWw9CmGRT0iSOVRSZJ29NMLZgIzqaljJ63oaL4NIJQ==" - } - } - }, - "postcss": { - "version": "8.4.14", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.14.tgz", - "integrity": "sha512-E398TUmfAYFPBSdzgeieK2Y1+1cpdxJx8yXbK/m57nRhKSmk1GB2tO4lbLBtlkfPQTDKfe4Xqv1ASWPpayPEig==", - "requires": { - "nanoid": "^3.3.4", - "picocolors": "^1.0.0", - "source-map-js": "^1.0.2" - } - }, - "postcss-attribute-case-insensitive": { - "version": "5.0.2", - "resolved": "https://registry.npmjs.org/postcss-attribute-case-insensitive/-/postcss-attribute-case-insensitive-5.0.2.tgz", - "integrity": "sha512-XIidXV8fDr0kKt28vqki84fRK8VW8eTuIa4PChv2MqKuT6C9UjmSKzen6KaWhWEoYvwxFCa7n/tC1SZ3tyq4SQ==", - "requires": { - "postcss-selector-parser": "^6.0.10" - } - }, - "postcss-browser-comments": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/postcss-browser-comments/-/postcss-browser-comments-4.0.0.tgz", - "integrity": "sha512-X9X9/WN3KIvY9+hNERUqX9gncsgBA25XaeR+jshHz2j8+sYyHktHw1JdKuMjeLpGktXidqDhA7b/qm1mrBDmgg==", - "requires": {} - }, - "postcss-calc": { - "version": "8.2.4", - "resolved": "https://registry.npmjs.org/postcss-calc/-/postcss-calc-8.2.4.tgz", - "integrity": "sha512-SmWMSJmB8MRnnULldx0lQIyhSNvuDl9HfrZkaqqE/WHAhToYsAvDq+yAsA/kIyINDszOp3Rh0GFoNuH5Ypsm3Q==", - "requires": { - "postcss-selector-parser": "^6.0.9", - "postcss-value-parser": "^4.2.0" - } - }, - "postcss-clamp": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/postcss-clamp/-/postcss-clamp-4.1.0.tgz", - "integrity": "sha512-ry4b1Llo/9zz+PKC+030KUnPITTJAHeOwjfAyyB60eT0AorGLdzp52s31OsPRHRf8NchkgFoG2y6fCfn1IV1Ow==", - "requires": { - "postcss-value-parser": "^4.2.0" - } - }, - "postcss-color-functional-notation": { - "version": "4.2.4", - "resolved": "https://registry.npmjs.org/postcss-color-functional-notation/-/postcss-color-functional-notation-4.2.4.tgz", - "integrity": "sha512-2yrTAUZUab9s6CpxkxC4rVgFEVaR6/2Pipvi6qcgvnYiVqZcbDHEoBDhrXzyb7Efh2CCfHQNtcqWcIruDTIUeg==", - "requires": { - "postcss-value-parser": "^4.2.0" - } - }, - "postcss-color-hex-alpha": { - "version": "8.0.4", - "resolved": "https://registry.npmjs.org/postcss-color-hex-alpha/-/postcss-color-hex-alpha-8.0.4.tgz", - "integrity": "sha512-nLo2DCRC9eE4w2JmuKgVA3fGL3d01kGq752pVALF68qpGLmx2Qrk91QTKkdUqqp45T1K1XV8IhQpcu1hoAQflQ==", - "requires": { - "postcss-value-parser": "^4.2.0" - } - }, - "postcss-color-rebeccapurple": { - "version": "7.1.1", - "resolved": "https://registry.npmjs.org/postcss-color-rebeccapurple/-/postcss-color-rebeccapurple-7.1.1.tgz", - "integrity": "sha512-pGxkuVEInwLHgkNxUc4sdg4g3py7zUeCQ9sMfwyHAT+Ezk8a4OaaVZ8lIY5+oNqA/BXXgLyXv0+5wHP68R79hg==", - "requires": { - "postcss-value-parser": "^4.2.0" - } - }, - "postcss-colormin": { - "version": "5.3.0", - "resolved": "https://registry.npmjs.org/postcss-colormin/-/postcss-colormin-5.3.0.tgz", - "integrity": "sha512-WdDO4gOFG2Z8n4P8TWBpshnL3JpmNmJwdnfP2gbk2qBA8PWwOYcmjmI/t3CmMeL72a7Hkd+x/Mg9O2/0rD54Pg==", - "requires": { - "browserslist": "^4.16.6", - "caniuse-api": "^3.0.0", - "colord": "^2.9.1", - "postcss-value-parser": "^4.2.0" - } - }, - "postcss-convert-values": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/postcss-convert-values/-/postcss-convert-values-5.1.2.tgz", - "integrity": "sha512-c6Hzc4GAv95B7suy4udszX9Zy4ETyMCgFPUDtWjdFTKH1SE9eFY/jEpHSwTH1QPuwxHpWslhckUQWbNRM4ho5g==", - "requires": { - "browserslist": "^4.20.3", - "postcss-value-parser": "^4.2.0" - } - }, - "postcss-custom-media": { - "version": "8.0.2", - "resolved": "https://registry.npmjs.org/postcss-custom-media/-/postcss-custom-media-8.0.2.tgz", - "integrity": "sha512-7yi25vDAoHAkbhAzX9dHx2yc6ntS4jQvejrNcC+csQJAXjj15e7VcWfMgLqBNAbOvqi5uIa9huOVwdHbf+sKqg==", - "requires": { - "postcss-value-parser": "^4.2.0" - } - }, - "postcss-custom-properties": { - "version": "12.1.8", - "resolved": "https://registry.npmjs.org/postcss-custom-properties/-/postcss-custom-properties-12.1.8.tgz", - "integrity": "sha512-8rbj8kVu00RQh2fQF81oBqtduiANu4MIxhyf0HbbStgPtnFlWn0yiaYTpLHrPnJbffVY1s9apWsIoVZcc68FxA==", - "requires": { - "postcss-value-parser": "^4.2.0" - } - }, - "postcss-custom-selectors": { - "version": "6.0.3", - "resolved": "https://registry.npmjs.org/postcss-custom-selectors/-/postcss-custom-selectors-6.0.3.tgz", - "integrity": "sha512-fgVkmyiWDwmD3JbpCmB45SvvlCD6z9CG6Ie6Iere22W5aHea6oWa7EM2bpnv2Fj3I94L3VbtvX9KqwSi5aFzSg==", - "requires": { - "postcss-selector-parser": "^6.0.4" - } - }, - "postcss-dir-pseudo-class": { - "version": "6.0.5", - "resolved": "https://registry.npmjs.org/postcss-dir-pseudo-class/-/postcss-dir-pseudo-class-6.0.5.tgz", - "integrity": "sha512-eqn4m70P031PF7ZQIvSgy9RSJ5uI2171O/OO/zcRNYpJbvaeKFUlar1aJ7rmgiQtbm0FSPsRewjpdS0Oew7MPA==", - "requires": { - "postcss-selector-parser": "^6.0.10" - } - }, - "postcss-discard-comments": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/postcss-discard-comments/-/postcss-discard-comments-5.1.2.tgz", - "integrity": "sha512-+L8208OVbHVF2UQf1iDmRcbdjJkuBF6IS29yBDSiWUIzpYaAhtNl6JYnYm12FnkeCwQqF5LeklOu6rAqgfBZqQ==", - "requires": {} - }, - "postcss-discard-duplicates": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/postcss-discard-duplicates/-/postcss-discard-duplicates-5.1.0.tgz", - "integrity": "sha512-zmX3IoSI2aoenxHV6C7plngHWWhUOV3sP1T8y2ifzxzbtnuhk1EdPwm0S1bIUNaJ2eNbWeGLEwzw8huPD67aQw==", - "requires": {} - }, - "postcss-discard-empty": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/postcss-discard-empty/-/postcss-discard-empty-5.1.1.tgz", - "integrity": "sha512-zPz4WljiSuLWsI0ir4Mcnr4qQQ5e1Ukc3i7UfE2XcrwKK2LIPIqE5jxMRxO6GbI3cv//ztXDsXwEWT3BHOGh3A==", - "requires": {} - }, - "postcss-discard-overridden": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/postcss-discard-overridden/-/postcss-discard-overridden-5.1.0.tgz", - "integrity": "sha512-21nOL7RqWR1kasIVdKs8HNqQJhFxLsyRfAnUDm4Fe4t4mCWL9OJiHvlHPjcd8zc5Myu89b/7wZDnOSjFgeWRtw==", - "requires": {} - }, - "postcss-double-position-gradients": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/postcss-double-position-gradients/-/postcss-double-position-gradients-3.1.2.tgz", - "integrity": "sha512-GX+FuE/uBR6eskOK+4vkXgT6pDkexLokPaz/AbJna9s5Kzp/yl488pKPjhy0obB475ovfT1Wv8ho7U/cHNaRgQ==", - "requires": { - "@csstools/postcss-progressive-custom-properties": "^1.1.0", - "postcss-value-parser": "^4.2.0" - } - }, - "postcss-env-function": { - "version": "4.0.6", - "resolved": "https://registry.npmjs.org/postcss-env-function/-/postcss-env-function-4.0.6.tgz", - "integrity": "sha512-kpA6FsLra+NqcFnL81TnsU+Z7orGtDTxcOhl6pwXeEq1yFPpRMkCDpHhrz8CFQDr/Wfm0jLiNQ1OsGGPjlqPwA==", - "requires": { - "postcss-value-parser": "^4.2.0" - } - }, - "postcss-flexbugs-fixes": { - "version": "5.0.2", - "resolved": "https://registry.npmjs.org/postcss-flexbugs-fixes/-/postcss-flexbugs-fixes-5.0.2.tgz", - "integrity": "sha512-18f9voByak7bTktR2QgDveglpn9DTbBWPUzSOe9g0N4WR/2eSt6Vrcbf0hmspvMI6YWGywz6B9f7jzpFNJJgnQ==", - "requires": {} - }, - "postcss-focus-visible": { - "version": "6.0.4", - "resolved": "https://registry.npmjs.org/postcss-focus-visible/-/postcss-focus-visible-6.0.4.tgz", - "integrity": "sha512-QcKuUU/dgNsstIK6HELFRT5Y3lbrMLEOwG+A4s5cA+fx3A3y/JTq3X9LaOj3OC3ALH0XqyrgQIgey/MIZ8Wczw==", - "requires": { - "postcss-selector-parser": "^6.0.9" - } - }, - "postcss-focus-within": { - "version": "5.0.4", - "resolved": "https://registry.npmjs.org/postcss-focus-within/-/postcss-focus-within-5.0.4.tgz", - "integrity": "sha512-vvjDN++C0mu8jz4af5d52CB184ogg/sSxAFS+oUJQq2SuCe7T5U2iIsVJtsCp2d6R4j0jr5+q3rPkBVZkXD9fQ==", - "requires": { - "postcss-selector-parser": "^6.0.9" - } - }, - "postcss-font-variant": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/postcss-font-variant/-/postcss-font-variant-5.0.0.tgz", - "integrity": "sha512-1fmkBaCALD72CK2a9i468mA/+tr9/1cBxRRMXOUaZqO43oWPR5imcyPjXwuv7PXbCid4ndlP5zWhidQVVa3hmA==", - "requires": {} - }, - "postcss-gap-properties": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/postcss-gap-properties/-/postcss-gap-properties-3.0.4.tgz", - "integrity": "sha512-PaEM4AUQY7uomyuVVXsIntdo4eT8VkBMrSinQxvXuMcJ1z3RHlFw4Kqef2X+rRVz3WHaYCa0EEtwousBT6vcIA==", - "requires": {} - }, - "postcss-image-set-function": { - "version": "4.0.7", - "resolved": "https://registry.npmjs.org/postcss-image-set-function/-/postcss-image-set-function-4.0.7.tgz", - "integrity": "sha512-9T2r9rsvYzm5ndsBE8WgtrMlIT7VbtTfE7b3BQnudUqnBcBo7L758oc+o+pdj/dUV0l5wjwSdjeOH2DZtfv8qw==", - "requires": { - "postcss-value-parser": "^4.2.0" - } - }, - "postcss-import": { - "version": "14.1.0", - "resolved": "https://registry.npmjs.org/postcss-import/-/postcss-import-14.1.0.tgz", - "integrity": "sha512-flwI+Vgm4SElObFVPpTIT7SU7R3qk2L7PyduMcokiaVKuWv9d/U+Gm/QAd8NDLuykTWTkcrjOeD2Pp1rMeBTGw==", - "requires": { - "postcss-value-parser": "^4.0.0", - "read-cache": "^1.0.0", - "resolve": "^1.1.7" - } - }, - "postcss-initial": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/postcss-initial/-/postcss-initial-4.0.1.tgz", - "integrity": "sha512-0ueD7rPqX8Pn1xJIjay0AZeIuDoF+V+VvMt/uOnn+4ezUKhZM/NokDeP6DwMNyIoYByuN/94IQnt5FEkaN59xQ==", - "requires": {} - }, - "postcss-js": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/postcss-js/-/postcss-js-4.0.0.tgz", - "integrity": "sha512-77QESFBwgX4irogGVPgQ5s07vLvFqWr228qZY+w6lW599cRlK/HmnlivnnVUxkjHnCu4J16PDMHcH+e+2HbvTQ==", - "requires": { - "camelcase-css": "^2.0.1" - } - }, - "postcss-lab-function": { - "version": "4.2.1", - "resolved": "https://registry.npmjs.org/postcss-lab-function/-/postcss-lab-function-4.2.1.tgz", - "integrity": "sha512-xuXll4isR03CrQsmxyz92LJB2xX9n+pZJ5jE9JgcnmsCammLyKdlzrBin+25dy6wIjfhJpKBAN80gsTlCgRk2w==", - "requires": { - "@csstools/postcss-progressive-custom-properties": "^1.1.0", - "postcss-value-parser": "^4.2.0" - } - }, - "postcss-load-config": { - "version": "3.1.4", - "resolved": "https://registry.npmjs.org/postcss-load-config/-/postcss-load-config-3.1.4.tgz", - "integrity": "sha512-6DiM4E7v4coTE4uzA8U//WhtPwyhiim3eyjEMFCnUpzbrkK9wJHgKDT2mR+HbtSrd/NubVaYTOpSpjUl8NQeRg==", - "requires": { - "lilconfig": "^2.0.5", - "yaml": "^1.10.2" - } - }, - "postcss-loader": { - "version": "6.2.1", - "resolved": "https://registry.npmjs.org/postcss-loader/-/postcss-loader-6.2.1.tgz", - "integrity": "sha512-WbbYpmAaKcux/P66bZ40bpWsBucjx/TTgVVzRZ9yUO8yQfVBlameJ0ZGVaPfH64hNSBh63a+ICP5nqOpBA0w+Q==", - "requires": { - "cosmiconfig": "^7.0.0", - "klona": "^2.0.5", - "semver": "^7.3.5" - } - }, - "postcss-logical": { - "version": "5.0.4", - "resolved": "https://registry.npmjs.org/postcss-logical/-/postcss-logical-5.0.4.tgz", - "integrity": "sha512-RHXxplCeLh9VjinvMrZONq7im4wjWGlRJAqmAVLXyZaXwfDWP73/oq4NdIp+OZwhQUMj0zjqDfM5Fj7qby+B4g==", - "requires": {} - }, - "postcss-media-minmax": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/postcss-media-minmax/-/postcss-media-minmax-5.0.0.tgz", - "integrity": "sha512-yDUvFf9QdFZTuCUg0g0uNSHVlJ5X1lSzDZjPSFaiCWvjgsvu8vEVxtahPrLMinIDEEGnx6cBe6iqdx5YWz08wQ==", - "requires": {} - }, - "postcss-merge-longhand": { - "version": "5.1.6", - "resolved": "https://registry.npmjs.org/postcss-merge-longhand/-/postcss-merge-longhand-5.1.6.tgz", - "integrity": "sha512-6C/UGF/3T5OE2CEbOuX7iNO63dnvqhGZeUnKkDeifebY0XqkkvrctYSZurpNE902LDf2yKwwPFgotnfSoPhQiw==", - "requires": { - "postcss-value-parser": "^4.2.0", - "stylehacks": "^5.1.0" - } - }, - "postcss-merge-rules": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/postcss-merge-rules/-/postcss-merge-rules-5.1.2.tgz", - "integrity": "sha512-zKMUlnw+zYCWoPN6yhPjtcEdlJaMUZ0WyVcxTAmw3lkkN/NDMRkOkiuctQEoWAOvH7twaxUUdvBWl0d4+hifRQ==", - "requires": { - "browserslist": "^4.16.6", - "caniuse-api": "^3.0.0", - "cssnano-utils": "^3.1.0", - "postcss-selector-parser": "^6.0.5" - } - }, - "postcss-minify-font-values": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/postcss-minify-font-values/-/postcss-minify-font-values-5.1.0.tgz", - "integrity": "sha512-el3mYTgx13ZAPPirSVsHqFzl+BBBDrXvbySvPGFnQcTI4iNslrPaFq4muTkLZmKlGk4gyFAYUBMH30+HurREyA==", - "requires": { - "postcss-value-parser": "^4.2.0" - } - }, - "postcss-minify-gradients": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/postcss-minify-gradients/-/postcss-minify-gradients-5.1.1.tgz", - "integrity": "sha512-VGvXMTpCEo4qHTNSa9A0a3D+dxGFZCYwR6Jokk+/3oB6flu2/PnPXAh2x7x52EkY5xlIHLm+Le8tJxe/7TNhzw==", - "requires": { - "colord": "^2.9.1", - "cssnano-utils": "^3.1.0", - "postcss-value-parser": "^4.2.0" - } - }, - "postcss-minify-params": { - "version": "5.1.3", - "resolved": "https://registry.npmjs.org/postcss-minify-params/-/postcss-minify-params-5.1.3.tgz", - "integrity": "sha512-bkzpWcjykkqIujNL+EVEPOlLYi/eZ050oImVtHU7b4lFS82jPnsCb44gvC6pxaNt38Els3jWYDHTjHKf0koTgg==", - "requires": { - "browserslist": "^4.16.6", - "cssnano-utils": "^3.1.0", - "postcss-value-parser": "^4.2.0" - } - }, - "postcss-minify-selectors": { - "version": "5.2.1", - "resolved": "https://registry.npmjs.org/postcss-minify-selectors/-/postcss-minify-selectors-5.2.1.tgz", - "integrity": "sha512-nPJu7OjZJTsVUmPdm2TcaiohIwxP+v8ha9NehQ2ye9szv4orirRU3SDdtUmKH+10nzn0bAyOXZ0UEr7OpvLehg==", - "requires": { - "postcss-selector-parser": "^6.0.5" - } - }, - "postcss-modules-extract-imports": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/postcss-modules-extract-imports/-/postcss-modules-extract-imports-3.0.0.tgz", - "integrity": "sha512-bdHleFnP3kZ4NYDhuGlVK+CMrQ/pqUm8bx/oGL93K6gVwiclvX5x0n76fYMKuIGKzlABOy13zsvqjb0f92TEXw==", - "requires": {} - }, - "postcss-modules-local-by-default": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/postcss-modules-local-by-default/-/postcss-modules-local-by-default-4.0.0.tgz", - "integrity": "sha512-sT7ihtmGSF9yhm6ggikHdV0hlziDTX7oFoXtuVWeDd3hHObNkcHRo9V3yg7vCAY7cONyxJC/XXCmmiHHcvX7bQ==", - "requires": { - "icss-utils": "^5.0.0", - "postcss-selector-parser": "^6.0.2", - "postcss-value-parser": "^4.1.0" - } - }, - "postcss-modules-scope": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/postcss-modules-scope/-/postcss-modules-scope-3.0.0.tgz", - "integrity": "sha512-hncihwFA2yPath8oZ15PZqvWGkWf+XUfQgUGamS4LqoP1anQLOsOJw0vr7J7IwLpoY9fatA2qiGUGmuZL0Iqlg==", - "requires": { - "postcss-selector-parser": "^6.0.4" - } - }, - "postcss-modules-values": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/postcss-modules-values/-/postcss-modules-values-4.0.0.tgz", - "integrity": "sha512-RDxHkAiEGI78gS2ofyvCsu7iycRv7oqw5xMWn9iMoR0N/7mf9D50ecQqUo5BZ9Zh2vH4bCUR/ktCqbB9m8vJjQ==", - "requires": { - "icss-utils": "^5.0.0" - } - }, - "postcss-nested": { - "version": "5.0.6", - "resolved": "https://registry.npmjs.org/postcss-nested/-/postcss-nested-5.0.6.tgz", - "integrity": "sha512-rKqm2Fk0KbA8Vt3AdGN0FB9OBOMDVajMG6ZCf/GoHgdxUJ4sBFp0A/uMIRm+MJUdo33YXEtjqIz8u7DAp8B7DA==", - "requires": { - "postcss-selector-parser": "^6.0.6" - } - }, - "postcss-nesting": { - "version": "10.1.10", - "resolved": "https://registry.npmjs.org/postcss-nesting/-/postcss-nesting-10.1.10.tgz", - "integrity": "sha512-lqd7LXCq0gWc0wKXtoKDru5wEUNjm3OryLVNRZ8OnW8km6fSNUuFrjEhU3nklxXE2jvd4qrox566acgh+xQt8w==", - "requires": { - "@csstools/selector-specificity": "^2.0.0", - "postcss-selector-parser": "^6.0.10" - } - }, - "postcss-normalize": { - "version": "10.0.1", - "resolved": "https://registry.npmjs.org/postcss-normalize/-/postcss-normalize-10.0.1.tgz", - "integrity": "sha512-+5w18/rDev5mqERcG3W5GZNMJa1eoYYNGo8gB7tEwaos0ajk3ZXAI4mHGcNT47NE+ZnZD1pEpUOFLvltIwmeJA==", - "requires": { - "@csstools/normalize.css": "*", - "postcss-browser-comments": "^4", - "sanitize.css": "*" - } - }, - "postcss-normalize-charset": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/postcss-normalize-charset/-/postcss-normalize-charset-5.1.0.tgz", - "integrity": "sha512-mSgUJ+pd/ldRGVx26p2wz9dNZ7ji6Pn8VWBajMXFf8jk7vUoSrZ2lt/wZR7DtlZYKesmZI680qjr2CeFF2fbUg==", - "requires": {} - }, - "postcss-normalize-display-values": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/postcss-normalize-display-values/-/postcss-normalize-display-values-5.1.0.tgz", - "integrity": "sha512-WP4KIM4o2dazQXWmFaqMmcvsKmhdINFblgSeRgn8BJ6vxaMyaJkwAzpPpuvSIoG/rmX3M+IrRZEz2H0glrQNEA==", - "requires": { - "postcss-value-parser": "^4.2.0" - } - }, - "postcss-normalize-positions": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/postcss-normalize-positions/-/postcss-normalize-positions-5.1.1.tgz", - "integrity": "sha512-6UpCb0G4eofTCQLFVuI3EVNZzBNPiIKcA1AKVka+31fTVySphr3VUgAIULBhxZkKgwLImhzMR2Bw1ORK+37INg==", - "requires": { - "postcss-value-parser": "^4.2.0" - } - }, - "postcss-normalize-repeat-style": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/postcss-normalize-repeat-style/-/postcss-normalize-repeat-style-5.1.1.tgz", - "integrity": "sha512-mFpLspGWkQtBcWIRFLmewo8aC3ImN2i/J3v8YCFUwDnPu3Xz4rLohDO26lGjwNsQxB3YF0KKRwspGzE2JEuS0g==", - "requires": { - "postcss-value-parser": "^4.2.0" - } - }, - "postcss-normalize-string": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/postcss-normalize-string/-/postcss-normalize-string-5.1.0.tgz", - "integrity": "sha512-oYiIJOf4T9T1N4i+abeIc7Vgm/xPCGih4bZz5Nm0/ARVJ7K6xrDlLwvwqOydvyL3RHNf8qZk6vo3aatiw/go3w==", - "requires": { - "postcss-value-parser": "^4.2.0" - } - }, - "postcss-normalize-timing-functions": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/postcss-normalize-timing-functions/-/postcss-normalize-timing-functions-5.1.0.tgz", - "integrity": "sha512-DOEkzJ4SAXv5xkHl0Wa9cZLF3WCBhF3o1SKVxKQAa+0pYKlueTpCgvkFAHfk+Y64ezX9+nITGrDZeVGgITJXjg==", - "requires": { - "postcss-value-parser": "^4.2.0" - } - }, - "postcss-normalize-unicode": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/postcss-normalize-unicode/-/postcss-normalize-unicode-5.1.0.tgz", - "integrity": "sha512-J6M3MizAAZ2dOdSjy2caayJLQT8E8K9XjLce8AUQMwOrCvjCHv24aLC/Lps1R1ylOfol5VIDMaM/Lo9NGlk1SQ==", - "requires": { - "browserslist": "^4.16.6", - "postcss-value-parser": "^4.2.0" - } - }, - "postcss-normalize-url": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/postcss-normalize-url/-/postcss-normalize-url-5.1.0.tgz", - "integrity": "sha512-5upGeDO+PVthOxSmds43ZeMeZfKH+/DKgGRD7TElkkyS46JXAUhMzIKiCa7BabPeIy3AQcTkXwVVN7DbqsiCew==", - "requires": { - "normalize-url": "^6.0.1", - "postcss-value-parser": "^4.2.0" - } - }, - "postcss-normalize-whitespace": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/postcss-normalize-whitespace/-/postcss-normalize-whitespace-5.1.1.tgz", - "integrity": "sha512-83ZJ4t3NUDETIHTa3uEg6asWjSBYL5EdkVB0sDncx9ERzOKBVJIUeDO9RyA9Zwtig8El1d79HBp0JEi8wvGQnA==", - "requires": { - "postcss-value-parser": "^4.2.0" - } - }, - "postcss-opacity-percentage": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/postcss-opacity-percentage/-/postcss-opacity-percentage-1.1.2.tgz", - "integrity": "sha512-lyUfF7miG+yewZ8EAk9XUBIlrHyUE6fijnesuz+Mj5zrIHIEw6KcIZSOk/elVMqzLvREmXB83Zi/5QpNRYd47w==" - }, - "postcss-ordered-values": { - "version": "5.1.3", - "resolved": "https://registry.npmjs.org/postcss-ordered-values/-/postcss-ordered-values-5.1.3.tgz", - "integrity": "sha512-9UO79VUhPwEkzbb3RNpqqghc6lcYej1aveQteWY+4POIwlqkYE21HKWaLDF6lWNuqCobEAyTovVhtI32Rbv2RQ==", - "requires": { - "cssnano-utils": "^3.1.0", - "postcss-value-parser": "^4.2.0" - } - }, - "postcss-overflow-shorthand": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/postcss-overflow-shorthand/-/postcss-overflow-shorthand-3.0.4.tgz", - "integrity": "sha512-otYl/ylHK8Y9bcBnPLo3foYFLL6a6Ak+3EQBPOTR7luMYCOsiVTUk1iLvNf6tVPNGXcoL9Hoz37kpfriRIFb4A==", - "requires": { - "postcss-value-parser": "^4.2.0" - } - }, - "postcss-page-break": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/postcss-page-break/-/postcss-page-break-3.0.4.tgz", - "integrity": "sha512-1JGu8oCjVXLa9q9rFTo4MbeeA5FMe00/9C7lN4va606Rdb+HkxXtXsmEDrIraQ11fGz/WvKWa8gMuCKkrXpTsQ==", - "requires": {} - }, - "postcss-place": { - "version": "7.0.5", - "resolved": "https://registry.npmjs.org/postcss-place/-/postcss-place-7.0.5.tgz", - "integrity": "sha512-wR8igaZROA6Z4pv0d+bvVrvGY4GVHihBCBQieXFY3kuSuMyOmEnnfFzHl/tQuqHZkfkIVBEbDvYcFfHmpSet9g==", - "requires": { - "postcss-value-parser": "^4.2.0" - } - }, - "postcss-preset-env": { - "version": "7.7.2", - "resolved": "https://registry.npmjs.org/postcss-preset-env/-/postcss-preset-env-7.7.2.tgz", - "integrity": "sha512-1q0ih7EDsZmCb/FMDRvosna7Gsbdx8CvYO5hYT120hcp2ZAuOHpSzibujZ4JpIUcAC02PG6b+eftxqjTFh5BNA==", - "requires": { - "@csstools/postcss-cascade-layers": "^1.0.4", - "@csstools/postcss-color-function": "^1.1.0", - "@csstools/postcss-font-format-keywords": "^1.0.0", - "@csstools/postcss-hwb-function": "^1.0.1", - "@csstools/postcss-ic-unit": "^1.0.0", - "@csstools/postcss-is-pseudo-class": "^2.0.6", - "@csstools/postcss-normalize-display-values": "^1.0.0", - "@csstools/postcss-oklab-function": "^1.1.0", - "@csstools/postcss-progressive-custom-properties": "^1.3.0", - "@csstools/postcss-stepped-value-functions": "^1.0.0", - "@csstools/postcss-trigonometric-functions": "^1.0.1", - "@csstools/postcss-unset-value": "^1.0.1", - "autoprefixer": "^10.4.7", - "browserslist": "^4.21.0", - "css-blank-pseudo": "^3.0.3", - "css-has-pseudo": "^3.0.4", - "css-prefers-color-scheme": "^6.0.3", - "cssdb": "^6.6.3", - "postcss-attribute-case-insensitive": "^5.0.1", - "postcss-clamp": "^4.1.0", - "postcss-color-functional-notation": "^4.2.3", - "postcss-color-hex-alpha": "^8.0.4", - "postcss-color-rebeccapurple": "^7.1.0", - "postcss-custom-media": "^8.0.2", - "postcss-custom-properties": "^12.1.8", - "postcss-custom-selectors": "^6.0.3", - "postcss-dir-pseudo-class": "^6.0.4", - "postcss-double-position-gradients": "^3.1.1", - "postcss-env-function": "^4.0.6", - "postcss-focus-visible": "^6.0.4", - "postcss-focus-within": "^5.0.4", - "postcss-font-variant": "^5.0.0", - "postcss-gap-properties": "^3.0.3", - "postcss-image-set-function": "^4.0.6", - "postcss-initial": "^4.0.1", - "postcss-lab-function": "^4.2.0", - "postcss-logical": "^5.0.4", - "postcss-media-minmax": "^5.0.0", - "postcss-nesting": "^10.1.9", - "postcss-opacity-percentage": "^1.1.2", - "postcss-overflow-shorthand": "^3.0.3", - "postcss-page-break": "^3.0.4", - "postcss-place": "^7.0.4", - "postcss-pseudo-class-any-link": "^7.1.5", - "postcss-replace-overflow-wrap": "^4.0.0", - "postcss-selector-not": "^6.0.0", - "postcss-value-parser": "^4.2.0" - } - }, - "postcss-pseudo-class-any-link": { - "version": "7.1.6", - "resolved": "https://registry.npmjs.org/postcss-pseudo-class-any-link/-/postcss-pseudo-class-any-link-7.1.6.tgz", - "integrity": "sha512-9sCtZkO6f/5ML9WcTLcIyV1yz9D1rf0tWc+ulKcvV30s0iZKS/ONyETvoWsr6vnrmW+X+KmuK3gV/w5EWnT37w==", - "requires": { - "postcss-selector-parser": "^6.0.10" - } - }, - "postcss-reduce-initial": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/postcss-reduce-initial/-/postcss-reduce-initial-5.1.0.tgz", - "integrity": "sha512-5OgTUviz0aeH6MtBjHfbr57tml13PuedK/Ecg8szzd4XRMbYxH4572JFG067z+FqBIf6Zp/d+0581glkvvWMFw==", - "requires": { - "browserslist": "^4.16.6", - "caniuse-api": "^3.0.0" - } - }, - "postcss-reduce-transforms": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/postcss-reduce-transforms/-/postcss-reduce-transforms-5.1.0.tgz", - "integrity": "sha512-2fbdbmgir5AvpW9RLtdONx1QoYG2/EtqpNQbFASDlixBbAYuTcJ0dECwlqNqH7VbaUnEnh8SrxOe2sRIn24XyQ==", - "requires": { - "postcss-value-parser": "^4.2.0" - } - }, - "postcss-replace-overflow-wrap": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/postcss-replace-overflow-wrap/-/postcss-replace-overflow-wrap-4.0.0.tgz", - "integrity": "sha512-KmF7SBPphT4gPPcKZc7aDkweHiKEEO8cla/GjcBK+ckKxiZslIu3C4GCRW3DNfL0o7yW7kMQu9xlZ1kXRXLXtw==", - "requires": {} - }, - "postcss-selector-not": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/postcss-selector-not/-/postcss-selector-not-6.0.1.tgz", - "integrity": "sha512-1i9affjAe9xu/y9uqWH+tD4r6/hDaXJruk8xn2x1vzxC2U3J3LKO3zJW4CyxlNhA56pADJ/djpEwpH1RClI2rQ==", - "requires": { - "postcss-selector-parser": "^6.0.10" - } - }, - "postcss-selector-parser": { - "version": "6.0.10", - "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-6.0.10.tgz", - "integrity": "sha512-IQ7TZdoaqbT+LCpShg46jnZVlhWD2w6iQYAcYXfHARZ7X1t/UGhhceQDs5X0cGqKvYlHNOuv7Oa1xmb0oQuA3w==", - "requires": { - "cssesc": "^3.0.0", - "util-deprecate": "^1.0.2" - } - }, - "postcss-svgo": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/postcss-svgo/-/postcss-svgo-5.1.0.tgz", - "integrity": "sha512-D75KsH1zm5ZrHyxPakAxJWtkyXew5qwS70v56exwvw542d9CRtTo78K0WeFxZB4G7JXKKMbEZtZayTGdIky/eA==", - "requires": { - "postcss-value-parser": "^4.2.0", - "svgo": "^2.7.0" - }, - "dependencies": { - "commander": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/commander/-/commander-7.2.0.tgz", - "integrity": "sha512-QrWXB+ZQSVPmIWIhtEO9H+gwHaMGYiF5ChvoJ+K9ZGHG/sVsa6yiesAD1GC/x46sET00Xlwo1u49RVVVzvcSkw==" - }, - "css-tree": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/css-tree/-/css-tree-1.1.3.tgz", - "integrity": "sha512-tRpdppF7TRazZrjJ6v3stzv93qxRcSsFmW6cX0Zm2NVKpxE1WV1HblnghVv9TreireHkqI/VDEsfolRF1p6y7Q==", - "requires": { - "mdn-data": "2.0.14", - "source-map": "^0.6.1" - } - }, - "mdn-data": { - "version": "2.0.14", - "resolved": "https://registry.npmjs.org/mdn-data/-/mdn-data-2.0.14.tgz", - "integrity": "sha512-dn6wd0uw5GsdswPFfsgMp5NSB0/aDe6fK94YJV/AJDYXL6HVLWBsxeq7js7Ad+mU2K9LAlwpk6kN2D5mwCPVow==" - }, - "source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==" - }, - "svgo": { - "version": "2.8.0", - "resolved": "https://registry.npmjs.org/svgo/-/svgo-2.8.0.tgz", - "integrity": "sha512-+N/Q9kV1+F+UeWYoSiULYo4xYSDQlTgb+ayMobAXPwMnLvop7oxKMo9OzIrX5x3eS4L4f2UHhc9axXwY8DpChg==", - "requires": { - "@trysound/sax": "0.2.0", - "commander": "^7.2.0", - "css-select": "^4.1.3", - "css-tree": "^1.1.3", - "csso": "^4.2.0", - "picocolors": "^1.0.0", - "stable": "^0.1.8" - } - } - } - }, - "postcss-unique-selectors": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/postcss-unique-selectors/-/postcss-unique-selectors-5.1.1.tgz", - "integrity": "sha512-5JiODlELrz8L2HwxfPnhOWZYWDxVHWL83ufOv84NrcgipI7TaeRsatAhK4Tr2/ZiYldpK/wBvw5BD3qfaK96GA==", - "requires": { - "postcss-selector-parser": "^6.0.5" - } - }, - "postcss-value-parser": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-4.2.0.tgz", - "integrity": "sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ==" - }, - "prelude-ls": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.2.1.tgz", - "integrity": "sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==" - }, - "pretty-bytes": { - "version": "5.6.0", - "resolved": "https://registry.npmjs.org/pretty-bytes/-/pretty-bytes-5.6.0.tgz", - "integrity": "sha512-FFw039TmrBqFK8ma/7OL3sDz/VytdtJr044/QUJtH0wK9lb9jLq9tJyIxUwtQJHwar2BqtiA4iCWSwo9JLkzFg==" - }, - "pretty-error": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/pretty-error/-/pretty-error-4.0.0.tgz", - "integrity": "sha512-AoJ5YMAcXKYxKhuJGdcvse+Voc6v1RgnsR3nWcYU7q4t6z0Q6T86sv5Zq8VIRbOWWFpvdGE83LtdSMNd+6Y0xw==", - "requires": { - "lodash": "^4.17.20", - "renderkid": "^3.0.0" - } - }, - "pretty-format": { - "version": "27.5.1", - "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-27.5.1.tgz", - "integrity": "sha512-Qb1gy5OrP5+zDf2Bvnzdl3jsTf1qXVMazbvCoKhtKqVs4/YK4ozX4gKQJJVyNe+cajNPn0KoC0MC3FUmaHWEmQ==", - "requires": { - "ansi-regex": "^5.0.1", - "ansi-styles": "^5.0.0", - "react-is": "^17.0.1" - }, - "dependencies": { - "ansi-styles": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-5.2.0.tgz", - "integrity": "sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==" - } - } - }, - "process-nextick-args": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz", - "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==" - }, - "promise": { - "version": "8.1.0", - "resolved": "https://registry.npmjs.org/promise/-/promise-8.1.0.tgz", - "integrity": "sha512-W04AqnILOL/sPRXziNicCjSNRruLAuIHEOVBazepu0545DDNGYHz7ar9ZgZ1fMU8/MA4mVxp5rkBWRi6OXIy3Q==", - "requires": { - "asap": "~2.0.6" - } - }, - "prompts": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/prompts/-/prompts-2.4.2.tgz", - "integrity": "sha512-NxNv/kLguCA7p3jE8oL2aEBsrJWgAakBpgmgK6lpPWV+WuOmY6r2/zbAVnP+T8bQlA0nzHXSJSJW0Hq7ylaD2Q==", - "requires": { - "kleur": "^3.0.3", - "sisteransi": "^1.0.5" - } - }, - "prop-types": { - "version": "15.8.1", - "resolved": "https://registry.npmjs.org/prop-types/-/prop-types-15.8.1.tgz", - "integrity": "sha512-oj87CgZICdulUohogVAR7AjlC0327U4el4L6eAvOqCeudMDVU0NThNaV+b9Df4dXgSP1gXMTnPdhfe/2qDH5cg==", - "requires": { - "loose-envify": "^1.4.0", - "object-assign": "^4.1.1", - "react-is": "^16.13.1" - }, - "dependencies": { - "react-is": { - "version": "16.13.1", - "resolved": "https://registry.npmjs.org/react-is/-/react-is-16.13.1.tgz", - "integrity": "sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==" - } - } - }, - "proxy-addr": { - "version": "2.0.7", - "resolved": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.7.tgz", - "integrity": "sha512-llQsMLSUDUPT44jdrU/O37qlnifitDP+ZwrmmZcoSKyLKvtZxpyV0n2/bD/N4tBAAZ/gJEdZU7KMraoK1+XYAg==", - "requires": { - "forwarded": "0.2.0", - "ipaddr.js": "1.9.1" - }, - "dependencies": { - "ipaddr.js": { - "version": "1.9.1", - "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.9.1.tgz", - "integrity": "sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g==" - } - } - }, - "psl": { - "version": "1.9.0", - "resolved": "https://registry.npmjs.org/psl/-/psl-1.9.0.tgz", - "integrity": "sha512-E/ZsdU4HLs/68gYzgGTkMicWTLPdAftJLfJFlLUAAKZGkStNU72sZjT66SnMDVOfOWY/YAoiD7Jxa9iHvngcag==" - }, - "punycode": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.1.1.tgz", - "integrity": "sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A==" - }, - "q": { - "version": "1.5.1", - "resolved": "https://registry.npmjs.org/q/-/q-1.5.1.tgz", - "integrity": "sha512-kV/CThkXo6xyFEZUugw/+pIOywXcDbFYgSct5cT3gqlbkBE1SJdwy6UQoZvodiWF/ckQLZyDE/Bu1M6gVu5lVw==" - }, - "qs": { - "version": "6.10.3", - "resolved": "https://registry.npmjs.org/qs/-/qs-6.10.3.tgz", - "integrity": "sha512-wr7M2E0OFRfIfJZjKGieI8lBKb7fRCH4Fv5KNPEs7gJ8jadvotdsS08PzOKR7opXhZ/Xkjtt3WF9g38drmyRqQ==", - "requires": { - "side-channel": "^1.0.4" - } - }, - "queue-microtask": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz", - "integrity": "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==" - }, - "quick-lru": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/quick-lru/-/quick-lru-5.1.1.tgz", - "integrity": "sha512-WuyALRjWPDGtt/wzJiadO5AXY+8hZ80hVpe6MyivgraREW751X3SbhRvG3eLKOYN+8VEvqLcf3wdnt44Z4S4SA==" - }, - "raf": { - "version": "3.4.1", - "resolved": "https://registry.npmjs.org/raf/-/raf-3.4.1.tgz", - "integrity": "sha512-Sq4CW4QhwOHE8ucn6J34MqtZCeWFP2aQSmrlroYgqAV1PjStIhJXxYuTgUIfkEk7zTLjmIjLmU5q+fbD1NnOJA==", - "requires": { - "performance-now": "^2.1.0" - } - }, - "randombytes": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/randombytes/-/randombytes-2.1.0.tgz", - "integrity": "sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ==", - "requires": { - "safe-buffer": "^5.1.0" - } - }, - "range-parser": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.1.tgz", - "integrity": "sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==" - }, - "raw-body": { - "version": "2.5.1", - "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.5.1.tgz", - "integrity": "sha512-qqJBtEyVgS0ZmPGdCFPWJ3FreoqvG4MVQln/kCgF7Olq95IbOp0/BWyMwbdtn4VTvkM8Y7khCQ2Xgk/tcrCXig==", - "requires": { - "bytes": "3.1.2", - "http-errors": "2.0.0", - "iconv-lite": "0.4.24", - "unpipe": "1.0.0" - }, - "dependencies": { - "bytes": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.2.tgz", - "integrity": "sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==" - }, - "iconv-lite": { - "version": "0.4.24", - "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", - "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", - "requires": { - "safer-buffer": ">= 2.1.2 < 3" - } - } - } - }, - "react": { - "version": "18.2.0", - "resolved": "https://registry.npmjs.org/react/-/react-18.2.0.tgz", - "integrity": "sha512-/3IjMdb2L9QbBdWiW5e3P2/npwMBaU9mHCSCUzNln0ZCYbcfTsGbTJrU/kGemdH2IWmB2ioZ+zkxtmq6g09fGQ==", - "requires": { - "loose-envify": "^1.1.0" - } - }, - "react-app-polyfill": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/react-app-polyfill/-/react-app-polyfill-3.0.0.tgz", - "integrity": "sha512-sZ41cxiU5llIB003yxxQBYrARBqe0repqPTTYBTmMqTz9szeBbE37BehCE891NZsmdZqqP+xWKdT3eo3vOzN8w==", - "requires": { - "core-js": "^3.19.2", - "object-assign": "^4.1.1", - "promise": "^8.1.0", - "raf": "^3.4.1", - "regenerator-runtime": "^0.13.9", - "whatwg-fetch": "^3.6.2" - } - }, - "react-dev-utils": { - "version": "12.0.1", - "resolved": "https://registry.npmjs.org/react-dev-utils/-/react-dev-utils-12.0.1.tgz", - "integrity": "sha512-84Ivxmr17KjUupyqzFode6xKhjwuEJDROWKJy/BthkL7Wn6NJ8h4WE6k/exAv6ImS+0oZLRRW5j/aINMHyeGeQ==", - "requires": { - "@babel/code-frame": "^7.16.0", - "address": "^1.1.2", - "browserslist": "^4.18.1", - "chalk": "^4.1.2", - "cross-spawn": "^7.0.3", - "detect-port-alt": "^1.1.6", - "escape-string-regexp": "^4.0.0", - "filesize": "^8.0.6", - "find-up": "^5.0.0", - "fork-ts-checker-webpack-plugin": "^6.5.0", - "global-modules": "^2.0.0", - "globby": "^11.0.4", - "gzip-size": "^6.0.0", - "immer": "^9.0.7", - "is-root": "^2.1.0", - "loader-utils": "^3.2.0", - "open": "^8.4.0", - "pkg-up": "^3.1.0", - "prompts": "^2.4.2", - "react-error-overlay": "^6.0.11", - "recursive-readdir": "^2.2.2", - "shell-quote": "^1.7.3", - "strip-ansi": "^6.0.1", - "text-table": "^0.2.0" - }, - "dependencies": { - "ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "requires": { - "color-convert": "^2.0.1" - } - }, - "chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", - "requires": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - } - }, - "color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "requires": { - "color-name": "~1.1.4" - } - }, - "color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" - }, - "escape-string-regexp": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz", - "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==" - }, - "has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==" - }, - "loader-utils": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-3.2.0.tgz", - "integrity": "sha512-HVl9ZqccQihZ7JM85dco1MvO9G+ONvxoGa9rkhzFsneGLKSUg1gJf9bWzhRhcvm2qChhWpebQhP44qxjKIUCaQ==" - }, - "supports-color": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", - "requires": { - "has-flag": "^4.0.0" - } - } - } - }, - "react-dom": { - "version": "18.2.0", - "resolved": "https://registry.npmjs.org/react-dom/-/react-dom-18.2.0.tgz", - "integrity": "sha512-6IMTriUmvsjHUjNtEDudZfuDQUoWXVxKHhlEGSk81n4YFS+r/Kl99wXiwlVXtPBtJenozv2P+hxDsw9eA7Xo6g==", - "requires": { - "loose-envify": "^1.1.0", - "scheduler": "^0.23.0" - } - }, - "react-error-overlay": { - "version": "6.0.11", - "resolved": "https://registry.npmjs.org/react-error-overlay/-/react-error-overlay-6.0.11.tgz", - "integrity": "sha512-/6UZ2qgEyH2aqzYZgQPxEnz33NJ2gNsnHA2o5+o4wW9bLM/JYQitNP9xPhsXwC08hMMovfGe/8retsdDsczPRg==" - }, - "react-is": { - "version": "17.0.2", - "resolved": "https://registry.npmjs.org/react-is/-/react-is-17.0.2.tgz", - "integrity": "sha512-w2GsyukL62IJnlaff/nRegPQR94C/XXamvMWmSHRJ4y7Ts/4ocGRmTHvOs8PSE6pB3dWOrD/nueuU5sduBsQ4w==" - }, - "react-refresh": { - "version": "0.11.0", - "resolved": "https://registry.npmjs.org/react-refresh/-/react-refresh-0.11.0.tgz", - "integrity": "sha512-F27qZr8uUqwhWZboondsPx8tnC3Ct3SxZA3V5WyEvujRyyNv0VYPhoBg1gZ8/MV5tubQp76Trw8lTv9hzRBa+A==" - }, - "react-scripts": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/react-scripts/-/react-scripts-5.0.1.tgz", - "integrity": "sha512-8VAmEm/ZAwQzJ+GOMLbBsTdDKOpuZh7RPs0UymvBR2vRk4iZWCskjbFnxqjrzoIvlNNRZ3QJFx6/qDSi6zSnaQ==", - "requires": { - "@babel/core": "^7.16.0", - "@pmmmwh/react-refresh-webpack-plugin": "^0.5.3", - "@svgr/webpack": "^5.5.0", - "babel-jest": "^27.4.2", - "babel-loader": "^8.2.3", - "babel-plugin-named-asset-import": "^0.3.8", - "babel-preset-react-app": "^10.0.1", - "bfj": "^7.0.2", - "browserslist": "^4.18.1", - "camelcase": "^6.2.1", - "case-sensitive-paths-webpack-plugin": "^2.4.0", - "css-loader": "^6.5.1", - "css-minimizer-webpack-plugin": "^3.2.0", - "dotenv": "^10.0.0", - "dotenv-expand": "^5.1.0", - "eslint": "^8.3.0", - "eslint-config-react-app": "^7.0.1", - "eslint-webpack-plugin": "^3.1.1", - "file-loader": "^6.2.0", - "fs-extra": "^10.0.0", - "fsevents": "^2.3.2", - "html-webpack-plugin": "^5.5.0", - "identity-obj-proxy": "^3.0.0", - "jest": "^27.4.3", - "jest-resolve": "^27.4.2", - "jest-watch-typeahead": "^1.0.0", - "mini-css-extract-plugin": "^2.4.5", - "postcss": "^8.4.4", - "postcss-flexbugs-fixes": "^5.0.2", - "postcss-loader": "^6.2.1", - "postcss-normalize": "^10.0.1", - "postcss-preset-env": "^7.0.1", - "prompts": "^2.4.2", - "react-app-polyfill": "^3.0.0", - "react-dev-utils": "^12.0.1", - "react-refresh": "^0.11.0", - "resolve": "^1.20.0", - "resolve-url-loader": "^4.0.0", - "sass-loader": "^12.3.0", - "semver": "^7.3.5", - "source-map-loader": "^3.0.0", - "style-loader": "^3.3.1", - "tailwindcss": "^3.0.2", - "terser-webpack-plugin": "^5.2.5", - "webpack": "^5.64.4", - "webpack-dev-server": "^4.6.0", - "webpack-manifest-plugin": "^4.0.2", - "workbox-webpack-plugin": "^6.4.1" - } - }, - "read-cache": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/read-cache/-/read-cache-1.0.0.tgz", - "integrity": "sha512-Owdv/Ft7IjOgm/i0xvNDZ1LrRANRfew4b2prF3OWMQLxLfu3bS8FVhCsrSCMK4lR56Y9ya+AThoTpDCTxCmpRA==", - "requires": { - "pify": "^2.3.0" - } - }, - "readable-stream": { - "version": "3.6.0", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.0.tgz", - "integrity": "sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA==", - "requires": { - "inherits": "^2.0.3", - "string_decoder": "^1.1.1", - "util-deprecate": "^1.0.1" - } - }, - "readdirp": { - "version": "3.6.0", - "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz", - "integrity": "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==", - "requires": { - "picomatch": "^2.2.1" - } - }, - "recursive-readdir": { - "version": "2.2.2", - "resolved": "https://registry.npmjs.org/recursive-readdir/-/recursive-readdir-2.2.2.tgz", - "integrity": "sha512-nRCcW9Sj7NuZwa2XvH9co8NPeXUBhZP7CRKJtU+cS6PW9FpCIFoI5ib0NT1ZrbNuPoRy0ylyCaUL8Gih4LSyFg==", - "requires": { - "minimatch": "3.0.4" - }, - "dependencies": { - "minimatch": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz", - "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==", - "requires": { - "brace-expansion": "^1.1.7" - } - } - } - }, - "redent": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/redent/-/redent-3.0.0.tgz", - "integrity": "sha512-6tDA8g98We0zd0GvVeMT9arEOnTw9qM03L9cJXaCjrip1OO764RDBLBfrB4cwzNGDj5OA5ioymC9GkizgWJDUg==", - "requires": { - "indent-string": "^4.0.0", - "strip-indent": "^3.0.0" - } - }, - "regenerate": { - "version": "1.4.2", - "resolved": "https://registry.npmjs.org/regenerate/-/regenerate-1.4.2.tgz", - "integrity": "sha512-zrceR/XhGYU/d/opr2EKO7aRHUeiBI8qjtfHqADTwZd6Szfy16la6kqD0MIUs5z5hx6AaKa+PixpPrR289+I0A==" - }, - "regenerate-unicode-properties": { - "version": "10.0.1", - "resolved": "https://registry.npmjs.org/regenerate-unicode-properties/-/regenerate-unicode-properties-10.0.1.tgz", - "integrity": "sha512-vn5DU6yg6h8hP/2OkQo3K7uVILvY4iu0oI4t3HFa81UPkhGJwkRwM10JEc3upjdhHjs/k8GJY1sRBhk5sr69Bw==", - "requires": { - "regenerate": "^1.4.2" - } - }, - "regenerator-runtime": { - "version": "0.13.9", - "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.13.9.tgz", - "integrity": "sha512-p3VT+cOEgxFsRRA9X4lkI1E+k2/CtnKtU4gcxyaCUreilL/vqI6CdZ3wxVUx3UOUg+gnUOQQcRI7BmSI656MYA==" - }, - "regenerator-transform": { - "version": "0.15.0", - "resolved": "https://registry.npmjs.org/regenerator-transform/-/regenerator-transform-0.15.0.tgz", - "integrity": "sha512-LsrGtPmbYg19bcPHwdtmXwbW+TqNvtY4riE3P83foeHRroMbH6/2ddFBfab3t7kbzc7v7p4wbkIecHImqt0QNg==", - "requires": { - "@babel/runtime": "^7.8.4" - } - }, - "regex-parser": { - "version": "2.2.11", - "resolved": "https://registry.npmjs.org/regex-parser/-/regex-parser-2.2.11.tgz", - "integrity": "sha512-jbD/FT0+9MBU2XAZluI7w2OBs1RBi6p9M83nkoZayQXXU9e8Robt69FcZc7wU4eJD/YFTjn1JdCk3rbMJajz8Q==" - }, - "regexp.prototype.flags": { - "version": "1.4.3", - "resolved": "https://registry.npmjs.org/regexp.prototype.flags/-/regexp.prototype.flags-1.4.3.tgz", - "integrity": "sha512-fjggEOO3slI6Wvgjwflkc4NFRCTZAu5CnNfBd5qOMYhWdn67nJBBu34/TkD++eeFmd8C9r9jfXJ27+nSiRkSUA==", - "requires": { - "call-bind": "^1.0.2", - "define-properties": "^1.1.3", - "functions-have-names": "^1.2.2" - } - }, - "regexpp": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/regexpp/-/regexpp-3.2.0.tgz", - "integrity": "sha512-pq2bWo9mVD43nbts2wGv17XLiNLya+GklZ8kaDLV2Z08gDCsGpnKn9BFMepvWuHCbyVvY7J5o5+BVvoQbmlJLg==" - }, - "regexpu-core": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/regexpu-core/-/regexpu-core-5.1.0.tgz", - "integrity": "sha512-bb6hk+xWd2PEOkj5It46A16zFMs2mv86Iwpdu94la4S3sJ7C973h2dHpYKwIBGaWSO7cIRJ+UX0IeMaWcO4qwA==", - "requires": { - "regenerate": "^1.4.2", - "regenerate-unicode-properties": "^10.0.1", - "regjsgen": "^0.6.0", - "regjsparser": "^0.8.2", - "unicode-match-property-ecmascript": "^2.0.0", - "unicode-match-property-value-ecmascript": "^2.0.0" - } - }, - "regjsgen": { - "version": "0.6.0", - "resolved": "https://registry.npmjs.org/regjsgen/-/regjsgen-0.6.0.tgz", - "integrity": "sha512-ozE883Uigtqj3bx7OhL1KNbCzGyW2NQZPl6Hs09WTvCuZD5sTI4JY58bkbQWa/Y9hxIsvJ3M8Nbf7j54IqeZbA==" - }, - "regjsparser": { - "version": "0.8.4", - "resolved": "https://registry.npmjs.org/regjsparser/-/regjsparser-0.8.4.tgz", - "integrity": "sha512-J3LABycON/VNEu3abOviqGHuB/LOtOQj8SKmfP9anY5GfAVw/SPjwzSjxGjbZXIxbGfqTHtJw58C2Li/WkStmA==", - "requires": { - "jsesc": "~0.5.0" - }, - "dependencies": { - "jsesc": { - "version": "0.5.0", - "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-0.5.0.tgz", - "integrity": "sha512-uZz5UnB7u4T9LvwmFqXii7pZSouaRPorGs5who1Ip7VO0wxanFvBL7GkM6dTHlgX+jhBApRetaWpnDabOeTcnA==" - } - } - }, - "relateurl": { - "version": "0.2.7", - "resolved": "https://registry.npmjs.org/relateurl/-/relateurl-0.2.7.tgz", - "integrity": "sha512-G08Dxvm4iDN3MLM0EsP62EDV9IuhXPR6blNz6Utcp7zyV3tr4HVNINt6MpaRWbxoOHT3Q7YN2P+jaHX8vUbgog==" - }, - "renderkid": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/renderkid/-/renderkid-3.0.0.tgz", - "integrity": "sha512-q/7VIQA8lmM1hF+jn+sFSPWGlMkSAeNYcPLmDQx2zzuiDfaLrOmumR8iaUKlenFgh0XRPIUeSPlH3A+AW3Z5pg==", - "requires": { - "css-select": "^4.1.3", - "dom-converter": "^0.2.0", - "htmlparser2": "^6.1.0", - "lodash": "^4.17.21", - "strip-ansi": "^6.0.1" - } - }, - "require-directory": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", - "integrity": "sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==" - }, - "require-from-string": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/require-from-string/-/require-from-string-2.0.2.tgz", - "integrity": "sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==" - }, - "requires-port": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/requires-port/-/requires-port-1.0.0.tgz", - "integrity": "sha512-KigOCHcocU3XODJxsu8i/j8T9tzT4adHiecwORRQ0ZZFcp7ahwXuRU1m+yuO90C5ZUyGeGfocHDI14M3L3yDAQ==" - }, - "resolve": { - "version": "1.22.1", - "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.1.tgz", - "integrity": "sha512-nBpuuYuY5jFsli/JIs1oldw6fOQCBioohqWZg/2hiaOybXOft4lonv85uDOKXdf8rhyK159cxU5cDcK/NKk8zw==", - "requires": { - "is-core-module": "^2.9.0", - "path-parse": "^1.0.7", - "supports-preserve-symlinks-flag": "^1.0.0" - } - }, - "resolve-cwd": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/resolve-cwd/-/resolve-cwd-3.0.0.tgz", - "integrity": "sha512-OrZaX2Mb+rJCpH/6CpSqt9xFVpN++x01XnN2ie9g6P5/3xelLAkXWVADpdz1IHD/KFfEXyE6V0U01OQ3UO2rEg==", - "requires": { - "resolve-from": "^5.0.0" - } - }, - "resolve-from": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz", - "integrity": "sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==" - }, - "resolve-url-loader": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/resolve-url-loader/-/resolve-url-loader-4.0.0.tgz", - "integrity": "sha512-05VEMczVREcbtT7Bz+C+96eUO5HDNvdthIiMB34t7FcF8ehcu4wC0sSgPUubs3XW2Q3CNLJk/BJrCU9wVRymiA==", - "requires": { - "adjust-sourcemap-loader": "^4.0.0", - "convert-source-map": "^1.7.0", - "loader-utils": "^2.0.0", - "postcss": "^7.0.35", - "source-map": "0.6.1" - }, - "dependencies": { - "picocolors": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-0.2.1.tgz", - "integrity": "sha512-cMlDqaLEqfSaW8Z7N5Jw+lyIW869EzT73/F5lhtY9cLGoVxSXznfgfXMO0Z5K0o0Q2TkTXq+0KFsdnSe3jDViA==" - }, - "postcss": { - "version": "7.0.39", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.39.tgz", - "integrity": "sha512-yioayjNbHn6z1/Bywyb2Y4s3yvDAeXGOyxqD+LnVOinq6Mdmd++SW2wUNVzavyyHxd6+DxzWGIuosg6P1Rj8uA==", - "requires": { - "picocolors": "^0.2.1", - "source-map": "^0.6.1" - } - }, - "source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==" - } - } - }, - "resolve.exports": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/resolve.exports/-/resolve.exports-1.1.0.tgz", - "integrity": "sha512-J1l+Zxxp4XK3LUDZ9m60LRJF/mAe4z6a4xyabPHk7pvK5t35dACV32iIjJDFeWZFfZlO29w6SZ67knR0tHzJtQ==" - }, - "retry": { - "version": "0.13.1", - "resolved": "https://registry.npmjs.org/retry/-/retry-0.13.1.tgz", - "integrity": "sha512-XQBQ3I8W1Cge0Seh+6gjj03LbmRFWuoszgK9ooCpwYIrhhoO80pfq4cUkU5DkknwfOfFteRwlZ56PYOGYyFWdg==" - }, - "reusify": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.0.4.tgz", - "integrity": "sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==" - }, - "rimraf": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", - "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", - "requires": { - "glob": "^7.1.3" - } - }, - "rollup": { - "version": "2.76.0", - "resolved": "https://registry.npmjs.org/rollup/-/rollup-2.76.0.tgz", - "integrity": "sha512-9jwRIEY1jOzKLj3nsY/yot41r19ITdQrhs+q3ggNWhr9TQgduHqANvPpS32RNpzGklJu3G1AJfvlZLi/6wFgWA==", - "requires": { - "fsevents": "~2.3.2" - } - }, - "rollup-plugin-terser": { - "version": "7.0.2", - "resolved": "https://registry.npmjs.org/rollup-plugin-terser/-/rollup-plugin-terser-7.0.2.tgz", - "integrity": "sha512-w3iIaU4OxcF52UUXiZNsNeuXIMDvFrr+ZXK6bFZ0Q60qyVfq4uLptoS4bbq3paG3x216eQllFZX7zt6TIImguQ==", - "requires": { - "@babel/code-frame": "^7.10.4", - "jest-worker": "^26.2.1", - "serialize-javascript": "^4.0.0", - "terser": "^5.0.0" - }, - "dependencies": { - "has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==" - }, - "jest-worker": { - "version": "26.6.2", - "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-26.6.2.tgz", - "integrity": "sha512-KWYVV1c4i+jbMpaBC+U++4Va0cp8OisU185o73T1vo99hqi7w8tSJfUXYswwqqrjzwxa6KpRK54WhPvwf5w6PQ==", - "requires": { - "@types/node": "*", - "merge-stream": "^2.0.0", - "supports-color": "^7.0.0" - } - }, - "serialize-javascript": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-4.0.0.tgz", - "integrity": "sha512-GaNA54380uFefWghODBWEGisLZFj00nS5ACs6yHa9nLqlLpVLO8ChDGeKRjZnV4Nh4n0Qi7nhYZD/9fCPzEqkw==", - "requires": { - "randombytes": "^2.1.0" - } - }, - "supports-color": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", - "requires": { - "has-flag": "^4.0.0" - } - } - } - }, - "run-parallel": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz", - "integrity": "sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==", - "requires": { - "queue-microtask": "^1.2.2" - } - }, - "safe-buffer": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", - "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==" - }, - "safer-buffer": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", - "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==" - }, - "sanitize.css": { - "version": "13.0.0", - "resolved": "https://registry.npmjs.org/sanitize.css/-/sanitize.css-13.0.0.tgz", - "integrity": "sha512-ZRwKbh/eQ6w9vmTjkuG0Ioi3HBwPFce0O+v//ve+aOq1oeCy7jMV2qzzAlpsNuqpqCBjjriM1lbtZbF/Q8jVyA==" - }, - "sass-loader": { - "version": "12.6.0", - "resolved": "https://registry.npmjs.org/sass-loader/-/sass-loader-12.6.0.tgz", - "integrity": "sha512-oLTaH0YCtX4cfnJZxKSLAyglED0naiYfNG1iXfU5w1LNZ+ukoA5DtyDIN5zmKVZwYNJP4KRc5Y3hkWga+7tYfA==", - "requires": { - "klona": "^2.0.4", - "neo-async": "^2.6.2" - } - }, - "sax": { - "version": "1.2.4", - "resolved": "https://registry.npmjs.org/sax/-/sax-1.2.4.tgz", - "integrity": "sha512-NqVDv9TpANUjFm0N8uM5GxL36UgKi9/atZw+x7YFnQ8ckwFGKrl4xX4yWtrey3UJm5nP1kUbnYgLopqWNSRhWw==" - }, - "saxes": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/saxes/-/saxes-5.0.1.tgz", - "integrity": "sha512-5LBh1Tls8c9xgGjw3QrMwETmTMVk0oFgvrFSvWx62llR2hcEInrKNZ2GZCCuuy2lvWrdl5jhbpeqc5hRYKFOcw==", - "requires": { - "xmlchars": "^2.2.0" - } - }, - "scheduler": { - "version": "0.23.0", - "resolved": "https://registry.npmjs.org/scheduler/-/scheduler-0.23.0.tgz", - "integrity": "sha512-CtuThmgHNg7zIZWAXi3AsyIzA3n4xx7aNyjwC2VJldO2LMVDhFK+63xGqq6CsJH4rTAt6/M+N4GhZiDYPx9eUw==", - "requires": { - "loose-envify": "^1.1.0" - } - }, - "schema-utils": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-3.1.1.tgz", - "integrity": "sha512-Y5PQxS4ITlC+EahLuXaY86TXfR7Dc5lw294alXOq86JAHCihAIZfqv8nNCWvaEJvaC51uN9hbLGeV0cFBdH+Fw==", - "requires": { - "@types/json-schema": "^7.0.8", - "ajv": "^6.12.5", - "ajv-keywords": "^3.5.2" - } - }, - "select-hose": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/select-hose/-/select-hose-2.0.0.tgz", - "integrity": "sha512-mEugaLK+YfkijB4fx0e6kImuJdCIt2LxCRcbEYPqRGCs4F2ogyfZU5IAZRdjCP8JPq2AtdNoC/Dux63d9Kiryg==" - }, - "selfsigned": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/selfsigned/-/selfsigned-2.0.1.tgz", - "integrity": "sha512-LmME957M1zOsUhG+67rAjKfiWFox3SBxE/yymatMZsAx+oMrJ0YQ8AToOnyCm7xbeg2ep37IHLxdu0o2MavQOQ==", - "requires": { - "node-forge": "^1" - } - }, - "semver": { - "version": "7.3.7", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.7.tgz", - "integrity": "sha512-QlYTucUYOews+WeEujDoEGziz4K6c47V/Bd+LjSSYcA94p+DmINdf7ncaUinThfvZyu13lN9OY1XDxt8C0Tw0g==", - "requires": { - "lru-cache": "^6.0.0" - } - }, - "send": { - "version": "0.18.0", - "resolved": "https://registry.npmjs.org/send/-/send-0.18.0.tgz", - "integrity": "sha512-qqWzuOjSFOuqPjFe4NOsMLafToQQwBSOEpS+FwEt3A2V3vKubTquT3vmLTQpFgMXp8AlFWFuP1qKaJZOtPpVXg==", - "requires": { - "debug": "2.6.9", - "depd": "2.0.0", - "destroy": "1.2.0", - "encodeurl": "~1.0.2", - "escape-html": "~1.0.3", - "etag": "~1.8.1", - "fresh": "0.5.2", - "http-errors": "2.0.0", - "mime": "1.6.0", - "ms": "2.1.3", - "on-finished": "2.4.1", - "range-parser": "~1.2.1", - "statuses": "2.0.1" - }, - "dependencies": { - "debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", - "requires": { - "ms": "2.0.0" - }, - "dependencies": { - "ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==" - } - } - }, - "ms": { - "version": "2.1.3", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", - "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==" - } - } - }, - "serialize-javascript": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-6.0.0.tgz", - "integrity": "sha512-Qr3TosvguFt8ePWqsvRfrKyQXIiW+nGbYpy8XK24NQHE83caxWt+mIymTT19DGFbNWNLfEwsrkSmN64lVWB9ag==", - "requires": { - "randombytes": "^2.1.0" - } - }, - "serve-index": { - "version": "1.9.1", - "resolved": "https://registry.npmjs.org/serve-index/-/serve-index-1.9.1.tgz", - "integrity": "sha512-pXHfKNP4qujrtteMrSBb0rc8HJ9Ms/GrXwcUtUtD5s4ewDJI8bT3Cz2zTVRMKtri49pLx2e0Ya8ziP5Ya2pZZw==", - "requires": { - "accepts": "~1.3.4", - "batch": "0.6.1", - "debug": "2.6.9", - "escape-html": "~1.0.3", - "http-errors": "~1.6.2", - "mime-types": "~2.1.17", - "parseurl": "~1.3.2" - }, - "dependencies": { - "debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", - "requires": { - "ms": "2.0.0" - } - }, - "depd": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/depd/-/depd-1.1.2.tgz", - "integrity": "sha512-7emPTl6Dpo6JRXOXjLRxck+FlLRX5847cLKEn00PLAgc3g2hTZZgr+e4c2v6QpSmLeFP3n5yUo7ft6avBK/5jQ==" - }, - "http-errors": { - "version": "1.6.3", - "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.6.3.tgz", - "integrity": "sha512-lks+lVC8dgGyh97jxvxeYTWQFvh4uw4yC12gVl63Cg30sjPX4wuGcdkICVXDAESr6OJGjqGA8Iz5mkeN6zlD7A==", - "requires": { - "depd": "~1.1.2", - "inherits": "2.0.3", - "setprototypeof": "1.1.0", - "statuses": ">= 1.4.0 < 2" - } - }, - "inherits": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", - "integrity": "sha512-x00IRNXNy63jwGkJmzPigoySHbaqpNuzKbBOmzK+g2OdZpQ9w+sxCN+VSB3ja7IAge2OP2qpfxTjeNcyjmW1uw==" - }, - "ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==" - }, - "setprototypeof": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.1.0.tgz", - "integrity": "sha512-BvE/TwpZX4FXExxOxZyRGQQv651MSwmWKZGqvmPcRIjDqWub67kTKuIMx43cZZrS/cBBzwBcNDWoFxt2XEFIpQ==" - }, - "statuses": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.5.0.tgz", - "integrity": "sha512-OpZ3zP+jT1PI7I8nemJX4AKmAX070ZkYPVWV/AaKTJl+tXCTGyVdC1a4SL8RUQYEwk/f34ZX8UTykN68FwrqAA==" - } - } - }, - "serve-static": { - "version": "1.15.0", - "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.15.0.tgz", - "integrity": "sha512-XGuRDNjXUijsUL0vl6nSD7cwURuzEgglbOaFuZM9g3kwDXOWVTck0jLzjPzGD+TazWbboZYu52/9/XPdUgne9g==", - "requires": { - "encodeurl": "~1.0.2", - "escape-html": "~1.0.3", - "parseurl": "~1.3.3", - "send": "0.18.0" - } - }, - "setprototypeof": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.2.0.tgz", - "integrity": "sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==" - }, - "shebang-command": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", - "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", - "requires": { - "shebang-regex": "^3.0.0" - } - }, - "shebang-regex": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", - "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==" - }, - "shell-quote": { - "version": "1.7.3", - "resolved": "https://registry.npmjs.org/shell-quote/-/shell-quote-1.7.3.tgz", - "integrity": "sha512-Vpfqwm4EnqGdlsBFNmHhxhElJYrdfcxPThu+ryKS5J8L/fhAwLazFZtq+S+TWZ9ANj2piSQLGj6NQg+lKPmxrw==" - }, - "side-channel": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.0.4.tgz", - "integrity": "sha512-q5XPytqFEIKHkGdiMIrY10mvLRvnQh42/+GoBlFW3b2LXLE2xxJpZFdm94we0BaoV3RwJyGqg5wS7epxTv0Zvw==", - "requires": { - "call-bind": "^1.0.0", - "get-intrinsic": "^1.0.2", - "object-inspect": "^1.9.0" - } - }, - "signal-exit": { - "version": "3.0.7", - "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz", - "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==" - }, - "sisteransi": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/sisteransi/-/sisteransi-1.0.5.tgz", - "integrity": "sha512-bLGGlR1QxBcynn2d5YmDX4MGjlZvy2MRBDRNHLJ8VI6l6+9FUiyTFNJ0IveOSP0bcXgVDPRcfGqA0pjaqUpfVg==" - }, - "slash": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", - "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==" - }, - "sockjs": { - "version": "0.3.24", - "resolved": "https://registry.npmjs.org/sockjs/-/sockjs-0.3.24.tgz", - "integrity": "sha512-GJgLTZ7vYb/JtPSSZ10hsOYIvEYsjbNU+zPdIHcUaWVNUEPivzxku31865sSSud0Da0W4lEeOPlmw93zLQchuQ==", - "requires": { - "faye-websocket": "^0.11.3", - "uuid": "^8.3.2", - "websocket-driver": "^0.7.4" - } - }, - "source-list-map": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/source-list-map/-/source-list-map-2.0.1.tgz", - "integrity": "sha512-qnQ7gVMxGNxsiL4lEuJwe/To8UnK7fAnmbGEEH8RpLouuKbeEm0lhbQVFIrNSuB+G7tVrAlVsZgETT5nljf+Iw==" - }, - "source-map": { - "version": "0.7.4", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.7.4.tgz", - "integrity": "sha512-l3BikUxvPOcn5E74dZiq5BGsTb5yEwhaTSzccU6t4sDOH8NWJCstKO5QT2CvtFoK6F0saL7p9xHAqHOlCPJygA==" - }, - "source-map-js": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.0.2.tgz", - "integrity": "sha512-R0XvVJ9WusLiqTCEiGCmICCMplcCkIwwR11mOSD9CR5u+IXYdiseeEuXCVAjS54zqwkLcPNnmU4OeJ6tUrWhDw==" - }, - "source-map-loader": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/source-map-loader/-/source-map-loader-3.0.1.tgz", - "integrity": "sha512-Vp1UsfyPvgujKQzi4pyDiTOnE3E4H+yHvkVRN3c/9PJmQS4CQJExvcDvaX/D+RV+xQben9HJ56jMJS3CgUeWyA==", - "requires": { - "abab": "^2.0.5", - "iconv-lite": "^0.6.3", - "source-map-js": "^1.0.1" - } - }, - "source-map-resolve": { - "version": "0.6.0", - "resolved": "https://registry.npmjs.org/source-map-resolve/-/source-map-resolve-0.6.0.tgz", - "integrity": "sha512-KXBr9d/fO/bWo97NXsPIAW1bFSBOuCnjbNTBMO7N59hsv5i9yzRDfcYwwt0l04+VqnKC+EwzvJZIP/qkuMgR/w==", - "requires": { - "atob": "^2.1.2", - "decode-uri-component": "^0.2.0" - } - }, - "source-map-support": { - "version": "0.5.21", - "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.21.tgz", - "integrity": "sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w==", - "requires": { - "buffer-from": "^1.0.0", - "source-map": "^0.6.0" - }, - "dependencies": { - "source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==" - } - } - }, - "sourcemap-codec": { - "version": "1.4.8", - "resolved": "https://registry.npmjs.org/sourcemap-codec/-/sourcemap-codec-1.4.8.tgz", - "integrity": "sha512-9NykojV5Uih4lgo5So5dtw+f0JgJX30KCNI8gwhz2J9A15wD0Ml6tjHKwf6fTSa6fAdVBdZeNOs9eJ71qCk8vA==" - }, - "spdy": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/spdy/-/spdy-4.0.2.tgz", - "integrity": "sha512-r46gZQZQV+Kl9oItvl1JZZqJKGr+oEkB08A6BzkiR7593/7IbtuncXHd2YoYeTsG4157ZssMu9KYvUHLcjcDoA==", - "requires": { - "debug": "^4.1.0", - "handle-thing": "^2.0.0", - "http-deceiver": "^1.2.7", - "select-hose": "^2.0.0", - "spdy-transport": "^3.0.0" - } - }, - "spdy-transport": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/spdy-transport/-/spdy-transport-3.0.0.tgz", - "integrity": "sha512-hsLVFE5SjA6TCisWeJXFKniGGOpBgMLmerfO2aCyCU5s7nJ/rpAepqmFifv/GCbSbueEeAJJnmSQ2rKC/g8Fcw==", - "requires": { - "debug": "^4.1.0", - "detect-node": "^2.0.4", - "hpack.js": "^2.1.6", - "obuf": "^1.1.2", - "readable-stream": "^3.0.6", - "wbuf": "^1.7.3" - } - }, - "sprintf-js": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", - "integrity": "sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g==" - }, - "stable": { - "version": "0.1.8", - "resolved": "https://registry.npmjs.org/stable/-/stable-0.1.8.tgz", - "integrity": "sha512-ji9qxRnOVfcuLDySj9qzhGSEFVobyt1kIOSkj1qZzYLzq7Tos/oUUWvotUPQLlrsidqsK6tBH89Bc9kL5zHA6w==" - }, - "stack-utils": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/stack-utils/-/stack-utils-2.0.5.tgz", - "integrity": "sha512-xrQcmYhOsn/1kX+Vraq+7j4oE2j/6BFscZ0etmYg81xuM8Gq0022Pxb8+IqgOFUIaxHs0KaSb7T1+OegiNrNFA==", - "requires": { - "escape-string-regexp": "^2.0.0" - }, - "dependencies": { - "escape-string-regexp": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-2.0.0.tgz", - "integrity": "sha512-UpzcLCXolUWcNu5HtVMHYdXJjArjsF9C0aNnquZYY4uW/Vu0miy5YoWvbV345HauVvcAUnpRuhMMcqTcGOY2+w==" - } - } - }, - "stackframe": { - "version": "1.3.4", - "resolved": "https://registry.npmjs.org/stackframe/-/stackframe-1.3.4.tgz", - "integrity": "sha512-oeVtt7eWQS+Na6F//S4kJ2K2VbRlS9D43mAlMyVpVWovy9o+jfgH8O9agzANzaiLjclA0oYzUXEM4PurhSUChw==" - }, - "statuses": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.1.tgz", - "integrity": "sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==" - }, - "string_decoder": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz", - "integrity": "sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==", - "requires": { - "safe-buffer": "~5.2.0" - }, - "dependencies": { - "safe-buffer": { - "version": "5.2.1", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", - "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==" - } - } - }, - "string-length": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/string-length/-/string-length-4.0.2.tgz", - "integrity": "sha512-+l6rNN5fYHNhZZy41RXsYptCjA2Igmq4EG7kZAYFQI1E1VTXarr6ZPXBg6eq7Y6eK4FEhY6AJlyuFIb/v/S0VQ==", - "requires": { - "char-regex": "^1.0.2", - "strip-ansi": "^6.0.0" - } - }, - "string-natural-compare": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/string-natural-compare/-/string-natural-compare-3.0.1.tgz", - "integrity": "sha512-n3sPwynL1nwKi3WJ6AIsClwBMa0zTi54fn2oLU6ndfTSIO05xaznjSf15PcBZU6FNWbmN5Q6cxT4V5hGvB4taw==" - }, - "string-width": { - "version": "4.2.3", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", - "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", - "requires": { - "emoji-regex": "^8.0.0", - "is-fullwidth-code-point": "^3.0.0", - "strip-ansi": "^6.0.1" - }, - "dependencies": { - "emoji-regex": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", - "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==" - } - } - }, - "string.prototype.matchall": { - "version": "4.0.7", - "resolved": "https://registry.npmjs.org/string.prototype.matchall/-/string.prototype.matchall-4.0.7.tgz", - "integrity": "sha512-f48okCX7JiwVi1NXCVWcFnZgADDC/n2vePlQ/KUCNqCikLLilQvwjMO8+BHVKvgzH0JB0J9LEPgxOGT02RoETg==", - "requires": { - "call-bind": "^1.0.2", - "define-properties": "^1.1.3", - "es-abstract": "^1.19.1", - "get-intrinsic": "^1.1.1", - "has-symbols": "^1.0.3", - "internal-slot": "^1.0.3", - "regexp.prototype.flags": "^1.4.1", - "side-channel": "^1.0.4" - } - }, - "string.prototype.trimend": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/string.prototype.trimend/-/string.prototype.trimend-1.0.5.tgz", - "integrity": "sha512-I7RGvmjV4pJ7O3kdf+LXFpVfdNOxtCW/2C8f6jNiW4+PQchwxkCDzlk1/7p+Wl4bqFIZeF47qAHXLuHHWKAxog==", - "requires": { - "call-bind": "^1.0.2", - "define-properties": "^1.1.4", - "es-abstract": "^1.19.5" - } - }, - "string.prototype.trimstart": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/string.prototype.trimstart/-/string.prototype.trimstart-1.0.5.tgz", - "integrity": "sha512-THx16TJCGlsN0o6dl2o6ncWUsdgnLRSA23rRE5pyGBw/mLr3Ej/R2LaqCtgP8VNMGZsvMWnf9ooZPyY2bHvUFg==", - "requires": { - "call-bind": "^1.0.2", - "define-properties": "^1.1.4", - "es-abstract": "^1.19.5" - } - }, - "stringify-object": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/stringify-object/-/stringify-object-3.3.0.tgz", - "integrity": "sha512-rHqiFh1elqCQ9WPLIC8I0Q/g/wj5J1eMkyoiD6eoQApWHP0FtlK7rqnhmabL5VUY9JQCcqwwvlOaSuutekgyrw==", - "requires": { - "get-own-enumerable-property-symbols": "^3.0.0", - "is-obj": "^1.0.1", - "is-regexp": "^1.0.0" - } - }, - "strip-ansi": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", - "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", - "requires": { - "ansi-regex": "^5.0.1" - } - }, - "strip-bom": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-4.0.0.tgz", - "integrity": "sha512-3xurFv5tEgii33Zi8Jtp55wEIILR9eh34FAW00PZf+JnSsTmV/ioewSgQl97JHvgjoRGwPShsWm+IdrxB35d0w==" - }, - "strip-comments": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/strip-comments/-/strip-comments-2.0.1.tgz", - "integrity": "sha512-ZprKx+bBLXv067WTCALv8SSz5l2+XhpYCsVtSqlMnkAXMWDq+/ekVbl1ghqP9rUHTzv6sm/DwCOiYutU/yp1fw==" - }, - "strip-final-newline": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/strip-final-newline/-/strip-final-newline-2.0.0.tgz", - "integrity": "sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA==" - }, - "strip-indent": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/strip-indent/-/strip-indent-3.0.0.tgz", - "integrity": "sha512-laJTa3Jb+VQpaC6DseHhF7dXVqHTfJPCRDaEbid/drOhgitgYku/letMUqOXFoWV0zIIUbjpdH2t+tYj4bQMRQ==", - "requires": { - "min-indent": "^1.0.0" - } - }, - "strip-json-comments": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz", - "integrity": "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==" - }, - "style-loader": { - "version": "3.3.1", - "resolved": "https://registry.npmjs.org/style-loader/-/style-loader-3.3.1.tgz", - "integrity": "sha512-GPcQ+LDJbrcxHORTRes6Jy2sfvK2kS6hpSfI/fXhPt+spVzxF6LJ1dHLN9zIGmVaaP044YKaIatFaufENRiDoQ==", - "requires": {} - }, - "stylehacks": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/stylehacks/-/stylehacks-5.1.0.tgz", - "integrity": "sha512-SzLmvHQTrIWfSgljkQCw2++C9+Ne91d/6Sp92I8c5uHTcy/PgeHamwITIbBW9wnFTY/3ZfSXR9HIL6Ikqmcu6Q==", - "requires": { - "browserslist": "^4.16.6", - "postcss-selector-parser": "^6.0.4" - } - }, - "supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", - "requires": { - "has-flag": "^3.0.0" - } - }, - "supports-hyperlinks": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/supports-hyperlinks/-/supports-hyperlinks-2.2.0.tgz", - "integrity": "sha512-6sXEzV5+I5j8Bmq9/vUphGRM/RJNT9SCURJLjwfOg51heRtguGWDzcaBlgAzKhQa0EVNpPEKzQuBwZ8S8WaCeQ==", - "requires": { - "has-flag": "^4.0.0", - "supports-color": "^7.0.0" - }, - "dependencies": { - "has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==" - }, - "supports-color": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", - "requires": { - "has-flag": "^4.0.0" - } - } - } - }, - "supports-preserve-symlinks-flag": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz", - "integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==" - }, - "svg-parser": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/svg-parser/-/svg-parser-2.0.4.tgz", - "integrity": "sha512-e4hG1hRwoOdRb37cIMSgzNsxyzKfayW6VOflrwvR+/bzrkyxY/31WkbgnQpgtrNp1SdpJvpUAGTa/ZoiPNDuRQ==" - }, - "svgo": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/svgo/-/svgo-1.3.2.tgz", - "integrity": "sha512-yhy/sQYxR5BkC98CY7o31VGsg014AKLEPxdfhora76l36hD9Rdy5NZA/Ocn6yayNPgSamYdtX2rFJdcv07AYVw==", - "requires": { - "chalk": "^2.4.1", - "coa": "^2.0.2", - "css-select": "^2.0.0", - "css-select-base-adapter": "^0.1.1", - "css-tree": "1.0.0-alpha.37", - "csso": "^4.0.2", - "js-yaml": "^3.13.1", - "mkdirp": "~0.5.1", - "object.values": "^1.1.0", - "sax": "~1.2.4", - "stable": "^0.1.8", - "unquote": "~1.1.1", - "util.promisify": "~1.0.0" - }, - "dependencies": { - "css-select": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/css-select/-/css-select-2.1.0.tgz", - "integrity": "sha512-Dqk7LQKpwLoH3VovzZnkzegqNSuAziQyNZUcrdDM401iY+R5NkGBXGmtO05/yaXQziALuPogeG0b7UAgjnTJTQ==", - "requires": { - "boolbase": "^1.0.0", - "css-what": "^3.2.1", - "domutils": "^1.7.0", - "nth-check": "^1.0.2" - } - }, - "css-what": { - "version": "3.4.2", - "resolved": "https://registry.npmjs.org/css-what/-/css-what-3.4.2.tgz", - "integrity": "sha512-ACUm3L0/jiZTqfzRM3Hi9Q8eZqd6IK37mMWPLz9PJxkLWllYeRf+EHUSHYEtFop2Eqytaq1FizFVh7XfBnXCDQ==" - }, - "dom-serializer": { - "version": "0.2.2", - "resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-0.2.2.tgz", - "integrity": "sha512-2/xPb3ORsQ42nHYiSunXkDjPLBaEj/xTwUO4B7XCZQTRk7EBtTOPaygh10YAAh2OI1Qrp6NWfpAhzswj0ydt9g==", - "requires": { - "domelementtype": "^2.0.1", - "entities": "^2.0.0" - } - }, - "domutils": { - "version": "1.7.0", - "resolved": "https://registry.npmjs.org/domutils/-/domutils-1.7.0.tgz", - "integrity": "sha512-Lgd2XcJ/NjEw+7tFvfKxOzCYKZsdct5lczQ2ZaQY8Djz7pfAD3Gbp8ySJWtreII/vDlMVmxwa6pHmdxIYgttDg==", - "requires": { - "dom-serializer": "0", - "domelementtype": "1" - }, - "dependencies": { - "domelementtype": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-1.3.1.tgz", - "integrity": "sha512-BSKB+TSpMpFI/HOxCNr1O8aMOTZ8hT3pM3GQ0w/mWRmkhEDSFJkkyzz4XQsBV44BChwGkrDfMyjVD0eA2aFV3w==" - } - } - }, - "nth-check": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/nth-check/-/nth-check-1.0.2.tgz", - "integrity": "sha512-WeBOdju8SnzPN5vTUJYxYUxLeXpCaVP5i5e0LF8fg7WORF2Wd7wFX/pk0tYZk7s8T+J7VLy0Da6J1+wCT0AtHg==", - "requires": { - "boolbase": "~1.0.0" - } - } - } - }, - "symbol-tree": { - "version": "3.2.4", - "resolved": "https://registry.npmjs.org/symbol-tree/-/symbol-tree-3.2.4.tgz", - "integrity": "sha512-9QNk5KwDF+Bvz+PyObkmSYjI5ksVUYtjW7AU22r2NKcfLJcXp96hkDWU3+XndOsUb+AQ9QhfzfCT2O+CNWT5Tw==" - }, - "tailwindcss": { - "version": "3.1.6", - "resolved": "https://registry.npmjs.org/tailwindcss/-/tailwindcss-3.1.6.tgz", - "integrity": "sha512-7skAOY56erZAFQssT1xkpk+kWt2NrO45kORlxFPXUt3CiGsVPhH1smuH5XoDH6sGPXLyBv+zgCKA2HWBsgCytg==", - "requires": { - "arg": "^5.0.2", - "chokidar": "^3.5.3", - "color-name": "^1.1.4", - "detective": "^5.2.1", - "didyoumean": "^1.2.2", - "dlv": "^1.1.3", - "fast-glob": "^3.2.11", - "glob-parent": "^6.0.2", - "is-glob": "^4.0.3", - "lilconfig": "^2.0.5", - "normalize-path": "^3.0.0", - "object-hash": "^3.0.0", - "picocolors": "^1.0.0", - "postcss": "^8.4.14", - "postcss-import": "^14.1.0", - "postcss-js": "^4.0.0", - "postcss-load-config": "^3.1.4", - "postcss-nested": "5.0.6", - "postcss-selector-parser": "^6.0.10", - "postcss-value-parser": "^4.2.0", - "quick-lru": "^5.1.1", - "resolve": "^1.22.1" - }, - "dependencies": { - "color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" - } - } - }, - "tapable": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/tapable/-/tapable-2.2.1.tgz", - "integrity": "sha512-GNzQvQTOIP6RyTfE2Qxb8ZVlNmw0n88vp1szwWRimP02mnTsx3Wtn5qRdqY9w2XduFNUgvOwhNnQsjwCp+kqaQ==" - }, - "temp-dir": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/temp-dir/-/temp-dir-2.0.0.tgz", - "integrity": "sha512-aoBAniQmmwtcKp/7BzsH8Cxzv8OL736p7v1ihGb5e9DJ9kTwGWHrQrVB5+lfVDzfGrdRzXch+ig7LHaY1JTOrg==" - }, - "tempy": { - "version": "0.6.0", - "resolved": "https://registry.npmjs.org/tempy/-/tempy-0.6.0.tgz", - "integrity": "sha512-G13vtMYPT/J8A4X2SjdtBTphZlrp1gKv6hZiOjw14RCWg6GbHuQBGtjlx75xLbYV/wEc0D7G5K4rxKP/cXk8Bw==", - "requires": { - "is-stream": "^2.0.0", - "temp-dir": "^2.0.0", - "type-fest": "^0.16.0", - "unique-string": "^2.0.0" - }, - "dependencies": { - "type-fest": { - "version": "0.16.0", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.16.0.tgz", - "integrity": "sha512-eaBzG6MxNzEn9kiwvtre90cXaNLkmadMWa1zQMs3XORCXNbsH/OewwbxC5ia9dCxIxnTAsSxXJaa/p5y8DlvJg==" - } - } - }, - "terminal-link": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/terminal-link/-/terminal-link-2.1.1.tgz", - "integrity": "sha512-un0FmiRUQNr5PJqy9kP7c40F5BOfpGlYTrxonDChEZB7pzZxRNp/bt+ymiy9/npwXya9KH99nJ/GXFIiUkYGFQ==", - "requires": { - "ansi-escapes": "^4.2.1", - "supports-hyperlinks": "^2.0.0" - } - }, - "terser": { - "version": "5.14.1", - "resolved": "https://registry.npmjs.org/terser/-/terser-5.14.1.tgz", - "integrity": "sha512-+ahUAE+iheqBTDxXhTisdA8hgvbEG1hHOQ9xmNjeUJSoi6DU/gMrKNcfZjHkyY6Alnuyc+ikYJaxxfHkT3+WuQ==", - "requires": { - "@jridgewell/source-map": "^0.3.2", - "acorn": "^8.5.0", - "commander": "^2.20.0", - "source-map-support": "~0.5.20" - }, - "dependencies": { - "commander": { - "version": "2.20.3", - "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz", - "integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==" - } - } - }, - "terser-webpack-plugin": { - "version": "5.3.3", - "resolved": "https://registry.npmjs.org/terser-webpack-plugin/-/terser-webpack-plugin-5.3.3.tgz", - "integrity": "sha512-Fx60G5HNYknNTNQnzQ1VePRuu89ZVYWfjRAeT5rITuCY/1b08s49e5kSQwHDirKZWuoKOBRFS98EUUoZ9kLEwQ==", - "requires": { - "@jridgewell/trace-mapping": "^0.3.7", - "jest-worker": "^27.4.5", - "schema-utils": "^3.1.1", - "serialize-javascript": "^6.0.0", - "terser": "^5.7.2" - } - }, - "test-exclude": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/test-exclude/-/test-exclude-6.0.0.tgz", - "integrity": "sha512-cAGWPIyOHU6zlmg88jwm7VRyXnMN7iV68OGAbYDk/Mh/xC/pzVPlQtY6ngoIH/5/tciuhGfvESU8GrHrcxD56w==", - "requires": { - "@istanbuljs/schema": "^0.1.2", - "glob": "^7.1.4", - "minimatch": "^3.0.4" - } - }, - "text-table": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz", - "integrity": "sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw==" - }, - "throat": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/throat/-/throat-6.0.1.tgz", - "integrity": "sha512-8hmiGIJMDlwjg7dlJ4yKGLK8EsYqKgPWbG3b4wjJddKNwc7N7Dpn08Df4szr/sZdMVeOstrdYSsqzX6BYbcB+w==" - }, - "thunky": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/thunky/-/thunky-1.1.0.tgz", - "integrity": "sha512-eHY7nBftgThBqOyHGVN+l8gF0BucP09fMo0oO/Lb0w1OF80dJv+lDVpXG60WMQvkcxAkNybKsrEIE3ZtKGmPrA==" - }, - "tmpl": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/tmpl/-/tmpl-1.0.5.tgz", - "integrity": "sha512-3f0uOEAQwIqGuWW2MVzYg8fV/QNnc/IpuJNG837rLuczAaLVHslWHZQj4IGiEl5Hs3kkbhwL9Ab7Hrsmuj+Smw==" - }, - "to-fast-properties": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-2.0.0.tgz", - "integrity": "sha512-/OaKK0xYrs3DmxRYqL/yDc+FxFUVYhDlXMhRmv3z915w2HF1tnN1omB354j8VUGO/hbRzyD6Y3sA7v7GS/ceog==" - }, - "to-regex-range": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", - "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", - "requires": { - "is-number": "^7.0.0" - } - }, - "toidentifier": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.1.tgz", - "integrity": "sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA==" - }, - "tough-cookie": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-4.0.0.tgz", - "integrity": "sha512-tHdtEpQCMrc1YLrMaqXXcj6AxhYi/xgit6mZu1+EDWUn+qhUf8wMQoFIy9NXuq23zAwtcB0t/MjACGR18pcRbg==", - "requires": { - "psl": "^1.1.33", - "punycode": "^2.1.1", - "universalify": "^0.1.2" - }, - "dependencies": { - "universalify": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/universalify/-/universalify-0.1.2.tgz", - "integrity": "sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg==" - } - } - }, - "tr46": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/tr46/-/tr46-2.1.0.tgz", - "integrity": "sha512-15Ih7phfcdP5YxqiB+iDtLoaTz4Nd35+IiAv0kQ5FNKHzXgdWqPoTIqEDDJmXceQt4JZk6lVPT8lnDlPpGDppw==", - "requires": { - "punycode": "^2.1.1" - } - }, - "tryer": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/tryer/-/tryer-1.0.1.tgz", - "integrity": "sha512-c3zayb8/kWWpycWYg87P71E1S1ZL6b6IJxfb5fvsUgsf0S2MVGaDhDXXjDMpdCpfWXqptc+4mXwmiy1ypXqRAA==" - }, - "tsconfig-paths": { - "version": "3.14.1", - "resolved": "https://registry.npmjs.org/tsconfig-paths/-/tsconfig-paths-3.14.1.tgz", - "integrity": "sha512-fxDhWnFSLt3VuTwtvJt5fpwxBHg5AdKWMsgcPOOIilyjymcYVZoCQF8fvFRezCNfblEXmi+PcM1eYHeOAgXCOQ==", - "requires": { - "@types/json5": "^0.0.29", - "json5": "^1.0.1", - "minimist": "^1.2.6", - "strip-bom": "^3.0.0" - }, - "dependencies": { - "json5": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/json5/-/json5-1.0.1.tgz", - "integrity": "sha512-aKS4WQjPenRxiQsC93MNfjx+nbF4PAdYzmd/1JIj8HYzqfbu86beTuNgXDzPknWk0n0uARlyewZo4s++ES36Ow==", - "requires": { - "minimist": "^1.2.0" - } - }, - "strip-bom": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz", - "integrity": "sha512-vavAMRXOgBVNF6nyEEmL3DBK19iRpDcoIwW+swQ+CbGiu7lju6t+JklA1MHweoWtadgt4ISVUsXLyDq34ddcwA==" - } - } - }, - "tslib": { - "version": "2.4.0", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.4.0.tgz", - "integrity": "sha512-d6xOpEDfsi2CZVlPQzGeux8XMwLT9hssAsaPYExaQMuYskwb+x1x7J371tWlbBdWHroy99KnVB6qIkUbs5X3UQ==" - }, - "tsutils": { - "version": "3.21.0", - "resolved": "https://registry.npmjs.org/tsutils/-/tsutils-3.21.0.tgz", - "integrity": "sha512-mHKK3iUXL+3UF6xL5k0PEhKRUBKPBCv/+RkEOpjRWxxx27KKRBmmA60A9pgOUvMi8GKhRMPEmjBRPzs2W7O1OA==", - "requires": { - "tslib": "^1.8.1" - }, - "dependencies": { - "tslib": { - "version": "1.14.1", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", - "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==" - } - } - }, - "type-check": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.4.0.tgz", - "integrity": "sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==", - "requires": { - "prelude-ls": "^1.2.1" - } - }, - "type-detect": { - "version": "4.0.8", - "resolved": "https://registry.npmjs.org/type-detect/-/type-detect-4.0.8.tgz", - "integrity": "sha512-0fr/mIH1dlO+x7TlcMy+bIDqKPsw/70tVyeHW787goQjhmqaZe10uwLujubK9q9Lg6Fiho1KUKDYz0Z7k7g5/g==" - }, - "type-fest": { - "version": "0.21.3", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.21.3.tgz", - "integrity": "sha512-t0rzBq87m3fVcduHDUFhKmyyX+9eo6WQjZvf51Ea/M0Q7+T374Jp1aUiyUl0GKxp8M/OETVHSDvmkyPgvX+X2w==" - }, - "type-is": { - "version": "1.6.18", - "resolved": "https://registry.npmjs.org/type-is/-/type-is-1.6.18.tgz", - "integrity": "sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g==", - "requires": { - "media-typer": "0.3.0", - "mime-types": "~2.1.24" - } - }, - "typedarray-to-buffer": { - "version": "3.1.5", - "resolved": "https://registry.npmjs.org/typedarray-to-buffer/-/typedarray-to-buffer-3.1.5.tgz", - "integrity": "sha512-zdu8XMNEDepKKR+XYOXAVPtWui0ly0NtohUscw+UmaHiAWT8hrV1rr//H6V+0DvJ3OQ19S979M0laLfX8rm82Q==", - "requires": { - "is-typedarray": "^1.0.0" - } - }, - "typescript": { - "version": "4.7.4", - "resolved": "https://registry.npmjs.org/typescript/-/typescript-4.7.4.tgz", - "integrity": "sha512-C0WQT0gezHuw6AdY1M2jxUO83Rjf0HP7Sk1DtXj6j1EwkQNZrHAg2XPWlq62oqEhYvONq5pkC2Y9oPljWToLmQ==", - "peer": true - }, - "unbox-primitive": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/unbox-primitive/-/unbox-primitive-1.0.2.tgz", - "integrity": "sha512-61pPlCD9h51VoreyJ0BReideM3MDKMKnh6+V9L08331ipq6Q8OFXZYiqP6n/tbHx4s5I9uRhcye6BrbkizkBDw==", - "requires": { - "call-bind": "^1.0.2", - "has-bigints": "^1.0.2", - "has-symbols": "^1.0.3", - "which-boxed-primitive": "^1.0.2" - } - }, - "unicode-canonical-property-names-ecmascript": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/unicode-canonical-property-names-ecmascript/-/unicode-canonical-property-names-ecmascript-2.0.0.tgz", - "integrity": "sha512-yY5PpDlfVIU5+y/BSCxAJRBIS1Zc2dDG3Ujq+sR0U+JjUevW2JhocOF+soROYDSaAezOzOKuyyixhD6mBknSmQ==" - }, - "unicode-match-property-ecmascript": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/unicode-match-property-ecmascript/-/unicode-match-property-ecmascript-2.0.0.tgz", - "integrity": "sha512-5kaZCrbp5mmbz5ulBkDkbY0SsPOjKqVS35VpL9ulMPfSl0J0Xsm+9Evphv9CoIZFwre7aJoa94AY6seMKGVN5Q==", - "requires": { - "unicode-canonical-property-names-ecmascript": "^2.0.0", - "unicode-property-aliases-ecmascript": "^2.0.0" - } - }, - "unicode-match-property-value-ecmascript": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/unicode-match-property-value-ecmascript/-/unicode-match-property-value-ecmascript-2.0.0.tgz", - "integrity": "sha512-7Yhkc0Ye+t4PNYzOGKedDhXbYIBe1XEQYQxOPyhcXNMJ0WCABqqj6ckydd6pWRZTHV4GuCPKdBAUiMc60tsKVw==" - }, - "unicode-property-aliases-ecmascript": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/unicode-property-aliases-ecmascript/-/unicode-property-aliases-ecmascript-2.0.0.tgz", - "integrity": "sha512-5Zfuy9q/DFr4tfO7ZPeVXb1aPoeQSdeFMLpYuFebehDAhbuevLs5yxSZmIFN1tP5F9Wl4IpJrYojg85/zgyZHQ==" - }, - "unique-string": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/unique-string/-/unique-string-2.0.0.tgz", - "integrity": "sha512-uNaeirEPvpZWSgzwsPGtU2zVSTrn/8L5q/IexZmH0eH6SA73CmAA5U4GwORTxQAZs95TAXLNqeLoPPNO5gZfWg==", - "requires": { - "crypto-random-string": "^2.0.0" - } - }, - "universalify": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.0.tgz", - "integrity": "sha512-hAZsKq7Yy11Zu1DE0OzWjw7nnLZmJZYTDZZyEFHZdUhV8FkH5MCfoU1XMaxXovpyW5nq5scPqq0ZDP9Zyl04oQ==" - }, - "unpipe": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz", - "integrity": "sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ==" - }, - "unquote": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/unquote/-/unquote-1.1.1.tgz", - "integrity": "sha512-vRCqFv6UhXpWxZPyGDh/F3ZpNv8/qo7w6iufLpQg9aKnQ71qM4B5KiI7Mia9COcjEhrO9LueHpMYjYzsWH3OIg==" - }, - "upath": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/upath/-/upath-1.2.0.tgz", - "integrity": "sha512-aZwGpamFO61g3OlfT7OQCHqhGnW43ieH9WZeP7QxN/G/jS4jfqUkZxoryvJgVPEcrl5NL/ggHsSmLMHuH64Lhg==" - }, - "update-browserslist-db": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.0.4.tgz", - "integrity": "sha512-jnmO2BEGUjsMOe/Fg9u0oczOe/ppIDZPebzccl1yDWGLFP16Pa1/RM5wEoKYPG2zstNcDuAStejyxsOuKINdGA==", - "requires": { - "escalade": "^3.1.1", - "picocolors": "^1.0.0" - } - }, - "uri-js": { - "version": "4.4.1", - "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz", - "integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==", - "requires": { - "punycode": "^2.1.0" - } - }, - "util-deprecate": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", - "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==" - }, - "util.promisify": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/util.promisify/-/util.promisify-1.0.1.tgz", - "integrity": "sha512-g9JpC/3He3bm38zsLupWryXHoEcS22YHthuPQSJdMy6KNrzIRzWqcsHzD/WUnqe45whVou4VIsPew37DoXWNrA==", - "requires": { - "define-properties": "^1.1.3", - "es-abstract": "^1.17.2", - "has-symbols": "^1.0.1", - "object.getownpropertydescriptors": "^2.1.0" - } - }, - "utila": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/utila/-/utila-0.4.0.tgz", - "integrity": "sha512-Z0DbgELS9/L/75wZbro8xAnT50pBVFQZ+hUEueGDU5FN51YSCYM+jdxsfCiHjwNP/4LCDD0i/graKpeBnOXKRA==" - }, - "utils-merge": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/utils-merge/-/utils-merge-1.0.1.tgz", - "integrity": "sha512-pMZTvIkT1d+TFGvDOqodOclx0QWkkgi6Tdoa8gC8ffGAAqz9pzPTZWAybbsHHoED/ztMtkv/VoYTYyShUn81hA==" - }, - "uuid": { - "version": "8.3.2", - "resolved": "https://registry.npmjs.org/uuid/-/uuid-8.3.2.tgz", - "integrity": "sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg==" - }, - "v8-compile-cache": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/v8-compile-cache/-/v8-compile-cache-2.3.0.tgz", - "integrity": "sha512-l8lCEmLcLYZh4nbunNZvQCJc5pv7+RCwa8q/LdUx8u7lsWvPDKmpodJAJNwkAhJC//dFY48KuIEmjtd4RViDrA==" - }, - "v8-to-istanbul": { - "version": "8.1.1", - "resolved": "https://registry.npmjs.org/v8-to-istanbul/-/v8-to-istanbul-8.1.1.tgz", - "integrity": "sha512-FGtKtv3xIpR6BYhvgH8MI/y78oT7d8Au3ww4QIxymrCtZEh5b8gCw2siywE+puhEmuWKDtmfrvF5UlB298ut3w==", - "requires": { - "@types/istanbul-lib-coverage": "^2.0.1", - "convert-source-map": "^1.6.0", - "source-map": "^0.7.3" - } - }, - "vary": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz", - "integrity": "sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg==" - }, - "w3c-hr-time": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/w3c-hr-time/-/w3c-hr-time-1.0.2.tgz", - "integrity": "sha512-z8P5DvDNjKDoFIHK7q8r8lackT6l+jo/Ye3HOle7l9nICP9lf1Ci25fy9vHd0JOWewkIFzXIEig3TdKT7JQ5fQ==", - "requires": { - "browser-process-hrtime": "^1.0.0" - } - }, - "w3c-xmlserializer": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/w3c-xmlserializer/-/w3c-xmlserializer-2.0.0.tgz", - "integrity": "sha512-4tzD0mF8iSiMiNs30BiLO3EpfGLZUT2MSX/G+o7ZywDzliWQ3OPtTZ0PTC3B3ca1UAf4cJMHB+2Bf56EriJuRA==", - "requires": { - "xml-name-validator": "^3.0.0" - } - }, - "walker": { - "version": "1.0.8", - "resolved": "https://registry.npmjs.org/walker/-/walker-1.0.8.tgz", - "integrity": "sha512-ts/8E8l5b7kY0vlWLewOkDXMmPdLcVV4GmOQLyxuSswIJsweeFZtAsMF7k1Nszz+TYBQrlYRmzOnr398y1JemQ==", - "requires": { - "makeerror": "1.0.12" - } - }, - "watchpack": { - "version": "2.4.0", - "resolved": "https://registry.npmjs.org/watchpack/-/watchpack-2.4.0.tgz", - "integrity": "sha512-Lcvm7MGST/4fup+ifyKi2hjyIAwcdI4HRgtvTpIUxBRhB+RFtUh8XtDOxUfctVCnhVi+QQj49i91OyvzkJl6cg==", - "requires": { - "glob-to-regexp": "^0.4.1", - "graceful-fs": "^4.1.2" - } - }, - "wbuf": { - "version": "1.7.3", - "resolved": "https://registry.npmjs.org/wbuf/-/wbuf-1.7.3.tgz", - "integrity": "sha512-O84QOnr0icsbFGLS0O3bI5FswxzRr8/gHwWkDlQFskhSPryQXvrTMxjxGP4+iWYoauLoBvfDpkrOauZ+0iZpDA==", - "requires": { - "minimalistic-assert": "^1.0.0" - } - }, - "web-vitals": { - "version": "2.1.4", - "resolved": "https://registry.npmjs.org/web-vitals/-/web-vitals-2.1.4.tgz", - "integrity": "sha512-sVWcwhU5mX6crfI5Vd2dC4qchyTqxV8URinzt25XqVh+bHEPGH4C3NPrNionCP7Obx59wrYEbNlw4Z8sjALzZg==" - }, - "webidl-conversions": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-6.1.0.tgz", - "integrity": "sha512-qBIvFLGiBpLjfwmYAaHPXsn+ho5xZnGvyGvsarywGNc8VyQJUMHJ8OBKGGrPER0okBeMDaan4mNBlgBROxuI8w==" - }, - "webpack": { - "version": "5.73.0", - "resolved": "https://registry.npmjs.org/webpack/-/webpack-5.73.0.tgz", - "integrity": "sha512-svjudQRPPa0YiOYa2lM/Gacw0r6PvxptHj4FuEKQ2kX05ZLkjbVc5MnPs6its5j7IZljnIqSVo/OsY2X0IpHGA==", - "requires": { - "@types/eslint-scope": "^3.7.3", - "@types/estree": "^0.0.51", - "@webassemblyjs/ast": "1.11.1", - "@webassemblyjs/wasm-edit": "1.11.1", - "@webassemblyjs/wasm-parser": "1.11.1", - "acorn": "^8.4.1", - "acorn-import-assertions": "^1.7.6", - "browserslist": "^4.14.5", - "chrome-trace-event": "^1.0.2", - "enhanced-resolve": "^5.9.3", - "es-module-lexer": "^0.9.0", - "eslint-scope": "5.1.1", - "events": "^3.2.0", - "glob-to-regexp": "^0.4.1", - "graceful-fs": "^4.2.9", - "json-parse-even-better-errors": "^2.3.1", - "loader-runner": "^4.2.0", - "mime-types": "^2.1.27", - "neo-async": "^2.6.2", - "schema-utils": "^3.1.0", - "tapable": "^2.1.1", - "terser-webpack-plugin": "^5.1.3", - "watchpack": "^2.3.1", - "webpack-sources": "^3.2.3" - }, - "dependencies": { - "@types/estree": { - "version": "0.0.51", - "resolved": "https://registry.npmjs.org/@types/estree/-/estree-0.0.51.tgz", - "integrity": "sha512-CuPgU6f3eT/XgKKPqKd/gLZV1Xmvf1a2R5POBOGQa6uv82xpls89HU5zKeVoyR8XzHd1RGNOlQlvUe3CFkjWNQ==" - }, - "eslint-scope": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-5.1.1.tgz", - "integrity": "sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw==", - "requires": { - "esrecurse": "^4.3.0", - "estraverse": "^4.1.1" - } - }, - "estraverse": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.3.0.tgz", - "integrity": "sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==" - } - } - }, - "webpack-dev-middleware": { - "version": "5.3.3", - "resolved": "https://registry.npmjs.org/webpack-dev-middleware/-/webpack-dev-middleware-5.3.3.tgz", - "integrity": "sha512-hj5CYrY0bZLB+eTO+x/j67Pkrquiy7kWepMHmUMoPsmcUaeEnQJqFzHJOyxgWlq746/wUuA64p9ta34Kyb01pA==", - "requires": { - "colorette": "^2.0.10", - "memfs": "^3.4.3", - "mime-types": "^2.1.31", - "range-parser": "^1.2.1", - "schema-utils": "^4.0.0" - }, - "dependencies": { - "ajv": { - "version": "8.11.0", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.11.0.tgz", - "integrity": "sha512-wGgprdCvMalC0BztXvitD2hC04YffAvtsUn93JbGXYLAtCUO4xd17mCCZQxUOItiBwZvJScWo8NIvQMQ71rdpg==", - "requires": { - "fast-deep-equal": "^3.1.1", - "json-schema-traverse": "^1.0.0", - "require-from-string": "^2.0.2", - "uri-js": "^4.2.2" - } - }, - "ajv-keywords": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-5.1.0.tgz", - "integrity": "sha512-YCS/JNFAUyr5vAuhk1DWm1CBxRHW9LbJ2ozWeemrIqpbsqKjHVxYPyi5GC0rjZIT5JxJ3virVTS8wk4i/Z+krw==", - "requires": { - "fast-deep-equal": "^3.1.3" - } - }, - "json-schema-traverse": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", - "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==" - }, - "schema-utils": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-4.0.0.tgz", - "integrity": "sha512-1edyXKgh6XnJsJSQ8mKWXnN/BVaIbFMLpouRUrXgVq7WYne5kw3MW7UPhO44uRXQSIpTSXoJbmrR2X0w9kUTyg==", - "requires": { - "@types/json-schema": "^7.0.9", - "ajv": "^8.8.0", - "ajv-formats": "^2.1.1", - "ajv-keywords": "^5.0.0" - } - } - } - }, - "webpack-dev-server": { - "version": "4.9.3", - "resolved": "https://registry.npmjs.org/webpack-dev-server/-/webpack-dev-server-4.9.3.tgz", - "integrity": "sha512-3qp/eoboZG5/6QgiZ3llN8TUzkSpYg1Ko9khWX1h40MIEUNS2mDoIa8aXsPfskER+GbTvs/IJZ1QTBBhhuetSw==", - "requires": { - "@types/bonjour": "^3.5.9", - "@types/connect-history-api-fallback": "^1.3.5", - "@types/express": "^4.17.13", - "@types/serve-index": "^1.9.1", - "@types/serve-static": "^1.13.10", - "@types/sockjs": "^0.3.33", - "@types/ws": "^8.5.1", - "ansi-html-community": "^0.0.8", - "bonjour-service": "^1.0.11", - "chokidar": "^3.5.3", - "colorette": "^2.0.10", - "compression": "^1.7.4", - "connect-history-api-fallback": "^2.0.0", - "default-gateway": "^6.0.3", - "express": "^4.17.3", - "graceful-fs": "^4.2.6", - "html-entities": "^2.3.2", - "http-proxy-middleware": "^2.0.3", - "ipaddr.js": "^2.0.1", - "open": "^8.0.9", - "p-retry": "^4.5.0", - "rimraf": "^3.0.2", - "schema-utils": "^4.0.0", - "selfsigned": "^2.0.1", - "serve-index": "^1.9.1", - "sockjs": "^0.3.24", - "spdy": "^4.0.2", - "webpack-dev-middleware": "^5.3.1", - "ws": "^8.4.2" - }, - "dependencies": { - "ajv": { - "version": "8.11.0", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.11.0.tgz", - "integrity": "sha512-wGgprdCvMalC0BztXvitD2hC04YffAvtsUn93JbGXYLAtCUO4xd17mCCZQxUOItiBwZvJScWo8NIvQMQ71rdpg==", - "requires": { - "fast-deep-equal": "^3.1.1", - "json-schema-traverse": "^1.0.0", - "require-from-string": "^2.0.2", - "uri-js": "^4.2.2" - } - }, - "ajv-keywords": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-5.1.0.tgz", - "integrity": "sha512-YCS/JNFAUyr5vAuhk1DWm1CBxRHW9LbJ2ozWeemrIqpbsqKjHVxYPyi5GC0rjZIT5JxJ3virVTS8wk4i/Z+krw==", - "requires": { - "fast-deep-equal": "^3.1.3" - } - }, - "json-schema-traverse": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", - "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==" - }, - "schema-utils": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-4.0.0.tgz", - "integrity": "sha512-1edyXKgh6XnJsJSQ8mKWXnN/BVaIbFMLpouRUrXgVq7WYne5kw3MW7UPhO44uRXQSIpTSXoJbmrR2X0w9kUTyg==", - "requires": { - "@types/json-schema": "^7.0.9", - "ajv": "^8.8.0", - "ajv-formats": "^2.1.1", - "ajv-keywords": "^5.0.0" - } - }, - "ws": { - "version": "8.8.0", - "resolved": "https://registry.npmjs.org/ws/-/ws-8.8.0.tgz", - "integrity": "sha512-JDAgSYQ1ksuwqfChJusw1LSJ8BizJ2e/vVu5Lxjq3YvNJNlROv1ui4i+c/kUUrPheBvQl4c5UbERhTwKa6QBJQ==", - "requires": {} - } - } - }, - "webpack-manifest-plugin": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/webpack-manifest-plugin/-/webpack-manifest-plugin-4.1.1.tgz", - "integrity": "sha512-YXUAwxtfKIJIKkhg03MKuiFAD72PlrqCiwdwO4VEXdRO5V0ORCNwaOwAZawPZalCbmH9kBDmXnNeQOw+BIEiow==", - "requires": { - "tapable": "^2.0.0", - "webpack-sources": "^2.2.0" - }, - "dependencies": { - "source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==" - }, - "webpack-sources": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/webpack-sources/-/webpack-sources-2.3.1.tgz", - "integrity": "sha512-y9EI9AO42JjEcrTJFOYmVywVZdKVUfOvDUPsJea5GIr1JOEGFVqwlY2K098fFoIjOkDzHn2AjRvM8dsBZu+gCA==", - "requires": { - "source-list-map": "^2.0.1", - "source-map": "^0.6.1" - } - } - } - }, - "webpack-sources": { - "version": "3.2.3", - "resolved": "https://registry.npmjs.org/webpack-sources/-/webpack-sources-3.2.3.tgz", - "integrity": "sha512-/DyMEOrDgLKKIG0fmvtz+4dUX/3Ghozwgm6iPp8KRhvn+eQf9+Q7GWxVNMk3+uCPWfdXYC4ExGBckIXdFEfH1w==" - }, - "websocket-driver": { - "version": "0.7.4", - "resolved": "https://registry.npmjs.org/websocket-driver/-/websocket-driver-0.7.4.tgz", - "integrity": "sha512-b17KeDIQVjvb0ssuSDF2cYXSg2iztliJ4B9WdsuB6J952qCPKmnVq4DyW5motImXHDC1cBT/1UezrJVsKw5zjg==", - "requires": { - "http-parser-js": ">=0.5.1", - "safe-buffer": ">=5.1.0", - "websocket-extensions": ">=0.1.1" - } - }, - "websocket-extensions": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/websocket-extensions/-/websocket-extensions-0.1.4.tgz", - "integrity": "sha512-OqedPIGOfsDlo31UNwYbCFMSaO9m9G/0faIHj5/dZFDMFqPTcx6UwqyOy3COEaEOg/9VsGIpdqn62W5KhoKSpg==" - }, - "whatwg-encoding": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/whatwg-encoding/-/whatwg-encoding-1.0.5.tgz", - "integrity": "sha512-b5lim54JOPN9HtzvK9HFXvBma/rnfFeqsic0hSpjtDbVxR3dJKLc+KB4V6GgiGOvl7CY/KNh8rxSo9DKQrnUEw==", - "requires": { - "iconv-lite": "0.4.24" - }, - "dependencies": { - "iconv-lite": { - "version": "0.4.24", - "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", - "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", - "requires": { - "safer-buffer": ">= 2.1.2 < 3" - } - } - } - }, - "whatwg-fetch": { - "version": "3.6.2", - "resolved": "https://registry.npmjs.org/whatwg-fetch/-/whatwg-fetch-3.6.2.tgz", - "integrity": "sha512-bJlen0FcuU/0EMLrdbJ7zOnW6ITZLrZMIarMUVmdKtsGvZna8vxKYaexICWPfZ8qwf9fzNq+UEIZrnSaApt6RA==" - }, - "whatwg-mimetype": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/whatwg-mimetype/-/whatwg-mimetype-2.3.0.tgz", - "integrity": "sha512-M4yMwr6mAnQz76TbJm914+gPpB/nCwvZbJU28cUD6dR004SAxDLOOSUaB1JDRqLtaOV/vi0IC5lEAGFgrjGv/g==" - }, - "whatwg-url": { - "version": "8.7.0", - "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-8.7.0.tgz", - "integrity": "sha512-gAojqb/m9Q8a5IV96E3fHJM70AzCkgt4uXYX2O7EmuyOnLrViCQlsEBmF9UQIu3/aeAIp2U17rtbpZWNntQqdg==", - "requires": { - "lodash": "^4.7.0", - "tr46": "^2.1.0", - "webidl-conversions": "^6.1.0" - } - }, - "which": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", - "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", - "requires": { - "isexe": "^2.0.0" - } - }, - "which-boxed-primitive": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/which-boxed-primitive/-/which-boxed-primitive-1.0.2.tgz", - "integrity": "sha512-bwZdv0AKLpplFY2KZRX6TvyuN7ojjr7lwkg6ml0roIy9YeuSr7JS372qlNW18UQYzgYK9ziGcerWqZOmEn9VNg==", - "requires": { - "is-bigint": "^1.0.1", - "is-boolean-object": "^1.1.0", - "is-number-object": "^1.0.4", - "is-string": "^1.0.5", - "is-symbol": "^1.0.3" - } - }, - "word-wrap": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.3.tgz", - "integrity": "sha512-Hz/mrNwitNRh/HUAtM/VT/5VH+ygD6DV7mYKZAtHOrbs8U7lvPS6xf7EJKMF0uW1KJCl0H701g3ZGus+muE5vQ==" - }, - "workbox-background-sync": { - "version": "6.5.3", - "resolved": "https://registry.npmjs.org/workbox-background-sync/-/workbox-background-sync-6.5.3.tgz", - "integrity": "sha512-0DD/V05FAcek6tWv9XYj2w5T/plxhDSpclIcAGjA/b7t/6PdaRkQ7ZgtAX6Q/L7kV7wZ8uYRJUoH11VjNipMZw==", - "requires": { - "idb": "^6.1.4", - "workbox-core": "6.5.3" - } - }, - "workbox-broadcast-update": { - "version": "6.5.3", - "resolved": "https://registry.npmjs.org/workbox-broadcast-update/-/workbox-broadcast-update-6.5.3.tgz", - "integrity": "sha512-4AwCIA5DiDrYhlN+Miv/fp5T3/whNmSL+KqhTwRBTZIL6pvTgE4lVuRzAt1JltmqyMcQ3SEfCdfxczuI4kwFQg==", - "requires": { - "workbox-core": "6.5.3" - } - }, - "workbox-build": { - "version": "6.5.3", - "resolved": "https://registry.npmjs.org/workbox-build/-/workbox-build-6.5.3.tgz", - "integrity": "sha512-8JNHHS7u13nhwIYCDea9MNXBNPHXCs5KDZPKI/ZNTr3f4sMGoD7hgFGecbyjX1gw4z6e9bMpMsOEJNyH5htA/w==", - "requires": { - "@apideck/better-ajv-errors": "^0.3.1", - "@babel/core": "^7.11.1", - "@babel/preset-env": "^7.11.0", - "@babel/runtime": "^7.11.2", - "@rollup/plugin-babel": "^5.2.0", - "@rollup/plugin-node-resolve": "^11.2.1", - "@rollup/plugin-replace": "^2.4.1", - "@surma/rollup-plugin-off-main-thread": "^2.2.3", - "ajv": "^8.6.0", - "common-tags": "^1.8.0", - "fast-json-stable-stringify": "^2.1.0", - "fs-extra": "^9.0.1", - "glob": "^7.1.6", - "lodash": "^4.17.20", - "pretty-bytes": "^5.3.0", - "rollup": "^2.43.1", - "rollup-plugin-terser": "^7.0.0", - "source-map": "^0.8.0-beta.0", - "stringify-object": "^3.3.0", - "strip-comments": "^2.0.1", - "tempy": "^0.6.0", - "upath": "^1.2.0", - "workbox-background-sync": "6.5.3", - "workbox-broadcast-update": "6.5.3", - "workbox-cacheable-response": "6.5.3", - "workbox-core": "6.5.3", - "workbox-expiration": "6.5.3", - "workbox-google-analytics": "6.5.3", - "workbox-navigation-preload": "6.5.3", - "workbox-precaching": "6.5.3", - "workbox-range-requests": "6.5.3", - "workbox-recipes": "6.5.3", - "workbox-routing": "6.5.3", - "workbox-strategies": "6.5.3", - "workbox-streams": "6.5.3", - "workbox-sw": "6.5.3", - "workbox-window": "6.5.3" - }, - "dependencies": { - "@apideck/better-ajv-errors": { - "version": "0.3.6", - "resolved": "https://registry.npmjs.org/@apideck/better-ajv-errors/-/better-ajv-errors-0.3.6.tgz", - "integrity": "sha512-P+ZygBLZtkp0qqOAJJVX4oX/sFo5JR3eBWwwuqHHhK0GIgQOKWrAfiAaWX0aArHkRWHMuggFEgAZNxVPwPZYaA==", - "requires": { - "json-schema": "^0.4.0", - "jsonpointer": "^5.0.0", - "leven": "^3.1.0" - } - }, - "ajv": { - "version": "8.11.0", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.11.0.tgz", - "integrity": "sha512-wGgprdCvMalC0BztXvitD2hC04YffAvtsUn93JbGXYLAtCUO4xd17mCCZQxUOItiBwZvJScWo8NIvQMQ71rdpg==", - "requires": { - "fast-deep-equal": "^3.1.1", - "json-schema-traverse": "^1.0.0", - "require-from-string": "^2.0.2", - "uri-js": "^4.2.2" - } - }, - "fs-extra": { - "version": "9.1.0", - "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-9.1.0.tgz", - "integrity": "sha512-hcg3ZmepS30/7BSFqRvoo3DOMQu7IjqxO5nCDt+zM9XWjb33Wg7ziNT+Qvqbuc3+gWpzO02JubVyk2G4Zvo1OQ==", - "requires": { - "at-least-node": "^1.0.0", - "graceful-fs": "^4.2.0", - "jsonfile": "^6.0.1", - "universalify": "^2.0.0" - } - }, - "json-schema-traverse": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", - "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==" - }, - "source-map": { - "version": "0.8.0-beta.0", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.8.0-beta.0.tgz", - "integrity": "sha512-2ymg6oRBpebeZi9UUNsgQ89bhx01TcTkmNTGnNO88imTmbSgy4nfujrgVEFKWpMTEGA11EDkTt7mqObTPdigIA==", - "requires": { - "whatwg-url": "^7.0.0" - } - }, - "tr46": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/tr46/-/tr46-1.0.1.tgz", - "integrity": "sha512-dTpowEjclQ7Kgx5SdBkqRzVhERQXov8/l9Ft9dVM9fmg0W0KQSVaXX9T4i6twCPNtYiZM53lpSSUAwJbFPOHxA==", - "requires": { - "punycode": "^2.1.0" - } - }, - "webidl-conversions": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-4.0.2.tgz", - "integrity": "sha512-YQ+BmxuTgd6UXZW3+ICGfyqRyHXVlD5GtQr5+qjiNW7bF0cqrzX500HVXPBOvgXb5YnzDd+h0zqyv61KUD7+Sg==" - }, - "whatwg-url": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-7.1.0.tgz", - "integrity": "sha512-WUu7Rg1DroM7oQvGWfOiAK21n74Gg+T4elXEQYkOhtyLeWiJFoOGLXPKI/9gzIie9CtwVLm8wtw6YJdKyxSjeg==", - "requires": { - "lodash.sortby": "^4.7.0", - "tr46": "^1.0.1", - "webidl-conversions": "^4.0.2" - } - } - } - }, - "workbox-cacheable-response": { - "version": "6.5.3", - "resolved": "https://registry.npmjs.org/workbox-cacheable-response/-/workbox-cacheable-response-6.5.3.tgz", - "integrity": "sha512-6JE/Zm05hNasHzzAGKDkqqgYtZZL2H06ic2GxuRLStA4S/rHUfm2mnLFFXuHAaGR1XuuYyVCEey1M6H3PdZ7SQ==", - "requires": { - "workbox-core": "6.5.3" - } - }, - "workbox-core": { - "version": "6.5.3", - "resolved": "https://registry.npmjs.org/workbox-core/-/workbox-core-6.5.3.tgz", - "integrity": "sha512-Bb9ey5n/M9x+l3fBTlLpHt9ASTzgSGj6vxni7pY72ilB/Pb3XtN+cZ9yueboVhD5+9cNQrC9n/E1fSrqWsUz7Q==" - }, - "workbox-expiration": { - "version": "6.5.3", - "resolved": "https://registry.npmjs.org/workbox-expiration/-/workbox-expiration-6.5.3.tgz", - "integrity": "sha512-jzYopYR1zD04ZMdlbn/R2Ik6ixiXbi15c9iX5H8CTi6RPDz7uhvMLZPKEndZTpfgmUk8mdmT9Vx/AhbuCl5Sqw==", - "requires": { - "idb": "^6.1.4", - "workbox-core": "6.5.3" - } - }, - "workbox-google-analytics": { - "version": "6.5.3", - "resolved": "https://registry.npmjs.org/workbox-google-analytics/-/workbox-google-analytics-6.5.3.tgz", - "integrity": "sha512-3GLCHotz5umoRSb4aNQeTbILETcrTVEozSfLhHSBaegHs1PnqCmN0zbIy2TjTpph2AGXiNwDrWGF0AN+UgDNTw==", - "requires": { - "workbox-background-sync": "6.5.3", - "workbox-core": "6.5.3", - "workbox-routing": "6.5.3", - "workbox-strategies": "6.5.3" - } - }, - "workbox-navigation-preload": { - "version": "6.5.3", - "resolved": "https://registry.npmjs.org/workbox-navigation-preload/-/workbox-navigation-preload-6.5.3.tgz", - "integrity": "sha512-bK1gDFTc5iu6lH3UQ07QVo+0ovErhRNGvJJO/1ngknT0UQ702nmOUhoN9qE5mhuQSrnK+cqu7O7xeaJ+Rd9Tmg==", - "requires": { - "workbox-core": "6.5.3" - } - }, - "workbox-precaching": { - "version": "6.5.3", - "resolved": "https://registry.npmjs.org/workbox-precaching/-/workbox-precaching-6.5.3.tgz", - "integrity": "sha512-sjNfgNLSsRX5zcc63H/ar/hCf+T19fRtTqvWh795gdpghWb5xsfEkecXEvZ8biEi1QD7X/ljtHphdaPvXDygMQ==", - "requires": { - "workbox-core": "6.5.3", - "workbox-routing": "6.5.3", - "workbox-strategies": "6.5.3" - } - }, - "workbox-range-requests": { - "version": "6.5.3", - "resolved": "https://registry.npmjs.org/workbox-range-requests/-/workbox-range-requests-6.5.3.tgz", - "integrity": "sha512-pGCP80Bpn/0Q0MQsfETSfmtXsQcu3M2QCJwSFuJ6cDp8s2XmbUXkzbuQhCUzKR86ZH2Vex/VUjb2UaZBGamijA==", - "requires": { - "workbox-core": "6.5.3" - } - }, - "workbox-recipes": { - "version": "6.5.3", - "resolved": "https://registry.npmjs.org/workbox-recipes/-/workbox-recipes-6.5.3.tgz", - "integrity": "sha512-IcgiKYmbGiDvvf3PMSEtmwqxwfQ5zwI7OZPio3GWu4PfehA8jI8JHI3KZj+PCfRiUPZhjQHJ3v1HbNs+SiSkig==", - "requires": { - "workbox-cacheable-response": "6.5.3", - "workbox-core": "6.5.3", - "workbox-expiration": "6.5.3", - "workbox-precaching": "6.5.3", - "workbox-routing": "6.5.3", - "workbox-strategies": "6.5.3" - } - }, - "workbox-routing": { - "version": "6.5.3", - "resolved": "https://registry.npmjs.org/workbox-routing/-/workbox-routing-6.5.3.tgz", - "integrity": "sha512-DFjxcuRAJjjt4T34RbMm3MCn+xnd36UT/2RfPRfa8VWJGItGJIn7tG+GwVTdHmvE54i/QmVTJepyAGWtoLPTmg==", - "requires": { - "workbox-core": "6.5.3" - } - }, - "workbox-strategies": { - "version": "6.5.3", - "resolved": "https://registry.npmjs.org/workbox-strategies/-/workbox-strategies-6.5.3.tgz", - "integrity": "sha512-MgmGRrDVXs7rtSCcetZgkSZyMpRGw8HqL2aguszOc3nUmzGZsT238z/NN9ZouCxSzDu3PQ3ZSKmovAacaIhu1w==", - "requires": { - "workbox-core": "6.5.3" - } - }, - "workbox-streams": { - "version": "6.5.3", - "resolved": "https://registry.npmjs.org/workbox-streams/-/workbox-streams-6.5.3.tgz", - "integrity": "sha512-vN4Qi8o+b7zj1FDVNZ+PlmAcy1sBoV7SC956uhqYvZ9Sg1fViSbOpydULOssVJ4tOyKRifH/eoi6h99d+sJ33w==", - "requires": { - "workbox-core": "6.5.3", - "workbox-routing": "6.5.3" - } - }, - "workbox-sw": { - "version": "6.5.3", - "resolved": "https://registry.npmjs.org/workbox-sw/-/workbox-sw-6.5.3.tgz", - "integrity": "sha512-BQBzm092w+NqdIEF2yhl32dERt9j9MDGUTa2Eaa+o3YKL4Qqw55W9yQC6f44FdAHdAJrJvp0t+HVrfh8AiGj8A==" - }, - "workbox-webpack-plugin": { - "version": "6.5.3", - "resolved": "https://registry.npmjs.org/workbox-webpack-plugin/-/workbox-webpack-plugin-6.5.3.tgz", - "integrity": "sha512-Es8Xr02Gi6Kc3zaUwR691ZLy61hz3vhhs5GztcklQ7kl5k2qAusPh0s6LF3wEtlpfs9ZDErnmy5SErwoll7jBA==", - "requires": { - "fast-json-stable-stringify": "^2.1.0", - "pretty-bytes": "^5.4.1", - "upath": "^1.2.0", - "webpack-sources": "^1.4.3", - "workbox-build": "6.5.3" - }, - "dependencies": { - "source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==" - }, - "webpack-sources": { - "version": "1.4.3", - "resolved": "https://registry.npmjs.org/webpack-sources/-/webpack-sources-1.4.3.tgz", - "integrity": "sha512-lgTS3Xhv1lCOKo7SA5TjKXMjpSM4sBjNV5+q2bqesbSPs5FjGmU6jjtBSkX9b4qW87vDIsCIlUPOEhbZrMdjeQ==", - "requires": { - "source-list-map": "^2.0.0", - "source-map": "~0.6.1" - } - } - } - }, - "workbox-window": { - "version": "6.5.3", - "resolved": "https://registry.npmjs.org/workbox-window/-/workbox-window-6.5.3.tgz", - "integrity": "sha512-GnJbx1kcKXDtoJBVZs/P7ddP0Yt52NNy4nocjBpYPiRhMqTpJCNrSL+fGHZ/i/oP6p/vhE8II0sA6AZGKGnssw==", - "requires": { - "@types/trusted-types": "^2.0.2", - "workbox-core": "6.5.3" - } - }, - "wrap-ansi": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", - "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", - "requires": { - "ansi-styles": "^4.0.0", - "string-width": "^4.1.0", - "strip-ansi": "^6.0.0" - }, - "dependencies": { - "ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "requires": { - "color-convert": "^2.0.1" - } - }, - "color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "requires": { - "color-name": "~1.1.4" - } - }, - "color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" - } - } - }, - "wrappy": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", - "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==" - }, - "write-file-atomic": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-3.0.3.tgz", - "integrity": "sha512-AvHcyZ5JnSfq3ioSyjrBkH9yW4m7Ayk8/9My/DD9onKeu/94fwrMocemO2QAJFAlnnDN+ZDS+ZjAR5ua1/PV/Q==", - "requires": { - "imurmurhash": "^0.1.4", - "is-typedarray": "^1.0.0", - "signal-exit": "^3.0.2", - "typedarray-to-buffer": "^3.1.5" - } - }, - "ws": { - "version": "7.5.8", - "resolved": "https://registry.npmjs.org/ws/-/ws-7.5.8.tgz", - "integrity": "sha512-ri1Id1WinAX5Jqn9HejiGb8crfRio0Qgu8+MtL36rlTA6RLsMdWt1Az/19A2Qij6uSHUMphEFaTKa4WG+UNHNw==", - "requires": {} - }, - "xml-name-validator": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/xml-name-validator/-/xml-name-validator-3.0.0.tgz", - "integrity": "sha512-A5CUptxDsvxKJEU3yO6DuWBSJz/qizqzJKOMIfUJHETbBw/sFaDxgd6fxm1ewUaM0jZ444Fc5vC5ROYurg/4Pw==" - }, - "xmlchars": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/xmlchars/-/xmlchars-2.2.0.tgz", - "integrity": "sha512-JZnDKK8B0RCDw84FNdDAIpZK+JuJw+s7Lz8nksI7SIuU3UXJJslUthsi+uWBUYOwPFwW7W7PRLRfUKpxjtjFCw==" - }, - "xtend": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.2.tgz", - "integrity": "sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ==" - }, - "y18n": { - "version": "5.0.8", - "resolved": "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz", - "integrity": "sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==" - }, - "yallist": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", - "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==" - }, - "yaml": { - "version": "1.10.2", - "resolved": "https://registry.npmjs.org/yaml/-/yaml-1.10.2.tgz", - "integrity": "sha512-r3vXyErRCYJ7wg28yvBY5VSoAF8ZvlcW9/BwUzEtUsjvX/DKs24dIkuwjtuprwJJHsbyUbLApepYTR1BN4uHrg==" - }, - "yargs": { - "version": "16.2.0", - "resolved": "https://registry.npmjs.org/yargs/-/yargs-16.2.0.tgz", - "integrity": "sha512-D1mvvtDG0L5ft/jGWkLpG1+m0eQxOfaBvTNELraWj22wSVUMWxZUvYgJYcKh6jGGIkJFhH4IZPQhR4TKpc8mBw==", - "requires": { - "cliui": "^7.0.2", - "escalade": "^3.1.1", - "get-caller-file": "^2.0.5", - "require-directory": "^2.1.1", - "string-width": "^4.2.0", - "y18n": "^5.0.5", - "yargs-parser": "^20.2.2" - } - }, - "yargs-parser": { - "version": "20.2.9", - "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-20.2.9.tgz", - "integrity": "sha512-y11nGElTIV+CT3Zv9t7VKl+Q3hTQoT9a1Qzezhhl6Rp21gJ/IVTW7Z3y9EWXhuUBC2Shnf+DX0antecpAwSP8w==" - }, - "yocto-queue": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz", - "integrity": "sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==" - } } } diff --git a/frontend/package.json b/frontend/package.json index a7bf0bd..03938a6 100644 --- a/frontend/package.json +++ b/frontend/package.json @@ -3,13 +3,32 @@ "version": "0.1.0", "private": true, "dependencies": { - "@testing-library/jest-dom": "^5.16.4", - "@testing-library/react": "^13.3.0", - "@testing-library/user-event": "^13.5.0", + "@emotion/react": "^11.10.5", + "@emotion/styled": "^11.10.5", + "@mui/icons-material": "^5.11.0", + "@mui/material": "^5.11.6", + "@reduxjs/toolkit": "^1.9.3", + "axios": "^1.2.2", + "bootstrap": "^4.6.2", + "eslint": "^8.34.0", + "form-data": "^4.0.0", + "jest-watcher": "^29.4.1", + "jslint": "^0.12.1", "react": "^18.2.0", + "react-alert": "^7.0.3", + "react-alert-template-basic": "^1.0.2", + "react-bootstrap": "^1.5.2", + "react-datepicker": "^4.10.0", "react-dom": "^18.2.0", - "react-scripts": "5.0.1", - "web-vitals": "^2.1.4" + "react-redux": "^8.0.5", + "react-router-dom": "^5.2.0", + "react-scripts": "5.0.0", + "react-select": "^5.7.0", + "react-slick": "^0.28.1", + "react-tradingview-embed": "^2.2.6", + "sass": "^1.47.0", + "slick-carousel": "^1.8.1", + "web-vitals": "^2.1.3" }, "scripts": { "start": "react-scripts start", diff --git a/frontend/public/favicon.ico b/frontend/public/favicon.ico index a11777cc471a4344702741ab1c8a588998b1311a..67dc31e4070331831b49a9895daeda5be3036983 100644 GIT binary patch literal 946 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 baj7?x%VD!5Cxk2YbYLNVeiXvvpMCWYo=by@ diff --git a/frontend/public/index.html b/frontend/public/index.html index aa069f2..abf0eb9 100644 --- a/frontend/public/index.html +++ b/frontend/public/index.html @@ -24,7 +24,7 @@ work correctly both with client-side routing and a non-root public URL. Learn how to configure a non-root public URL by running `npm run build`. --> - React App + MongoTech diff --git a/frontend/public/logo192.png b/frontend/public/logo192.png deleted file mode 100644 index fc44b0a3796c0e0a64c3d858ca038bd4570465d9..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 5347 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 b{|{}U^kRn2wo}j7|0ATu<;8xA7zX}7|B6mN diff --git a/frontend/public/manifest.json b/frontend/public/manifest.json index 080d6c7..f9051fe 100644 --- a/frontend/public/manifest.json +++ b/frontend/public/manifest.json @@ -1,23 +1,6 @@ { "short_name": "React App", "name": "Create React App Sample", - "icons": [ - { - "src": "favicon.ico", - "sizes": "64x64 32x32 24x24 16x16", - "type": "image/x-icon" - }, - { - "src": "logo192.png", - "type": "image/png", - "sizes": "192x192" - }, - { - "src": "logo512.png", - "type": "image/png", - "sizes": "512x512" - } - ], "start_url": ".", "display": "standalone", "theme_color": "#000000", diff --git a/frontend/src/App.css b/frontend/src/App.css deleted file mode 100644 index 74b5e05..0000000 --- a/frontend/src/App.css +++ /dev/null @@ -1,38 +0,0 @@ -.App { - text-align: center; -} - -.App-logo { - height: 40vmin; - pointer-events: none; -} - -@media (prefers-reduced-motion: no-preference) { - .App-logo { - animation: App-logo-spin infinite 20s linear; - } -} - -.App-header { - background-color: #282c34; - min-height: 100vh; - display: flex; - flex-direction: column; - align-items: center; - justify-content: center; - font-size: calc(10px + 2vmin); - color: white; -} - -.App-link { - color: #61dafb; -} - -@keyframes App-logo-spin { - from { - transform: rotate(0deg); - } - to { - transform: rotate(360deg); - } -} diff --git a/frontend/src/App.js b/frontend/src/App.js deleted file mode 100644 index 3784575..0000000 --- a/frontend/src/App.js +++ /dev/null @@ -1,25 +0,0 @@ -import logo from './logo.svg'; -import './App.css'; - -function App() { - return ( - - ); -} - -export default App; diff --git a/frontend/src/App.test.js b/frontend/src/App.test.js deleted file mode 100644 index 1f03afe..0000000 --- a/frontend/src/App.test.js +++ /dev/null @@ -1,8 +0,0 @@ -import { render, screen } from '@testing-library/react'; -import App from './App'; - -test('renders learn react link', () => { - render(); - const linkElement = screen.getByText(/learn react/i); - expect(linkElement).toBeInTheDocument(); -}); diff --git a/frontend/src/assets/css/ionicons.min.css b/frontend/src/assets/css/ionicons.min.css new file mode 100644 index 0000000..fde8597 --- /dev/null +++ b/frontend/src/assets/css/ionicons.min.css @@ -0,0 +1,11 @@ +/*! + Ionicons, v4.5.9-1 + Created by Ben Sperry for the Ionic Framework, http://ionicons.com/ + https://twitter.com/benjsperry https://twitter.com/ionicframework + MIT License: https://github.com/driftyco/ionicons + + Android-style icons originally built by Google’s + Material Design Icons: https://github.com/google/material-design-icons + used under CC BY http://creativecommons.org/licenses/by/4.0/ + Modified icons to fit ionicon’s grid from original. + */@font-face{font-family:"Ionicons";src:url("../fonts/ionicons.eot?v=4.5.9-1");src:url("../fonts/ionicons.eot?v=4.5.9-1#iefix") format("embedded-opentype"),url("../fonts/ionicons.woff2?v=4.5.9-1") format("woff2"),url("../fonts/ionicons.woff?v=4.5.9-1") format("woff"),url("../fonts/ionicons.ttf?v=4.5.9-1") format("truetype"),url("../fonts/ionicons.svg?v=4.5.9-1#Ionicons") format("svg");font-weight:normal;font-style:normal}.ion,.ionicons,.ion-ios-add:before,.ion-ios-add-circle:before,.ion-ios-add-circle-outline:before,.ion-ios-airplane:before,.ion-ios-alarm:before,.ion-ios-albums:before,.ion-ios-alert:before,.ion-ios-american-football:before,.ion-ios-analytics:before,.ion-ios-aperture:before,.ion-ios-apps:before,.ion-ios-appstore:before,.ion-ios-archive:before,.ion-ios-arrow-back:before,.ion-ios-arrow-down:before,.ion-ios-arrow-dropdown:before,.ion-ios-arrow-dropdown-circle:before,.ion-ios-arrow-dropleft:before,.ion-ios-arrow-dropleft-circle:before,.ion-ios-arrow-dropright:before,.ion-ios-arrow-dropright-circle:before,.ion-ios-arrow-dropup:before,.ion-ios-arrow-dropup-circle:before,.ion-ios-arrow-forward:before,.ion-ios-arrow-round-back:before,.ion-ios-arrow-round-down:before,.ion-ios-arrow-round-forward:before,.ion-ios-arrow-round-up:before,.ion-ios-arrow-up:before,.ion-ios-at:before,.ion-ios-attach:before,.ion-ios-backspace:before,.ion-ios-barcode:before,.ion-ios-baseball:before,.ion-ios-basket:before,.ion-ios-basketball:before,.ion-ios-battery-charging:before,.ion-ios-battery-dead:before,.ion-ios-battery-full:before,.ion-ios-beaker:before,.ion-ios-bed:before,.ion-ios-beer:before,.ion-ios-bicycle:before,.ion-ios-bluetooth:before,.ion-ios-boat:before,.ion-ios-body:before,.ion-ios-bonfire:before,.ion-ios-book:before,.ion-ios-bookmark:before,.ion-ios-bookmarks:before,.ion-ios-bowtie:before,.ion-ios-briefcase:before,.ion-ios-browsers:before,.ion-ios-brush:before,.ion-ios-bug:before,.ion-ios-build:before,.ion-ios-bulb:before,.ion-ios-bus:before,.ion-ios-business:before,.ion-ios-cafe:before,.ion-ios-calculator:before,.ion-ios-calendar:before,.ion-ios-call:before,.ion-ios-camera:before,.ion-ios-car:before,.ion-ios-card:before,.ion-ios-cart:before,.ion-ios-cash:before,.ion-ios-cellular:before,.ion-ios-chatboxes:before,.ion-ios-chatbubbles:before,.ion-ios-checkbox:before,.ion-ios-checkbox-outline:before,.ion-ios-checkmark:before,.ion-ios-checkmark-circle:before,.ion-ios-checkmark-circle-outline:before,.ion-ios-clipboard:before,.ion-ios-clock:before,.ion-ios-close:before,.ion-ios-close-circle:before,.ion-ios-close-circle-outline:before,.ion-ios-cloud:before,.ion-ios-cloud-circle:before,.ion-ios-cloud-done:before,.ion-ios-cloud-download:before,.ion-ios-cloud-outline:before,.ion-ios-cloud-upload:before,.ion-ios-cloudy:before,.ion-ios-cloudy-night:before,.ion-ios-code:before,.ion-ios-code-download:before,.ion-ios-code-working:before,.ion-ios-cog:before,.ion-ios-color-fill:before,.ion-ios-color-filter:before,.ion-ios-color-palette:before,.ion-ios-color-wand:before,.ion-ios-compass:before,.ion-ios-construct:before,.ion-ios-contact:before,.ion-ios-contacts:before,.ion-ios-contract:before,.ion-ios-contrast:before,.ion-ios-copy:before,.ion-ios-create:before,.ion-ios-crop:before,.ion-ios-cube:before,.ion-ios-cut:before,.ion-ios-desktop:before,.ion-ios-disc:before,.ion-ios-document:before,.ion-ios-done-all:before,.ion-ios-download:before,.ion-ios-easel:before,.ion-ios-egg:before,.ion-ios-exit:before,.ion-ios-expand:before,.ion-ios-eye:before,.ion-ios-eye-off:before,.ion-ios-fastforward:before,.ion-ios-female:before,.ion-ios-filing:before,.ion-ios-film:before,.ion-ios-finger-print:before,.ion-ios-fitness:before,.ion-ios-flag:before,.ion-ios-flame:before,.ion-ios-flash:before,.ion-ios-flash-off:before,.ion-ios-flashlight:before,.ion-ios-flask:before,.ion-ios-flower:before,.ion-ios-folder:before,.ion-ios-folder-open:before,.ion-ios-football:before,.ion-ios-funnel:before,.ion-ios-gift:before,.ion-ios-git-branch:before,.ion-ios-git-commit:before,.ion-ios-git-compare:before,.ion-ios-git-merge:before,.ion-ios-git-network:before,.ion-ios-git-pull-request:before,.ion-ios-glasses:before,.ion-ios-globe:before,.ion-ios-grid:before,.ion-ios-hammer:before,.ion-ios-hand:before,.ion-ios-happy:before,.ion-ios-headset:before,.ion-ios-heart:before,.ion-ios-heart-dislike:before,.ion-ios-heart-empty:before,.ion-ios-heart-half:before,.ion-ios-help:before,.ion-ios-help-buoy:before,.ion-ios-help-circle:before,.ion-ios-help-circle-outline:before,.ion-ios-home:before,.ion-ios-hourglass:before,.ion-ios-ice-cream:before,.ion-ios-image:before,.ion-ios-images:before,.ion-ios-infinite:before,.ion-ios-information:before,.ion-ios-information-circle:before,.ion-ios-information-circle-outline:before,.ion-ios-jet:before,.ion-ios-journal:before,.ion-ios-key:before,.ion-ios-keypad:before,.ion-ios-laptop:before,.ion-ios-leaf:before,.ion-ios-link:before,.ion-ios-list:before,.ion-ios-list-box:before,.ion-ios-locate:before,.ion-ios-lock:before,.ion-ios-log-in:before,.ion-ios-log-out:before,.ion-ios-magnet:before,.ion-ios-mail:before,.ion-ios-mail-open:before,.ion-ios-mail-unread:before,.ion-ios-male:before,.ion-ios-man:before,.ion-ios-map:before,.ion-ios-medal:before,.ion-ios-medical:before,.ion-ios-medkit:before,.ion-ios-megaphone:before,.ion-ios-menu:before,.ion-ios-mic:before,.ion-ios-mic-off:before,.ion-ios-microphone:before,.ion-ios-moon:before,.ion-ios-more:before,.ion-ios-move:before,.ion-ios-musical-note:before,.ion-ios-musical-notes:before,.ion-ios-navigate:before,.ion-ios-notifications:before,.ion-ios-notifications-off:before,.ion-ios-notifications-outline:before,.ion-ios-nuclear:before,.ion-ios-nutrition:before,.ion-ios-open:before,.ion-ios-options:before,.ion-ios-outlet:before,.ion-ios-paper:before,.ion-ios-paper-plane:before,.ion-ios-partly-sunny:before,.ion-ios-pause:before,.ion-ios-paw:before,.ion-ios-people:before,.ion-ios-person:before,.ion-ios-person-add:before,.ion-ios-phone-landscape:before,.ion-ios-phone-portrait:before,.ion-ios-photos:before,.ion-ios-pie:before,.ion-ios-pin:before,.ion-ios-pint:before,.ion-ios-pizza:before,.ion-ios-planet:before,.ion-ios-play:before,.ion-ios-play-circle:before,.ion-ios-podium:before,.ion-ios-power:before,.ion-ios-pricetag:before,.ion-ios-pricetags:before,.ion-ios-print:before,.ion-ios-pulse:before,.ion-ios-qr-scanner:before,.ion-ios-quote:before,.ion-ios-radio:before,.ion-ios-radio-button-off:before,.ion-ios-radio-button-on:before,.ion-ios-rainy:before,.ion-ios-recording:before,.ion-ios-redo:before,.ion-ios-refresh:before,.ion-ios-refresh-circle:before,.ion-ios-remove:before,.ion-ios-remove-circle:before,.ion-ios-remove-circle-outline:before,.ion-ios-reorder:before,.ion-ios-repeat:before,.ion-ios-resize:before,.ion-ios-restaurant:before,.ion-ios-return-left:before,.ion-ios-return-right:before,.ion-ios-reverse-camera:before,.ion-ios-rewind:before,.ion-ios-ribbon:before,.ion-ios-rocket:before,.ion-ios-rose:before,.ion-ios-sad:before,.ion-ios-save:before,.ion-ios-school:before,.ion-ios-search:before,.ion-ios-send:before,.ion-ios-settings:before,.ion-ios-share:before,.ion-ios-share-alt:before,.ion-ios-shirt:before,.ion-ios-shuffle:before,.ion-ios-skip-backward:before,.ion-ios-skip-forward:before,.ion-ios-snow:before,.ion-ios-speedometer:before,.ion-ios-square:before,.ion-ios-square-outline:before,.ion-ios-star:before,.ion-ios-star-half:before,.ion-ios-star-outline:before,.ion-ios-stats:before,.ion-ios-stopwatch:before,.ion-ios-subway:before,.ion-ios-sunny:before,.ion-ios-swap:before,.ion-ios-switch:before,.ion-ios-sync:before,.ion-ios-tablet-landscape:before,.ion-ios-tablet-portrait:before,.ion-ios-tennisball:before,.ion-ios-text:before,.ion-ios-thermometer:before,.ion-ios-thumbs-down:before,.ion-ios-thumbs-up:before,.ion-ios-thunderstorm:before,.ion-ios-time:before,.ion-ios-timer:before,.ion-ios-today:before,.ion-ios-train:before,.ion-ios-transgender:before,.ion-ios-trash:before,.ion-ios-trending-down:before,.ion-ios-trending-up:before,.ion-ios-trophy:before,.ion-ios-tv:before,.ion-ios-umbrella:before,.ion-ios-undo:before,.ion-ios-unlock:before,.ion-ios-videocam:before,.ion-ios-volume-high:before,.ion-ios-volume-low:before,.ion-ios-volume-mute:before,.ion-ios-volume-off:before,.ion-ios-walk:before,.ion-ios-wallet:before,.ion-ios-warning:before,.ion-ios-watch:before,.ion-ios-water:before,.ion-ios-wifi:before,.ion-ios-wine:before,.ion-ios-woman:before,.ion-logo-android:before,.ion-logo-angular:before,.ion-logo-apple:before,.ion-logo-bitbucket:before,.ion-logo-bitcoin:before,.ion-logo-buffer:before,.ion-logo-chrome:before,.ion-logo-closed-captioning:before,.ion-logo-codepen:before,.ion-logo-css3:before,.ion-logo-designernews:before,.ion-logo-dribbble:before,.ion-logo-dropbox:before,.ion-logo-euro:before,.ion-logo-facebook:before,.ion-logo-flickr:before,.ion-logo-foursquare:before,.ion-logo-freebsd-devil:before,.ion-logo-game-controller-a:before,.ion-logo-game-controller-b:before,.ion-logo-github:before,.ion-logo-google:before,.ion-logo-googleplus:before,.ion-logo-hackernews:before,.ion-logo-html5:before,.ion-logo-instagram:before,.ion-logo-ionic:before,.ion-logo-ionitron:before,.ion-logo-javascript:before,.ion-logo-linkedin:before,.ion-logo-markdown:before,.ion-logo-model-s:before,.ion-logo-no-smoking:before,.ion-logo-nodejs:before,.ion-logo-npm:before,.ion-logo-octocat:before,.ion-logo-pinterest:before,.ion-logo-playstation:before,.ion-logo-polymer:before,.ion-logo-python:before,.ion-logo-reddit:before,.ion-logo-rss:before,.ion-logo-sass:before,.ion-logo-skype:before,.ion-logo-slack:before,.ion-logo-snapchat:before,.ion-logo-steam:before,.ion-logo-tumblr:before,.ion-logo-tux:before,.ion-logo-twitch:before,.ion-logo-twitter:before,.ion-logo-usd:before,.ion-logo-vimeo:before,.ion-logo-vk:before,.ion-logo-whatsapp:before,.ion-logo-windows:before,.ion-logo-wordpress:before,.ion-logo-xbox:before,.ion-logo-xing:before,.ion-logo-yahoo:before,.ion-logo-yen:before,.ion-logo-youtube:before,.ion-md-add:before,.ion-md-add-circle:before,.ion-md-add-circle-outline:before,.ion-md-airplane:before,.ion-md-alarm:before,.ion-md-albums:before,.ion-md-alert:before,.ion-md-american-football:before,.ion-md-analytics:before,.ion-md-aperture:before,.ion-md-apps:before,.ion-md-appstore:before,.ion-md-archive:before,.ion-md-arrow-back:before,.ion-md-arrow-down:before,.ion-md-arrow-dropdown:before,.ion-md-arrow-dropdown-circle:before,.ion-md-arrow-dropleft:before,.ion-md-arrow-dropleft-circle:before,.ion-md-arrow-dropright:before,.ion-md-arrow-dropright-circle:before,.ion-md-arrow-dropup:before,.ion-md-arrow-dropup-circle:before,.ion-md-arrow-forward:before,.ion-md-arrow-round-back:before,.ion-md-arrow-round-down:before,.ion-md-arrow-round-forward:before,.ion-md-arrow-round-up:before,.ion-md-arrow-up:before,.ion-md-at:before,.ion-md-attach:before,.ion-md-backspace:before,.ion-md-barcode:before,.ion-md-baseball:before,.ion-md-basket:before,.ion-md-basketball:before,.ion-md-battery-charging:before,.ion-md-battery-dead:before,.ion-md-battery-full:before,.ion-md-beaker:before,.ion-md-bed:before,.ion-md-beer:before,.ion-md-bicycle:before,.ion-md-bluetooth:before,.ion-md-boat:before,.ion-md-body:before,.ion-md-bonfire:before,.ion-md-book:before,.ion-md-bookmark:before,.ion-md-bookmarks:before,.ion-md-bowtie:before,.ion-md-briefcase:before,.ion-md-browsers:before,.ion-md-brush:before,.ion-md-bug:before,.ion-md-build:before,.ion-md-bulb:before,.ion-md-bus:before,.ion-md-business:before,.ion-md-cafe:before,.ion-md-calculator:before,.ion-md-calendar:before,.ion-md-call:before,.ion-md-camera:before,.ion-md-car:before,.ion-md-card:before,.ion-md-cart:before,.ion-md-cash:before,.ion-md-cellular:before,.ion-md-chatboxes:before,.ion-md-chatbubbles:before,.ion-md-checkbox:before,.ion-md-checkbox-outline:before,.ion-md-checkmark:before,.ion-md-checkmark-circle:before,.ion-md-checkmark-circle-outline:before,.ion-md-clipboard:before,.ion-md-clock:before,.ion-md-close:before,.ion-md-close-circle:before,.ion-md-close-circle-outline:before,.ion-md-cloud:before,.ion-md-cloud-circle:before,.ion-md-cloud-done:before,.ion-md-cloud-download:before,.ion-md-cloud-outline:before,.ion-md-cloud-upload:before,.ion-md-cloudy:before,.ion-md-cloudy-night:before,.ion-md-code:before,.ion-md-code-download:before,.ion-md-code-working:before,.ion-md-cog:before,.ion-md-color-fill:before,.ion-md-color-filter:before,.ion-md-color-palette:before,.ion-md-color-wand:before,.ion-md-compass:before,.ion-md-construct:before,.ion-md-contact:before,.ion-md-contacts:before,.ion-md-contract:before,.ion-md-contrast:before,.ion-md-copy:before,.ion-md-create:before,.ion-md-crop:before,.ion-md-cube:before,.ion-md-cut:before,.ion-md-desktop:before,.ion-md-disc:before,.ion-md-document:before,.ion-md-done-all:before,.ion-md-download:before,.ion-md-easel:before,.ion-md-egg:before,.ion-md-exit:before,.ion-md-expand:before,.ion-md-eye:before,.ion-md-eye-off:before,.ion-md-fastforward:before,.ion-md-female:before,.ion-md-filing:before,.ion-md-film:before,.ion-md-finger-print:before,.ion-md-fitness:before,.ion-md-flag:before,.ion-md-flame:before,.ion-md-flash:before,.ion-md-flash-off:before,.ion-md-flashlight:before,.ion-md-flask:before,.ion-md-flower:before,.ion-md-folder:before,.ion-md-folder-open:before,.ion-md-football:before,.ion-md-funnel:before,.ion-md-gift:before,.ion-md-git-branch:before,.ion-md-git-commit:before,.ion-md-git-compare:before,.ion-md-git-merge:before,.ion-md-git-network:before,.ion-md-git-pull-request:before,.ion-md-glasses:before,.ion-md-globe:before,.ion-md-grid:before,.ion-md-hammer:before,.ion-md-hand:before,.ion-md-happy:before,.ion-md-headset:before,.ion-md-heart:before,.ion-md-heart-dislike:before,.ion-md-heart-empty:before,.ion-md-heart-half:before,.ion-md-help:before,.ion-md-help-buoy:before,.ion-md-help-circle:before,.ion-md-help-circle-outline:before,.ion-md-home:before,.ion-md-hourglass:before,.ion-md-ice-cream:before,.ion-md-image:before,.ion-md-images:before,.ion-md-infinite:before,.ion-md-information:before,.ion-md-information-circle:before,.ion-md-information-circle-outline:before,.ion-md-jet:before,.ion-md-journal:before,.ion-md-key:before,.ion-md-keypad:before,.ion-md-laptop:before,.ion-md-leaf:before,.ion-md-link:before,.ion-md-list:before,.ion-md-list-box:before,.ion-md-locate:before,.ion-md-lock:before,.ion-md-log-in:before,.ion-md-log-out:before,.ion-md-magnet:before,.ion-md-mail:before,.ion-md-mail-open:before,.ion-md-mail-unread:before,.ion-md-male:before,.ion-md-man:before,.ion-md-map:before,.ion-md-medal:before,.ion-md-medical:before,.ion-md-medkit:before,.ion-md-megaphone:before,.ion-md-menu:before,.ion-md-mic:before,.ion-md-mic-off:before,.ion-md-microphone:before,.ion-md-moon:before,.ion-md-more:before,.ion-md-move:before,.ion-md-musical-note:before,.ion-md-musical-notes:before,.ion-md-navigate:before,.ion-md-notifications:before,.ion-md-notifications-off:before,.ion-md-notifications-outline:before,.ion-md-nuclear:before,.ion-md-nutrition:before,.ion-md-open:before,.ion-md-options:before,.ion-md-outlet:before,.ion-md-paper:before,.ion-md-paper-plane:before,.ion-md-partly-sunny:before,.ion-md-pause:before,.ion-md-paw:before,.ion-md-people:before,.ion-md-person:before,.ion-md-person-add:before,.ion-md-phone-landscape:before,.ion-md-phone-portrait:before,.ion-md-photos:before,.ion-md-pie:before,.ion-md-pin:before,.ion-md-pint:before,.ion-md-pizza:before,.ion-md-planet:before,.ion-md-play:before,.ion-md-play-circle:before,.ion-md-podium:before,.ion-md-power:before,.ion-md-pricetag:before,.ion-md-pricetags:before,.ion-md-print:before,.ion-md-pulse:before,.ion-md-qr-scanner:before,.ion-md-quote:before,.ion-md-radio:before,.ion-md-radio-button-off:before,.ion-md-radio-button-on:before,.ion-md-rainy:before,.ion-md-recording:before,.ion-md-redo:before,.ion-md-refresh:before,.ion-md-refresh-circle:before,.ion-md-remove:before,.ion-md-remove-circle:before,.ion-md-remove-circle-outline:before,.ion-md-reorder:before,.ion-md-repeat:before,.ion-md-resize:before,.ion-md-restaurant:before,.ion-md-return-left:before,.ion-md-return-right:before,.ion-md-reverse-camera:before,.ion-md-rewind:before,.ion-md-ribbon:before,.ion-md-rocket:before,.ion-md-rose:before,.ion-md-sad:before,.ion-md-save:before,.ion-md-school:before,.ion-md-search:before,.ion-md-send:before,.ion-md-settings:before,.ion-md-share:before,.ion-md-share-alt:before,.ion-md-shirt:before,.ion-md-shuffle:before,.ion-md-skip-backward:before,.ion-md-skip-forward:before,.ion-md-snow:before,.ion-md-speedometer:before,.ion-md-square:before,.ion-md-square-outline:before,.ion-md-star:before,.ion-md-star-half:before,.ion-md-star-outline:before,.ion-md-stats:before,.ion-md-stopwatch:before,.ion-md-subway:before,.ion-md-sunny:before,.ion-md-swap:before,.ion-md-switch:before,.ion-md-sync:before,.ion-md-tablet-landscape:before,.ion-md-tablet-portrait:before,.ion-md-tennisball:before,.ion-md-text:before,.ion-md-thermometer:before,.ion-md-thumbs-down:before,.ion-md-thumbs-up:before,.ion-md-thunderstorm:before,.ion-md-time:before,.ion-md-timer:before,.ion-md-today:before,.ion-md-train:before,.ion-md-transgender:before,.ion-md-trash:before,.ion-md-trending-down:before,.ion-md-trending-up:before,.ion-md-trophy:before,.ion-md-tv:before,.ion-md-umbrella:before,.ion-md-undo:before,.ion-md-unlock:before,.ion-md-videocam:before,.ion-md-volume-high:before,.ion-md-volume-low:before,.ion-md-volume-mute:before,.ion-md-volume-off:before,.ion-md-walk:before,.ion-md-wallet:before,.ion-md-warning:before,.ion-md-watch:before,.ion-md-water:before,.ion-md-wifi:before,.ion-md-wine:before,.ion-md-woman:before{display:inline-block;font-family:"Ionicons";speak:none;font-style:normal;font-weight:normal;font-variant:normal;text-transform:none;text-rendering:auto;line-height:1;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}.ion-ios-add:before{content:""}.ion-ios-add-circle:before{content:""}.ion-ios-add-circle-outline:before{content:""}.ion-ios-airplane:before{content:""}.ion-ios-alarm:before{content:""}.ion-ios-albums:before{content:""}.ion-ios-alert:before{content:""}.ion-ios-american-football:before{content:""}.ion-ios-analytics:before{content:""}.ion-ios-aperture:before{content:""}.ion-ios-apps:before{content:""}.ion-ios-appstore:before{content:""}.ion-ios-archive:before{content:""}.ion-ios-arrow-back:before{content:""}.ion-ios-arrow-down:before{content:""}.ion-ios-arrow-dropdown:before{content:""}.ion-ios-arrow-dropdown-circle:before{content:""}.ion-ios-arrow-dropleft:before{content:""}.ion-ios-arrow-dropleft-circle:before{content:""}.ion-ios-arrow-dropright:before{content:""}.ion-ios-arrow-dropright-circle:before{content:""}.ion-ios-arrow-dropup:before{content:""}.ion-ios-arrow-dropup-circle:before{content:""}.ion-ios-arrow-forward:before{content:""}.ion-ios-arrow-round-back:before{content:""}.ion-ios-arrow-round-down:before{content:""}.ion-ios-arrow-round-forward:before{content:""}.ion-ios-arrow-round-up:before{content:""}.ion-ios-arrow-up:before{content:""}.ion-ios-at:before{content:""}.ion-ios-attach:before{content:""}.ion-ios-backspace:before{content:""}.ion-ios-barcode:before{content:""}.ion-ios-baseball:before{content:""}.ion-ios-basket:before{content:""}.ion-ios-basketball:before{content:""}.ion-ios-battery-charging:before{content:""}.ion-ios-battery-dead:before{content:""}.ion-ios-battery-full:before{content:""}.ion-ios-beaker:before{content:""}.ion-ios-bed:before{content:""}.ion-ios-beer:before{content:""}.ion-ios-bicycle:before{content:""}.ion-ios-bluetooth:before{content:""}.ion-ios-boat:before{content:""}.ion-ios-body:before{content:""}.ion-ios-bonfire:before{content:""}.ion-ios-book:before{content:""}.ion-ios-bookmark:before{content:""}.ion-ios-bookmarks:before{content:""}.ion-ios-bowtie:before{content:""}.ion-ios-briefcase:before{content:""}.ion-ios-browsers:before{content:""}.ion-ios-brush:before{content:""}.ion-ios-bug:before{content:""}.ion-ios-build:before{content:""}.ion-ios-bulb:before{content:""}.ion-ios-bus:before{content:""}.ion-ios-business:before{content:""}.ion-ios-cafe:before{content:""}.ion-ios-calculator:before{content:""}.ion-ios-calendar:before{content:""}.ion-ios-call:before{content:""}.ion-ios-camera:before{content:""}.ion-ios-car:before{content:""}.ion-ios-card:before{content:""}.ion-ios-cart:before{content:""}.ion-ios-cash:before{content:""}.ion-ios-cellular:before{content:""}.ion-ios-chatboxes:before{content:""}.ion-ios-chatbubbles:before{content:""}.ion-ios-checkbox:before{content:""}.ion-ios-checkbox-outline:before{content:""}.ion-ios-checkmark:before{content:""}.ion-ios-checkmark-circle:before{content:""}.ion-ios-checkmark-circle-outline:before{content:""}.ion-ios-clipboard:before{content:""}.ion-ios-clock:before{content:""}.ion-ios-close:before{content:""}.ion-ios-close-circle:before{content:""}.ion-ios-close-circle-outline:before{content:""}.ion-ios-cloud:before{content:""}.ion-ios-cloud-circle:before{content:""}.ion-ios-cloud-done:before{content:""}.ion-ios-cloud-download:before{content:""}.ion-ios-cloud-outline:before{content:""}.ion-ios-cloud-upload:before{content:""}.ion-ios-cloudy:before{content:""}.ion-ios-cloudy-night:before{content:""}.ion-ios-code:before{content:""}.ion-ios-code-download:before{content:""}.ion-ios-code-working:before{content:""}.ion-ios-cog:before{content:""}.ion-ios-color-fill:before{content:""}.ion-ios-color-filter:before{content:""}.ion-ios-color-palette:before{content:""}.ion-ios-color-wand:before{content:""}.ion-ios-compass:before{content:""}.ion-ios-construct:before{content:""}.ion-ios-contact:before{content:""}.ion-ios-contacts:before{content:""}.ion-ios-contract:before{content:""}.ion-ios-contrast:before{content:""}.ion-ios-copy:before{content:""}.ion-ios-create:before{content:""}.ion-ios-crop:before{content:""}.ion-ios-cube:before{content:""}.ion-ios-cut:before{content:""}.ion-ios-desktop:before{content:""}.ion-ios-disc:before{content:""}.ion-ios-document:before{content:""}.ion-ios-done-all:before{content:""}.ion-ios-download:before{content:""}.ion-ios-easel:before{content:""}.ion-ios-egg:before{content:""}.ion-ios-exit:before{content:""}.ion-ios-expand:before{content:""}.ion-ios-eye:before{content:""}.ion-ios-eye-off:before{content:""}.ion-ios-fastforward:before{content:""}.ion-ios-female:before{content:""}.ion-ios-filing:before{content:""}.ion-ios-film:before{content:""}.ion-ios-finger-print:before{content:""}.ion-ios-fitness:before{content:""}.ion-ios-flag:before{content:""}.ion-ios-flame:before{content:""}.ion-ios-flash:before{content:""}.ion-ios-flash-off:before{content:""}.ion-ios-flashlight:before{content:""}.ion-ios-flask:before{content:""}.ion-ios-flower:before{content:""}.ion-ios-folder:before{content:""}.ion-ios-folder-open:before{content:""}.ion-ios-football:before{content:""}.ion-ios-funnel:before{content:""}.ion-ios-gift:before{content:""}.ion-ios-git-branch:before{content:""}.ion-ios-git-commit:before{content:""}.ion-ios-git-compare:before{content:""}.ion-ios-git-merge:before{content:""}.ion-ios-git-network:before{content:""}.ion-ios-git-pull-request:before{content:""}.ion-ios-glasses:before{content:""}.ion-ios-globe:before{content:""}.ion-ios-grid:before{content:""}.ion-ios-hammer:before{content:""}.ion-ios-hand:before{content:""}.ion-ios-happy:before{content:""}.ion-ios-headset:before{content:""}.ion-ios-heart:before{content:""}.ion-ios-heart-dislike:before{content:""}.ion-ios-heart-empty:before{content:""}.ion-ios-heart-half:before{content:""}.ion-ios-help:before{content:""}.ion-ios-help-buoy:before{content:""}.ion-ios-help-circle:before{content:""}.ion-ios-help-circle-outline:before{content:""}.ion-ios-home:before{content:""}.ion-ios-hourglass:before{content:""}.ion-ios-ice-cream:before{content:""}.ion-ios-image:before{content:""}.ion-ios-images:before{content:""}.ion-ios-infinite:before{content:""}.ion-ios-information:before{content:""}.ion-ios-information-circle:before{content:""}.ion-ios-information-circle-outline:before{content:""}.ion-ios-jet:before{content:""}.ion-ios-journal:before{content:""}.ion-ios-key:before{content:""}.ion-ios-keypad:before{content:""}.ion-ios-laptop:before{content:""}.ion-ios-leaf:before{content:""}.ion-ios-link:before{content:""}.ion-ios-list:before{content:""}.ion-ios-list-box:before{content:""}.ion-ios-locate:before{content:""}.ion-ios-lock:before{content:""}.ion-ios-log-in:before{content:""}.ion-ios-log-out:before{content:""}.ion-ios-magnet:before{content:""}.ion-ios-mail:before{content:""}.ion-ios-mail-open:before{content:""}.ion-ios-mail-unread:before{content:""}.ion-ios-male:before{content:""}.ion-ios-man:before{content:""}.ion-ios-map:before{content:""}.ion-ios-medal:before{content:""}.ion-ios-medical:before{content:""}.ion-ios-medkit:before{content:""}.ion-ios-megaphone:before{content:""}.ion-ios-menu:before{content:""}.ion-ios-mic:before{content:""}.ion-ios-mic-off:before{content:""}.ion-ios-microphone:before{content:""}.ion-ios-moon:before{content:""}.ion-ios-more:before{content:""}.ion-ios-move:before{content:""}.ion-ios-musical-note:before{content:""}.ion-ios-musical-notes:before{content:""}.ion-ios-navigate:before{content:""}.ion-ios-notifications:before{content:""}.ion-ios-notifications-off:before{content:""}.ion-ios-notifications-outline:before{content:""}.ion-ios-nuclear:before{content:""}.ion-ios-nutrition:before{content:""}.ion-ios-open:before{content:""}.ion-ios-options:before{content:""}.ion-ios-outlet:before{content:""}.ion-ios-paper:before{content:""}.ion-ios-paper-plane:before{content:""}.ion-ios-partly-sunny:before{content:""}.ion-ios-pause:before{content:""}.ion-ios-paw:before{content:""}.ion-ios-people:before{content:""}.ion-ios-person:before{content:""}.ion-ios-person-add:before{content:""}.ion-ios-phone-landscape:before{content:""}.ion-ios-phone-portrait:before{content:""}.ion-ios-photos:before{content:""}.ion-ios-pie:before{content:""}.ion-ios-pin:before{content:""}.ion-ios-pint:before{content:""}.ion-ios-pizza:before{content:""}.ion-ios-planet:before{content:""}.ion-ios-play:before{content:""}.ion-ios-play-circle:before{content:""}.ion-ios-podium:before{content:""}.ion-ios-power:before{content:""}.ion-ios-pricetag:before{content:""}.ion-ios-pricetags:before{content:""}.ion-ios-print:before{content:""}.ion-ios-pulse:before{content:""}.ion-ios-qr-scanner:before{content:""}.ion-ios-quote:before{content:""}.ion-ios-radio:before{content:""}.ion-ios-radio-button-off:before{content:""}.ion-ios-radio-button-on:before{content:""}.ion-ios-rainy:before{content:""}.ion-ios-recording:before{content:""}.ion-ios-redo:before{content:""}.ion-ios-refresh:before{content:""}.ion-ios-refresh-circle:before{content:""}.ion-ios-remove:before{content:""}.ion-ios-remove-circle:before{content:""}.ion-ios-remove-circle-outline:before{content:""}.ion-ios-reorder:before{content:""}.ion-ios-repeat:before{content:""}.ion-ios-resize:before{content:""}.ion-ios-restaurant:before{content:""}.ion-ios-return-left:before{content:""}.ion-ios-return-right:before{content:""}.ion-ios-reverse-camera:before{content:""}.ion-ios-rewind:before{content:""}.ion-ios-ribbon:before{content:""}.ion-ios-rocket:before{content:""}.ion-ios-rose:before{content:""}.ion-ios-sad:before{content:""}.ion-ios-save:before{content:""}.ion-ios-school:before{content:""}.ion-ios-search:before{content:""}.ion-ios-send:before{content:""}.ion-ios-settings:before{content:""}.ion-ios-share:before{content:""}.ion-ios-share-alt:before{content:""}.ion-ios-shirt:before{content:""}.ion-ios-shuffle:before{content:""}.ion-ios-skip-backward:before{content:""}.ion-ios-skip-forward:before{content:""}.ion-ios-snow:before{content:""}.ion-ios-speedometer:before{content:""}.ion-ios-square:before{content:""}.ion-ios-square-outline:before{content:""}.ion-ios-star:before{content:""}.ion-ios-star-half:before{content:""}.ion-ios-star-outline:before{content:""}.ion-ios-stats:before{content:""}.ion-ios-stopwatch:before{content:""}.ion-ios-subway:before{content:""}.ion-ios-sunny:before{content:""}.ion-ios-swap:before{content:""}.ion-ios-switch:before{content:""}.ion-ios-sync:before{content:""}.ion-ios-tablet-landscape:before{content:""}.ion-ios-tablet-portrait:before{content:""}.ion-ios-tennisball:before{content:""}.ion-ios-text:before{content:""}.ion-ios-thermometer:before{content:""}.ion-ios-thumbs-down:before{content:""}.ion-ios-thumbs-up:before{content:""}.ion-ios-thunderstorm:before{content:""}.ion-ios-time:before{content:""}.ion-ios-timer:before{content:""}.ion-ios-today:before{content:""}.ion-ios-train:before{content:""}.ion-ios-transgender:before{content:""}.ion-ios-trash:before{content:""}.ion-ios-trending-down:before{content:""}.ion-ios-trending-up:before{content:""}.ion-ios-trophy:before{content:""}.ion-ios-tv:before{content:""}.ion-ios-umbrella:before{content:""}.ion-ios-undo:before{content:""}.ion-ios-unlock:before{content:""}.ion-ios-videocam:before{content:""}.ion-ios-volume-high:before{content:""}.ion-ios-volume-low:before{content:""}.ion-ios-volume-mute:before{content:""}.ion-ios-volume-off:before{content:""}.ion-ios-walk:before{content:""}.ion-ios-wallet:before{content:""}.ion-ios-warning:before{content:""}.ion-ios-watch:before{content:""}.ion-ios-water:before{content:""}.ion-ios-wifi:before{content:""}.ion-ios-wine:before{content:""}.ion-ios-woman:before{content:""}.ion-logo-android:before{content:""}.ion-logo-angular:before{content:""}.ion-logo-apple:before{content:""}.ion-logo-bitbucket:before{content:""}.ion-logo-bitcoin:before{content:""}.ion-logo-buffer:before{content:""}.ion-logo-chrome:before{content:""}.ion-logo-closed-captioning:before{content:""}.ion-logo-codepen:before{content:""}.ion-logo-css3:before{content:""}.ion-logo-designernews:before{content:""}.ion-logo-dribbble:before{content:""}.ion-logo-dropbox:before{content:""}.ion-logo-euro:before{content:""}.ion-logo-facebook:before{content:""}.ion-logo-flickr:before{content:""}.ion-logo-foursquare:before{content:""}.ion-logo-freebsd-devil:before{content:""}.ion-logo-game-controller-a:before{content:""}.ion-logo-game-controller-b:before{content:""}.ion-logo-github:before{content:""}.ion-logo-google:before{content:""}.ion-logo-googleplus:before{content:""}.ion-logo-hackernews:before{content:""}.ion-logo-html5:before{content:""}.ion-logo-instagram:before{content:""}.ion-logo-ionic:before{content:""}.ion-logo-ionitron:before{content:""}.ion-logo-javascript:before{content:""}.ion-logo-linkedin:before{content:""}.ion-logo-markdown:before{content:""}.ion-logo-model-s:before{content:""}.ion-logo-no-smoking:before{content:""}.ion-logo-nodejs:before{content:""}.ion-logo-npm:before{content:""}.ion-logo-octocat:before{content:""}.ion-logo-pinterest:before{content:""}.ion-logo-playstation:before{content:""}.ion-logo-polymer:before{content:""}.ion-logo-python:before{content:""}.ion-logo-reddit:before{content:""}.ion-logo-rss:before{content:""}.ion-logo-sass:before{content:""}.ion-logo-skype:before{content:""}.ion-logo-slack:before{content:""}.ion-logo-snapchat:before{content:""}.ion-logo-steam:before{content:""}.ion-logo-tumblr:before{content:""}.ion-logo-tux:before{content:""}.ion-logo-twitch:before{content:""}.ion-logo-twitter:before{content:""}.ion-logo-usd:before{content:""}.ion-logo-vimeo:before{content:""}.ion-logo-vk:before{content:""}.ion-logo-whatsapp:before{content:""}.ion-logo-windows:before{content:""}.ion-logo-wordpress:before{content:""}.ion-logo-xbox:before{content:""}.ion-logo-xing:before{content:""}.ion-logo-yahoo:before{content:""}.ion-logo-yen:before{content:""}.ion-logo-youtube:before{content:""}.ion-md-add:before{content:""}.ion-md-add-circle:before{content:""}.ion-md-add-circle-outline:before{content:""}.ion-md-airplane:before{content:""}.ion-md-alarm:before{content:""}.ion-md-albums:before{content:""}.ion-md-alert:before{content:""}.ion-md-american-football:before{content:""}.ion-md-analytics:before{content:""}.ion-md-aperture:before{content:""}.ion-md-apps:before{content:""}.ion-md-appstore:before{content:""}.ion-md-archive:before{content:""}.ion-md-arrow-back:before{content:""}.ion-md-arrow-down:before{content:""}.ion-md-arrow-dropdown:before{content:""}.ion-md-arrow-dropdown-circle:before{content:""}.ion-md-arrow-dropleft:before{content:""}.ion-md-arrow-dropleft-circle:before{content:""}.ion-md-arrow-dropright:before{content:""}.ion-md-arrow-dropright-circle:before{content:""}.ion-md-arrow-dropup:before{content:""}.ion-md-arrow-dropup-circle:before{content:""}.ion-md-arrow-forward:before{content:""}.ion-md-arrow-round-back:before{content:""}.ion-md-arrow-round-down:before{content:""}.ion-md-arrow-round-forward:before{content:""}.ion-md-arrow-round-up:before{content:""}.ion-md-arrow-up:before{content:""}.ion-md-at:before{content:""}.ion-md-attach:before{content:""}.ion-md-backspace:before{content:""}.ion-md-barcode:before{content:""}.ion-md-baseball:before{content:""}.ion-md-basket:before{content:""}.ion-md-basketball:before{content:""}.ion-md-battery-charging:before{content:""}.ion-md-battery-dead:before{content:""}.ion-md-battery-full:before{content:""}.ion-md-beaker:before{content:""}.ion-md-bed:before{content:""}.ion-md-beer:before{content:""}.ion-md-bicycle:before{content:""}.ion-md-bluetooth:before{content:""}.ion-md-boat:before{content:""}.ion-md-body:before{content:""}.ion-md-bonfire:before{content:""}.ion-md-book:before{content:""}.ion-md-bookmark:before{content:""}.ion-md-bookmarks:before{content:""}.ion-md-bowtie:before{content:""}.ion-md-briefcase:before{content:""}.ion-md-browsers:before{content:""}.ion-md-brush:before{content:""}.ion-md-bug:before{content:""}.ion-md-build:before{content:""}.ion-md-bulb:before{content:""}.ion-md-bus:before{content:""}.ion-md-business:before{content:""}.ion-md-cafe:before{content:""}.ion-md-calculator:before{content:""}.ion-md-calendar:before{content:""}.ion-md-call:before{content:""}.ion-md-camera:before{content:""}.ion-md-car:before{content:""}.ion-md-card:before{content:""}.ion-md-cart:before{content:""}.ion-md-cash:before{content:""}.ion-md-cellular:before{content:""}.ion-md-chatboxes:before{content:""}.ion-md-chatbubbles:before{content:""}.ion-md-checkbox:before{content:""}.ion-md-checkbox-outline:before{content:""}.ion-md-checkmark:before{content:""}.ion-md-checkmark-circle:before{content:""}.ion-md-checkmark-circle-outline:before{content:""}.ion-md-clipboard:before{content:""}.ion-md-clock:before{content:""}.ion-md-close:before{content:""}.ion-md-close-circle:before{content:""}.ion-md-close-circle-outline:before{content:""}.ion-md-cloud:before{content:""}.ion-md-cloud-circle:before{content:""}.ion-md-cloud-done:before{content:""}.ion-md-cloud-download:before{content:""}.ion-md-cloud-outline:before{content:""}.ion-md-cloud-upload:before{content:""}.ion-md-cloudy:before{content:""}.ion-md-cloudy-night:before{content:""}.ion-md-code:before{content:""}.ion-md-code-download:before{content:""}.ion-md-code-working:before{content:""}.ion-md-cog:before{content:""}.ion-md-color-fill:before{content:""}.ion-md-color-filter:before{content:""}.ion-md-color-palette:before{content:""}.ion-md-color-wand:before{content:""}.ion-md-compass:before{content:""}.ion-md-construct:before{content:""}.ion-md-contact:before{content:""}.ion-md-contacts:before{content:""}.ion-md-contract:before{content:""}.ion-md-contrast:before{content:""}.ion-md-copy:before{content:""}.ion-md-create:before{content:""}.ion-md-crop:before{content:""}.ion-md-cube:before{content:""}.ion-md-cut:before{content:""}.ion-md-desktop:before{content:""}.ion-md-disc:before{content:""}.ion-md-document:before{content:""}.ion-md-done-all:before{content:""}.ion-md-download:before{content:""}.ion-md-easel:before{content:""}.ion-md-egg:before{content:""}.ion-md-exit:before{content:""}.ion-md-expand:before{content:""}.ion-md-eye:before{content:""}.ion-md-eye-off:before{content:""}.ion-md-fastforward:before{content:""}.ion-md-female:before{content:""}.ion-md-filing:before{content:""}.ion-md-film:before{content:""}.ion-md-finger-print:before{content:""}.ion-md-fitness:before{content:""}.ion-md-flag:before{content:""}.ion-md-flame:before{content:""}.ion-md-flash:before{content:""}.ion-md-flash-off:before{content:""}.ion-md-flashlight:before{content:""}.ion-md-flask:before{content:""}.ion-md-flower:before{content:""}.ion-md-folder:before{content:""}.ion-md-folder-open:before{content:""}.ion-md-football:before{content:""}.ion-md-funnel:before{content:""}.ion-md-gift:before{content:""}.ion-md-git-branch:before{content:""}.ion-md-git-commit:before{content:""}.ion-md-git-compare:before{content:""}.ion-md-git-merge:before{content:""}.ion-md-git-network:before{content:""}.ion-md-git-pull-request:before{content:""}.ion-md-glasses:before{content:""}.ion-md-globe:before{content:""}.ion-md-grid:before{content:""}.ion-md-hammer:before{content:""}.ion-md-hand:before{content:""}.ion-md-happy:before{content:""}.ion-md-headset:before{content:""}.ion-md-heart:before{content:""}.ion-md-heart-dislike:before{content:""}.ion-md-heart-empty:before{content:""}.ion-md-heart-half:before{content:""}.ion-md-help:before{content:""}.ion-md-help-buoy:before{content:""}.ion-md-help-circle:before{content:""}.ion-md-help-circle-outline:before{content:""}.ion-md-home:before{content:""}.ion-md-hourglass:before{content:""}.ion-md-ice-cream:before{content:""}.ion-md-image:before{content:""}.ion-md-images:before{content:""}.ion-md-infinite:before{content:""}.ion-md-information:before{content:""}.ion-md-information-circle:before{content:""}.ion-md-information-circle-outline:before{content:""}.ion-md-jet:before{content:""}.ion-md-journal:before{content:""}.ion-md-key:before{content:""}.ion-md-keypad:before{content:""}.ion-md-laptop:before{content:""}.ion-md-leaf:before{content:""}.ion-md-link:before{content:""}.ion-md-list:before{content:""}.ion-md-list-box:before{content:""}.ion-md-locate:before{content:""}.ion-md-lock:before{content:""}.ion-md-log-in:before{content:""}.ion-md-log-out:before{content:""}.ion-md-magnet:before{content:""}.ion-md-mail:before{content:""}.ion-md-mail-open:before{content:""}.ion-md-mail-unread:before{content:""}.ion-md-male:before{content:""}.ion-md-man:before{content:""}.ion-md-map:before{content:""}.ion-md-medal:before{content:""}.ion-md-medical:before{content:""}.ion-md-medkit:before{content:""}.ion-md-megaphone:before{content:""}.ion-md-menu:before{content:""}.ion-md-mic:before{content:""}.ion-md-mic-off:before{content:""}.ion-md-microphone:before{content:""}.ion-md-moon:before{content:""}.ion-md-more:before{content:""}.ion-md-move:before{content:""}.ion-md-musical-note:before{content:""}.ion-md-musical-notes:before{content:""}.ion-md-navigate:before{content:""}.ion-md-notifications:before{content:""}.ion-md-notifications-off:before{content:""}.ion-md-notifications-outline:before{content:""}.ion-md-nuclear:before{content:""}.ion-md-nutrition:before{content:""}.ion-md-open:before{content:""}.ion-md-options:before{content:""}.ion-md-outlet:before{content:""}.ion-md-paper:before{content:""}.ion-md-paper-plane:before{content:""}.ion-md-partly-sunny:before{content:""}.ion-md-pause:before{content:""}.ion-md-paw:before{content:""}.ion-md-people:before{content:""}.ion-md-person:before{content:""}.ion-md-person-add:before{content:""}.ion-md-phone-landscape:before{content:""}.ion-md-phone-portrait:before{content:""}.ion-md-photos:before{content:""}.ion-md-pie:before{content:""}.ion-md-pin:before{content:""}.ion-md-pint:before{content:""}.ion-md-pizza:before{content:""}.ion-md-planet:before{content:""}.ion-md-play:before{content:""}.ion-md-play-circle:before{content:""}.ion-md-podium:before{content:""}.ion-md-power:before{content:""}.ion-md-pricetag:before{content:""}.ion-md-pricetags:before{content:""}.ion-md-print:before{content:""}.ion-md-pulse:before{content:""}.ion-md-qr-scanner:before{content:""}.ion-md-quote:before{content:""}.ion-md-radio:before{content:""}.ion-md-radio-button-off:before{content:""}.ion-md-radio-button-on:before{content:""}.ion-md-rainy:before{content:""}.ion-md-recording:before{content:""}.ion-md-redo:before{content:""}.ion-md-refresh:before{content:""}.ion-md-refresh-circle:before{content:""}.ion-md-remove:before{content:""}.ion-md-remove-circle:before{content:""}.ion-md-remove-circle-outline:before{content:""}.ion-md-reorder:before{content:""}.ion-md-repeat:before{content:""}.ion-md-resize:before{content:""}.ion-md-restaurant:before{content:""}.ion-md-return-left:before{content:""}.ion-md-return-right:before{content:""}.ion-md-reverse-camera:before{content:""}.ion-md-rewind:before{content:""}.ion-md-ribbon:before{content:""}.ion-md-rocket:before{content:""}.ion-md-rose:before{content:""}.ion-md-sad:before{content:""}.ion-md-save:before{content:""}.ion-md-school:before{content:""}.ion-md-search:before{content:""}.ion-md-send:before{content:""}.ion-md-settings:before{content:""}.ion-md-share:before{content:""}.ion-md-share-alt:before{content:""}.ion-md-shirt:before{content:""}.ion-md-shuffle:before{content:""}.ion-md-skip-backward:before{content:""}.ion-md-skip-forward:before{content:""}.ion-md-snow:before{content:""}.ion-md-speedometer:before{content:""}.ion-md-square:before{content:""}.ion-md-square-outline:before{content:""}.ion-md-star:before{content:""}.ion-md-star-half:before{content:""}.ion-md-star-outline:before{content:""}.ion-md-stats:before{content:""}.ion-md-stopwatch:before{content:""}.ion-md-subway:before{content:""}.ion-md-sunny:before{content:""}.ion-md-swap:before{content:""}.ion-md-switch:before{content:""}.ion-md-sync:before{content:""}.ion-md-tablet-landscape:before{content:""}.ion-md-tablet-portrait:before{content:""}.ion-md-tennisball:before{content:""}.ion-md-text:before{content:""}.ion-md-thermometer:before{content:""}.ion-md-thumbs-down:before{content:""}.ion-md-thumbs-up:before{content:""}.ion-md-thunderstorm:before{content:""}.ion-md-time:before{content:""}.ion-md-timer:before{content:""}.ion-md-today:before{content:""}.ion-md-train:before{content:""}.ion-md-transgender:before{content:""}.ion-md-trash:before{content:""}.ion-md-trending-down:before{content:""}.ion-md-trending-up:before{content:""}.ion-md-trophy:before{content:""}.ion-md-tv:before{content:""}.ion-md-umbrella:before{content:""}.ion-md-undo:before{content:""}.ion-md-unlock:before{content:""}.ion-md-videocam:before{content:""}.ion-md-volume-high:before{content:""}.ion-md-volume-low:before{content:""}.ion-md-volume-mute:before{content:""}.ion-md-volume-off:before{content:""}.ion-md-walk:before{content:""}.ion-md-wallet:before{content:""}.ion-md-warning:before{content:""}.ion-md-watch:before{content:""}.ion-md-water:before{content:""}.ion-md-wifi:before{content:""}.ion-md-wine:before{content:""}.ion-md-woman:before{content:""} \ No newline at end of file diff --git a/frontend/src/assets/fonts/ionicons.eot b/frontend/src/assets/fonts/ionicons.eot new file mode 100644 index 0000000000000000000000000000000000000000..579c1e19fc63d8eacfbc509bab0a9fef00d19b0e GIT binary patch literal 112650 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

OV(uY{)4f8TBu`;Rob)y29+9y)t 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 literal 0 HcmV?d00001 diff --git a/frontend/src/assets/scss/base/_base.scss b/frontend/src/assets/scss/base/_base.scss new file mode 100644 index 0000000..3e1ff82 --- /dev/null +++ b/frontend/src/assets/scss/base/_base.scss @@ -0,0 +1,3 @@ +@import './import'; +@import './typography'; +@import './common'; \ No newline at end of file diff --git a/frontend/src/assets/scss/base/_common.scss b/frontend/src/assets/scss/base/_common.scss new file mode 100644 index 0000000..8982525 --- /dev/null +++ b/frontend/src/assets/scss/base/_common.scss @@ -0,0 +1,167 @@ +ul, +ol { + margin: 0; + padding: 0; + list-style: none; +} +img { + max-width: 100%; + height: auto; +} +.mtb15 { + margin: 15px 0; +} +.mt15 { + margin-top: 15px; +} +.mb15 { + margin-bottom: 15px; +} +.ml15 { + margin-left: 15px; +} +.mr15 { + margin-right: 15px; +} +.ptb70 { + padding: 70px 0; +} +.pb70 { + padding-bottom: 70px; +} +.pt70 { + padding-top: 70px; +} +.pb40 { + padding-bottom: 40px; +} +::-webkit-scrollbar { + background: transparent; + width: 3px; + height: 6px; +} +::-webkit-scrollbar-thumb { + background: rgba(0, 0, 0, 0.07); + border: solid rgba(88, 88, 88, 0.12) 2px; + border-radius: 5px; +} +.dropdown-toggle::after { + vertical-align: 1px; +} +thead tr th { + padding: 8px 15px !important; +} +thead th { + color: #758696; + font-size: 13px; + font-weight: 600; + border: 0 !important; +} +tbody tr { + color: #4a4a4a; +} +tbody tr:hover { + background: #f6f8f9; +} +.input-group-text, +.form-control { + border-radius: 5px; +} +.table tbody + tbody { + border: none; +} +.heading { + background: #f5f9fc; + font-size: 14px; + font-weight: 400; + padding: 13px; + margin: 0; + color: #4a4a4a; +} +.green { + color: #26de81; +} +.red { + color: #ff231f; +} +.table td, +.table th { + border-top: 1px solid #f0f3fa; +} +.light-bb, +.input-group-text { + border: 1px solid #e0e3eb; +} +.dark-bb { + border-bottom: 1px solid #2a2e39; +} +#darkDepthChart, +#lightDepthChart { + width: 100%; + height: 349px; +} +.sm-gutters { + padding-left: 7.5px; + padding-right: 7.5px; +} +.sm-gutters > .col, +.sm-gutters > [class*='col-'] { + padding-right: 7.5px; + padding-left: 7.5px; +} + +.form-control::-webkit-input-placeholder { + /* Chrome/Opera/Safari */ + color: #18214d59; +} +.form-control::-moz-placeholder { + /* Firefox 19+ */ + color: #18214d59; +} +.form-control:-ms-input-placeholder { + /* IE 10+ */ + color: #18214d59; +} +.form-control:-moz-placeholder { + /* Firefox 18- */ + color: #18214d59; +} + +.custom-control-input:focus ~ .custom-control-label::before { + box-shadow: none; +} +.nav-tabs .nav-link.active, +.nav-tabs .nav-link:hover { + border-color: transparent; +} +.slick-slide > div { + margin: 0 8px; +} +.slick-list { + margin: 0 -8px; +} +.page-content { + margin: 40px 0 100px; +} + +.page-content h2 { + font-size: 26px; + margin-bottom: 20px; + margin-top: 60px; +} + +.page-content p { + font-size: 16px; +} +.news-details { + padding: 100px 0; +} + +.news-details h2 { + font-size: 26px; + margin-bottom: 20px; +} + +.news-details p { + font-size: 16px; +} diff --git a/frontend/src/assets/scss/base/_import.scss b/frontend/src/assets/scss/base/_import.scss new file mode 100644 index 0000000..2f09251 --- /dev/null +++ b/frontend/src/assets/scss/base/_import.scss @@ -0,0 +1 @@ +@import url('//fonts.googleapis.com/css?family=Overpass:300,400,600,700&display=swap'); diff --git a/frontend/src/assets/scss/base/_typography.scss b/frontend/src/assets/scss/base/_typography.scss new file mode 100644 index 0000000..82d18f5 --- /dev/null +++ b/frontend/src/assets/scss/base/_typography.scss @@ -0,0 +1,8 @@ +body { + font-family: 'Overpass', sans-serif; + font-size: 14px; + line-height: 1.5; + color: #18214D; + background: #FFFFFF; + font-weight: 400; +} \ No newline at end of file diff --git a/frontend/src/assets/scss/layout/_header.scss b/frontend/src/assets/scss/layout/_header.scss new file mode 100644 index 0000000..075575e --- /dev/null +++ b/frontend/src/assets/scss/layout/_header.scss @@ -0,0 +1,274 @@ +@keyframes pulse { + 0% { + opacity: 1; + width: 7px; + height: 7px; + left: 0; + top: 0; + } + 95% { + opacity: 0.1; + left: -10.5px; + top: -10.5px; + width: 28px; + height: 28px; + } + 100% { + opacity: 0; + width: 7px; + height: 7px; + left: 0; + top: 0; + } +} + +@keyframes slideIn { + 0% { + transform: translateY(1rem); + opacity: 0; + } + 100% { + transform: translateY(0rem); + opacity: 1; + } + 0% { + transform: translateY(1rem); + opacity: 0; + } +} + +header nav a { + color: #18214d !important; +} +header nav a:hover { + color: #007bff; +} +header .navbar-brand { + padding: 0; +} +header .navbar-brand img { + height: 45px; +} +.navbar-expand-lg .navbar-nav .nav-link { + padding-right: 1rem; + padding-left: 1rem; +} +header nav .nav-item.active a { + color: #007bff; +} +header .nav-link.btn { + padding: 5px 0; +} +.circle-pulse { + background: #0089ff; + width: 7px; + height: 7px; + border-radius: 50%; + position: absolute; + right: 12px; + top: 8px; +} + +.circle-pulse:after { + background-color: #0089ff; + content: ''; + display: table; + border-radius: 50%; + position: absolute; + animation-name: pulse; + animation-duration: 0.9s; + animation-iteration-count: infinite; + animation-timing-function: ease-out; +} +.header-custom-icon .nav-link { + line-height: 0; + margin-top: 6px; +} +.header-custom-icon button { + padding: 0 15px; + margin-top: 5px; +} +.header-img-icon button { + padding: 0 0 0 15px; +} +.header-custom-icon button:after, +.header-img-icon button:after { + display: none; +} + +.header-custom-icon button:focus, +.header-img-icon button:focus { + box-shadow: none; +} +.dropdown-item { + color: #18214d; + font-size: 14px; +} +.dropdown-item:hover, +.dropdown-item:focus, +.dropdown-item:active { + background-color: #f8f9fa; + color: #16181b; +} +.header-img-icon .nav-link.dropdown-toggle { + padding-right: 0; +} +.header-custom-icon a:after, +.header-img-icon a:after { + display: none; +} +.header-custom-icon .dropdown-menu, +.header-img-icon .dropdown-menu { + padding: 0; + margin-top: 8px; +} +.dropdown-menu { + max-width: 280px; + position: absolute; + right: 0; + left: auto; + border-radius: 5px; + margin-top: 12px !important; + border: 1px solid #f2f4f9; + box-shadow: rgba(0, 0, 0, 0.2) 0px 2px 14px -6px; + animation-duration: 0.3s; + animation-fill-mode: both; + animation-name: slideIn; +} +.dropdown-menu::before { + content: ''; + width: 13px; + height: 13px; + background: #fff; + position: absolute; + top: -8px; + right: 5%; + transform: rotate(45deg); + border-top: 1px solid #f2f4f9; + border-left: 1px solid #f2f4f9; + z-index: -1; +} +.dropdown-menu p { + color: #18214d; + font-weight: 600; +} +.dropdown-menu a:hover { + text-decoration: none; +} +.dropdown-menu a.text-muted:hover { + color: #007bff !important; +} +.header-img-icon button img { + width: 30px; +} +.header-custom-icon i { + font-size: 20px; + color: #758696; +} +.dropdown-header { + padding: 12px 20px; + font-size: 13px; + border-bottom: 1px solid #f2f4f9; +} +.dropdown-body { + padding: 5px; + max-height: 290px; + position: relative; + overflow-y: auto; +} +.dropdown-body .dropdown-item { + display: flex; + align-items: center; + padding: 9px 16px; +} +.dropdown-body .dropdown-item .content { + margin-left: 15px; + width: 200px; + white-space: normal; +} +.dropdown-item .icon { + width: 30px; + height: 30px; + border-radius: 50%; + display: flex; + align-items: center; + justify-content: center; + background: #f7f7f7; +} +.dropdown-body .dropdown-item .content p { + margin: 0; + font-size: 13px; + font-weight: 400; +} +.dropdown-body .dropdown-item .content p.sub-text { + font-size: 12px; +} +.dropdown-footer { + padding: 10px 20px; + border-top: 1px solid #f2f4f9; + font-size: 14px; +} + +.dropdown-item:nth-child(1) .icon { + background: rgba(114, 124, 245, 0.1); +} +.dropdown-item:nth-child(1) .icon i { + color: #727cf5; +} +.dropdown-item:nth-child(2) .icon { + background: rgba(255, 51, 102, 0.1); +} +.dropdown-item:nth-child(2) .icon i { + color: #ff5680; +} +.dropdown-item:nth-child(3) .icon { + background: rgba(102, 209, 209, 0.1); +} +.dropdown-item:nth-child(3) .icon i { + color: #66d1d1; +} +.dropdown-item:nth-child(4) .icon { + background: rgba(251, 188, 6, 0.1); +} +.dropdown-item:nth-child(4) .icon i { + color: #fbbc06; +} +.dropdown-item:nth-child(5) .icon { + background: rgba(16, 183, 89, 0.1); +} +.dropdown-item:nth-child(5) .icon i { + color: #10b759; +} + +.header-img-icon .dropdown-header { + padding: 0px 20px; +} +.header-img-icon .profile-nav .nav-item .nav-link { + font-size: 14px; + padding: 5px 20px; +} +.header-img-icon .profile-nav { + padding-bottom: 11px; +} +.header-img-icon .profile-nav .nav-item .nav-link:hover { + color: #18214d; + background-color: #f8f9fa; +} +.header-img-icon .profile-nav .nav-item .nav-link.red { + color: #f74745; +} +.header-img-icon .profile-nav .nav-item .nav-link.red:hover { + color: #f74745 !important; +} +.header-img-icon .dropdown-body { + padding: 10px 0 0; +} +.header-img-icon .dropdown-header .name { + font-size: 16px; +} +.header-img-icon .dropdown-header { + padding: 20px 20px 0; +} +.header-img-icon .profile-nav .nav-item .nav-link i { + margin-right: 15px; +} diff --git a/frontend/src/assets/scss/layout/_layout.scss b/frontend/src/assets/scss/layout/_layout.scss new file mode 100644 index 0000000..fc1dc74 --- /dev/null +++ b/frontend/src/assets/scss/layout/_layout.scss @@ -0,0 +1 @@ +@import './header' \ No newline at end of file diff --git a/frontend/src/assets/scss/module/_error.scss b/frontend/src/assets/scss/module/_error.scss new file mode 100644 index 0000000..c0de50f --- /dev/null +++ b/frontend/src/assets/scss/module/_error.scss @@ -0,0 +1,25 @@ +.error-page h2 { + font-size: 250px; + font-weight: 700; + margin-bottom: 0; + line-height: 1; +} +.error-page p { + font-size: 16px; + margin-bottom: 40px; +} +.error-page a { + border: 1px solid #e0e3eb; + display: inline-block; + padding: 11px 30px 8px; + color: #4a4a4a; + transition: .3s; +} +.error-page a:hover { + background: #007bff; + color: #fff; + border: 1px solid #007bff; +} +.error-page a i { + margin-left: 10px; +} diff --git a/frontend/src/assets/scss/module/_form-access.scss b/frontend/src/assets/scss/module/_form-access.scss new file mode 100644 index 0000000..53c852b --- /dev/null +++ b/frontend/src/assets/scss/module/_form-access.scss @@ -0,0 +1,56 @@ +.form-access form { + box-shadow: rgba(0, 0, 0, 0.2) 0px 2px 14px -6px; + border-radius: 5px; + padding: 30px; + border: 1px solid #f2f4f9; + min-width: 350px; +} +.form-access .form-group input, +.form-access input { + border: 1px solid #e0e3eb; + height: 45px; + color: #18214d; + font-size: 14px; +} +.form-access .form-group input:focus { + box-shadow: none; +} +.form-access a:hover { + text-decoration: none; +} +.form-access span { + text-align: center; + display: block; + font-size: 22px; + margin-bottom: 15px; + margin-top: -5px; + font-weight: 600; +} +.form-access .text-right { + margin-top: -5px; + font-weight: 600; +} + +.form-access button { + width: 100%; + padding: 12px; + font-weight: 600; + margin-top: 20px; +} + +.form-access .custom-control-label::before, +.form-access .custom-control-label::after { + top: 2px; +} +.form-access .custom-control-label::before { + border: #cbd2df solid 1px; +} + +.form-access h2 { + font-size: 14px; + text-align: center; + margin-top: 20px; +} +.form-access h2 a { + font-weight: 600; +} diff --git a/frontend/src/assets/scss/module/_market-book.scss b/frontend/src/assets/scss/module/_market-book.scss new file mode 100644 index 0000000..bf71371 --- /dev/null +++ b/frontend/src/assets/scss/module/_market-book.scss @@ -0,0 +1,152 @@ +.order-book table, +.order-book tr, +.order-book td, +.order-book th { + width: 100%; + table-layout: fixed; +} +.order-book tr { + float: left; + clear: both; + overflow: hidden; +} +.order-book .table thead th { + font-weight: 400; + font-size: 12px; +} +.order-book thead tr { + border-bottom: 1px solid #e0e3eb; +} +.order-book tbody tr, +.order-book tbody td { + border: none; +} +.order-book { + border: 1px solid #e0e3eb; + border-radius: 2px; +} +.red-bg-80, +.red-bg-60, +.red-bg-40, +.red-bg-20, +.red-bg-10, +.red-bg-8, +.red-bg-5, +.red-bg, +.green-bg-80, +.green-bg-60, +.green-bg-40, +.green-bg-20, +.green-bg-10, +.green-bg-8, +.green-bg-5, +.green-bg { + position: relative; +} +.red-bg-80:after, +.red-bg-60:after, +.red-bg-40:after, +.red-bg-20:after, +.red-bg-10:after, +.red-bg-8:after, +.red-bg-5:after, +.red-bg:after { + position: absolute; + content: ""; + background: #de262663; + right: 0; + top: 0; + width: 280px; + height: 45px; +} +.red-bg-60:after { + width: 240px; +} +.red-bg-40:after { + width: 200px; +} +.red-bg-20:after { + width: 160px; +} +.red-bg-10:after { + width: 120px; +} +.red-bg-8:after { + width: 80px; +} +.red-bg-5:after { + width: 50px; +} +.red-bg:after { + width: 30px; +} + +.green-bg-80:after, +.green-bg-60:after, +.green-bg-40:after, +.green-bg-20:after, +.green-bg-10:after, +.green-bg-8:after, +.green-bg-5:after, +.green-bg:after { + position: absolute; + content: ""; + background: #26de8163; + right: 0; + top: 0; + width: 280px; + height: 45px; +} +.green-bg-60:after { + width: 240px; +} +.green-bg-40:after { + width: 200px; +} +.green-bg-20:after { + width: 160px; +} +.green-bg-10:after { + width: 120px; +} +.green-bg-8:after { + width: 80px; +} +.green-bg-5:after { + width: 50px; +} +.green-bg:after { + width: 30px; +} +.ob-heading span { + color: #4a4a4a; + display: block; + font-size: 12px; + font-weight: 400; +} + +.ob-heading td { + padding: 5px 12px; + cursor: default; +} + +.ob-heading tr { + border-top: 1px solid #f0f3fa !important; + border-bottom: 1px solid #f0f3fa !important; +} +.ob-heading tr:hover { + background: #fff; +} +.ob-heading td:first-child { + width: 65%; +} + +.order-book tbody { + display: block; + overflow-y: auto; + height: 211px; +} + +tbody.ob-heading { + height: inherit; +} diff --git a/frontend/src/assets/scss/module/_market-history.scss b/frontend/src/assets/scss/module/_market-history.scss new file mode 100644 index 0000000..56cda5d --- /dev/null +++ b/frontend/src/assets/scss/module/_market-history.scss @@ -0,0 +1,39 @@ +.market-history .nav { + background: #f5f9fc; +} +.market-history .nav-link { + color: #4a4a4a; + padding: 10px 13px; +} + +.market-history .nav-link.active { + color: #007bff; + background: transparent; +} + +.market-history thead tr th, +.market-history tbody tr td { + font-weight: 400; +} +.market-history tbody { + height: 315px; + overflow-y: auto; + display: block; +} + +.market-history table, +.market-history tr, +.market-history td, +.market-history th { + width: 100%; + table-layout: fixed; +} +.market-history tr { + float: left; + clear: both; + overflow: hidden; +} +.market-history { + border: 1px solid #e0e3eb; + border-radius: 2px; +} diff --git a/frontend/src/assets/scss/module/_market-news.scss b/frontend/src/assets/scss/module/_market-news.scss new file mode 100644 index 0000000..f1e3eab --- /dev/null +++ b/frontend/src/assets/scss/module/_market-news.scss @@ -0,0 +1,40 @@ + +.market-news { + border: 1px solid #e0e3eb; + border-radius: 2px; +} + +.market-news li a { + color: #4a4a4a; + font-size: 11px; + display: block; + text-decoration: none; +} +.market-news li:hover { + background: #f6f8f9; +} +.market-news li strong { + display: block; + font-size: 13px; + margin-bottom: 2px; + color: #4a4a4ac7; +} + +.market-news li span { + display: block; + margin-top: 5px; +} + +.market-news li { + border-bottom: 1px solid #f0f3fa; + padding: 10px 13px; +} + +.market-news li:last-child { + border: 0; +} + +.market-news ul { + height: 348px; + overflow-y: auto; +} \ No newline at end of file diff --git a/frontend/src/assets/scss/module/_market-order.scss b/frontend/src/assets/scss/module/_market-order.scss new file mode 100644 index 0000000..6568262 --- /dev/null +++ b/frontend/src/assets/scss/module/_market-order.scss @@ -0,0 +1,26 @@ +.market-order th { + width: 13%; +} +.no-data { + position: absolute; + right: 48%; + top: 48%; + text-align: center; + color: #b9c2ca; +} +.no-data i { + font-size: 100px; + display: block; + line-height: 0px; + color: #dce1e5; +} +.market-order-item { + color: #758696; + padding: 8px 15px; +} +.market-order { + border-top: 0; + min-height: 392px; + border: 1px solid #e0e3eb; + border-radius: 2px; +} \ No newline at end of file diff --git a/frontend/src/assets/scss/module/_market-pairs.scss b/frontend/src/assets/scss/module/_market-pairs.scss new file mode 100644 index 0000000..f9aec77 --- /dev/null +++ b/frontend/src/assets/scss/module/_market-pairs.scss @@ -0,0 +1,83 @@ +.market-pairs { + border: 1px solid #e0e3eb; + padding-top: 14px; + border-radius: 2px; +} +.market-pairs .input-group { + padding: 0 14px; +} +.market-pairs span { + background: transparent; +} + +.market-pairs input { + border-color: #e0e3eb; + border-left: 0; + font-weight: 300; +} +.market-pairs input:focus { + box-shadow: none; + border-color: #e0e3eb; +} +.market-pairs .nav { + margin-top: 14px; + background: #f5f9fc; + border-bottom: transparent; +} + +.market-pairs .nav-link { + color: #4a4a4a; + padding: 10px 13px; +} +.market-pairs .nav-link:hover { + border-color: transparent; +} +.market-pairs .nav-link.active { + color: #007bff; + background: transparent; + border-color: transparent; +} + +.table { + margin-bottom: 0; +} +.table td { + font-size: 13px; + padding: 10px 18px; + cursor: pointer; +} + +.market-pairs tbody tr td i { + color: #75869696; +} +.star-active tbody tr td i { + color: #007bff; +} +.market-pairs thead tr th, +.market-pairs tbody tr td { + font-weight: 400; +} + +.market-pairs tbody { + height: 800px; + overflow-y: auto; + display: block; +} +.no-fluid .market-pairs tbody { + height: 815px; +} +.market-pairs table, +.market-pairs tr { + width: 100%; + table-layout: fixed; +} +.market-pairs tr { + float: left; + clear: both; + overflow: hidden; +} + +.market-pairs thead th, +.market-pairs tbody td { + width: 65%; +} diff --git a/frontend/src/assets/scss/module/_market-trade.scss b/frontend/src/assets/scss/module/_market-trade.scss new file mode 100644 index 0000000..cedd324 --- /dev/null +++ b/frontend/src/assets/scss/module/_market-trade.scss @@ -0,0 +1,120 @@ +.market-trade input { + border: 1px solid #e0e3eb; + font-weight: 300; +} +.market-trade input:focus { + box-shadow: none; + border-color: #e0e3eb; +} +.market-trade { + border: 1px solid #e0e3eb; + border-radius: 2px; +} +.market-trade .tab-content { + height: 358px; + overflow-y: auto; + padding: 14px; +} + +.market-trade .nav .nav-item .nav-link.active { + background: #fff; + color: #007bff; +} + +.market-trade .nav .nav-item .nav-link { + color: #4a4a4a; + padding: 0; +} + +.market-trade .input-group-text { + background: #eff2f6; + color: #4a4a4a; + font-weight: 300; +} + +.market-trade .input-group { + margin-bottom: 14px; +} +.market-trade .nav-tabs .nav-link.active, +.market-trade .nav-tabs .nav-link:hover { + border-color: transparent; + color: #007bff; +} +.market-trade .nav-tabs .nav-link { + color: #4a4a4a; + padding-bottom: 0px; + padding-top: 12px; +} +.market-trade .nav-tabs { + border-bottom: 1px solid transparent; +} +.market-trade-list li a { + background: #eff2f6; + color: #4a4a4a; + font-weight: 300; + padding: 3px 15px; + border-radius: 5px; +} + +.market-trade-list li { + display: inline-block; + margin-right: 7px; + margin-bottom: 7px; +} +.market-trade-list li:last-child { + margin-right: 0; +} +.market-trade-buy .market-trade-list li a:hover { + text-decoration: none; + background: #26a69a; + color: #fff; +} +.market-trade-sell .market-trade-list li a:hover { + text-decoration: none; + background: #ef5350; + color: #fff; +} + +.market-trade button.buy, +.market-trade button.sell { + background: #26de81; + color: #fff; + text-transform: uppercase; + padding: 10px; + margin-top: 30px; + width: 100%; + box-shadow: 0px 0px 15px 0px #26de81ad; +} +.market-trade button.sell { + background: #ff231f; + box-shadow: 0px 0px 15px 0px #ff231fad; +} +.market-trade p { + margin: 5px 0; + font-size: 13px; + color: #4a4a4a; +} +.market-trade p span { + float: right; +} + +.market-trade-list { + margin-bottom: 23px; +} +.market-trade-item { + width: 100%; +} + +.market-trade-buy, +.market-trade-sell { + width: 100%; +} + +.market-trade-buy { + padding: 0 15px 0 0; +} + +.market-trade-sell { + padding: 0 0 0 15px; + border-left: 1px solid #e0e3eb; +} diff --git a/frontend/src/assets/scss/module/_markets.scss b/frontend/src/assets/scss/module/_markets.scss new file mode 100644 index 0000000..8dea5a9 --- /dev/null +++ b/frontend/src/assets/scss/module/_markets.scss @@ -0,0 +1,209 @@ +.markets-chart > div { + width: 110%; + margin-left: -16px; +} +.markets-container { + position: relative; + overflow: hidden; + height: 159px; + border: 1px solid rgba(0, 0, 0, 0.02); + box-shadow: 0 2px 16px 0 rgba(0, 0, 0, 0.04); + border-radius: 5px; + margin-bottom: 30px; +} + +.markets-chart { + position: absolute; + top: 40px; + width: 100%; + left: 0; +} + +.markets-content span.green, +.markets-content span.red { + position: absolute; + right: 0; + background: #26a69a; + color: #fff; + top: 15px; + padding: 3px 12px; + border-top-left-radius: 50px; + border-bottom-left-radius: 50px; + font-weight: 600; +} +.markets-content span.red { + background: #ef5350; +} +.markets-content h2 { + font-size: 14px; + top: 14px; + position: absolute; + left: 15px; + color: #4a4a4a; +} + +.markets-content p { + position: absolute; + top: 32px; + left: 15px; + font-size: 16px; +} + +.markets-pair-list th, +.markets-pair-list td { + padding: 15px !important; + width: 16%; + font-size: 14px; +} + +.markets-pair-list tbody tr td i { + color: #75869696; +} + +.markets-pair-list .nav-link.active { + color: #007bff; + background: transparent; +} +.markets-pair-list .star-active tbody tr td i { + color: #007bff; +} +.markets-pair-list .nav-link { + color: #4a4a4a; +} + +.markets-pair-list .nav { + background: #f5f9fc; + padding: 7px 0; +} + +.markets-pair-list th { + font-weight: 400; +} + +.markets-pair-list td img { + width: 18px; + vertical-align: text-top; + margin-right: 5px; +} + +.markets-pair-list .load-more { + border: 1px solid #e0e3eb; + display: inline-block; + padding: 11px 30px 8px; + color: #4a4a4a; + margin-top: 50px; + transition: 0.3s; +} + +.markets-pair-list .load-more i { + margin-left: 10px; +} + +.markets-pair-list .load-more:hover { + background: #007bff; + color: #fff; + border: 1px solid #007bff; +} +.markets-item { + margin-bottom: 30px; +} + +.markets-capital-item { + box-shadow: rgba(0, 0, 0, 0.2) 0px 2px 14px -6px; + padding: 40px 0 0 0; + text-align: center; + border-radius: 5px; + border: 1px solid #f2f4f9; + height: 311px; + margin-bottom: 30px; +} + +.markets-capital-chart { + margin-left: -10px; +} + +.markets-capital-item img { + width: 25px; + margin-top: -3px; + margin-right: 2px; +} + +.markets-capital-item h4 { + margin-top: 16px; + margin-bottom: 15px; + font-size: 20px; +} +.markets-capital-item h2 { + font-size: 26px; +} + +.markets-capital-details h3 { + font-size: 18px; + margin-bottom: 40px; +} + +.market-capital-ticker .markets-capital-item { + height: 96.2%; + margin-bottom: 5px; +} +.market-carousel { + overflow: hidden; +} +.market-carousel-item { + box-shadow: #00000033 0px 2px 14px -6px; + border-radius: 5px; + padding: 20px; + border: 1px solid #f2f4f9; + margin: 15px 0; +} +.market-carousel-item-name { + display: flex; + align-items: center; + grid-gap: 20px; + margin-bottom: 25px; +} + +.market-carousel-item-name strong { + font-size: 20px; + font-weight: 400; +} + +.market-carousel-item h2 { + font-size: 26px; +} + +.market-carousel-item p { + font-size: 18px; + margin-bottom: 30px; +} + +.market-carousel-item .btn.buy, +.market-carousel-item .btn.sell { + background: #26de81; + color: #fff; + padding: 8px 20px; + box-shadow: 0px 0px 15px 0px #26de81ad; + font-size: 16px; + width: 47%; + margin-right: 6%; + border: 1px solid transparent; +} + +.market-carousel-item .btn.sell { + background: #ff231f; + box-shadow: 0px 0px 15px 0px #ff231fad; + margin-right: 0px; +} + +.market-carousel-item .btn.buy:hover, +.market-carousel-item .btn.sell:hover { + background: transparent; + color: #000; + box-shadow: none; + border: 1px solid #000; +} +.market-carousel-item-name img { + width: 50px; + height: 50px; + border-radius: 50px; +} diff --git a/frontend/src/assets/scss/module/_module.scss b/frontend/src/assets/scss/module/_module.scss new file mode 100644 index 0000000..811ed78 --- /dev/null +++ b/frontend/src/assets/scss/module/_module.scss @@ -0,0 +1,11 @@ +@import './market-pairs'; +@import './market-book'; +@import './market-trade'; +@import './market-history'; +@import './market-news'; +@import './market-order'; +@import './markets'; +@import './form-access'; +@import './error'; +@import './tradingview'; +@import './settings'; diff --git a/frontend/src/assets/scss/module/_settings.scss b/frontend/src/assets/scss/module/_settings.scss new file mode 100644 index 0000000..082c3c1 --- /dev/null +++ b/frontend/src/assets/scss/module/_settings.scss @@ -0,0 +1,236 @@ +.settings .card { + box-shadow: rgba(0, 0, 0, 0.2) 0px 2px 14px -6px; + border-radius: 5px; + border: none; + margin-bottom: 15px; +} + +.settings-nav { + box-shadow: rgba(0, 0, 0, 0.2) 0px 2px 14px -6px; + border-radius: 5px; +} +.settings-nav .nav-item { + width: 100%; +} +.settings-nav .nav-link { + border-radius: 0; + text-transform: uppercase; + color: #18214d; + font-weight: 600; + margin: 2px 0; + padding: 10px 20px; +} +.settings-nav .nav-link i { + margin-right: 10px; +} +.wallet .settings-nav .nav-link i { + margin-right: 5px; +} +.settings .card-title { + font-size: 16px; + margin-bottom: 30px; +} + +.settings-profile .col-md-6 { + margin-bottom: 20px; +} + +.settings-profile input, +.settings-profile select { + border: 1px solid #e0e3eb; + border-radius: 5px; + font-size: 14px; + height: 45px; +} + +.settings-profile input[type='submit'] { + background: #007bff; + color: #fff; + font-weight: 600; + padding: 10px 25px; + height: inherit; + font-size: 16px; + margin-top: 10px; +} + +.settings-profile .custom-file { + display: inline-block; + width: 20%; + margin-left: 20px; +} + +.settings-profile .custom-file label { + border: 1px solid #e0e3eb; +} + +.settings-profile .custom-file label:after { + background: #007bff; + color: #fff; + font-weight: 600; +} + +.settings .wallet .nav-pills img { + width: 40px; + height: 40px; + margin-right: 15px; +} + +.settings .wallet .nav-pills h2 { + margin-bottom: 0; + line-height: 1; + color: #18214d; + font-size: 22px; +} + +.settings .wallet .nav-pills p { + margin-bottom: 0; + color: #18214d; + font-weight: 400; + text-transform: capitalize; +} + +.settings .wallet .nav-pills a.active { + background: #0f7dff; +} +.settings .wallet .nav-pills a { + border-top: 1px solid #f0f3fa; + padding: 15px; +} +.settings .wallet .nav-pills a:first-child, +.settings-nav .nav-link:first-child { + border-top: 0; + border-top-right-radius: 5px; + border-top-left-radius: 5px; +} +.settings .wallet .nav-pills a:last-child, +.settings .settings-nav .nav-link:last-child { + border-bottom-right-radius: 5px; + border-bottom-left-radius: 5px; +} + +.settings .wallet .nav-pills h3 { + color: #18214d; + margin-bottom: 0; +} +.settings .wallet .nav-pills { + box-shadow: rgba(0, 0, 0, 0.2) 0px 2px 14px -6px; + border-radius: 5px; +} +.settings .wallet .nav-pills a { + border-radius: 0; +} +.settings .wallet .nav-pills a.active h2, +.settings .wallet .nav-pills a.active h3, +.settings .wallet .nav-pills a.active p { + color: #ffffff; +} + +.settings .wallet .tab-content li i { + font-size: 22px; + color: #0f7dff; + background: rgba(15, 125, 255, 0.13); + width: 40px; + height: 40px; + border-radius: 50px; + text-align: center; + line-height: 45px; + margin-right: 15px; +} + +.settings .wallet .tab-content h2 { + margin-bottom: 0; + font-size: 18px; +} +.settings .wallet .tab-content h3 { + margin-bottom: 0; + font-size: 18px; +} + +.settings .wallet .tab-content li:first-child { + border-bottom: 1px solid #f0f3fa; + padding-bottom: 15px; + margin-bottom: 15px; +} + +.settings .wallet .tab-content button.green { + background: #26de81; + color: #ffffff; + box-shadow: 0px 0px 15px 0px #26de81ad; +} +.settings .wallet .tab-content button.red { + background: #ff231f; + box-shadow: 0px 0px 15px 0px #ff231fad; + color: #ffffff; +} +.settings .wallet .tab-content button { + padding: 12px 60px; + margin-right: 10px; + margin-bottom: 20px; +} +.settings .wallet .tab-content button:focus { + box-shadow: none; +} +.settings .wallet .tab-content ul { + margin: 0 0 40px; +} + +.settings .wallet-address input { + padding: 25px 15px; + font-size: 14px; +} +.settings .wallet-address .input-group-prepend button { + padding: 13px 20px; + border-top-right-radius: 5px !important; + border-bottom-right-radius: 5px !important; +} + +.settings .wallet-address input { + border: 1px solid #e0e3eb; +} +.settings .wallet-history i { + margin-left: 14px; +} + +.settings .wallet-address .input-group { + padding-top: 30px; +} +.settings .wallet .tab-content h2.wallet-title { + color: #18214d; + font-size: 16px; +} + +.settings-notification li { + display: flex; + justify-content: space-between; + padding: 15px 0; + border-bottom: 1px solid #f0f3fa; + align-items: center; +} +.settings-notification li:first-child { + padding-top: 0; +} + +.settings-notification li:last-child { + padding-bottom: 0; + border-bottom: 0; +} + +.settings-notification li span { + color: #18214d59; +} + +.settings-notification li p { + margin-bottom: 0; +} + +.settings .custom-control-label { + cursor: pointer; +} + +.wallet-history .ion-md-trash { + font-size: 16px; + cursor: pointer; +} +.wallet-history { + overflow-x: auto; +} diff --git a/frontend/src/assets/scss/module/_tradingview.scss b/frontend/src/assets/scss/module/_tradingview.scss new file mode 100644 index 0000000..9f307f8 --- /dev/null +++ b/frontend/src/assets/scss/module/_tradingview.scss @@ -0,0 +1,12 @@ +.main-chart { + height: 550px; +} +.technical-analysis .tradingview-widget-container { + margin-bottom: 30px; +} +.symbol-info .tradingview-widget-container { + margin-bottom: 15px; +} +.markets-overview .tradingview-widget-container { + margin-bottom: 30px; +} diff --git a/frontend/src/assets/scss/style.scss b/frontend/src/assets/scss/style.scss new file mode 100644 index 0000000..da7fa25 --- /dev/null +++ b/frontend/src/assets/scss/style.scss @@ -0,0 +1,41 @@ +@import './base/base'; +@import './layout/layout'; +@import './module/module'; +@import './theme/theme'; + +.modal-header .close { + display: none; +} + +h1, h3 { + margin: 20px; +} + +.google-btn { + align-items: center; + justify-content: center; + font-family: 'Roboto', sans-serif; + font-size: 14px; + line-height: 16px; + font-weight: 500!important; + letter-spacing: 0.2px; + text-transform: uppercase; + color: white; + background-color: #0F9D58; + border-radius: 2px; + border: none; + box-shadow: 0 3px 4px 0 rgba(0, 0, 0, 0.25); + height: 36px; + padding: 0 16px !important; + cursor: pointer; +} + +.google-btn svg { + width: 18px; + height: 18px; +} + +.google-btn:focus { + outline: none; + box-shadow: 0 0 0 3px rgba(66, 133, 244, 0.3); +} \ No newline at end of file diff --git a/frontend/src/assets/scss/theme/_dark.scss b/frontend/src/assets/scss/theme/_dark.scss new file mode 100644 index 0000000..7d9142e --- /dev/null +++ b/frontend/src/assets/scss/theme/_dark.scss @@ -0,0 +1,419 @@ +.dark, +.dark header { + background: #131722; +} +.dark .light-bb, +.dark .input-group-text, +.dark .nav-tabs { + border: none; + border-bottom: 1px solid #2a2e39; +} +.dark .market-trade .nav-tabs { + border: none; +} +.dark header nav a { + color: #ffffff !important; +} +.dark header nav a:hover { + color: #007bff; +} +.dark .nav-tabs .nav-link.active { + background: transparent; +} +.dark header nav a.btn:hover { + color: #ffffff; +} +.dark header nav .nav-item.active a { + color: #007bff; +} +.dark .market-pairs { + border: 1px solid #2a2e39; + background: #131722; +} +.dark tr { + background: #131722; +} +.dark .market-pairs .table td, +.dark .market-pairs .table th { + border-top: 1px solid #2a2e39; +} +.dark .market-history .table td, +.dark .market-history .table th { + border-top: 1px solid #2a2e39; +} +.dark .order-book thead tr { + border-bottom: 1px solid #2a2e39; +} +.dark .order-book, +.dark .market-history, +.dark .market-news { + border: 1px solid #2a2e39; +} +.dark tbody tr:hover { + background: #2a2e39; +} +.dark .form-control::-webkit-input-placeholder { + /* Chrome/Opera/Safari */ + color: #69727a; +} +.dark .form-control::-moz-placeholder { + /* Firefox 19+ */ + color: #69727a; +} +.dark .form-control:-ms-input-placeholder { + /* IE 10+ */ + color: #69727a; +} +.dark .form-control:-moz-placeholder { + /* Firefox 18- */ + color: #69727a; +} +.dark tbody tr { + color: #ffffff; +} +.dark thead th, +.dark .market-pairs .nav-link { + color: #4f5966; +} +.dark .market-pairs .nav-link.active, +.dark #STAR i { + color: #ffffff; +} +.dark .green { + color: #26de81; +} +.dark .red { + color: #ff231f; +} +.dark .market-pairs .nav { + background: #1c2030; +} +.dark .market-pairs input, +.dark .market-pairs span { + border-color: #2a2e39; + background: #2a2e39; +} +.dark .market-pairs input { + color: #ffffff; +} +.dark .heading { + background: #1c2030; + color: #ffffff; +} +.dark .ob-heading tr { + border-top: 1px solid #2a2e39 !important; + border-bottom: 1px solid #2a2e39 !important; +} +.dark .ob-heading tr:hover { + background: #131722; + cursor: default; +} +.dark .ob-heading span { + color: #4f5966; +} +.dark .dropdown-menu { + background: #131722; + box-shadow: 0 0 10px 0 #131722; + border: 1px solid #2a2e39; +} +.dark .dropdown-item:focus, +.dark .dropdown-item:hover { + background-color: #2a2e39; + color: #ffffff; +} +.dark .market-history .nav { + background: #1c2030; +} +.dark .market-history .nav-link.active { + color: #ffffff; +} +.dark .market-history .nav-link { + color: #4f5966; +} +.dark .red-bg-80:after, +.dark .red-bg-60:after, +.dark .red-bg-40:after, +.dark .red-bg-20:after, +.dark .red-bg-10:after, +.dark .red-bg-8:after, +.dark .red-bg-5:after, +.dark .red-bg:after { + background: #ff231f63; +} +.dark .market-news { + background: #131722; +} +.dark .market-news li { + border-bottom: 1px solid #2a2e39; +} +.dark .market-news li:hover { + background: #2a2e39; +} +.dark .market-news li strong, +.dark .market-news li a { + color: #c5cbce; +} +.dark .market-order { + background: #131722; +} +.dark .no-data i, +.dark .no-data { + color: #2a2e39; +} +.dark .market-trade { + border: 1px solid #2a2e39; + background: #131722; +} +.dark .market-trade .nav .nav-item .nav-link.active { + background: transparent; + color: #ffffff; +} +.dark .market-trade .nav .nav-item .nav-link { + color: #4f5966; +} +.dark .market-trade p { + color: #c5cbce; +} +.dark .market-trade-list li a { + background: #2a2e39; + color: #ffffff; +} +.dark .market-trade input { + border: 1px solid #2a2e39; + background: #2a2e39; + color: #ffffff; +} +.dark .market-trade .input-group-text { + background: #2a2e39; + color: #ffffff; + border-color: #2a2e39; +} +.dark .market-trade-buy .market-trade-list li a:hover { + background: #26de81; + color: #fff; +} +.dark .market-trade-sell .market-trade-list li a:hover { + background: #ff231f; + color: #fff; +} +.dark #darkDepthChart { + background: #131722; +} +.dark .markets { + background: #131722; +} +.dark .table td, +.dark table th { + border-top: 1px solid #2a2e39; +} +.dark .markets-pair-list .nav { + background: #1c2030; +} +.dark .markets-pair-list .nav-link.active, +.dark #STAR i { + color: #ffffff; +} +.dark thead th, +.dark .markets-pair-list .nav-link { + color: #4f5966; +} +.dark .markets-pair-list .load-more { + border: 1px solid #2a2e39; + color: #ffffff; +} +.dark .markets-pair-list .load-more:hover { + color: #fff; + border: 1px solid #007bff; +} +.dark .markets-content h2, +.dark .markets-content p { + color: #ffffff; +} +.dark .markets-content span.green, +.dark .markets-content span.red { + color: #fff; +} +.dark .market-trade-sell { + border-left: 1px solid #2a2e39; +} +.dark .markets-container { + background: #1e222d; +} +.dark .sign-up-form h3 { + border-top: 0; + margin-top: 0; + padding-top: 15px; +} +.dark header nav .nav-item.active a.btn:hover { + color: #fff; +} + +.dark .custom-control-input:checked ~ .custom-control-label::before { + color: #fff; + border-color: #007bff; + background-color: #007bff; +} + +.dark .dropdown-menu::before { + background: #131722; + border-top: 1px solid #2a2e39; + border-left: 1px solid #2a2e39; +} + +.dark .dropdown-menu p { + color: #ffffff; +} + +.dark .dropdown-header { + border-bottom: 1px solid #2a2e39; +} +.dark .dropdown-footer { + border-top: 1px solid #2a2e39; +} + +.dark .header-img-icon .profile-nav .nav-item .nav-link:hover { + background-color: #2a2e39; + color: #ffffff; +} + +.dark .form-control, +.dark .settings-profile select { + background-color: #2a2e39; + border: 1px solid #2a2e39 !important; + color: #ffffff; +} +.dark .form-access form { + padding: 30px; + border-radius: 5px; + min-width: 350px; + box-shadow: 0 0 10px 0 #131722; + border: 1px solid #2a2e39; +} +.dark .form-access h2, +.dark .form-access { + color: #ffffff; +} + +.dark .form-access .custom-control-label::before { + border: #2a2e39 solid 1px; + background-color: #2a2e39; +} + +.dark .error-page a { + border: 1px solid #2a2e39; + color: #ffffff; +} +.dark .error-page a:hover { + border: 1px solid #007bff; + background: #007bff; + color: #ffffff; +} + +.dark .error-page h2, +.dark .error-page p { + color: #c5cbce; +} + +.dark .wallet .nav-pills a, +.dark .wallet-history { + border-top: 1px solid #2a2e39; +} +.dark .wallet .nav { + background: #1e222d; +} +.dark .wallet h2, +.dark .wallet h3, +.dark .wallet h4, +.dark .wallet p { + color: #ffffff !important; +} +.dark .wallet button.green, +.dark .wallet button.red, +.dark .wallet .nav-pills a.active h2, +.dark .wallet .nav-pills a.active h3, +.dark .wallet .nav-pills a.active p { + color: #ffffff; +} + +.dark .wallet .tab-content li:first-child { + border-bottom: 1px solid #2a2e39; +} +.dark .wallet-history tr { + background: #1e222d; +} +.dark .wallet-address input, +.dark .wallet-address input:focus { + border: 1px solid #2a2e39; + background: #2a2e39; + box-shadow: none; + color: #ffffff; +} +.dark .depth-chart-inner { + border: 1px solid #2a2e39; +} + +.dark .markets-capital-item { + box-shadow: 0 0 10px 0 #131722; + border: 1px solid #2a2e39; +} + +.dark .markets-capital-item h2, +.dark .markets-capital-item h4 { + color: #fff; +} +.dark .settings .card { + background: #1e222d; +} + +.dark .settings .card-title { + color: #fff; +} + +.dark .settings-nav { + background: #1e222d; +} + +.dark .settings-nav .nav-link { + color: #ffffff; +} + +.dark .settings-notification li { + border-bottom: 1px solid #2a2e39; +} +.dark .settings-notification li:last-child { + border-bottom: 0; +} +.dark .settings-notification p { + color: #ffffff; +} +.dark .settings-notification span { + color: #4f5966; +} + +.dark .settings label { + color: #fff; +} +.dark .settings .custom-file-label { + background: #2a2e39; + border: 1px solid #2a2e39; + color: #616d75; +} + +.dark .settings-profile input[type='submit'] { + border: 1px solid #007bff; +} +.dark .market-carousel-item { + border: 1px solid #2a2e39; +} +.dark .market-carousel-item { + color: #fff; +} +.dark .market-carousel-item .btn.buy:hover, +.dark .market-carousel-item .btn.sell:hover { + color: #fff; + border-color: #fff; +} +.dark .news-details, +.dark .page-content { + color: #fff; +} diff --git a/frontend/src/assets/scss/theme/_responsive.scss b/frontend/src/assets/scss/theme/_responsive.scss new file mode 100644 index 0000000..74c8436 --- /dev/null +++ b/frontend/src/assets/scss/theme/_responsive.scss @@ -0,0 +1,105 @@ +@media only screen and (max-width: 1434px) { + .market-pairs tbody { + height: 760px; + } + .no-fluid .market-pairs tbody { + height: 815px; + } + .settings-profile .custom-file { + width: 25%; + } +} +@media only screen and (max-width: 1300px) { + .market-pairs tbody { + height: 740px; + } + .no-fluid .market-pairs tbody { + height: 755px; + } +} +@media only screen and (max-width: 1200px) { + .markets-capital-item { + height: 289px; + } +} +@media only screen and (max-width: 991px) { + .error-page h2 { + font-size: 140px; + } + .settings-nav { + margin-bottom: 15px; + } + .settings-profile .custom-file { + width: 35%; + } +} +@media only screen and (max-width: 918px) { + .market-history tbody { + height: 274px; + } +} +@media only screen and (max-width: 792px) { + .market-pairs tbody { + height: 699px; + } +} +@media only screen and (max-width: 768px) { + .settings-profile .custom-file { + width: 45%; + } + header button.navbar-toggler i { + font-size: 30px; + color: #4a4a4a; + } + header button.navbar-toggler:focus { + outline: none; + } + .navbar-collapse .dropdown.menu-avatar-icon { + margin-top: 10px; + } + .no-fluid .market-pairs { + margin-bottom: 15px; + } + .no-fluid .order-book { + margin-top: 15px; + } + .circle-pulse { + left: 25px; + right: inherit; + top: 48px; + } + .header-img-icon { + margin-top: 10px; + } + .header-custom-icon button { + display: block; + } + .dropdown-menu::before { + right: inherit; + left: 5%; + } + .wallet .nav { + margin-bottom: 30px; + } + .wallet-address img { + margin-top: 40px; + } + #dark header button.navbar-toggler i { + color: #c5cbce; + } + .market-order-item { + padding: 5px 5px; + overflow: hidden; + } + .market-order-item li { + font-size: 12px; + } + .markets-capital-item { + height: 304px; + } +} +@media only screen and (max-width: 576px) { + .markets-capital-item { + height: 91.4%; + } +} diff --git a/frontend/src/assets/scss/theme/_theme.scss b/frontend/src/assets/scss/theme/_theme.scss new file mode 100644 index 0000000..e495a0c --- /dev/null +++ b/frontend/src/assets/scss/theme/_theme.scss @@ -0,0 +1,2 @@ +@import './dark'; +@import './responsive'; \ No newline at end of file diff --git a/frontend/src/components/Googel.js b/frontend/src/components/Googel.js new file mode 100644 index 0000000..a981fe5 --- /dev/null +++ b/frontend/src/components/Googel.js @@ -0,0 +1,27 @@ +import {GET, getAPIurl} from '../services/api' +export default function Googel() { + const triggerRedirect = () => { + GET(getAPIurl("/api") + "/social").then((response)=>{ + window.location.href = response + }) + } + return +} \ No newline at end of file diff --git a/frontend/src/components/Header.js b/frontend/src/components/Header.js new file mode 100644 index 0000000..bcc1f96 --- /dev/null +++ b/frontend/src/components/Header.js @@ -0,0 +1,91 @@ +import React from 'react'; +import {Link} from "react-router-dom"; +import {Navbar, Nav, NavDropdown, Dropdown} from 'react-bootstrap'; +import {deleteToken} from "../services/token"; +import {getUserMe} from "../services/api"; +import {useDispatch} from "react-redux"; +import {addUser} from "../user" +import {useHistory} from "react-router-dom"; +export default function Header() { + const history = useHistory() + const [full_name, setFullName] = React.useState() + const [email, setEmail] = React.useState() + const [user_id, setUserId] = React.useState() + const [superuser, setSuperUser] = React.useState() + const dispatch = useDispatch() + + React.useEffect(() => { + const getUsersMe = async () => { + let data = await getUserMe(); + dispatch(addUser(data)) + if (data) { + if (data.is_active === false ) { + history.push("/inactive") + } + setFullName(data["full_name"]) + setEmail(data["email"]) + setUserId(data["id"]) + setSuperUser(data["is_superuser"]) + } else { + deleteToken() + } + } + + getUsersMe().then() + + }, [dispatch]) + return ( + <> + + + Home + + + +

+ + + + + ); +} diff --git a/frontend/src/components/HeaderAuth.js b/frontend/src/components/HeaderAuth.js new file mode 100644 index 0000000..52173da --- /dev/null +++ b/frontend/src/components/HeaderAuth.js @@ -0,0 +1,9 @@ +import React from 'react'; +import {Link} from "react-router-dom"; +import {Navbar, Nav, NavDropdown} from 'react-bootstrap'; +export default function Header() { + + return ( + <> + ); +} diff --git a/frontend/src/components/HistoryOrder.js b/frontend/src/components/HistoryOrder.js new file mode 100644 index 0000000..0134ecd --- /dev/null +++ b/frontend/src/components/HistoryOrder.js @@ -0,0 +1,76 @@ +import React from 'react'; +import { Tabs, Tab } from 'react-bootstrap'; +export default function HistoryOrder() { + return ( + <> +
+ + +
    +
  • Time
  • +
  • All pairs
  • +
  • All Types
  • +
  • Buy/Sell
  • +
  • Price
  • +
  • Amount
  • +
  • Executed
  • +
  • Unexecuted
  • +
+ + + No data + +
+ +
    +
  • Time
  • +
  • All pairs
  • +
  • All Types
  • +
  • Buy/Sell
  • +
  • Price
  • +
  • Amount
  • +
  • Executed
  • +
  • Unexecuted
  • +
+ + + No data + +
+ +
    +
  • Time
  • +
  • All pairs
  • +
  • All Types
  • +
  • Buy/Sell
  • +
  • Price
  • +
  • Amount
  • +
  • Executed
  • +
  • Unexecuted
  • +
+ + + No data + +
+ +
    +
  • Time
  • +
  • All pairs
  • +
  • All Types
  • +
  • Buy/Sell
  • +
  • Price
  • +
  • Amount
  • +
  • Executed
  • +
  • Unexecuted
  • +
+ + + No data + +
+
+
+ + ); +} diff --git a/frontend/src/components/Layout.js b/frontend/src/components/Layout.js new file mode 100644 index 0000000..b685a4b --- /dev/null +++ b/frontend/src/components/Layout.js @@ -0,0 +1,39 @@ +import React from 'react'; +import Header from './Header'; +import {Route, Switch} from "react-router-dom"; +import Dashboard from "../pages/dashboard"; +import UsersEdit from "../pages/users/edit"; +import UsersNew from "../pages/users/new"; +import Users from "../pages/users"; +import Login from "../pages/auth/login"; +import Signup from "../pages/auth/signup"; +import Forgot from "../pages/auth/forgot"; +import Reset from "../pages/auth/reset"; +import Check from "../pages/auth/check"; +import Start from "../pages/start"; +import Inactive from "../pages/auth/inactive"; + +export default function Layout({children}) { + const notAuthorizedUrl = ["/login", "/signup", "/forgot", "/reset", "/check", "/"] + return ( + <>{!notAuthorizedUrl.includes(window.location.pathname) &&
} + + + + + + + + + + + + + + + + + {children} + + ); +} diff --git a/frontend/src/components/LayoutAuth.js b/frontend/src/components/LayoutAuth.js new file mode 100644 index 0000000..bb15bd8 --- /dev/null +++ b/frontend/src/components/LayoutAuth.js @@ -0,0 +1,27 @@ +import React from 'react'; +import HeaderAuth from './HeaderAuth'; +import {Route, Switch} from "react-router-dom"; +import Login from '../pages/auth/login' +import Signup from '../pages/auth/signup' +import Forgot from '../pages/auth/forgot' +import Reset from '../pages/auth/reset' +import Check from '../pages/auth/check' +import Inactive from '../pages/auth/inactive' +import Start from '../pages/start' +export default function Layout({ children }) { + return ( + <> + + + + + + + + + + + {children} + + ); +} diff --git a/frontend/src/components/Pagination.js b/frontend/src/components/Pagination.js new file mode 100644 index 0000000..8bc6b15 --- /dev/null +++ b/frontend/src/components/Pagination.js @@ -0,0 +1,26 @@ +import Pagination from 'react-bootstrap/Pagination'; +import {useHistory} from "react-router-dom"; + +export default function Pages({pages, setPage}) { + const history = useHistory() + const current_page = window.location.pathname.split("/")[2] + let active = current_page? parseInt(current_page) : 1; + let items = []; + const url = "/" + window.location.pathname.split("/")[1] + "/" + const paginationClicked = (id) => { + history.push(url + id) + setPage(id) + } + for (let number = 1; number <= pages; number++) { + items.push( + paginationClicked(number)}> + {number} + , + ); + } + + + return (<> + {items} + ); +} \ No newline at end of file diff --git a/frontend/src/components/pages/auth/check.js b/frontend/src/components/pages/auth/check.js new file mode 100644 index 0000000..e2c2173 --- /dev/null +++ b/frontend/src/components/pages/auth/check.js @@ -0,0 +1,15 @@ +export default function Check() { + + return
+
+
+
+
+

Check your email

+

We have sent a password recover instructions to your email

+
+
+
+
+
+} \ No newline at end of file diff --git a/frontend/src/components/pages/auth/forgot.js b/frontend/src/components/pages/auth/forgot.js new file mode 100644 index 0000000..a02d8a5 --- /dev/null +++ b/frontend/src/components/pages/auth/forgot.js @@ -0,0 +1,30 @@ +import React from 'react'; +import { Link } from 'react-router-dom'; + +export default function Forgot({refEmail, submitHandler}) { + return ( + <> +
+
+
+ Reset password + + +

+ Remember Password? + Sign in here +

+
+
+
+ + ); +} \ No newline at end of file diff --git a/frontend/src/components/pages/auth/inactive.js b/frontend/src/components/pages/auth/inactive.js new file mode 100644 index 0000000..43822c9 --- /dev/null +++ b/frontend/src/components/pages/auth/inactive.js @@ -0,0 +1,16 @@ +import React from "react"; + +export default function Inactive() { + return <>
+
+
+ Activate account +

You need activate your account, please click button in email, if you don't recive email you can resend it

+ +
+ +
+
+} \ No newline at end of file diff --git a/frontend/src/components/pages/auth/lock.js b/frontend/src/components/pages/auth/lock.js new file mode 100644 index 0000000..8632e99 --- /dev/null +++ b/frontend/src/components/pages/auth/lock.js @@ -0,0 +1,28 @@ +import React from 'react'; +import { Link } from 'react-router-dom'; + +export default function otpVerify() { + return ( + <> +
+
+
+ Locked + + +

+ No luck? Reset Password +

+
+
+
+ + ); +} diff --git a/frontend/src/components/pages/auth/login.js b/frontend/src/components/pages/auth/login.js new file mode 100644 index 0000000..3ae94f3 --- /dev/null +++ b/frontend/src/components/pages/auth/login.js @@ -0,0 +1,48 @@ +import React from 'react'; +import Google from "../../Googel"; + +export default function LoginPage({refUsername, refPassword, submitHandler}) { + return ( + <> +
+ + ); +} diff --git a/frontend/src/components/pages/auth/otp-number.js b/frontend/src/components/pages/auth/otp-number.js new file mode 100644 index 0000000..cb98f67 --- /dev/null +++ b/frontend/src/components/pages/auth/otp-number.js @@ -0,0 +1,31 @@ +import React from 'react'; +import { Link } from 'react-router-dom'; + +export default function otpVerify() { + return ( + <> +
+
+
+ OTP Verification +

+ We will send one time code on this number +

+ + +

+ Don't get code? Resend +

+
+
+
+ + ); +} diff --git a/frontend/src/components/pages/auth/otp-verify.js b/frontend/src/components/pages/auth/otp-verify.js new file mode 100644 index 0000000..355791d --- /dev/null +++ b/frontend/src/components/pages/auth/otp-verify.js @@ -0,0 +1,27 @@ +import React from 'react'; + +export default function otpVerify() { + return ( + <> +
+
+
+ OTP Verification +

+ One time code send on on your number +

+ + +
+
+
+ + ); +} diff --git a/frontend/src/components/pages/auth/reset.js b/frontend/src/components/pages/auth/reset.js new file mode 100644 index 0000000..4a6a630 --- /dev/null +++ b/frontend/src/components/pages/auth/reset.js @@ -0,0 +1,34 @@ +import React from 'react'; +import { Link } from 'react-router-dom'; + +export default function Reset({refPassword, refPassword2, submitHandler}) { + return ( + <> +
+
+
+ Reset password +
+ + + +
+
+
+ + ); +} diff --git a/frontend/src/components/pages/auth/signup.js b/frontend/src/components/pages/auth/signup.js new file mode 100644 index 0000000..46950b6 --- /dev/null +++ b/frontend/src/components/pages/auth/signup.js @@ -0,0 +1,73 @@ +import React from 'react'; +import { Link } from 'react-router-dom'; +import Google from "../../Googel"; + +export default function Signup({refName, refEmail, refPassword, refPassword2, submitHandler}) { + return ( + <> +
+
+
+ Create Account +
+ +
+
+ +
+
+ +
+
+ +
+ + {/*
*/} + {/* */} + {/* */} + {/*
*/} + + +

+ Already have an account? + Sign in here +

+
+
+ + ); +} diff --git a/frontend/src/components/pages/notadmin.js b/frontend/src/components/pages/notadmin.js new file mode 100644 index 0000000..2f1b35a --- /dev/null +++ b/frontend/src/components/pages/notadmin.js @@ -0,0 +1,10 @@ +import {deleteToken} from "../services/token"; +import {useHistory} from "react-router-dom"; +export default function NotAdmin() { + const history = useHistory() + return <>You are not admin +} \ No newline at end of file diff --git a/frontend/src/components/pages/profile.js b/frontend/src/components/pages/profile.js new file mode 100644 index 0000000..7a64531 --- /dev/null +++ b/frontend/src/components/pages/profile.js @@ -0,0 +1,80 @@ +import React from 'react'; +import { Tab, Row, Col, Nav } from 'react-bootstrap'; +import {useSelector} from "react-redux"; +import withToken from "../hocs/withToken"; +const Profile = () => { + const refEmail = React.useRef() + const refFullName = React.useRef() + const {email, full_name} = useSelector((store)=>store.user) + + const handleSubmit = (e) => { + e.preventDefault() + + } + React.useEffect(()=>{ + refEmail.current.value = email + refFullName.current.value = full_name + }) + return ( + <> +
+
+ + + + + + + + +
+
+
General Information
+
+
+
+
+ + +
+ +
+ + +
+
+ +
+
+
+
+
+
+
+
+ +
+
+
+
+ + ); +} + +export default withToken(Profile) diff --git a/frontend/src/components/pages/users/form.js b/frontend/src/components/pages/users/form.js new file mode 100644 index 0000000..fe0b748 --- /dev/null +++ b/frontend/src/components/pages/users/form.js @@ -0,0 +1,78 @@ +import React from "react"; + +export default function From({ + title, + button, + submitHandle, + refUsername, + refEmail, + refPassword, + refSuperuser, + refActive, + refLabel, + handleOnChange + }) { + return ( + <>

{title}

+
+
+
+
+
+
+ + + + + + +
+ + +
+
+ + +
+
+ +
+ +
+
+
+
+
+
+ + ); +} \ No newline at end of file diff --git a/frontend/src/components/pages/users/list.js b/frontend/src/components/pages/users/list.js new file mode 100644 index 0000000..e1b9644 --- /dev/null +++ b/frontend/src/components/pages/users/list.js @@ -0,0 +1,49 @@ +import CheckIcon from "@mui/icons-material/Check"; +import EditIcon from "@mui/icons-material/Edit"; +import DeleteIcon from "@mui/icons-material/Delete"; +import React from "react"; +import Pagination from '../../Pagination' +import {useHistory} from "react-router-dom"; +export default function List({users, editHandler, deleteHandler, pages, setPage}) { + const history = useHistory() + const u = Object.values(users) + + return (<> +

List of users

+ + + + + + + + + + + + + + {u.map((user) => { + const {id, full_name, email, is_superuser, is_active} = user; + return ( + + + + + + + + + + ); + })} + + + +
IDFull nameEmailIs superuserIs active
{id}{full_name}{email}{is_superuser ? : ''}{is_active ? : ''} editHandler(id)}/> deleteHandler(id)}/>
+ + ) +} \ No newline at end of file diff --git a/frontend/src/context/ThemeContext.js b/frontend/src/context/ThemeContext.js new file mode 100644 index 0000000..e47feaa --- /dev/null +++ b/frontend/src/context/ThemeContext.js @@ -0,0 +1,8 @@ +import React from 'react'; + +const ThemeContext = React.createContext(); + +const ThemeProvider = ThemeContext.Provider; +const ThemeConsumer = ThemeContext.Consumer; + +export { ThemeProvider, ThemeConsumer }; diff --git a/frontend/src/hocs/withToken.js b/frontend/src/hocs/withToken.js new file mode 100644 index 0000000..bee76b4 --- /dev/null +++ b/frontend/src/hocs/withToken.js @@ -0,0 +1,16 @@ +import React from "react" +import {getToken} from "../services/token"; + +const withProtectedRoute = (Component) =>{ + const WithToken = (props) => { + const token = getToken() + console.log("Token", token) + if (!token) { + return window.location.href = "/login" + } + return + } + return WithToken +} + +export default withProtectedRoute; \ No newline at end of file diff --git a/frontend/src/index.css b/frontend/src/index.css deleted file mode 100644 index ec2585e..0000000 --- a/frontend/src/index.css +++ /dev/null @@ -1,13 +0,0 @@ -body { - margin: 0; - font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', 'Roboto', 'Oxygen', - 'Ubuntu', 'Cantarell', 'Fira Sans', 'Droid Sans', 'Helvetica Neue', - sans-serif; - -webkit-font-smoothing: antialiased; - -moz-osx-font-smoothing: grayscale; -} - -code { - font-family: source-code-pro, Menlo, Monaco, Consolas, 'Courier New', - monospace; -} diff --git a/frontend/src/index.js b/frontend/src/index.js index d563c0f..2d61c43 100644 --- a/frontend/src/index.js +++ b/frontend/src/index.js @@ -1,17 +1,43 @@ import React from 'react'; -import ReactDOM from 'react-dom/client'; -import './index.css'; -import App from './App'; -import reportWebVitals from './reportWebVitals'; +import {createRoot} from 'react-dom/client'; +import {transitions, positions, Provider as AlertProvider} from 'react-alert' +import AlertTemplate from 'react-alert-template-basic' +import {store} from "./store" +import {Provider} from "react-redux"; +import {BrowserRouter, Route, Switch, useParams} from "react-router-dom"; +import Layout from "./components/Layout"; +import {getToken} from "./services/token"; +import LayoutAuth from "./components/LayoutAuth"; +import './assets/css/ionicons.min.css'; +import './assets/scss/style.scss'; +import 'bootstrap/dist/css/bootstrap.min.css'; -const root = ReactDOM.createRoot(document.getElementById('root')); + +import Users from "./pages/users"; +import UsersNew from "./pages/users/new"; +import UsersEdit from "./pages/users/edit"; + +import Dashboard from "./pages/dashboard"; + +const options = { + position: positions.TOP_CENTER, + timeout: 5000, + offset: "100px", + type: "error", + transition: transitions.FADE +} + + +const root = createRoot(document.getElementById('root')) root.render( - - - + + + + + + + + + , ); -// If you want to start measuring performance in your app, pass a function -// to log results (for example: reportWebVitals(console.log)) -// or send to an analytics endpoint. Learn more: https://bit.ly/CRA-vitals -reportWebVitals(); diff --git a/frontend/src/logo.svg b/frontend/src/logo.svg deleted file mode 100644 index 9dfc1c0..0000000 --- a/frontend/src/logo.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/frontend/src/pages/auth/check.js b/frontend/src/pages/auth/check.js new file mode 100644 index 0000000..b878eca --- /dev/null +++ b/frontend/src/pages/auth/check.js @@ -0,0 +1,4 @@ +import Check from "../../components/pages/auth/check"; +export default function CheckPage() { + return +} \ No newline at end of file diff --git a/frontend/src/pages/auth/forgot.js b/frontend/src/pages/auth/forgot.js new file mode 100644 index 0000000..90a11e8 --- /dev/null +++ b/frontend/src/pages/auth/forgot.js @@ -0,0 +1,26 @@ +import Forgot from "../../components/pages/auth/forgot"; +import React from "react" +import {useHistory} from "react-router-dom"; +import {useAlert} from "react-alert"; +import {recovery} from "../../services/api"; +export default function ForgotPage() { + const refEmail = React.useRef() + const history = useHistory() + const alert = useAlert() + const submitHandler = async (e) => { + e.preventDefault() + const response = await recovery(refEmail.current.value) + + if (response.msg) { + history.push("/check") + } else { + alert.show(response.response.data.detail) + } + + + } + React.useEffect(() => { + refEmail.current.focus() + }) + return +} \ No newline at end of file diff --git a/frontend/src/pages/auth/inactive.js b/frontend/src/pages/auth/inactive.js new file mode 100644 index 0000000..85d5a2f --- /dev/null +++ b/frontend/src/pages/auth/inactive.js @@ -0,0 +1,21 @@ +import withToken from "../../hocs/withToken"; +import Inactive from "../../components/pages/auth/inactive"; +import {getToken} from "../../services/token"; +import {useHistory} from "react-router-dom"; +import { useSelector } from "react-redux"; +const userSelector = (state) => { + // state.createSlice.user +} + +const InactivePage = () =>{ + const user = useSelector(userSelector) + console.log(user) + + const history = useHistory() + if (getToken()) { + history.push("/dashboard") + } + return +} + +export default withToken(InactivePage) \ No newline at end of file diff --git a/frontend/src/pages/auth/login.js b/frontend/src/pages/auth/login.js new file mode 100644 index 0000000..27f9ff1 --- /dev/null +++ b/frontend/src/pages/auth/login.js @@ -0,0 +1,44 @@ +import Login from '../../components/pages/auth/login' +import {auth} from "../../services/api"; +import React from "react"; +import {useAlert} from "react-alert"; +import {getToken} from "../../services/token"; +import {showError} from "../../utils"; +import {useHistory} from "react-router-dom"; + +export default function LoginPage() { + const refUsername = React.useRef() + const refPassword = React.useRef() + const alert = useAlert() + const history = useHistory() + if (getToken()) { + history.push("/dashboard") + } + const submitHandler = async (e) => { + e.preventDefault() + + const authenticate = { + 'username': refUsername.current.value, + 'password': refPassword.current.value + } + + auth(authenticate).then((response) => { + if (response && response.code !== "ERR_NETWORK") { + window.location.pathname = '/inactive' + } else { + showError(alert, response ? response : "Login error") + } + }) + + return false + } + + React.useEffect(() => { + refUsername.current.focus() + }, []) + return +} \ No newline at end of file diff --git a/frontend/src/pages/auth/reset.js b/frontend/src/pages/auth/reset.js new file mode 100644 index 0000000..bae4636 --- /dev/null +++ b/frontend/src/pages/auth/reset.js @@ -0,0 +1,48 @@ +import Reset from '../../components/pages/auth/reset' +import {useAlert} from "react-alert"; +import {showError} from "../../utils"; +import {reset, auth} from "../../services/api" +import React from "react" +import {saveToken} from "../../services/token"; +import {useHistory} from "react-router-dom"; +export default function ResetPage() { + const refPassword = React.useRef() + const refPassword2 = React.useRef() + const history = useHistory() + const alert = useAlert() + + const submitHandler = (e) => { + e.preventDefault() + const password = refPassword.current.value + const password2 = refPassword2.current.value + if (password !== password2) { + showError(alert, "Password mismatch") + } else { + const token = window.location.search.split("?token=")[1] + reset(token, password).then((response) => { + if (response.id) { + const email = response.email + auth({"username": email, "password": password}).then((response) => { + if (response.status === 200) { + saveToken(response.data.access_token).then() + history.push("/dashboard") + } else { + showError(alert, response) + } + }) + } else { + showError(alert, response) + } + + + }) + } + + + } + return +} \ No newline at end of file diff --git a/frontend/src/pages/auth/signup.js b/frontend/src/pages/auth/signup.js new file mode 100644 index 0000000..dfd9111 --- /dev/null +++ b/frontend/src/pages/auth/signup.js @@ -0,0 +1,54 @@ +import Signup from '../../components/pages/auth/signup' +import {useAlert} from "react-alert"; +import {showError} from "../../utils"; +import {register, auth} from "../../services/api" +import React from "react" +import {getToken} from "../../services/token"; +import {useHistory} from "react-router-dom"; +export default function SignUpPage() { + const refName = React.useRef() + const refEmail = React.useRef() + const refPassword = React.useRef() + const refPassword2 = React.useRef() + const history = useHistory() + const alert = useAlert() + if (getToken()) { + history.push("/dashboard") + } + const submitHandler = (e) => { + e.preventDefault() + + const full_name = refName.current.value + const email = refEmail.current.value + const password = refPassword.current.value + const password2 = refPassword2.current.value + if (password !== password2) { + showError(alert, "Password mismatch") + } else { + register(full_name, email, password).then((response) => { + if (response.id) { + auth({"username": email, "password": password}).then((response) => { + if (response) { + window.location.href = "/inactive" + } else { + alert.show(response.response.data.detail) + } + }) + } else { + showError(alert, response) + } + + + }) + } + + + } + return +} \ No newline at end of file diff --git a/frontend/src/pages/dashboard.js b/frontend/src/pages/dashboard.js new file mode 100644 index 0000000..cf31a74 --- /dev/null +++ b/frontend/src/pages/dashboard.js @@ -0,0 +1,32 @@ +import withToken from "../hocs/withToken"; +import {getStats} from "../services/api"; +import React from "react" +import {Table} from 'react-bootstrap'; +const Dashboard = () => { + const [stats, setStats] = React.useState({}) + + React.useEffect(()=>{ + getStats().then(setStats) + },[]) + return <> <> +

Global stats

+ + + + + + + + + + + + + + + +
MetricValue
Total users{stats.users}
+ +} + +export default withToken(Dashboard) \ No newline at end of file diff --git a/frontend/src/pages/start.js b/frontend/src/pages/start.js new file mode 100644 index 0000000..b6d53f2 --- /dev/null +++ b/frontend/src/pages/start.js @@ -0,0 +1,34 @@ +import Button from 'react-bootstrap/Button'; +import Modal from 'react-bootstrap/Modal'; +import {useHistory} from "react-router-dom"; +import {getToken} from "../services/token"; +import Google from '../components/Googel' +export default function Start() { + const history = useHistory() + if (getToken()) { + window.location.href = "/dashboard" + } + return <> +
+ + + Logo + + + +

You can login or signup

+ +
+ + + + + +
+ +
+ +} \ No newline at end of file diff --git a/frontend/src/pages/users/edit.js b/frontend/src/pages/users/edit.js new file mode 100644 index 0000000..f729634 --- /dev/null +++ b/frontend/src/pages/users/edit.js @@ -0,0 +1,76 @@ +import React from 'react'; +import {getUser, updateUser} from "../../services/api"; +import {useAlert} from "react-alert"; +import withToken from "../../hocs/withToken"; +import {showError} from "../../utils"; +import Form from '../../components/pages/users/form' +import {createAvatar} from "../../services/api"; +import {useParams} from "react-router-dom"; +const UsersEdit = () => { + + const refUsername = React.useRef() + const refEmail = React.useRef() + const refPassword = React.useRef() + const refSuperuser = React.useRef() + const refActive = React.useRef() + const alert = useAlert() + const refLabel = React.useRef() + const [selectedFile, setSelectedFile] = React.useState([]); + const {id} = useParams(); + + + const handleOnChange = (e) => { + setSelectedFile(e.target.files[0]) + } + + const submitHandle = (e) => { + e.preventDefault() + + updateUser( + id, + refUsername.current.value, + refEmail.current.value, + refPassword.current.value, + refSuperuser.current.checked, + refActive.current.checked + ).then((response) => { + response.email === refEmail.current.value ? window.location.href = "/users" : showError(alert, response) + }) + + if (setSelectedFile) { + createAvatar(selectedFile, id).then((response) => { + console.log(response) + }).catch((err) => alert.show("File Upload Error: " + err)); + } + + } + + React.useEffect(() => { + getUser(id).then((user) => { + if (id === null || user.email === null) { + window.location.href = "/users" + } else { + refUsername.current.value = user.full_name + refEmail.current.value = user.email + refSuperuser.current.checked = user.is_superuser + refActive.current.checked = user.is_active + } + }) + + }, []) + + return
+} + +export default withToken(UsersEdit) \ No newline at end of file diff --git a/frontend/src/pages/users/index.js b/frontend/src/pages/users/index.js new file mode 100644 index 0000000..9397c0d --- /dev/null +++ b/frontend/src/pages/users/index.js @@ -0,0 +1,49 @@ +import React from 'react'; +import {getUsers, deleteUser, getPagination} from "../../services/api"; +import {useAlert} from "react-alert"; +import withToken from "../../hocs/withToken"; +import List from "../../components/pages/users/list" +import {deleteRow, showError} from "../../utils"; + +const UsersList = () => { + const [users, setUsers] = React.useState([]); + const [pages, setPages] = React.useState(0) + const [page, setPage] = React.useState(1) + const alert = useAlert() + console.log("Users list") + const editHandler = (id) => { + window.location.href = "/users/edit/" + id + } + const deleteHandler = (id) => { + deleteRow(id) + setTimeout(() => { + deleteUser(id).then((response) => { + response.email ? document.getElementById("tr" + id).remove() : showError(alert, response) + }) + }, 500) + + + } + React.useEffect(() => { + getPagination('users') + .then(setPages) + .catch(error => alert.show(error)); + }, [alert]) + React.useEffect(() => { + const current_page = window.location.pathname.split("/")[2] + setPage(current_page ? parseInt(current_page):1) + getUsers((page - 1) * 10, 10) + .then(setUsers) + .catch(error => alert.show(error)); + + }, [page]) + return (); +} + +export default withToken(UsersList) \ No newline at end of file diff --git a/frontend/src/pages/users/new.js b/frontend/src/pages/users/new.js new file mode 100644 index 0000000..4a03554 --- /dev/null +++ b/frontend/src/pages/users/new.js @@ -0,0 +1,40 @@ +import React from 'react'; +import {createUser} from "../../services/api"; +import {useAlert} from "react-alert"; +import withToken from "../../hocs/withToken"; +import Form from '../../components/pages/users/form' +import {showError} from "../../utils"; + +const UsersNew = () => { + const refUsername = React.useRef() + const refEmail = React.useRef() + const refPassword = React.useRef() + const refSuperuser = React.useRef() + const refActive = React.useRef() + const alert = useAlert() + const submitHandle = (e) => { + e.preventDefault() + + createUser(refPassword.current.value, + refEmail.current.value, + refPassword.current.value, + refSuperuser.current.checked, + refActive.current.checked + ) + .then((response) => { + response.email === refEmail.current.value ? window.location.href = "/users" : showError(alert, response) + }) + } + return () +} + +export default withToken(UsersNew) \ No newline at end of file diff --git a/frontend/src/reportWebVitals.js b/frontend/src/reportWebVitals.js deleted file mode 100644 index 5253d3a..0000000 --- a/frontend/src/reportWebVitals.js +++ /dev/null @@ -1,13 +0,0 @@ -const reportWebVitals = onPerfEntry => { - if (onPerfEntry && onPerfEntry instanceof Function) { - import('web-vitals').then(({ getCLS, getFID, getFCP, getLCP, getTTFB }) => { - getCLS(onPerfEntry); - getFID(onPerfEntry); - getFCP(onPerfEntry); - getLCP(onPerfEntry); - getTTFB(onPerfEntry); - }); - } -}; - -export default reportWebVitals; diff --git a/frontend/src/services/api.js b/frontend/src/services/api.js new file mode 100644 index 0000000..fe0fda6 --- /dev/null +++ b/frontend/src/services/api.js @@ -0,0 +1,134 @@ +import axios from "axios"; +import {id2key} from "../utils"; +function getAPIurl(url) { + if ( window.location.host === "localhost:3000" ) { + url = "http://localhost:8000/api/v1" + } + return url +} +const GET = (url) => { + return axios.get(url) + .then(function (response) { + return response.data + }) + .catch(function (error) { + return error + }) +} +const POST = (url, payload) => { + return axios.post(url, payload) + .then(function (response) { + return response.data + }) + .catch(function (error) { + return error + }) +} + +const PUT = (url, payload) => { + return axios.put(url, payload) + .then(function (response) { + return response.data + }) + .catch(function (error) { + return error + }) +} +const DELETE = (url) => { + return axios.delete(url) + .then(function (response) { + return response.data + }) + .catch(function (error) { + return error + }) +} +const auth = (authenticate) => { + return axios({ + method: 'post', + url: getAPIurl("/api") + '/login/access-token', + data: authenticate, + withCredentials: true, + headers: {"Content-Type": "multipart/form-data"} + } + , authenticate) + .then(function (response) { + return response + }) + .catch(function (error) { + return error + }); +} +const register = (name, email, password) => { + return POST(getAPIurl("/api") + '/users/open', { + "email": email, + "full_name": name, + "password": password + }) +} +const recovery = (email) => { + return POST(getAPIurl("/api") + '/password-recovery/' + email) +} +const reset = (token, password) => { + return POST(getAPIurl("/api") + '/reset-password/', { + "token": token, + "new_password": password + }) +} +const getUserMe = () => { + return GET(getAPIurl("/api") + '/users/me') +} +const createAvatar = (file, user_id = null) => { + const formData = new FormData(); + formData.append("file", file); + return POST("/api/users/avatar/?user_id=" + user_id , formData); +} + +const getStats = () => { + return GET(getAPIurl("/api") + '/users/stats') +} + + +const getPagination = (url) => { + return GET(getAPIurl("/api") + '/' + url + '/pagination') +} + +// USERS +const createUser = (full_name, email, password, is_superuser, is_active) => { + return POST(getAPIurl("/api") + '/users/', { + "email": email, + "is_active": is_active, + "is_superuser": is_superuser, + "full_name": full_name, + "avatar": "string", + "description": "string", + "password": password + }) +} +const getUsers = (skip=0, limit=10) => { + return id2key(GET(getAPIurl("/api") + '/users/?skip=' + skip + '&limit=' + limit)) +} +const getUser = (id) => { + return GET(getAPIurl("/api") + '/users/' + id) +} +const updateUser = (id, full_name, email, password, is_superuser, is_active) => { + return PUT(getAPIurl("/api") + '/users/' + id, { + "email": email, + "is_active": is_active, + "is_superuser": is_superuser, + "full_name": full_name, + "avatar": "string", + "description": "string", + "password": password + }) +} +const deleteUser = (id) => { + return DELETE(getAPIurl("/api") + '/users/' + id) +} + +export { + auth, register, recovery, reset, + getUserMe, createUser, getUsers, getUser, updateUser, deleteUser, createAvatar, getStats, + getPagination, + GET, getAPIurl +} diff --git a/frontend/src/services/const.js b/frontend/src/services/const.js new file mode 100644 index 0000000..7c18653 --- /dev/null +++ b/frontend/src/services/const.js @@ -0,0 +1,2 @@ +// eslint-disable-next-line import/no-anonymous-default-export +export default {url : 'https://localhost:8000/api/v1'} diff --git a/frontend/src/services/token.js b/frontend/src/services/token.js new file mode 100644 index 0000000..46c62f2 --- /dev/null +++ b/frontend/src/services/token.js @@ -0,0 +1,13 @@ +const saveToken = async (token) => { + if (token) { + localStorage.setItem('access-token', token) + } +} +const getToken = () => { + return document.cookie.split("token=")[1] +} +const deleteToken = () => { + document.cookie = 'token=; Max-Age=-99999999;'; + window.location.href = "/login" +} +export {saveToken, getToken, deleteToken} \ No newline at end of file diff --git a/frontend/src/setupTests.js b/frontend/src/setupTests.js deleted file mode 100644 index 8f2609b..0000000 --- a/frontend/src/setupTests.js +++ /dev/null @@ -1,5 +0,0 @@ -// jest-dom adds custom jest matchers for asserting on DOM nodes. -// allows you to do things like: -// expect(element).toHaveTextContent(/react/i) -// learn more: https://github.com/testing-library/jest-dom -import '@testing-library/jest-dom'; diff --git a/frontend/src/store.js b/frontend/src/store.js new file mode 100644 index 0000000..f235611 --- /dev/null +++ b/frontend/src/store.js @@ -0,0 +1,9 @@ +import {configureStore} from "@reduxjs/toolkit"; +import userReducer from "./user" + +export const store = configureStore({ + reducer: { + user: userReducer, + + }, +}); diff --git a/frontend/src/user.js b/frontend/src/user.js new file mode 100644 index 0000000..74c7191 --- /dev/null +++ b/frontend/src/user.js @@ -0,0 +1,27 @@ +import {createSlice} from "@reduxjs/toolkit"; + + +const initialState = { + full_name: "Full Name", + email: "user@example.com", + is_superuser: null, + is_active: null, +} + +const userSlice = createSlice({ + name: 'user', + initialState, + reducers: { + addUser: (state, {payload}) => { + return ({ + full_name: payload.full_name, + email: payload.email, + is_superuser: payload.is_superuser, + is_active: payload.is_active + }) + } + } +}) + +export const { addUser } = userSlice.actions +export default userSlice.reducer \ No newline at end of file diff --git a/frontend/src/utils.js b/frontend/src/utils.js new file mode 100644 index 0000000..5ac794a --- /dev/null +++ b/frontend/src/utils.js @@ -0,0 +1,54 @@ +const populateSelect = (data, label_field) => { + let result = [] + for (const i in data) { + if (typeof data[i] === "object") { + result.push({value: data[i].id, label: data[i][label_field]}) + } + } + return result +} + +const convertList = (list, field) => { + let result = [] + for (const i in list) { + if (list[i].created) { + result[list[i].id] = list[i].created + } + if (list[i].full_name) { + result[list[i].id] = list[i].full_name + } + + } + + console.log(result) + return result +} + +const deleteRow = (id) => { + const elements = document.getElementsByClassName("td" + id) + for (const el in elements) { + if (elements[el].style) { + elements[el].style.color = "black" + elements[el].style.backgroundColor = "red" + } + } +} +const showError = (alert, response) => { + if (response.response) { + let message = response.response.data.detail ? response.response.data.detail : response.response.data + if (typeof message === "object") { + console.log("Object") + message = message[0]["msg"] + } + alert.show(message) + } else if (response.message) { + alert.show(response.message) + } + else { + alert.show(response) + } +} +const id2key = async (list) => { + return Object.fromEntries((await list).map(item => [item.id, item])); +} +export {populateSelect, convertList, id2key, deleteRow, showError} \ No newline at end of file From e292c8a63b11ff01751304b7b512128920852b98 Mon Sep 17 00:00:00 2001 From: Dmytro Holub Date: Sun, 2 Apr 2023 13:25:16 +0200 Subject: [PATCH 06/31] id #78 update --- .vscode/extensions.json | 5 - .vscode/launch.json | 2 +- .vscode/mongotech.code-workspace | 8 ++ README.md | 15 +- backend/app/app/api/api_v1/endpoints/login.py | 10 +- backend/app/app/api/api_v1/endpoints/users.py | 12 +- backend/app/app/api/deps.py | 2 +- backend/app/app/crud/__init__.py | 2 +- backend/app/app/crud/base.py | 9 +- backend/app/app/crud/crud_confirm.py | 4 +- backend/app/app/crud/crud_user.py | 3 +- backend/app/app/db/init_db.py | 3 +- backend/app/app/libs/error.py | 3 +- backend/app/app/main.py | 5 +- backend/app/app/models/__init__.py | 2 +- backend/app/app/schemas/__init__.py | 2 +- backend/app/app/schemas/base.py | 1 + backend/app/app/schemas/confirm.py | 5 +- backend/app/app/schemas/user.py | 5 +- backend/app/app/utils.py | 6 +- docker-compose.dev.yml | 52 ------- docker-compose.dev64.yml | 52 ------- docker-compose.override.yml | 75 ---------- docker-compose.yml | 131 ------------------ frontend/.gitignore | 23 +-- frontend/src/pages/auth/inactive.js | 9 +- frontend/src/user.js | 12 +- 27 files changed, 74 insertions(+), 384 deletions(-) delete mode 100644 .vscode/extensions.json create mode 100644 .vscode/mongotech.code-workspace delete mode 100644 docker-compose.dev.yml delete mode 100644 docker-compose.dev64.yml delete mode 100644 docker-compose.override.yml delete mode 100644 docker-compose.yml diff --git a/.vscode/extensions.json b/.vscode/extensions.json deleted file mode 100644 index 60d2386..0000000 --- a/.vscode/extensions.json +++ /dev/null @@ -1,5 +0,0 @@ -{ - "recommendations": [ - "ritwickdey.liveserver" - ] -} \ No newline at end of file diff --git a/.vscode/launch.json b/.vscode/launch.json index e72e3ad..ee79e80 100644 --- a/.vscode/launch.json +++ b/.vscode/launch.json @@ -9,7 +9,7 @@ "type": "python", "request": "launch", "program": "/home/dg/web/mongotech/backend/app/app/main.py", - "cwd": "/home/dg/web/mongotech/backend/app/app", + "cwd": "/home/dg/web/mongotech", "console": "integratedTerminal", "justMyCode": true, "envFile": "${workspaceFolder}/.env.local" diff --git a/.vscode/mongotech.code-workspace b/.vscode/mongotech.code-workspace new file mode 100644 index 0000000..bab1b7f --- /dev/null +++ b/.vscode/mongotech.code-workspace @@ -0,0 +1,8 @@ +{ + "folders": [ + { + "path": ".." + } + ], + "settings": {} +} \ No newline at end of file diff --git a/README.md b/README.md index 2b0fc58..ee967c1 100644 --- a/README.md +++ b/README.md @@ -10,7 +10,7 @@ * [Docker+Docker Compose](https://www.docker.com/ + https://docs.docker.com/compose/install/). * [Git](https://git-scm.com/book/en/v2/Getting-Started-Installing-Git) -* [Python 3.9](https://www.python.org/downloads/release/python-3913/) +* [Python 3.10](https://www.python.org/downloads/release/python-3913/) * pip install --upgrade pip Later you will need: @@ -24,13 +24,13 @@ You need add keys [here](https://gitlab.com/-/profile/keys) [instruction how to ## Install venv `cd app`
-`python3.9 -m venv venv`
+`python3.10 -m venv venv`
`source ./venv/bin/activate` ## Verfify python version `python --version`
-`Python 3.9.12` +`Python 3.10` ## Run docker-compose `docker-compose up -d` @@ -62,13 +62,6 @@ In enviroment you need to define HOST = http://localhost:8001/api/v1 and pickup `./test.sh` This run all linters and pytest -## Deploy all stack in docker containers - -For Intel cpu -`docker-compose -f docker-compose.dev.yml --env-file .env up --build -d` - -For Arm64 cpu -`docker-compose -f docker-compose.dev64.yml --env-file .env up --build -d` After up and running all containers, exec in backend container and run -`python3.9 app/initial_data.py` +`python app/initial_data.py` diff --git a/backend/app/app/api/api_v1/endpoints/login.py b/backend/app/app/api/api_v1/endpoints/login.py index 3d15437..c2fb131 100644 --- a/backend/app/app/api/api_v1/endpoints/login.py +++ b/backend/app/app/api/api_v1/endpoints/login.py @@ -1,12 +1,15 @@ +import time from datetime import timedelta from typing import Any -from google_auth_oauthlib.flow import InstalledAppFlow + +import requests +from fastapi import APIRouter, Body, Depends, HTTPException, Response from fastapi.responses import RedirectResponse -from fastapi import APIRouter, Response, Depends, HTTPException, Body from fastapi.security import OAuth2PasswordRequestForm +from google_auth_oauthlib.flow import InstalledAppFlow from sqlalchemy.orm import Session # type: ignore from starlette.status import HTTP_302_FOUND -import requests + from app import crud, models, schemas from app.api import deps from app.core import security @@ -17,7 +20,6 @@ send_reset_password_email, verify_password_reset_token, ) -import time router = APIRouter() diff --git a/backend/app/app/api/api_v1/endpoints/users.py b/backend/app/app/api/api_v1/endpoints/users.py index 776e1e5..e612b2e 100644 --- a/backend/app/app/api/api_v1/endpoints/users.py +++ b/backend/app/app/api/api_v1/endpoints/users.py @@ -1,18 +1,18 @@ +import math +from datetime import datetime, timedelta from typing import Any, List -from starlette.status import HTTP_302_FOUND -import math -from app.core import security from fastapi import APIRouter, Body, Depends, HTTPException, Response from fastapi.encoders import jsonable_encoder from pydantic.networks import EmailStr from sqlalchemy.orm import Session # type: ignore -from datetime import datetime, timedelta +from starlette.status import HTTP_302_FOUND + from app import crud, models, schemas from app.api import deps +from app.core import security from app.core.config import settings -from app.utils import send_new_account_email, create_confirmation_token - +from app.utils import create_confirmation_token, send_new_account_email router = APIRouter() diff --git a/backend/app/app/api/deps.py b/backend/app/app/api/deps.py index acc7790..3a173c2 100644 --- a/backend/app/app/api/deps.py +++ b/backend/app/app/api/deps.py @@ -1,6 +1,6 @@ from typing import Generator -from fastapi import Depends, HTTPException, status, Request +from fastapi import Depends, HTTPException, Request, status from fastapi.security import OAuth2PasswordBearer from jose import jwt # type: ignore from pydantic import ValidationError diff --git a/backend/app/app/crud/__init__.py b/backend/app/app/crud/__init__.py index e84767c..abb4da8 100644 --- a/backend/app/app/crud/__init__.py +++ b/backend/app/app/crud/__init__.py @@ -1,2 +1,2 @@ -from .crud_user import user # noqa from .crud_confirm import confirm # noqa +from .crud_user import user # noqa diff --git a/backend/app/app/crud/base.py b/backend/app/app/crud/base.py index 364abb3..11b61f7 100644 --- a/backend/app/app/crud/base.py +++ b/backend/app/app/crud/base.py @@ -1,12 +1,13 @@ -from typing import Generic, Type, TypeVar +from typing import Any, Dict, Generic, List, Optional, Type, TypeVar, Union + from bson.objectid import ObjectId # type: ignore -from pydantic import BaseModel -from typing import Optional, List, Union, Dict, Any -from app.db.base_class import Base from fastapi.encoders import jsonable_encoder from motor.motor_asyncio import AsyncIOMotorClient # type: ignore +from pydantic import BaseModel from sqlalchemy.orm import Session # type: ignore +from app.db.base_class import Base + ModelType = TypeVar("ModelType", bound=Base) CreateSchemaType = TypeVar("CreateSchemaType", bound=BaseModel) UpdateSchemaType = TypeVar("UpdateSchemaType", bound=BaseModel) diff --git a/backend/app/app/crud/crud_confirm.py b/backend/app/app/crud/crud_confirm.py index 14ac6a7..45ead5e 100644 --- a/backend/app/app/crud/crud_confirm.py +++ b/backend/app/app/crud/crud_confirm.py @@ -1,7 +1,9 @@ -from typing import TypeVar, Any +from typing import Any, TypeVar + from bson.objectid import ObjectId # type: ignore from motor.motor_asyncio import AsyncIOMotorClient # type: ignore from sqlalchemy.orm import Session # type: ignore + from app.crud.base import CRUDBase from app.db.base_class import Base from app.models.confirm import Confirm diff --git a/backend/app/app/crud/crud_user.py b/backend/app/app/crud/crud_user.py index 1792e68..acf0a01 100644 --- a/backend/app/app/crud/crud_user.py +++ b/backend/app/app/crud/crud_user.py @@ -1,10 +1,11 @@ +from datetime import datetime from typing import Any, Dict, List, Optional, TypeVar, Union from bson.objectid import ObjectId # type: ignore from fastapi.encoders import jsonable_encoder from motor.motor_asyncio import AsyncIOMotorClient # type: ignore from sqlalchemy.orm import Session # type: ignore -from datetime import datetime + from app.core.security import get_password_hash, verify_password from app.crud.base import CRUDBase from app.db.base_class import Base diff --git a/backend/app/app/db/init_db.py b/backend/app/app/db/init_db.py index de896ab..0d626d7 100644 --- a/backend/app/app/db/init_db.py +++ b/backend/app/app/db/init_db.py @@ -1,8 +1,9 @@ from sqlalchemy.orm import Session -from app.schemas.user import UserCreate + from app import crud from app.core.config import settings from app.db import base # noqa: F401 +from app.schemas.user import UserCreate async def init_db(db: Session) -> None: diff --git a/backend/app/app/libs/error.py b/backend/app/app/libs/error.py index 3bedae0..b669574 100644 --- a/backend/app/app/libs/error.py +++ b/backend/app/app/libs/error.py @@ -1,5 +1,6 @@ -from sentry_sdk.integrations.fastapi import FastApiIntegration import sentry_sdk +from sentry_sdk.integrations.fastapi import FastApiIntegration + from app.core.config import settings diff --git a/backend/app/app/main.py b/backend/app/app/main.py index 6feaefa..4d2861a 100644 --- a/backend/app/app/main.py +++ b/backend/app/app/main.py @@ -1,11 +1,12 @@ +import sentry_sdk import uvicorn # type: ignore from fastapi import FastAPI, Request from fastapi.responses import JSONResponse +from sentry_sdk.integrations.fastapi import FastApiIntegration from starlette.middleware.cors import CORSMiddleware + from app.api.api_v1.api import api_router from app.core.config import settings -from sentry_sdk.integrations.fastapi import FastApiIntegration -import sentry_sdk app = FastAPI( title=settings.PROJECT_NAME, openapi_url=f"{settings.API_V1_STR}/openapi.json" diff --git a/backend/app/app/models/__init__.py b/backend/app/app/models/__init__.py index f90a8bb..71a72d9 100644 --- a/backend/app/app/models/__init__.py +++ b/backend/app/app/models/__init__.py @@ -1,2 +1,2 @@ -from .user import User # noqa from .confirm import Confirm # noqa +from .user import User # noqa diff --git a/backend/app/app/schemas/__init__.py b/backend/app/app/schemas/__init__.py index 9c8689b..fe43e24 100644 --- a/backend/app/app/schemas/__init__.py +++ b/backend/app/app/schemas/__init__.py @@ -1,4 +1,4 @@ +from .confirm import Confirm, ConfirmCreate, ConfirmInDB, ConfirmUpdate # noqa from .msg import Msg # noqa from .token import Token, TokenPayload # noqa from .user import User, UserCreate, UserInDB, UserUpdate # noqa -from .confirm import Confirm, ConfirmCreate, ConfirmInDB, ConfirmUpdate # noqa diff --git a/backend/app/app/schemas/base.py b/backend/app/app/schemas/base.py index cb997a7..6b59797 100644 --- a/backend/app/app/schemas/base.py +++ b/backend/app/app/schemas/base.py @@ -1,4 +1,5 @@ from datetime import datetime + from pydantic import BaseModel diff --git a/backend/app/app/schemas/confirm.py b/backend/app/app/schemas/confirm.py index e2bfa42..7782e9f 100644 --- a/backend/app/app/schemas/confirm.py +++ b/backend/app/app/schemas/confirm.py @@ -1,7 +1,10 @@ +from datetime import datetime from typing import List + from pydantic import EmailStr + from app.schemas.base import Base -from datetime import datetime + # Shared properties class ConfirmBase(Base): diff --git a/backend/app/app/schemas/user.py b/backend/app/app/schemas/user.py index 83bc522..ed26f91 100644 --- a/backend/app/app/schemas/user.py +++ b/backend/app/app/schemas/user.py @@ -1,7 +1,10 @@ +from datetime import datetime from typing import Optional + from pydantic import EmailStr + from app.schemas.base import Base -from datetime import datetime + # Shared properties class UserBase(Base): diff --git a/backend/app/app/utils.py b/backend/app/app/utils.py index b32f039..329f7a5 100644 --- a/backend/app/app/utils.py +++ b/backend/app/app/utils.py @@ -1,12 +1,14 @@ +import hashlib import logging from datetime import datetime, timedelta from pathlib import Path from typing import Any, Dict, Optional -from app import schemas, crud + import emails # type: ignore from emails.template import JinjaTemplate # type: ignore from jose import jwt # type: ignore -import hashlib + +from app import crud, schemas from app.core.config import settings diff --git a/docker-compose.dev.yml b/docker-compose.dev.yml deleted file mode 100644 index f584fa9..0000000 --- a/docker-compose.dev.yml +++ /dev/null @@ -1,52 +0,0 @@ -version: '3' - -services: - mongo: - container_name: mongo - image: mongo - ports: - - "27017:27017" - env_file: - - .env - - frontend: - container_name: $DOCKER_IMAGE_FRONTEND - image: $DOCKER_IMAGE_FRONTEND - build: - context: ./frontend - dockerfile: Dockerfile - args: - FRONTEND_ENV: dev - depends_on: - - backend - ports: - - "80:80" - - backend: - container_name: $DOCKER_IMAGE_BACKEND - image: $DOCKER_IMAGE_BACKEND - env_file: - - .env - depends_on: - - mongo - build: - context: ./backend - dockerfile: backend.dockerfile - ports: - - "8001:8001" - - celeryworker: - container_name: $DOCKER_IMAGE_CELERYWORKER - image: $DOCKER_IMAGE_CELERYWORKER - depends_on: - - mongo - env_file: - - .env - volumes: - - ./backend/app:/code/app - environment: - - SERVER_NAME=${DOMAIN} - - SERVER_HOST=https://${DOMAIN} - build: - context: ./backend - dockerfile: celeryworker.dockerfile diff --git a/docker-compose.dev64.yml b/docker-compose.dev64.yml deleted file mode 100644 index 63c1ed3..0000000 --- a/docker-compose.dev64.yml +++ /dev/null @@ -1,52 +0,0 @@ -version: '3' - -services: - mongo: - container_name: mongo - image: arm64v8/mongo - ports: - - "27017:27017" - env_file: - - .env - - frontend: - container_name: $DOCKER_IMAGE_FRONTEND - image: $DOCKER_IMAGE_FRONTEND - build: - context: ./frontend - dockerfile: Dockerfile.arm64 - args: - FRONTEND_ENV: dev - depends_on: - - backend - ports: - - "80:80" - - backend: - container_name: $DOCKER_IMAGE_BACKEND - image: $DOCKER_IMAGE_BACKEND - env_file: - - .env - depends_on: - - mongo - build: - context: ./backend - dockerfile: Dockerfile.arm64 - ports: - - "8001:8001" - - celeryworker: - container_name: $DOCKER_IMAGE_CELERYWORKER - image: $DOCKER_IMAGE_CELERYWORKER - depends_on: - - mongo - env_file: - - .env - volumes: - - ./backend/app:/code/app - environment: - - SERVER_NAME=${DOMAIN} - - SERVER_HOST=https://${DOMAIN} - build: - context: ./backend - dockerfile: celeryworker.arm64dockerfile diff --git a/docker-compose.override.yml b/docker-compose.override.yml deleted file mode 100644 index 5b7b863..0000000 --- a/docker-compose.override.yml +++ /dev/null @@ -1,75 +0,0 @@ -version: "3.3" -services: - mongo: - ports: - - "27017:27017" - - proxy: - ports: - - "80:80" - - "8090:8080" - command: - # Enable Docker in Traefik, so that it reads labels from Docker services - - --providers.docker - # Add a constraint to only use services with the label for this stack - # from the env var TRAEFIK_TAG - - --providers.docker.constraints=Label(`traefik.constraint-label-stack`, `${TRAEFIK_TAG?Variable not set}`) - # Do not expose all Docker services, only the ones explicitly exposed - - --providers.docker.exposedbydefault=false - # Disable Docker Swarm mode for local development - # - --providers.docker.swarmmode - # Enable the access log, with HTTP requests - - --accesslog - # Enable the Traefik log, for configurations and errors - - --log - # Enable the Dashboard and API - - --api - # Enable the Dashboard and API in insecure mode for local development - - --api.insecure=true - labels: - - traefik.enable=true - - traefik.http.routers.${STACK_NAME?Variable not set}-traefik-public-http.rule=Host(`${DOMAIN?Variable not set}`) - - traefik.http.services.${STACK_NAME?Variable not set}-traefik-public.loadbalancer.server.port=80 - - backend: - ports: - - "8888:8888" - volumes: - - ./backend/app:/app - environment: - - SERVER_HOST=http://${DOMAIN?Variable not set} - build: - context: ./backend - dockerfile: backend.dockerfile - command: /start-reload.sh - labels: - - traefik.enable=true - - traefik.constraint-label-stack=${TRAEFIK_TAG?Variable not set} - - traefik.http.routers.${STACK_NAME?Variable not set}-backend-http.rule=PathPrefix(`/api`) || PathPrefix(`/docs`) || PathPrefix(`/redoc`) - - traefik.http.services.${STACK_NAME?Variable not set}-backend.loadbalancer.server.port=80 - - celeryworker: - volumes: - - ./backend/app:/app - environment: - - RUN=celery -A app.worker worker -l info -Q main-queue -c 1 - - SERVER_HOST=http://${DOMAIN?Variable not set} - build: - context: ./backend - dockerfile: celeryworker.dockerfile - - frontend: - build: - context: ./frontend - args: - FRONTEND_ENV: dev - labels: - - traefik.enable=true - - traefik.constraint-label-stack=${TRAEFIK_TAG?Variable not set} - - traefik.http.routers.${STACK_NAME?Variable not set}-frontend-http.rule=PathPrefix(`/`) - - traefik.http.services.${STACK_NAME?Variable not set}-frontend.loadbalancer.server.port=80 - -networks: - traefik-public: - # For local dev, don't expect an external Traefik network - external: false diff --git a/docker-compose.yml b/docker-compose.yml deleted file mode 100644 index b97f4f2..0000000 --- a/docker-compose.yml +++ /dev/null @@ -1,131 +0,0 @@ -version: "3.3" -services: - - proxy: - image: traefik:v2.2 - networks: - - ${TRAEFIK_PUBLIC_NETWORK?Variable not set} - - default - volumes: - - /var/run/docker.sock:/var/run/docker.sock - command: - # Enable Docker in Traefik, so that it reads labels from Docker services - - --providers.docker - # Add a constraint to only use services with the label for this stack - # from the env var TRAEFIK_TAG - - --providers.docker.constraints=Label(`traefik.constraint-label-stack`, `${TRAEFIK_TAG?Variable not set}`) - # Do not expose all Docker services, only the ones explicitly exposed - - --providers.docker.exposedbydefault=false - # Enable Docker Swarm mode - - --providers.docker.swarmmode - # Enable the access log, with HTTP requests - - --accesslog - # Enable the Traefik log, for configurations and errors - - --log - # Enable the Dashboard and API - - --api - deploy: - placement: - constraints: - - node.role == manager - labels: - # Enable Traefik for this service, to make it available in the public network - - traefik.enable=true - # Use the traefik-public network (declared below) - - traefik.docker.network=${TRAEFIK_PUBLIC_NETWORK?Variable not set} - # Use the custom label "traefik.constraint-label=traefik-public" - # This public Traefik will only use services with this label - - traefik.constraint-label=${TRAEFIK_PUBLIC_TAG?Variable not set} - # traefik-http set up only to use the middleware to redirect to https - - traefik.http.middlewares.${STACK_NAME?Variable not set}-https-redirect.redirectscheme.scheme=https - - traefik.http.middlewares.${STACK_NAME?Variable not set}-https-redirect.redirectscheme.permanent=true - # Handle host with and without "www" to redirect to only one of them - # Uses environment variable DOMAIN - # To disable www redirection remove the Host() you want to discard, here and - # below for HTTPS - - traefik.http.routers.${STACK_NAME?Variable not set}-proxy-http.rule=Host(`${DOMAIN?Variable not set}`) || Host(`www.${DOMAIN?Variable not set}`) - - traefik.http.routers.${STACK_NAME?Variable not set}-proxy-http.entrypoints=http - # traefik-https the actual router using HTTPS - - traefik.http.routers.${STACK_NAME?Variable not set}-proxy-https.rule=Host(`${DOMAIN?Variable not set}`) || Host(`www.${DOMAIN?Variable not set}`) - - traefik.http.routers.${STACK_NAME?Variable not set}-proxy-https.entrypoints=https - - traefik.http.routers.${STACK_NAME?Variable not set}-proxy-https.tls=true - # Use the "le" (Let's Encrypt) resolver created below - - traefik.http.routers.${STACK_NAME?Variable not set}-proxy-https.tls.certresolver=le - # Define the port inside of the Docker service to use - - traefik.http.services.${STACK_NAME?Variable not set}-proxy.loadbalancer.server.port=80 - # Handle domain with and without "www" to redirect to only one - # To disable www redirection remove the next line - - traefik.http.middlewares.${STACK_NAME?Variable not set}-www-redirect.redirectregex.regex=^https?://(www.)?(${DOMAIN?Variable not set})/(.*) - # Redirect a domain with www to non-www - # To disable it remove the next line - - traefik.http.middlewares.${STACK_NAME?Variable not set}-www-redirect.redirectregex.replacement=https://${DOMAIN?Variable not set}/$${3} - # Redirect a domain without www to www - # To enable it remove the previous line and uncomment the next - # - traefik.http.middlewares.${STACK_NAME}-www-redirect.redirectregex.replacement=https://www.${DOMAIN}/$${3} - # Middleware to redirect www, to disable it remove the next line - - traefik.http.routers.${STACK_NAME?Variable not set}-proxy-https.middlewares=${STACK_NAME?Variable not set}-www-redirect - # Middleware to redirect www, and redirect HTTP to HTTPS - # to disable www redirection remove the section: ${STACK_NAME?Variable not set}-www-redirect, - - traefik.http.routers.${STACK_NAME?Variable not set}-proxy-http.middlewares=${STACK_NAME?Variable not set}-www-redirect,${STACK_NAME?Variable not set}-https-redire - mongo: - image: mongo - restart: always - environment: - MONGO_USER: root - MONGO_PASS: mongo - - backend: - image: '${DOCKER_IMAGE_BACKEND?Variable not set}:${TAG-latest}' - depends_on: - - mongo - env_file: - - .env - environment: - - SERVER_NAME=${DOMAIN?Variable not set} - - SERVER_HOST=https://${DOMAIN?Variable not set} - # Allow explicit env var override for tests - - SMTP_HOST=${SMTP_HOST} - build: - context: ./backend - dockerfile: backend.dockerfile - deploy: - labels: - - traefik.enable=true - - traefik.constraint-label-stack=${TRAEFIK_TAG?Variable not set} - - traefik.http.routers.${STACK_NAME?Variable not set}-backend-http.rule=PathPrefix(`/api`) || PathPrefix(`/docs`) || PathPrefix(`/redoc`) - - traefik.http.services.${STACK_NAME?Variable not set}-backend.loadbalancer.server.port=80 - - celeryworker: - image: '${DOCKER_IMAGE_CELERYWORKER?Variable not set}:${TAG-latest}' - depends_on: - - mongo - env_file: - - .env - environment: - - SERVER_NAME=${DOMAIN?Variable not set} - - SERVER_HOST=https://${DOMAIN?Variable not set} - build: - context: ./backend - dockerfile: celeryworker.dockerfile - - - frontend: - image: '${DOCKER_IMAGE_FRONTEND?Variable not set}:${TAG-latest}' - build: - context: ./frontend - args: - FRONTEND_ENV: ${FRONTEND_ENV-production} - deploy: - labels: - - traefik.enable=true - - traefik.constraint-label-stack=${TRAEFIK_TAG?Variable not set} - - traefik.http.routers.${STACK_NAME?Variable not set}-frontend-http.rule=PathPrefix(`/`) - - traefik.http.services.${STACK_NAME?Variable not set}-frontend.loadbalancer.server.port=80 - -volumes: - app-db-data: - -networks: - traefik-public: - # Allow setting it to false for testing - external: ${TRAEFIK_PUBLIC_NETWORK_IS_EXTERNAL-true} diff --git a/frontend/.gitignore b/frontend/.gitignore index 4d29575..c2d8b14 100644 --- a/frontend/.gitignore +++ b/frontend/.gitignore @@ -2,22 +2,7 @@ # dependencies /node_modules -/.pnp -.pnp.js - -# testing -/coverage - -# production -/build - -# misc -.DS_Store -.env.local -.env.development.local -.env.test.local -.env.production.local - -npm-debug.log* -yarn-debug.log* -yarn-error.log* +.venv +.vscode +.idea +.mypy_cache \ No newline at end of file diff --git a/frontend/src/pages/auth/inactive.js b/frontend/src/pages/auth/inactive.js index 85d5a2f..e2c0e45 100644 --- a/frontend/src/pages/auth/inactive.js +++ b/frontend/src/pages/auth/inactive.js @@ -3,16 +3,11 @@ import Inactive from "../../components/pages/auth/inactive"; import {getToken} from "../../services/token"; import {useHistory} from "react-router-dom"; import { useSelector } from "react-redux"; -const userSelector = (state) => { - // state.createSlice.user -} const InactivePage = () =>{ - const user = useSelector(userSelector) - console.log(user) - + const user = useSelector((state)=>state) const history = useHistory() - if (getToken()) { + if (getToken() && user.is_active) { history.push("/dashboard") } return diff --git a/frontend/src/user.js b/frontend/src/user.js index 74c7191..4b29f04 100644 --- a/frontend/src/user.js +++ b/frontend/src/user.js @@ -1,5 +1,5 @@ import {createSlice} from "@reduxjs/toolkit"; - +import { connect } from "react-redux"; const initialState = { full_name: "Full Name", @@ -19,9 +19,15 @@ const userSlice = createSlice({ is_superuser: payload.is_superuser, is_active: payload.is_active }) + }, + getState: (state) => { + return state } } }) - -export const { addUser } = userSlice.actions +const mapStateToProps = state => ({ + user: state.user // map state to props + }); +export const userData = connect(mapStateToProps) +export const { addUser, getState} = userSlice.actions export default userSlice.reducer \ No newline at end of file From 114ad0f8d0e027403c6ba72d4e459aed4d7e77af Mon Sep 17 00:00:00 2001 From: Dmytro Holub Date: Sun, 2 Apr 2023 13:30:27 +0200 Subject: [PATCH 07/31] id #78 fix linters --- .flake8 | 5 + backend/app/app/api/api_v1/api.py | 3 +- backend/app/app/api/api_v1/endpoints/login.py | 105 ++++++++++-------- backend/app/app/api/api_v1/endpoints/users.py | 27 ++--- backend/app/app/api/deps.py | 18 ++- backend/app/app/celeryworker_pre_start.py | 3 +- backend/app/app/core/celery_app.py | 3 +- backend/app/app/core/config.py | 1 + backend/app/app/core/security.py | 3 +- backend/app/app/crud/base.py | 12 +- backend/app/app/crud/crud_confirm.py | 5 +- backend/app/app/crud/crud_user.py | 18 ++- backend/app/app/db/init_db.py | 3 +- backend/app/app/db/session.py | 1 - backend/app/app/libs/error.py | 9 +- backend/app/app/main.py | 12 +- backend/app/app/models/confirm.py | 3 +- backend/app/app/models/user.py | 3 +- backend/app/app/schemas/base.py | 1 - backend/app/app/schemas/confirm.py | 4 +- backend/app/app/schemas/user.py | 3 +- .../app/app/tests/api/api_v1/test_login.py | 5 +- .../app/app/tests/api/api_v1/test_users.py | 7 +- backend/app/app/tests/conftest.py | 5 +- backend/app/app/tests/crud/test_user.py | 3 +- backend/app/app/tests/utils/db.py | 3 +- backend/app/app/tests/utils/user.py | 5 +- backend/app/app/tests/utils/utils.py | 3 +- backend/app/app/tests_pre_start.py | 3 +- backend/app/app/utils.py | 20 ++-- backend/app/app/worker.py | 3 +- 31 files changed, 151 insertions(+), 148 deletions(-) create mode 100644 .flake8 diff --git a/.flake8 b/.flake8 new file mode 100644 index 0000000..7de183d --- /dev/null +++ b/.flake8 @@ -0,0 +1,5 @@ +[flake8] +ignore = E226,E302,E41 +max-line-length = 160 +exclude = .venv +max-complexity = 10 diff --git a/backend/app/app/api/api_v1/api.py b/backend/app/app/api/api_v1/api.py index 2dbed67..37944ac 100644 --- a/backend/app/app/api/api_v1/api.py +++ b/backend/app/app/api/api_v1/api.py @@ -1,6 +1,5 @@ -from fastapi import APIRouter - from app.api.api_v1.endpoints import login, users +from fastapi import APIRouter api_router = APIRouter() api_router.include_router(login.router, tags=["login"]) diff --git a/backend/app/app/api/api_v1/endpoints/login.py b/backend/app/app/api/api_v1/endpoints/login.py index c2fb131..a222f63 100644 --- a/backend/app/app/api/api_v1/endpoints/login.py +++ b/backend/app/app/api/api_v1/endpoints/login.py @@ -3,79 +3,88 @@ from typing import Any import requests +from app import crud, schemas +from app.api import deps +from app.core import security +from app.core.config import settings +from app.core.security import get_password_hash +from app.utils import (generate_password_reset_token, + send_reset_password_email, verify_password_reset_token) from fastapi import APIRouter, Body, Depends, HTTPException, Response from fastapi.responses import RedirectResponse from fastapi.security import OAuth2PasswordRequestForm from google_auth_oauthlib.flow import InstalledAppFlow from sqlalchemy.orm import Session # type: ignore -from starlette.status import HTTP_302_FOUND - -from app import crud, models, schemas -from app.api import deps -from app.core import security -from app.core.config import settings -from app.core.security import get_password_hash -from app.utils import ( - generate_password_reset_token, - send_reset_password_email, - verify_password_reset_token, -) router = APIRouter() -@router.get('/social') +@router.get("/social") def social(response: Response): REDIRECT_URI = "http://localhost/api/response" client_config = { - "auth_uri": "https://accounts.google.com/o/oauth2/auth", - "token_uri": "https://accounts.google.com/o/oauth2/token", - "client_id": settings.CLIENT_ID, - "client_secret": settings.CLIENT_SECRET, - } - flow = InstalledAppFlow.from_client_config({ - "web": client_config}, + "auth_uri": "https://accounts.google.com/o/oauth2/auth", + "token_uri": "https://accounts.google.com/o/oauth2/token", + "client_id": settings.CLIENT_ID, + "client_secret": settings.CLIENT_SECRET, + } + flow = InstalledAppFlow.from_client_config( + {"web": client_config}, redirect_uri=REDIRECT_URI, - scopes=["https://www.googleapis.com/auth/userinfo.profile", "https://www.googleapis.com/auth/userinfo.email"] + scopes=[ + "https://www.googleapis.com/auth/userinfo.profile", + "https://www.googleapis.com/auth/userinfo.email", + ], ) # Redirect the user to Google's authorization page authorization_url, state = flow.authorization_url( - access_type='offline', # to get a refresh token - prompt='consent' # to force the user to grant consent again + access_type="offline", # to get a refresh token + prompt="consent", # to force the user to grant consent again ) - return authorization_url + '×tamp=' + str(time.time()) + return authorization_url + "×tamp=" + str(time.time()) + -@router.get('/response') -async def response(resp: Response, state: str, code: str, db: Session = Depends(deps.get_db)): +@router.get("/response") +async def response( + resp: Response, state: str, code: str, db: Session = Depends(deps.get_db) +): redirect_uri = "http://localhost/api/response" - token_url = 'https://accounts.google.com/o/oauth2/token' + token_url = "https://accounts.google.com/o/oauth2/token" token_payload = { - 'client_id': settings.CLIENT_ID, - 'client_secret': settings.CLIENT_SECRET, - 'redirect_uri': redirect_uri, - 'code': code, - 'grant_type': 'authorization_code' + "client_id": settings.CLIENT_ID, + "client_secret": settings.CLIENT_SECRET, + "redirect_uri": redirect_uri, + "code": code, + "grant_type": "authorization_code", } data = requests.post(token_url, data=token_payload).json() - response = requests.get('https://people.googleapis.com/v1/people/me?personFields=names,emailAddresses', - headers={'Authorization': 'Bearer ' + data["access_token"]}) + response = requests.get( + "https://people.googleapis.com/v1/people/me?personFields=names,emailAddresses", + headers={"Authorization": "Bearer " + data["access_token"]}, + ) profile_data = response.json() name = profile_data["names"][0]["displayName"] email = profile_data["emailAddresses"][0]["value"].lower() user = await crud.user.get_by_email(db=db, email=email) if not user: - user = await crud.user.create(db=db, obj_in={"full_name": name, - "email": email, - "is_superuser": False, - "is_active": True, - "access_token": data["access_token"], - "refresh_token": data["refresh_token"] - }) + user = await crud.user.create( + db=db, + obj_in={ + "full_name": name, + "email": email, + "is_superuser": False, + "is_active": True, + "access_token": data["access_token"], + "refresh_token": data["refresh_token"], + }, + ) access_token_expires = timedelta(minutes=settings.ACCESS_TOKEN_EXPIRE_MINUTES) - token = security.create_access_token(str(user["_id"]), expires_delta=access_token_expires) + token = security.create_access_token( + str(user["_id"]), expires_delta=access_token_expires + ) resp = RedirectResponse("/dashboard") resp.set_cookie(key="token", value=token, expires=access_token_expires) return resp @@ -84,7 +93,8 @@ async def response(resp: Response, state: str, code: str, db: Session = Depends( @router.post("/login/access-token", response_model=Any) async def login_access_token( response: Response, - db: Session = Depends(deps.get_db), form_data: OAuth2PasswordRequestForm = Depends() + db: Session = Depends(deps.get_db), + form_data: OAuth2PasswordRequestForm = Depends(), ) -> Any: """ OAuth2 compatible token login, get an access token for future requests @@ -96,13 +106,18 @@ async def login_access_token( raise HTTPException(status_code=403, detail="Incorrect email or password") access_token_expires = timedelta(minutes=settings.ACCESS_TOKEN_EXPIRE_MINUTES) - response.set_cookie(key="token", value=security.create_access_token( + response.set_cookie( + key="token", + value=security.create_access_token( user["_id"], expires_delta=access_token_expires # type: ignore - ), expires=access_token_expires) + ), + expires=access_token_expires, + ) response.status_code = 200 return response + @router.post("/password-recovery/{email}", response_model=schemas.Msg) async def recover_password(email: str, db: Session = Depends(deps.get_db)) -> Any: """ diff --git a/backend/app/app/api/api_v1/endpoints/users.py b/backend/app/app/api/api_v1/endpoints/users.py index e612b2e..a301686 100644 --- a/backend/app/app/api/api_v1/endpoints/users.py +++ b/backend/app/app/api/api_v1/endpoints/users.py @@ -2,17 +2,16 @@ from datetime import datetime, timedelta from typing import Any, List -from fastapi import APIRouter, Body, Depends, HTTPException, Response -from fastapi.encoders import jsonable_encoder -from pydantic.networks import EmailStr -from sqlalchemy.orm import Session # type: ignore -from starlette.status import HTTP_302_FOUND - from app import crud, models, schemas from app.api import deps from app.core import security from app.core.config import settings from app.utils import create_confirmation_token, send_new_account_email +from fastapi import APIRouter, Body, Depends, HTTPException, Response +from fastapi.encoders import jsonable_encoder +from pydantic.networks import EmailStr +from sqlalchemy.orm import Session # type: ignore +from starlette.status import HTTP_302_FOUND router = APIRouter() @@ -23,7 +22,7 @@ async def pagination( db: Session = Depends(deps.get_db), ) -> Any: count = await crud.user.count(db=db) - return math.ceil(count/per_page) + return math.ceil(count / per_page) @router.get("/activate", response_model=Any) @@ -39,15 +38,19 @@ async def activate( user_in = { "confirmed": datetime.now(), "email": confirm["email"], - "is_active": True + "is_active": True, } user = await crud.user.get(db=db, id=confirm["user_id"]) await crud.user.update(db=db, db_obj=user, obj_in=user_in) await crud.confirm.remove(db=db, id=confirm["_id"]) access_token_expires = timedelta(minutes=settings.ACCESS_TOKEN_EXPIRE_MINUTES) - response.set_cookie(key="token", value=security.create_access_token( + response.set_cookie( + key="token", + value=security.create_access_token( user["_id"], expires_delta=access_token_expires # type: ignore - ), expires=access_token_expires) + ), + expires=access_token_expires, + ) headers = {"Location": "/dashboard"} raise HTTPException(status_code=HTTP_302_FOUND, headers=headers) @@ -133,9 +136,7 @@ async def stat( """ Retrieve users. """ - return { - "users": await crud.user.count(db=db) - } + return {"users": await crud.user.count(db=db)} @router.get("/{user_id}", response_model=schemas.User) diff --git a/backend/app/app/api/deps.py b/backend/app/app/api/deps.py index 3a173c2..f5adfba 100644 --- a/backend/app/app/api/deps.py +++ b/backend/app/app/api/deps.py @@ -1,16 +1,15 @@ from typing import Generator +from app import crud, models +from app.core import security +from app.core.config import settings +from app.db.session import client, database from fastapi import Depends, HTTPException, Request, status from fastapi.security import OAuth2PasswordBearer from jose import jwt # type: ignore from pydantic import ValidationError from sqlalchemy.orm import Session # type: ignore -from app import crud, models -from app.core import security -from app.core.config import settings -from app.db.session import client, database - reusable_oauth2 = OAuth2PasswordBearer( tokenUrl=f"{settings.API_V1_STR}/login/access-token" ) @@ -24,15 +23,15 @@ def get_db() -> Generator: async def get_current_user( - request: Request, - db: Session = Depends(get_db) + request: Request, db: Session = Depends(get_db) ) -> models.User: - try: if "token" not in request.cookies: raise ValidationError payload = jwt.decode( - request.cookies["token"], settings.SECRET_KEY, algorithms=[security.ALGORITHM] + request.cookies["token"], + settings.SECRET_KEY, + algorithms=[security.ALGORITHM], ) token_data = payload except (jwt.JWTError, ValidationError) as e: @@ -50,7 +49,6 @@ async def get_current_user( def get_current_active_user( current_user: models.User = Depends(get_current_user), ) -> models.User: - return current_user diff --git a/backend/app/app/celeryworker_pre_start.py b/backend/app/app/celeryworker_pre_start.py index f13ff60..29b9d8b 100644 --- a/backend/app/app/celeryworker_pre_start.py +++ b/backend/app/app/celeryworker_pre_start.py @@ -1,10 +1,9 @@ import logging +from app.db.session import database from tenacity import retry # type: ignore from tenacity import after_log, before_log, stop_after_attempt, wait_fixed -from app.db.session import database - logging.basicConfig(level=logging.INFO) logger = logging.getLogger(__name__) diff --git a/backend/app/app/core/celery_app.py b/backend/app/app/core/celery_app.py index d2123cd..dbf0cee 100644 --- a/backend/app/app/core/celery_app.py +++ b/backend/app/app/core/celery_app.py @@ -1,6 +1,5 @@ -from celery import Celery # type: ignore - from app.core.config import settings +from celery import Celery # type: ignore MONGO_URL = f"{settings.MONGO_USER}:{settings.MONGO_PASS}@{settings.MONGO_HOST}:27017" OPTIONS = "authSource=admin&retryWrites=true&w=majority" diff --git a/backend/app/app/core/config.py b/backend/app/app/core/config.py index ea441da..d7300c8 100644 --- a/backend/app/app/core/config.py +++ b/backend/app/app/core/config.py @@ -65,6 +65,7 @@ def get_emails_enabled(cls, v: bool, values: Dict[str, Any]) -> bool: CLIENT_ID: str CLIENT_SECRET: str + class Config: case_sensitive = True diff --git a/backend/app/app/core/security.py b/backend/app/app/core/security.py index 9a28911..b994a52 100644 --- a/backend/app/app/core/security.py +++ b/backend/app/app/core/security.py @@ -1,11 +1,10 @@ from datetime import datetime, timedelta, timezone from typing import Any, Union +from app.core.config import settings from jose import jwt # type: ignore from passlib.context import CryptContext # type: ignore -from app.core.config import settings - pwd_context = CryptContext(schemes=["bcrypt"], deprecated="auto") diff --git a/backend/app/app/crud/base.py b/backend/app/app/crud/base.py index 11b61f7..0ba145c 100644 --- a/backend/app/app/crud/base.py +++ b/backend/app/app/crud/base.py @@ -1,13 +1,12 @@ from typing import Any, Dict, Generic, List, Optional, Type, TypeVar, Union +from app.db.base_class import Base from bson.objectid import ObjectId # type: ignore from fastapi.encoders import jsonable_encoder from motor.motor_asyncio import AsyncIOMotorClient # type: ignore from pydantic import BaseModel from sqlalchemy.orm import Session # type: ignore -from app.db.base_class import Base - ModelType = TypeVar("ModelType", bound=Base) CreateSchemaType = TypeVar("CreateSchemaType", bound=BaseModel) UpdateSchemaType = TypeVar("UpdateSchemaType", bound=BaseModel) @@ -29,7 +28,7 @@ async def count(self, db: Session): return await db[self.model.__tablename__].count_documents({}) async def get_multi( - self, db: Session, *, skip: int = 0, limit: int = 100 + self, db: Session, *, skip: int = 0, limit: int = 100 ) -> List[ModelType]: result = [] async for document in db[self.model.__tablename__].find().skip(skip).limit(limit): # type: ignore @@ -51,7 +50,11 @@ async def create(self, db: Session, obj_in: dict) -> ModelType: return user async def update( - self, db: Session, *, db_obj: ModelType, obj_in: Union[UpdateSchemaType, Dict[str, Any]] + self, + db: Session, + *, + db_obj: ModelType, + obj_in: Union[UpdateSchemaType, Dict[str, Any]] ) -> ModelType: obj_in = jsonable_encoder(obj_in) @@ -64,4 +67,3 @@ async def update( async def remove(self, db: AsyncIOMotorClient, id: str) -> None: id = ObjectId(id) if type(id) == str else id await db[self.model.__tablename__].delete_one({"_id": id}) - diff --git a/backend/app/app/crud/crud_confirm.py b/backend/app/app/crud/crud_confirm.py index 45ead5e..df4aa49 100644 --- a/backend/app/app/crud/crud_confirm.py +++ b/backend/app/app/crud/crud_confirm.py @@ -1,13 +1,10 @@ from typing import Any, TypeVar -from bson.objectid import ObjectId # type: ignore -from motor.motor_asyncio import AsyncIOMotorClient # type: ignore -from sqlalchemy.orm import Session # type: ignore - from app.crud.base import CRUDBase from app.db.base_class import Base from app.models.confirm import Confirm from app.schemas.confirm import ConfirmCreate, ConfirmUpdate +from sqlalchemy.orm import Session # type: ignore ModelType = TypeVar("ModelType", bound=Base) diff --git a/backend/app/app/crud/crud_user.py b/backend/app/app/crud/crud_user.py index acf0a01..2590729 100644 --- a/backend/app/app/crud/crud_user.py +++ b/backend/app/app/crud/crud_user.py @@ -1,16 +1,15 @@ from datetime import datetime -from typing import Any, Dict, List, Optional, TypeVar, Union - -from bson.objectid import ObjectId # type: ignore -from fastapi.encoders import jsonable_encoder -from motor.motor_asyncio import AsyncIOMotorClient # type: ignore -from sqlalchemy.orm import Session # type: ignore +from typing import Any, Dict, Optional, TypeVar, Union from app.core.security import get_password_hash, verify_password from app.crud.base import CRUDBase from app.db.base_class import Base from app.models.user import User from app.schemas.user import UserCreate, UserUpdate +from bson.objectid import ObjectId # type: ignore +from fastapi.encoders import jsonable_encoder +from motor.motor_asyncio import AsyncIOMotorClient # type: ignore +from sqlalchemy.orm import Session # type: ignore ModelType = TypeVar("ModelType", bound=Base) @@ -24,8 +23,8 @@ async def create(self, db: Session, obj_in: dict) -> User: "is_superuser": data.get("is_superuser") or False, "is_active": data["is_active"], "created": datetime.now(), - "access_token": data["access_token"] if "access_token" in data else '', - "refresh_token": data["refresh_token"] if "refresh_token" in data else '', + "access_token": data["access_token"] if "access_token" in data else "", + "refresh_token": data["refresh_token"] if "refresh_token" in data else "", } if "password" in data: db_obj.setdefault("hashed_password", get_password_hash(data["password"])) @@ -39,9 +38,8 @@ async def create(self, db: Session, obj_in: dict) -> User: return user async def update( - self, db: Session, *, db_obj: User, obj_in: Union[UserUpdate, Dict[str, Any]] + self, db: Session, *, db_obj: User, obj_in: Union[UserUpdate, Dict[str, Any]] ) -> User: - update_data = jsonable_encoder(obj_in) if "password" in update_data: # type: ignore diff --git a/backend/app/app/db/init_db.py b/backend/app/app/db/init_db.py index 0d626d7..d91cd29 100644 --- a/backend/app/app/db/init_db.py +++ b/backend/app/app/db/init_db.py @@ -1,9 +1,8 @@ -from sqlalchemy.orm import Session - from app import crud from app.core.config import settings from app.db import base # noqa: F401 from app.schemas.user import UserCreate +from sqlalchemy.orm import Session async def init_db(db: Session) -> None: diff --git a/backend/app/app/db/session.py b/backend/app/app/db/session.py index cf98986..82bec30 100644 --- a/backend/app/app/db/session.py +++ b/backend/app/app/db/session.py @@ -1,7 +1,6 @@ import asyncio import motor.motor_asyncio # type: ignore - from app.core.config import settings MONGO_URL = f"{settings.MONGO_USER}:{settings.MONGO_PASS}@{settings.MONGO_HOST}" diff --git a/backend/app/app/libs/error.py b/backend/app/app/libs/error.py index b669574..74c147c 100644 --- a/backend/app/app/libs/error.py +++ b/backend/app/app/libs/error.py @@ -1,11 +1,14 @@ import sentry_sdk -from sentry_sdk.integrations.fastapi import FastApiIntegration - from app.core.config import settings +from sentry_sdk.integrations.fastapi import FastApiIntegration def log_errors(message): - sentry_sdk.init(dsn=settings.SENTRY_DSN, environment=settings.ENV, integrations=[FastApiIntegration()]) + sentry_sdk.init( + dsn=settings.SENTRY_DSN, + environment=settings.ENV, + integrations=[FastApiIntegration()], + ) with sentry_sdk.push_scope() as scope: sentry_sdk.capture_exception(Exception(message)) scope.clear() diff --git a/backend/app/app/main.py b/backend/app/app/main.py index 4d2861a..a3ea17a 100644 --- a/backend/app/app/main.py +++ b/backend/app/app/main.py @@ -1,13 +1,12 @@ import sentry_sdk import uvicorn # type: ignore +from app.api.api_v1.api import api_router +from app.core.config import settings from fastapi import FastAPI, Request from fastapi.responses import JSONResponse from sentry_sdk.integrations.fastapi import FastApiIntegration from starlette.middleware.cors import CORSMiddleware -from app.api.api_v1.api import api_router -from app.core.config import settings - app = FastAPI( title=settings.PROJECT_NAME, openapi_url=f"{settings.API_V1_STR}/openapi.json" ) @@ -18,13 +17,18 @@ async def exception_handling(request: Request, call_next): try: return await call_next(request) except Exception as exc: - sentry_sdk.init(dsn=settings.SENTRY_DSN, environment=settings.ENV, integrations=[FastApiIntegration()]) + sentry_sdk.init( + dsn=settings.SENTRY_DSN, + environment=settings.ENV, + integrations=[FastApiIntegration()], + ) with sentry_sdk.push_scope() as scope: sentry_sdk.capture_exception(exc) scope.clear() return JSONResponse(status_code=400, content=f"Something going wrong {exc}") + origins = ["*"] app.add_middleware( diff --git a/backend/app/app/models/confirm.py b/backend/app/app/models/confirm.py index 3cc0715..7207660 100755 --- a/backend/app/app/models/confirm.py +++ b/backend/app/app/models/confirm.py @@ -1,6 +1,5 @@ -from sqlalchemy import Boolean, Column, String # type: ignore - from app.db.base_class import Base +from sqlalchemy import Column, String # type: ignore class Confirm(Base): diff --git a/backend/app/app/models/user.py b/backend/app/app/models/user.py index 64bb0a9..367bc7d 100755 --- a/backend/app/app/models/user.py +++ b/backend/app/app/models/user.py @@ -1,6 +1,5 @@ -from sqlalchemy import Boolean, Column, String # type: ignore - from app.db.base_class import Base +from sqlalchemy import Boolean, Column, String # type: ignore class User(Base): diff --git a/backend/app/app/schemas/base.py b/backend/app/app/schemas/base.py index 6b59797..46b198a 100644 --- a/backend/app/app/schemas/base.py +++ b/backend/app/app/schemas/base.py @@ -6,4 +6,3 @@ # Shared properties class Base(BaseModel): created: datetime = datetime.now() - diff --git a/backend/app/app/schemas/confirm.py b/backend/app/app/schemas/confirm.py index 7782e9f..0cffa2f 100644 --- a/backend/app/app/schemas/confirm.py +++ b/backend/app/app/schemas/confirm.py @@ -1,9 +1,7 @@ from datetime import datetime -from typing import List - -from pydantic import EmailStr from app.schemas.base import Base +from pydantic import EmailStr # Shared properties diff --git a/backend/app/app/schemas/user.py b/backend/app/app/schemas/user.py index ed26f91..066eb89 100644 --- a/backend/app/app/schemas/user.py +++ b/backend/app/app/schemas/user.py @@ -1,9 +1,8 @@ from datetime import datetime from typing import Optional -from pydantic import EmailStr - from app.schemas.base import Base +from pydantic import EmailStr # Shared properties diff --git a/backend/app/app/tests/api/api_v1/test_login.py b/backend/app/app/tests/api/api_v1/test_login.py index f69ef67..ab42e77 100644 --- a/backend/app/app/tests/api/api_v1/test_login.py +++ b/backend/app/app/tests/api/api_v1/test_login.py @@ -1,15 +1,14 @@ from typing import Any, Dict import pytest # type: ignore -from fastapi.testclient import TestClient # type: ignore -from sqlalchemy.orm import Session - from app import crud from app.api.deps import get_db from app.core.config import settings from app.main import app from app.tests.utils.db import fake_db from app.tests.utils.user import create_user +from fastapi.testclient import TestClient # type: ignore +from sqlalchemy.orm import Session app.dependency_overrides[get_db] = fake_db diff --git a/backend/app/app/tests/api/api_v1/test_users.py b/backend/app/app/tests/api/api_v1/test_users.py index bbdbbfc..e6874f2 100644 --- a/backend/app/app/tests/api/api_v1/test_users.py +++ b/backend/app/app/tests/api/api_v1/test_users.py @@ -1,10 +1,6 @@ from typing import Dict import pytest # type: ignore -from fastapi.testclient import TestClient -from jose import jwt # type: ignore -from sqlalchemy.orm import Session # type: ignore - from app import crud from app.api.deps import get_db from app.core import security @@ -14,6 +10,9 @@ from app.tests.utils.db import fake_db from app.tests.utils.user import create_user_and_login from app.tests.utils.utils import random_email, random_lower_string +from fastapi.testclient import TestClient +from jose import jwt # type: ignore +from sqlalchemy.orm import Session # type: ignore app.dependency_overrides[get_db] = fake_db diff --git a/backend/app/app/tests/conftest.py b/backend/app/app/tests/conftest.py index 43fe580..58d412b 100644 --- a/backend/app/app/tests/conftest.py +++ b/backend/app/app/tests/conftest.py @@ -1,9 +1,6 @@ from typing import Any, Dict, Generator import pytest # type: ignore -from fastapi.testclient import TestClient # type: ignore -from sqlalchemy.orm import Session # type: ignore - from app.core.config import settings from app.db.session import client as AsyncIOMotorClient from app.main import app @@ -11,6 +8,8 @@ from app.tests.utils.db import fake_db from app.tests.utils.user import authentication_token_from_email from app.tests.utils.utils import get_superuser_token_headers +from fastapi.testclient import TestClient # type: ignore +from sqlalchemy.orm import Session # type: ignore @pytest.fixture diff --git a/backend/app/app/tests/crud/test_user.py b/backend/app/app/tests/crud/test_user.py index c298463..e43d802 100644 --- a/backend/app/app/tests/crud/test_user.py +++ b/backend/app/app/tests/crud/test_user.py @@ -1,9 +1,8 @@ import pytest # type: ignore -from sqlalchemy.orm import Session # type: ignore - from app import crud from app.schemas.user import UserCreate, UserUpdate from app.tests.utils.utils import random_email, random_lower_string +from sqlalchemy.orm import Session # type: ignore @pytest.mark.asyncio diff --git a/backend/app/app/tests/utils/db.py b/backend/app/app/tests/utils/db.py index 2d26a67..5c2d89c 100644 --- a/backend/app/app/tests/utils/db.py +++ b/backend/app/app/tests/utils/db.py @@ -1,11 +1,10 @@ from typing import Any, Optional from unittest.mock import MagicMock +from app.core.config import settings from bson.objectid import ObjectId # type: ignore from sqlalchemy.orm import Session -from app.core.config import settings - first_user_id = ObjectId() diff --git a/backend/app/app/tests/utils/user.py b/backend/app/app/tests/utils/user.py index f7c0f13..c4a1f8f 100644 --- a/backend/app/app/tests/utils/user.py +++ b/backend/app/app/tests/utils/user.py @@ -1,14 +1,13 @@ import random from typing import Any, Dict, Union -from fastapi.testclient import TestClient -from sqlalchemy.orm import Session # type: ignore - from app import crud from app.core.config import settings from app.models.user import User from app.schemas.user import UserCreate, UserUpdate from app.tests.utils.utils import random_email, random_lower_string +from fastapi.testclient import TestClient +from sqlalchemy.orm import Session # type: ignore def user_authentication_headers( diff --git a/backend/app/app/tests/utils/utils.py b/backend/app/app/tests/utils/utils.py index 9a085bc..0ad66d9 100644 --- a/backend/app/app/tests/utils/utils.py +++ b/backend/app/app/tests/utils/utils.py @@ -2,9 +2,8 @@ import string from typing import Dict -from fastapi.testclient import TestClient - from app.core.config import settings +from fastapi.testclient import TestClient def random_lower_string() -> str: diff --git a/backend/app/app/tests_pre_start.py b/backend/app/app/tests_pre_start.py index f13ff60..29b9d8b 100644 --- a/backend/app/app/tests_pre_start.py +++ b/backend/app/app/tests_pre_start.py @@ -1,10 +1,9 @@ import logging +from app.db.session import database from tenacity import retry # type: ignore from tenacity import after_log, before_log, stop_after_attempt, wait_fixed -from app.db.session import database - logging.basicConfig(level=logging.INFO) logger = logging.getLogger(__name__) diff --git a/backend/app/app/utils.py b/backend/app/app/utils.py index 329f7a5..7dca3f6 100644 --- a/backend/app/app/utils.py +++ b/backend/app/app/utils.py @@ -5,11 +5,10 @@ from typing import Any, Dict, Optional import emails # type: ignore -from emails.template import JinjaTemplate # type: ignore -from jose import jwt # type: ignore - from app import crud, schemas from app.core.config import settings +from emails.template import JinjaTemplate # type: ignore +from jose import jwt # type: ignore def send_email( @@ -59,17 +58,18 @@ def send_reset_password_email(email_to: str, email: str, token: str) -> None: async def create_confirmation_token(db, user, email): token = hashlib.md5(user["id"].encode()).hexdigest() - confirm = schemas.ConfirmCreate(user_id=user["id"], - email=email, - token=token, - ttl=datetime.now() + timedelta(minutes=1)) + confirm = schemas.ConfirmCreate( + user_id=user["id"], + email=email, + token=token, + ttl=datetime.now() + timedelta(minutes=1), + ) token = await crud.confirm.create(db=db, obj_in=confirm) send_welcome_email(user["email"], user["full_name"], token=token["token"]) def send_welcome_email(email_to: str, full_name: str, token: str) -> None: - - subject = f"Congratulation you register account on MongoTech" + subject = "Congratulation you register account on MongoTech" with open(Path(settings.EMAIL_TEMPLATES_DIR) / "welcome.html") as f: template_str = f.read() @@ -79,7 +79,7 @@ def send_welcome_email(email_to: str, full_name: str, token: str) -> None: html_template=template_str, environment={ "full_name": full_name, - "link": settings.SERVER_HOST + "/api/users/activate?token=" + token + "link": settings.SERVER_HOST + "/api/users/activate?token=" + token, }, ) diff --git a/backend/app/app/worker.py b/backend/app/app/worker.py index c4aa230..194381e 100644 --- a/backend/app/app/worker.py +++ b/backend/app/app/worker.py @@ -1,7 +1,6 @@ -from raven import Client # type: ignore - from app.core.celery_app import celery from app.core.config import settings +from raven import Client # type: ignore client_sentry = Client(settings.SENTRY_DSN) From 6878dff8f2fcd95047af3d072bf58942b00f54f3 Mon Sep 17 00:00:00 2001 From: Dmytro Holub Date: Sun, 2 Apr 2023 14:03:59 +0200 Subject: [PATCH 08/31] id #78 update --- .vscode/settings.json | 7 +++++++ backend/app/poetry.lock | 33 ++++++++++++++++++++++++++++++++- backend/app/pyproject.toml | 7 +++++++ 3 files changed, 46 insertions(+), 1 deletion(-) create mode 100644 .vscode/settings.json diff --git a/.vscode/settings.json b/.vscode/settings.json new file mode 100644 index 0000000..7581cbf --- /dev/null +++ b/.vscode/settings.json @@ -0,0 +1,7 @@ +{ + "python.testing.pytestArgs": [ + "backend" + ], + "python.testing.unittestEnabled": false, + "python.testing.pytestEnabled": true +} \ No newline at end of file diff --git a/backend/app/poetry.lock b/backend/app/poetry.lock index 43cac2c..55ab734 100644 --- a/backend/app/poetry.lock +++ b/backend/app/poetry.lock @@ -2116,6 +2116,22 @@ pytest = ">=4.6" [package.extras] testing = ["fields", "hunter", "process-tests", "pytest-xdist", "six", "virtualenv"] +[[package]] +name = "pytest-dotenv" +version = "0.5.2" +description = "A py.test plugin that parses environment files before running tests" +category = "dev" +optional = false +python-versions = "*" +files = [ + {file = "pytest-dotenv-0.5.2.tar.gz", hash = "sha256:2dc6c3ac6d8764c71c6d2804e902d0ff810fa19692e95fe138aefc9b1aa73732"}, + {file = "pytest_dotenv-0.5.2-py3-none-any.whl", hash = "sha256:40a2cece120a213898afaa5407673f6bd924b1fa7eafce6bda0e8abffe2f710f"}, +] + +[package.dependencies] +pytest = ">=5.0.0" +python-dotenv = ">=0.9.1" + [[package]] name = "pytest-mock" version = "3.10.0" @@ -2149,6 +2165,21 @@ files = [ [package.dependencies] six = ">=1.5" +[[package]] +name = "python-dotenv" +version = "1.0.0" +description = "Read key-value pairs from a .env file and set them as environment variables" +category = "dev" +optional = false +python-versions = ">=3.8" +files = [ + {file = "python-dotenv-1.0.0.tar.gz", hash = "sha256:a8df96034aae6d2d50a4ebe8216326c61c3eb64836776504fcca410e5937a3ba"}, + {file = "python_dotenv-1.0.0-py3-none-any.whl", hash = "sha256:f5971a9226b701070a4bf2c38c89e5a3f0d64de8debda981d1db98583009122a"}, +] + +[package.extras] +cli = ["click (>=5.0)"] + [[package]] name = "python-jose" version = "3.3.0" @@ -2817,4 +2848,4 @@ testing = ["func-timeout", "jaraco.itertools", "pytest (>=6)", "pytest-black (>= [metadata] lock-version = "2.0" python-versions = "^3.10" -content-hash = "480a4706a8c53d723f0a7431797ce868669f04b841d04240a85672493448bed8" +content-hash = "a51b94093e1a7101962f8db57da705ac74cb4d588b2c773862d3b0a03574efc6" diff --git a/backend/app/pyproject.toml b/backend/app/pyproject.toml index be3e351..6c5d70f 100644 --- a/backend/app/pyproject.toml +++ b/backend/app/pyproject.toml @@ -47,6 +47,8 @@ autoflake = "^2.0.2" pytest-cov = "^4.0.0" pytest-asyncio = "^0.21.0" pytest-mock = "^3.10.0" +python-dotenv = "^1.0.0" +pytest-dotenv = "^0.5.2" [tool.isort] multi_line_output = 3 @@ -57,3 +59,8 @@ line_length = 88 requires = ["poetry>=0.12"] build-backend = "poetry.masonry.api" +[tool.pytest.ini_options] +python_classes = ["Test", "Describe"] +python_functions = ["test_", "it_", "and_", "but_", "they_"] +python_files = ["test_*.py",] +testpaths = ["app/tests",] From 884a514e1d09e41e8aaeb160f7fc9580005f1412 Mon Sep 17 00:00:00 2001 From: Dmytro Holub Date: Sun, 2 Apr 2023 22:59:06 +0200 Subject: [PATCH 09/31] id #78 fix linter --- .vscode/settings.json | 3 ++- backend/app/app/api/api_v1/endpoints/login.py | 19 ++++++++++-------- backend/app/app/api/api_v1/endpoints/users.py | 12 +++++------ backend/app/app/api/deps.py | 2 +- backend/app/app/core/config.py | 2 +- backend/app/app/crud/base.py | 6 +++--- backend/app/app/crud/crud_user.py | 4 ++-- backend/app/app/db/init_db.py | 2 +- backend/app/app/models/confirm.py | 2 +- backend/app/app/models/user.py | 2 +- .../app/app/tests/api/api_v1/test_login.py | 1 + .../app/app/tests/api/api_v1/test_users.py | 10 +++++----- backend/app/app/tests/crud/test_user.py | 20 +++++++++---------- backend/app/app/tests/utils/user.py | 2 +- backend/app/pyproject.toml | 3 +++ frontend/src/pages/auth/inactive.js | 4 ++++ 16 files changed, 53 insertions(+), 41 deletions(-) diff --git a/.vscode/settings.json b/.vscode/settings.json index 7581cbf..434036b 100644 --- a/.vscode/settings.json +++ b/.vscode/settings.json @@ -3,5 +3,6 @@ "backend" ], "python.testing.unittestEnabled": false, - "python.testing.pytestEnabled": true + "python.testing.pytestEnabled": true, + "python.analysis.typeCheckingMode": "off" } \ No newline at end of file diff --git a/backend/app/app/api/api_v1/endpoints/login.py b/backend/app/app/api/api_v1/endpoints/login.py index a222f63..eefaf48 100644 --- a/backend/app/app/api/api_v1/endpoints/login.py +++ b/backend/app/app/api/api_v1/endpoints/login.py @@ -2,18 +2,21 @@ from datetime import timedelta from typing import Any -import requests +import requests # type: ignore from app import crud, schemas from app.api import deps from app.core import security from app.core.config import settings from app.core.security import get_password_hash -from app.utils import (generate_password_reset_token, - send_reset_password_email, verify_password_reset_token) +from app.utils import ( + generate_password_reset_token, + send_reset_password_email, + verify_password_reset_token, +) from fastapi import APIRouter, Body, Depends, HTTPException, Response from fastapi.responses import RedirectResponse from fastapi.security import OAuth2PasswordRequestForm -from google_auth_oauthlib.flow import InstalledAppFlow +from google_auth_oauthlib.flow import InstalledAppFlow # type: ignore from sqlalchemy.orm import Session # type: ignore router = APIRouter() @@ -83,10 +86,10 @@ async def response( ) access_token_expires = timedelta(minutes=settings.ACCESS_TOKEN_EXPIRE_MINUTES) token = security.create_access_token( - str(user["_id"]), expires_delta=access_token_expires + str(user["_id"]), expires_delta=access_token_expires # type: ignore ) resp = RedirectResponse("/dashboard") - resp.set_cookie(key="token", value=token, expires=access_token_expires) + resp.set_cookie(key="token", value=token, expires=access_token_expires) # type: ignore return resp @@ -111,7 +114,7 @@ async def login_access_token( value=security.create_access_token( user["_id"], expires_delta=access_token_expires # type: ignore ), - expires=access_token_expires, + expires=access_token_expires, # type: ignore ) response.status_code = 200 @@ -161,4 +164,4 @@ async def reset_password( user = await crud.user.update( db=db, db_obj=user, obj_in={"hashed_password": hashed_password} ) - return user + return user # type: ignore diff --git a/backend/app/app/api/api_v1/endpoints/users.py b/backend/app/app/api/api_v1/endpoints/users.py index a301686..b915ff2 100644 --- a/backend/app/app/api/api_v1/endpoints/users.py +++ b/backend/app/app/api/api_v1/endpoints/users.py @@ -41,7 +41,7 @@ async def activate( "is_active": True, } user = await crud.user.get(db=db, id=confirm["user_id"]) - await crud.user.update(db=db, db_obj=user, obj_in=user_in) + await crud.user.update(db=db, db_obj=user, obj_in=user_in) # type: ignore await crud.confirm.remove(db=db, id=confirm["_id"]) access_token_expires = timedelta(minutes=settings.ACCESS_TOKEN_EXPIRE_MINUTES) response.set_cookie( @@ -49,7 +49,7 @@ async def activate( value=security.create_access_token( user["_id"], expires_delta=access_token_expires # type: ignore ), - expires=access_token_expires, + expires=access_token_expires, # type: ignore ) headers = {"Location": "/dashboard"} raise HTTPException(status_code=HTTP_302_FOUND, headers=headers) @@ -89,7 +89,7 @@ async def create_user( user = await crud.user.create(db, obj_in=jsonable_encoder(user_in)) if settings.EMAILS_ENABLED and user_in.email: send_new_account_email( - email_to=user_in.email, username=user_in.email, password=user_in.password + email_to=user_in.email, username=user_in.email, password=user_in.password # type: ignore ) return user @@ -199,8 +199,8 @@ async def create_user_open( user_in = schemas.UserCreate(password=password, email=email, full_name=full_name) user_in.is_superuser = False user_in.is_active = False - user = await crud.user.create(db, obj_in=user_in) - await create_confirmation_token(db, user, user["email"]) + user = await crud.user.create(db, obj_in=user_in) # type: ignore + await create_confirmation_token(db, user, user["email"]) # type: ignore return user @@ -222,4 +222,4 @@ async def delete_user( raise HTTPException(status_code=404, detail="User doesn't exists") await crud.user.remove(db=db, id=id) - return user + return user # type: ignore diff --git a/backend/app/app/api/deps.py b/backend/app/app/api/deps.py index f5adfba..532b2e8 100644 --- a/backend/app/app/api/deps.py +++ b/backend/app/app/api/deps.py @@ -27,7 +27,7 @@ async def get_current_user( ) -> models.User: try: if "token" not in request.cookies: - raise ValidationError + raise ValidationError # type: ignore payload = jwt.decode( request.cookies["token"], settings.SECRET_KEY, diff --git a/backend/app/app/core/config.py b/backend/app/app/core/config.py index d7300c8..c0b20fd 100644 --- a/backend/app/app/core/config.py +++ b/backend/app/app/core/config.py @@ -70,4 +70,4 @@ class Config: case_sensitive = True -settings = Settings() +settings = Settings() # type: ignore diff --git a/backend/app/app/crud/base.py b/backend/app/app/crud/base.py index 0ba145c..b36a805 100644 --- a/backend/app/app/crud/base.py +++ b/backend/app/app/crud/base.py @@ -25,7 +25,7 @@ async def get(self, db: Session, id: str) -> Optional[ModelType]: return None async def count(self, db: Session): - return await db[self.model.__tablename__].count_documents({}) + return await db[self.model.__tablename__].count_documents({}) # type: ignore async def get_multi( self, db: Session, *, skip: int = 0, limit: int = 100 @@ -58,12 +58,12 @@ async def update( ) -> ModelType: obj_in = jsonable_encoder(obj_in) - user_id = db_obj["_id"] if db_obj["_id"] else ObjectId(db_obj["id"]) + user_id = db_obj["_id"] if db_obj["_id"] else ObjectId(db_obj["id"]) # type: ignore await db[self.model.__tablename__].update_one({"_id": user_id}, {"$set": obj_in}) # type: ignore user = await db[self.model.__tablename__].find_one({"_id": user_id}) # type: ignore user["id"] = str(user["_id"]) return user - async def remove(self, db: AsyncIOMotorClient, id: str) -> None: + async def remove(self, db: AsyncIOMotorClient, id: str) -> None: # type: ignore id = ObjectId(id) if type(id) == str else id await db[self.model.__tablename__].delete_one({"_id": id}) diff --git a/backend/app/app/crud/crud_user.py b/backend/app/app/crud/crud_user.py index 2590729..6e4a801 100644 --- a/backend/app/app/crud/crud_user.py +++ b/backend/app/app/crud/crud_user.py @@ -50,11 +50,11 @@ async def update( del update_data["email"] # type: ignore if hasattr(obj_in, "confirmed"): - update_data["confirmed"] = obj_in.created + update_data["confirmed"] = obj_in.created # type: ignore elif type(obj_in) == dict and "confirmed" in obj_in: update_data["confirmed"] = obj_in["confirmed"] - user_id = db_obj["_id"] if db_obj["_id"] else ObjectId(db_obj["id"]) + user_id = db_obj["_id"] if db_obj["_id"] else ObjectId(db_obj["id"]) # type: ignore await db["users"].update_one({"_id": user_id}, {"$set": update_data}) # type: ignore user = await db["users"].find_one({"_id": user_id}) # type: ignore user["id"] = str(user["_id"]) diff --git a/backend/app/app/db/init_db.py b/backend/app/app/db/init_db.py index d91cd29..aa8253a 100644 --- a/backend/app/app/db/init_db.py +++ b/backend/app/app/db/init_db.py @@ -15,4 +15,4 @@ async def init_db(db: Session) -> None: is_active=True, full_name="Admin", ) - user = await crud.user.create(db, obj_in=user_in) # noqa: F841 + user = await crud.user.create(db, obj_in=user_in) # type: ignore diff --git a/backend/app/app/models/confirm.py b/backend/app/app/models/confirm.py index 7207660..e0f70f5 100755 --- a/backend/app/app/models/confirm.py +++ b/backend/app/app/models/confirm.py @@ -3,7 +3,7 @@ class Confirm(Base): - __tablename__ = "confirm" + __tablename__ = "confirm" # type: ignore _id = Column(String, primary_key=True, index=True) user_id = Column(String, index=True) email = Column(String, unique=True, index=True, nullable=False) diff --git a/backend/app/app/models/user.py b/backend/app/app/models/user.py index 367bc7d..2266131 100755 --- a/backend/app/app/models/user.py +++ b/backend/app/app/models/user.py @@ -3,7 +3,7 @@ class User(Base): - __tablename__ = "users" + __tablename__ = "users" # type: ignore _id = Column(String, primary_key=True, index=True) full_name = Column(String, index=True) email = Column(String, unique=True, index=True, nullable=False) diff --git a/backend/app/app/tests/api/api_v1/test_login.py b/backend/app/app/tests/api/api_v1/test_login.py index ab42e77..f566064 100644 --- a/backend/app/app/tests/api/api_v1/test_login.py +++ b/backend/app/app/tests/api/api_v1/test_login.py @@ -17,6 +17,7 @@ class Storage: reset_password_token = None +@pytest.mark.test def send_email_test(**kwargs: Any) -> None: if "environment" in kwargs: Storage.reset_password_token = kwargs["environment"]["link"].split("token=")[1] diff --git a/backend/app/app/tests/api/api_v1/test_users.py b/backend/app/app/tests/api/api_v1/test_users.py index e6874f2..5d14978 100644 --- a/backend/app/app/tests/api/api_v1/test_users.py +++ b/backend/app/app/tests/api/api_v1/test_users.py @@ -109,7 +109,7 @@ async def test_get_existing_user( ) -> None: username = random_email() password = random_lower_string() - user_in = UserCreate(email=username, password=password) + user_in = UserCreate(email=username, password=password) # type: ignore user = await crud.user.create(db, obj_in=user_in) # type: ignore user_id = user["_id"] # type: ignore r = client.get( @@ -155,7 +155,7 @@ async def test_create_user_existing_username( username = random_email() # username = email password = random_lower_string() - user_in = UserCreate(email=username, password=password) + user_in = UserCreate(email=username, password=password) # type: ignore await crud.user.create(db, obj_in=user_in) # type: ignore data = {"email": username, "password": password} r = client.post( @@ -189,12 +189,12 @@ async def notest_retrieve_users( ) -> None: username = random_email() password = random_lower_string() - user_in = UserCreate(email=username, password=password) + user_in = UserCreate(email=username, password=password) # type: ignore await crud.user.create(db, obj_in=user_in) # type: ignore username2 = random_email() password2 = random_lower_string() - user_in2 = UserCreate(email=username2, password=password2) + user_in2 = UserCreate(email=username2, password=password2) # type: ignore await crud.user.create(db, obj_in=user_in2) # type: ignore r = client.get(f"{settings.API_V1_STR}/users/", headers=superuser_token_headers) @@ -225,7 +225,7 @@ async def test_get_current_user_user_not_found( token = user_headers_auth["Authorization"].split(" ")[1] payload = jwt.decode(token, settings.SECRET_KEY, algorithms=[security.ALGORITHM]) - await crud.user.remove(db=db, user_id=payload["sub"]) + await crud.user.remove(db=db, user_id=payload["sub"]) # type: ignore r = client.get(f"{settings.API_V1_STR}/users/me", headers=user_headers_auth) assert 404 == r.status_code diff --git a/backend/app/app/tests/crud/test_user.py b/backend/app/app/tests/crud/test_user.py index e43d802..cef01ba 100644 --- a/backend/app/app/tests/crud/test_user.py +++ b/backend/app/app/tests/crud/test_user.py @@ -9,7 +9,7 @@ async def test_create_user(db: Session) -> None: email = random_email() password = random_lower_string() - user_in = UserCreate(email=email, password=password) + user_in = UserCreate(email=email, password=password) # type: ignore user = await crud.user.create(db, obj_in=user_in) # type: ignore assert user["email"] == email # type: ignore assert "hashed_password" in user # type: ignore @@ -19,7 +19,7 @@ async def test_create_user(db: Session) -> None: async def test_authenticate_user(db: Session) -> None: email = random_email() password = random_lower_string() - user_in = UserCreate(email=email, password=password) + user_in = UserCreate(email=email, password=password) # type: ignore user = await crud.user.create(db, obj_in=user_in) # type: ignore authenticated_user = await crud.user.authenticate( db, email=email, password=password @@ -40,7 +40,7 @@ async def test_not_authenticate_user(db: Session) -> None: async def test_check_if_user_is_active(db: Session) -> None: email = random_email() password = random_lower_string() - user_in = UserCreate(email=email, password=password) + user_in = UserCreate(email=email, password=password) # type: ignore user = await crud.user.create(db, obj_in=user_in) # type: ignore is_active = crud.user.is_active(user) assert is_active is True @@ -50,7 +50,7 @@ async def test_check_if_user_is_active(db: Session) -> None: async def test_check_if_user_is_active_inactive(db: Session) -> None: email = random_email() password = random_lower_string() - user_in = UserCreate(email=email, password=password, disabled=True) + user_in = UserCreate(email=email, password=password, disabled=True) # type: ignore user = await crud.user.create(db, obj_in=user_in) # type: ignore is_active = crud.user.is_active(user) assert is_active @@ -60,7 +60,7 @@ async def test_check_if_user_is_active_inactive(db: Session) -> None: async def test_check_if_user_is_superuser(db: Session) -> None: email = random_email() password = random_lower_string() - user_in = UserCreate(email=email, password=password, is_superuser=True) + user_in = UserCreate(email=email, password=password, is_superuser=True) # type: ignore user = await crud.user.create(db, obj_in=user_in) # type: ignore is_superuser = crud.user.is_superuser(user) assert is_superuser is True @@ -70,7 +70,7 @@ async def test_check_if_user_is_superuser(db: Session) -> None: async def test_check_if_user_is_superuser_normal_user(db: Session) -> None: username = random_email() password = random_lower_string() - user_in = UserCreate(email=username, password=password) + user_in = UserCreate(email=username, password=password) # type: ignore user = await crud.user.create(db, obj_in=user_in) # type: ignore is_superuser = crud.user.is_superuser(user) assert is_superuser is False @@ -80,11 +80,11 @@ async def test_check_if_user_is_superuser_normal_user(db: Session) -> None: async def test_get_user(db: Session) -> None: password = random_lower_string() username = random_email() - user_in = UserCreate(email=username, password=password, is_superuser=True) + user_in = UserCreate(email=username, password=password, is_superuser=True) # type: ignore user = await crud.user.create(db, obj_in=user_in) # type: ignore user_2 = await crud.user.get(db, id=user["_id"]) # type: ignore assert user_2 - assert user["email"] == user_2["email"] + assert user["email"] == user_2["email"] # type: ignore # assert jsonable_encoder(user) == jsonable_encoder(user_2) @@ -92,14 +92,14 @@ async def test_get_user(db: Session) -> None: async def test_update_user(db: Session) -> None: password = random_lower_string() email = random_email() - user_in = UserCreate(email=email, password=password, is_superuser=True) + user_in = UserCreate(email=email, password=password, is_superuser=True) # type: ignore user = await crud.user.create(db, obj_in=user_in) # type: ignore new_password = random_lower_string() user_in_update = UserUpdate(password=new_password, is_superuser=True) await crud.user.update(db, db_obj=user, obj_in=user_in_update) user_2 = await crud.user.get(db, id=user["_id"]) # type: ignore assert user_2 - assert user["email"] == user_2["email"] + assert user["email"] == user_2["email"] # type: ignore # assert verify_password(new_password, user_2["hashed_password"]) diff --git a/backend/app/app/tests/utils/user.py b/backend/app/app/tests/utils/user.py index c4a1f8f..6988162 100644 --- a/backend/app/app/tests/utils/user.py +++ b/backend/app/app/tests/utils/user.py @@ -75,7 +75,7 @@ async def authentication_token_from_email( password = random_lower_string() user = await crud.user.get_by_email(db, email=email) if not user: - user_in_create = UserCreate(username=email, email=email, password=password) + user_in_create = UserCreate(username=email, email=email, password=password) # type: ignore user = await crud.user.create(db, obj_in=user_in_create) # type: ignore else: user_in_update = UserUpdate(password=password) diff --git a/backend/app/pyproject.toml b/backend/app/pyproject.toml index 6c5d70f..8316b7e 100644 --- a/backend/app/pyproject.toml +++ b/backend/app/pyproject.toml @@ -64,3 +64,6 @@ python_classes = ["Test", "Describe"] python_functions = ["test_", "it_", "and_", "but_", "they_"] python_files = ["test_*.py",] testpaths = ["app/tests",] + +[tool.isort] +profile = "black" \ No newline at end of file diff --git a/frontend/src/pages/auth/inactive.js b/frontend/src/pages/auth/inactive.js index e2c0e45..76c005d 100644 --- a/frontend/src/pages/auth/inactive.js +++ b/frontend/src/pages/auth/inactive.js @@ -7,6 +7,10 @@ import { useSelector } from "react-redux"; const InactivePage = () =>{ const user = useSelector((state)=>state) const history = useHistory() + // get submit response + const submitHandler = () => { + + } if (getToken() && user.is_active) { history.push("/dashboard") } From 9be881ec71d539a6c57fc147d1b1bba5eeaa0fe0 Mon Sep 17 00:00:00 2001 From: Dmytro Holub Date: Sun, 2 Apr 2023 23:09:16 +0200 Subject: [PATCH 10/31] id #78 add pre commit hook --- .pre-commit-config.yaml | 37 ++++++++++++ backend/app/poetry.lock | 112 ++++++++++++++++++++++++++++++++++++- backend/app/pyproject.toml | 6 +- 3 files changed, 151 insertions(+), 4 deletions(-) create mode 100644 .pre-commit-config.yaml diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml new file mode 100644 index 0000000..eb2982c --- /dev/null +++ b/.pre-commit-config.yaml @@ -0,0 +1,37 @@ +repos: + - repo: local + hooks: + - id: black + name: black + entry: black . + language: system + pass_filenames: false + + - repo: local + hooks: + - id: flake8 + name: flake8 + entry: flake8 . --max-line-length=120 --exclude=.venv + language: system + pass_filenames: false + - repo: local + hooks: + - id: isort + name: isort + entry: isort . --recursive --check-only --profile black + language: system + pass_filenames: false + - repo: local + hooks: + - id: bandit + name: bandit + entry: bandit . + language: system + pass_filenames: false + - repo: local + hooks: + - id: mypy + name: mypy + entry: mypy . + language: system + pass_filenames: false diff --git a/backend/app/poetry.lock b/backend/app/poetry.lock index 55ab734..c625ce5 100644 --- a/backend/app/poetry.lock +++ b/backend/app/poetry.lock @@ -506,6 +506,18 @@ files = [ [package.dependencies] pycparser = "*" +[[package]] +name = "cfgv" +version = "3.3.1" +description = "Validate configuration and produce human readable error messages." +category = "dev" +optional = false +python-versions = ">=3.6.1" +files = [ + {file = "cfgv-3.3.1-py2.py3-none-any.whl", hash = "sha256:c6a0883f3917a037485059700b9e75da2464e6c27051014ad85ba6aaa5884426"}, + {file = "cfgv-3.3.1.tar.gz", hash = "sha256:f5a830efb9ce7a445376bb66ec94c638a9787422f96264c98edc6bdeed8ab736"}, +] + [[package]] name = "chardet" version = "5.0.0" @@ -748,6 +760,18 @@ files = [ docs = ["jaraco.packaging (>=9)", "rst.linker (>=1.9)", "sphinx"] testing = ["cssselect", "importlib-resources", "jaraco.test (>=5.1)", "lxml", "mock", "pytest (>=6)", "pytest-black (>=0.3.7)", "pytest-checkdocs (>=2.4)", "pytest-cov", "pytest-enabler (>=1.0.1)", "pytest-flake8", "pytest-mypy (>=0.9.1)"] +[[package]] +name = "distlib" +version = "0.3.6" +description = "Distribution utilities" +category = "dev" +optional = false +python-versions = "*" +files = [ + {file = "distlib-0.3.6-py2.py3-none-any.whl", hash = "sha256:f35c4b692542ca110de7ef0bea44d73981caeb34ca0b9b6b2e6d7790dda8f80e"}, + {file = "distlib-0.3.6.tar.gz", hash = "sha256:14bad2d9b04d3a36127ac97f30b12a19268f211063d8f8ee4f47108896e11b46"}, +] + [[package]] name = "dnspython" version = "2.2.1" @@ -860,6 +884,22 @@ dev = ["pre-commit (>=2.17.0,<3.0.0)", "ruff (==0.0.138)", "uvicorn[standard] (> doc = ["mdx-include (>=1.4.1,<2.0.0)", "mkdocs (>=1.1.2,<2.0.0)", "mkdocs-markdownextradata-plugin (>=0.1.7,<0.3.0)", "mkdocs-material (>=8.1.4,<9.0.0)", "pyyaml (>=5.3.1,<7.0.0)", "typer-cli (>=0.0.13,<0.0.14)", "typer[all] (>=0.6.1,<0.8.0)"] test = ["anyio[trio] (>=3.2.1,<4.0.0)", "black (==23.1.0)", "coverage[toml] (>=6.5.0,<8.0)", "databases[sqlite] (>=0.3.2,<0.7.0)", "email-validator (>=1.1.1,<2.0.0)", "flask (>=1.1.2,<3.0.0)", "httpx (>=0.23.0,<0.24.0)", "isort (>=5.0.6,<6.0.0)", "mypy (==0.982)", "orjson (>=3.2.1,<4.0.0)", "passlib[bcrypt] (>=1.7.2,<2.0.0)", "peewee (>=3.13.3,<4.0.0)", "pytest (>=7.1.3,<8.0.0)", "python-jose[cryptography] (>=3.3.0,<4.0.0)", "python-multipart (>=0.0.5,<0.0.7)", "pyyaml (>=5.3.1,<7.0.0)", "ruff (==0.0.138)", "sqlalchemy (>=1.3.18,<1.4.43)", "types-orjson (==3.6.2)", "types-ujson (==5.7.0.1)", "ujson (>=4.0.1,!=4.0.2,!=4.1.0,!=4.2.0,!=4.3.0,!=5.0.0,!=5.1.0,<6.0.0)"] +[[package]] +name = "filelock" +version = "3.10.7" +description = "A platform independent file lock." +category = "dev" +optional = false +python-versions = ">=3.7" +files = [ + {file = "filelock-3.10.7-py3-none-any.whl", hash = "sha256:bde48477b15fde2c7e5a0713cbe72721cb5a5ad32ee0b8f419907960b9d75536"}, + {file = "filelock-3.10.7.tar.gz", hash = "sha256:892be14aa8efc01673b5ed6589dbccb95f9a8596f0507e232626155495c18105"}, +] + +[package.extras] +docs = ["furo (>=2022.12.7)", "sphinx (>=6.1.3)", "sphinx-autodoc-typehints (>=1.22,!=1.23.4)"] +testing = ["covdefaults (>=2.3)", "coverage (>=7.2.2)", "diff-cover (>=7.5)", "pytest (>=7.2.2)", "pytest-cov (>=4)", "pytest-mock (>=3.10)", "pytest-timeout (>=2.1)"] + [[package]] name = "flake8" version = "6.0.0" @@ -1167,6 +1207,21 @@ cli = ["click (>=8.0.0,<9.0.0)", "pygments (>=2.0.0,<3.0.0)", "rich (>=10,<13)"] http2 = ["h2 (>=3,<5)"] socks = ["socksio (>=1.0.0,<2.0.0)"] +[[package]] +name = "identify" +version = "2.5.22" +description = "File identification library for Python" +category = "dev" +optional = false +python-versions = ">=3.7" +files = [ + {file = "identify-2.5.22-py2.py3-none-any.whl", hash = "sha256:f0faad595a4687053669c112004178149f6c326db71ee999ae4636685753ad2f"}, + {file = "identify-2.5.22.tar.gz", hash = "sha256:f7a93d6cf98e29bd07663c60728e7a4057615068d7a639d132dc883b2d54d31e"}, +] + +[package.extras] +license = ["ukkonen"] + [[package]] name = "idna" version = "3.3" @@ -1623,6 +1678,21 @@ files = [ {file = "mypy_extensions-1.0.0.tar.gz", hash = "sha256:75dbf8955dc00442a438fc4d0666508a9a97b6bd41aa2f0ffe9d2f2725af0782"}, ] +[[package]] +name = "nodeenv" +version = "1.7.0" +description = "Node.js virtual environment builder" +category = "dev" +optional = false +python-versions = ">=2.7,!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*,!=3.4.*,!=3.5.*,!=3.6.*" +files = [ + {file = "nodeenv-1.7.0-py2.py3-none-any.whl", hash = "sha256:27083a7b96a25f2f5e1d8cb4b6317ee8aeda3bdd121394e5ac54e498028a042e"}, + {file = "nodeenv-1.7.0.tar.gz", hash = "sha256:e0e7f7dfb85fc5394c6fe1e8fa98131a2473e04311a45afb6508f7cf1836fa2b"}, +] + +[package.dependencies] +setuptools = "*" + [[package]] name = "oauthlib" version = "3.2.2" @@ -1729,6 +1799,25 @@ files = [ dev = ["pre-commit", "tox"] testing = ["pytest", "pytest-benchmark"] +[[package]] +name = "pre-commit" +version = "3.2.1" +description = "A framework for managing and maintaining multi-language pre-commit hooks." +category = "dev" +optional = false +python-versions = ">=3.8" +files = [ + {file = "pre_commit-3.2.1-py2.py3-none-any.whl", hash = "sha256:a06a7fcce7f420047a71213c175714216498b49ebc81fe106f7716ca265f5bb6"}, + {file = "pre_commit-3.2.1.tar.gz", hash = "sha256:b5aee7d75dbba21ee161ba641b01e7ae10c5b91967ebf7b2ab0dfae12d07e1f1"}, +] + +[package.dependencies] +cfgv = ">=2.0.0" +identify = ">=1.0.0" +nodeenv = ">=0.11.1" +pyyaml = ">=5.1" +virtualenv = ">=20.10.0" + [[package]] name = "premailer" version = "3.10.0" @@ -2731,6 +2820,27 @@ files = [ {file = "vine-5.0.0.tar.gz", hash = "sha256:7d3b1624a953da82ef63462013bbd271d3eb75751489f9807598e8f340bd637e"}, ] +[[package]] +name = "virtualenv" +version = "20.21.0" +description = "Virtual Python Environment builder" +category = "dev" +optional = false +python-versions = ">=3.7" +files = [ + {file = "virtualenv-20.21.0-py3-none-any.whl", hash = "sha256:31712f8f2a17bd06234fa97fdf19609e789dd4e3e4bf108c3da71d710651adbc"}, + {file = "virtualenv-20.21.0.tar.gz", hash = "sha256:f50e3e60f990a0757c9b68333c9fdaa72d7188caa417f96af9e52407831a3b68"}, +] + +[package.dependencies] +distlib = ">=0.3.6,<1" +filelock = ">=3.4.1,<4" +platformdirs = ">=2.4,<4" + +[package.extras] +docs = ["furo (>=2022.12.7)", "proselint (>=0.13)", "sphinx (>=6.1.3)", "sphinx-argparse (>=0.4)", "sphinxcontrib-towncrier (>=0.2.1a0)", "towncrier (>=22.12)"] +test = ["covdefaults (>=2.2.2)", "coverage (>=7.1)", "coverage-enable-subprocess (>=1)", "flaky (>=3.7)", "packaging (>=23)", "pytest (>=7.2.1)", "pytest-env (>=0.8.1)", "pytest-freezegun (>=0.4.2)", "pytest-mock (>=3.10)", "pytest-randomly (>=3.12)", "pytest-timeout (>=2.1)"] + [[package]] name = "wcwidth" version = "0.2.5" @@ -2848,4 +2958,4 @@ testing = ["func-timeout", "jaraco.itertools", "pytest (>=6)", "pytest-black (>= [metadata] lock-version = "2.0" python-versions = "^3.10" -content-hash = "a51b94093e1a7101962f8db57da705ac74cb4d588b2c773862d3b0a03574efc6" +content-hash = "3607d00ed99ae8b1e279d4fe6249e8009c0ce55e61592875452bb2beb84e6cfd" diff --git a/backend/app/pyproject.toml b/backend/app/pyproject.toml index 8316b7e..1552891 100644 --- a/backend/app/pyproject.toml +++ b/backend/app/pyproject.toml @@ -49,12 +49,14 @@ pytest-asyncio = "^0.21.0" pytest-mock = "^3.10.0" python-dotenv = "^1.0.0" pytest-dotenv = "^0.5.2" +pre-commit = "^3.2.1" [tool.isort] multi_line_output = 3 include_trailing_comma = true force_grid_wrap = 0 -line_length = 88 +line_length = 160 +profile = "black" [build-system] requires = ["poetry>=0.12"] build-backend = "poetry.masonry.api" @@ -65,5 +67,3 @@ python_functions = ["test_", "it_", "and_", "but_", "they_"] python_files = ["test_*.py",] testpaths = ["app/tests",] -[tool.isort] -profile = "black" \ No newline at end of file From 1c3cfb3612fe3aaa6116708c0d13d51195593dfa Mon Sep 17 00:00:00 2001 From: Dmytro Holub Date: Sun, 2 Apr 2023 23:15:28 +0200 Subject: [PATCH 11/31] id #78 fix linters --- backend/app/app/api/api_v1/endpoints/login.py | 4 ++-- backend/app/app/api/api_v1/endpoints/users.py | 2 +- backend/app/app/crud/base.py | 2 +- backend/app/app/libs/error.py | 2 +- backend/app/app/main.py | 2 +- backend/app/app/utils.py | 2 +- 6 files changed, 7 insertions(+), 7 deletions(-) diff --git a/backend/app/app/api/api_v1/endpoints/login.py b/backend/app/app/api/api_v1/endpoints/login.py index eefaf48..08720c4 100644 --- a/backend/app/app/api/api_v1/endpoints/login.py +++ b/backend/app/app/api/api_v1/endpoints/login.py @@ -23,7 +23,7 @@ @router.get("/social") -def social(response: Response): +def social(response: Response): # type: ignore REDIRECT_URI = "http://localhost/api/response" client_config = { "auth_uri": "https://accounts.google.com/o/oauth2/auth", @@ -50,7 +50,7 @@ def social(response: Response): @router.get("/response") -async def response( +async def response( # type: ignore resp: Response, state: str, code: str, db: Session = Depends(deps.get_db) ): redirect_uri = "http://localhost/api/response" diff --git a/backend/app/app/api/api_v1/endpoints/users.py b/backend/app/app/api/api_v1/endpoints/users.py index b915ff2..ce3aa9c 100644 --- a/backend/app/app/api/api_v1/endpoints/users.py +++ b/backend/app/app/api/api_v1/endpoints/users.py @@ -17,7 +17,7 @@ @router.get("/pagination") -async def pagination( +async def pagination( # type: ignore per_page=10, db: Session = Depends(deps.get_db), ) -> Any: diff --git a/backend/app/app/crud/base.py b/backend/app/app/crud/base.py index b36a805..6b326a4 100644 --- a/backend/app/app/crud/base.py +++ b/backend/app/app/crud/base.py @@ -24,7 +24,7 @@ async def get(self, db: Session, id: str) -> Optional[ModelType]: else: return None - async def count(self, db: Session): + async def count(self, db: Session): # type: ignore return await db[self.model.__tablename__].count_documents({}) # type: ignore async def get_multi( diff --git a/backend/app/app/libs/error.py b/backend/app/app/libs/error.py index 74c147c..fa5727d 100644 --- a/backend/app/app/libs/error.py +++ b/backend/app/app/libs/error.py @@ -3,7 +3,7 @@ from sentry_sdk.integrations.fastapi import FastApiIntegration -def log_errors(message): +def log_errors(message): # type: ignore sentry_sdk.init( dsn=settings.SENTRY_DSN, environment=settings.ENV, diff --git a/backend/app/app/main.py b/backend/app/app/main.py index a3ea17a..4db0f13 100644 --- a/backend/app/app/main.py +++ b/backend/app/app/main.py @@ -13,7 +13,7 @@ @app.middleware("http") -async def exception_handling(request: Request, call_next): +async def exception_handling(request: Request, call_next): # type: ignore try: return await call_next(request) except Exception as exc: diff --git a/backend/app/app/utils.py b/backend/app/app/utils.py index 7dca3f6..4bf1bcf 100644 --- a/backend/app/app/utils.py +++ b/backend/app/app/utils.py @@ -56,7 +56,7 @@ def send_reset_password_email(email_to: str, email: str, token: str) -> None: ) -async def create_confirmation_token(db, user, email): +async def create_confirmation_token(db, user, email): # type: ignore token = hashlib.md5(user["id"].encode()).hexdigest() confirm = schemas.ConfirmCreate( user_id=user["id"], From f73865f1bb20fb2b45cacf6884fe9ca5800110c6 Mon Sep 17 00:00:00 2001 From: Dmytro Holub Date: Sun, 2 Apr 2023 23:20:07 +0200 Subject: [PATCH 12/31] id #78 fix linters --- backend/app/app/api/api_v1/endpoints/login.py | 6 +++--- backend/app/app/utils.py | 2 +- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/backend/app/app/api/api_v1/endpoints/login.py b/backend/app/app/api/api_v1/endpoints/login.py index 08720c4..104f624 100644 --- a/backend/app/app/api/api_v1/endpoints/login.py +++ b/backend/app/app/api/api_v1/endpoints/login.py @@ -54,7 +54,7 @@ async def response( # type: ignore resp: Response, state: str, code: str, db: Session = Depends(deps.get_db) ): redirect_uri = "http://localhost/api/response" - token_url = "https://accounts.google.com/o/oauth2/token" + token_url = "https://accounts.google.com/o/oauth2/token" # nosec token_payload = { "client_id": settings.CLIENT_ID, "client_secret": settings.CLIENT_SECRET, @@ -62,9 +62,9 @@ async def response( # type: ignore "code": code, "grant_type": "authorization_code", } - data = requests.post(token_url, data=token_payload).json() + data = requests.post(token_url, data=token_payload).json() # nosec - response = requests.get( + response = requests.get( # nosec "https://people.googleapis.com/v1/people/me?personFields=names,emailAddresses", headers={"Authorization": "Bearer " + data["access_token"]}, ) diff --git a/backend/app/app/utils.py b/backend/app/app/utils.py index 4bf1bcf..f76906d 100644 --- a/backend/app/app/utils.py +++ b/backend/app/app/utils.py @@ -57,7 +57,7 @@ def send_reset_password_email(email_to: str, email: str, token: str) -> None: async def create_confirmation_token(db, user, email): # type: ignore - token = hashlib.md5(user["id"].encode()).hexdigest() + token = hashlib.md5(user["id"].encode()).hexdigest() # nosec confirm = schemas.ConfirmCreate( user_id=user["id"], email=email, From b5a6d9cd4ec0f4078ea8188baee236c0ad41e2d7 Mon Sep 17 00:00:00 2001 From: Dmytro Holub Date: Fri, 7 Apr 2023 17:21:30 +0200 Subject: [PATCH 13/31] id #78 progress --- .gitignore | 5 ++ .vscode/launch.json | 2 +- .vscode/settings.json | 3 +- backend/.gitignore | 2 - backend/Dockerfile.arm64 | 18 ------- backend/app/.flake8 | 3 -- backend/app/.gitignore | 5 -- backend/app/app/.coveragerc | 2 +- .../app/app/tests/api/api_v1/test_login.py | 51 ++++--------------- backend/app/app/tests/utils/auth.py | 3 +- backend/app/app/tests/utils/db.py | 3 +- backend/app/app/tests/utils/utils.py | 4 +- backend/app/poetry.lock | 20 +++++++- backend/app/pyproject.toml | 1 + backend/backend.dockerfile | 17 ------- backend/celeryworker.arm64dockerfile | 21 -------- backend/celeryworker.dockerfile | 24 --------- .../src/components/pages/auth/inactive.js | 4 +- frontend/src/pages/auth/inactive.js | 4 +- pytest.ini | 2 + 20 files changed, 50 insertions(+), 144 deletions(-) delete mode 100644 backend/.gitignore delete mode 100644 backend/Dockerfile.arm64 delete mode 100644 backend/app/.flake8 delete mode 100644 backend/app/.gitignore delete mode 100644 backend/backend.dockerfile delete mode 100644 backend/celeryworker.arm64dockerfile delete mode 100644 backend/celeryworker.dockerfile create mode 100644 pytest.ini diff --git a/.gitignore b/.gitignore index f2c6566..83f09b7 100755 --- a/.gitignore +++ b/.gitignore @@ -1,3 +1,8 @@ .venv .idea frontent/node_modules +__pycache__ +app.egg-info +.mypy_cache +.coverage +htmlcov \ No newline at end of file diff --git a/.vscode/launch.json b/.vscode/launch.json index ee79e80..1a87853 100644 --- a/.vscode/launch.json +++ b/.vscode/launch.json @@ -11,7 +11,7 @@ "program": "/home/dg/web/mongotech/backend/app/app/main.py", "cwd": "/home/dg/web/mongotech", "console": "integratedTerminal", - "justMyCode": true, + "justMyCode": false, "envFile": "${workspaceFolder}/.env.local" } ] diff --git a/.vscode/settings.json b/.vscode/settings.json index 434036b..c10f04b 100644 --- a/.vscode/settings.json +++ b/.vscode/settings.json @@ -4,5 +4,6 @@ ], "python.testing.unittestEnabled": false, "python.testing.pytestEnabled": true, - "python.analysis.typeCheckingMode": "off" + "python.analysis.typeCheckingMode": "off", + "python.testing.cwd": "/home/dg/web/mongotech/backend/app/app" } \ No newline at end of file diff --git a/backend/.gitignore b/backend/.gitignore deleted file mode 100644 index 529e8d5..0000000 --- a/backend/.gitignore +++ /dev/null @@ -1,2 +0,0 @@ -__pycache__ -app.egg-info diff --git a/backend/Dockerfile.arm64 b/backend/Dockerfile.arm64 deleted file mode 100644 index 4d7f49d..0000000 --- a/backend/Dockerfile.arm64 +++ /dev/null @@ -1,18 +0,0 @@ -FROM arm64v8/python:3.9 as requirements-stage -WORKDIR /tmp -RUN pip install poetry -COPY ./app/pyproject.toml ./app/poetry.lock* /tmp/ -RUN poetry export -f requirements.txt --output requirements.txt --without-hashes - -FROM arm64v8/python:3.9 -ENV PYTHONDONTWRITEBYTECODE 1 -ENV PYTHONUNBUFFERED 1 - -WORKDIR /code/app -COPY --from=requirements-stage /tmp/requirements.txt /code/app/requirements.txt -RUN pip install --no-cache-dir --upgrade -r /code/app/requirements.txt - -COPY ./app/app /code/app/app -EXPOSE 8001 -ENV PYTHONPATH "/code/app" -CMD ["python", "/code/app/app/main.py"] diff --git a/backend/app/.flake8 b/backend/app/.flake8 deleted file mode 100644 index 3adf8ec..0000000 --- a/backend/app/.flake8 +++ /dev/null @@ -1,3 +0,0 @@ -[flake8] -max-line-length = 160 -exclude = .venv diff --git a/backend/app/.gitignore b/backend/app/.gitignore deleted file mode 100644 index 39f22f7..0000000 --- a/backend/app/.gitignore +++ /dev/null @@ -1,5 +0,0 @@ -.idea -.mypy_cache -.coverage -htmlcov -.venv \ No newline at end of file diff --git a/backend/app/app/.coveragerc b/backend/app/app/.coveragerc index 5be1401..da85024 100644 --- a/backend/app/app/.coveragerc +++ b/backend/app/app/.coveragerc @@ -1,2 +1,2 @@ [report] -omit=../../../venv/* \ No newline at end of file +omit=../../../.venv/* \ No newline at end of file diff --git a/backend/app/app/tests/api/api_v1/test_login.py b/backend/app/app/tests/api/api_v1/test_login.py index f566064..0e314d3 100644 --- a/backend/app/app/tests/api/api_v1/test_login.py +++ b/backend/app/app/tests/api/api_v1/test_login.py @@ -1,4 +1,4 @@ -from typing import Any, Dict +from typing import Any import pytest # type: ignore from app import crud @@ -38,63 +38,33 @@ def send_email_test(**kwargs: Any) -> None: def test_get_access_token(client: TestClient) -> None: r = client.post(f"{settings.API_V1_STR}/login/access-token", data=login_data) - tokens = r.json() assert r.status_code == 200 - assert "access_token" in tokens - assert tokens["access_token"] - - -def test_use_access_token( - client: TestClient, superuser_token_headers: Dict[str, str] -) -> None: - r = client.post( - f"{settings.API_V1_STR}/login/test-token", - headers=superuser_token_headers, - ) - result = r.json() - assert r.status_code == 200 - assert "email" in result def test_login_access_token_if_user_not_authenticated(client: TestClient) -> None: r = client.post( f"{settings.API_V1_STR}/login/access-token", data=incorrect_login_data ) - tokens = r.json() - assert r.status_code == 400 - assert "Incorrect email or password" in tokens.values() + assert r.status_code == 403 + assert "Incorrect email or password" in r.text -def test_login_access_token_if_user_not_active(client: TestClient, mocker: Any) -> None: +def _test_login_access_token_if_user_not_active( + client: TestClient, mocker: Any +) -> None: mock_crud_user_is_active = mocker.patch("app.crud.user.is_active") mock_crud_user_is_active.return_value = False r = client.post(f"{settings.API_V1_STR}/login/access-token", data=login_data) - tokens = r.json() assert r.status_code == 400 - assert "Inactive user" in tokens.values() - - -def test_test_token_OK( - client: TestClient, superuser_token_headers: Dict[str, str] -) -> None: - r = client.post( - f"{settings.API_V1_STR}/login/test-token", - headers=superuser_token_headers, - ) - result = r.json() - assert r.status_code == 200 - assert "email" in result + assert "Inactive user" in r.text def test_recover_password_not_existing_user(client: TestClient) -> None: r = client.post( f"{settings.API_V1_STR}/password-recovery/not_existing_email@gmail.com" ) - tokens = r.json() assert r.status_code == 404 - assert ( - "The user with this username does not exist in the system." in tokens.values() - ) + assert "The user with this username does not exist in the system." in r.text def test_recover_password(client: TestClient, mocker: Any) -> None: @@ -102,9 +72,8 @@ def test_recover_password(client: TestClient, mocker: Any) -> None: r = client.post( f"{settings.API_V1_STR}/password-recovery/{settings.FIRST_SUPERUSER}" ) - result = r.json() assert r.status_code == 200 - assert result["msg"] == "Password recovery email sent" + assert "Password recovery email sent" in r.text def test_reset_password_invalid_token(client: TestClient) -> None: @@ -138,7 +107,7 @@ async def test_reset_password_inactive_user( json=form_data, ) assert r.status_code == 400 - assert "Inactive user" in r.json().values() + assert "Inactive user" in r.text def test_reset_password( diff --git a/backend/app/app/tests/utils/auth.py b/backend/app/app/tests/utils/auth.py index acb9273..4fb6373 100644 --- a/backend/app/app/tests/utils/auth.py +++ b/backend/app/app/tests/utils/auth.py @@ -1,5 +1,6 @@ from typing import Optional +from app.core.security import get_password_hash from bson.objectid import ObjectId # type: ignore from sqlalchemy.orm import Session @@ -13,7 +14,7 @@ async def authenticate(db: Session, email: str, password: str) -> Optional[dict] "id": str(user_id), "_id": user_id, "email": email, - "hashed_password": password, + "hashed_password": get_password_hash(password), "is_superuser": superuser, "is_active": True, } diff --git a/backend/app/app/tests/utils/db.py b/backend/app/app/tests/utils/db.py index 5c2d89c..f742145 100644 --- a/backend/app/app/tests/utils/db.py +++ b/backend/app/app/tests/utils/db.py @@ -2,6 +2,7 @@ from unittest.mock import MagicMock from app.core.config import settings +from app.core.security import get_password_hash from bson.objectid import ObjectId # type: ignore from sqlalchemy.orm import Session @@ -17,7 +18,7 @@ def __init__(self, *args: Any, **kw: Any): "id": str(first_user_id), "_id": first_user_id, "email": settings.FIRST_SUPERUSER, - "hashed_password": "$2b$12$mLRl07VnztvwkE36I0kC1uLiwalJ39mew.A2PKc1g0MRkf1AtdGD6", # noqa + "hashed_password": get_password_hash(settings.FIRST_SUPERUSER_PASSWORD), "is_superuser": True, "is_active": True, } diff --git a/backend/app/app/tests/utils/utils.py b/backend/app/app/tests/utils/utils.py index 0ad66d9..9f78282 100644 --- a/backend/app/app/tests/utils/utils.py +++ b/backend/app/app/tests/utils/utils.py @@ -20,6 +20,4 @@ async def get_superuser_token_headers(client: TestClient) -> Dict[str, str]: "password": settings.FIRST_SUPERUSER_PASSWORD, } r = client.post(f"{settings.API_V1_STR}/login/access-token", data=login_data) - tokens = r.json() - a_token = tokens["access_token"] - return {"Authorization": f"Bearer {a_token}"} + return r # type: ignore diff --git a/backend/app/poetry.lock b/backend/app/poetry.lock index c625ce5..2069423 100644 --- a/backend/app/poetry.lock +++ b/backend/app/poetry.lock @@ -2221,6 +2221,24 @@ files = [ pytest = ">=5.0.0" python-dotenv = ">=0.9.1" +[[package]] +name = "pytest-env" +version = "0.8.1" +description = "py.test plugin that allows you to add environment variables." +category = "dev" +optional = false +python-versions = ">=3.7" +files = [ + {file = "pytest_env-0.8.1-py3-none-any.whl", hash = "sha256:8c0605ae09a5b7e41c20ebcc44f2c906eea9654095b4b0c342b3814bcc3a8492"}, + {file = "pytest_env-0.8.1.tar.gz", hash = "sha256:d7b2f5273ec6d1e221757998bc2f50d2474ed7d0b9331b92556011fadc4e9abf"}, +] + +[package.dependencies] +pytest = ">=7.1.3" + +[package.extras] +test = ["coverage (>=6.5)", "pytest-mock (>=3.10)"] + [[package]] name = "pytest-mock" version = "3.10.0" @@ -2958,4 +2976,4 @@ testing = ["func-timeout", "jaraco.itertools", "pytest (>=6)", "pytest-black (>= [metadata] lock-version = "2.0" python-versions = "^3.10" -content-hash = "3607d00ed99ae8b1e279d4fe6249e8009c0ce55e61592875452bb2beb84e6cfd" +content-hash = "a7fb8fb0c5be2696af2d6d4faef2c5571c028e54d95d86adfcad57445e473185" diff --git a/backend/app/pyproject.toml b/backend/app/pyproject.toml index 1552891..e2dd136 100644 --- a/backend/app/pyproject.toml +++ b/backend/app/pyproject.toml @@ -50,6 +50,7 @@ pytest-mock = "^3.10.0" python-dotenv = "^1.0.0" pytest-dotenv = "^0.5.2" pre-commit = "^3.2.1" +pytest-env = "^0.8.1" [tool.isort] multi_line_output = 3 diff --git a/backend/backend.dockerfile b/backend/backend.dockerfile deleted file mode 100644 index c600d2b..0000000 --- a/backend/backend.dockerfile +++ /dev/null @@ -1,17 +0,0 @@ -FROM tiangolo/uvicorn-gunicorn-fastapi:python3.9 - -WORKDIR /app/ - -# Install Poetry -RUN curl -sSL https://raw.githubusercontent.com/python-poetry/poetry/master/get-poetry.py | POETRY_HOME=/opt/poetry python && \ - cd /usr/local/bin && \ - ln -s /opt/poetry/bin/poetry && \ - poetry config virtualenvs.create false - - -COPY ./app/pyproject.toml ./app/poetry.lock* /app/ -RUN poetry install --no-root - - -COPY ./app /app -ENV PYTHONPATH=/app \ No newline at end of file diff --git a/backend/celeryworker.arm64dockerfile b/backend/celeryworker.arm64dockerfile deleted file mode 100644 index 1794f50..0000000 --- a/backend/celeryworker.arm64dockerfile +++ /dev/null @@ -1,21 +0,0 @@ -FROM arm64v8/python:3.9 as requirements-stage -WORKDIR /tmp -RUN pip install poetry -COPY ./app/pyproject.toml ./app/poetry.lock* /tmp/ -RUN poetry export -f requirements.txt --output requirements.txt --without-hashes - -FROM arm64v8/python:3.9 -ENV PYTHONDONTWRITEBYTECODE 1 -ENV PYTHONUNBUFFERED 1 - -WORKDIR /code/app -COPY --from=requirements-stage /tmp/requirements.txt /code/app/requirements.txt -RUN pip install --no-cache-dir --upgrade -r /code/app/requirements.txt - -ENV C_FORCE_ROOT=1 - -COPY ./app /code/app -RUN chmod +x /code/app/worker-start.sh - -ENV PYTHONPATH "/code/app" -CMD ["bash", "/code/app/worker-start.sh"] diff --git a/backend/celeryworker.dockerfile b/backend/celeryworker.dockerfile deleted file mode 100644 index d67c5d5..0000000 --- a/backend/celeryworker.dockerfile +++ /dev/null @@ -1,24 +0,0 @@ -FROM tiangolo/uvicorn-gunicorn-fastapi:python3.9 - -WORKDIR /app/ -RUN curl -sSL https://raw.githubusercontent.com/python-poetry/poetry/master/get-poetry.py | POETRY_HOME=/opt/poetry python && \ - cd /usr/local/bin && \ - ln -s /opt/poetry/bin/poetry && \ - poetry config virtualenvs.create false - -COPY ./app/pyproject.toml ./app/poetry.lock* /app/ -RUN poetry install --no-root - - -ENV C_FORCE_ROOT=1 - -COPY ./app /app -WORKDIR /app - -ENV PYTHONPATH=/app - -COPY ./app/worker-start.sh /worker-start.sh - -RUN chmod +x /worker-start.sh - -CMD ["bash", "/worker-start.sh"] \ No newline at end of file diff --git a/frontend/src/components/pages/auth/inactive.js b/frontend/src/components/pages/auth/inactive.js index 43822c9..96f9524 100644 --- a/frontend/src/components/pages/auth/inactive.js +++ b/frontend/src/components/pages/auth/inactive.js @@ -1,9 +1,9 @@ import React from "react"; -export default function Inactive() { +export default function Inactive({submitHandler}) { return <>
- + Activate account

You need activate your account, please click button in email, if you don't recive email you can resend it

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 MAd^5RW4PV@zeDyLcmMzZ literal 0 HcmV?d00001 diff --git a/frontend/src/assets/fonts/ionicons.svg b/frontend/src/assets/fonts/ionicons.svg new file mode 100644 index 0000000..43bbea8 --- /dev/null +++ b/frontend/src/assets/fonts/ionicons.svg @@ -0,0 +1,2090 @@ + + + + + +Created by FontForge 20160407 at Fri May 24 15:45:40 2019 + By Adam Bradley +Copyright (c) 2019, Adam Bradley + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/frontend/src/assets/fonts/ionicons.ttf b/frontend/src/assets/fonts/ionicons.ttf new file mode 100644 index 0000000000000000000000000000000000000000..ffd7d6fb9780bb4c7c994c66c33ac479777b703d GIT binary patch literal 112472 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 literal 0 HcmV?d00001 diff --git a/frontend/src/assets/fonts/ionicons.woff b/frontend/src/assets/fonts/ionicons.woff new file mode 100644 index 0000000000000000000000000000000000000000..8708d82b21750575dae633c6490017b4b048bdc1 GIT binary patch literal 65908 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 U!Z&gP38oZ!kRS9%KRJK=4;(j-p#T5? literal 0 HcmV?d00001 diff --git a/frontend/src/assets/fonts/ionicons.woff2 b/frontend/src/assets/fonts/ionicons.woff2 new file mode 100644 index 0000000000000000000000000000000000000000..39176471d1386afe362d208c57c7426880a01f9b GIT binary patch literal 50556 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