From cf4bf778a9473911af23b218421f6f141fca47c4 Mon Sep 17 00:00:00 2001 From: AG Date: Wed, 4 Aug 2021 16:39:58 -0700 Subject: [PATCH] apis and data models for data wrangling prior to calculating divergent blocks...coming up automate the creation of divergent blocks broken fix conflict with sqlalchemy version make the dispute stage an enum all apis v0 and insomnia requests cleanup and documentation on how to run the application remove debugger modify version of ipfshttpclient, change module name from web3 to w3 addendum to readme requirements container file and Makescripts Update README.md multi stage docker build. use poetry inside of docker Build dockerfile added cicd and k8s files run on updated k8s .github paths fix cicd context fix repo name moving some fields to enums. cleanup some async code base frontend for dispute portal foundation redux actions bump webpack, setup base dispute page expose get all disputes list disputes simplify state with zustand merge state updates swap out the stages of the dispute allows frontend to toggle the stages of the dispute swap state in the frontend prior to revalidation. revalidation still hits later sort, filter, visualize uploaded data dispute portal list events Fix rainbow Fix setup when the config file is not yet created Define files to use when publishing package Add bin and cleanup gitignore filter disputes by status (#13) * filter by status * Update README.md Simplify cli (#14) * remove dispute command and show help by default * update README.md * fix usage Add Economics section and fetch network settings (#15) Sort disputes by date (#16) v0.2.0 Add defaultDisplayName to indexer and fisherman (#17) Check thawing period before resolving dispute (#19) Support for multiple ids on show and improved styling (#20) * Support for multiple ids on show and improved styling * Replace treeify with object-treeify Add closing epoch startBlock and poi info (#21) v0.3.0 [#24] Fix show command (#25) v0.3.1 remove conf file testing deployment --- .github/scripts/kustomize-apply.sh | 10 + .github/workflows/server-ci-cd-mainnet.yml | 58 + .gitignore | 19 +- .k8s/mainnet/kustomization.yaml | 4 + .k8s/mainnet/server.yaml | 56 + README.md | 18 +- bin/graph-disputes | 3 + frontend/.babelrc.js | 4 + frontend/.eslintrc.js | 10 + frontend/.gitignore | 30 + frontend/.prettierrc | 15 + frontend/README.md | 29 + frontend/assets/base.less | 7 + frontend/assets/resets/base.reset.less | 3 + frontend/assets/utils/media-queries.less | 25 + .../AddDisputeForm/AddDisputeForm.tsx | 132 + .../components/AddDisputeForm/styles.less | 8 + .../DisputeEvents/DisputeEvents.tsx | 134 + .../components/DisputeItem/DisputeItem.tsx | 227 + .../components/DisputeItem/IndexerTable.tsx | 155 + frontend/components/DisputeItem/styles.less | 16 + .../components/DisputeList/DisputeList.tsx | 70 + frontend/components/Layout.module.css | 7 + frontend/components/Layout.tsx | 184 + frontend/next-env.d.ts | 2 + frontend/next.config.js | 22 + frontend/package.json | 46 + frontend/pages/_app.tsx | 42 + frontend/pages/_document.tsx | 18 + frontend/pages/analysis.tsx | 10 + frontend/pages/dashboard/clients.tsx | 10 + frontend/pages/dashboard/events.tsx | 10 + frontend/pages/disputes.tsx | 145 + frontend/pages/index.tsx | 21 + frontend/public/favicon.ico | Bin 0 -> 487 bytes frontend/public/graph.svg | 11 + frontend/store/zustandStore.ts | 110 + frontend/tsconfig.json | 29 + frontend/types/Dispute.tsx | 21 + frontend/yarn.lock | 5621 +++++++++++++++++ package.json | 11 +- server/.dockerignore | 16 + server/Dockerfile | 47 + server/Makefile | 27 + server/README.md | 53 + server/alembic.ini | 89 + server/api/__init__.py | 0 server/api/analysis/README.md | 7 + server/api/analysis/__init__.py | 0 .../api/analysis/calculate_divergent_block.py | 177 + server/api/analysis/diff.py | 33 + server/api/asgi.py | 3 + server/api/config.py | 46 + server/api/dispute/README.md | 15 + server/api/dispute/__init__.py | 0 server/api/dispute/fsm.py | 323 + server/api/dispute/w3.py | 190 + server/api/graphql/README.md | 10 + server/api/graphql/__init__.py | 186 + server/api/logging.conf | 42 + server/api/main.py | 92 + server/api/models/README.md | 0 server/api/models/__init__.py | 13 + server/api/models/disputes.py | 65 + server/api/models/divergent_blocks.py | 58 + server/api/models/indexer.py | 50 + server/api/models/indexer_uploads.py | 28 + server/api/models/users.py | 8 + server/api/scripts/dump_tables.sh | 12 + server/api/scripts/python.png | Bin 0 -> 9955 bytes server/api/scripts/upload_poi.sh | 5 + server/api/scripts/upload_poi_noexist.sh | 5 + server/api/storage/README.md | 4 + server/api/storage/__init__.py | 0 server/api/storage/gcloud.py | 102 + server/api/transport/__init__.py | 0 server/api/transport/list.py | 22 + server/api/transport/upload.py | 103 + server/api/utils/README.md | 1 + server/api/utils/__init__.py | 0 server/api/utils/notifier.py | 1 + server/api/views/README.md | 1 + server/api/views/__init__.py | 0 server/api/views/disputes.py | 201 + server/api/views/divergent_blocks.py | 173 + server/api/views/indexers.py | 90 + server/api/views/users.py | 33 + server/docker-build.sh | 1 + server/docker-entrypoint.sh | 7 + server/docker-run.sh | 1 + server/insomnia/Insomnia_2021-08-09.json | 1 + server/insomnia/README.md | 3 + .../insomnia/request_data/poi_example1.csv.gz | Bin 0 -> 38300 bytes .../insomnia/request_data/poi_example2.csv.gz | Bin 0 -> 38304 bytes server/migrations/README | 1 + server/migrations/env.py | 79 + server/migrations/script.py.mako | 24 + .../0a4da3e8d061_make_indexer_id_nullable.py | 34 + ...912df503_make_indexer_metadata_nullable.py | 28 + .../3ddcb30210b0_add_nullable_to_disputes.py | 28 + ...f4e_make_disputes_unique_and_use_upsert.py | 40 + .../689d077b3e86_add_datetime_to_dispute.py | 29 + ...5c8cc8_merge_first_and_upload_data_kind.py | 24 + .../a2d457a4ae4e_drop_stage_for_disputes.py | 28 + ...ce5c0d728a8_make_auto_update_on_dispute.py | 38 + ...8668628e4_make_upload_data_kind_an_enum.py | 51 + ...0a5062aa4_create_enum_field_for_dispute.py | 83 + .../e5d6dcc9c7fe_create_indexer_metadata.py | 37 + server/notebooks/data/dump_tables.sh | 12 + server/poetry.lock | 3846 +++++++++++ server/pyproject.toml | 52 + server/set_env.sh | 9 + src/commands/list.ts | 51 +- src/commands/show.ts | 120 +- src/dispute.ts | 233 +- src/index.ts | 89 +- src/model.ts | 65 +- src/poi.ts | 1 - src/resolver.ts | 48 +- src/utils.ts | 17 + yarn.lock | 15 +- 121 files changed, 14589 insertions(+), 190 deletions(-) create mode 100755 .github/scripts/kustomize-apply.sh create mode 100644 .github/workflows/server-ci-cd-mainnet.yml create mode 100644 .k8s/mainnet/kustomization.yaml create mode 100644 .k8s/mainnet/server.yaml create mode 100755 bin/graph-disputes create mode 100644 frontend/.babelrc.js create mode 100644 frontend/.eslintrc.js create mode 100644 frontend/.gitignore create mode 100644 frontend/.prettierrc create mode 100644 frontend/README.md create mode 100644 frontend/assets/base.less create mode 100644 frontend/assets/resets/base.reset.less create mode 100644 frontend/assets/utils/media-queries.less create mode 100644 frontend/components/AddDisputeForm/AddDisputeForm.tsx create mode 100644 frontend/components/AddDisputeForm/styles.less create mode 100644 frontend/components/DisputeEvents/DisputeEvents.tsx create mode 100644 frontend/components/DisputeItem/DisputeItem.tsx create mode 100644 frontend/components/DisputeItem/IndexerTable.tsx create mode 100644 frontend/components/DisputeItem/styles.less create mode 100644 frontend/components/DisputeList/DisputeList.tsx create mode 100644 frontend/components/Layout.module.css create mode 100644 frontend/components/Layout.tsx create mode 100644 frontend/next-env.d.ts create mode 100644 frontend/next.config.js create mode 100644 frontend/package.json create mode 100644 frontend/pages/_app.tsx create mode 100644 frontend/pages/_document.tsx create mode 100644 frontend/pages/analysis.tsx create mode 100644 frontend/pages/dashboard/clients.tsx create mode 100644 frontend/pages/dashboard/events.tsx create mode 100644 frontend/pages/disputes.tsx create mode 100644 frontend/pages/index.tsx create mode 100644 frontend/public/favicon.ico create mode 100644 frontend/public/graph.svg create mode 100644 frontend/store/zustandStore.ts create mode 100644 frontend/tsconfig.json create mode 100644 frontend/types/Dispute.tsx create mode 100644 frontend/yarn.lock create mode 100644 server/.dockerignore create mode 100644 server/Dockerfile create mode 100644 server/Makefile create mode 100644 server/README.md create mode 100644 server/alembic.ini create mode 100644 server/api/__init__.py create mode 100644 server/api/analysis/README.md create mode 100644 server/api/analysis/__init__.py create mode 100644 server/api/analysis/calculate_divergent_block.py create mode 100644 server/api/analysis/diff.py create mode 100644 server/api/asgi.py create mode 100644 server/api/config.py create mode 100644 server/api/dispute/README.md create mode 100644 server/api/dispute/__init__.py create mode 100644 server/api/dispute/fsm.py create mode 100644 server/api/dispute/w3.py create mode 100644 server/api/graphql/README.md create mode 100644 server/api/graphql/__init__.py create mode 100644 server/api/logging.conf create mode 100644 server/api/main.py create mode 100644 server/api/models/README.md create mode 100644 server/api/models/__init__.py create mode 100644 server/api/models/disputes.py create mode 100644 server/api/models/divergent_blocks.py create mode 100644 server/api/models/indexer.py create mode 100644 server/api/models/indexer_uploads.py create mode 100644 server/api/models/users.py create mode 100755 server/api/scripts/dump_tables.sh create mode 100644 server/api/scripts/python.png create mode 100755 server/api/scripts/upload_poi.sh create mode 100755 server/api/scripts/upload_poi_noexist.sh create mode 100644 server/api/storage/README.md create mode 100644 server/api/storage/__init__.py create mode 100644 server/api/storage/gcloud.py create mode 100644 server/api/transport/__init__.py create mode 100644 server/api/transport/list.py create mode 100644 server/api/transport/upload.py create mode 100644 server/api/utils/README.md create mode 100644 server/api/utils/__init__.py create mode 100644 server/api/utils/notifier.py create mode 100644 server/api/views/README.md create mode 100644 server/api/views/__init__.py create mode 100644 server/api/views/disputes.py create mode 100644 server/api/views/divergent_blocks.py create mode 100644 server/api/views/indexers.py create mode 100644 server/api/views/users.py create mode 100755 server/docker-build.sh create mode 100644 server/docker-entrypoint.sh create mode 100755 server/docker-run.sh create mode 100644 server/insomnia/Insomnia_2021-08-09.json create mode 100644 server/insomnia/README.md create mode 100644 server/insomnia/request_data/poi_example1.csv.gz create mode 100644 server/insomnia/request_data/poi_example2.csv.gz create mode 100644 server/migrations/README create mode 100644 server/migrations/env.py create mode 100644 server/migrations/script.py.mako create mode 100644 server/migrations/versions/0a4da3e8d061_make_indexer_id_nullable.py create mode 100644 server/migrations/versions/1d6e912df503_make_indexer_metadata_nullable.py create mode 100644 server/migrations/versions/3ddcb30210b0_add_nullable_to_disputes.py create mode 100644 server/migrations/versions/5f6805babf4e_make_disputes_unique_and_use_upsert.py create mode 100644 server/migrations/versions/689d077b3e86_add_datetime_to_dispute.py create mode 100644 server/migrations/versions/7326125c8cc8_merge_first_and_upload_data_kind.py create mode 100644 server/migrations/versions/a2d457a4ae4e_drop_stage_for_disputes.py create mode 100644 server/migrations/versions/bce5c0d728a8_make_auto_update_on_dispute.py create mode 100644 server/migrations/versions/bf38668628e4_make_upload_data_kind_an_enum.py create mode 100644 server/migrations/versions/c5d0a5062aa4_create_enum_field_for_dispute.py create mode 100644 server/migrations/versions/e5d6dcc9c7fe_create_indexer_metadata.py create mode 100644 server/notebooks/data/dump_tables.sh create mode 100644 server/poetry.lock create mode 100644 server/pyproject.toml create mode 100755 server/set_env.sh diff --git a/.github/scripts/kustomize-apply.sh b/.github/scripts/kustomize-apply.sh new file mode 100755 index 0000000..8fbed41 --- /dev/null +++ b/.github/scripts/kustomize-apply.sh @@ -0,0 +1,10 @@ +#!/bin/sh +set -e # immediately fail the script on any command error + +ENVIRONMENT="$1" +IMAGE="$2" +DIR=$(dirname "$0") +cd $DIR/../../.k8s/$ENVIRONMENT + +kustomize edit set image $IMAGE +kustomize build | kubectl apply -f - diff --git a/.github/workflows/server-ci-cd-mainnet.yml b/.github/workflows/server-ci-cd-mainnet.yml new file mode 100644 index 0000000..5813c30 --- /dev/null +++ b/.github/workflows/server-ci-cd-mainnet.yml @@ -0,0 +1,58 @@ +name: Production CI/CD +on: + push: + paths: + - 'server/**' + - 'k8s/**' + - '.github/**' +env: + BASE_IMAGE: ghcr.io/edgeandnode/graph-disputes-server + APP_NAME: graph-disputes-server + +jobs: + build-test: + runs-on: ubuntu-latest + steps: + + - name: Checkout the repo + uses: actions/checkout@v2 + + - name: Login to GitHub Container Registry + uses: docker/login-action@v1 + with: + registry: ghcr.io + username: ${{ github.repository_owner }} + password: ${{ secrets.CR_PAT }} + + - name: Build and push Docker image + uses: docker/build-push-action@v2 + with: + context: ./server + cache-from: type=registry,ref=${{ env.BASE_IMAGE }}:latest + cache-to: type=inline + tags: | + ${{ env.BASE_IMAGE }}:${{ github.sha }} + ${{ env.BASE_IMAGE }}:latest + push: true + + deploy: + if: github.ref == 'refs/heads/goaaron/poi_dispute_service' + runs-on: ubuntu-latest + needs: build-test + steps: + + - name: Checkout the repo + uses: actions/checkout@v2 + + - name: Set up kubectl + uses: google-github-actions/get-gke-credentials@main + with: + cluster_name: ${{ secrets.GCP_CLUSTER_NAME }} + location: ${{ secrets.GCP_CLUSTER_LOCATION }} + credentials: ${{ secrets.GCP_SA_KEY_PRODUCTION }} + + - name: Set a new k8s image and apply the manifests + run: .github/scripts/kustomize-apply.sh mainnet $APP_NAME=$BASE_IMAGE:$GITHUB_SHA + + - name: Wait for pod to be ready + run: kubectl rollout status statefulset $APP_NAME --timeout=5m diff --git a/.gitignore b/.gitignore index 6f95621..b62a9e1 100644 --- a/.gitignore +++ b/.gitignore @@ -1,22 +1,15 @@ -# Ignore zeppelin contracts node_modules/ - -# Ignore build stuff cache/ build/ dist/ - -# Coverage tests coverage/ - -# Hardhat cache -cached/ - -# Ignore solc bin output -bin/ - -# Others .env .DS_Store .vscode +__pycache__/ + +#data files +*.csv +service-key.json + diff --git a/.k8s/mainnet/kustomization.yaml b/.k8s/mainnet/kustomization.yaml new file mode 100644 index 0000000..c25f35f --- /dev/null +++ b/.k8s/mainnet/kustomization.yaml @@ -0,0 +1,4 @@ +apiVersion: kustomize.config.k8s.io/v1beta1 +kind: Kustomization +resources: + - server.yaml diff --git a/.k8s/mainnet/server.yaml b/.k8s/mainnet/server.yaml new file mode 100644 index 0000000..ba75861 --- /dev/null +++ b/.k8s/mainnet/server.yaml @@ -0,0 +1,56 @@ +apiVersion: apps/v1 +kind: StatefulSet +metadata: + name: graph-disputes-server +spec: + serviceName: graph-disputes-server + replicas: 1 + selector: + matchLabels: + app: graph-disputes-server + template: + metadata: + labels: + app: graph-disputes-server + spec: + imagePullSecrets: + - name: docker-registry + containers: + - name: app + image: ghcr.io/graph-disputes-server + env: + - name: DB_HOST + valueFrom: + secretKeyRef: + name: graph-disputes-server-db-credentials + key: host + - name: DB_PORT + valueFrom: + secretKeyRef: + name: graph-disputes-server-db-credentials + key: port + - name: DB_NAME + valueFrom: + secretKeyRef: + name: graph-disputes-server-db-credentials + key: name + - name: DB_USER + valueFrom: + secretKeyRef: + name: graph-disputes-server-db-credentials + key: user + - name: DB_PASS + valueFrom: + secretKeyRef: + name: graph-disputes-server-db-credentials + key: pass + volumeMounts: + - name: data-key + mountPath: /app + volumes: + - name: data-key + secret: + secretName: graph-disputes-server-data-key + items: + - key: key.json + path: service-key.json diff --git a/README.md b/README.md index 4be456b..7a7d7b8 100644 --- a/README.md +++ b/README.md @@ -36,18 +36,18 @@ Run `graph-disputes` with no parameters to see a list of commands. graph-dispute setup # General -graph-disputes dispute list -graph-disputes dispute show +graph-disputes list [--status ] +graph-disputes show # Submitter -graph-disputes dispute create indexing -graph-disputes dispute create query +graph-disputes create indexing +graph-disputes create query # Arbitrator -graph-disputes dispute resolve reject -graph-disputes dispute resolve accept -graph-disputes dispute resolve draw -graph-disputes dispute resolve verify +graph-disputes resolve reject +graph-disputes resolve accept +graph-disputes resolve draw +graph-disputes resolve verify ``` @@ -123,7 +123,7 @@ The Arbitration process is managed by a Multisig that can be changed anytime by ### List Disputes -The `list` command allows shows you the active disputes: +The `list` command shows you the active (undecided) disputes: ```bash graph-dispute list diff --git a/bin/graph-disputes b/bin/graph-disputes new file mode 100755 index 0000000..02a9dee --- /dev/null +++ b/bin/graph-disputes @@ -0,0 +1,3 @@ +#!/usr/bin/env node + +require('../dist/index') diff --git a/frontend/.babelrc.js b/frontend/.babelrc.js new file mode 100644 index 0000000..23e54f9 --- /dev/null +++ b/frontend/.babelrc.js @@ -0,0 +1,4 @@ +module.exports = { + presets: [['next/babel']], + plugins: [['import', { libraryName: 'antd', style: true }]], +}; \ No newline at end of file diff --git a/frontend/.eslintrc.js b/frontend/.eslintrc.js new file mode 100644 index 0000000..eb18338 --- /dev/null +++ b/frontend/.eslintrc.js @@ -0,0 +1,10 @@ +module.exports = { + root: true, + parser: '@typescript-eslint/parser', + plugins: ['@typescript-eslint'], + extends: [ + 'eslint:recommended', + 'plugin:@typescript-eslint/recommended', + 'plugin:prettier/recommended', + ], +}; diff --git a/frontend/.gitignore b/frontend/.gitignore new file mode 100644 index 0000000..a440b96 --- /dev/null +++ b/frontend/.gitignore @@ -0,0 +1,30 @@ +# See https://help.github.com/articles/ignoring-files/ for more about ignoring files. + +# dependencies +/node_modules +/.pnp +.pnp.js + +# testing +/coverage + +# next.js +/.next/ +/out/ + +# production +/build + +# misc +.DS_Store + +# debug +npm-debug.log* +yarn-debug.log* +yarn-error.log* + +# local env files +.env.local +.env.development.local +.env.test.local +.env.production.local \ No newline at end of file diff --git a/frontend/.prettierrc b/frontend/.prettierrc new file mode 100644 index 0000000..4629649 --- /dev/null +++ b/frontend/.prettierrc @@ -0,0 +1,15 @@ +{ + "arrowParens": "avoid", + "bracketSpacing": true, + "endOfLine": "lf", + "jsxBracketSameLine": false, + "jsxSingleQuote": false, + "printWidth": 80, + "proseWrap": "preserve", + "quoteProps": "as-needed", + "semi": true, + "singleQuote": true, + "tabWidth": 2, + "trailingComma": "all", + "useTabs": false +} \ No newline at end of file diff --git a/frontend/README.md b/frontend/README.md new file mode 100644 index 0000000..45727f1 --- /dev/null +++ b/frontend/README.md @@ -0,0 +1,29 @@ +# nextjs-ant-design-typescript +![GitHub](https://img.shields.io/github/license/gnokoheat/nextjs-ant-design-typescript) ![GitHub top language](https://img.shields.io/github/languages/top/gnokoheat/nextjs-ant-design-typescript) ![GitHub release (latest by date)](https://img.shields.io/github/v/release/gnokoheat/nextjs-ant-design-typescript) ![GitHub last commit](https://img.shields.io/github/last-commit/gnokoheat/nextjs-ant-design-typescript) + +Next.js + Ant design + Typescript + +![](https://github.com/gnokoheat/nextjs-ant-design-typescript/blob/master/docs/nextjs-antdesign-typescript.gif?raw=true) + +- Including simple structure & layout + +## Usage +1. Copy this repository. +``` +git clone https://github.com/gnokoheat/nextjs-ant-design-typescript +cd nextjs-ant-design-typescript/ +``` +2. Install dependencies +``` +yarn install +``` + +3. Run app +``` bash +# Dev +yarn dev + +# Production +yarn build +yarn start +``` diff --git a/frontend/assets/base.less b/frontend/assets/base.less new file mode 100644 index 0000000..6bc6996 --- /dev/null +++ b/frontend/assets/base.less @@ -0,0 +1,7 @@ +@import './utils/media-queries.less'; +@import './resets/base.reset.less'; + +:root { + --color-light-gray: #f3f3f3; + --body-container-normal-background-color: var(--color-light-gray); +} \ No newline at end of file diff --git a/frontend/assets/resets/base.reset.less b/frontend/assets/resets/base.reset.less new file mode 100644 index 0000000..fd11954 --- /dev/null +++ b/frontend/assets/resets/base.reset.less @@ -0,0 +1,3 @@ +body { + background-color: var(--body-container-normal-background-color) !important; + } \ No newline at end of file diff --git a/frontend/assets/utils/media-queries.less b/frontend/assets/utils/media-queries.less new file mode 100644 index 0000000..93d8ce1 --- /dev/null +++ b/frontend/assets/utils/media-queries.less @@ -0,0 +1,25 @@ +@screen-xs: 480px; +@screen-sm: 768px; +@screen-md: 992px; +@screen-lg: 1200px; + +@screen-sm-min: @screen-sm; +@screen-md-min: @screen-md; +@screen-xs-min: @screen-xs; +@screen-lg-min: @screen-lg; + +@screen-xs-max: (@screen-sm-min - 1); +@screen-sm-max: (@screen-md-min - 1); +@screen-md-max: (@screen-lg-min - 1); + +@xs-and-up: ~'only screen'; +@xs-only: ~'only screen and (max-width: @{screen-xs-max})'; +@sm-and-up: ~'only screen and (min-width: @{screen-sm-min})'; +@sm-only: ~'only screen and (min-width: @{screen-sm-min}) and (max-width: @{screen-sm-max})'; +@md-and-up: ~'only screen and (min-width: @{screen-md-min})'; +@md-only: ~'only screen and (min-width: @{screen-md-min}) and (max-width: @{screen-md-max})'; +@lg-and-up: ~'only screen and (min-width: @{screen-lg-min})'; +@lg-only: @lg-and-up; +@mobile: @xs-only; +@tablet: @sm-only; +@desktop: @md-and-up; \ No newline at end of file diff --git a/frontend/components/AddDisputeForm/AddDisputeForm.tsx b/frontend/components/AddDisputeForm/AddDisputeForm.tsx new file mode 100644 index 0000000..49aab4b --- /dev/null +++ b/frontend/components/AddDisputeForm/AddDisputeForm.tsx @@ -0,0 +1,132 @@ +import React from 'react'; +import { Form, Row, Col, Button, Input } from 'antd'; +import { PlusCircleFilled } from '@ant-design/icons'; +import axios from 'axios'; + +import './styles.less'; +import { Dispute } from '../../types/Dispute'; + +interface AddDisputeFormProps { + onFormSubmit: (dispute: Dispute) => void; +} + +const addDispute = async (disputePayload: Record) => { + console.log('ADDDISPUTE', disputePayload); + const { data } = await axios.post( + 'http://localhost:8000/disputes', + disputePayload, + ); + return data; +}; + +// { +// "id": 0, +// "dispute_id": "string", +// "indexer_ids": [ +// "string" +// ], +// "dispute_kind": "dispute", +// "supgraph_id": "" +// } + +export const AddDisputeForm: React.FC = ({ + onFormSubmit, +}) => { + const [form] = Form.useForm(); + + const [indexerInput, setIndexerInput] = React.useState(''); + const [indexerIDs, setIndexerIDs] = React.useState([]); + + React.useEffect(() => { + formatText(); + console.log(indexerIDs); + }, [indexerInput]); + + const onFinish = () => { + console.log(indexerInput); + console.log(indexerIDs); + formatText(); + const dispute_id = form.getFieldValue('dispute_id'); + const dispute_kind = 'dispute'; + + onFormSubmit({ + dispute_id: dispute_id, + indexer_ids: indexerIDs, + dispute_stage: 1, + subgraph_id: '', + }); + + addDispute({ + dispute_id: dispute_id, + dispute_kind: dispute_kind, + indexer_ids: indexerIDs, + subgraph_id: '', + }); + setIndexerIDs([]); + setIndexerInput(''); + form.resetFields(); + }; + + const handleTextChange = e => { + console.log(indexerInput); + setIndexerInput(e.target.value); + }; + + const formatText = () => { + const split = indexerInput.split('0x'); + const replaced = i => + i.replaceAll(' ', '').replaceAll('\n', '').replaceAll(',', ''); + const mapped = split.map(s => replaced(s)).filter(s => s !== ''); + setIndexerIDs(mapped); + }; + + return ( +
+ + + + + + + + + + + + + + + + handleTextChange(e)} + /> + + + + + + + + +
+ ); +}; diff --git a/frontend/components/AddDisputeForm/styles.less b/frontend/components/AddDisputeForm/styles.less new file mode 100644 index 0000000..b91b350 --- /dev/null +++ b/frontend/components/AddDisputeForm/styles.less @@ -0,0 +1,8 @@ +.dispute-form { + margin-top: 20px; + margin-bottom: 20px; + padding: 5px; + .icon { + color: 'rgba(0,0,0,.25)'; + } +} diff --git a/frontend/components/DisputeEvents/DisputeEvents.tsx b/frontend/components/DisputeEvents/DisputeEvents.tsx new file mode 100644 index 0000000..50373ef --- /dev/null +++ b/frontend/components/DisputeEvents/DisputeEvents.tsx @@ -0,0 +1,134 @@ +import React from 'react'; +import { List, Card, Button, Collapse, Descriptions, Table } from 'antd'; +const { Panel } = Collapse; + +const columns = [ + { + title: 'From', + dataIndex: 'from', + key: 'from', + }, + { + title: 'To', + dataIndex: 'to', + key: 'to', + }, + { + title: 'Value', + dataIndex: 'value', + key: 'value', + }, +]; + +const parseDivergentBlock = (responseJson: Record): number[] => { + const divergent_blocks = responseJson.divergent_blocks; + const blocks = divergent_blocks.divergent_blocks; + return blocks; +}; + +export interface SubgraphEvent { + event: string; + handler: string; +} + +export interface LogParams { + from: string; + to: string; + value: number; +} + +export interface EthereumEvent { + address: string; + block: number; + event: string; + subgraphEvents: SubgraphEvent[]; + handlers: string[]; + logParams: LogParams; +} + +const deduplicateArray = (array: any[]) => { + const res = [ + ...new Map(array.map(item => [JSON.stringify(item), item])).values(), + ]; + return res; +}; + +const parseEvents = (responseJson: Record): EthereumEvent[] => { + const ethereumEvents: EthereumEvent[] = []; + const matchedEvents: Record[] = responseJson.matching_events; + for (const e of matchedEvents) { + const ethereumEvent = { + address: e.address, + block: e.block, + event: e.event, + subgraphEvents: e.subgraph_events, + handlers: e.handlers, + logParams: e.log_params, + } as EthereumEvent; + ethereumEvents.push(ethereumEvent); + } + return deduplicateArray(ethereumEvents); +}; + +interface EthereumEventListProps { + ethereumEvents: EthereumEvent[]; +} + +interface LogParamProps { + logParams: LogParams; +} + +const LogParamList: React.FC = ({ logParams }) => { + return ( + + ); +}; + +export const EventsList: React.FC = ({ + ethereumEvents, +}) => { + return ( + } + bordered + dataSource={ethereumEvents} + renderItem={item => ( + + + + + + {item.address} + + {item.block} + + {item.handlers} + + + + + + )} + /> + ); +}; + +interface EventsContainerProps { + responseJson: Record; +} +export const EventsContainer: React.FC = ({ + responseJson, +}) => { + console.log('RESPONSE', responseJson); + const ethereumEvents = parseEvents(responseJson); + return ( + + + + + + ); +}; diff --git a/frontend/components/DisputeItem/DisputeItem.tsx b/frontend/components/DisputeItem/DisputeItem.tsx new file mode 100644 index 0000000..e4ed7db --- /dev/null +++ b/frontend/components/DisputeItem/DisputeItem.tsx @@ -0,0 +1,227 @@ +import React from 'react'; +import { + Card, + Tag, + Row, + Col, + Button, + Popconfirm, + Select, + Tooltip, + Spin, + message, +} from 'antd'; +import { + CheckOutlined, + LoadingOutlined, + HeatMapOutlined, + HourglassOutlined, + MinusOutlined, + GoldenFilled, +} from '@ant-design/icons'; +import useSWR from 'swr'; + +import { useSWRConfig } from 'swr'; +import axios from 'axios'; + +import { useStore } from '../../store/zustandStore'; + +import { Dispute, GET_DISPUTES_URL } from '../../types/Dispute'; +import { IndexerTable } from './IndexerTable'; +import { EventsContainer } from '../DisputeEvents/DisputeEvents'; +import './styles.less'; + +interface DisputeItemProps { + dispute: Dispute; + onDisputeRemoval: (todo: Dispute) => void; +} + +const DisputeStageMapping: Record = { + 1: 'waiting_for_poi', + 2: 'acquired_poi', + 3: 'generated_divergent_blocks', + 4: 'arbitrating', + 5: 'dispute_settled', +}; + +const UPDATE_DISPUTE_ENDPOINT = 'http://localhost:8000/disputes/'; +const DIVERGENT_BLOCK_ENDPOINT = 'http://localhost:8000/divergent_blocks/'; + +const updateDisputeStatus = async (disputeID: string, disputeStage: string) => { + const { data } = await axios.patch(UPDATE_DISPUTE_ENDPOINT + disputeID, { + dispute_stage: disputeStage, + }); + return data; +}; + +const handleMenuClick = (newDisputeStage, disputeID, mutate, progress) => { + const disputeString = DisputeStageMapping[newDisputeStage]; + progress(disputeID, newDisputeStage); + + updateDisputeStatus(disputeID, disputeString); +}; + +const { Option } = Select; + +const calculateBlocks = async (dispute_id: string, payload?: string) => { + const options = { + method: 'POST', + ...(payload && { body: payload }), + headers: { + accept: 'application/json', + 'Content-Type': 'application/json', + }, + }; + + return fetch(DIVERGENT_BLOCK_ENDPOINT + dispute_id, options).then(r => r); +}; + +const DisputeItemHeader: React.FC = ({ + dispute, + onDisputeRemoval, +}) => { + const [calculatingBlocks, setCalculatingBlocks] = React.useState(false); + const [divergentBlockResponse, setDivergentBlockResponse] = + React.useState>(null); + + const { mutate } = useSWRConfig(); + + const calculateDivergentBlocks = React.useCallback(dispute_id => { + setCalculatingBlocks(true); + return calculateBlocks(dispute_id).then(async result => { + console.log('RESULT', result); + setCalculatingBlocks(false); + if (result.ok) { + const json = await result.json(); + console.log('DIVERGENTDATA', json); + setDivergentBlockResponse(json); + progressDisputeState(dispute_id, 3); + } else { + message.error(result.json()); + } + }); + }, []); + + const { progressDisputeState } = useStore(); + + const backgroundColor = dispute_stage_color(dispute.dispute_stage); + + return ( +
+ +
+ {dispute.dispute_id} + + + + + + + + + { + onDisputeRemoval(dispute); + }} + > + + + + + {divergentBlockResponse !== null ? ( + + ) : null} + + ); +}; + +const fetcher = url => fetch(url).then(res => res.json()); + +const DisputeCard: React.FC = ({ + dispute, + onDisputeRemoval, +}) => { + return ( + + } + > + + + ); +}; + +export const DisputeItem: React.FC = ({ + dispute, + onDisputeRemoval, +}) => { + return ; +}; + +// make switch on enum type +const dispute_stage_color = (dispute_stage: number): string => { + if (dispute_stage === 1) { + return 'magenta'; + } + if (dispute_stage === 2) { + return 'volcano'; + } + if (dispute_stage === 3) { + return 'gold'; + } + if (dispute_stage === 4) { + return 'blue'; + } + if (dispute_stage === 5) { + return 'purple'; + } +}; diff --git a/frontend/components/DisputeItem/IndexerTable.tsx b/frontend/components/DisputeItem/IndexerTable.tsx new file mode 100644 index 0000000..ecbf2ed --- /dev/null +++ b/frontend/components/DisputeItem/IndexerTable.tsx @@ -0,0 +1,155 @@ +import { List, Table, Button, Statistic, Tag } from 'antd'; +import { + BlockOutlined, + DatabaseOutlined, + FileTextOutlined, +} from '@ant-design/icons'; +import { Dispute } from '../../types/Dispute'; + +interface IndexerUploads { + indexerUploads: IndexerUploadProps[]; +} +interface IndexerUploadProps { + path: string; + kind: string; +} + +interface IndexerRowItem { + key: number; + indexer_id: string; + name: string; + divergentBlocks?: number; + indexerUploads?: JSX.Element; + uploaded: string; +} + +const columns = [ + { + title: 'Indexer ID', + dataIndex: 'indexer_id', + key: 'indexer_id', + defaultSortOrder: 'descend', + sorter: (a, b) => a.indexer_id.localeCompare(b.indexer_id), + }, + + { + title: 'Name', + dataIndex: 'name', + key: 'name', + sorter: (a, b) => a.name.localeCompare(b.name), + }, + { + title: 'Pull Data', + dataIndex: '', + key: 'x', + render: () => , + }, + { + title: 'Uploaded ?', + dataIndex: 'uploaded', + key: 'uploaded', + filters: [ + { + text: 'True', + value: 'True', + }, + { + text: 'False', + value: 'False', + }, + ], + onFilter: (value, record) => record.uploaded.indexOf(value) === 0, + }, +]; + +// Identified the blocks of concern +// Can be at indexer pair level, and the entire dispute +interface DivergentBlockProp { + divergentBlock: number; +} + +const DivergentBlock: React.FC = ({ divergentBlock }) => { + return ; +}; + +const getTagForKind = (kind: string) => { + switch (kind) { + case 'poi': + return ( + } color="success"> + POI + + ); + case 'entities': + return ( + } color="processing"> + Entities + + ); + case 'metadata': + return ( + } color="default"> + Metadata + + ); + } +}; + +const IndexerUploads: React.FC = ({ indexerUploads }) => { + return ( + ( + + + + )} + /> + ); +}; + +const mapDisputeDataToObjectArray = (data: Dispute): any[] => { + const indexerRowItems = [] as IndexerRowItem[]; + + const indexers = data.indexers ?? []; + indexers.forEach((indexer, idx) => { + const ri = { + key: idx, + indexer_id: indexer.indexer_id, + name: indexer.name, + indexerUploads: ( + + ), + uploaded: (indexer.indexer_uploads ?? []).length > 0 ? 'True' : 'False', + }; + indexerRowItems.push(ri); + }); + + return indexerRowItems; +}; + +interface IndexerTableProps { + disputeData: Dispute; +} + +export const IndexerTable: React.FC = ({ disputeData }) => { + const mappedData = mapDisputeDataToObjectArray(disputeData); + + return ( +
( +
{record.indexerUploads ?? []}
+ ), + rowExpandable: record => record.indexerUploads !== null, + }} + dataSource={mappedData} + pagination={{ pageSize: 5 }} + /> + ); +}; diff --git a/frontend/components/DisputeItem/styles.less b/frontend/components/DisputeItem/styles.less new file mode 100644 index 0000000..38fec42 --- /dev/null +++ b/frontend/components/DisputeItem/styles.less @@ -0,0 +1,16 @@ +.list-item { + display: flex; + justify-content: space-between; + + .todo-item { + display: flex; + align-items: center; + + .todo-tag { + margin: 10px; + white-space: normal !important; + max-width: 115px; + word-break: break-all; + } + } +} diff --git a/frontend/components/DisputeList/DisputeList.tsx b/frontend/components/DisputeList/DisputeList.tsx new file mode 100644 index 0000000..f6cfd09 --- /dev/null +++ b/frontend/components/DisputeList/DisputeList.tsx @@ -0,0 +1,70 @@ +import React from 'react'; + +import { Card, Pagination, List } from 'antd'; + +import { Dispute } from '../../types/Dispute'; +import { DisputeItem } from '../DisputeItem/DisputeItem'; + +interface DisputeListProps { + disputes: Dispute[]; + onDisputeRemoval: (dispute: Dispute) => void; +} + +export const DisputeList: React.FC = ({ + disputes, + onDisputeRemoval, +}) => { + return ( + { + console.log(page); + }, + pageSize: 3, + }} + dataSource={disputes} + renderItem={dispute => ( + + )} + /> + ); +}; + +// export const DisputeList: React.FC = ({ +// disputes, +// onDisputeRemoval, +// }) => { +// const numEachPage = 4; + +// const [minVal, setMinVal] = React.useState(0); +// const [maxVal, setMaxVal] = React.useState(1); + +// const handleChange = value => { +// setMinVal((value - 1) * numEachPage); +// setMaxVal(value * numEachPage); +// }; + +// return ( +//
+// {disputes && +// disputes.length > 0 && +// disputes.slice(minVal, maxVal).map(dispute => ( +// +// +// +// ))} +// +//
+// ); +// }; diff --git a/frontend/components/Layout.module.css b/frontend/components/Layout.module.css new file mode 100644 index 0000000..b9fc385 --- /dev/null +++ b/frontend/components/Layout.module.css @@ -0,0 +1,7 @@ +.App-logo { + height: 40px; + /* background: rgba(255, 255, 255, 0.575); */ + margin: 20px; + justify-content: center; + justify-items: center; +} \ No newline at end of file diff --git a/frontend/components/Layout.tsx b/frontend/components/Layout.tsx new file mode 100644 index 0000000..04c3913 --- /dev/null +++ b/frontend/components/Layout.tsx @@ -0,0 +1,184 @@ +import React, { useState } from 'react'; +import { Layout, Menu, Breadcrumb, Typography, Row, Col } from 'antd'; +import Link from 'next/link'; +import { withRouter, NextRouter } from 'next/router'; +import { WithRouterProps } from 'next/dist/client/with-router'; + +import Icon, { + TeamOutlined, + DashboardOutlined, + DotChartOutlined, +} from '@ant-design/icons'; + +const { Text } = Typography; +const { SubMenu, Item } = Menu; +const { Sider, Content } = Layout; + +interface Router extends NextRouter { + path: string; + breadcrumbName: string; +} + +interface Props extends WithRouterProps { + router: Router; +} + +function itemRender(route: Router) { + return route.path === 'index' ? ( + + {route.breadcrumbName} + + ) : ( + {route.breadcrumbName} + ); +} + +function routesMaker(pathsplit: string[]) { + const routes = [ + { + path: 'index', + breadcrumbName: 'home', + }, + ]; + for (const v of pathsplit) { + const pathInfo = { + path: v, + breadcrumbName: v, + }; + if (v !== '') routes.push(pathInfo); + } + return routes; +} + +const AppLayout = (props: React.PropsWithChildren) => { + const [isCollapsed, setIsCollapsed] = useState(false); + + const onChangeIsCollapsed = (isCollapsed: boolean) => { + setIsCollapsed(isCollapsed); + }; + + const pathname = props.router.pathname; + const pathsplit: string[] = pathname.split('/'); + const routes = routesMaker(pathsplit); + + return ( + + + + +
+ +
+ + Fill 19 + Created with Sketch. + + + + + + + + + + Portal + + + + + + + + }> + + Disputes + + + }> + + Analysis + + + } + title="Dashboards" + > + + + Events + + + + + Clients + + + + + + + + + {props.children} + + + + ); +}; + +export default withRouter(AppLayout); diff --git a/frontend/next-env.d.ts b/frontend/next-env.d.ts new file mode 100644 index 0000000..24d1f49 --- /dev/null +++ b/frontend/next-env.d.ts @@ -0,0 +1,2 @@ +/// +/// \ No newline at end of file diff --git a/frontend/next.config.js b/frontend/next.config.js new file mode 100644 index 0000000..7c295f6 --- /dev/null +++ b/frontend/next.config.js @@ -0,0 +1,22 @@ +/* eslint-disable @typescript-eslint/no-var-requires */ +const withAntdLess = require('next-plugin-antd-less'); + +module.exports = withAntdLess({ + // optional + modifyVars: { '@primary-color': 'rgba(101,71,255,.52)' }, + // optional + lessVarsFilePathAppendToEndOfContent: false, + // optional https://github.com/webpack-contrib/css-loader#object + cssLoaderOptions: {}, + + // Other Config Here... + + webpack(config) { + return config; + }, + + // ONLY for Next.js 10, if you use Next.js 11, delete this block + future: { + webpack5: true, + }, +}); diff --git a/frontend/package.json b/frontend/package.json new file mode 100644 index 0000000..e5be41f --- /dev/null +++ b/frontend/package.json @@ -0,0 +1,46 @@ +{ + "name": "frontend", + "version": "1.0.0", + "description": "dispute frontend", + "author": "AG", + "scripts": { + "dev": "next", + "build": "next build", + "start": "next start" + }, + "dependencies": { + "@ant-design/icons": "^4.6.2", + "antd": "^4.14.1", + "axios": "^0.21.4", + "babel-plugin-import": "^1.13.3", + "next": "^10.2.3", + "next-compose-plugins": "^2.2.1", + "next-images": "^1.7.0", + "next-plugin-antd-less": "^1.4.2", + "null-loader": "4.0.1", + "react": "^17.0.2", + "react-dom": "^17.0.2", + "react-redux": "^7.2.5", + "redux": "^4.1.1", + "redux-devtools-extension": "^2.13.9", + "redux-persist": "^6.0.0", + "redux-thunk": "^2.3.0", + "swr": "^1.0.0", + "zustand": "^3.5.10" + }, + "devDependencies": { + "@babel/core": "^7.13.10", + "@types/node": "13.13.4", + "@types/react": "^16.9.36", + "@typescript-eslint/eslint-plugin": "^4.31.2", + "@typescript-eslint/parser": "^4.31.2", + "@zeit/next-css": "^1.0.1", + "babel-loader": "^8.2.2", + "eslint": "^7.32.0", + "eslint-config-prettier": "^8.3.0", + "eslint-plugin-prettier": "^4.0.0", + "prettier": "^2.4.1", + "typescript": "^4.4.3", + "webpack": "^4.44.0" + } +} diff --git a/frontend/pages/_app.tsx b/frontend/pages/_app.tsx new file mode 100644 index 0000000..0b4fdea --- /dev/null +++ b/frontend/pages/_app.tsx @@ -0,0 +1,42 @@ +import React from 'react'; +import { SWRConfig } from 'swr'; +import Head from 'next/head'; +import dynamic from 'next/dynamic'; +import type { AppProps } from 'next/app'; + +import { useCreateStore, Provider } from '../store/zustandStore'; + +import 'antd/dist/antd.css'; + +const swrConfig = { + // revalidateOnFocus: false, + // shouldRetryOnError: false, +}; +export const SWRConfigurationProvider: React.FC = ({ children }) => ( + {children} +); + +const AppLayout = dynamic(() => import('../components/Layout'), { ssr: false }); + +export default function MyApp({ Component, pageProps }: AppProps) { + const createStore = useCreateStore(pageProps.initialZustandState); + + return ( + // eslint-disable-next-line @typescript-eslint/ban-ts-comment + //@ts-ignore + + + + + Dispute Portal + + + + + + + ); +} diff --git a/frontend/pages/_document.tsx b/frontend/pages/_document.tsx new file mode 100644 index 0000000..d464c45 --- /dev/null +++ b/frontend/pages/_document.tsx @@ -0,0 +1,18 @@ +import Document, { Html, Head, Main, NextScript } from 'next/document'; + +export default class MyDocument extends Document { + render() { + return ( + + + + + + +
+ + + + ); + } +} diff --git a/frontend/pages/analysis.tsx b/frontend/pages/analysis.tsx new file mode 100644 index 0000000..662ae8c --- /dev/null +++ b/frontend/pages/analysis.tsx @@ -0,0 +1,10 @@ +import React, { useState } from 'react'; + +export default function App() { + return
; +} + +export async function getServerSideProps({ req }) { + const headers = req ? req.headers : {}; + return { props: { headers } }; +} diff --git a/frontend/pages/dashboard/clients.tsx b/frontend/pages/dashboard/clients.tsx new file mode 100644 index 0000000..662ae8c --- /dev/null +++ b/frontend/pages/dashboard/clients.tsx @@ -0,0 +1,10 @@ +import React, { useState } from 'react'; + +export default function App() { + return
; +} + +export async function getServerSideProps({ req }) { + const headers = req ? req.headers : {}; + return { props: { headers } }; +} diff --git a/frontend/pages/dashboard/events.tsx b/frontend/pages/dashboard/events.tsx new file mode 100644 index 0000000..662ae8c --- /dev/null +++ b/frontend/pages/dashboard/events.tsx @@ -0,0 +1,10 @@ +import React, { useState } from 'react'; + +export default function App() { + return
; +} + +export async function getServerSideProps({ req }) { + const headers = req ? req.headers : {}; + return { props: { headers } }; +} diff --git a/frontend/pages/disputes.tsx b/frontend/pages/disputes.tsx new file mode 100644 index 0000000..000640e --- /dev/null +++ b/frontend/pages/disputes.tsx @@ -0,0 +1,145 @@ +import React from 'react'; +import { Row, Col, Card, PageHeader, Spin } from 'antd'; + +import { Dispute } from '../types/Dispute'; +import { DisputeList } from '../components/DisputeList/DisputeList'; +import { AddDisputeForm } from '../components/AddDisputeForm/AddDisputeForm'; + +import { message } from 'antd'; + +import useSWR from 'swr'; + +import { initializeStore, useStore } from '../store/zustandStore'; +import { GET_DISPUTES_URL } from '../types/Dispute'; + +async function getDisputes(url) { + const response = await fetch(url); + console.log(response); + const jsonData = await response.json(); + return jsonData; +} + +interface DisputeContainerProps { + disputes: Dispute[]; +} + +const DisputesContainer: React.FC = () => { + const { data: disputeData, error: disputeError } = useSWR( + GET_DISPUTES_URL, + getDisputes, + ); + + const { + addDispute, + removeDispute, + progressDisputeState, + loadData, + disputes, + } = useStore(); + + React.useEffect(() => { + if (disputeData) { + const parsedDisputes = parseJsonToDispute(disputeData); + loadData(parsedDisputes); + } + }, [disputeData]); + + const handleFormSubmit = (dispute: Dispute): void => { + addDispute(dispute.dispute_id); + message.success('Dispute added!'); + }; + + const handleRemoveDispute = (dispute: Dispute): void => { + removeDispute(dispute.dispute_id); + message.warn('Dispute removed!'); + }; + + const parseJsonToDispute = (disputeJson: any[]): Dispute[] => { + const disputes = [] as Dispute[]; + const disputeArray = disputeJson['disputes']; + disputeArray.forEach(dispute => { + disputes.push(dispute as Dispute); + }); + + return disputes; + }; + + const disputeRender = (data, error) => { + if (error) { + return
Error fetching disputes
; + } + if (!data) { + return ( +
+ +
+ ); + } + return ( + + ); + }; + + return ( + +
+ + + + + + + + + + + + {disputeRender(disputeData, disputeError)} + + + + ); +}; + +export default DisputesContainer; + +export function getServerSideProps() { + const zustandStore = initializeStore(); + + zustandStore.getState().disputes; + + return { + props: { + // the "stringify and then parse again" piece is required as next.js + // isn't able to serialize it to JSON properly + initialZustandState: JSON.parse(JSON.stringify(zustandStore.getState())), + }, + }; +} diff --git a/frontend/pages/index.tsx b/frontend/pages/index.tsx new file mode 100644 index 0000000..b3ae1a9 --- /dev/null +++ b/frontend/pages/index.tsx @@ -0,0 +1,21 @@ +import { useRouter } from 'next/router'; + +const redirectTo = '/disputes'; + +const Index = () => { + if (typeof window !== 'undefined') { + const router = useRouter(); + router.push(redirectTo); + } + return <>; +}; + +Index.getInitialProps = async ({ ctx }) => { + if (ctx && ctx.req) { + ctx.res.statusCode = 302; + ctx.res.setHeader('Location', redirectTo); + } + return { props: '' }; +}; + +export default Index; diff --git a/frontend/public/favicon.ico b/frontend/public/favicon.ico new file mode 100644 index 0000000000000000000000000000000000000000..85956ecacfc281846fe3d7847389033d3a77cf76 GIT binary patch literal 487 zcmVj?njHo2x;ve9<*&MP$KU0&9kL*xayau$1SAKNY|M6IBPoW%g(1-V;6 d&OeENi%$(Dqr4nK*n + + + Fill 19 + Created with Sketch. + + + + + + \ No newline at end of file diff --git a/frontend/store/zustandStore.ts b/frontend/store/zustandStore.ts new file mode 100644 index 0000000..78a0226 --- /dev/null +++ b/frontend/store/zustandStore.ts @@ -0,0 +1,110 @@ +import { useLayoutEffect } from 'react'; +import create from 'zustand'; +import createContext from 'zustand/context'; +import { v4 as uuidv4 } from 'uuid'; + +import { Dispute } from '../types/Dispute'; +let store; + +const initialState = { + disputes: [], +}; + +interface DisputeState { + disputes: Dispute[]; + addDispute: (id: string) => void; + removeDispute: (id: string) => void; + progressDisputeState: (id: string, stage: number) => void; + loadData: (disputes: Dispute[]) => void; +} + +const zustandContext = createContext(); +export const Provider = zustandContext.Provider; + +// An example of how to get types +/** @type {import('zustand/index').UseStore} */ +export const useStore = zustandContext.useStore; + +const update_disputes = (state, disputes) => { + const old_disputes = state.disputes; + const old_dispute_ids = old_disputes.map(dispute => dispute.dispute_id); + const old_disputes_updated = old_disputes.map(dispute1 => { + const dispute2 = disputes.find( + dispute2 => dispute2.dispute_id === dispute1.dispute_id, + ); + return dispute2 ? { ...dispute1, ...dispute2 } : dispute1; + }); + const new_disputes = disputes.filter( + dispute => !old_dispute_ids.includes(dispute.dispute_id), + ); + return [...old_disputes_updated, ...new_disputes]; +}; + +export const initializeStore = (preloadedState = {}) => { + return create(set => ({ + ...initialState, + ...preloadedState, + // methods for manipulating state + addDispute: (id: string) => { + console.log('ADDING DISPUTE'); + set(state => ({ + disputes: [ + { + id: uuidv4(), + dispute_id: id, + indexers: [], + dispute_kind: '', + dispute_stage: 1, + subgraph_id: '', + } as Dispute, + ...state.disputes, + ], + })); + }, + removeDispute: id => { + console.log('REMOVING DISPUTE'); + set(state => ({ + disputes: state.disputes.filter(dispute => dispute.dispute_id !== id), + })); + }, + progressDisputeState: (id, stage) => { + set(state => ({ + disputes: state.disputes.map(dispute => + dispute.dispute_id === id + ? ({ ...dispute, dispute_stage: stage } as Dispute) + : dispute, + ), + })); + }, + loadData: disputes => { + set(state => ({ + disputes: update_disputes(state, disputes), + })); + }, + })); +}; + +export function useCreateStore(initialState) { + // For SSR & SSG, always use a new store. + if (typeof window === 'undefined') { + return () => initializeStore(initialState); + } + + // For CSR, always re-use same store. + store = store ?? initializeStore(initialState); + // And if initialState changes, then merge states in the next render cycle. + // + // eslint complaining "React Hooks must be called in the exact same order in every component render" + // is ignorable as this code runs in same order in a given environment + // eslint-disable-next-line react-hooks/rules-of-hooks + useLayoutEffect(() => { + if (initialState && store) { + store.setState({ + ...store.getState(), + ...initialState, + }); + } + }, [initialState]); + + return () => store; +} diff --git a/frontend/tsconfig.json b/frontend/tsconfig.json new file mode 100644 index 0000000..3010da9 --- /dev/null +++ b/frontend/tsconfig.json @@ -0,0 +1,29 @@ +{ + "compilerOptions": { + "target": "es5", + "lib": [ + "dom", + "dom.iterable", + "esnext" + ], + "allowJs": true, + "skipLibCheck": true, + "strict": false, + "forceConsistentCasingInFileNames": true, + "noEmit": true, + "esModuleInterop": true, + "module": "esnext", + "moduleResolution": "node", + "resolveJsonModule": true, + "isolatedModules": true, + "jsx": "preserve" + }, + "exclude": [ + "node_modules" + ], + "include": [ + "next-env.d.ts", + "**/*.ts", + "**/*.tsx" + ] +} \ No newline at end of file diff --git a/frontend/types/Dispute.tsx b/frontend/types/Dispute.tsx new file mode 100644 index 0000000..e19e894 --- /dev/null +++ b/frontend/types/Dispute.tsx @@ -0,0 +1,21 @@ +export interface IndexerUpload { + path: string; + kind: string; +} +export interface Indexers { + indexer_id: string; + name: string; + indexer_uploads: IndexerUpload[]; +} + +export interface Dispute { + id?: number; + dispute_id: string; + indexer_ids: string[]; + indexers?: Indexers[]; + dispute_stage: number; + subgraph_id: string; + metadata?: string; +} + +export const GET_DISPUTES_URL = 'http://localhost:8000/disputes'; diff --git a/frontend/yarn.lock b/frontend/yarn.lock new file mode 100644 index 0000000..394f102 --- /dev/null +++ b/frontend/yarn.lock @@ -0,0 +1,5621 @@ +# THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY. +# yarn lockfile v1 + + +"@ant-design/colors@^6.0.0": + version "6.0.0" + resolved "https://registry.yarnpkg.com/@ant-design/colors/-/colors-6.0.0.tgz#9b9366257cffcc47db42b9d0203bb592c13c0298" + integrity sha512-qAZRvPzfdWHtfameEGP2Qvuf838NhergR35o+EuVyB5XvSA98xod5r4utvi4TJ3ywmevm290g9nsCG5MryrdWQ== + dependencies: + "@ctrl/tinycolor" "^3.4.0" + +"@ant-design/icons-svg@^4.0.0": + version "4.1.0" + resolved "https://registry.yarnpkg.com/@ant-design/icons-svg/-/icons-svg-4.1.0.tgz#480b025f4b20ef7fe8f47d4a4846e4fee84ea06c" + integrity sha512-Fi03PfuUqRs76aI3UWYpP864lkrfPo0hluwGqh7NJdLhvH4iRDc3jbJqZIvRDLHKbXrvAfPPV3+zjUccfFvWOQ== + +"@ant-design/icons@^4.6.2", "@ant-design/icons@^4.6.3": + version "4.6.4" + resolved "https://registry.yarnpkg.com/@ant-design/icons/-/icons-4.6.4.tgz#21b037dbb90ee1bb7c632cca057006e57d992fd9" + integrity sha512-li02J8ym721E24N3bw1oXRzFDV7m2MYQWs+WtJgVVjhNRv4sc6vL2a2M7SS8rWX3Uc/3GJfrokIJnMrmbIMuXQ== + dependencies: + "@ant-design/colors" "^6.0.0" + "@ant-design/icons-svg" "^4.0.0" + "@babel/runtime" "^7.11.2" + classnames "^2.2.6" + rc-util "^5.9.4" + +"@ant-design/react-slick@~0.28.1": + version "0.28.4" + resolved "https://registry.yarnpkg.com/@ant-design/react-slick/-/react-slick-0.28.4.tgz#8b296b87ad7c7ae877f2a527b81b7eebd9dd29a9" + integrity sha512-j9eAHTn7GxbXUFNknJoHS2ceAsqrQi2j8XykjZE1IXCD8kJF+t28EvhBLniDpbOsBk/3kjalnhriTfZcjBHNqg== + dependencies: + "@babel/runtime" "^7.10.4" + classnames "^2.2.5" + json2mq "^0.2.0" + lodash "^4.17.21" + resize-observer-polyfill "^1.5.0" + +"@babel/code-frame@7.12.11": + version "7.12.11" + resolved "https://registry.yarnpkg.com/@babel/code-frame/-/code-frame-7.12.11.tgz#f4ad435aa263db935b8f10f2c552d23fb716a63f" + integrity sha512-Zt1yodBx1UcyiePMSkWnU4hPqhwq7hGi2nFL1LeA3EUl+q2LQx16MISgJ0+z7dnmgvP9QtIleuETGOiOH1RcIw== + dependencies: + "@babel/highlight" "^7.10.4" + +"@babel/code-frame@^7.14.5": + version "7.14.5" + resolved "https://registry.yarnpkg.com/@babel/code-frame/-/code-frame-7.14.5.tgz#23b08d740e83f49c5e59945fbf1b43e80bbf4edb" + integrity sha512-9pzDqyc6OLDaqe+zbACgFkb6fKMNG6CObKpnYXChRsvYGyEdc7CA2BaqeOM+vOtCS5ndmJicPJhKAwYRI6UfFw== + dependencies: + "@babel/highlight" "^7.14.5" + +"@babel/compat-data@^7.15.0": + version "7.15.0" + resolved "https://registry.yarnpkg.com/@babel/compat-data/-/compat-data-7.15.0.tgz#2dbaf8b85334796cafbb0f5793a90a2fc010b176" + integrity sha512-0NqAC1IJE0S0+lL1SWFMxMkz1pKCNCjI4tr2Zx4LJSXxCLAdr6KyArnY+sno5m3yH9g737ygOyPABDsnXkpxiA== + +"@babel/core@^7.13.10": + version "7.15.5" + resolved "https://registry.yarnpkg.com/@babel/core/-/core-7.15.5.tgz#f8ed9ace730722544609f90c9bb49162dc3bf5b9" + integrity sha512-pYgXxiwAgQpgM1bNkZsDEq85f0ggXMA5L7c+o3tskGMh2BunCI9QUwB9Z4jpvXUOuMdyGKiGKQiRe11VS6Jzvg== + dependencies: + "@babel/code-frame" "^7.14.5" + "@babel/generator" "^7.15.4" + "@babel/helper-compilation-targets" "^7.15.4" + "@babel/helper-module-transforms" "^7.15.4" + "@babel/helpers" "^7.15.4" + "@babel/parser" "^7.15.5" + "@babel/template" "^7.15.4" + "@babel/traverse" "^7.15.4" + "@babel/types" "^7.15.4" + convert-source-map "^1.7.0" + debug "^4.1.0" + gensync "^1.0.0-beta.2" + json5 "^2.1.2" + semver "^6.3.0" + source-map "^0.5.0" + +"@babel/generator@^7.15.4": + version "7.15.4" + resolved "https://registry.yarnpkg.com/@babel/generator/-/generator-7.15.4.tgz#85acb159a267ca6324f9793986991ee2022a05b0" + integrity sha512-d3itta0tu+UayjEORPNz6e1T3FtvWlP5N4V5M+lhp/CxT4oAA7/NcScnpRyspUMLK6tu9MNHmQHxRykuN2R7hw== + dependencies: + "@babel/types" "^7.15.4" + jsesc "^2.5.1" + source-map "^0.5.0" + +"@babel/helper-compilation-targets@^7.15.4": + version "7.15.4" + resolved "https://registry.yarnpkg.com/@babel/helper-compilation-targets/-/helper-compilation-targets-7.15.4.tgz#cf6d94f30fbefc139123e27dd6b02f65aeedb7b9" + integrity sha512-rMWPCirulnPSe4d+gwdWXLfAXTTBj8M3guAf5xFQJ0nvFY7tfNAFnWdqaHegHlgDZOCT4qvhF3BYlSJag8yhqQ== + dependencies: + "@babel/compat-data" "^7.15.0" + "@babel/helper-validator-option" "^7.14.5" + browserslist "^4.16.6" + semver "^6.3.0" + +"@babel/helper-function-name@^7.15.4": + version "7.15.4" + resolved "https://registry.yarnpkg.com/@babel/helper-function-name/-/helper-function-name-7.15.4.tgz#845744dafc4381a4a5fb6afa6c3d36f98a787ebc" + integrity sha512-Z91cOMM4DseLIGOnog+Z8OI6YseR9bua+HpvLAQ2XayUGU+neTtX+97caALaLdyu53I/fjhbeCnWnRH1O3jFOw== + dependencies: + "@babel/helper-get-function-arity" "^7.15.4" + "@babel/template" "^7.15.4" + "@babel/types" "^7.15.4" + +"@babel/helper-get-function-arity@^7.15.4": + version "7.15.4" + resolved "https://registry.yarnpkg.com/@babel/helper-get-function-arity/-/helper-get-function-arity-7.15.4.tgz#098818934a137fce78b536a3e015864be1e2879b" + integrity sha512-1/AlxSF92CmGZzHnC515hm4SirTxtpDnLEJ0UyEMgTMZN+6bxXKg04dKhiRx5Enel+SUA1G1t5Ed/yQia0efrA== + dependencies: + "@babel/types" "^7.15.4" + +"@babel/helper-hoist-variables@^7.15.4": + version "7.15.4" + resolved "https://registry.yarnpkg.com/@babel/helper-hoist-variables/-/helper-hoist-variables-7.15.4.tgz#09993a3259c0e918f99d104261dfdfc033f178df" + integrity sha512-VTy085egb3jUGVK9ycIxQiPbquesq0HUQ+tPO0uv5mPEBZipk+5FkRKiWq5apuyTE9FUrjENB0rCf8y+n+UuhA== + dependencies: + "@babel/types" "^7.15.4" + +"@babel/helper-member-expression-to-functions@^7.15.4": + version "7.15.4" + resolved "https://registry.yarnpkg.com/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.15.4.tgz#bfd34dc9bba9824a4658b0317ec2fd571a51e6ef" + integrity sha512-cokOMkxC/BTyNP1AlY25HuBWM32iCEsLPI4BHDpJCHHm1FU2E7dKWWIXJgQgSFiu4lp8q3bL1BIKwqkSUviqtA== + dependencies: + "@babel/types" "^7.15.4" + +"@babel/helper-module-imports@^7.0.0", "@babel/helper-module-imports@^7.15.4": + version "7.15.4" + resolved "https://registry.yarnpkg.com/@babel/helper-module-imports/-/helper-module-imports-7.15.4.tgz#e18007d230632dea19b47853b984476e7b4e103f" + integrity sha512-jeAHZbzUwdW/xHgHQ3QmWR4Jg6j15q4w/gCfwZvtqOxoo5DKtLHk8Bsf4c5RZRC7NmLEs+ohkdq8jFefuvIxAA== + dependencies: + "@babel/types" "^7.15.4" + +"@babel/helper-module-transforms@^7.15.4": + version "7.15.4" + resolved "https://registry.yarnpkg.com/@babel/helper-module-transforms/-/helper-module-transforms-7.15.4.tgz#962cc629a7f7f9a082dd62d0307fa75fe8788d7c" + integrity sha512-9fHHSGE9zTC++KuXLZcB5FKgvlV83Ox+NLUmQTawovwlJ85+QMhk1CnVk406CQVj97LaWod6KVjl2Sfgw9Aktw== + dependencies: + "@babel/helper-module-imports" "^7.15.4" + "@babel/helper-replace-supers" "^7.15.4" + "@babel/helper-simple-access" "^7.15.4" + "@babel/helper-split-export-declaration" "^7.15.4" + "@babel/helper-validator-identifier" "^7.14.9" + "@babel/template" "^7.15.4" + "@babel/traverse" "^7.15.4" + "@babel/types" "^7.15.4" + +"@babel/helper-optimise-call-expression@^7.15.4": + version "7.15.4" + resolved "https://registry.yarnpkg.com/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.15.4.tgz#f310a5121a3b9cc52d9ab19122bd729822dee171" + integrity sha512-E/z9rfbAOt1vDW1DR7k4SzhzotVV5+qMciWV6LaG1g4jeFrkDlJedjtV4h0i4Q/ITnUu+Pk08M7fczsB9GXBDw== + dependencies: + "@babel/types" "^7.15.4" + +"@babel/helper-replace-supers@^7.15.4": + version "7.15.4" + resolved "https://registry.yarnpkg.com/@babel/helper-replace-supers/-/helper-replace-supers-7.15.4.tgz#52a8ab26ba918c7f6dee28628b07071ac7b7347a" + integrity sha512-/ztT6khaXF37MS47fufrKvIsiQkx1LBRvSJNzRqmbyeZnTwU9qBxXYLaaT/6KaxfKhjs2Wy8kG8ZdsFUuWBjzw== + dependencies: + "@babel/helper-member-expression-to-functions" "^7.15.4" + "@babel/helper-optimise-call-expression" "^7.15.4" + "@babel/traverse" "^7.15.4" + "@babel/types" "^7.15.4" + +"@babel/helper-simple-access@^7.15.4": + version "7.15.4" + resolved "https://registry.yarnpkg.com/@babel/helper-simple-access/-/helper-simple-access-7.15.4.tgz#ac368905abf1de8e9781434b635d8f8674bcc13b" + integrity sha512-UzazrDoIVOZZcTeHHEPYrr1MvTR/K+wgLg6MY6e1CJyaRhbibftF6fR2KU2sFRtI/nERUZR9fBd6aKgBlIBaPg== + dependencies: + "@babel/types" "^7.15.4" + +"@babel/helper-split-export-declaration@^7.15.4": + version "7.15.4" + resolved "https://registry.yarnpkg.com/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.15.4.tgz#aecab92dcdbef6a10aa3b62ab204b085f776e257" + integrity sha512-HsFqhLDZ08DxCpBdEVtKmywj6PQbwnF6HHybur0MAnkAKnlS6uHkwnmRIkElB2Owpfb4xL4NwDmDLFubueDXsw== + dependencies: + "@babel/types" "^7.15.4" + +"@babel/helper-validator-identifier@^7.14.5", "@babel/helper-validator-identifier@^7.14.9": + version "7.14.9" + resolved "https://registry.yarnpkg.com/@babel/helper-validator-identifier/-/helper-validator-identifier-7.14.9.tgz#6654d171b2024f6d8ee151bf2509699919131d48" + integrity sha512-pQYxPY0UP6IHISRitNe8bsijHex4TWZXi2HwKVsjPiltzlhse2znVcm9Ace510VT1kxIHjGJCZZQBX2gJDbo0g== + +"@babel/helper-validator-option@^7.14.5": + version "7.14.5" + resolved "https://registry.yarnpkg.com/@babel/helper-validator-option/-/helper-validator-option-7.14.5.tgz#6e72a1fff18d5dfcb878e1e62f1a021c4b72d5a3" + integrity sha512-OX8D5eeX4XwcroVW45NMvoYaIuFI+GQpA2a8Gi+X/U/cDUIRsV37qQfF905F0htTRCREQIB4KqPeaveRJUl3Ow== + +"@babel/helpers@^7.15.4": + version "7.15.4" + resolved "https://registry.yarnpkg.com/@babel/helpers/-/helpers-7.15.4.tgz#5f40f02050a3027121a3cf48d497c05c555eaf43" + integrity sha512-V45u6dqEJ3w2rlryYYXf6i9rQ5YMNu4FLS6ngs8ikblhu2VdR1AqAd6aJjBzmf2Qzh6KOLqKHxEN9+TFbAkAVQ== + dependencies: + "@babel/template" "^7.15.4" + "@babel/traverse" "^7.15.4" + "@babel/types" "^7.15.4" + +"@babel/highlight@^7.10.4", "@babel/highlight@^7.14.5": + version "7.14.5" + resolved "https://registry.yarnpkg.com/@babel/highlight/-/highlight-7.14.5.tgz#6861a52f03966405001f6aa534a01a24d99e8cd9" + integrity sha512-qf9u2WFWVV0MppaL877j2dBtQIDgmidgjGk5VIMw3OadXvYaXn66U1BFlH2t4+t3i+8PhedppRv+i40ABzd+gg== + dependencies: + "@babel/helper-validator-identifier" "^7.14.5" + chalk "^2.0.0" + js-tokens "^4.0.0" + +"@babel/parser@^7.15.4", "@babel/parser@^7.15.5": + version "7.15.5" + resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.15.5.tgz#d33a58ca69facc05b26adfe4abebfed56c1c2dac" + integrity sha512-2hQstc6I7T6tQsWzlboMh3SgMRPaS4H6H7cPQsJkdzTzEGqQrpLDsE2BGASU5sBPoEQyHzeqU6C8uKbFeEk6sg== + +"@babel/runtime@7.12.5": + version "7.12.5" + resolved "https://registry.yarnpkg.com/@babel/runtime/-/runtime-7.12.5.tgz#410e7e487441e1b360c29be715d870d9b985882e" + integrity sha512-plcc+hbExy3McchJCEQG3knOsuh3HH+Prx1P6cLIkET/0dLuQDEnrT+s27Axgc9bqfsmNUNHfscgMUdBpC9xfg== + dependencies: + regenerator-runtime "^0.13.4" + +"@babel/runtime@^7.0.0", "@babel/runtime@^7.10.1", "@babel/runtime@^7.10.2", "@babel/runtime@^7.10.4", "@babel/runtime@^7.11.1", "@babel/runtime@^7.11.2", "@babel/runtime@^7.12.1", "@babel/runtime@^7.12.5", "@babel/runtime@^7.8.4", "@babel/runtime@^7.9.2": + version "7.15.4" + resolved "https://registry.yarnpkg.com/@babel/runtime/-/runtime-7.15.4.tgz#fd17d16bfdf878e6dd02d19753a39fa8a8d9c84a" + integrity sha512-99catp6bHCaxr4sJ/DbTGgHS4+Rs2RVd2g7iOap6SLGPDknRK9ztKNsE/Fg6QhSeh1FGE5f6gHGQmvvn3I3xhw== + dependencies: + regenerator-runtime "^0.13.4" + +"@babel/template@^7.15.4": + version "7.15.4" + resolved "https://registry.yarnpkg.com/@babel/template/-/template-7.15.4.tgz#51898d35dcf3faa670c4ee6afcfd517ee139f194" + integrity sha512-UgBAfEa1oGuYgDIPM2G+aHa4Nlo9Lh6mGD2bDBGMTbYnc38vulXPuC1MGjYILIEmlwl6Rd+BPR9ee3gm20CBtg== + dependencies: + "@babel/code-frame" "^7.14.5" + "@babel/parser" "^7.15.4" + "@babel/types" "^7.15.4" + +"@babel/traverse@^7.15.4": + version "7.15.4" + resolved "https://registry.yarnpkg.com/@babel/traverse/-/traverse-7.15.4.tgz#ff8510367a144bfbff552d9e18e28f3e2889c22d" + integrity sha512-W6lQD8l4rUbQR/vYgSuCAE75ADyyQvOpFVsvPPdkhf6lATXAsQIG9YdtOcu8BB1dZ0LKu+Zo3c1wEcbKeuhdlA== + dependencies: + "@babel/code-frame" "^7.14.5" + "@babel/generator" "^7.15.4" + "@babel/helper-function-name" "^7.15.4" + "@babel/helper-hoist-variables" "^7.15.4" + "@babel/helper-split-export-declaration" "^7.15.4" + "@babel/parser" "^7.15.4" + "@babel/types" "^7.15.4" + debug "^4.1.0" + globals "^11.1.0" + +"@babel/types@7.8.3": + version "7.8.3" + resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.8.3.tgz#5a383dffa5416db1b73dedffd311ffd0788fb31c" + integrity sha512-jBD+G8+LWpMBBWvVcdr4QysjUE4mU/syrhN17o1u3gx0/WzJB1kwiVZAXRtWbsIPOwW8pF/YJV5+nmetPzepXg== + dependencies: + esutils "^2.0.2" + lodash "^4.17.13" + to-fast-properties "^2.0.0" + +"@babel/types@^7.15.4": + version "7.15.4" + resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.15.4.tgz#74eeb86dbd6748d2741396557b9860e57fce0a0d" + integrity sha512-0f1HJFuGmmbrKTCZtbm3cU+b/AqdEYk5toj5iQur58xkVMlS0JWaKxTBSmCXd47uiN7vbcozAupm6Mvs80GNhw== + dependencies: + "@babel/helper-validator-identifier" "^7.14.9" + to-fast-properties "^2.0.0" + +"@ctrl/tinycolor@^3.4.0": + version "3.4.0" + resolved "https://registry.yarnpkg.com/@ctrl/tinycolor/-/tinycolor-3.4.0.tgz#c3c5ae543c897caa9c2a68630bed355be5f9990f" + integrity sha512-JZButFdZ1+/xAfpguQHoabIXkcqRRKpMrWKBkpEZZyxfY9C1DpADFB8PEqGSTeFr135SaTRfKqGKx5xSCLI7ZQ== + +"@eslint/eslintrc@^0.4.3": + version "0.4.3" + resolved "https://registry.yarnpkg.com/@eslint/eslintrc/-/eslintrc-0.4.3.tgz#9e42981ef035beb3dd49add17acb96e8ff6f394c" + integrity sha512-J6KFFz5QCYUJq3pf0mjEcCJVERbzv71PUIDczuh9JkwGEzced6CO5ADLHB1rbf/+oPBtoPfMYNOpGDzCANlbXw== + dependencies: + ajv "^6.12.4" + debug "^4.1.1" + espree "^7.3.0" + globals "^13.9.0" + ignore "^4.0.6" + import-fresh "^3.2.1" + js-yaml "^3.13.1" + minimatch "^3.0.4" + strip-json-comments "^3.1.1" + +"@hapi/accept@5.0.2": + version "5.0.2" + resolved "https://registry.yarnpkg.com/@hapi/accept/-/accept-5.0.2.tgz#ab7043b037e68b722f93f376afb05e85c0699523" + integrity sha512-CmzBx/bXUR8451fnZRuZAJRlzgm0Jgu5dltTX/bszmR2lheb9BpyN47Q1RbaGTsvFzn0PXAEs+lXDKfshccYZw== + dependencies: + "@hapi/boom" "9.x.x" + "@hapi/hoek" "9.x.x" + +"@hapi/boom@9.x.x": + version "9.1.4" + resolved "https://registry.yarnpkg.com/@hapi/boom/-/boom-9.1.4.tgz#1f9dad367c6a7da9f8def24b4a986fc5a7bd9db6" + integrity sha512-Ls1oH8jaN1vNsqcaHVYJrKmgMcKsC1wcp8bujvXrHaAqD2iDYq3HoOwsxwo09Cuda5R5nC0o0IxlrlTuvPuzSw== + dependencies: + "@hapi/hoek" "9.x.x" + +"@hapi/hoek@9.x.x": + version "9.2.0" + resolved "https://registry.yarnpkg.com/@hapi/hoek/-/hoek-9.2.0.tgz#f3933a44e365864f4dad5db94158106d511e8131" + integrity sha512-sqKVVVOe5ivCaXDWivIJYVSaEgdQK9ul7a4Kity5Iw7u9+wBAPbX1RMSnLLmp7O4Vzj0WOWwMAJsTL00xwaNug== + +"@humanwhocodes/config-array@^0.5.0": + version "0.5.0" + resolved "https://registry.yarnpkg.com/@humanwhocodes/config-array/-/config-array-0.5.0.tgz#1407967d4c6eecd7388f83acf1eaf4d0c6e58ef9" + integrity sha512-FagtKFz74XrTl7y6HCzQpwDfXP0yhxe9lHLD1UZxjvZIcbyRz8zTFF/yYNfSfzU414eDwZ1SrO0Qvtyf+wFMQg== + dependencies: + "@humanwhocodes/object-schema" "^1.2.0" + debug "^4.1.1" + minimatch "^3.0.4" + +"@humanwhocodes/object-schema@^1.2.0": + version "1.2.0" + resolved "https://registry.yarnpkg.com/@humanwhocodes/object-schema/-/object-schema-1.2.0.tgz#87de7af9c231826fdd68ac7258f77c429e0e5fcf" + integrity sha512-wdppn25U8z/2yiaT6YGquE6X8sSv7hNMWSXYSSU1jGv/yd6XqjXgTDJ8KP4NgjTXfJ3GbRjeeb8RTV7a/VpM+w== + +"@next/env@10.2.3": + version "10.2.3" + resolved "https://registry.yarnpkg.com/@next/env/-/env-10.2.3.tgz#ede3bbe68cec9939c37168ea2077f9adbc68334e" + integrity sha512-uBOjRBjsWC4C8X3DfmWWP6ekwLnf2JCCwQX9KVnJtJkqfDsv1yQPakdOEwvJzXQc3JC/v5KKffYPVmV2wHXCgQ== + +"@next/polyfill-module@10.2.3": + version "10.2.3" + resolved "https://registry.yarnpkg.com/@next/polyfill-module/-/polyfill-module-10.2.3.tgz#5a29f50c3ce3a56b8268d3b8331c691d8039467a" + integrity sha512-OkeY4cLhzfYbXxM4fd+6V4s5pTPuyfKSlavItfNRA6PpS7t1/R6YjO7S7rB8tu1pbTGuDHGIdE1ioDv15bAbDQ== + +"@next/react-dev-overlay@10.2.3": + version "10.2.3" + resolved "https://registry.yarnpkg.com/@next/react-dev-overlay/-/react-dev-overlay-10.2.3.tgz#95313d10a8848f6c7b9e31ae3bd2a3627d136841" + integrity sha512-E6g2jws4YW94l0lMMopBVKIZK2mEHfSBvM0d9dmzKG9L/A/kEq6LZCB4SiwGJbNsAdlk2y3USDa0oNbpA+m5Kw== + dependencies: + "@babel/code-frame" "7.12.11" + anser "1.4.9" + chalk "4.0.0" + classnames "2.2.6" + css.escape "1.5.1" + data-uri-to-buffer "3.0.1" + platform "1.3.6" + shell-quote "1.7.2" + source-map "0.8.0-beta.0" + stacktrace-parser "0.1.10" + strip-ansi "6.0.0" + +"@next/react-refresh-utils@10.2.3": + version "10.2.3" + resolved "https://registry.yarnpkg.com/@next/react-refresh-utils/-/react-refresh-utils-10.2.3.tgz#2f3e42fe6680798f276e3621345c2886b231348b" + integrity sha512-qtBF56vPC6d6a8p7LYd0iRjW89fhY80kAIzmj+VonvIGjK/nymBjcFUhbKiMFqlhsarCksnhwX+Zmn95Dw9qvA== + +"@nodelib/fs.scandir@2.1.5": + version "2.1.5" + resolved "https://registry.yarnpkg.com/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz#7619c2eb21b25483f6d167548b4cfd5a7488c3d5" + integrity sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g== + dependencies: + "@nodelib/fs.stat" "2.0.5" + run-parallel "^1.1.9" + +"@nodelib/fs.stat@2.0.5", "@nodelib/fs.stat@^2.0.2": + version "2.0.5" + resolved "https://registry.yarnpkg.com/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz#5bd262af94e9d25bd1e71b05deed44876a222e8b" + integrity sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A== + +"@nodelib/fs.walk@^1.2.3": + version "1.2.8" + resolved "https://registry.yarnpkg.com/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz#e95737e8bb6746ddedf69c556953494f196fe69a" + integrity sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg== + dependencies: + "@nodelib/fs.scandir" "2.1.5" + fastq "^1.6.0" + +"@opentelemetry/api@0.14.0": + version "0.14.0" + resolved "https://registry.yarnpkg.com/@opentelemetry/api/-/api-0.14.0.tgz#4e17d8d2f1da72b19374efa7b6526aa001267cae" + integrity sha512-L7RMuZr5LzMmZiQSQDy9O1jo0q+DaLy6XpYJfIGfYSfoJA5qzYwUP3sP1uMIQ549DvxAgM3ng85EaPTM/hUHwQ== + dependencies: + "@opentelemetry/context-base" "^0.14.0" + +"@opentelemetry/context-base@^0.14.0": + version "0.14.0" + resolved "https://registry.yarnpkg.com/@opentelemetry/context-base/-/context-base-0.14.0.tgz#c67fc20a4d891447ca1a855d7d70fa79a3533001" + integrity sha512-sDOAZcYwynHFTbLo6n8kIbLiVF3a3BLkrmehJUyEbT9F+Smbi47kLGS2gG2g0fjBLR/Lr1InPD7kXL7FaTqEkw== + +"@types/hoist-non-react-statics@^3.3.0": + version "3.3.1" + resolved "https://registry.yarnpkg.com/@types/hoist-non-react-statics/-/hoist-non-react-statics-3.3.1.tgz#1124aafe5118cb591977aeb1ceaaed1070eb039f" + integrity sha512-iMIqiko6ooLrTh1joXodJK5X9xeEALT1kM5G3ZLhD3hszxBdIEd5C75U834D9mLcINgD4OyZf5uQXjkuYydWvA== + dependencies: + "@types/react" "*" + hoist-non-react-statics "^3.3.0" + +"@types/json-schema@^7.0.5", "@types/json-schema@^7.0.7", "@types/json-schema@^7.0.8": + version "7.0.9" + resolved "https://registry.yarnpkg.com/@types/json-schema/-/json-schema-7.0.9.tgz#97edc9037ea0c38585320b28964dde3b39e4660d" + integrity sha512-qcUXuemtEu+E5wZSJHNxUXeCZhAfXKQ41D+duX+VYPde7xyEVZci+/oXKJL13tnRs9lR2pr4fod59GT6/X1/yQ== + +"@types/node@*": + version "16.9.0" + resolved "https://registry.yarnpkg.com/@types/node/-/node-16.9.0.tgz#d9512fe037472dcb58931ce19f837348db828a62" + integrity sha512-nmP+VR4oT0pJUPFbKE4SXj3Yb4Q/kz3M9dSAO1GGMebRKWHQxLfDNmU/yh3xxCJha3N60nQ/JwXWwOE/ZSEVag== + +"@types/node@13.13.4": + version "13.13.4" + resolved "https://registry.yarnpkg.com/@types/node/-/node-13.13.4.tgz#1581d6c16e3d4803eb079c87d4ac893ee7501c2c" + integrity sha512-x26ur3dSXgv5AwKS0lNfbjpCakGIduWU1DU91Zz58ONRWrIKGunmZBNv4P7N+e27sJkiGDsw/3fT4AtsqQBrBA== + +"@types/prop-types@*": + version "15.7.4" + resolved "https://registry.yarnpkg.com/@types/prop-types/-/prop-types-15.7.4.tgz#fcf7205c25dff795ee79af1e30da2c9790808f11" + integrity sha512-rZ5drC/jWjrArrS8BR6SIr4cWpW09RNTYt9AMZo3Jwwif+iacXAqgVjm0B0Bv/S1jhDXKHqRVNCbACkJ89RAnQ== + +"@types/react-redux@^7.1.16": + version "7.1.18" + resolved "https://registry.yarnpkg.com/@types/react-redux/-/react-redux-7.1.18.tgz#2bf8fd56ebaae679a90ebffe48ff73717c438e04" + integrity sha512-9iwAsPyJ9DLTRH+OFeIrm9cAbIj1i2ANL3sKQFATqnPWRbg+jEFXyZOKHiQK/N86pNRXbb4HRxAxo0SIX1XwzQ== + dependencies: + "@types/hoist-non-react-statics" "^3.3.0" + "@types/react" "*" + hoist-non-react-statics "^3.3.0" + redux "^4.0.0" + +"@types/react@*": + version "17.0.20" + resolved "https://registry.yarnpkg.com/@types/react/-/react-17.0.20.tgz#a4284b184d47975c71658cd69e759b6bd37c3b8c" + integrity sha512-wWZrPlihslrPpcKyCSlmIlruakxr57/buQN1RjlIeaaTWDLtJkTtRW429MoQJergvVKc4IWBpRhWw7YNh/7GVA== + dependencies: + "@types/prop-types" "*" + "@types/scheduler" "*" + csstype "^3.0.2" + +"@types/react@^16.9.36": + version "16.14.15" + resolved "https://registry.yarnpkg.com/@types/react/-/react-16.14.15.tgz#95d8fa3148050e94bcdc5751447921adbe19f9e6" + integrity sha512-jOxlBV9RGZhphdeqJTCv35VZOkjY+XIEY2owwSk84BNDdDv2xS6Csj6fhi+B/q30SR9Tz8lDNt/F2Z5RF3TrRg== + dependencies: + "@types/prop-types" "*" + "@types/scheduler" "*" + csstype "^3.0.2" + +"@types/scheduler@*": + version "0.16.2" + resolved "https://registry.yarnpkg.com/@types/scheduler/-/scheduler-0.16.2.tgz#1a62f89525723dde24ba1b01b092bf5df8ad4d39" + integrity sha512-hppQEBDmlwhFAXKJX2KnWLYu5yMfi91yazPb2l+lbJiwW+wdo1gNeRA+3RgNSO39WYX2euey41KEwnqesU2Jew== + +"@typescript-eslint/eslint-plugin@^4.31.2": + version "4.31.2" + resolved "https://registry.yarnpkg.com/@typescript-eslint/eslint-plugin/-/eslint-plugin-4.31.2.tgz#9f41efaee32cdab7ace94b15bd19b756dd099b0a" + integrity sha512-w63SCQ4bIwWN/+3FxzpnWrDjQRXVEGiTt9tJTRptRXeFvdZc/wLiz3FQUwNQ2CVoRGI6KUWMNUj/pk63noUfcA== + dependencies: + "@typescript-eslint/experimental-utils" "4.31.2" + "@typescript-eslint/scope-manager" "4.31.2" + debug "^4.3.1" + functional-red-black-tree "^1.0.1" + regexpp "^3.1.0" + semver "^7.3.5" + tsutils "^3.21.0" + +"@typescript-eslint/experimental-utils@4.31.2": + version "4.31.2" + resolved "https://registry.yarnpkg.com/@typescript-eslint/experimental-utils/-/experimental-utils-4.31.2.tgz#98727a9c1e977dd5d20c8705e69cd3c2a86553fa" + integrity sha512-3tm2T4nyA970yQ6R3JZV9l0yilE2FedYg8dcXrTar34zC9r6JB7WyBQbpIVongKPlhEMjhQ01qkwrzWy38Bk1Q== + dependencies: + "@types/json-schema" "^7.0.7" + "@typescript-eslint/scope-manager" "4.31.2" + "@typescript-eslint/types" "4.31.2" + "@typescript-eslint/typescript-estree" "4.31.2" + eslint-scope "^5.1.1" + eslint-utils "^3.0.0" + +"@typescript-eslint/parser@^4.31.2": + version "4.31.2" + resolved "https://registry.yarnpkg.com/@typescript-eslint/parser/-/parser-4.31.2.tgz#54aa75986e3302d91eff2bbbaa6ecfa8084e9c34" + integrity sha512-EcdO0E7M/sv23S/rLvenHkb58l3XhuSZzKf6DBvLgHqOYdL6YFMYVtreGFWirxaU2mS1GYDby3Lyxco7X5+Vjw== + dependencies: + "@typescript-eslint/scope-manager" "4.31.2" + "@typescript-eslint/types" "4.31.2" + "@typescript-eslint/typescript-estree" "4.31.2" + debug "^4.3.1" + +"@typescript-eslint/scope-manager@4.31.2": + version "4.31.2" + resolved "https://registry.yarnpkg.com/@typescript-eslint/scope-manager/-/scope-manager-4.31.2.tgz#1d528cb3ed3bcd88019c20a57c18b897b073923a" + integrity sha512-2JGwudpFoR/3Czq6mPpE8zBPYdHWFGL6lUNIGolbKQeSNv4EAiHaR5GVDQaLA0FwgcdcMtRk+SBJbFGL7+La5w== + dependencies: + "@typescript-eslint/types" "4.31.2" + "@typescript-eslint/visitor-keys" "4.31.2" + +"@typescript-eslint/types@4.31.2": + version "4.31.2" + resolved "https://registry.yarnpkg.com/@typescript-eslint/types/-/types-4.31.2.tgz#2aea7177d6d744521a168ed4668eddbd912dfadf" + integrity sha512-kWiTTBCTKEdBGrZKwFvOlGNcAsKGJSBc8xLvSjSppFO88AqGxGNYtF36EuEYG6XZ9vT0xX8RNiHbQUKglbSi1w== + +"@typescript-eslint/typescript-estree@4.31.2": + version "4.31.2" + resolved "https://registry.yarnpkg.com/@typescript-eslint/typescript-estree/-/typescript-estree-4.31.2.tgz#abfd50594d8056b37e7428df3b2d185ef2d0060c" + integrity sha512-ieBq8U9at6PvaC7/Z6oe8D3czeW5d//Fo1xkF/s9394VR0bg/UaMYPdARiWyKX+lLEjY3w/FNZJxitMsiWv+wA== + dependencies: + "@typescript-eslint/types" "4.31.2" + "@typescript-eslint/visitor-keys" "4.31.2" + debug "^4.3.1" + globby "^11.0.3" + is-glob "^4.0.1" + semver "^7.3.5" + tsutils "^3.21.0" + +"@typescript-eslint/visitor-keys@4.31.2": + version "4.31.2" + resolved "https://registry.yarnpkg.com/@typescript-eslint/visitor-keys/-/visitor-keys-4.31.2.tgz#7d5b4a4705db7fe59ecffb273c1d082760f635cc" + integrity sha512-PrBId7EQq2Nibns7dd/ch6S6/M4/iwLM9McbgeEbCXfxdwRUNxJ4UNreJ6Gh3fI2GNKNrWnQxKL7oCPmngKBug== + dependencies: + "@typescript-eslint/types" "4.31.2" + eslint-visitor-keys "^2.0.0" + +"@webassemblyjs/ast@1.9.0": + version "1.9.0" + resolved "https://registry.yarnpkg.com/@webassemblyjs/ast/-/ast-1.9.0.tgz#bd850604b4042459a5a41cd7d338cbed695ed964" + integrity sha512-C6wW5L+b7ogSDVqymbkkvuW9kruN//YisMED04xzeBBqjHa2FYnmvOlS6Xj68xWQRgWvI9cIglsjFowH/RJyEA== + dependencies: + "@webassemblyjs/helper-module-context" "1.9.0" + "@webassemblyjs/helper-wasm-bytecode" "1.9.0" + "@webassemblyjs/wast-parser" "1.9.0" + +"@webassemblyjs/floating-point-hex-parser@1.9.0": + version "1.9.0" + resolved "https://registry.yarnpkg.com/@webassemblyjs/floating-point-hex-parser/-/floating-point-hex-parser-1.9.0.tgz#3c3d3b271bddfc84deb00f71344438311d52ffb4" + integrity sha512-TG5qcFsS8QB4g4MhrxK5TqfdNe7Ey/7YL/xN+36rRjl/BlGE/NcBvJcqsRgCP6Z92mRE+7N50pRIi8SmKUbcQA== + +"@webassemblyjs/helper-api-error@1.9.0": + version "1.9.0" + resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-api-error/-/helper-api-error-1.9.0.tgz#203f676e333b96c9da2eeab3ccef33c45928b6a2" + integrity sha512-NcMLjoFMXpsASZFxJ5h2HZRcEhDkvnNFOAKneP5RbKRzaWJN36NC4jqQHKwStIhGXu5mUWlUUk7ygdtrO8lbmw== + +"@webassemblyjs/helper-buffer@1.9.0": + version "1.9.0" + resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-buffer/-/helper-buffer-1.9.0.tgz#a1442d269c5feb23fcbc9ef759dac3547f29de00" + integrity sha512-qZol43oqhq6yBPx7YM3m9Bv7WMV9Eevj6kMi6InKOuZxhw+q9hOkvq5e/PpKSiLfyetpaBnogSbNCfBwyB00CA== + +"@webassemblyjs/helper-code-frame@1.9.0": + version "1.9.0" + resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-code-frame/-/helper-code-frame-1.9.0.tgz#647f8892cd2043a82ac0c8c5e75c36f1d9159f27" + integrity sha512-ERCYdJBkD9Vu4vtjUYe8LZruWuNIToYq/ME22igL+2vj2dQ2OOujIZr3MEFvfEaqKoVqpsFKAGsRdBSBjrIvZA== + dependencies: + "@webassemblyjs/wast-printer" "1.9.0" + +"@webassemblyjs/helper-fsm@1.9.0": + version "1.9.0" + resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-fsm/-/helper-fsm-1.9.0.tgz#c05256b71244214671f4b08ec108ad63b70eddb8" + integrity sha512-OPRowhGbshCb5PxJ8LocpdX9Kl0uB4XsAjl6jH/dWKlk/mzsANvhwbiULsaiqT5GZGT9qinTICdj6PLuM5gslw== + +"@webassemblyjs/helper-module-context@1.9.0": + version "1.9.0" + resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-module-context/-/helper-module-context-1.9.0.tgz#25d8884b76839871a08a6c6f806c3979ef712f07" + integrity sha512-MJCW8iGC08tMk2enck1aPW+BE5Cw8/7ph/VGZxwyvGbJwjktKkDK7vy7gAmMDx88D7mhDTCNKAW5tED+gZ0W8g== + dependencies: + "@webassemblyjs/ast" "1.9.0" + +"@webassemblyjs/helper-wasm-bytecode@1.9.0": + version "1.9.0" + resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-wasm-bytecode/-/helper-wasm-bytecode-1.9.0.tgz#4fed8beac9b8c14f8c58b70d124d549dd1fe5790" + integrity sha512-R7FStIzyNcd7xKxCZH5lE0Bqy+hGTwS3LJjuv1ZVxd9O7eHCedSdrId/hMOd20I+v8wDXEn+bjfKDLzTepoaUw== + +"@webassemblyjs/helper-wasm-section@1.9.0": + version "1.9.0" + resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-wasm-section/-/helper-wasm-section-1.9.0.tgz#5a4138d5a6292ba18b04c5ae49717e4167965346" + integrity sha512-XnMB8l3ek4tvrKUUku+IVaXNHz2YsJyOOmz+MMkZvh8h1uSJpSen6vYnw3IoQ7WwEuAhL8Efjms1ZWjqh2agvw== + dependencies: + "@webassemblyjs/ast" "1.9.0" + "@webassemblyjs/helper-buffer" "1.9.0" + "@webassemblyjs/helper-wasm-bytecode" "1.9.0" + "@webassemblyjs/wasm-gen" "1.9.0" + +"@webassemblyjs/ieee754@1.9.0": + version "1.9.0" + resolved "https://registry.yarnpkg.com/@webassemblyjs/ieee754/-/ieee754-1.9.0.tgz#15c7a0fbaae83fb26143bbacf6d6df1702ad39e4" + integrity sha512-dcX8JuYU/gvymzIHc9DgxTzUUTLexWwt8uCTWP3otys596io0L5aW02Gb1RjYpx2+0Jus1h4ZFqjla7umFniTg== + dependencies: + "@xtuc/ieee754" "^1.2.0" + +"@webassemblyjs/leb128@1.9.0": + version "1.9.0" + resolved "https://registry.yarnpkg.com/@webassemblyjs/leb128/-/leb128-1.9.0.tgz#f19ca0b76a6dc55623a09cffa769e838fa1e1c95" + integrity sha512-ENVzM5VwV1ojs9jam6vPys97B/S65YQtv/aanqnU7D8aSoHFX8GyhGg0CMfyKNIHBuAVjy3tlzd5QMMINa7wpw== + dependencies: + "@xtuc/long" "4.2.2" + +"@webassemblyjs/utf8@1.9.0": + version "1.9.0" + resolved "https://registry.yarnpkg.com/@webassemblyjs/utf8/-/utf8-1.9.0.tgz#04d33b636f78e6a6813227e82402f7637b6229ab" + integrity sha512-GZbQlWtopBTP0u7cHrEx+73yZKrQoBMpwkGEIqlacljhXCkVM1kMQge/Mf+csMJAjEdSwhOyLAS0AoR3AG5P8w== + +"@webassemblyjs/wasm-edit@1.9.0": + version "1.9.0" + resolved "https://registry.yarnpkg.com/@webassemblyjs/wasm-edit/-/wasm-edit-1.9.0.tgz#3fe6d79d3f0f922183aa86002c42dd256cfee9cf" + integrity sha512-FgHzBm80uwz5M8WKnMTn6j/sVbqilPdQXTWraSjBwFXSYGirpkSWE2R9Qvz9tNiTKQvoKILpCuTjBKzOIm0nxw== + dependencies: + "@webassemblyjs/ast" "1.9.0" + "@webassemblyjs/helper-buffer" "1.9.0" + "@webassemblyjs/helper-wasm-bytecode" "1.9.0" + "@webassemblyjs/helper-wasm-section" "1.9.0" + "@webassemblyjs/wasm-gen" "1.9.0" + "@webassemblyjs/wasm-opt" "1.9.0" + "@webassemblyjs/wasm-parser" "1.9.0" + "@webassemblyjs/wast-printer" "1.9.0" + +"@webassemblyjs/wasm-gen@1.9.0": + version "1.9.0" + resolved "https://registry.yarnpkg.com/@webassemblyjs/wasm-gen/-/wasm-gen-1.9.0.tgz#50bc70ec68ded8e2763b01a1418bf43491a7a49c" + integrity sha512-cPE3o44YzOOHvlsb4+E9qSqjc9Qf9Na1OO/BHFy4OI91XDE14MjFN4lTMezzaIWdPqHnsTodGGNP+iRSYfGkjA== + dependencies: + "@webassemblyjs/ast" "1.9.0" + "@webassemblyjs/helper-wasm-bytecode" "1.9.0" + "@webassemblyjs/ieee754" "1.9.0" + "@webassemblyjs/leb128" "1.9.0" + "@webassemblyjs/utf8" "1.9.0" + +"@webassemblyjs/wasm-opt@1.9.0": + version "1.9.0" + resolved "https://registry.yarnpkg.com/@webassemblyjs/wasm-opt/-/wasm-opt-1.9.0.tgz#2211181e5b31326443cc8112eb9f0b9028721a61" + integrity sha512-Qkjgm6Anhm+OMbIL0iokO7meajkzQD71ioelnfPEj6r4eOFuqm4YC3VBPqXjFyyNwowzbMD+hizmprP/Fwkl2A== + dependencies: + "@webassemblyjs/ast" "1.9.0" + "@webassemblyjs/helper-buffer" "1.9.0" + "@webassemblyjs/wasm-gen" "1.9.0" + "@webassemblyjs/wasm-parser" "1.9.0" + +"@webassemblyjs/wasm-parser@1.9.0": + version "1.9.0" + resolved "https://registry.yarnpkg.com/@webassemblyjs/wasm-parser/-/wasm-parser-1.9.0.tgz#9d48e44826df4a6598294aa6c87469d642fff65e" + integrity sha512-9+wkMowR2AmdSWQzsPEjFU7njh8HTO5MqO8vjwEHuM+AMHioNqSBONRdr0NQQ3dVQrzp0s8lTcYqzUdb7YgELA== + dependencies: + "@webassemblyjs/ast" "1.9.0" + "@webassemblyjs/helper-api-error" "1.9.0" + "@webassemblyjs/helper-wasm-bytecode" "1.9.0" + "@webassemblyjs/ieee754" "1.9.0" + "@webassemblyjs/leb128" "1.9.0" + "@webassemblyjs/utf8" "1.9.0" + +"@webassemblyjs/wast-parser@1.9.0": + version "1.9.0" + resolved "https://registry.yarnpkg.com/@webassemblyjs/wast-parser/-/wast-parser-1.9.0.tgz#3031115d79ac5bd261556cecc3fa90a3ef451914" + integrity sha512-qsqSAP3QQ3LyZjNC/0jBJ/ToSxfYJ8kYyuiGvtn/8MK89VrNEfwj7BPQzJVHi0jGTRK2dGdJ5PRqhtjzoww+bw== + dependencies: + "@webassemblyjs/ast" "1.9.0" + "@webassemblyjs/floating-point-hex-parser" "1.9.0" + "@webassemblyjs/helper-api-error" "1.9.0" + "@webassemblyjs/helper-code-frame" "1.9.0" + "@webassemblyjs/helper-fsm" "1.9.0" + "@xtuc/long" "4.2.2" + +"@webassemblyjs/wast-printer@1.9.0": + version "1.9.0" + resolved "https://registry.yarnpkg.com/@webassemblyjs/wast-printer/-/wast-printer-1.9.0.tgz#4935d54c85fef637b00ce9f52377451d00d47899" + integrity sha512-2J0nE95rHXHyQ24cWjMKJ1tqB/ds8z/cyeOZxJhcb+rW+SQASVjuznUSmdz5GpVJTzU8JkhYut0D3siFDD6wsA== + dependencies: + "@webassemblyjs/ast" "1.9.0" + "@webassemblyjs/wast-parser" "1.9.0" + "@xtuc/long" "4.2.2" + +"@xtuc/ieee754@^1.2.0": + version "1.2.0" + resolved "https://registry.yarnpkg.com/@xtuc/ieee754/-/ieee754-1.2.0.tgz#eef014a3145ae477a1cbc00cd1e552336dceb790" + integrity sha512-DX8nKgqcGwsc0eJSqYt5lwP4DH5FlHnmuWWBRy7X0NcaGR0ZtuyeESgMwTYVEtxmsNGY+qit4QYT/MIYTOTPeA== + +"@xtuc/long@4.2.2": + version "4.2.2" + resolved "https://registry.yarnpkg.com/@xtuc/long/-/long-4.2.2.tgz#d291c6a4e97989b5c61d9acf396ae4fe133a718d" + integrity sha512-NuHqBY1PB/D8xU6s/thBgOAiAP7HOYDQ32+BFZILJ8ivkUkAHQnWfn6WhL79Owj1qmUnoN/YPhktdIoucipkAQ== + +"@zeit/next-css@^1.0.1": + version "1.0.1" + resolved "https://registry.yarnpkg.com/@zeit/next-css/-/next-css-1.0.1.tgz#4f784e841e7ca1b21b3468a902e2c1fa95a3e75c" + integrity sha512-yfHPRy/ne/5SddVClsoy+fpU7e0Cs1gkWA67/wm2uIu+9rznF45yQLxHEt5dPGF3h6IiIh7ZtIgA8VV8YKq87A== + dependencies: + css-loader "1.0.0" + extracted-loader "1.0.4" + find-up "2.1.0" + ignore-loader "0.1.2" + mini-css-extract-plugin "0.4.3" + postcss-loader "3.0.0" + +acorn-jsx@^5.3.1: + version "5.3.2" + resolved "https://registry.yarnpkg.com/acorn-jsx/-/acorn-jsx-5.3.2.tgz#7ed5bb55908b3b2f1bc55c6af1653bada7f07937" + integrity sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ== + +acorn@^6.4.1: + version "6.4.2" + resolved "https://registry.yarnpkg.com/acorn/-/acorn-6.4.2.tgz#35866fd710528e92de10cf06016498e47e39e1e6" + integrity sha512-XtGIhXwF8YM8bJhGxG5kXgjkEuNGLTkoYqVE+KMR+aspr4KGYmKYg7yUe3KghyQ9yheNwLnjmzh/7+gfDBmHCQ== + +acorn@^7.4.0: + version "7.4.1" + resolved "https://registry.yarnpkg.com/acorn/-/acorn-7.4.1.tgz#feaed255973d2e77555b83dbc08851a6c63520fa" + integrity sha512-nQyp0o1/mNdbTO1PO6kHkwSrmgZ0MT/jCCpNiwbUjGoRN4dlBhqJtoQuCnEOKzgTVwg0ZWiCoQy6SxMebQVh8A== + +ajv-errors@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/ajv-errors/-/ajv-errors-1.0.1.tgz#f35986aceb91afadec4102fbd85014950cefa64d" + integrity sha512-DCRfO/4nQ+89p/RK43i8Ezd41EqdGIU4ld7nGF8OQ14oc/we5rEntLCUa7+jrn3nn83BosfwZA0wb4pon2o8iQ== + +ajv-keywords@^3.1.0, ajv-keywords@^3.4.1, ajv-keywords@^3.5.2: + version "3.5.2" + resolved "https://registry.yarnpkg.com/ajv-keywords/-/ajv-keywords-3.5.2.tgz#31f29da5ab6e00d1c2d329acf7b5929614d5014d" + integrity sha512-5p6WTN0DdTGVQk6VjcEju19IgaHudalcfabD7yhDGeA6bcQnmL+CpveLJq/3hvfwd1aof6L386Ougkx6RfyMIQ== + +ajv@^6.1.0, ajv@^6.10.0, ajv@^6.10.2, ajv@^6.12.4, ajv@^6.12.5: + version "6.12.6" + resolved "https://registry.yarnpkg.com/ajv/-/ajv-6.12.6.tgz#baf5a62e802b07d977034586f8c3baf5adf26df4" + integrity sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g== + dependencies: + fast-deep-equal "^3.1.1" + fast-json-stable-stringify "^2.0.0" + json-schema-traverse "^0.4.1" + uri-js "^4.2.2" + +ajv@^8.0.1: + version "8.6.3" + resolved "https://registry.yarnpkg.com/ajv/-/ajv-8.6.3.tgz#11a66527761dc3e9a3845ea775d2d3c0414e8764" + integrity sha512-SMJOdDP6LqTkD0Uq8qLi+gMwSt0imXLSV080qFVwJCpH9U6Mb+SUGHAXM0KNbcBPguytWyvFxcHgMLe2D2XSpw== + dependencies: + fast-deep-equal "^3.1.1" + json-schema-traverse "^1.0.0" + require-from-string "^2.0.2" + uri-js "^4.2.2" + +anser@1.4.9: + version "1.4.9" + resolved "https://registry.yarnpkg.com/anser/-/anser-1.4.9.tgz#1f85423a5dcf8da4631a341665ff675b96845760" + integrity sha512-AI+BjTeGt2+WFk4eWcqbQ7snZpDBt8SaLlj0RT2h5xfdWaiy51OjYvqwMrNzJLGy8iOAL6nKDITWO+rd4MkYEA== + +ansi-colors@^4.1.1: + version "4.1.1" + resolved "https://registry.yarnpkg.com/ansi-colors/-/ansi-colors-4.1.1.tgz#cbb9ae256bf750af1eab344f229aa27fe94ba348" + integrity sha512-JoX0apGbHaUJBNl6yF+p6JAFYZ666/hhCGKN5t9QFjbJQKUU/g8MNbFDbvfrgKXvI1QpZplPOnwIo99lX/AAmA== + +ansi-regex@^2.0.0: + version "2.1.1" + resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-2.1.1.tgz#c3b33ab5ee360d86e0e628f0468ae7ef27d654df" + integrity sha1-w7M6te42DYbg5ijwRorn7yfWVN8= + +ansi-regex@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-5.0.0.tgz#388539f55179bf39339c81af30a654d69f87cb75" + integrity sha512-bY6fj56OUQ0hU1KjFNDQuJFezqKdrAyFdIevADiqrWHwSlbmBNMHp5ak2f40Pm8JTFyM2mqxkG6ngkHO11f/lg== + +ansi-styles@^2.2.1: + version "2.2.1" + resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-2.2.1.tgz#b432dd3358b634cf75e1e4664368240533c1ddbe" + integrity sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4= + +ansi-styles@^3.2.1: + version "3.2.1" + resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-3.2.1.tgz#41fbb20243e50b12be0f04b8dedbf07520ce841d" + integrity sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA== + dependencies: + color-convert "^1.9.0" + +ansi-styles@^4.0.0, ansi-styles@^4.1.0: + version "4.3.0" + resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-4.3.0.tgz#edd803628ae71c04c85ae7a0906edad34b648937" + integrity sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg== + dependencies: + color-convert "^2.0.1" + +antd@^4.14.1: + version "4.16.13" + resolved "https://registry.yarnpkg.com/antd/-/antd-4.16.13.tgz#e9b9b4a590db28747aae1cab98981649a35880af" + integrity sha512-EMPD3fzKe7oayx9keD/GA1oKatcx7j5CGlkJj5eLS0/eEDDEkxVj3DFmKOPuHYt4BK7ltTzMFS+quSTmqUXPiw== + dependencies: + "@ant-design/colors" "^6.0.0" + "@ant-design/icons" "^4.6.3" + "@ant-design/react-slick" "~0.28.1" + "@babel/runtime" "^7.12.5" + array-tree-filter "^2.1.0" + classnames "^2.2.6" + copy-to-clipboard "^3.2.0" + lodash "^4.17.21" + moment "^2.25.3" + rc-cascader "~1.4.0" + rc-checkbox "~2.3.0" + rc-collapse "~3.1.0" + rc-dialog "~8.6.0" + rc-drawer "~4.3.0" + rc-dropdown "~3.2.0" + rc-field-form "~1.20.0" + rc-image "~5.2.5" + rc-input-number "~7.1.0" + rc-mentions "~1.6.1" + rc-menu "~9.0.12" + rc-motion "^2.4.0" + rc-notification "~4.5.7" + rc-pagination "~3.1.9" + rc-picker "~2.5.10" + rc-progress "~3.1.0" + rc-rate "~2.9.0" + rc-resize-observer "^1.0.0" + rc-select "~12.1.6" + rc-slider "~9.7.1" + rc-steps "~4.1.0" + rc-switch "~3.2.0" + rc-table "~7.15.1" + rc-tabs "~11.10.0" + rc-textarea "~0.3.0" + rc-tooltip "~5.1.1" + rc-tree "~4.2.1" + rc-tree-select "~4.3.0" + rc-trigger "^5.2.10" + rc-upload "~4.3.0" + rc-util "^5.13.1" + scroll-into-view-if-needed "^2.2.25" + +anymatch@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/anymatch/-/anymatch-2.0.0.tgz#bcb24b4f37934d9aa7ac17b4adaf89e7c76ef2eb" + integrity sha512-5teOsQWABXHHBFP9y3skS5P3d/WfWXpv3FUpy+LorMrNYaT9pI4oLMQX7jzQ2KklNpGpWHzdCXTDT2Y3XGlZBw== + dependencies: + micromatch "^3.1.4" + normalize-path "^2.1.1" + +anymatch@~3.1.1, anymatch@~3.1.2: + version "3.1.2" + resolved "https://registry.yarnpkg.com/anymatch/-/anymatch-3.1.2.tgz#c0557c096af32f106198f4f4e2a383537e378716" + integrity sha512-P43ePfOAIupkguHUycrc4qJ9kz8ZiuOUijaETwX7THt0Y/GNK7v0aa8rY816xWjZ7rJdA5XdMcpVFTKMq+RvWg== + dependencies: + normalize-path "^3.0.0" + picomatch "^2.0.4" + +aproba@^1.1.1: + version "1.2.0" + resolved "https://registry.yarnpkg.com/aproba/-/aproba-1.2.0.tgz#6802e6264efd18c790a1b0d517f0f2627bf2c94a" + integrity sha512-Y9J6ZjXtoYh8RnXVCMOU/ttDmk1aBjunq9vO0ta5x85WDQiQfUF9sIPBITdbiiIVcBo03Hi3jMxigBtsddlXRw== + +argparse@^1.0.7: + version "1.0.10" + resolved "https://registry.yarnpkg.com/argparse/-/argparse-1.0.10.tgz#bcd6791ea5ae09725e17e5ad988134cd40b3d911" + integrity sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg== + dependencies: + sprintf-js "~1.0.2" + +arr-diff@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/arr-diff/-/arr-diff-4.0.0.tgz#d6461074febfec71e7e15235761a329a5dc7c520" + integrity sha1-1kYQdP6/7HHn4VI1dhoyml3HxSA= + +arr-flatten@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/arr-flatten/-/arr-flatten-1.1.0.tgz#36048bbff4e7b47e136644316c99669ea5ae91f1" + integrity sha512-L3hKV5R/p5o81R7O02IGnwpDmkp6E982XhtbuwSe3O4qOtMMMtodicASA1Cny2U+aCXcNpml+m4dPsvsJ3jatg== + +arr-union@^3.1.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/arr-union/-/arr-union-3.1.0.tgz#e39b09aea9def866a8f206e288af63919bae39c4" + integrity sha1-45sJrqne+Gao8gbiiK9jkZuuOcQ= + +array-tree-filter@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/array-tree-filter/-/array-tree-filter-2.1.0.tgz#873ac00fec83749f255ac8dd083814b4f6329190" + integrity sha512-4ROwICNlNw/Hqa9v+rk5h22KjmzB1JGTMVKP2AKJBOCgb0yL0ASf0+YvCcLNNwquOHNX48jkeZIJ3a+oOQqKcw== + +array-union@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/array-union/-/array-union-2.1.0.tgz#b798420adbeb1de828d84acd8a2e23d3efe85e8d" + integrity sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw== + +array-unique@^0.3.2: + version "0.3.2" + resolved "https://registry.yarnpkg.com/array-unique/-/array-unique-0.3.2.tgz#a894b75d4bc4f6cd679ef3244a9fd8f46ae2d428" + integrity sha1-qJS3XUvE9s1nnvMkSp/Y9Gri1Cg= + +asn1.js@^5.2.0: + version "5.4.1" + resolved "https://registry.yarnpkg.com/asn1.js/-/asn1.js-5.4.1.tgz#11a980b84ebb91781ce35b0fdc2ee294e3783f07" + integrity sha512-+I//4cYPccV8LdmBLiX8CYvf9Sp3vQsrqu2QNXRcrbiWvcx/UdlFiqUJJzxRQxgsZmvhXhn4cSKeSmoFjVdupA== + dependencies: + bn.js "^4.0.0" + inherits "^2.0.1" + minimalistic-assert "^1.0.0" + safer-buffer "^2.1.0" + +assert@2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/assert/-/assert-2.0.0.tgz#95fc1c616d48713510680f2eaf2d10dd22e02d32" + integrity sha512-se5Cd+js9dXJnu6Ag2JFc00t+HmHOen+8Q+L7O9zI0PqQXr20uk2J0XQqMxZEeo5U50o8Nvmmx7dZrl+Ufr35A== + dependencies: + es6-object-assign "^1.1.0" + is-nan "^1.2.1" + object-is "^1.0.1" + util "^0.12.0" + +assert@^1.1.1: + version "1.5.0" + resolved "https://registry.yarnpkg.com/assert/-/assert-1.5.0.tgz#55c109aaf6e0aefdb3dc4b71240c70bf574b18eb" + integrity sha512-EDsgawzwoun2CZkCgtxJbv392v4nbk9XDD06zI+kQYoBM/3RBWLlEyJARDOmhAAosBjWACEkKL6S+lIZtcAubA== + dependencies: + object-assign "^4.1.1" + util "0.10.3" + +assign-symbols@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/assign-symbols/-/assign-symbols-1.0.0.tgz#59667f41fadd4f20ccbc2bb96b8d4f7f78ec0367" + integrity sha1-WWZ/QfrdTyDMvCu5a41Pf3jsA2c= + +ast-types@0.13.2: + version "0.13.2" + resolved "https://registry.yarnpkg.com/ast-types/-/ast-types-0.13.2.tgz#df39b677a911a83f3a049644fb74fdded23cea48" + integrity sha512-uWMHxJxtfj/1oZClOxDEV1sQ1HCDkA4MG8Gr69KKeBjEVH0R84WlejZ0y2DcwyBlpAEMltmVYkVgqfLFb2oyiA== + +astral-regex@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/astral-regex/-/astral-regex-2.0.0.tgz#483143c567aeed4785759c0865786dc77d7d2e31" + integrity sha512-Z7tMw1ytTXt5jqMcOP+OQteU1VuNK9Y02uuJtKQ1Sv69jXQKKg5cibLwGJow8yzZP+eAc18EmLGPal0bp36rvQ== + +async-each@^1.0.1: + version "1.0.3" + resolved "https://registry.yarnpkg.com/async-each/-/async-each-1.0.3.tgz#b727dbf87d7651602f06f4d4ac387f47d91b0cbf" + integrity sha512-z/WhQ5FPySLdvREByI2vZiTWwCnF0moMJ1hK9YQwDTHKh6I7/uSckMetoRGb5UBZPC1z0jlw+n/XCgjeH7y1AQ== + +async-validator@^3.0.3: + version "3.5.2" + resolved "https://registry.yarnpkg.com/async-validator/-/async-validator-3.5.2.tgz#68e866a96824e8b2694ff7a831c1a25c44d5e500" + integrity sha512-8eLCg00W9pIRZSB781UUX/H6Oskmm8xloZfr09lz5bikRpBVDlJ3hRVuxxP1SxcwsEYfJ4IU8Q19Y8/893r3rQ== + +atob@^2.1.2: + version "2.1.2" + resolved "https://registry.yarnpkg.com/atob/-/atob-2.1.2.tgz#6d9517eb9e030d2436666651e86bd9f6f13533c9" + integrity sha512-Wm6ukoaOGJi/73p/cl2GvLjTI5JM1k/O14isD73YML8StrH/7/lRFgmg8nICZgD3bZZvjwCGxtMOD3wWNAu8cg== + +available-typed-arrays@^1.0.5: + version "1.0.5" + resolved "https://registry.yarnpkg.com/available-typed-arrays/-/available-typed-arrays-1.0.5.tgz#92f95616501069d07d10edb2fc37d3e1c65123b7" + integrity sha512-DMD0KiN46eipeziST1LPP/STfDU0sufISXmjSgvVsoU2tqxctQeASejWcfNtxYKqETM1UxQ8sp2OrSBWpHY6sw== + +axios@^0.21.4: + version "0.21.4" + resolved "https://registry.yarnpkg.com/axios/-/axios-0.21.4.tgz#c67b90dc0568e5c1cf2b0b858c43ba28e2eda575" + integrity sha512-ut5vewkiu8jjGBdqpM44XxjuCjq9LAKeHVmoVfHVzy8eHgxxq8SbAVQNovDA8mVi05kP0Ea/n/UzcSHcTJQfNg== + dependencies: + follow-redirects "^1.14.0" + +babel-code-frame@^6.26.0: + version "6.26.0" + resolved "https://registry.yarnpkg.com/babel-code-frame/-/babel-code-frame-6.26.0.tgz#63fd43f7dc1e3bb7ce35947db8fe369a3f58c74b" + integrity sha1-Y/1D99weO7fONZR9uP42mj9Yx0s= + dependencies: + chalk "^1.1.3" + esutils "^2.0.2" + js-tokens "^3.0.2" + +babel-loader@^8.2.2: + version "8.2.2" + resolved "https://registry.yarnpkg.com/babel-loader/-/babel-loader-8.2.2.tgz#9363ce84c10c9a40e6c753748e1441b60c8a0b81" + integrity sha512-JvTd0/D889PQBtUXJ2PXaKU/pjZDMtHA9V2ecm+eNRmmBCMR09a+fmpGTNwnJtFmFl5Ei7Vy47LjBb+L0wQ99g== + dependencies: + find-cache-dir "^3.3.1" + loader-utils "^1.4.0" + make-dir "^3.1.0" + schema-utils "^2.6.5" + +babel-plugin-import@^1.13.3: + version "1.13.3" + resolved "https://registry.yarnpkg.com/babel-plugin-import/-/babel-plugin-import-1.13.3.tgz#9dbbba7d1ac72bd412917a830d445e00941d26d7" + integrity sha512-1qCWdljJOrDRH/ybaCZuDgySii4yYrtQ8OJQwrcDqdt0y67N30ng3X3nABg6j7gR7qUJgcMa9OMhc4AGViDwWw== + dependencies: + "@babel/helper-module-imports" "^7.0.0" + "@babel/runtime" "^7.0.0" + +babel-plugin-syntax-jsx@6.18.0: + version "6.18.0" + resolved "https://registry.yarnpkg.com/babel-plugin-syntax-jsx/-/babel-plugin-syntax-jsx-6.18.0.tgz#0af32a9a6e13ca7a3fd5069e62d7b0f58d0d8946" + integrity sha1-CvMqmm4Tyno/1QaeYtew9Y0NiUY= + +balanced-match@^1.0.0: + version "1.0.2" + resolved "https://registry.yarnpkg.com/balanced-match/-/balanced-match-1.0.2.tgz#e83e3a7e3f300b34cb9d87f615fa0cbf357690ee" + integrity sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw== + +base64-js@^1.0.2: + version "1.5.1" + resolved "https://registry.yarnpkg.com/base64-js/-/base64-js-1.5.1.tgz#1b1b440160a5bf7ad40b650f095963481903930a" + integrity sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA== + +base@^0.11.1: + version "0.11.2" + resolved "https://registry.yarnpkg.com/base/-/base-0.11.2.tgz#7bde5ced145b6d551a90db87f83c558b4eb48a8f" + integrity sha512-5T6P4xPgpp0YDFvSWwEZ4NoE3aM4QBQXDzmVbraCkFj8zHM+mba8SyqB5DbZWyR7mYHo6Y7BdQo3MoA4m0TeQg== + dependencies: + cache-base "^1.0.1" + class-utils "^0.3.5" + component-emitter "^1.2.1" + define-property "^1.0.0" + isobject "^3.0.1" + mixin-deep "^1.2.0" + pascalcase "^0.1.1" + +big.js@^5.2.2: + version "5.2.2" + resolved "https://registry.yarnpkg.com/big.js/-/big.js-5.2.2.tgz#65f0af382f578bcdc742bd9c281e9cb2d7768328" + integrity sha512-vyL2OymJxmarO8gxMr0mhChsO9QGwhynfuu4+MHTAW6czfq9humCB7rKpUjDd9YUiDPU4mzpyupFSvOClAwbmQ== + +binary-extensions@^1.0.0: + version "1.13.1" + resolved "https://registry.yarnpkg.com/binary-extensions/-/binary-extensions-1.13.1.tgz#598afe54755b2868a5330d2aff9d4ebb53209b65" + integrity sha512-Un7MIEDdUC5gNpcGDV97op1Ywk748MpHcFTHoYs6qnj1Z3j7I53VG3nwZhKzoBZmbdRNnb6WRdFlwl7tSDuZGw== + +binary-extensions@^2.0.0: + version "2.2.0" + resolved "https://registry.yarnpkg.com/binary-extensions/-/binary-extensions-2.2.0.tgz#75f502eeaf9ffde42fc98829645be4ea76bd9e2d" + integrity sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA== + +bindings@^1.5.0: + version "1.5.0" + resolved "https://registry.yarnpkg.com/bindings/-/bindings-1.5.0.tgz#10353c9e945334bc0511a6d90b38fbc7c9c504df" + integrity sha512-p2q/t/mhvuOj/UeLlV6566GD/guowlr0hHxClI0W9m7MWYkL1F0hLo+0Aexs9HSPCtR1SXQ0TD3MMKrXZajbiQ== + dependencies: + file-uri-to-path "1.0.0" + +bluebird@^3.5.5: + version "3.7.2" + resolved "https://registry.yarnpkg.com/bluebird/-/bluebird-3.7.2.tgz#9f229c15be272454ffa973ace0dbee79a1b0c36f" + integrity sha512-XpNj6GDQzdfW+r2Wnn7xiSAd7TM3jzkxGXBGTtWKuSXv1xUV+azxAm8jdWZN06QTQk+2N2XB9jRDkvbmQmcRtg== + +bn.js@^4.0.0, bn.js@^4.1.0, bn.js@^4.11.9: + version "4.12.0" + resolved "https://registry.yarnpkg.com/bn.js/-/bn.js-4.12.0.tgz#775b3f278efbb9718eec7361f483fb36fbbfea88" + integrity sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA== + +bn.js@^5.0.0, bn.js@^5.1.1: + version "5.2.0" + resolved "https://registry.yarnpkg.com/bn.js/-/bn.js-5.2.0.tgz#358860674396c6997771a9d051fcc1b57d4ae002" + integrity sha512-D7iWRBvnZE8ecXiLj/9wbxH7Tk79fAh8IHaTNq1RWRixsS02W+5qS+iE9yq6RYl0asXx5tw0bLhmT5pIfbSquw== + +brace-expansion@^1.1.7: + version "1.1.11" + resolved "https://registry.yarnpkg.com/brace-expansion/-/brace-expansion-1.1.11.tgz#3c7fcbf529d87226f3d2f52b966ff5271eb441dd" + integrity sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA== + dependencies: + balanced-match "^1.0.0" + concat-map "0.0.1" + +braces@^2.3.1, braces@^2.3.2: + version "2.3.2" + resolved "https://registry.yarnpkg.com/braces/-/braces-2.3.2.tgz#5979fd3f14cd531565e5fa2df1abfff1dfaee729" + integrity sha512-aNdbnj9P8PjdXU4ybaWLK2IF3jc/EoDYbC7AazW6to3TRsfXxscC9UXOB5iDiEQrkyIbWp2SLQda4+QAa7nc3w== + dependencies: + arr-flatten "^1.1.0" + array-unique "^0.3.2" + extend-shallow "^2.0.1" + fill-range "^4.0.0" + isobject "^3.0.1" + repeat-element "^1.1.2" + snapdragon "^0.8.1" + snapdragon-node "^2.0.1" + split-string "^3.0.2" + to-regex "^3.0.1" + +braces@^3.0.1, braces@~3.0.2: + version "3.0.2" + resolved "https://registry.yarnpkg.com/braces/-/braces-3.0.2.tgz#3454e1a462ee8d599e236df336cd9ea4f8afe107" + integrity sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A== + dependencies: + fill-range "^7.0.1" + +brorand@^1.0.1, brorand@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/brorand/-/brorand-1.1.0.tgz#12c25efe40a45e3c323eb8675a0a0ce57b22371f" + integrity sha1-EsJe/kCkXjwyPrhnWgoM5XsiNx8= + +browserify-aes@^1.0.0, browserify-aes@^1.0.4: + version "1.2.0" + resolved "https://registry.yarnpkg.com/browserify-aes/-/browserify-aes-1.2.0.tgz#326734642f403dabc3003209853bb70ad428ef48" + integrity sha512-+7CHXqGuspUn/Sl5aO7Ea0xWGAtETPXNSAjHo48JfLdPWcMng33Xe4znFvQweqc/uzk5zSOI3H52CYnjCfb5hA== + dependencies: + buffer-xor "^1.0.3" + cipher-base "^1.0.0" + create-hash "^1.1.0" + evp_bytestokey "^1.0.3" + inherits "^2.0.1" + safe-buffer "^5.0.1" + +browserify-cipher@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/browserify-cipher/-/browserify-cipher-1.0.1.tgz#8d6474c1b870bfdabcd3bcfcc1934a10e94f15f0" + integrity sha512-sPhkz0ARKbf4rRQt2hTpAHqn47X3llLkUGn+xEJzLjwY8LRs2p0v7ljvI5EyoRO/mexrNunNECisZs+gw2zz1w== + dependencies: + browserify-aes "^1.0.4" + browserify-des "^1.0.0" + evp_bytestokey "^1.0.0" + +browserify-des@^1.0.0: + version "1.0.2" + resolved "https://registry.yarnpkg.com/browserify-des/-/browserify-des-1.0.2.tgz#3af4f1f59839403572f1c66204375f7a7f703e9c" + integrity sha512-BioO1xf3hFwz4kc6iBhI3ieDFompMhrMlnDFC4/0/vd5MokpuAc3R+LYbwTA9A5Yc9pq9UYPqffKpW2ObuwX5A== + dependencies: + cipher-base "^1.0.1" + des.js "^1.0.0" + inherits "^2.0.1" + safe-buffer "^5.1.2" + +browserify-rsa@^4.0.0, browserify-rsa@^4.0.1: + version "4.1.0" + resolved "https://registry.yarnpkg.com/browserify-rsa/-/browserify-rsa-4.1.0.tgz#b2fd06b5b75ae297f7ce2dc651f918f5be158c8d" + integrity sha512-AdEER0Hkspgno2aR97SAf6vi0y0k8NuOpGnVH3O99rcA5Q6sh8QxcngtHuJ6uXwnfAXNM4Gn1Gb7/MV1+Ymbog== + dependencies: + bn.js "^5.0.0" + randombytes "^2.0.1" + +browserify-sign@^4.0.0: + version "4.2.1" + resolved "https://registry.yarnpkg.com/browserify-sign/-/browserify-sign-4.2.1.tgz#eaf4add46dd54be3bb3b36c0cf15abbeba7956c3" + integrity sha512-/vrA5fguVAKKAVTNJjgSm1tRQDHUU6DbwO9IROu/0WAzC8PKhucDSh18J0RMvVeHAn5puMd+QHC2erPRNf8lmg== + dependencies: + bn.js "^5.1.1" + browserify-rsa "^4.0.1" + create-hash "^1.2.0" + create-hmac "^1.1.7" + elliptic "^6.5.3" + inherits "^2.0.4" + parse-asn1 "^5.1.5" + readable-stream "^3.6.0" + safe-buffer "^5.2.0" + +browserify-zlib@0.2.0, browserify-zlib@^0.2.0: + version "0.2.0" + resolved "https://registry.yarnpkg.com/browserify-zlib/-/browserify-zlib-0.2.0.tgz#2869459d9aa3be245fe8fe2ca1f46e2e7f54d73f" + integrity sha512-Z942RysHXmJrhqk88FmKBVq/v5tqmSkDz7p54G/MGyjMnCFFnC79XWNbg+Vta8W6Wb2qtSZTSxIGkJrRpCFEiA== + dependencies: + pako "~1.0.5" + +browserslist@4.16.6: + version "4.16.6" + resolved "https://registry.yarnpkg.com/browserslist/-/browserslist-4.16.6.tgz#d7901277a5a88e554ed305b183ec9b0c08f66fa2" + integrity sha512-Wspk/PqO+4W9qp5iUTJsa1B/QrYn1keNCcEP5OvP7WBwT4KaDly0uONYmC6Xa3Z5IqnUgS0KcgLYu1l74x0ZXQ== + dependencies: + caniuse-lite "^1.0.30001219" + colorette "^1.2.2" + electron-to-chromium "^1.3.723" + escalade "^3.1.1" + node-releases "^1.1.71" + +browserslist@^4.16.6: + version "4.17.0" + resolved "https://registry.yarnpkg.com/browserslist/-/browserslist-4.17.0.tgz#1fcd81ec75b41d6d4994fb0831b92ac18c01649c" + integrity sha512-g2BJ2a0nEYvEFQC208q8mVAhfNwpZ5Mu8BwgtCdZKO3qx98HChmeg448fPdUzld8aFmfLgVh7yymqV+q1lJZ5g== + dependencies: + caniuse-lite "^1.0.30001254" + colorette "^1.3.0" + electron-to-chromium "^1.3.830" + escalade "^3.1.1" + node-releases "^1.1.75" + +buffer-from@^1.0.0: + version "1.1.2" + resolved "https://registry.yarnpkg.com/buffer-from/-/buffer-from-1.1.2.tgz#2b146a6fd72e80b4f55d255f35ed59a3a9a41bd5" + integrity sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ== + +buffer-xor@^1.0.3: + version "1.0.3" + resolved "https://registry.yarnpkg.com/buffer-xor/-/buffer-xor-1.0.3.tgz#26e61ed1422fb70dd42e6e36729ed51d855fe8d9" + integrity sha1-JuYe0UIvtw3ULm42cp7VHYVf6Nk= + +buffer@5.6.0: + version "5.6.0" + resolved "https://registry.yarnpkg.com/buffer/-/buffer-5.6.0.tgz#a31749dc7d81d84db08abf937b6b8c4033f62786" + integrity sha512-/gDYp/UtU0eA1ys8bOs9J6a+E/KWIY+DZ+Q2WESNUA0jFRsJOc0SNUO6xJ5SGA1xueg3NL65W6s+NY5l9cunuw== + dependencies: + base64-js "^1.0.2" + ieee754 "^1.1.4" + +buffer@^4.3.0: + version "4.9.2" + resolved "https://registry.yarnpkg.com/buffer/-/buffer-4.9.2.tgz#230ead344002988644841ab0244af8c44bbe3ef8" + integrity sha512-xq+q3SRMOxGivLhBNaUdC64hDTQwejJ+H0T/NB1XMtTVEwNTrfFF3gAxiyW0Bu/xWEGhjVKgUcMhCrUy2+uCWg== + dependencies: + base64-js "^1.0.2" + ieee754 "^1.1.4" + isarray "^1.0.0" + +builtin-status-codes@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/builtin-status-codes/-/builtin-status-codes-3.0.0.tgz#85982878e21b98e1c66425e03d0174788f569ee8" + integrity sha1-hZgoeOIbmOHGZCXgPQF0eI9Wnug= + +bytes@3.1.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/bytes/-/bytes-3.1.0.tgz#f6cf7933a360e0588fa9fde85651cdc7f805d1f6" + integrity sha512-zauLjrfCG+xvoyaqLoV8bLVXXNGC4JqlxFCutSDWA6fJrTo2ZuvLYTqZ7aHBLZSMOopbzwv8f+wZcVzfVTI2Dg== + +cacache@^12.0.2: + version "12.0.4" + resolved "https://registry.yarnpkg.com/cacache/-/cacache-12.0.4.tgz#668bcbd105aeb5f1d92fe25570ec9525c8faa40c" + integrity sha512-a0tMB40oefvuInr4Cwb3GerbL9xTj1D5yg0T5xrjGCGyfvbxseIXX7BAO/u/hIXdafzOI5JC3wDwHyf24buOAQ== + dependencies: + bluebird "^3.5.5" + chownr "^1.1.1" + figgy-pudding "^3.5.1" + glob "^7.1.4" + graceful-fs "^4.1.15" + infer-owner "^1.0.3" + lru-cache "^5.1.1" + mississippi "^3.0.0" + mkdirp "^0.5.1" + move-concurrently "^1.0.1" + promise-inflight "^1.0.1" + rimraf "^2.6.3" + ssri "^6.0.1" + unique-filename "^1.1.1" + y18n "^4.0.0" + +cache-base@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/cache-base/-/cache-base-1.0.1.tgz#0a7f46416831c8b662ee36fe4e7c59d76f666ab2" + integrity sha512-AKcdTnFSWATd5/GCPRxr2ChwIJ85CeyrEyjRHlKxQ56d4XJMGym0uAiKn0xbLOGOl3+yRpOTi484dVCEc5AUzQ== + dependencies: + collection-visit "^1.0.0" + component-emitter "^1.2.1" + get-value "^2.0.6" + has-value "^1.0.0" + isobject "^3.0.1" + set-value "^2.0.0" + to-object-path "^0.3.0" + union-value "^1.0.0" + unset-value "^1.0.0" + +call-bind@^1.0.0, call-bind@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/call-bind/-/call-bind-1.0.2.tgz#b1d4e89e688119c3c9a903ad30abb2f6a919be3c" + integrity sha512-7O+FbCihrB5WGbFYesctwmTKae6rOiIzmz1icreWJ+0aA7LJfuqhEso2T9ncpcFtzMQtzXf2QGGueWJGTYsqrA== + dependencies: + function-bind "^1.1.1" + get-intrinsic "^1.0.2" + +caller-callsite@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/caller-callsite/-/caller-callsite-2.0.0.tgz#847e0fce0a223750a9a027c54b33731ad3154134" + integrity sha1-hH4PzgoiN1CpoCfFSzNzGtMVQTQ= + dependencies: + callsites "^2.0.0" + +caller-path@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/caller-path/-/caller-path-2.0.0.tgz#468f83044e369ab2010fac5f06ceee15bb2cb1f4" + integrity sha1-Ro+DBE42mrIBD6xfBs7uFbsssfQ= + dependencies: + caller-callsite "^2.0.0" + +callsites@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/callsites/-/callsites-2.0.0.tgz#06eb84f00eea413da86affefacbffb36093b3c50" + integrity sha1-BuuE8A7qQT2oav/vrL/7Ngk7PFA= + +callsites@^3.0.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/callsites/-/callsites-3.1.0.tgz#b3630abd8943432f54b3f0519238e33cd7df2f73" + integrity sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ== + +caniuse-lite@^1.0.30001202, caniuse-lite@^1.0.30001219, caniuse-lite@^1.0.30001228, caniuse-lite@^1.0.30001254: + version "1.0.30001255" + resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30001255.tgz#f3b09b59ab52e39e751a569523618f47c4298ca0" + integrity sha512-F+A3N9jTZL882f/fg/WWVnKSu6IOo3ueLz4zwaOPbPYHNmM/ZaDUyzyJwS1mZhX7Ex5jqTyW599Gdelh5PDYLQ== + +chalk@2.4.2, chalk@^2.0.0, chalk@^2.4.1, chalk@^2.4.2: + version "2.4.2" + resolved "https://registry.yarnpkg.com/chalk/-/chalk-2.4.2.tgz#cd42541677a54333cf541a49108c1432b44c9424" + integrity sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ== + dependencies: + ansi-styles "^3.2.1" + escape-string-regexp "^1.0.5" + supports-color "^5.3.0" + +chalk@4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/chalk/-/chalk-4.0.0.tgz#6e98081ed2d17faab615eb52ac66ec1fe6209e72" + integrity sha512-N9oWFcegS0sFr9oh1oz2d7Npos6vNoWW9HvtCg5N1KRFpUhaAhvTv5Y58g880fZaEYSNm3qDz8SU1UrGvp+n7A== + dependencies: + ansi-styles "^4.1.0" + supports-color "^7.1.0" + +chalk@^1.1.3: + version "1.1.3" + resolved "https://registry.yarnpkg.com/chalk/-/chalk-1.1.3.tgz#a8115c55e4a702fe4d150abd3872822a7e09fc98" + integrity sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg= + dependencies: + ansi-styles "^2.2.1" + escape-string-regexp "^1.0.2" + has-ansi "^2.0.0" + strip-ansi "^3.0.0" + supports-color "^2.0.0" + +chalk@^4.0.0: + version "4.1.2" + resolved "https://registry.yarnpkg.com/chalk/-/chalk-4.1.2.tgz#aac4e2b7734a740867aeb16bf02aad556a1e7a01" + integrity sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA== + dependencies: + ansi-styles "^4.1.0" + supports-color "^7.1.0" + +chokidar@3.5.1: + version "3.5.1" + resolved "https://registry.yarnpkg.com/chokidar/-/chokidar-3.5.1.tgz#ee9ce7bbebd2b79f49f304799d5468e31e14e68a" + integrity sha512-9+s+Od+W0VJJzawDma/gvBNQqkTiqYTWLuZoyAsivsI4AaWTCzHG06/TMjsf1cYe9Cb97UCEhjz7HvnPk2p/tw== + dependencies: + anymatch "~3.1.1" + braces "~3.0.2" + glob-parent "~5.1.0" + is-binary-path "~2.1.0" + is-glob "~4.0.1" + normalize-path "~3.0.0" + readdirp "~3.5.0" + optionalDependencies: + fsevents "~2.3.1" + +chokidar@^2.1.8: + version "2.1.8" + resolved "https://registry.yarnpkg.com/chokidar/-/chokidar-2.1.8.tgz#804b3a7b6a99358c3c5c61e71d8728f041cff917" + integrity sha512-ZmZUazfOzf0Nve7duiCKD23PFSCs4JPoYyccjUFF3aQkQadqBhfzhjkwBH2mNOG9cTBwhamM37EIsIkZw3nRgg== + dependencies: + anymatch "^2.0.0" + async-each "^1.0.1" + braces "^2.3.2" + glob-parent "^3.1.0" + inherits "^2.0.3" + is-binary-path "^1.0.0" + is-glob "^4.0.0" + normalize-path "^3.0.0" + path-is-absolute "^1.0.0" + readdirp "^2.2.1" + upath "^1.1.1" + optionalDependencies: + fsevents "^1.2.7" + +chokidar@^3.4.1: + version "3.5.2" + resolved "https://registry.yarnpkg.com/chokidar/-/chokidar-3.5.2.tgz#dba3976fcadb016f66fd365021d91600d01c1e75" + integrity sha512-ekGhOnNVPgT77r4K/U3GDhu+FQ2S8TnK/s2KbIGXi0SZWuwkZ2QNyfWdZW+TVfn84DpEP7rLeCt2UI6bJ8GwbQ== + dependencies: + anymatch "~3.1.2" + braces "~3.0.2" + glob-parent "~5.1.2" + is-binary-path "~2.1.0" + is-glob "~4.0.1" + normalize-path "~3.0.0" + readdirp "~3.6.0" + optionalDependencies: + fsevents "~2.3.2" + +chownr@^1.1.1: + version "1.1.4" + resolved "https://registry.yarnpkg.com/chownr/-/chownr-1.1.4.tgz#6fc9d7b42d32a583596337666e7d08084da2cc6b" + integrity sha512-jJ0bqzaylmJtVnNgzTeSOs8DPavpbYgEr/b0YL8/2GO3xJEhInFmhKMUnEJQjZumK7KXGFhUy89PrsJWlakBVg== + +chrome-trace-event@^1.0.2: + version "1.0.3" + resolved "https://registry.yarnpkg.com/chrome-trace-event/-/chrome-trace-event-1.0.3.tgz#1015eced4741e15d06664a957dbbf50d041e26ac" + integrity sha512-p3KULyQg4S7NIHixdwbGX+nFHkoBiA4YQmyWtjb8XngSKV124nJmRysgAeujbUVb15vh+RvFUfCPqU7rXk+hZg== + +cipher-base@^1.0.0, cipher-base@^1.0.1, cipher-base@^1.0.3: + version "1.0.4" + resolved "https://registry.yarnpkg.com/cipher-base/-/cipher-base-1.0.4.tgz#8760e4ecc272f4c363532f926d874aae2c1397de" + integrity sha512-Kkht5ye6ZGmwv40uUDZztayT2ThLQGfnj/T71N/XzeZeo3nf8foyW7zGTsPYkEya3m5f3cAypH+qe7YOrM1U2Q== + dependencies: + inherits "^2.0.1" + safe-buffer "^5.0.1" + +class-utils@^0.3.5: + version "0.3.6" + resolved "https://registry.yarnpkg.com/class-utils/-/class-utils-0.3.6.tgz#f93369ae8b9a7ce02fd41faad0ca83033190c463" + integrity sha512-qOhPa/Fj7s6TY8H8esGu5QNpMMQxz79h+urzrNYN6mn+9BnxlDGf5QZ+XeCDsxSjPqsSR56XOZOJmpeurnLMeg== + dependencies: + arr-union "^3.1.0" + define-property "^0.2.5" + isobject "^3.0.0" + static-extend "^0.1.1" + +classnames@2.2.6: + version "2.2.6" + resolved "https://registry.yarnpkg.com/classnames/-/classnames-2.2.6.tgz#43935bffdd291f326dad0a205309b38d00f650ce" + integrity sha512-JR/iSQOSt+LQIWwrwEzJ9uk0xfN3mTVYMwt1Ir5mUcSN6pU+V4zQFFaJsclJbPuAUQH+yfWef6tm7l1quW3C8Q== + +classnames@2.x, classnames@^2.2.1, classnames@^2.2.3, classnames@^2.2.5, classnames@^2.2.6: + version "2.3.1" + resolved "https://registry.yarnpkg.com/classnames/-/classnames-2.3.1.tgz#dfcfa3891e306ec1dad105d0e88f4417b8535e8e" + integrity sha512-OlQdbZ7gLfGarSqxesMesDa5uz7KFbID8Kpq/SxIoNGDqY8lSYs0D+hhtBXhcdB3rcbXArFr7vlHheLk1voeNA== + +clone@^2.1.2: + version "2.1.2" + resolved "https://registry.yarnpkg.com/clone/-/clone-2.1.2.tgz#1b7f4b9f591f1e8f83670401600345a02887435f" + integrity sha1-G39Ln1kfHo+DZwQBYANFoCiHQ18= + +collection-visit@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/collection-visit/-/collection-visit-1.0.0.tgz#4bc0373c164bc3291b4d368c829cf1a80a59dca0" + integrity sha1-S8A3PBZLwykbTTaMgpzxqApZ3KA= + dependencies: + map-visit "^1.0.0" + object-visit "^1.0.0" + +color-convert@^1.9.0: + version "1.9.3" + resolved "https://registry.yarnpkg.com/color-convert/-/color-convert-1.9.3.tgz#bb71850690e1f136567de629d2d5471deda4c1e8" + integrity sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg== + dependencies: + color-name "1.1.3" + +color-convert@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/color-convert/-/color-convert-2.0.1.tgz#72d3a68d598c9bdb3af2ad1e84f21d896abd4de3" + integrity sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ== + dependencies: + color-name "~1.1.4" + +color-name@1.1.3: + version "1.1.3" + resolved "https://registry.yarnpkg.com/color-name/-/color-name-1.1.3.tgz#a7d0558bd89c42f795dd42328f740831ca53bc25" + integrity sha1-p9BVi9icQveV3UIyj3QIMcpTvCU= + +color-name@~1.1.4: + version "1.1.4" + resolved "https://registry.yarnpkg.com/color-name/-/color-name-1.1.4.tgz#c2a09a87acbde69543de6f63fa3995c826c536a2" + integrity sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA== + +colorette@^1.2.2, colorette@^1.3.0: + version "1.4.0" + resolved "https://registry.yarnpkg.com/colorette/-/colorette-1.4.0.tgz#5190fbb87276259a86ad700bff2c6d6faa3fca40" + integrity sha512-Y2oEozpomLn7Q3HFP7dpww7AtMJplbM9lGZP6RDfHqmbeRjiwRg4n6VM6j4KLmRke85uWEI7JqF17f3pqdRA0g== + +commander@^2.20.0: + version "2.20.3" + resolved "https://registry.yarnpkg.com/commander/-/commander-2.20.3.tgz#fd485e84c03eb4881c20722ba48035e8531aeb33" + integrity sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ== + +commondir@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/commondir/-/commondir-1.0.1.tgz#ddd800da0c66127393cca5950ea968a3aaf1253b" + integrity sha1-3dgA2gxmEnOTzKWVDqloo6rxJTs= + +component-emitter@^1.2.1: + version "1.3.0" + resolved "https://registry.yarnpkg.com/component-emitter/-/component-emitter-1.3.0.tgz#16e4070fba8ae29b679f2215853ee181ab2eabc0" + integrity sha512-Rd3se6QB+sO1TwqZjscQrurpEPIfO0/yYnSin6Q/rD3mOutHvUrCAhJub3r90uNb+SESBuE0QYoB90YdfatsRg== + +compute-scroll-into-view@^1.0.17: + version "1.0.17" + resolved "https://registry.yarnpkg.com/compute-scroll-into-view/-/compute-scroll-into-view-1.0.17.tgz#6a88f18acd9d42e9cf4baa6bec7e0522607ab7ab" + integrity sha512-j4dx+Fb0URmzbwwMUrhqWM2BEWHdFGx+qZ9qqASHRPqvTYdqvWnHg0H1hIbcyLnvgnoNAVMlwkepyqM3DaIFUg== + +concat-map@0.0.1: + version "0.0.1" + resolved "https://registry.yarnpkg.com/concat-map/-/concat-map-0.0.1.tgz#d8a96bd77fd68df7793a73036a3ba0d5405d477b" + integrity sha1-2Klr13/Wjfd5OnMDajug1UBdR3s= + +concat-stream@^1.5.0: + version "1.6.2" + resolved "https://registry.yarnpkg.com/concat-stream/-/concat-stream-1.6.2.tgz#904bdf194cd3122fc675c77fc4ac3d4ff0fd1a34" + integrity sha512-27HBghJxjiZtIk3Ycvn/4kbJk/1uZuJFfuPEns6LaEvpvG1f0hTea8lilrouyo9mVc2GWdcEZ8OLoGmSADlrCw== + dependencies: + buffer-from "^1.0.0" + inherits "^2.0.3" + readable-stream "^2.2.2" + typedarray "^0.0.6" + +console-browserify@^1.1.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/console-browserify/-/console-browserify-1.2.0.tgz#67063cef57ceb6cf4993a2ab3a55840ae8c49336" + integrity sha512-ZMkYO/LkF17QvCPqM0gxw8yUzigAOZOSWSHg91FH6orS7vcEj5dVZTidN2fQ14yBSdg97RqhSNwLUXInd52OTA== + +constants-browserify@1.0.0, constants-browserify@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/constants-browserify/-/constants-browserify-1.0.0.tgz#c20b96d8c617748aaf1c16021760cd27fcb8cb75" + integrity sha1-wguW2MYXdIqvHBYCF2DNJ/y4y3U= + +convert-source-map@1.7.0: + version "1.7.0" + resolved "https://registry.yarnpkg.com/convert-source-map/-/convert-source-map-1.7.0.tgz#17a2cb882d7f77d3490585e2ce6c524424a3a442" + integrity sha512-4FJkXzKXEDB1snCFZlLP4gpC3JILicCpGbzG9f9G7tGqGCzETQ2hWPrcinA9oU4wtf2biUaEH5065UnMeR33oA== + dependencies: + safe-buffer "~5.1.1" + +convert-source-map@^1.7.0: + version "1.8.0" + resolved "https://registry.yarnpkg.com/convert-source-map/-/convert-source-map-1.8.0.tgz#f3373c32d21b4d780dd8004514684fb791ca4369" + integrity sha512-+OQdjP49zViI/6i7nIJpA8rAl4sV/JdPfU9nZs3VqOwGIgizICvuN2ru6fMd+4llL0tar18UYJXfZ/TWtmhUjA== + dependencies: + safe-buffer "~5.1.1" + +copy-anything@^2.0.1: + version "2.0.3" + resolved "https://registry.yarnpkg.com/copy-anything/-/copy-anything-2.0.3.tgz#842407ba02466b0df844819bbe3baebbe5d45d87" + integrity sha512-GK6QUtisv4fNS+XcI7shX0Gx9ORg7QqIznyfho79JTnX1XhLiyZHfftvGiziqzRiEi/Bjhgpi+D2o7HxJFPnDQ== + dependencies: + is-what "^3.12.0" + +copy-concurrently@^1.0.0: + version "1.0.5" + resolved "https://registry.yarnpkg.com/copy-concurrently/-/copy-concurrently-1.0.5.tgz#92297398cae34937fcafd6ec8139c18051f0b5e0" + integrity sha512-f2domd9fsVDFtaFcbaRZuYXwtdmnzqbADSwhSWYxYB/Q8zsdUUFMXVRwXGDMWmbEzAn1kdRrtI1T/KTFOL4X2A== + dependencies: + aproba "^1.1.1" + fs-write-stream-atomic "^1.0.8" + iferr "^0.1.5" + mkdirp "^0.5.1" + rimraf "^2.5.4" + run-queue "^1.0.0" + +copy-descriptor@^0.1.0: + version "0.1.1" + resolved "https://registry.yarnpkg.com/copy-descriptor/-/copy-descriptor-0.1.1.tgz#676f6eb3c39997c2ee1ac3a924fd6124748f578d" + integrity sha1-Z29us8OZl8LuGsOpJP1hJHSPV40= + +copy-to-clipboard@^3.2.0: + version "3.3.1" + resolved "https://registry.yarnpkg.com/copy-to-clipboard/-/copy-to-clipboard-3.3.1.tgz#115aa1a9998ffab6196f93076ad6da3b913662ae" + integrity sha512-i13qo6kIHTTpCm8/Wup+0b1mVWETvu2kIMzKoK8FpkLkFxlt0znUAHcMzox+T8sPlqtZXq3CulEjQHsYiGFJUw== + dependencies: + toggle-selection "^1.0.6" + +core-util-is@~1.0.0: + version "1.0.3" + resolved "https://registry.yarnpkg.com/core-util-is/-/core-util-is-1.0.3.tgz#a6042d3634c2b27e9328f837b965fac83808db85" + integrity sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ== + +cosmiconfig@^5.0.0: + version "5.2.1" + resolved "https://registry.yarnpkg.com/cosmiconfig/-/cosmiconfig-5.2.1.tgz#040f726809c591e77a17c0a3626ca45b4f168b1a" + integrity sha512-H65gsXo1SKjf8zmrJ67eJk8aIRKV5ff2D4uKZIBZShbhGSpEmsQOPW/SKMKYhSTrqR7ufy6RP69rPogdaPh/kA== + dependencies: + import-fresh "^2.0.0" + is-directory "^0.3.1" + js-yaml "^3.13.1" + parse-json "^4.0.0" + +create-ecdh@^4.0.0: + version "4.0.4" + resolved "https://registry.yarnpkg.com/create-ecdh/-/create-ecdh-4.0.4.tgz#d6e7f4bffa66736085a0762fd3a632684dabcc4e" + integrity sha512-mf+TCx8wWc9VpuxfP2ht0iSISLZnt0JgWlrOKZiNqyUZWnjIaCIVNQArMHnCZKfEYRg6IM7A+NeJoN8gf/Ws0A== + dependencies: + bn.js "^4.1.0" + elliptic "^6.5.3" + +create-hash@^1.1.0, create-hash@^1.1.2, create-hash@^1.2.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/create-hash/-/create-hash-1.2.0.tgz#889078af11a63756bcfb59bd221996be3a9ef196" + integrity sha512-z00bCGNHDG8mHAkP7CtT1qVu+bFQUPjYq/4Iv3C3kWjTFV10zIjfSoeqXo9Asws8gwSHDGj/hl2u4OGIjapeCg== + dependencies: + cipher-base "^1.0.1" + inherits "^2.0.1" + md5.js "^1.3.4" + ripemd160 "^2.0.1" + sha.js "^2.4.0" + +create-hmac@^1.1.0, create-hmac@^1.1.4, create-hmac@^1.1.7: + version "1.1.7" + resolved "https://registry.yarnpkg.com/create-hmac/-/create-hmac-1.1.7.tgz#69170c78b3ab957147b2b8b04572e47ead2243ff" + integrity sha512-MJG9liiZ+ogc4TzUwuvbER1JRdgvUFSB5+VR/g5h82fGaIRWMWddtKBHi7/sVhfjQZ6SehlyhvQYrcYkaUIpLg== + dependencies: + cipher-base "^1.0.3" + create-hash "^1.1.0" + inherits "^2.0.1" + ripemd160 "^2.0.0" + safe-buffer "^5.0.1" + sha.js "^2.4.8" + +cross-spawn@^7.0.2: + version "7.0.3" + resolved "https://registry.yarnpkg.com/cross-spawn/-/cross-spawn-7.0.3.tgz#f73a85b9d5d41d045551c177e2882d4ac85728a6" + integrity sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w== + dependencies: + path-key "^3.1.0" + shebang-command "^2.0.0" + which "^2.0.1" + +crypto-browserify@3.12.0, crypto-browserify@^3.11.0: + version "3.12.0" + resolved "https://registry.yarnpkg.com/crypto-browserify/-/crypto-browserify-3.12.0.tgz#396cf9f3137f03e4b8e532c58f698254e00f80ec" + integrity sha512-fz4spIh+znjO2VjL+IdhEpRJ3YN6sMzITSBijk6FK2UvTqruSQW+/cCZTSNsMiZNvUeq0CqurF+dAbyiGOY6Wg== + dependencies: + browserify-cipher "^1.0.0" + browserify-sign "^4.0.0" + create-ecdh "^4.0.0" + create-hash "^1.1.0" + create-hmac "^1.1.0" + diffie-hellman "^5.0.0" + inherits "^2.0.1" + pbkdf2 "^3.0.3" + public-encrypt "^4.0.0" + randombytes "^2.0.0" + randomfill "^1.0.3" + +css-loader@1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/css-loader/-/css-loader-1.0.0.tgz#9f46aaa5ca41dbe31860e3b62b8e23c42916bf56" + integrity sha512-tMXlTYf3mIMt3b0dDCOQFJiVvxbocJ5Ho577WiGPYPZcqVEO218L2iU22pDXzkTZCLDE+9AmGSUkWxeh/nZReA== + dependencies: + babel-code-frame "^6.26.0" + css-selector-tokenizer "^0.7.0" + icss-utils "^2.1.0" + loader-utils "^1.0.2" + lodash.camelcase "^4.3.0" + postcss "^6.0.23" + postcss-modules-extract-imports "^1.2.0" + postcss-modules-local-by-default "^1.2.0" + postcss-modules-scope "^1.1.0" + postcss-modules-values "^1.3.0" + postcss-value-parser "^3.3.0" + source-list-map "^2.0.0" + +css-selector-tokenizer@^0.7.0: + version "0.7.3" + resolved "https://registry.yarnpkg.com/css-selector-tokenizer/-/css-selector-tokenizer-0.7.3.tgz#735f26186e67c749aaf275783405cf0661fae8f1" + integrity sha512-jWQv3oCEL5kMErj4wRnK/OPoBi0D+P1FR2cDCKYPaMeD2eW3/mttav8HT4hT1CKopiJI/psEULjkClhvJo4Lvg== + dependencies: + cssesc "^3.0.0" + fastparse "^1.1.2" + +css.escape@1.5.1: + version "1.5.1" + resolved "https://registry.yarnpkg.com/css.escape/-/css.escape-1.5.1.tgz#42e27d4fa04ae32f931a4b4d4191fa9cddee97cb" + integrity sha1-QuJ9T6BK4y+TGktNQZH6nN3ul8s= + +cssesc@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/cssesc/-/cssesc-3.0.0.tgz#37741919903b868565e1c09ea747445cd18983ee" + integrity sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg== + +cssnano-preset-simple@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/cssnano-preset-simple/-/cssnano-preset-simple-2.0.0.tgz#b55e72cb970713f425560a0e141b0335249e2f96" + integrity sha512-HkufSLkaBJbKBFx/7aj5HmCK9Ni/JedRQm0mT2qBzMG/dEuJOLnMt2lK6K1rwOOyV4j9aSY+knbW9WoS7BYpzg== + dependencies: + caniuse-lite "^1.0.30001202" + +cssnano-simple@2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/cssnano-simple/-/cssnano-simple-2.0.0.tgz#930d9dcd8ba105c5a62ce719cb00854da58b5c05" + integrity sha512-0G3TXaFxlh/szPEG/o3VcmCwl0N3E60XNb9YZZijew5eIs6fLjJuOPxQd9yEBaX2p/YfJtt49i4vYi38iH6/6w== + dependencies: + cssnano-preset-simple "^2.0.0" + +csstype@^3.0.2: + version "3.0.8" + resolved "https://registry.yarnpkg.com/csstype/-/csstype-3.0.8.tgz#d2266a792729fb227cd216fb572f43728e1ad340" + integrity sha512-jXKhWqXPmlUeoQnF/EhTtTl4C9SnrxSH/jZUih3jmO6lBKr99rP3/+FmrMj4EFpOXzMtXHAZkd3x0E6h6Fgflw== + +cyclist@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/cyclist/-/cyclist-1.0.1.tgz#596e9698fd0c80e12038c2b82d6eb1b35b6224d9" + integrity sha1-WW6WmP0MgOEgOMK4LW6xs1tiJNk= + +data-uri-to-buffer@3.0.1: + version "3.0.1" + resolved "https://registry.yarnpkg.com/data-uri-to-buffer/-/data-uri-to-buffer-3.0.1.tgz#594b8973938c5bc2c33046535785341abc4f3636" + integrity sha512-WboRycPNsVw3B3TL559F7kuBUM4d8CgMEvk6xEJlOp7OBPjt6G7z8WMWlD2rOFZLk6OYfFIUGsCOWzcQH9K2og== + +date-fns@2.x: + version "2.23.0" + resolved "https://registry.yarnpkg.com/date-fns/-/date-fns-2.23.0.tgz#4e886c941659af0cf7b30fafdd1eaa37e88788a9" + integrity sha512-5ycpauovVyAk0kXNZz6ZoB9AYMZB4DObse7P3BPWmyEjXNORTI8EJ6X0uaSAq4sCHzM1uajzrkr6HnsLQpxGXA== + +dayjs@1.x: + version "1.10.6" + resolved "https://registry.yarnpkg.com/dayjs/-/dayjs-1.10.6.tgz#288b2aa82f2d8418a6c9d4df5898c0737ad02a63" + integrity sha512-AztC/IOW4L1Q41A86phW5Thhcrco3xuAA+YX/BLpLWWjRcTj5TOt/QImBLmCKlrF7u7k47arTnOyL6GnbG8Hvw== + +debug@2, debug@^2.2.0, debug@^2.3.3: + version "2.6.9" + resolved "https://registry.yarnpkg.com/debug/-/debug-2.6.9.tgz#5d128515df134ff327e90a4c93f4e077a536341f" + integrity sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA== + dependencies: + ms "2.0.0" + +debug@^3.2.6: + version "3.2.7" + resolved "https://registry.yarnpkg.com/debug/-/debug-3.2.7.tgz#72580b7e9145fb39b6676f9c5e5fb100b934179a" + integrity sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ== + dependencies: + ms "^2.1.1" + +debug@^4.0.1, debug@^4.1.0, debug@^4.1.1, debug@^4.3.1: + version "4.3.2" + resolved "https://registry.yarnpkg.com/debug/-/debug-4.3.2.tgz#f0a49c18ac8779e31d4a0c6029dfb76873c7428b" + integrity sha512-mOp8wKcvj7XxC78zLgw/ZA+6TSgkoE2C/ienthhRD298T7UNwAg9diBpLRxC0mOezLl4B0xV7M0cCO6P/O0Xhw== + dependencies: + ms "2.1.2" + +decode-uri-component@^0.2.0: + version "0.2.0" + resolved "https://registry.yarnpkg.com/decode-uri-component/-/decode-uri-component-0.2.0.tgz#eb3913333458775cb84cd1a1fae062106bb87545" + integrity sha1-6zkTMzRYd1y4TNGh+uBiEGu4dUU= + +deep-is@^0.1.3: + version "0.1.4" + resolved "https://registry.yarnpkg.com/deep-is/-/deep-is-0.1.4.tgz#a6f2dce612fadd2ef1f519b73551f17e85199831" + integrity sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ== + +define-properties@^1.1.3: + version "1.1.3" + resolved "https://registry.yarnpkg.com/define-properties/-/define-properties-1.1.3.tgz#cf88da6cbee26fe6db7094f61d870cbd84cee9f1" + integrity sha512-3MqfYKj2lLzdMSf8ZIZE/V+Zuy+BgD6f164e8K2w7dgnpKArBDerGYpM46IYYcjnkdPNMjPk9A6VFB8+3SKlXQ== + dependencies: + object-keys "^1.0.12" + +define-property@^0.2.5: + version "0.2.5" + resolved "https://registry.yarnpkg.com/define-property/-/define-property-0.2.5.tgz#c35b1ef918ec3c990f9a5bc57be04aacec5c8116" + integrity sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY= + dependencies: + is-descriptor "^0.1.0" + +define-property@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/define-property/-/define-property-1.0.0.tgz#769ebaaf3f4a63aad3af9e8d304c9bbe79bfb0e6" + integrity sha1-dp66rz9KY6rTr56NMEybvnm/sOY= + dependencies: + is-descriptor "^1.0.0" + +define-property@^2.0.2: + version "2.0.2" + resolved "https://registry.yarnpkg.com/define-property/-/define-property-2.0.2.tgz#d459689e8d654ba77e02a817f8710d702cb16e9d" + integrity sha512-jwK2UV4cnPpbcG7+VRARKTZPUWowwXA8bzH5NP6ud0oeAxyYPuGZUAC7hMugpCdz4BeSZl2Dl9k66CHJ/46ZYQ== + dependencies: + is-descriptor "^1.0.2" + isobject "^3.0.1" + +depd@~1.1.2: + version "1.1.2" + resolved "https://registry.yarnpkg.com/depd/-/depd-1.1.2.tgz#9bcd52e14c097763e749b274c4346ed2e560b5a9" + integrity sha1-m81S4UwJd2PnSbJ0xDRu0uVgtak= + +dequal@2.0.2: + version "2.0.2" + resolved "https://registry.yarnpkg.com/dequal/-/dequal-2.0.2.tgz#85ca22025e3a87e65ef75a7a437b35284a7e319d" + integrity sha512-q9K8BlJVxK7hQYqa6XISGmBZbtQQWVXSrRrWreHC94rMt1QL/Impruc+7p2CYSYuVIUr+YCt6hjrs1kkdJRTug== + +des.js@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/des.js/-/des.js-1.0.1.tgz#5382142e1bdc53f85d86d53e5f4aa7deb91e0843" + integrity sha512-Q0I4pfFrv2VPd34/vfLrFOoRmlYj3OV50i7fskps1jZWK1kApMWWT9G6RRUeYedLcBDIhnSDaUvJMb3AhUlaEA== + dependencies: + inherits "^2.0.1" + minimalistic-assert "^1.0.0" + +diffie-hellman@^5.0.0: + version "5.0.3" + resolved "https://registry.yarnpkg.com/diffie-hellman/-/diffie-hellman-5.0.3.tgz#40e8ee98f55a2149607146921c63e1ae5f3d2875" + integrity sha512-kqag/Nl+f3GwyK25fhUMYj81BUOrZ9IuJsjIcDE5icNM9FJHAVm3VcUDxdLPoQtTuUylWm6ZIknYJwwaPxsUzg== + dependencies: + bn.js "^4.1.0" + miller-rabin "^4.0.0" + randombytes "^2.0.0" + +dir-glob@^3.0.1: + version "3.0.1" + resolved "https://registry.yarnpkg.com/dir-glob/-/dir-glob-3.0.1.tgz#56dbf73d992a4a93ba1584f4534063fd2e41717f" + integrity sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA== + dependencies: + path-type "^4.0.0" + +doctrine@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/doctrine/-/doctrine-3.0.0.tgz#addebead72a6574db783639dc87a121773973961" + integrity sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w== + dependencies: + esutils "^2.0.2" + +dom-align@^1.7.0: + version "1.12.2" + resolved "https://registry.yarnpkg.com/dom-align/-/dom-align-1.12.2.tgz#0f8164ebd0c9c21b0c790310493cd855892acd4b" + integrity sha512-pHuazgqrsTFrGU2WLDdXxCFabkdQDx72ddkraZNih1KsMcN5qsRSTR9O4VJRlwTPCPb5COYg3LOfiMHHcPInHg== + +domain-browser@4.19.0: + version "4.19.0" + resolved "https://registry.yarnpkg.com/domain-browser/-/domain-browser-4.19.0.tgz#1093e17c0a17dbd521182fe90d49ac1370054af1" + integrity sha512-fRA+BaAWOR/yr/t7T9E9GJztHPeFjj8U35ajyAjCDtAAnTn1Rc1f6W6VGPJrO1tkQv9zWu+JRof7z6oQtiYVFQ== + +domain-browser@^1.1.1: + version "1.2.0" + resolved "https://registry.yarnpkg.com/domain-browser/-/domain-browser-1.2.0.tgz#3d31f50191a6749dd1375a7f522e823d42e54eda" + integrity sha512-jnjyiM6eRyZl2H+W8Q/zLMA481hzi0eszAaBUzIVnmYVDBbnLxVNnfu1HgEBvCbL+71FrxMl3E6lpKH7Ge3OXA== + +duplexify@^3.4.2, duplexify@^3.6.0: + version "3.7.1" + resolved "https://registry.yarnpkg.com/duplexify/-/duplexify-3.7.1.tgz#2a4df5317f6ccfd91f86d6fd25d8d8a103b88309" + integrity sha512-07z8uv2wMyS51kKhD1KsdXJg5WQ6t93RneqRxUHnskXVtlYYkLqM0gqStQZ3pj073g687jPCHrqNfCzawLYh5g== + dependencies: + end-of-stream "^1.0.0" + inherits "^2.0.1" + readable-stream "^2.0.0" + stream-shift "^1.0.0" + +electron-to-chromium@^1.3.723, electron-to-chromium@^1.3.830: + version "1.3.833" + resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.3.833.tgz#e1394eb32ab8a9430ffd7d5adf632ce6c3b05e18" + integrity sha512-h+9aVaUHjyunLqtCjJF2jrJ73tYcJqo2cCGKtVAXH9WmnBsb8hiChRQ0P1uXjdxR6Wcfxibephy41c1YlZA/pA== + +elliptic@^6.5.3: + version "6.5.4" + resolved "https://registry.yarnpkg.com/elliptic/-/elliptic-6.5.4.tgz#da37cebd31e79a1367e941b592ed1fbebd58abbb" + integrity sha512-iLhC6ULemrljPZb+QutR5TQGB+pdW6KGD5RSegS+8sorOZT+rdQFbsQFJgvN3eRqNALqJer4oQ16YvJHlU8hzQ== + dependencies: + bn.js "^4.11.9" + brorand "^1.1.0" + hash.js "^1.0.0" + hmac-drbg "^1.0.1" + inherits "^2.0.4" + minimalistic-assert "^1.0.1" + minimalistic-crypto-utils "^1.0.1" + +emoji-regex@^8.0.0: + version "8.0.0" + resolved "https://registry.yarnpkg.com/emoji-regex/-/emoji-regex-8.0.0.tgz#e818fd69ce5ccfcb404594f842963bf53164cc37" + integrity sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A== + +emojis-list@^2.0.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/emojis-list/-/emojis-list-2.1.0.tgz#4daa4d9db00f9819880c79fa457ae5b09a1fd389" + integrity sha1-TapNnbAPmBmIDHn6RXrlsJof04k= + +emojis-list@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/emojis-list/-/emojis-list-3.0.0.tgz#5570662046ad29e2e916e71aae260abdff4f6a78" + integrity sha512-/kyM18EfinwXZbno9FyUGeFh87KC8HRQBQGildHZbEuRyWFOmv1U10o9BBp8XVZDVNNuQKyIGIu5ZYAAXJ0V2Q== + +encoding@0.1.13: + version "0.1.13" + resolved "https://registry.yarnpkg.com/encoding/-/encoding-0.1.13.tgz#56574afdd791f54a8e9b2785c0582a2d26210fa9" + integrity sha512-ETBauow1T35Y/WZMkio9jiM0Z5xjHHmJ4XmjZOq1l/dXz3lr2sRn87nJy20RupqSh1F2m3HHPSp8ShIPQJrJ3A== + dependencies: + iconv-lite "^0.6.2" + +end-of-stream@^1.0.0, end-of-stream@^1.1.0: + version "1.4.4" + resolved "https://registry.yarnpkg.com/end-of-stream/-/end-of-stream-1.4.4.tgz#5ae64a5f45057baf3626ec14da0ca5e4b2431eb0" + integrity sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q== + dependencies: + once "^1.4.0" + +enhanced-resolve@^4.5.0: + version "4.5.0" + resolved "https://registry.yarnpkg.com/enhanced-resolve/-/enhanced-resolve-4.5.0.tgz#2f3cfd84dbe3b487f18f2db2ef1e064a571ca5ec" + integrity sha512-Nv9m36S/vxpsI+Hc4/ZGRs0n9mXqSWGGq49zxb/cJfPAQMbUtttJAlNPS4AQzaBdw/pKskw5bMbekT/Y7W/Wlg== + dependencies: + graceful-fs "^4.1.2" + memory-fs "^0.5.0" + tapable "^1.0.0" + +enquirer@^2.3.5: + version "2.3.6" + resolved "https://registry.yarnpkg.com/enquirer/-/enquirer-2.3.6.tgz#2a7fe5dd634a1e4125a975ec994ff5456dc3734d" + integrity sha512-yjNnPr315/FjS4zIsUxYguYUPP2e1NK4d7E7ZOLiyYCcbFBiTMyID+2wvm2w6+pZ/odMA7cRkjhsPbltwBOrLg== + dependencies: + ansi-colors "^4.1.1" + +errno@^0.1.1, errno@^0.1.3, errno@~0.1.7: + version "0.1.8" + resolved "https://registry.yarnpkg.com/errno/-/errno-0.1.8.tgz#8bb3e9c7d463be4976ff888f76b4809ebc2e811f" + integrity sha512-dJ6oBr5SQ1VSd9qkk7ByRgb/1SH4JZjCHSW/mr63/QcXO9zLVxvJ6Oy13nio03rxpSnVDDjFor75SjVeZWPW/A== + dependencies: + prr "~1.0.1" + +error-ex@^1.3.1: + version "1.3.2" + resolved "https://registry.yarnpkg.com/error-ex/-/error-ex-1.3.2.tgz#b4ac40648107fdcdcfae242f428bea8a14d4f1bf" + integrity sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g== + dependencies: + is-arrayish "^0.2.1" + +es-abstract@^1.18.5: + version "1.18.6" + resolved "https://registry.yarnpkg.com/es-abstract/-/es-abstract-1.18.6.tgz#2c44e3ea7a6255039164d26559777a6d978cb456" + integrity sha512-kAeIT4cku5eNLNuUKhlmtuk1/TRZvQoYccn6TO0cSVdf1kzB0T7+dYuVK9MWM7l+/53W2Q8M7N2c6MQvhXFcUQ== + dependencies: + call-bind "^1.0.2" + es-to-primitive "^1.2.1" + function-bind "^1.1.1" + get-intrinsic "^1.1.1" + get-symbol-description "^1.0.0" + has "^1.0.3" + has-symbols "^1.0.2" + internal-slot "^1.0.3" + is-callable "^1.2.4" + is-negative-zero "^2.0.1" + is-regex "^1.1.4" + is-string "^1.0.7" + object-inspect "^1.11.0" + object-keys "^1.1.1" + object.assign "^4.1.2" + string.prototype.trimend "^1.0.4" + string.prototype.trimstart "^1.0.4" + unbox-primitive "^1.0.1" + +es-to-primitive@^1.2.1: + version "1.2.1" + resolved "https://registry.yarnpkg.com/es-to-primitive/-/es-to-primitive-1.2.1.tgz#e55cd4c9cdc188bcefb03b366c736323fc5c898a" + integrity sha512-QCOllgZJtaUo9miYBcLChTUaHNjJF3PYs1VidD7AwiEj1kYxKeQTctLAezAOH5ZKRH0g2IgPn6KwB4IT8iRpvA== + dependencies: + is-callable "^1.1.4" + is-date-object "^1.0.1" + is-symbol "^1.0.2" + +es6-object-assign@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/es6-object-assign/-/es6-object-assign-1.1.0.tgz#c2c3582656247c39ea107cb1e6652b6f9f24523c" + integrity sha1-wsNYJlYkfDnqEHyx5mUrb58kUjw= + +escalade@^3.1.1: + version "3.1.1" + resolved "https://registry.yarnpkg.com/escalade/-/escalade-3.1.1.tgz#d8cfdc7000965c5a0174b4a82eaa5c0552742e40" + integrity sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw== + +escape-string-regexp@^1.0.2, escape-string-regexp@^1.0.5: + version "1.0.5" + resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz#1b61c0562190a8dff6ae3bb2cf0200ca130b86d4" + integrity sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ= + +escape-string-regexp@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz#14ba83a5d373e3d311e5afca29cf5bfad965bf34" + integrity sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA== + +eslint-config-prettier@^8.3.0: + version "8.3.0" + resolved "https://registry.yarnpkg.com/eslint-config-prettier/-/eslint-config-prettier-8.3.0.tgz#f7471b20b6fe8a9a9254cc684454202886a2dd7a" + integrity sha512-BgZuLUSeKzvlL/VUjx/Yb787VQ26RU3gGjA3iiFvdsp/2bMfVIWUVP7tjxtjS0e+HP409cPlPvNkQloz8C91ew== + +eslint-plugin-prettier@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/eslint-plugin-prettier/-/eslint-plugin-prettier-4.0.0.tgz#8b99d1e4b8b24a762472b4567992023619cb98e0" + integrity sha512-98MqmCJ7vJodoQK359bqQWaxOE0CS8paAz/GgjaZLyex4TTk3g9HugoO89EqWCrFiOqn9EVvcoo7gZzONCWVwQ== + dependencies: + prettier-linter-helpers "^1.0.0" + +eslint-scope@^4.0.3: + version "4.0.3" + resolved "https://registry.yarnpkg.com/eslint-scope/-/eslint-scope-4.0.3.tgz#ca03833310f6889a3264781aa82e63eb9cfe7848" + integrity sha512-p7VutNr1O/QrxysMo3E45FjYDTeXBy0iTltPFNSqKAIfjDSXC+4dj+qfyuD8bfAXrW/y6lW3O76VaYNPKfpKrg== + dependencies: + esrecurse "^4.1.0" + estraverse "^4.1.1" + +eslint-scope@^5.1.1: + version "5.1.1" + resolved "https://registry.yarnpkg.com/eslint-scope/-/eslint-scope-5.1.1.tgz#e786e59a66cb92b3f6c1fb0d508aab174848f48c" + integrity sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw== + dependencies: + esrecurse "^4.3.0" + estraverse "^4.1.1" + +eslint-utils@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/eslint-utils/-/eslint-utils-2.1.0.tgz#d2de5e03424e707dc10c74068ddedae708741b27" + integrity sha512-w94dQYoauyvlDc43XnGB8lU3Zt713vNChgt4EWwhXAP2XkBvndfxF0AgIqKOOasjPIPzj9JqgwkwbCYD0/V3Zg== + dependencies: + eslint-visitor-keys "^1.1.0" + +eslint-utils@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/eslint-utils/-/eslint-utils-3.0.0.tgz#8aebaface7345bb33559db0a1f13a1d2d48c3672" + integrity sha512-uuQC43IGctw68pJA1RgbQS8/NP7rch6Cwd4j3ZBtgo4/8Flj4eGE7ZYSZRN3iq5pVUv6GPdW5Z1RFleo84uLDA== + dependencies: + eslint-visitor-keys "^2.0.0" + +eslint-visitor-keys@^1.1.0, eslint-visitor-keys@^1.3.0: + version "1.3.0" + resolved "https://registry.yarnpkg.com/eslint-visitor-keys/-/eslint-visitor-keys-1.3.0.tgz#30ebd1ef7c2fdff01c3a4f151044af25fab0523e" + integrity sha512-6J72N8UNa462wa/KFODt/PJ3IU60SDpC3QXC1Hjc1BXXpfL2C9R5+AU7jhe0F6GREqVMh4Juu+NY7xn+6dipUQ== + +eslint-visitor-keys@^2.0.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/eslint-visitor-keys/-/eslint-visitor-keys-2.1.0.tgz#f65328259305927392c938ed44eb0a5c9b2bd303" + integrity sha512-0rSmRBzXgDzIsD6mGdJgevzgezI534Cer5L/vyMX0kHzT/jiB43jRhd9YUlMGYLQy2zprNmoT8qasCGtY+QaKw== + +eslint@^7.32.0: + version "7.32.0" + resolved "https://registry.yarnpkg.com/eslint/-/eslint-7.32.0.tgz#c6d328a14be3fb08c8d1d21e12c02fdb7a2a812d" + integrity sha512-VHZ8gX+EDfz+97jGcgyGCyRia/dPOd6Xh9yPv8Bl1+SoaIwD+a/vlrOmGRUyOYu7MwUhc7CxqeaDZU13S4+EpA== + dependencies: + "@babel/code-frame" "7.12.11" + "@eslint/eslintrc" "^0.4.3" + "@humanwhocodes/config-array" "^0.5.0" + ajv "^6.10.0" + chalk "^4.0.0" + cross-spawn "^7.0.2" + debug "^4.0.1" + doctrine "^3.0.0" + enquirer "^2.3.5" + escape-string-regexp "^4.0.0" + eslint-scope "^5.1.1" + eslint-utils "^2.1.0" + eslint-visitor-keys "^2.0.0" + espree "^7.3.1" + esquery "^1.4.0" + esutils "^2.0.2" + fast-deep-equal "^3.1.3" + file-entry-cache "^6.0.1" + functional-red-black-tree "^1.0.1" + glob-parent "^5.1.2" + globals "^13.6.0" + ignore "^4.0.6" + import-fresh "^3.0.0" + imurmurhash "^0.1.4" + is-glob "^4.0.0" + js-yaml "^3.13.1" + json-stable-stringify-without-jsonify "^1.0.1" + levn "^0.4.1" + lodash.merge "^4.6.2" + minimatch "^3.0.4" + natural-compare "^1.4.0" + optionator "^0.9.1" + progress "^2.0.0" + regexpp "^3.1.0" + semver "^7.2.1" + strip-ansi "^6.0.0" + strip-json-comments "^3.1.0" + table "^6.0.9" + text-table "^0.2.0" + v8-compile-cache "^2.0.3" + +espree@^7.3.0, espree@^7.3.1: + version "7.3.1" + resolved "https://registry.yarnpkg.com/espree/-/espree-7.3.1.tgz#f2df330b752c6f55019f8bd89b7660039c1bbbb6" + integrity sha512-v3JCNCE64umkFpmkFGqzVKsOT0tN1Zr+ueqLZfpV1Ob8e+CEgPWa+OxCoGH3tnhimMKIaBm4m/vaRpJ/krRz2g== + dependencies: + acorn "^7.4.0" + acorn-jsx "^5.3.1" + eslint-visitor-keys "^1.3.0" + +esprima@^4.0.0: + version "4.0.1" + resolved "https://registry.yarnpkg.com/esprima/-/esprima-4.0.1.tgz#13b04cdb3e6c5d19df91ab6987a8695619b0aa71" + integrity sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A== + +esquery@^1.4.0: + version "1.4.0" + resolved "https://registry.yarnpkg.com/esquery/-/esquery-1.4.0.tgz#2148ffc38b82e8c7057dfed48425b3e61f0f24a5" + integrity sha512-cCDispWt5vHHtwMY2YrAQ4ibFkAL8RbH5YGBnZBc90MolvvfkkQcJro/aZiAQUlQ3qgrYS6D6v8Gc5G5CQsc9w== + dependencies: + estraverse "^5.1.0" + +esrecurse@^4.1.0, esrecurse@^4.3.0: + version "4.3.0" + resolved "https://registry.yarnpkg.com/esrecurse/-/esrecurse-4.3.0.tgz#7ad7964d679abb28bee72cec63758b1c5d2c9921" + integrity sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag== + dependencies: + estraverse "^5.2.0" + +estraverse@^4.1.1: + version "4.3.0" + resolved "https://registry.yarnpkg.com/estraverse/-/estraverse-4.3.0.tgz#398ad3f3c5a24948be7725e83d11a7de28cdbd1d" + integrity sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw== + +estraverse@^5.1.0, estraverse@^5.2.0: + version "5.2.0" + resolved "https://registry.yarnpkg.com/estraverse/-/estraverse-5.2.0.tgz#307df42547e6cc7324d3cf03c155d5cdb8c53880" + integrity sha512-BxbNGGNm0RyRYvUdHpIwv9IWzeM9XClbOxwoATuFdOE7ZE6wHL+HQ5T8hoPM+zHvmKzzsEqhgy0GrQ5X13afiQ== + +esutils@^2.0.2: + version "2.0.3" + resolved "https://registry.yarnpkg.com/esutils/-/esutils-2.0.3.tgz#74d2eb4de0b8da1293711910d50775b9b710ef64" + integrity sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g== + +etag@1.8.1: + version "1.8.1" + resolved "https://registry.yarnpkg.com/etag/-/etag-1.8.1.tgz#41ae2eeb65efa62268aebfea83ac7d79299b0887" + integrity sha1-Qa4u62XvpiJorr/qg6x9eSmbCIc= + +events@^3.0.0: + version "3.3.0" + resolved "https://registry.yarnpkg.com/events/-/events-3.3.0.tgz#31a95ad0a924e2d2c419a813aeb2c4e878ea7400" + integrity sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q== + +evp_bytestokey@^1.0.0, evp_bytestokey@^1.0.3: + version "1.0.3" + resolved "https://registry.yarnpkg.com/evp_bytestokey/-/evp_bytestokey-1.0.3.tgz#7fcbdb198dc71959432efe13842684e0525acb02" + integrity sha512-/f2Go4TognH/KvCISP7OUsHn85hT9nUkxxA9BEWxFn+Oj9o8ZNLm/40hdlgSLyuOimsrTKLUMEorQexp/aPQeA== + dependencies: + md5.js "^1.3.4" + safe-buffer "^5.1.1" + +expand-brackets@^2.1.4: + version "2.1.4" + resolved "https://registry.yarnpkg.com/expand-brackets/-/expand-brackets-2.1.4.tgz#b77735e315ce30f6b6eff0f83b04151a22449622" + integrity sha1-t3c14xXOMPa27/D4OwQVGiJEliI= + dependencies: + debug "^2.3.3" + define-property "^0.2.5" + extend-shallow "^2.0.1" + posix-character-classes "^0.1.0" + regex-not "^1.0.0" + snapdragon "^0.8.1" + to-regex "^3.0.1" + +extend-shallow@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/extend-shallow/-/extend-shallow-2.0.1.tgz#51af7d614ad9a9f610ea1bafbb989d6b1c56890f" + integrity sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8= + dependencies: + is-extendable "^0.1.0" + +extend-shallow@^3.0.0, extend-shallow@^3.0.2: + version "3.0.2" + resolved "https://registry.yarnpkg.com/extend-shallow/-/extend-shallow-3.0.2.tgz#26a71aaf073b39fb2127172746131c2704028db8" + integrity sha1-Jqcarwc7OfshJxcnRhMcJwQCjbg= + dependencies: + assign-symbols "^1.0.0" + is-extendable "^1.0.1" + +extglob@^2.0.4: + version "2.0.4" + resolved "https://registry.yarnpkg.com/extglob/-/extglob-2.0.4.tgz#ad00fe4dc612a9232e8718711dc5cb5ab0285543" + integrity sha512-Nmb6QXkELsuBr24CJSkilo6UHHgbekK5UiZgfE6UHD3Eb27YC6oD+bhcT+tJ6cl8dmsgdQxnWlcry8ksBIBLpw== + dependencies: + array-unique "^0.3.2" + define-property "^1.0.0" + expand-brackets "^2.1.4" + extend-shallow "^2.0.1" + fragment-cache "^0.2.1" + regex-not "^1.0.0" + snapdragon "^0.8.1" + to-regex "^3.0.1" + +extracted-loader@1.0.4: + version "1.0.4" + resolved "https://registry.yarnpkg.com/extracted-loader/-/extracted-loader-1.0.4.tgz#e1a3f1791813c14091a1959e261e23e95dd90115" + integrity sha512-G8A0hT/WCWIjesZm7BwbWdST5dQ08GNnCpTrJT/k/FYzuiJwlV1gyWjnuoizOzAR4jpEYXG2J++JyEKN/EB26Q== + +fast-deep-equal@^3.1.1, fast-deep-equal@^3.1.3: + version "3.1.3" + resolved "https://registry.yarnpkg.com/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz#3a7d56b559d6cbc3eb512325244e619a65c6c525" + integrity sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q== + +fast-diff@^1.1.2: + version "1.2.0" + resolved "https://registry.yarnpkg.com/fast-diff/-/fast-diff-1.2.0.tgz#73ee11982d86caaf7959828d519cfe927fac5f03" + integrity sha512-xJuoT5+L99XlZ8twedaRf6Ax2TgQVxvgZOYoPKqZufmJib0tL2tegPBOZb1pVNgIhlqDlA0eO0c3wBvQcmzx4w== + +fast-glob@^3.1.1: + version "3.2.7" + resolved "https://registry.yarnpkg.com/fast-glob/-/fast-glob-3.2.7.tgz#fd6cb7a2d7e9aa7a7846111e85a196d6b2f766a1" + integrity sha512-rYGMRwip6lUMvYD3BTScMwT1HtAs2d71SMv66Vrxs0IekGZEjhM0pcMfjQPnknBt2zeCwQMEupiN02ZP4DiT1Q== + dependencies: + "@nodelib/fs.stat" "^2.0.2" + "@nodelib/fs.walk" "^1.2.3" + glob-parent "^5.1.2" + merge2 "^1.3.0" + micromatch "^4.0.4" + +fast-json-stable-stringify@^2.0.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz#874bf69c6f404c2b5d99c481341399fd55892633" + integrity sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw== + +fast-levenshtein@^2.0.6: + version "2.0.6" + resolved "https://registry.yarnpkg.com/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz#3d8a5c66883a16a30ca8643e851f19baa7797917" + integrity sha1-PYpcZog6FqMMqGQ+hR8Zuqd5eRc= + +fastparse@^1.1.2: + version "1.1.2" + resolved "https://registry.yarnpkg.com/fastparse/-/fastparse-1.1.2.tgz#91728c5a5942eced8531283c79441ee4122c35a9" + integrity sha512-483XLLxTVIwWK3QTrMGRqUfUpoOs/0hbQrl2oz4J0pAcm3A3bu84wxTFqGqkJzewCLdME38xJLJAxBABfQT8sQ== + +fastq@^1.6.0: + version "1.13.0" + resolved "https://registry.yarnpkg.com/fastq/-/fastq-1.13.0.tgz#616760f88a7526bdfc596b7cab8c18938c36b98c" + integrity sha512-YpkpUnK8od0o1hmeSc7UUs/eB/vIPWJYjKck2QKIzAf71Vm1AAQ3EbuZB3g2JIy+pg+ERD0vqI79KyZiB2e2Nw== + dependencies: + reusify "^1.0.4" + +figgy-pudding@^3.5.1: + version "3.5.2" + resolved "https://registry.yarnpkg.com/figgy-pudding/-/figgy-pudding-3.5.2.tgz#b4eee8148abb01dcf1d1ac34367d59e12fa61d6e" + integrity sha512-0btnI/H8f2pavGMN8w40mlSKOfTK2SVJmBfBeVIj3kNw0swwgzyRq0d5TJVOwodFmtvpPeWPN/MCcfuWF0Ezbw== + +file-entry-cache@^6.0.1: + version "6.0.1" + resolved "https://registry.yarnpkg.com/file-entry-cache/-/file-entry-cache-6.0.1.tgz#211b2dd9659cb0394b073e7323ac3c933d522027" + integrity sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg== + dependencies: + flat-cache "^3.0.4" + +file-loader@^6.2.0: + version "6.2.0" + resolved "https://registry.yarnpkg.com/file-loader/-/file-loader-6.2.0.tgz#baef7cf8e1840df325e4390b4484879480eebe4d" + integrity sha512-qo3glqyTa61Ytg4u73GultjHGjdRyig3tG6lPtyX/jOEJvHif9uB0/OCI2Kif6ctF3caQTW2G5gym21oAsI4pw== + dependencies: + loader-utils "^2.0.0" + schema-utils "^3.0.0" + +file-uri-to-path@1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/file-uri-to-path/-/file-uri-to-path-1.0.0.tgz#553a7b8446ff6f684359c445f1e37a05dacc33dd" + integrity sha512-0Zt+s3L7Vf1biwWZ29aARiVYLx7iMGnEUl9x33fbB/j3jR81u/O2LbqK+Bm1CDSNDKVtJ/YjwY7TUd5SkeLQLw== + +fill-range@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/fill-range/-/fill-range-4.0.0.tgz#d544811d428f98eb06a63dc402d2403c328c38f7" + integrity sha1-1USBHUKPmOsGpj3EAtJAPDKMOPc= + dependencies: + extend-shallow "^2.0.1" + is-number "^3.0.0" + repeat-string "^1.6.1" + to-regex-range "^2.1.0" + +fill-range@^7.0.1: + version "7.0.1" + resolved "https://registry.yarnpkg.com/fill-range/-/fill-range-7.0.1.tgz#1919a6a7c75fe38b2c7c77e5198535da9acdda40" + integrity sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ== + dependencies: + to-regex-range "^5.0.1" + +find-cache-dir@3.3.1: + version "3.3.1" + resolved "https://registry.yarnpkg.com/find-cache-dir/-/find-cache-dir-3.3.1.tgz#89b33fad4a4670daa94f855f7fbe31d6d84fe880" + integrity sha512-t2GDMt3oGC/v+BMwzmllWDuJF/xcDtE5j/fCGbqDD7OLuJkj0cfh1YSA5VKPvwMeLFLNDBkwOKZ2X85jGLVftQ== + dependencies: + commondir "^1.0.1" + make-dir "^3.0.2" + pkg-dir "^4.1.0" + +find-cache-dir@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/find-cache-dir/-/find-cache-dir-2.1.0.tgz#8d0f94cd13fe43c6c7c261a0d86115ca918c05f7" + integrity sha512-Tq6PixE0w/VMFfCgbONnkiQIVol/JJL7nRMi20fqzA4NRs9AfeqMGeRdPi3wIhYkxjeBaWh2rxwapn5Tu3IqOQ== + dependencies: + commondir "^1.0.1" + make-dir "^2.0.0" + pkg-dir "^3.0.0" + +find-cache-dir@^3.3.1: + version "3.3.2" + resolved "https://registry.yarnpkg.com/find-cache-dir/-/find-cache-dir-3.3.2.tgz#b30c5b6eff0730731aea9bbd9dbecbd80256d64b" + integrity sha512-wXZV5emFEjrridIgED11OoUKLxiYjAcqot/NJdAkOhlJ+vGzwhOAfcG5OX1jP+S0PcjEn8bdMJv+g2jwQ3Onig== + dependencies: + commondir "^1.0.1" + make-dir "^3.0.2" + pkg-dir "^4.1.0" + +find-up@2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/find-up/-/find-up-2.1.0.tgz#45d1b7e506c717ddd482775a2b77920a3c0c57a7" + integrity sha1-RdG35QbHF93UgndaK3eSCjwMV6c= + dependencies: + locate-path "^2.0.0" + +find-up@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/find-up/-/find-up-3.0.0.tgz#49169f1d7993430646da61ecc5ae355c21c97b73" + integrity sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg== + dependencies: + locate-path "^3.0.0" + +find-up@^4.0.0: + version "4.1.0" + resolved "https://registry.yarnpkg.com/find-up/-/find-up-4.1.0.tgz#97afe7d6cdc0bc5928584b7c8d7b16e8a9aa5d19" + integrity sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw== + dependencies: + locate-path "^5.0.0" + path-exists "^4.0.0" + +flat-cache@^3.0.4: + version "3.0.4" + resolved "https://registry.yarnpkg.com/flat-cache/-/flat-cache-3.0.4.tgz#61b0338302b2fe9f957dcc32fc2a87f1c3048b11" + integrity sha512-dm9s5Pw7Jc0GvMYbshN6zchCA9RgQlzzEZX3vylR9IqFfS8XciblUXOKfW6SiuJ0e13eDYZoZV5wdrev7P3Nwg== + dependencies: + flatted "^3.1.0" + rimraf "^3.0.2" + +flatted@^3.1.0: + version "3.2.2" + resolved "https://registry.yarnpkg.com/flatted/-/flatted-3.2.2.tgz#64bfed5cb68fe3ca78b3eb214ad97b63bedce561" + integrity sha512-JaTY/wtrcSyvXJl4IMFHPKyFur1sE9AUqc0QnhOaJ0CxHtAoIV8pYDzeEfAaNEtGkOfq4gr3LBFmdXW5mOQFnA== + +flush-write-stream@^1.0.0: + version "1.1.1" + resolved "https://registry.yarnpkg.com/flush-write-stream/-/flush-write-stream-1.1.1.tgz#8dd7d873a1babc207d94ead0c2e0e44276ebf2e8" + integrity sha512-3Z4XhFZ3992uIq0XOqb9AreonueSYphE6oYbpt5+3u06JWklbsPkNv3ZKkP9Bz/r+1MWCaMoSQ28P85+1Yc77w== + dependencies: + inherits "^2.0.3" + readable-stream "^2.3.6" + +follow-redirects@^1.14.0: + version "1.14.3" + resolved "https://registry.yarnpkg.com/follow-redirects/-/follow-redirects-1.14.3.tgz#6ada78118d8d24caee595595accdc0ac6abd022e" + integrity sha512-3MkHxknWMUtb23apkgz/83fDoe+y+qr0TdgacGIA7bew+QLBo3vdgEN2xEsuXNivpFy4CyDhBBZnNZOtalmenw== + +for-in@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/for-in/-/for-in-1.0.2.tgz#81068d295a8142ec0ac726c6e2200c30fb6d5e80" + integrity sha1-gQaNKVqBQuwKxybG4iAMMPttXoA= + +foreach@^2.0.5: + version "2.0.5" + resolved "https://registry.yarnpkg.com/foreach/-/foreach-2.0.5.tgz#0bee005018aeb260d0a3af3ae658dd0136ec1b99" + integrity sha1-C+4AUBiusmDQo6865ljdATbsG5k= + +fragment-cache@^0.2.1: + version "0.2.1" + resolved "https://registry.yarnpkg.com/fragment-cache/-/fragment-cache-0.2.1.tgz#4290fad27f13e89be7f33799c6bc5a0abfff0d19" + integrity sha1-QpD60n8T6Jvn8zeZxrxaCr//DRk= + dependencies: + map-cache "^0.2.2" + +from2@^2.1.0: + version "2.3.0" + resolved "https://registry.yarnpkg.com/from2/-/from2-2.3.0.tgz#8bfb5502bde4a4d36cfdeea007fcca21d7e382af" + integrity sha1-i/tVAr3kpNNs/e6gB/zKIdfjgq8= + dependencies: + inherits "^2.0.1" + readable-stream "^2.0.0" + +fs-write-stream-atomic@^1.0.8: + version "1.0.10" + resolved "https://registry.yarnpkg.com/fs-write-stream-atomic/-/fs-write-stream-atomic-1.0.10.tgz#b47df53493ef911df75731e70a9ded0189db40c9" + integrity sha1-tH31NJPvkR33VzHnCp3tAYnbQMk= + dependencies: + graceful-fs "^4.1.2" + iferr "^0.1.5" + imurmurhash "^0.1.4" + readable-stream "1 || 2" + +fs.realpath@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/fs.realpath/-/fs.realpath-1.0.0.tgz#1504ad2523158caa40db4a2787cb01411994ea4f" + integrity sha1-FQStJSMVjKpA20onh8sBQRmU6k8= + +fsevents@^1.2.7: + version "1.2.13" + resolved "https://registry.yarnpkg.com/fsevents/-/fsevents-1.2.13.tgz#f325cb0455592428bcf11b383370ef70e3bfcc38" + integrity sha512-oWb1Z6mkHIskLzEJ/XWX0srkpkTQ7vaopMQkyaEIoq0fmtFVxOthb8cCxeT+p3ynTdkk/RZwbgG4brR5BeWECw== + dependencies: + bindings "^1.5.0" + nan "^2.12.1" + +fsevents@~2.3.1, fsevents@~2.3.2: + version "2.3.2" + resolved "https://registry.yarnpkg.com/fsevents/-/fsevents-2.3.2.tgz#8a526f78b8fdf4623b709e0b975c52c24c02fd1a" + integrity sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA== + +function-bind@^1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/function-bind/-/function-bind-1.1.1.tgz#a56899d3ea3c9bab874bb9773b7c5ede92f4895d" + integrity sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A== + +functional-red-black-tree@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/functional-red-black-tree/-/functional-red-black-tree-1.0.1.tgz#1b0ab3bd553b2a0d6399d29c0e3ea0b252078327" + integrity sha1-GwqzvVU7Kg1jmdKcDj6gslIHgyc= + +gensync@^1.0.0-beta.2: + version "1.0.0-beta.2" + resolved "https://registry.yarnpkg.com/gensync/-/gensync-1.0.0-beta.2.tgz#32a6ee76c3d7f52d46b2b1ae5d93fea8580a25e0" + integrity sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg== + +get-intrinsic@^1.0.2, get-intrinsic@^1.1.0, get-intrinsic@^1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/get-intrinsic/-/get-intrinsic-1.1.1.tgz#15f59f376f855c446963948f0d24cd3637b4abc6" + integrity sha512-kWZrnVM42QCiEA2Ig1bG8zjoIMOgxWwYCEeNdwY6Tv/cOSeGpcoX4pXHfKUxNKVoArnrEr2e9srnAxxGIraS9Q== + dependencies: + function-bind "^1.1.1" + has "^1.0.3" + has-symbols "^1.0.1" + +get-orientation@1.1.2: + version "1.1.2" + resolved "https://registry.yarnpkg.com/get-orientation/-/get-orientation-1.1.2.tgz#20507928951814f8a91ded0a0e67b29dfab98947" + integrity sha512-/pViTfifW+gBbh/RnlFYHINvELT9Znt+SYyDKAUL6uV6By019AK/s+i9XP4jSwq7lwP38Fd8HVeTxym3+hkwmQ== + dependencies: + stream-parser "^0.3.1" + +get-symbol-description@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/get-symbol-description/-/get-symbol-description-1.0.0.tgz#7fdb81c900101fbd564dd5f1a30af5aadc1e58d6" + integrity sha512-2EmdH1YvIQiZpltCNgkuiUnyukzxM/R6NDJX31Ke3BG1Nq5b0S2PhX59UKi9vZpPDQVdqn+1IcaAwnzTT5vCjw== + dependencies: + call-bind "^1.0.2" + get-intrinsic "^1.1.1" + +get-value@^2.0.3, get-value@^2.0.6: + version "2.0.6" + resolved "https://registry.yarnpkg.com/get-value/-/get-value-2.0.6.tgz#dc15ca1c672387ca76bd37ac0a395ba2042a2c28" + integrity sha1-3BXKHGcjh8p2vTesCjlbogQqLCg= + +glob-parent@^3.1.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/glob-parent/-/glob-parent-3.1.0.tgz#9e6af6299d8d3bd2bd40430832bd113df906c5ae" + integrity sha1-nmr2KZ2NO9K9QEMIMr0RPfkGxa4= + dependencies: + is-glob "^3.1.0" + path-dirname "^1.0.0" + +glob-parent@^5.1.2, glob-parent@~5.1.0, glob-parent@~5.1.2: + version "5.1.2" + resolved "https://registry.yarnpkg.com/glob-parent/-/glob-parent-5.1.2.tgz#869832c58034fe68a4093c17dc15e8340d8401c4" + integrity sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow== + dependencies: + is-glob "^4.0.1" + +glob-to-regexp@^0.4.1: + version "0.4.1" + resolved "https://registry.yarnpkg.com/glob-to-regexp/-/glob-to-regexp-0.4.1.tgz#c75297087c851b9a578bd217dd59a92f59fe546e" + integrity sha512-lkX1HJXwyMcprw/5YUZc2s7DrpAiHB21/V+E1rHUrVNokkvB6bqMzT0VfV6/86ZNabt1k14YOIaT7nDvOX3Iiw== + +glob@^7.1.3, glob@^7.1.4: + version "7.1.7" + resolved "https://registry.yarnpkg.com/glob/-/glob-7.1.7.tgz#3b193e9233f01d42d0b3f78294bbeeb418f94a90" + 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" + +globals@^11.1.0: + version "11.12.0" + resolved "https://registry.yarnpkg.com/globals/-/globals-11.12.0.tgz#ab8795338868a0babd8525758018c2a7eb95c42e" + integrity sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA== + +globals@^13.6.0, globals@^13.9.0: + version "13.11.0" + resolved "https://registry.yarnpkg.com/globals/-/globals-13.11.0.tgz#40ef678da117fe7bd2e28f1fab24951bd0255be7" + integrity sha512-08/xrJ7wQjK9kkkRoI3OFUBbLx4f+6x3SGwcPvQ0QH6goFDrOU2oyAWrmh3dJezu65buo+HBMzAMQy6rovVC3g== + dependencies: + type-fest "^0.20.2" + +globby@^11.0.3: + version "11.0.4" + resolved "https://registry.yarnpkg.com/globby/-/globby-11.0.4.tgz#2cbaff77c2f2a62e71e9b2813a67b97a3a3001a5" + integrity sha512-9O4MVG9ioZJ08ffbcyVYyLOJLk5JQ688pJ4eMGLpdWLHq/Wr1D9BlriLQyL0E+jbkuePVZXYFj47QM/v093wHg== + dependencies: + array-union "^2.1.0" + dir-glob "^3.0.1" + fast-glob "^3.1.1" + ignore "^5.1.4" + merge2 "^1.3.0" + slash "^3.0.0" + +graceful-fs@^4.1.11, graceful-fs@^4.1.15, graceful-fs@^4.1.2: + version "4.2.8" + resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.2.8.tgz#e412b8d33f5e006593cbd3cee6df9f2cebbe802a" + integrity sha512-qkIilPUYcNhJpd33n0GBXTB1MMPp14TxEsEs0pTrsSVucApsYzW5V+Q8Qxhik6KU3evy+qkAAowTByymK0avdg== + +has-ansi@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/has-ansi/-/has-ansi-2.0.0.tgz#34f5049ce1ecdf2b0649af3ef24e45ed35416d91" + integrity sha1-NPUEnOHs3ysGSa8+8k5F7TVBbZE= + dependencies: + ansi-regex "^2.0.0" + +has-bigints@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/has-bigints/-/has-bigints-1.0.1.tgz#64fe6acb020673e3b78db035a5af69aa9d07b113" + integrity sha512-LSBS2LjbNBTf6287JEbEzvJgftkF5qFkmCo9hDRpAzKhUOlJ+hx8dd4USs00SgsUNwc4617J9ki5YtEClM2ffA== + +has-flag@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-3.0.0.tgz#b5d454dc2199ae225699f3467e5a07f3b955bafd" + integrity sha1-tdRU3CGZriJWmfNGfloH87lVuv0= + +has-flag@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-4.0.0.tgz#944771fd9c81c81265c4d6941860da06bb59479b" + integrity sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ== + +has-symbols@^1.0.1, has-symbols@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/has-symbols/-/has-symbols-1.0.2.tgz#165d3070c00309752a1236a479331e3ac56f1423" + integrity sha512-chXa79rL/UC2KlX17jo3vRGz0azaWEx5tGqZg5pO3NUyEJVB17dMruQlzCCOfUvElghKcm5194+BCRvi2Rv/Gw== + +has-tostringtag@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/has-tostringtag/-/has-tostringtag-1.0.0.tgz#7e133818a7d394734f941e73c3d3f9291e658b25" + integrity sha512-kFjcSNhnlGV1kyoGk7OXKSawH5JOb/LzUc5w9B02hOTO0dfFRjbHQKvg1d6cf3HbeUmtU9VbbV3qzZ2Teh97WQ== + dependencies: + has-symbols "^1.0.2" + +has-value@^0.3.1: + version "0.3.1" + resolved "https://registry.yarnpkg.com/has-value/-/has-value-0.3.1.tgz#7b1f58bada62ca827ec0a2078025654845995e1f" + integrity sha1-ex9YutpiyoJ+wKIHgCVlSEWZXh8= + dependencies: + get-value "^2.0.3" + has-values "^0.1.4" + isobject "^2.0.0" + +has-value@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/has-value/-/has-value-1.0.0.tgz#18b281da585b1c5c51def24c930ed29a0be6b177" + integrity sha1-GLKB2lhbHFxR3vJMkw7SmgvmsXc= + dependencies: + get-value "^2.0.6" + has-values "^1.0.0" + isobject "^3.0.0" + +has-values@^0.1.4: + version "0.1.4" + resolved "https://registry.yarnpkg.com/has-values/-/has-values-0.1.4.tgz#6d61de95d91dfca9b9a02089ad384bff8f62b771" + integrity sha1-bWHeldkd/Km5oCCJrThL/49it3E= + +has-values@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/has-values/-/has-values-1.0.0.tgz#95b0b63fec2146619a6fe57fe75628d5a39efe4f" + integrity sha1-lbC2P+whRmGab+V/51Yo1aOe/k8= + dependencies: + is-number "^3.0.0" + kind-of "^4.0.0" + +has@^1.0.3: + version "1.0.3" + resolved "https://registry.yarnpkg.com/has/-/has-1.0.3.tgz#722d7cbfc1f6aa8241f16dd814e011e1f41e8796" + integrity sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw== + dependencies: + function-bind "^1.1.1" + +hash-base@^3.0.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/hash-base/-/hash-base-3.1.0.tgz#55c381d9e06e1d2997a883b4a3fddfe7f0d3af33" + integrity sha512-1nmYp/rhMDiE7AYkDw+lLwlAzz0AntGIe51F3RfFfEqyQ3feY2eI/NcwC6umIQVOASPMsWJLJScWKSSvzL9IVA== + dependencies: + inherits "^2.0.4" + readable-stream "^3.6.0" + safe-buffer "^5.2.0" + +hash.js@^1.0.0, hash.js@^1.0.3: + version "1.1.7" + resolved "https://registry.yarnpkg.com/hash.js/-/hash.js-1.1.7.tgz#0babca538e8d4ee4a0f8988d68866537a003cf42" + integrity sha512-taOaskGt4z4SOANNseOviYDvjEJinIkRgmp7LbKP2YTTmVxWBl87s/uzK9r+44BclBSp2X7K1hqeNfz9JbBeXA== + dependencies: + inherits "^2.0.3" + minimalistic-assert "^1.0.1" + +he@1.2.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/he/-/he-1.2.0.tgz#84ae65fa7eafb165fddb61566ae14baf05664f0f" + integrity sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw== + +hmac-drbg@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/hmac-drbg/-/hmac-drbg-1.0.1.tgz#d2745701025a6c775a6c545793ed502fc0c649a1" + integrity sha1-0nRXAQJabHdabFRXk+1QL8DGSaE= + dependencies: + hash.js "^1.0.3" + minimalistic-assert "^1.0.0" + minimalistic-crypto-utils "^1.0.1" + +hoist-non-react-statics@^3.3.0, hoist-non-react-statics@^3.3.2: + version "3.3.2" + resolved "https://registry.yarnpkg.com/hoist-non-react-statics/-/hoist-non-react-statics-3.3.2.tgz#ece0acaf71d62c2969c2ec59feff42a4b1a85b45" + integrity sha512-/gGivxi8JPKWNm/W0jSmzcMPpfpPLc3dY/6GxhX2hQ9iGj3aDfklV4ET7NjKpSinLpJ5vafa9iiGIEZg10SfBw== + dependencies: + react-is "^16.7.0" + +http-errors@1.7.3: + version "1.7.3" + resolved "https://registry.yarnpkg.com/http-errors/-/http-errors-1.7.3.tgz#6c619e4f9c60308c38519498c14fbb10aacebb06" + integrity sha512-ZTTX0MWrsQ2ZAhA1cejAwDLycFsd7I7nVtnkT3Ol0aqodaKW+0CTZDQ1uBv5whptCnc8e8HeRRJxRs0kmm/Qfw== + dependencies: + depd "~1.1.2" + inherits "2.0.4" + setprototypeof "1.1.1" + statuses ">= 1.5.0 < 2" + toidentifier "1.0.0" + +https-browserify@1.0.0, https-browserify@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/https-browserify/-/https-browserify-1.0.0.tgz#ec06c10e0a34c0f2faf199f7fd7fc78fffd03c73" + integrity sha1-7AbBDgo0wPL68Zn3/X/Hj//QPHM= + +iconv-lite@0.4.24, iconv-lite@^0.4.4: + version "0.4.24" + resolved "https://registry.yarnpkg.com/iconv-lite/-/iconv-lite-0.4.24.tgz#2022b4b25fbddc21d2f524974a474aafe733908b" + integrity sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA== + dependencies: + safer-buffer ">= 2.1.2 < 3" + +iconv-lite@^0.6.2: + version "0.6.3" + resolved "https://registry.yarnpkg.com/iconv-lite/-/iconv-lite-0.6.3.tgz#a52f80bf38da1952eb5c681790719871a1a72501" + integrity sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw== + dependencies: + safer-buffer ">= 2.1.2 < 3.0.0" + +icss-replace-symbols@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/icss-replace-symbols/-/icss-replace-symbols-1.1.0.tgz#06ea6f83679a7749e386cfe1fe812ae5db223ded" + integrity sha1-Bupvg2ead0njhs/h/oEq5dsiPe0= + +icss-utils@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/icss-utils/-/icss-utils-2.1.0.tgz#83f0a0ec378bf3246178b6c2ad9136f135b1c962" + integrity sha1-g/Cg7DeL8yRheLbCrZE28TWxyWI= + dependencies: + postcss "^6.0.1" + +ieee754@^1.1.4: + version "1.2.1" + resolved "https://registry.yarnpkg.com/ieee754/-/ieee754-1.2.1.tgz#8eb7a10a63fff25d15a57b001586d177d1b0d352" + integrity sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA== + +iferr@^0.1.5: + version "0.1.5" + resolved "https://registry.yarnpkg.com/iferr/-/iferr-0.1.5.tgz#c60eed69e6d8fdb6b3104a1fcbca1c192dc5b501" + integrity sha1-xg7taebY/bazEEofy8ocGS3FtQE= + +ignore-loader@0.1.2: + version "0.1.2" + resolved "https://registry.yarnpkg.com/ignore-loader/-/ignore-loader-0.1.2.tgz#d81f240376d0ba4f0d778972c3ad25874117a463" + integrity sha1-2B8kA3bQuk8Nd4lyw60lh0EXpGM= + +ignore@^4.0.6: + version "4.0.6" + resolved "https://registry.yarnpkg.com/ignore/-/ignore-4.0.6.tgz#750e3db5862087b4737ebac8207ffd1ef27b25fc" + integrity sha512-cyFDKrqc/YdcWFniJhzI42+AzS+gNwmUzOSFcRCQYwySuBBBy/KjuxWLZ/FHEH6Moq1NizMOBWyTcv8O4OZIMg== + +ignore@^5.1.4: + version "5.1.8" + resolved "https://registry.yarnpkg.com/ignore/-/ignore-5.1.8.tgz#f150a8b50a34289b33e22f5889abd4d8016f0e57" + integrity sha512-BMpfD7PpiETpBl/A6S498BaIJ6Y/ABT93ETbby2fP00v4EbvPBXWEoaR1UBPKs3iR53pJY7EtZk5KACI57i1Uw== + +image-size@~0.5.0: + version "0.5.5" + resolved "https://registry.yarnpkg.com/image-size/-/image-size-0.5.5.tgz#09dfd4ab9d20e29eb1c3e80b8990378df9e3cb9c" + integrity sha1-Cd/Uq50g4p6xw+gLiZA3jfnjy5w= + +import-cwd@^2.0.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/import-cwd/-/import-cwd-2.1.0.tgz#aa6cf36e722761285cb371ec6519f53e2435b0a9" + integrity sha1-qmzzbnInYShcs3HsZRn1PiQ1sKk= + dependencies: + import-from "^2.1.0" + +import-fresh@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/import-fresh/-/import-fresh-2.0.0.tgz#d81355c15612d386c61f9ddd3922d4304822a546" + integrity sha1-2BNVwVYS04bGH53dOSLUMEgipUY= + dependencies: + caller-path "^2.0.0" + resolve-from "^3.0.0" + +import-fresh@^3.0.0, import-fresh@^3.2.1: + version "3.3.0" + resolved "https://registry.yarnpkg.com/import-fresh/-/import-fresh-3.3.0.tgz#37162c25fcb9ebaa2e6e53d5b4d88ce17d9e0c2b" + integrity sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw== + dependencies: + parent-module "^1.0.0" + resolve-from "^4.0.0" + +import-from@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/import-from/-/import-from-2.1.0.tgz#335db7f2a7affd53aaa471d4b8021dee36b7f3b1" + integrity sha1-M1238qev/VOqpHHUuAId7ja387E= + dependencies: + resolve-from "^3.0.0" + +imurmurhash@^0.1.4: + version "0.1.4" + resolved "https://registry.yarnpkg.com/imurmurhash/-/imurmurhash-0.1.4.tgz#9218b9b2b928a238b13dc4fb6b6d576f231453ea" + integrity sha1-khi5srkoojixPcT7a21XbyMUU+o= + +infer-owner@^1.0.3: + version "1.0.4" + resolved "https://registry.yarnpkg.com/infer-owner/-/infer-owner-1.0.4.tgz#c4cefcaa8e51051c2a40ba2ce8a3d27295af9467" + integrity sha512-IClj+Xz94+d7irH5qRyfJonOdfTzuDaifE6ZPWfx0N0+/ATZCbuTPq2prFl526urkQd90WyUKIh1DfBQ2hMz9A== + +inflight@^1.0.4: + version "1.0.6" + resolved "https://registry.yarnpkg.com/inflight/-/inflight-1.0.6.tgz#49bd6331d7d02d0c09bc910a1075ba8165b56df9" + integrity sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk= + dependencies: + once "^1.3.0" + wrappy "1" + +inherits@2, inherits@2.0.4, inherits@^2.0.1, inherits@^2.0.3, inherits@^2.0.4, inherits@~2.0.1, inherits@~2.0.3, inherits@~2.0.4: + version "2.0.4" + resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.4.tgz#0fa2c64f932917c3433a0ded55363aae37416b7c" + integrity sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ== + +inherits@2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.1.tgz#b17d08d326b4423e568eff719f91b0b1cbdf69f1" + integrity sha1-sX0I0ya0Qj5Wjv9xn5GwscvfafE= + +inherits@2.0.3: + version "2.0.3" + resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.3.tgz#633c2c83e3da42a502f52466022480f4208261de" + integrity sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4= + +internal-slot@^1.0.3: + version "1.0.3" + resolved "https://registry.yarnpkg.com/internal-slot/-/internal-slot-1.0.3.tgz#7347e307deeea2faac2ac6205d4bc7d34967f59c" + integrity sha512-O0DB1JC/sPyZl7cIo78n5dR7eUSwwpYPiXRhTzNxZVAMUuB8vlnRFyLxdrVToks6XPLVnFfbzaVd5WLjhgg+vA== + dependencies: + get-intrinsic "^1.1.0" + has "^1.0.3" + side-channel "^1.0.4" + +is-accessor-descriptor@^0.1.6: + version "0.1.6" + resolved "https://registry.yarnpkg.com/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz#a9e12cb3ae8d876727eeef3843f8a0897b5c98d6" + integrity sha1-qeEss66Nh2cn7u84Q/igiXtcmNY= + dependencies: + kind-of "^3.0.2" + +is-accessor-descriptor@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz#169c2f6d3df1f992618072365c9b0ea1f6878656" + integrity sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ== + dependencies: + kind-of "^6.0.0" + +is-arguments@^1.0.4: + version "1.1.1" + resolved "https://registry.yarnpkg.com/is-arguments/-/is-arguments-1.1.1.tgz#15b3f88fda01f2a97fec84ca761a560f123efa9b" + integrity sha512-8Q7EARjzEnKpt/PCD7e1cgUS0a6X8u5tdSiMqXhojOdoV9TsMsiO+9VLC5vAmO8N7/GmXn7yjR8qnA6bVAEzfA== + dependencies: + call-bind "^1.0.2" + has-tostringtag "^1.0.0" + +is-arrayish@^0.2.1: + version "0.2.1" + resolved "https://registry.yarnpkg.com/is-arrayish/-/is-arrayish-0.2.1.tgz#77c99840527aa8ecb1a8ba697b80645a7a926a9d" + integrity sha1-d8mYQFJ6qOyxqLppe4BkWnqSap0= + +is-bigint@^1.0.1: + version "1.0.4" + resolved "https://registry.yarnpkg.com/is-bigint/-/is-bigint-1.0.4.tgz#08147a1875bc2b32005d41ccd8291dffc6691df3" + integrity sha512-zB9CruMamjym81i2JZ3UMn54PKGsQzsJeo6xvN3HJJ4CAsQNB6iRutp2To77OfCNuoxspsIhzaPoO1zyCEhFOg== + dependencies: + has-bigints "^1.0.1" + +is-binary-path@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/is-binary-path/-/is-binary-path-1.0.1.tgz#75f16642b480f187a711c814161fd3a4a7655898" + integrity sha1-dfFmQrSA8YenEcgUFh/TpKdlWJg= + dependencies: + binary-extensions "^1.0.0" + +is-binary-path@~2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/is-binary-path/-/is-binary-path-2.1.0.tgz#ea1f7f3b80f064236e83470f86c09c254fb45b09" + integrity sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw== + dependencies: + binary-extensions "^2.0.0" + +is-boolean-object@^1.1.0: + version "1.1.2" + resolved "https://registry.yarnpkg.com/is-boolean-object/-/is-boolean-object-1.1.2.tgz#5c6dc200246dd9321ae4b885a114bb1f75f63719" + integrity sha512-gDYaKHJmnj4aWxyj6YHyXVpdQawtVLHU5cb+eztPGczf6cjuTdwve5ZIEfgXqH4e57An1D1AKf8CZ3kYrQRqYA== + dependencies: + call-bind "^1.0.2" + has-tostringtag "^1.0.0" + +is-buffer@^1.1.5: + version "1.1.6" + resolved "https://registry.yarnpkg.com/is-buffer/-/is-buffer-1.1.6.tgz#efaa2ea9daa0d7ab2ea13a97b2b8ad51fefbe8be" + integrity sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w== + +is-callable@^1.1.4, is-callable@^1.2.4: + version "1.2.4" + resolved "https://registry.yarnpkg.com/is-callable/-/is-callable-1.2.4.tgz#47301d58dd0259407865547853df6d61fe471945" + integrity sha512-nsuwtxZfMX67Oryl9LCQ+upnC0Z0BgpwntpS89m1H/TLF0zNfzfLMV/9Wa/6MZsj0acpEjAO0KF1xT6ZdLl95w== + +is-data-descriptor@^0.1.4: + version "0.1.4" + resolved "https://registry.yarnpkg.com/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz#0b5ee648388e2c860282e793f1856fec3f301b56" + integrity sha1-C17mSDiOLIYCgueT8YVv7D8wG1Y= + dependencies: + kind-of "^3.0.2" + +is-data-descriptor@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz#d84876321d0e7add03990406abbbbd36ba9268c7" + integrity sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ== + dependencies: + kind-of "^6.0.0" + +is-date-object@^1.0.1: + version "1.0.5" + resolved "https://registry.yarnpkg.com/is-date-object/-/is-date-object-1.0.5.tgz#0841d5536e724c25597bf6ea62e1bd38298df31f" + integrity sha512-9YQaSxsAiSwcvS33MBk3wTCVnWK+HhF8VZR2jRxehM16QcVOdHqPn4VPHmRK4lSr38n9JriurInLcP90xsYNfQ== + dependencies: + has-tostringtag "^1.0.0" + +is-descriptor@^0.1.0: + version "0.1.6" + resolved "https://registry.yarnpkg.com/is-descriptor/-/is-descriptor-0.1.6.tgz#366d8240dde487ca51823b1ab9f07a10a78251ca" + integrity sha512-avDYr0SB3DwO9zsMov0gKCESFYqCnE4hq/4z3TdUlukEy5t9C0YRq7HLrsN52NAcqXKaepeCD0n+B0arnVG3Hg== + dependencies: + is-accessor-descriptor "^0.1.6" + is-data-descriptor "^0.1.4" + kind-of "^5.0.0" + +is-descriptor@^1.0.0, is-descriptor@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/is-descriptor/-/is-descriptor-1.0.2.tgz#3b159746a66604b04f8c81524ba365c5f14d86ec" + integrity sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg== + dependencies: + is-accessor-descriptor "^1.0.0" + is-data-descriptor "^1.0.0" + kind-of "^6.0.2" + +is-directory@^0.3.1: + version "0.3.1" + resolved "https://registry.yarnpkg.com/is-directory/-/is-directory-0.3.1.tgz#61339b6f2475fc772fd9c9d83f5c8575dc154ae1" + integrity sha1-YTObbyR1/Hcv2cnYP1yFddwVSuE= + +is-extendable@^0.1.0, is-extendable@^0.1.1: + version "0.1.1" + resolved "https://registry.yarnpkg.com/is-extendable/-/is-extendable-0.1.1.tgz#62b110e289a471418e3ec36a617d472e301dfc89" + integrity sha1-YrEQ4omkcUGOPsNqYX1HLjAd/Ik= + +is-extendable@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/is-extendable/-/is-extendable-1.0.1.tgz#a7470f9e426733d81bd81e1155264e3a3507cab4" + integrity sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA== + dependencies: + is-plain-object "^2.0.4" + +is-extglob@^2.1.0, is-extglob@^2.1.1: + version "2.1.1" + resolved "https://registry.yarnpkg.com/is-extglob/-/is-extglob-2.1.1.tgz#a88c02535791f02ed37c76a1b9ea9773c833f8c2" + integrity sha1-qIwCU1eR8C7TfHahueqXc8gz+MI= + +is-fullwidth-code-point@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz#f116f8064fe90b3f7844a38997c0b75051269f1d" + integrity sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg== + +is-generator-function@^1.0.7: + version "1.0.10" + resolved "https://registry.yarnpkg.com/is-generator-function/-/is-generator-function-1.0.10.tgz#f1558baf1ac17e0deea7c0415c438351ff2b3c72" + integrity sha512-jsEjy9l3yiXEQ+PsXdmBwEPcOxaXWLspKdplFUVI9vq1iZgIekeC0L167qeu86czQaxed3q/Uzuw0swL0irL8A== + dependencies: + has-tostringtag "^1.0.0" + +is-glob@^3.1.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/is-glob/-/is-glob-3.1.0.tgz#7ba5ae24217804ac70707b96922567486cc3e84a" + integrity sha1-e6WuJCF4BKxwcHuWkiVnSGzD6Eo= + dependencies: + is-extglob "^2.1.0" + +is-glob@^4.0.0, is-glob@^4.0.1, is-glob@~4.0.1: + version "4.0.1" + resolved "https://registry.yarnpkg.com/is-glob/-/is-glob-4.0.1.tgz#7567dbe9f2f5e2467bc77ab83c4a29482407a5dc" + integrity sha512-5G0tKtBTFImOqDnLB2hG6Bp2qcKEFduo4tZu9MT/H6NQv/ghhy30o55ufafxJ/LdH79LLs2Kfrn85TLKyA7BUg== + dependencies: + is-extglob "^2.1.1" + +is-nan@^1.2.1: + version "1.3.2" + resolved "https://registry.yarnpkg.com/is-nan/-/is-nan-1.3.2.tgz#043a54adea31748b55b6cd4e09aadafa69bd9e1d" + integrity sha512-E+zBKpQ2t6MEo1VsonYmluk9NxGrbzpeeLC2xIViuO2EjU2xsXsBPwTr3Ykv9l08UYEVEdWeRZNouaZqF6RN0w== + dependencies: + call-bind "^1.0.0" + define-properties "^1.1.3" + +is-negative-zero@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/is-negative-zero/-/is-negative-zero-2.0.1.tgz#3de746c18dda2319241a53675908d8f766f11c24" + integrity sha512-2z6JzQvZRa9A2Y7xC6dQQm4FSTSTNWjKIYYTt4246eMTJmIo0Q+ZyOsU66X8lxK1AbB92dFeglPLrhwpeRKO6w== + +is-number-object@^1.0.4: + version "1.0.6" + resolved "https://registry.yarnpkg.com/is-number-object/-/is-number-object-1.0.6.tgz#6a7aaf838c7f0686a50b4553f7e54a96494e89f0" + integrity sha512-bEVOqiRcvo3zO1+G2lVMy+gkkEm9Yh7cDMRusKKu5ZJKPUYSJwICTKZrNKHA2EbSP0Tu0+6B/emsYNHZyn6K8g== + dependencies: + has-tostringtag "^1.0.0" + +is-number@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/is-number/-/is-number-3.0.0.tgz#24fd6201a4782cf50561c810276afc7d12d71195" + integrity sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU= + dependencies: + kind-of "^3.0.2" + +is-number@^7.0.0: + version "7.0.0" + resolved "https://registry.yarnpkg.com/is-number/-/is-number-7.0.0.tgz#7535345b896734d5f80c4d06c50955527a14f12b" + integrity sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng== + +is-plain-object@^2.0.3, is-plain-object@^2.0.4: + version "2.0.4" + resolved "https://registry.yarnpkg.com/is-plain-object/-/is-plain-object-2.0.4.tgz#2c163b3fafb1b606d9d17928f05c2a1c38e07677" + integrity sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og== + dependencies: + isobject "^3.0.1" + +is-regex@^1.1.4: + version "1.1.4" + resolved "https://registry.yarnpkg.com/is-regex/-/is-regex-1.1.4.tgz#eef5663cd59fa4c0ae339505323df6854bb15958" + integrity sha512-kvRdxDsxZjhzUX07ZnLydzS1TU/TJlTUHHY4YLL87e37oUA49DfkLqgy+VjFocowy29cKvcSiu+kIv728jTTVg== + dependencies: + call-bind "^1.0.2" + has-tostringtag "^1.0.0" + +is-string@^1.0.5, is-string@^1.0.7: + version "1.0.7" + resolved "https://registry.yarnpkg.com/is-string/-/is-string-1.0.7.tgz#0dd12bf2006f255bb58f695110eff7491eebc0fd" + integrity sha512-tE2UXzivje6ofPW7l23cjDOMa09gb7xlAqG6jG5ej6uPV32TlWP3NKPigtaGeHNu9fohccRYvIiZMfOOnOYUtg== + dependencies: + has-tostringtag "^1.0.0" + +is-symbol@^1.0.2, is-symbol@^1.0.3: + version "1.0.4" + resolved "https://registry.yarnpkg.com/is-symbol/-/is-symbol-1.0.4.tgz#a6dac93b635b063ca6872236de88910a57af139c" + integrity sha512-C/CPBqKWnvdcxqIARxyOh4v1UUEOCHpgDa0WYgpKDFMszcrPcffg5uhwSgPCLD2WWxmq6isisz87tzT01tuGhg== + dependencies: + has-symbols "^1.0.2" + +is-typed-array@^1.1.3, is-typed-array@^1.1.7: + version "1.1.8" + resolved "https://registry.yarnpkg.com/is-typed-array/-/is-typed-array-1.1.8.tgz#cbaa6585dc7db43318bc5b89523ea384a6f65e79" + integrity sha512-HqH41TNZq2fgtGT8WHVFVJhBVGuY3AnP3Q36K8JKXUxSxRgk/d+7NjmwG2vo2mYmXK8UYZKu0qH8bVP5gEisjA== + dependencies: + available-typed-arrays "^1.0.5" + call-bind "^1.0.2" + es-abstract "^1.18.5" + foreach "^2.0.5" + has-tostringtag "^1.0.0" + +is-what@^3.12.0: + version "3.14.1" + resolved "https://registry.yarnpkg.com/is-what/-/is-what-3.14.1.tgz#e1222f46ddda85dead0fd1c9df131760e77755c1" + integrity sha512-sNxgpk9793nzSs7bA6JQJGeIuRBQhAaNGG77kzYQgMkrID+lS6SlK07K5LaptscDlSaIgH+GPFzf+d75FVxozA== + +is-windows@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/is-windows/-/is-windows-1.0.2.tgz#d1850eb9791ecd18e6182ce12a30f396634bb19d" + integrity sha512-eXK1UInq2bPmjyX6e3VHIzMLobc4J94i4AWn+Hpq3OU5KkrRC96OAcR3PRJ/pGu6m8TRnBHP9dkXQVsT/COVIA== + +is-wsl@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/is-wsl/-/is-wsl-1.1.0.tgz#1f16e4aa22b04d1336b66188a66af3c600c3a66d" + integrity sha1-HxbkqiKwTRM2tmGIpmrzxgDDpm0= + +isarray@1.0.0, isarray@^1.0.0, isarray@~1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/isarray/-/isarray-1.0.0.tgz#bb935d48582cba168c06834957a54a3e07124f11" + integrity sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE= + +isexe@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/isexe/-/isexe-2.0.0.tgz#e8fbf374dc556ff8947a10dcb0572d633f2cfa10" + integrity sha1-6PvzdNxVb/iUehDcsFctYz8s+hA= + +isobject@^2.0.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/isobject/-/isobject-2.1.0.tgz#f065561096a3f1da2ef46272f815c840d87e0c89" + integrity sha1-8GVWEJaj8dou9GJy+BXIQNh+DIk= + dependencies: + isarray "1.0.0" + +isobject@^3.0.0, isobject@^3.0.1: + version "3.0.1" + resolved "https://registry.yarnpkg.com/isobject/-/isobject-3.0.1.tgz#4e431e92b11a9731636aa1f9c8d1ccbcfdab78df" + integrity sha1-TkMekrEalzFjaqH5yNHMvP2reN8= + +jest-worker@27.0.0-next.5: + version "27.0.0-next.5" + resolved "https://registry.yarnpkg.com/jest-worker/-/jest-worker-27.0.0-next.5.tgz#5985ee29b12a4e191f4aae4bb73b97971d86ec28" + integrity sha512-mk0umAQ5lT+CaOJ+Qp01N6kz48sJG2kr2n1rX0koqKf6FIygQV0qLOdN9SCYID4IVeSigDOcPeGLozdMLYfb5g== + dependencies: + "@types/node" "*" + merge-stream "^2.0.0" + supports-color "^8.0.0" + +"js-tokens@^3.0.0 || ^4.0.0", js-tokens@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/js-tokens/-/js-tokens-4.0.0.tgz#19203fb59991df98e3a287050d4647cdeaf32499" + integrity sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ== + +js-tokens@^3.0.2: + version "3.0.2" + resolved "https://registry.yarnpkg.com/js-tokens/-/js-tokens-3.0.2.tgz#9866df395102130e38f7f996bceb65443209c25b" + integrity sha1-mGbfOVECEw449/mWvOtlRDIJwls= + +js-yaml@^3.13.1: + version "3.14.1" + resolved "https://registry.yarnpkg.com/js-yaml/-/js-yaml-3.14.1.tgz#dae812fdb3825fa306609a8717383c50c36a0537" + integrity sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g== + dependencies: + argparse "^1.0.7" + esprima "^4.0.0" + +jsesc@^2.5.1: + version "2.5.2" + resolved "https://registry.yarnpkg.com/jsesc/-/jsesc-2.5.2.tgz#80564d2e483dacf6e8ef209650a67df3f0c283a4" + integrity sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA== + +json-parse-better-errors@^1.0.1, json-parse-better-errors@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/json-parse-better-errors/-/json-parse-better-errors-1.0.2.tgz#bb867cfb3450e69107c131d1c514bab3dc8bcaa9" + integrity sha512-mrqyZKfX5EhL7hvqcV6WG1yYjnjeuYDzDhhcAAUrq8Po85NBQBJP+ZDUT75qZQ98IkUoBqdkExkukOU7Ts2wrw== + +json-schema-traverse@^0.4.1: + version "0.4.1" + resolved "https://registry.yarnpkg.com/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz#69f6a87d9513ab8bb8fe63bdb0979c448e684660" + integrity sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg== + +json-schema-traverse@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz#ae7bcb3656ab77a73ba5c49bf654f38e6b6860e2" + integrity sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug== + +json-stable-stringify-without-jsonify@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz#9db7b59496ad3f3cfef30a75142d2d930ad72651" + integrity sha1-nbe1lJatPzz+8wp1FC0tkwrXJlE= + +json2mq@^0.2.0: + version "0.2.0" + resolved "https://registry.yarnpkg.com/json2mq/-/json2mq-0.2.0.tgz#b637bd3ba9eabe122c83e9720483aeb10d2c904a" + integrity sha1-tje9O6nqvhIsg+lyBIOusQ0skEo= + dependencies: + string-convert "^0.2.0" + +json5@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/json5/-/json5-1.0.1.tgz#779fb0018604fa854eacbf6252180d83543e3dbe" + integrity sha512-aKS4WQjPenRxiQsC93MNfjx+nbF4PAdYzmd/1JIj8HYzqfbu86beTuNgXDzPknWk0n0uARlyewZo4s++ES36Ow== + dependencies: + minimist "^1.2.0" + +json5@^2.1.2: + version "2.2.0" + resolved "https://registry.yarnpkg.com/json5/-/json5-2.2.0.tgz#2dfefe720c6ba525d9ebd909950f0515316c89a3" + integrity sha512-f+8cldu7X/y7RAJurMEJmdoKXGB/X550w2Nr3tTbezL6RwEE/iMcm+tZnXeoZtKuOq6ft8+CqzEkrIgx1fPoQA== + dependencies: + minimist "^1.2.5" + +kind-of@^3.0.2, kind-of@^3.0.3, kind-of@^3.2.0: + version "3.2.2" + resolved "https://registry.yarnpkg.com/kind-of/-/kind-of-3.2.2.tgz#31ea21a734bab9bbb0f32466d893aea51e4a3c64" + integrity sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ= + dependencies: + is-buffer "^1.1.5" + +kind-of@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/kind-of/-/kind-of-4.0.0.tgz#20813df3d712928b207378691a45066fae72dd57" + integrity sha1-IIE989cSkosgc3hpGkUGb65y3Vc= + dependencies: + is-buffer "^1.1.5" + +kind-of@^5.0.0: + version "5.1.0" + resolved "https://registry.yarnpkg.com/kind-of/-/kind-of-5.1.0.tgz#729c91e2d857b7a419a1f9aa65685c4c33f5845d" + integrity sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw== + +kind-of@^6.0.0, kind-of@^6.0.2: + version "6.0.3" + resolved "https://registry.yarnpkg.com/kind-of/-/kind-of-6.0.3.tgz#07c05034a6c349fa06e24fa35aa76db4580ce4dd" + integrity sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw== + +klona@^2.0.4: + version "2.0.4" + resolved "https://registry.yarnpkg.com/klona/-/klona-2.0.4.tgz#7bb1e3affb0cb8624547ef7e8f6708ea2e39dfc0" + integrity sha512-ZRbnvdg/NxqzC7L9Uyqzf4psi1OM4Cuc+sJAkQPjO6XkQIJTNbfK2Rsmbw8fx1p2mkZdp2FZYo2+LwXYY/uwIA== + +less-loader@^7: + version "7.3.0" + resolved "https://registry.yarnpkg.com/less-loader/-/less-loader-7.3.0.tgz#f9d6d36d18739d642067a05fb5bd70c8c61317e5" + integrity sha512-Mi8915g7NMaLlgi77mgTTQvK022xKRQBIVDSyfl3ErTuBhmZBQab0mjeJjNNqGbdR+qrfTleKXqbGI4uEFavxg== + dependencies: + klona "^2.0.4" + loader-utils "^2.0.0" + schema-utils "^3.0.0" + +less@^4.1.1: + version "4.1.1" + resolved "https://registry.yarnpkg.com/less/-/less-4.1.1.tgz#15bf253a9939791dc690888c3ff424f3e6c7edba" + integrity sha512-w09o8tZFPThBscl5d0Ggp3RcrKIouBoQscnOMgFH3n5V3kN/CXGHNfCkRPtxJk6nKryDXaV9aHLK55RXuH4sAw== + dependencies: + copy-anything "^2.0.1" + parse-node-version "^1.0.1" + tslib "^1.10.0" + optionalDependencies: + errno "^0.1.1" + graceful-fs "^4.1.2" + image-size "~0.5.0" + make-dir "^2.1.0" + mime "^1.4.1" + needle "^2.5.2" + source-map "~0.6.0" + +levn@^0.4.1: + version "0.4.1" + resolved "https://registry.yarnpkg.com/levn/-/levn-0.4.1.tgz#ae4562c007473b932a6200d403268dd2fffc6ade" + integrity sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ== + dependencies: + prelude-ls "^1.2.1" + type-check "~0.4.0" + +loader-runner@^2.4.0: + version "2.4.0" + resolved "https://registry.yarnpkg.com/loader-runner/-/loader-runner-2.4.0.tgz#ed47066bfe534d7e84c4c7b9998c2a75607d9357" + integrity sha512-Jsmr89RcXGIwivFY21FcRrisYZfvLMTWx5kOLc+JTxtpBOG6xML0vzbc6SEQG2FO9/4Fc3wW4LVcB5DmGflaRw== + +loader-utils@1.2.3: + version "1.2.3" + resolved "https://registry.yarnpkg.com/loader-utils/-/loader-utils-1.2.3.tgz#1ff5dc6911c9f0a062531a4c04b609406108c2c7" + integrity sha512-fkpz8ejdnEMG3s37wGL07iSBDg99O9D5yflE9RGNH3hRdx9SOwYfnGYdZOUIZitN8E+E2vkq3MUMYMvPYl5ZZA== + dependencies: + big.js "^5.2.2" + emojis-list "^2.0.0" + json5 "^1.0.1" + +loader-utils@^1.0.2, loader-utils@^1.1.0, loader-utils@^1.2.3, loader-utils@^1.4.0: + version "1.4.0" + resolved "https://registry.yarnpkg.com/loader-utils/-/loader-utils-1.4.0.tgz#c579b5e34cb34b1a74edc6c1fb36bfa371d5a613" + integrity sha512-qH0WSMBtn/oHuwjy/NucEgbx5dbxxnxup9s4PVXJUDHZBQY+s0NWA9rJf53RBnQZxfch7euUui7hpoAPvALZdA== + dependencies: + big.js "^5.2.2" + emojis-list "^3.0.0" + json5 "^1.0.1" + +loader-utils@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/loader-utils/-/loader-utils-2.0.0.tgz#e4cace5b816d425a166b5f097e10cd12b36064b0" + integrity sha512-rP4F0h2RaWSvPEkD7BLDFQnvSf+nK+wr3ESUjNTyAGobqrijmW92zc+SO6d4p4B1wh7+B/Jg1mkQe5NYUEHtHQ== + dependencies: + big.js "^5.2.2" + emojis-list "^3.0.0" + json5 "^2.1.2" + +locate-path@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/locate-path/-/locate-path-2.0.0.tgz#2b568b265eec944c6d9c0de9c3dbbbca0354cd8e" + integrity sha1-K1aLJl7slExtnA3pw9u7ygNUzY4= + dependencies: + p-locate "^2.0.0" + path-exists "^3.0.0" + +locate-path@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/locate-path/-/locate-path-3.0.0.tgz#dbec3b3ab759758071b58fe59fc41871af21400e" + integrity sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A== + dependencies: + p-locate "^3.0.0" + path-exists "^3.0.0" + +locate-path@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/locate-path/-/locate-path-5.0.0.tgz#1afba396afd676a6d42504d0a67a3a7eb9f62aa0" + integrity sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g== + dependencies: + p-locate "^4.1.0" + +lodash.camelcase@^4.3.0: + version "4.3.0" + resolved "https://registry.yarnpkg.com/lodash.camelcase/-/lodash.camelcase-4.3.0.tgz#b28aa6288a2b9fc651035c7711f65ab6190331a6" + integrity sha1-soqmKIorn8ZRA1x3EfZathkDMaY= + +lodash.clonedeep@^4.5.0: + version "4.5.0" + resolved "https://registry.yarnpkg.com/lodash.clonedeep/-/lodash.clonedeep-4.5.0.tgz#e23f3f9c4f8fbdde872529c1071857a086e5ccef" + integrity sha1-4j8/nE+Pvd6HJSnBBxhXoIblzO8= + +lodash.merge@^4.6.2: + version "4.6.2" + resolved "https://registry.yarnpkg.com/lodash.merge/-/lodash.merge-4.6.2.tgz#558aa53b43b661e1925a0afdfa36a9a1085fe57a" + integrity sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ== + +lodash.sortby@^4.7.0: + version "4.7.0" + resolved "https://registry.yarnpkg.com/lodash.sortby/-/lodash.sortby-4.7.0.tgz#edd14c824e2cc9c1e0b0a1b42bb5210516a42438" + integrity sha1-7dFMgk4sycHgsKG0K7UhBRakJDg= + +lodash.truncate@^4.4.2: + version "4.4.2" + resolved "https://registry.yarnpkg.com/lodash.truncate/-/lodash.truncate-4.4.2.tgz#5a350da0b1113b837ecfffd5812cbe58d6eae193" + integrity sha1-WjUNoLERO4N+z//VgSy+WNbq4ZM= + +lodash@^4.17.13, lodash@^4.17.21: + version "4.17.21" + resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.21.tgz#679591c564c3bffaae8454cf0b3df370c3d6911c" + integrity sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg== + +loose-envify@^1.0.0, loose-envify@^1.1.0, loose-envify@^1.4.0: + version "1.4.0" + resolved "https://registry.yarnpkg.com/loose-envify/-/loose-envify-1.4.0.tgz#71ee51fa7be4caec1a63839f7e682d8132d30caf" + integrity sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q== + dependencies: + js-tokens "^3.0.0 || ^4.0.0" + +lru-cache@^5.1.1: + version "5.1.1" + resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-5.1.1.tgz#1da27e6710271947695daf6848e847f01d84b920" + integrity sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w== + dependencies: + yallist "^3.0.2" + +lru-cache@^6.0.0: + version "6.0.0" + resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-6.0.0.tgz#6d6fe6570ebd96aaf90fcad1dafa3b2566db3a94" + integrity sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA== + dependencies: + yallist "^4.0.0" + +make-dir@^2.0.0, make-dir@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/make-dir/-/make-dir-2.1.0.tgz#5f0310e18b8be898cc07009295a30ae41e91e6f5" + integrity sha512-LS9X+dc8KLxXCb8dni79fLIIUA5VyZoyjSMCwTluaXA0o27cCK0bhXkpgw+sTXVpPy/lSO57ilRixqk0vDmtRA== + dependencies: + pify "^4.0.1" + semver "^5.6.0" + +make-dir@^3.0.2, make-dir@^3.1.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/make-dir/-/make-dir-3.1.0.tgz#415e967046b3a7f1d185277d84aa58203726a13f" + integrity sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw== + dependencies: + semver "^6.0.0" + +map-cache@^0.2.2: + version "0.2.2" + resolved "https://registry.yarnpkg.com/map-cache/-/map-cache-0.2.2.tgz#c32abd0bd6525d9b051645bb4f26ac5dc98a0dbf" + integrity sha1-wyq9C9ZSXZsFFkW7TyasXcmKDb8= + +map-visit@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/map-visit/-/map-visit-1.0.0.tgz#ecdca8f13144e660f1b5bd41f12f3479d98dfb8f" + integrity sha1-7Nyo8TFE5mDxtb1B8S80edmN+48= + dependencies: + object-visit "^1.0.0" + +md5.js@^1.3.4: + version "1.3.5" + resolved "https://registry.yarnpkg.com/md5.js/-/md5.js-1.3.5.tgz#b5d07b8e3216e3e27cd728d72f70d1e6a342005f" + integrity sha512-xitP+WxNPcTTOgnTJcrhM0xvdPepipPSf3I8EIpGKeFLjt3PlJLIDG3u8EX53ZIubkb+5U2+3rELYpEhHhzdkg== + dependencies: + hash-base "^3.0.0" + inherits "^2.0.1" + safe-buffer "^5.1.2" + +memory-fs@^0.4.1: + version "0.4.1" + resolved "https://registry.yarnpkg.com/memory-fs/-/memory-fs-0.4.1.tgz#3a9a20b8462523e447cfbc7e8bb80ed667bfc552" + integrity sha1-OpoguEYlI+RHz7x+i7gO1me/xVI= + dependencies: + errno "^0.1.3" + readable-stream "^2.0.1" + +memory-fs@^0.5.0: + version "0.5.0" + resolved "https://registry.yarnpkg.com/memory-fs/-/memory-fs-0.5.0.tgz#324c01288b88652966d161db77838720845a8e3c" + integrity sha512-jA0rdU5KoQMC0e6ppoNRtpp6vjFq6+NY7r8hywnC7V+1Xj/MtHwGIbB1QaK/dunyjWteJzmkpd7ooeWg10T7GA== + dependencies: + errno "^0.1.3" + readable-stream "^2.0.1" + +merge-stream@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/merge-stream/-/merge-stream-2.0.0.tgz#52823629a14dd00c9770fb6ad47dc6310f2c1f60" + integrity sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w== + +merge2@^1.3.0: + version "1.4.1" + resolved "https://registry.yarnpkg.com/merge2/-/merge2-1.4.1.tgz#4368892f885e907455a6fd7dc55c0c9d404990ae" + integrity sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg== + +micromatch@^3.1.10, micromatch@^3.1.4: + version "3.1.10" + resolved "https://registry.yarnpkg.com/micromatch/-/micromatch-3.1.10.tgz#70859bc95c9840952f359a068a3fc49f9ecfac23" + integrity sha512-MWikgl9n9M3w+bpsY3He8L+w9eF9338xRl8IAO5viDizwSzziFEyUzo2xrrloB64ADbTf8uA8vRqqttDTOmccg== + dependencies: + arr-diff "^4.0.0" + array-unique "^0.3.2" + braces "^2.3.1" + define-property "^2.0.2" + extend-shallow "^3.0.2" + extglob "^2.0.4" + fragment-cache "^0.2.1" + kind-of "^6.0.2" + nanomatch "^1.2.9" + object.pick "^1.3.0" + regex-not "^1.0.0" + snapdragon "^0.8.1" + to-regex "^3.0.2" + +micromatch@^4.0.4: + version "4.0.4" + resolved "https://registry.yarnpkg.com/micromatch/-/micromatch-4.0.4.tgz#896d519dfe9db25fce94ceb7a500919bf881ebf9" + integrity sha512-pRmzw/XUcwXGpD9aI9q/0XOwLNygjETJ8y0ao0wdqprrzDa4YnxLcz7fQRZr8voh8V10kGhABbNcHVk5wHgWwg== + dependencies: + braces "^3.0.1" + picomatch "^2.2.3" + +miller-rabin@^4.0.0: + version "4.0.1" + resolved "https://registry.yarnpkg.com/miller-rabin/-/miller-rabin-4.0.1.tgz#f080351c865b0dc562a8462966daa53543c78a4d" + integrity sha512-115fLhvZVqWwHPbClyntxEVfVDfl9DLLTuJvq3g2O/Oxi8AiNouAHvDSzHS0viUJc+V5vm3eq91Xwqn9dp4jRA== + dependencies: + bn.js "^4.0.0" + brorand "^1.0.1" + +mime-db@1.49.0: + version "1.49.0" + resolved "https://registry.yarnpkg.com/mime-db/-/mime-db-1.49.0.tgz#f3dfde60c99e9cf3bc9701d687778f537001cbed" + integrity sha512-CIc8j9URtOVApSFCQIF+VBkX1RwXp/oMMOrqdyXSBXq5RWNEsRfyj1kiRnQgmNXmHxPoFIxOroKA3zcU9P+nAA== + +mime-types@^2.1.27: + version "2.1.32" + resolved "https://registry.yarnpkg.com/mime-types/-/mime-types-2.1.32.tgz#1d00e89e7de7fe02008db61001d9e02852670fd5" + integrity sha512-hJGaVS4G4c9TSMYh2n6SQAGrC4RnfU+daP8G7cSCmaqNjiOoUY0VHCMS42pxnQmVF1GWwFhbHWn3RIxCqTmZ9A== + dependencies: + mime-db "1.49.0" + +mime@^1.4.1: + version "1.6.0" + resolved "https://registry.yarnpkg.com/mime/-/mime-1.6.0.tgz#32cd9e5c64553bd58d19a568af452acff04981b1" + integrity sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg== + +mini-css-extract-plugin@0.4.3: + version "0.4.3" + resolved "https://registry.yarnpkg.com/mini-css-extract-plugin/-/mini-css-extract-plugin-0.4.3.tgz#98d60fcc5d228c3e36a9bd15a1d6816d6580beb8" + integrity sha512-Mxs0nxzF1kxPv4TRi2NimewgXlJqh0rGE30vviCU2WHrpbta6wklnUV9dr9FUtoAHmB3p3LeXEC+ZjgHvB0Dzg== + dependencies: + loader-utils "^1.1.0" + schema-utils "^1.0.0" + webpack-sources "^1.1.0" + +minimalistic-assert@^1.0.0, minimalistic-assert@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/minimalistic-assert/-/minimalistic-assert-1.0.1.tgz#2e194de044626d4a10e7f7fbc00ce73e83e4d5c7" + integrity sha512-UtJcAD4yEaGtjPezWuO9wC4nwUnVH/8/Im3yEHQP4b67cXlD/Qr9hdITCU1xDbSEXg2XKNaP8jsReV7vQd00/A== + +minimalistic-crypto-utils@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/minimalistic-crypto-utils/-/minimalistic-crypto-utils-1.0.1.tgz#f6c00c1c0b082246e5c4d99dfb8c7c083b2b582a" + integrity sha1-9sAMHAsIIkblxNmd+4x8CDsrWCo= + +minimatch@^3.0.4: + version "3.0.4" + resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-3.0.4.tgz#5166e286457f03306064be5497e8dbb0c3d32083" + integrity sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA== + dependencies: + brace-expansion "^1.1.7" + +minimist@^1.2.0, minimist@^1.2.5: + version "1.2.5" + resolved "https://registry.yarnpkg.com/minimist/-/minimist-1.2.5.tgz#67d66014b66a6a8aaa0c083c5fd58df4e4e97602" + integrity sha512-FM9nNUYrRBAELZQT3xeZQ7fmMOBg6nWNmJKTcgsJeaLstP/UODVpGsr5OhXhhXg6f+qtJ8uiZ+PUxkDWcgIXLw== + +mississippi@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/mississippi/-/mississippi-3.0.0.tgz#ea0a3291f97e0b5e8776b363d5f0a12d94c67022" + integrity sha512-x471SsVjUtBRtcvd4BzKE9kFC+/2TeWgKCgw0bZcw1b9l2X3QX5vCWgF+KaZaYm87Ss//rHnWryupDrgLvmSkA== + dependencies: + concat-stream "^1.5.0" + duplexify "^3.4.2" + end-of-stream "^1.1.0" + flush-write-stream "^1.0.0" + from2 "^2.1.0" + parallel-transform "^1.1.0" + pump "^3.0.0" + pumpify "^1.3.3" + stream-each "^1.1.0" + through2 "^2.0.0" + +mixin-deep@^1.2.0: + version "1.3.2" + resolved "https://registry.yarnpkg.com/mixin-deep/-/mixin-deep-1.3.2.tgz#1120b43dc359a785dce65b55b82e257ccf479566" + integrity sha512-WRoDn//mXBiJ1H40rqa3vH0toePwSsGb45iInWlTySa+Uu4k3tYUSxa2v1KqAiLtvlrSzaExqS1gtk96A9zvEA== + dependencies: + for-in "^1.0.2" + is-extendable "^1.0.1" + +mkdirp@^0.5.1, mkdirp@^0.5.3: + version "0.5.5" + resolved "https://registry.yarnpkg.com/mkdirp/-/mkdirp-0.5.5.tgz#d91cefd62d1436ca0f41620e251288d420099def" + integrity sha512-NKmAlESf6jMGym1++R0Ra7wvhV+wFW63FaSOFPwRahvea0gMUcGUhVeAg/0BC0wiv9ih5NYPB1Wn1UEI1/L+xQ== + dependencies: + minimist "^1.2.5" + +moment@^2.24.0, moment@^2.25.3: + version "2.29.1" + resolved "https://registry.yarnpkg.com/moment/-/moment-2.29.1.tgz#b2be769fa31940be9eeea6469c075e35006fa3d3" + integrity sha512-kHmoybcPV8Sqy59DwNDY3Jefr64lK/by/da0ViFcuA4DH0vQg5Q6Ze5VimxkfQNSC+Mls/Kx53s7TjP1RhFEDQ== + +move-concurrently@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/move-concurrently/-/move-concurrently-1.0.1.tgz#be2c005fda32e0b29af1f05d7c4b33214c701f92" + integrity sha1-viwAX9oy4LKa8fBdfEszIUxwH5I= + dependencies: + aproba "^1.1.1" + copy-concurrently "^1.0.0" + fs-write-stream-atomic "^1.0.8" + mkdirp "^0.5.1" + rimraf "^2.5.4" + run-queue "^1.0.3" + +ms@2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/ms/-/ms-2.0.0.tgz#5608aeadfc00be6c2901df5f9861788de0d597c8" + integrity sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g= + +ms@2.1.2: + version "2.1.2" + resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.2.tgz#d09d1f357b443f493382a8eb3ccd183872ae6009" + integrity sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w== + +ms@^2.1.1: + version "2.1.3" + resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.3.tgz#574c8138ce1d2b5861f0b44579dbadd60c6615b2" + integrity sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA== + +nan@^2.12.1: + version "2.15.0" + resolved "https://registry.yarnpkg.com/nan/-/nan-2.15.0.tgz#3f34a473ff18e15c1b5626b62903b5ad6e665fee" + integrity sha512-8ZtvEnA2c5aYCZYd1cvgdnU6cqwixRoYg70xPLWUws5ORTa/lnw+u4amixRS/Ac5U5mQVgp9pnlSUnbNWFaWZQ== + +nanoid@^3.1.22: + version "3.1.25" + resolved "https://registry.yarnpkg.com/nanoid/-/nanoid-3.1.25.tgz#09ca32747c0e543f0e1814b7d3793477f9c8e152" + integrity sha512-rdwtIXaXCLFAQbnfqDRnI6jaRHp9fTcYBjtFKE8eezcZ7LuLjhUaQGNeMXf1HmRoCH32CLz6XwX0TtxEOS/A3Q== + +nanomatch@^1.2.9: + version "1.2.13" + resolved "https://registry.yarnpkg.com/nanomatch/-/nanomatch-1.2.13.tgz#b87a8aa4fc0de8fe6be88895b38983ff265bd119" + integrity sha512-fpoe2T0RbHwBTBUOftAfBPaDEi06ufaUai0mE6Yn1kacc3SnTErfb/h+X94VXzI64rKFHYImXSvdwGGCmwOqCA== + dependencies: + arr-diff "^4.0.0" + array-unique "^0.3.2" + define-property "^2.0.2" + extend-shallow "^3.0.2" + fragment-cache "^0.2.1" + is-windows "^1.0.2" + kind-of "^6.0.2" + object.pick "^1.3.0" + regex-not "^1.0.0" + snapdragon "^0.8.1" + to-regex "^3.0.1" + +native-url@0.3.4: + version "0.3.4" + resolved "https://registry.yarnpkg.com/native-url/-/native-url-0.3.4.tgz#29c943172aed86c63cee62c8c04db7f5756661f8" + integrity sha512-6iM8R99ze45ivyH8vybJ7X0yekIcPf5GgLV5K0ENCbmRcaRIDoj37BC8iLEmaaBfqqb8enuZ5p0uhY+lVAbAcA== + dependencies: + querystring "^0.2.0" + +natural-compare@^1.4.0: + version "1.4.0" + resolved "https://registry.yarnpkg.com/natural-compare/-/natural-compare-1.4.0.tgz#4abebfeed7541f2c27acfb29bdbbd15c8d5ba4f7" + integrity sha1-Sr6/7tdUHywnrPspvbvRXI1bpPc= + +needle@^2.5.2: + version "2.9.1" + resolved "https://registry.yarnpkg.com/needle/-/needle-2.9.1.tgz#22d1dffbe3490c2b83e301f7709b6736cd8f2684" + integrity sha512-6R9fqJ5Zcmf+uYaFgdIHmLwNldn5HbK8L5ybn7Uz+ylX/rnOsSp1AHcvQSrCaFN+qNM1wpymHqD7mVasEOlHGQ== + dependencies: + debug "^3.2.6" + iconv-lite "^0.4.4" + sax "^1.2.4" + +neo-async@^2.5.0, neo-async@^2.6.1: + version "2.6.2" + resolved "https://registry.yarnpkg.com/neo-async/-/neo-async-2.6.2.tgz#b4aafb93e3aeb2d8174ca53cf163ab7d7308305f" + integrity sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw== + +next-compose-plugins@^2.2.1: + version "2.2.1" + resolved "https://registry.yarnpkg.com/next-compose-plugins/-/next-compose-plugins-2.2.1.tgz#020fc53f275a7e719d62521bef4300fbb6fde5ab" + integrity sha512-OjJ+fV15FXO2uQXQagLD4C0abYErBjyjE0I0FHpOEIB8upw0hg1ldFP6cqHTJBH1cZqy96OeR3u1dJ+Ez2D4Bg== + +next-images@^1.7.0: + version "1.8.1" + resolved "https://registry.yarnpkg.com/next-images/-/next-images-1.8.1.tgz#adea0c46a2e837cb49b6f95b478500a7ed4eea4f" + integrity sha512-/DoXucQKWkEBT2rCQKtm9bb+KTAnd1vVTLO12lX4oxdiBQa2uqn5vhcMPwKsdJlxNBzwg6EVnddFs3aqcwiiGA== + dependencies: + file-loader "^6.2.0" + url-loader "^4.1.0" + +next-plugin-antd-less@^1.4.2: + version "1.4.2" + resolved "https://registry.yarnpkg.com/next-plugin-antd-less/-/next-plugin-antd-less-1.4.2.tgz#1184700402bccf719ca3f70354ef1dcecf3619b1" + integrity sha512-ArPdpv8z4M9I7xw+xnzG6wiKYHarEVrEo1tutMZPhD2qzcFWrmab0cw6McZutofxIe4VL9kedrlUDVo1iIfLxQ== + dependencies: + clone "^2.1.2" + less "^4.1.1" + less-loader "^7" + null-loader "^4.0.1" + +next@^10.2.3: + version "10.2.3" + resolved "https://registry.yarnpkg.com/next/-/next-10.2.3.tgz#5aa058a63626338cea91c198fda8f2715c058394" + integrity sha512-dkM1mIfnORtGyzw/Yme8RdqNxlCMZyi4Lqj56F01/yHbe1ZtOaJ0cyqqRB4RGiPhjGGh0319f8ddjDyO1605Ow== + dependencies: + "@babel/runtime" "7.12.5" + "@hapi/accept" "5.0.2" + "@next/env" "10.2.3" + "@next/polyfill-module" "10.2.3" + "@next/react-dev-overlay" "10.2.3" + "@next/react-refresh-utils" "10.2.3" + "@opentelemetry/api" "0.14.0" + assert "2.0.0" + ast-types "0.13.2" + browserify-zlib "0.2.0" + browserslist "4.16.6" + buffer "5.6.0" + caniuse-lite "^1.0.30001228" + chalk "2.4.2" + chokidar "3.5.1" + constants-browserify "1.0.0" + crypto-browserify "3.12.0" + cssnano-simple "2.0.0" + domain-browser "4.19.0" + encoding "0.1.13" + etag "1.8.1" + find-cache-dir "3.3.1" + get-orientation "1.1.2" + https-browserify "1.0.0" + jest-worker "27.0.0-next.5" + native-url "0.3.4" + node-fetch "2.6.1" + node-html-parser "1.4.9" + node-libs-browser "^2.2.1" + os-browserify "0.3.0" + p-limit "3.1.0" + path-browserify "1.0.1" + pnp-webpack-plugin "1.6.4" + postcss "8.2.13" + process "0.11.10" + prop-types "15.7.2" + querystring-es3 "0.2.1" + raw-body "2.4.1" + react-is "16.13.1" + react-refresh "0.8.3" + stream-browserify "3.0.0" + stream-http "3.1.1" + string_decoder "1.3.0" + styled-jsx "3.3.2" + timers-browserify "2.0.12" + tty-browserify "0.0.1" + use-subscription "1.5.1" + util "0.12.3" + vm-browserify "1.1.2" + watchpack "2.1.1" + +node-fetch@2.6.1: + version "2.6.1" + resolved "https://registry.yarnpkg.com/node-fetch/-/node-fetch-2.6.1.tgz#045bd323631f76ed2e2b55573394416b639a0052" + integrity sha512-V4aYg89jEoVRxRb2fJdAg8FHvI7cEyYdVAh94HH0UIK8oJxUfkjlDQN9RbMx+bEjP7+ggMiFRprSti032Oipxw== + +node-html-parser@1.4.9: + version "1.4.9" + resolved "https://registry.yarnpkg.com/node-html-parser/-/node-html-parser-1.4.9.tgz#3c8f6cac46479fae5800725edb532e9ae8fd816c" + integrity sha512-UVcirFD1Bn0O+TSmloHeHqZZCxHjvtIeGdVdGMhyZ8/PWlEiZaZ5iJzR189yKZr8p0FXN58BUeC7RHRkf/KYGw== + dependencies: + he "1.2.0" + +node-libs-browser@^2.2.1: + version "2.2.1" + resolved "https://registry.yarnpkg.com/node-libs-browser/-/node-libs-browser-2.2.1.tgz#b64f513d18338625f90346d27b0d235e631f6425" + integrity sha512-h/zcD8H9kaDZ9ALUWwlBUDo6TKF8a7qBSCSEGfjTVIYeqsioSKaAX+BN7NgiMGp6iSIXZ3PxgCu8KS3b71YK5Q== + dependencies: + assert "^1.1.1" + browserify-zlib "^0.2.0" + buffer "^4.3.0" + console-browserify "^1.1.0" + constants-browserify "^1.0.0" + crypto-browserify "^3.11.0" + domain-browser "^1.1.1" + events "^3.0.0" + https-browserify "^1.0.0" + os-browserify "^0.3.0" + path-browserify "0.0.1" + process "^0.11.10" + punycode "^1.2.4" + querystring-es3 "^0.2.0" + readable-stream "^2.3.3" + stream-browserify "^2.0.1" + stream-http "^2.7.2" + string_decoder "^1.0.0" + timers-browserify "^2.0.4" + tty-browserify "0.0.0" + url "^0.11.0" + util "^0.11.0" + vm-browserify "^1.0.1" + +node-releases@^1.1.71, node-releases@^1.1.75: + version "1.1.75" + resolved "https://registry.yarnpkg.com/node-releases/-/node-releases-1.1.75.tgz#6dd8c876b9897a1b8e5a02de26afa79bb54ebbfe" + integrity sha512-Qe5OUajvqrqDSy6wrWFmMwfJ0jVgwiw4T3KqmbTcZ62qW0gQkheXYhcFM1+lOVcGUoRxcEcfyvFMAnDgaF1VWw== + +normalize-path@^2.1.1: + version "2.1.1" + resolved "https://registry.yarnpkg.com/normalize-path/-/normalize-path-2.1.1.tgz#1ab28b556e198363a8c1a6f7e6fa20137fe6aed9" + integrity sha1-GrKLVW4Zg2Oowab35vogE3/mrtk= + dependencies: + remove-trailing-separator "^1.0.1" + +normalize-path@^3.0.0, normalize-path@~3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/normalize-path/-/normalize-path-3.0.0.tgz#0dcd69ff23a1c9b11fd0978316644a0388216a65" + integrity sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA== + +null-loader@4.0.1, null-loader@^4.0.1: + version "4.0.1" + resolved "https://registry.yarnpkg.com/null-loader/-/null-loader-4.0.1.tgz#8e63bd3a2dd3c64236a4679428632edd0a6dbc6a" + integrity sha512-pxqVbi4U6N26lq+LmgIbB5XATP0VdZKOG25DhHi8btMmJJefGArFyDg1yc4U3hWCJbMqSrw0qyrz1UQX+qYXqg== + dependencies: + loader-utils "^2.0.0" + schema-utils "^3.0.0" + +object-assign@^4.1.1: + version "4.1.1" + resolved "https://registry.yarnpkg.com/object-assign/-/object-assign-4.1.1.tgz#2109adc7965887cfc05cbbd442cac8bfbb360863" + integrity sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM= + +object-copy@^0.1.0: + version "0.1.0" + resolved "https://registry.yarnpkg.com/object-copy/-/object-copy-0.1.0.tgz#7e7d858b781bd7c991a41ba975ed3812754e998c" + integrity sha1-fn2Fi3gb18mRpBupde04EnVOmYw= + dependencies: + copy-descriptor "^0.1.0" + define-property "^0.2.5" + kind-of "^3.0.3" + +object-inspect@^1.11.0, object-inspect@^1.9.0: + version "1.11.0" + resolved "https://registry.yarnpkg.com/object-inspect/-/object-inspect-1.11.0.tgz#9dceb146cedd4148a0d9e51ab88d34cf509922b1" + integrity sha512-jp7ikS6Sd3GxQfZJPyH3cjcbJF6GZPClgdV+EFygjFLQ5FmW/dRUnTd9PQ9k0JhoNDabWFbpF1yCdSWCC6gexg== + +object-is@^1.0.1: + version "1.1.5" + resolved "https://registry.yarnpkg.com/object-is/-/object-is-1.1.5.tgz#b9deeaa5fc7f1846a0faecdceec138e5778f53ac" + integrity sha512-3cyDsyHgtmi7I7DfSSI2LDp6SK2lwvtbg0p0R1e0RvTqF5ceGx+K2dfSjm1bKDMVCFEDAQvy+o8c6a7VujOddw== + dependencies: + call-bind "^1.0.2" + define-properties "^1.1.3" + +object-keys@^1.0.12, object-keys@^1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/object-keys/-/object-keys-1.1.1.tgz#1c47f272df277f3b1daf061677d9c82e2322c60e" + integrity sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA== + +object-visit@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/object-visit/-/object-visit-1.0.1.tgz#f79c4493af0c5377b59fe39d395e41042dd045bb" + integrity sha1-95xEk68MU3e1n+OdOV5BBC3QRbs= + dependencies: + isobject "^3.0.0" + +object.assign@^4.1.2: + version "4.1.2" + resolved "https://registry.yarnpkg.com/object.assign/-/object.assign-4.1.2.tgz#0ed54a342eceb37b38ff76eb831a0e788cb63940" + integrity sha512-ixT2L5THXsApyiUPYKmW+2EHpXXe5Ii3M+f4e+aJFAHao5amFRW6J0OO6c/LU8Be47utCx2GL89hxGB6XSmKuQ== + dependencies: + call-bind "^1.0.0" + define-properties "^1.1.3" + has-symbols "^1.0.1" + object-keys "^1.1.1" + +object.pick@^1.3.0: + version "1.3.0" + resolved "https://registry.yarnpkg.com/object.pick/-/object.pick-1.3.0.tgz#87a10ac4c1694bd2e1cbf53591a66141fb5dd747" + integrity sha1-h6EKxMFpS9Lhy/U1kaZhQftd10c= + dependencies: + isobject "^3.0.1" + +once@^1.3.0, once@^1.3.1, once@^1.4.0: + version "1.4.0" + resolved "https://registry.yarnpkg.com/once/-/once-1.4.0.tgz#583b1aa775961d4b113ac17d9c50baef9dd76bd1" + integrity sha1-WDsap3WWHUsROsF9nFC6753Xa9E= + dependencies: + wrappy "1" + +optionator@^0.9.1: + version "0.9.1" + resolved "https://registry.yarnpkg.com/optionator/-/optionator-0.9.1.tgz#4f236a6373dae0566a6d43e1326674f50c291499" + integrity sha512-74RlY5FCnhq4jRxVUPKDaRwrVNXMqsGsiW6AJw4XK8hmtm10wC0ypZBLw5IIp85NZMr91+qd1RvvENwg7jjRFw== + dependencies: + deep-is "^0.1.3" + fast-levenshtein "^2.0.6" + levn "^0.4.1" + prelude-ls "^1.2.1" + type-check "^0.4.0" + word-wrap "^1.2.3" + +os-browserify@0.3.0, os-browserify@^0.3.0: + version "0.3.0" + resolved "https://registry.yarnpkg.com/os-browserify/-/os-browserify-0.3.0.tgz#854373c7f5c2315914fc9bfc6bd8238fdda1ec27" + integrity sha1-hUNzx/XCMVkU/Jv8a9gjj92h7Cc= + +p-limit@3.1.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/p-limit/-/p-limit-3.1.0.tgz#e1daccbe78d0d1388ca18c64fea38e3e57e3706b" + integrity sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ== + dependencies: + yocto-queue "^0.1.0" + +p-limit@^1.1.0: + version "1.3.0" + resolved "https://registry.yarnpkg.com/p-limit/-/p-limit-1.3.0.tgz#b86bd5f0c25690911c7590fcbfc2010d54b3ccb8" + integrity sha512-vvcXsLAJ9Dr5rQOPk7toZQZJApBl2K4J6dANSsEuh6QI41JYcsS/qhTGa9ErIUUgK3WNQoJYvylxvjqmiqEA9Q== + dependencies: + p-try "^1.0.0" + +p-limit@^2.0.0, p-limit@^2.2.0: + version "2.3.0" + resolved "https://registry.yarnpkg.com/p-limit/-/p-limit-2.3.0.tgz#3dd33c647a214fdfffd835933eb086da0dc21db1" + integrity sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w== + dependencies: + p-try "^2.0.0" + +p-locate@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/p-locate/-/p-locate-2.0.0.tgz#20a0103b222a70c8fd39cc2e580680f3dde5ec43" + integrity sha1-IKAQOyIqcMj9OcwuWAaA893l7EM= + dependencies: + p-limit "^1.1.0" + +p-locate@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/p-locate/-/p-locate-3.0.0.tgz#322d69a05c0264b25997d9f40cd8a891ab0064a4" + integrity sha512-x+12w/To+4GFfgJhBEpiDcLozRJGegY+Ei7/z0tSLkMmxGZNybVMSfWj9aJn8Z5Fc7dBUNJOOVgPv2H7IwulSQ== + dependencies: + p-limit "^2.0.0" + +p-locate@^4.1.0: + version "4.1.0" + resolved "https://registry.yarnpkg.com/p-locate/-/p-locate-4.1.0.tgz#a3428bb7088b3a60292f66919278b7c297ad4f07" + integrity sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A== + dependencies: + p-limit "^2.2.0" + +p-try@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/p-try/-/p-try-1.0.0.tgz#cbc79cdbaf8fd4228e13f621f2b1a237c1b207b3" + integrity sha1-y8ec26+P1CKOE/Yh8rGiN8GyB7M= + +p-try@^2.0.0: + version "2.2.0" + resolved "https://registry.yarnpkg.com/p-try/-/p-try-2.2.0.tgz#cb2868540e313d61de58fafbe35ce9004d5540e6" + integrity sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ== + +pako@~1.0.5: + version "1.0.11" + resolved "https://registry.yarnpkg.com/pako/-/pako-1.0.11.tgz#6c9599d340d54dfd3946380252a35705a6b992bf" + integrity sha512-4hLB8Py4zZce5s4yd9XzopqwVv/yGNhV1Bl8NTmCq1763HeK2+EwVTv+leGeL13Dnh2wfbqowVPXCIO0z4taYw== + +parallel-transform@^1.1.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/parallel-transform/-/parallel-transform-1.2.0.tgz#9049ca37d6cb2182c3b1d2c720be94d14a5814fc" + integrity sha512-P2vSmIu38uIlvdcU7fDkyrxj33gTUy/ABO5ZUbGowxNCopBq/OoD42bP4UmMrJoPyk4Uqf0mu3mtWBhHCZD8yg== + dependencies: + cyclist "^1.0.1" + inherits "^2.0.3" + readable-stream "^2.1.5" + +parent-module@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/parent-module/-/parent-module-1.0.1.tgz#691d2709e78c79fae3a156622452d00762caaaa2" + integrity sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g== + dependencies: + callsites "^3.0.0" + +parse-asn1@^5.0.0, parse-asn1@^5.1.5: + version "5.1.6" + resolved "https://registry.yarnpkg.com/parse-asn1/-/parse-asn1-5.1.6.tgz#385080a3ec13cb62a62d39409cb3e88844cdaed4" + integrity sha512-RnZRo1EPU6JBnra2vGHj0yhp6ebyjBZpmUCLHWiFhxlzvBCCpAuZ7elsBp1PVAbQN0/04VD/19rfzlBSwLstMw== + dependencies: + asn1.js "^5.2.0" + browserify-aes "^1.0.0" + evp_bytestokey "^1.0.0" + pbkdf2 "^3.0.3" + safe-buffer "^5.1.1" + +parse-json@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/parse-json/-/parse-json-4.0.0.tgz#be35f5425be1f7f6c747184f98a788cb99477ee0" + integrity sha1-vjX1Qlvh9/bHRxhPmKeIy5lHfuA= + dependencies: + error-ex "^1.3.1" + json-parse-better-errors "^1.0.1" + +parse-node-version@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/parse-node-version/-/parse-node-version-1.0.1.tgz#e2b5dbede00e7fa9bc363607f53327e8b073189b" + integrity sha512-3YHlOa/JgH6Mnpr05jP9eDG254US9ek25LyIxZlDItp2iJtwyaXQb57lBYLdT3MowkUFYEV2XXNAYIPlESvJlA== + +pascalcase@^0.1.1: + version "0.1.1" + resolved "https://registry.yarnpkg.com/pascalcase/-/pascalcase-0.1.1.tgz#b363e55e8006ca6fe21784d2db22bd15d7917f14" + integrity sha1-s2PlXoAGym/iF4TS2yK9FdeRfxQ= + +path-browserify@0.0.1: + version "0.0.1" + resolved "https://registry.yarnpkg.com/path-browserify/-/path-browserify-0.0.1.tgz#e6c4ddd7ed3aa27c68a20cc4e50e1a4ee83bbc4a" + integrity sha512-BapA40NHICOS+USX9SN4tyhq+A2RrN/Ws5F0Z5aMHDp98Fl86lX8Oti8B7uN93L4Ifv4fHOEA+pQw87gmMO/lQ== + +path-browserify@1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/path-browserify/-/path-browserify-1.0.1.tgz#d98454a9c3753d5790860f16f68867b9e46be1fd" + integrity sha512-b7uo2UCUOYZcnF/3ID0lulOJi/bafxa1xPe7ZPsammBSpjSWQkjNxlt635YGS2MiR9GjvuXCtz2emr3jbsz98g== + +path-dirname@^1.0.0: + version "1.0.2" + resolved "https://registry.yarnpkg.com/path-dirname/-/path-dirname-1.0.2.tgz#cc33d24d525e099a5388c0336c6e32b9160609e0" + integrity sha1-zDPSTVJeCZpTiMAzbG4yuRYGCeA= + +path-exists@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/path-exists/-/path-exists-3.0.0.tgz#ce0ebeaa5f78cb18925ea7d810d7b59b010fd515" + integrity sha1-zg6+ql94yxiSXqfYENe1mwEP1RU= + +path-exists@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/path-exists/-/path-exists-4.0.0.tgz#513bdbe2d3b95d7762e8c1137efa195c6c61b5b3" + integrity sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w== + +path-is-absolute@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/path-is-absolute/-/path-is-absolute-1.0.1.tgz#174b9268735534ffbc7ace6bf53a5a9e1b5c5f5f" + integrity sha1-F0uSaHNVNP+8es5r9TpanhtcX18= + +path-key@^3.1.0: + version "3.1.1" + resolved "https://registry.yarnpkg.com/path-key/-/path-key-3.1.1.tgz#581f6ade658cbba65a0d3380de7753295054f375" + integrity sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q== + +path-type@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/path-type/-/path-type-4.0.0.tgz#84ed01c0a7ba380afe09d90a8c180dcd9d03043b" + integrity sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw== + +pbkdf2@^3.0.3: + version "3.1.2" + resolved "https://registry.yarnpkg.com/pbkdf2/-/pbkdf2-3.1.2.tgz#dd822aa0887580e52f1a039dc3eda108efae3075" + integrity sha512-iuh7L6jA7JEGu2WxDwtQP1ddOpaJNC4KlDEFfdQajSGgGPNi4OyDc2R7QnbY2bR9QjBVGwgvTdNJZoE7RaxUMA== + dependencies: + create-hash "^1.1.2" + create-hmac "^1.1.4" + ripemd160 "^2.0.1" + safe-buffer "^5.0.1" + sha.js "^2.4.8" + +picomatch@^2.0.4, picomatch@^2.2.1, picomatch@^2.2.3: + version "2.3.0" + resolved "https://registry.yarnpkg.com/picomatch/-/picomatch-2.3.0.tgz#f1f061de8f6a4bf022892e2d128234fb98302972" + integrity sha512-lY1Q/PiJGC2zOv/z391WOTD+Z02bCgsFfvxoXXf6h7kv9o+WmsmzYqrAwY63sNgOxE4xEdq0WyUnXfKeBrSvYw== + +pify@^4.0.1: + version "4.0.1" + resolved "https://registry.yarnpkg.com/pify/-/pify-4.0.1.tgz#4b2cd25c50d598735c50292224fd8c6df41e3231" + integrity sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g== + +pkg-dir@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/pkg-dir/-/pkg-dir-3.0.0.tgz#2749020f239ed990881b1f71210d51eb6523bea3" + integrity sha512-/E57AYkoeQ25qkxMj5PBOVgF8Kiu/h7cYS30Z5+R7WaiCCBfLq58ZI/dSeaEKb9WVJV5n/03QwrN3IeWIFllvw== + dependencies: + find-up "^3.0.0" + +pkg-dir@^4.1.0: + version "4.2.0" + resolved "https://registry.yarnpkg.com/pkg-dir/-/pkg-dir-4.2.0.tgz#f099133df7ede422e81d1d8448270eeb3e4261f3" + integrity sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ== + dependencies: + find-up "^4.0.0" + +platform@1.3.6: + version "1.3.6" + resolved "https://registry.yarnpkg.com/platform/-/platform-1.3.6.tgz#48b4ce983164b209c2d45a107adb31f473a6e7a7" + integrity sha512-fnWVljUchTro6RiCFvCXBbNhJc2NijN7oIQxbwsyL0buWJPG85v81ehlHI9fXrJsMNgTofEoWIQeClKpgxFLrg== + +pnp-webpack-plugin@1.6.4: + version "1.6.4" + resolved "https://registry.yarnpkg.com/pnp-webpack-plugin/-/pnp-webpack-plugin-1.6.4.tgz#c9711ac4dc48a685dabafc86f8b6dd9f8df84149" + integrity sha512-7Wjy+9E3WwLOEL30D+m8TSTF7qJJUJLONBnwQp0518siuMxUQUbgZwssaFX+QKlZkjHZcw/IpZCt/H0srrntSg== + dependencies: + ts-pnp "^1.1.6" + +posix-character-classes@^0.1.0: + version "0.1.1" + resolved "https://registry.yarnpkg.com/posix-character-classes/-/posix-character-classes-0.1.1.tgz#01eac0fe3b5af71a2a6c02feabb8c1fef7e00eab" + integrity sha1-AerA/jta9xoqbAL+q7jB/vfgDqs= + +postcss-load-config@^2.0.0: + version "2.1.2" + resolved "https://registry.yarnpkg.com/postcss-load-config/-/postcss-load-config-2.1.2.tgz#c5ea504f2c4aef33c7359a34de3573772ad7502a" + integrity sha512-/rDeGV6vMUo3mwJZmeHfEDvwnTKKqQ0S7OHUi/kJvvtx3aWtyWG2/0ZWnzCt2keEclwN6Tf0DST2v9kITdOKYw== + dependencies: + cosmiconfig "^5.0.0" + import-cwd "^2.0.0" + +postcss-loader@3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/postcss-loader/-/postcss-loader-3.0.0.tgz#6b97943e47c72d845fa9e03f273773d4e8dd6c2d" + integrity sha512-cLWoDEY5OwHcAjDnkyRQzAXfs2jrKjXpO/HQFcc5b5u/r7aa471wdmChmwfnv7x2u840iat/wi0lQ5nbRgSkUA== + dependencies: + loader-utils "^1.1.0" + postcss "^7.0.0" + postcss-load-config "^2.0.0" + schema-utils "^1.0.0" + +postcss-modules-extract-imports@^1.2.0: + version "1.2.1" + resolved "https://registry.yarnpkg.com/postcss-modules-extract-imports/-/postcss-modules-extract-imports-1.2.1.tgz#dc87e34148ec7eab5f791f7cd5849833375b741a" + integrity sha512-6jt9XZwUhwmRUhb/CkyJY020PYaPJsCyt3UjbaWo6XEbH/94Hmv6MP7fG2C5NDU/BcHzyGYxNtHvM+LTf9HrYw== + dependencies: + postcss "^6.0.1" + +postcss-modules-local-by-default@^1.2.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/postcss-modules-local-by-default/-/postcss-modules-local-by-default-1.2.0.tgz#f7d80c398c5a393fa7964466bd19500a7d61c069" + integrity sha1-99gMOYxaOT+nlkRmvRlQCn1hwGk= + dependencies: + css-selector-tokenizer "^0.7.0" + postcss "^6.0.1" + +postcss-modules-scope@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/postcss-modules-scope/-/postcss-modules-scope-1.1.0.tgz#d6ea64994c79f97b62a72b426fbe6056a194bb90" + integrity sha1-1upkmUx5+XtipytCb75gVqGUu5A= + dependencies: + css-selector-tokenizer "^0.7.0" + postcss "^6.0.1" + +postcss-modules-values@^1.3.0: + version "1.3.0" + resolved "https://registry.yarnpkg.com/postcss-modules-values/-/postcss-modules-values-1.3.0.tgz#ecffa9d7e192518389f42ad0e83f72aec456ea20" + integrity sha1-7P+p1+GSUYOJ9CrQ6D9yrsRW6iA= + dependencies: + icss-replace-symbols "^1.1.0" + postcss "^6.0.1" + +postcss-value-parser@^3.3.0: + version "3.3.1" + resolved "https://registry.yarnpkg.com/postcss-value-parser/-/postcss-value-parser-3.3.1.tgz#9ff822547e2893213cf1c30efa51ac5fd1ba8281" + integrity sha512-pISE66AbVkp4fDQ7VHBwRNXzAAKJjw4Vw7nWI/+Q3vuly7SNfgYXvm6i5IgFylHGK5sP/xHAbB7N49OS4gWNyQ== + +postcss@8.2.13: + version "8.2.13" + resolved "https://registry.yarnpkg.com/postcss/-/postcss-8.2.13.tgz#dbe043e26e3c068e45113b1ed6375d2d37e2129f" + integrity sha512-FCE5xLH+hjbzRdpbRb1IMCvPv9yZx2QnDarBEYSN0N0HYk+TcXsEhwdFcFb+SRWOKzKGErhIEbBK2ogyLdTtfQ== + dependencies: + colorette "^1.2.2" + nanoid "^3.1.22" + source-map "^0.6.1" + +postcss@^6.0.1, postcss@^6.0.23: + version "6.0.23" + resolved "https://registry.yarnpkg.com/postcss/-/postcss-6.0.23.tgz#61c82cc328ac60e677645f979054eb98bc0e3324" + integrity sha512-soOk1h6J3VMTZtVeVpv15/Hpdl2cBLX3CAw4TAbkpTJiNPk9YP/zWcD1ND+xEtvyuuvKzbxliTOIyvkSeSJ6ag== + dependencies: + chalk "^2.4.1" + source-map "^0.6.1" + supports-color "^5.4.0" + +postcss@^7.0.0: + version "7.0.36" + resolved "https://registry.yarnpkg.com/postcss/-/postcss-7.0.36.tgz#056f8cffa939662a8f5905950c07d5285644dfcb" + integrity sha512-BebJSIUMwJHRH0HAQoxN4u1CN86glsrwsW0q7T+/m44eXOUAxSNdHRkNZPYz5vVUbg17hFgOQDE7fZk7li3pZw== + dependencies: + chalk "^2.4.2" + source-map "^0.6.1" + supports-color "^6.1.0" + +prelude-ls@^1.2.1: + version "1.2.1" + resolved "https://registry.yarnpkg.com/prelude-ls/-/prelude-ls-1.2.1.tgz#debc6489d7a6e6b0e7611888cec880337d316396" + integrity sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g== + +prettier-linter-helpers@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/prettier-linter-helpers/-/prettier-linter-helpers-1.0.0.tgz#d23d41fe1375646de2d0104d3454a3008802cf7b" + integrity sha512-GbK2cP9nraSSUF9N2XwUwqfzlAFlMNYYl+ShE/V+H8a9uNl/oUqB1w2EL54Jh0OlyRSd8RfWYJ3coVS4TROP2w== + dependencies: + fast-diff "^1.1.2" + +prettier@^2.4.1: + version "2.4.1" + resolved "https://registry.yarnpkg.com/prettier/-/prettier-2.4.1.tgz#671e11c89c14a4cfc876ce564106c4a6726c9f5c" + integrity sha512-9fbDAXSBcc6Bs1mZrDYb3XKzDLm4EXXL9sC1LqKP5rZkT6KRr/rf9amVUcODVXgguK/isJz0d0hP72WeaKWsvA== + +process-nextick-args@~2.0.0: + version "2.0.1" + resolved "https://registry.yarnpkg.com/process-nextick-args/-/process-nextick-args-2.0.1.tgz#7820d9b16120cc55ca9ae7792680ae7dba6d7fe2" + integrity sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag== + +process@0.11.10, process@^0.11.10: + version "0.11.10" + resolved "https://registry.yarnpkg.com/process/-/process-0.11.10.tgz#7332300e840161bda3e69a1d1d91a7d4bc16f182" + integrity sha1-czIwDoQBYb2j5podHZGn1LwW8YI= + +progress@^2.0.0: + version "2.0.3" + resolved "https://registry.yarnpkg.com/progress/-/progress-2.0.3.tgz#7e8cf8d8f5b8f239c1bc68beb4eb78567d572ef8" + integrity sha512-7PiHtLll5LdnKIMw100I+8xJXR5gW2QwWYkT6iJva0bXitZKa/XMrSbdmg3r2Xnaidz9Qumd0VPaMrZlF9V9sA== + +promise-inflight@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/promise-inflight/-/promise-inflight-1.0.1.tgz#98472870bf228132fcbdd868129bad12c3c029e3" + integrity sha1-mEcocL8igTL8vdhoEputEsPAKeM= + +prop-types@15.7.2, prop-types@^15.7.2: + version "15.7.2" + resolved "https://registry.yarnpkg.com/prop-types/-/prop-types-15.7.2.tgz#52c41e75b8c87e72b9d9360e0206b99dcbffa6c5" + integrity sha512-8QQikdH7//R2vurIJSutZ1smHYTcLpRWEOlHnzcWHmBYrOGUysKwSsrC89BCiFj3CbrfJ/nXFdJepOVrY1GCHQ== + dependencies: + loose-envify "^1.4.0" + object-assign "^4.1.1" + react-is "^16.8.1" + +prr@~1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/prr/-/prr-1.0.1.tgz#d3fc114ba06995a45ec6893f484ceb1d78f5f476" + integrity sha1-0/wRS6BplaRexok/SEzrHXj19HY= + +public-encrypt@^4.0.0: + version "4.0.3" + resolved "https://registry.yarnpkg.com/public-encrypt/-/public-encrypt-4.0.3.tgz#4fcc9d77a07e48ba7527e7cbe0de33d0701331e0" + integrity sha512-zVpa8oKZSz5bTMTFClc1fQOnyyEzpl5ozpi1B5YcvBrdohMjH2rfsBtyXcuNuwjsDIXmBYlF2N5FlJYhR29t8Q== + dependencies: + bn.js "^4.1.0" + browserify-rsa "^4.0.0" + create-hash "^1.1.0" + parse-asn1 "^5.0.0" + randombytes "^2.0.1" + safe-buffer "^5.1.2" + +pump@^2.0.0: + version "2.0.1" + resolved "https://registry.yarnpkg.com/pump/-/pump-2.0.1.tgz#12399add6e4cf7526d973cbc8b5ce2e2908b3909" + integrity sha512-ruPMNRkN3MHP1cWJc9OWr+T/xDP0jhXYCLfJcBuX54hhfIBnaQmAUMfDcG4DM5UMWByBbJY69QSphm3jtDKIkA== + dependencies: + end-of-stream "^1.1.0" + once "^1.3.1" + +pump@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/pump/-/pump-3.0.0.tgz#b4a2116815bde2f4e1ea602354e8c75565107a64" + integrity sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww== + dependencies: + end-of-stream "^1.1.0" + once "^1.3.1" + +pumpify@^1.3.3: + version "1.5.1" + resolved "https://registry.yarnpkg.com/pumpify/-/pumpify-1.5.1.tgz#36513be246ab27570b1a374a5ce278bfd74370ce" + integrity sha512-oClZI37HvuUJJxSKKrC17bZ9Cu0ZYhEAGPsPUy9KlMUmv9dKX2o77RUmq7f3XjIxbwyGwYzbzQ1L2Ks8sIradQ== + dependencies: + duplexify "^3.6.0" + inherits "^2.0.3" + pump "^2.0.0" + +punycode@1.3.2: + version "1.3.2" + resolved "https://registry.yarnpkg.com/punycode/-/punycode-1.3.2.tgz#9653a036fb7c1ee42342f2325cceefea3926c48d" + integrity sha1-llOgNvt8HuQjQvIyXM7v6jkmxI0= + +punycode@^1.2.4: + version "1.4.1" + resolved "https://registry.yarnpkg.com/punycode/-/punycode-1.4.1.tgz#c0d5a63b2718800ad8e1eb0fa5269c84dd41845e" + integrity sha1-wNWmOycYgArY4esPpSachN1BhF4= + +punycode@^2.1.0: + version "2.1.1" + resolved "https://registry.yarnpkg.com/punycode/-/punycode-2.1.1.tgz#b58b010ac40c22c5657616c8d2c2c02c7bf479ec" + integrity sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A== + +querystring-es3@0.2.1, querystring-es3@^0.2.0: + version "0.2.1" + resolved "https://registry.yarnpkg.com/querystring-es3/-/querystring-es3-0.2.1.tgz#9ec61f79049875707d69414596fd907a4d711e73" + integrity sha1-nsYfeQSYdXB9aUFFlv2Qek1xHnM= + +querystring@0.2.0: + version "0.2.0" + resolved "https://registry.yarnpkg.com/querystring/-/querystring-0.2.0.tgz#b209849203bb25df820da756e747005878521620" + integrity sha1-sgmEkgO7Jd+CDadW50cAWHhSFiA= + +querystring@^0.2.0: + version "0.2.1" + resolved "https://registry.yarnpkg.com/querystring/-/querystring-0.2.1.tgz#40d77615bb09d16902a85c3e38aa8b5ed761c2dd" + integrity sha512-wkvS7mL/JMugcup3/rMitHmd9ecIGd2lhFhK9N3UUQ450h66d1r3Y9nvXzQAW1Lq+wyx61k/1pfKS5KuKiyEbg== + +queue-microtask@^1.2.2: + version "1.2.3" + resolved "https://registry.yarnpkg.com/queue-microtask/-/queue-microtask-1.2.3.tgz#4929228bbc724dfac43e0efb058caf7b6cfb6243" + integrity sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A== + +randombytes@^2.0.0, randombytes@^2.0.1, randombytes@^2.0.5, randombytes@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/randombytes/-/randombytes-2.1.0.tgz#df6f84372f0270dc65cdf6291349ab7a473d4f2a" + integrity sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ== + dependencies: + safe-buffer "^5.1.0" + +randomfill@^1.0.3: + version "1.0.4" + resolved "https://registry.yarnpkg.com/randomfill/-/randomfill-1.0.4.tgz#c92196fc86ab42be983f1bf31778224931d61458" + integrity sha512-87lcbR8+MhcWcUiQ+9e+Rwx8MyR2P7qnt15ynUlbm3TU/fjbgz4GsvfSUDTemtCCtVCqb4ZcEFlyPNTh9bBTLw== + dependencies: + randombytes "^2.0.5" + safe-buffer "^5.1.0" + +raw-body@2.4.1: + version "2.4.1" + resolved "https://registry.yarnpkg.com/raw-body/-/raw-body-2.4.1.tgz#30ac82f98bb5ae8c152e67149dac8d55153b168c" + integrity sha512-9WmIKF6mkvA0SLmA2Knm9+qj89e+j1zqgyn8aXGd7+nAduPoqgI9lO57SAZNn/Byzo5P7JhXTyg9PzaJbH73bA== + dependencies: + bytes "3.1.0" + http-errors "1.7.3" + iconv-lite "0.4.24" + unpipe "1.0.0" + +rc-align@^4.0.0: + version "4.0.11" + resolved "https://registry.yarnpkg.com/rc-align/-/rc-align-4.0.11.tgz#8198c62db266bc1b8ef05e56c13275bf72628a5e" + integrity sha512-n9mQfIYQbbNTbefyQnRHZPWuTEwG1rY4a9yKlIWHSTbgwI+XUMGRYd0uJ5pE2UbrNX0WvnMBA1zJ3Lrecpra/A== + dependencies: + "@babel/runtime" "^7.10.1" + classnames "2.x" + dom-align "^1.7.0" + lodash "^4.17.21" + rc-util "^5.3.0" + resize-observer-polyfill "^1.5.1" + +rc-cascader@~1.4.0: + version "1.4.3" + resolved "https://registry.yarnpkg.com/rc-cascader/-/rc-cascader-1.4.3.tgz#d91b0dcf8157b60ebe9ec3e58b4db054d5299464" + integrity sha512-Q4l9Mv8aaISJ+giVnM9IaXxDeMqHUGLvi4F+LksS6pHlaKlN4awop/L+IMjIXpL+ug/ojaCyv/ixcVopJYYCVA== + dependencies: + "@babel/runtime" "^7.12.5" + array-tree-filter "^2.1.0" + rc-trigger "^5.0.4" + rc-util "^5.0.1" + warning "^4.0.1" + +rc-checkbox@~2.3.0: + version "2.3.2" + resolved "https://registry.yarnpkg.com/rc-checkbox/-/rc-checkbox-2.3.2.tgz#f91b3678c7edb2baa8121c9483c664fa6f0aefc1" + integrity sha512-afVi1FYiGv1U0JlpNH/UaEXdh6WUJjcWokj/nUN2TgG80bfG+MDdbfHKlLcNNba94mbjy2/SXJ1HDgrOkXGAjg== + dependencies: + "@babel/runtime" "^7.10.1" + classnames "^2.2.1" + +rc-collapse@~3.1.0: + version "3.1.2" + resolved "https://registry.yarnpkg.com/rc-collapse/-/rc-collapse-3.1.2.tgz#76028a811b845d03d9460ccc409c7ea8ad09db14" + integrity sha512-HujcKq7mghk/gVKeI6EjzTbb8e19XUZpakrYazu1MblEZ3Hu3WBMSN4A3QmvbF6n1g7x6lUlZvsHZ5shABWYOQ== + dependencies: + "@babel/runtime" "^7.10.1" + classnames "2.x" + rc-motion "^2.3.4" + rc-util "^5.2.1" + shallowequal "^1.1.0" + +rc-dialog@~8.6.0: + version "8.6.0" + resolved "https://registry.yarnpkg.com/rc-dialog/-/rc-dialog-8.6.0.tgz#3b228dac085de5eed8c6237f31162104687442e7" + integrity sha512-GSbkfqjqxpZC5/zc+8H332+q5l/DKUhpQr0vdX2uDsxo5K0PhvaMEVjyoJUTkZ3+JstEADQji1PVLVb/2bJeOQ== + dependencies: + "@babel/runtime" "^7.10.1" + classnames "^2.2.6" + rc-motion "^2.3.0" + rc-util "^5.6.1" + +rc-drawer@~4.3.0: + version "4.3.1" + resolved "https://registry.yarnpkg.com/rc-drawer/-/rc-drawer-4.3.1.tgz#356333a7af01b777abd685c96c2ce62efb44f3f3" + integrity sha512-GMfFy4maqxS9faYXEhQ+0cA1xtkddEQzraf6SAdzWbn444DrrLogwYPk1NXSpdXjLCLxgxOj9MYtyYG42JsfXg== + dependencies: + "@babel/runtime" "^7.10.1" + classnames "^2.2.6" + rc-util "^5.7.0" + +rc-dropdown@^3.2.0, rc-dropdown@~3.2.0: + version "3.2.0" + resolved "https://registry.yarnpkg.com/rc-dropdown/-/rc-dropdown-3.2.0.tgz#da6c2ada403842baee3a9e909a0b1a91ba3e1090" + integrity sha512-j1HSw+/QqlhxyTEF6BArVZnTmezw2LnSmRk6I9W7BCqNCKaRwleRmMMs1PHbuaG8dKHVqP6e21RQ7vPBLVnnNw== + dependencies: + "@babel/runtime" "^7.10.1" + classnames "^2.2.6" + rc-trigger "^5.0.4" + +rc-field-form@~1.20.0: + version "1.20.1" + resolved "https://registry.yarnpkg.com/rc-field-form/-/rc-field-form-1.20.1.tgz#d1c51888107cf075b42704b7b575bef84c359291" + integrity sha512-f64KEZop7zSlrG4ef/PLlH12SLn6iHDQ3sTG+RfKBM45hikwV1i8qMf53xoX12NvXXWg1VwchggX/FSso4bWaA== + dependencies: + "@babel/runtime" "^7.8.4" + async-validator "^3.0.3" + rc-util "^5.8.0" + +rc-image@~5.2.5: + version "5.2.5" + resolved "https://registry.yarnpkg.com/rc-image/-/rc-image-5.2.5.tgz#44e6ffc842626827960e7ab72e1c0d6f3a8ce440" + integrity sha512-qUfZjYIODxO0c8a8P5GeuclYXZjzW4hV/5hyo27XqSFo1DmTCs2HkVeQObkcIk5kNsJtgsj1KoPThVsSc/PXOw== + dependencies: + "@babel/runtime" "^7.11.2" + classnames "^2.2.6" + rc-dialog "~8.6.0" + rc-util "^5.0.6" + +rc-input-number@~7.1.0: + version "7.1.4" + resolved "https://registry.yarnpkg.com/rc-input-number/-/rc-input-number-7.1.4.tgz#9d7410c91ff8dc6384d0233c20df278982989f9a" + integrity sha512-EG4iqkqyqzLRu/Dq+fw2od7nlgvXLEatE+J6uhi3HXE1qlM3C7L6a7o/hL9Ly9nimkES2IeQoj3Qda3I0izj3Q== + dependencies: + "@babel/runtime" "^7.10.1" + classnames "^2.2.5" + rc-util "^5.9.8" + +rc-mentions@~1.6.1: + version "1.6.1" + resolved "https://registry.yarnpkg.com/rc-mentions/-/rc-mentions-1.6.1.tgz#46035027d64aa33ef840ba0fbd411871e34617ae" + integrity sha512-LDzGI8jJVGnkhpTZxZuYBhMz3avcZZqPGejikchh97xPni/g4ht714Flh7DVvuzHQ+BoKHhIjobHnw1rcP8erg== + dependencies: + "@babel/runtime" "^7.10.1" + classnames "^2.2.6" + rc-menu "^9.0.0" + rc-textarea "^0.3.0" + rc-trigger "^5.0.4" + rc-util "^5.0.1" + +rc-menu@^9.0.0, rc-menu@~9.0.12: + version "9.0.12" + resolved "https://registry.yarnpkg.com/rc-menu/-/rc-menu-9.0.12.tgz#492c4bb07a596e2ce07587c669b27ee28c3810c5" + integrity sha512-8uy47DL36iDEwVZdUO/fjhhW5+4j0tYlrCsOzw6iy8MJqKL7/HC2pj7sL/S9ayp2+hk9fYQYB9Tu+UN+N2OOOQ== + dependencies: + "@babel/runtime" "^7.10.1" + classnames "2.x" + rc-motion "^2.4.3" + rc-overflow "^1.2.0" + rc-trigger "^5.1.2" + rc-util "^5.12.0" + shallowequal "^1.1.0" + +rc-motion@^2.0.0, rc-motion@^2.0.1, rc-motion@^2.2.0, rc-motion@^2.3.0, rc-motion@^2.3.4, rc-motion@^2.4.0, rc-motion@^2.4.3: + version "2.4.4" + resolved "https://registry.yarnpkg.com/rc-motion/-/rc-motion-2.4.4.tgz#e995d5fa24fc93065c24f714857cf2677d655bb0" + integrity sha512-ms7n1+/TZQBS0Ydd2Q5P4+wJTSOrhIrwNxLXCZpR7Fa3/oac7Yi803HDALc2hLAKaCTQtw9LmQeB58zcwOsqlQ== + dependencies: + "@babel/runtime" "^7.11.1" + classnames "^2.2.1" + rc-util "^5.2.1" + +rc-notification@~4.5.7: + version "4.5.7" + resolved "https://registry.yarnpkg.com/rc-notification/-/rc-notification-4.5.7.tgz#265e6e6a0c1a0fac63d6abd4d832eb8ff31522f1" + integrity sha512-zhTGUjBIItbx96SiRu3KVURcLOydLUHZCPpYEn1zvh+re//Tnq/wSxN4FKgp38n4HOgHSVxcLEeSxBMTeBBDdw== + dependencies: + "@babel/runtime" "^7.10.1" + classnames "2.x" + rc-motion "^2.2.0" + rc-util "^5.0.1" + +rc-overflow@^1.0.0, rc-overflow@^1.2.0: + version "1.2.2" + resolved "https://registry.yarnpkg.com/rc-overflow/-/rc-overflow-1.2.2.tgz#95b0222016c0cdbdc0db85f569c262e7706a5f22" + integrity sha512-X5kj9LDU1ue5wHkqvCprJWLKC+ZLs3p4He/oxjZ1Q4NKaqKBaYf5OdSzRSgh3WH8kSdrfU8LjvlbWnHgJOEkNQ== + dependencies: + "@babel/runtime" "^7.11.1" + classnames "^2.2.1" + rc-resize-observer "^1.0.0" + rc-util "^5.5.1" + +rc-pagination@~3.1.9: + version "3.1.9" + resolved "https://registry.yarnpkg.com/rc-pagination/-/rc-pagination-3.1.9.tgz#797ad75d85b1ef7a82801207ead410110337fdd6" + integrity sha512-IKBKaJ4icVPeEk9qRHrFBJmHxBUrCp3+nENBYob4Ofqsu3RXjBOy4N36zONO7oubgLyiG3PxVmyAuVlTkoc7Jg== + dependencies: + "@babel/runtime" "^7.10.1" + classnames "^2.2.1" + +rc-picker@~2.5.10: + version "2.5.17" + resolved "https://registry.yarnpkg.com/rc-picker/-/rc-picker-2.5.17.tgz#323cae3a192d429b540edaa66974947d3ec8703c" + integrity sha512-pnvUsn4VOaKhJjdXGPV5wod5a6DmDPh5M8OgDve8Gjp+UtJY5LRfYijhzL9ecapUUIxaqSijEFnbMQTZJJRn5g== + dependencies: + "@babel/runtime" "^7.10.1" + classnames "^2.2.1" + date-fns "2.x" + dayjs "1.x" + moment "^2.24.0" + rc-trigger "^5.0.4" + rc-util "^5.4.0" + shallowequal "^1.1.0" + +rc-progress@~3.1.0: + version "3.1.4" + resolved "https://registry.yarnpkg.com/rc-progress/-/rc-progress-3.1.4.tgz#66040d0fae7d8ced2b38588378eccb2864bad615" + integrity sha512-XBAif08eunHssGeIdxMXOmRQRULdHaDdIFENQ578CMb4dyewahmmfJRyab+hw4KH4XssEzzYOkAInTLS7JJG+Q== + dependencies: + "@babel/runtime" "^7.10.1" + classnames "^2.2.6" + +rc-rate@~2.9.0: + version "2.9.1" + resolved "https://registry.yarnpkg.com/rc-rate/-/rc-rate-2.9.1.tgz#e43cb95c4eb90a2c1e0b16ec6614d8c43530a731" + integrity sha512-MmIU7FT8W4LYRRHJD1sgG366qKtSaKb67D0/vVvJYR0lrCuRrCiVQ5qhfT5ghVO4wuVIORGpZs7ZKaYu+KMUzA== + dependencies: + "@babel/runtime" "^7.10.1" + classnames "^2.2.5" + rc-util "^5.0.1" + +rc-resize-observer@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/rc-resize-observer/-/rc-resize-observer-1.0.1.tgz#ccd0986543ff1bf49f8a581e8ac4bb714ed24dcd" + integrity sha512-OxO2mJI9e8610CAWBFfm52SPvWib0eNKjaSsRbbKHmLaJIxw944P+D61DlLJ/w2vuOjGNcalJu8VdqyNm/XCRg== + dependencies: + "@babel/runtime" "^7.10.1" + classnames "^2.2.1" + rc-util "^5.0.0" + resize-observer-polyfill "^1.5.1" + +rc-select@^12.0.0, rc-select@~12.1.6: + version "12.1.13" + resolved "https://registry.yarnpkg.com/rc-select/-/rc-select-12.1.13.tgz#c33560ccb9339d30695b52458f55efc35af35273" + integrity sha512-cPI+aesP6dgCAaey4t4upDbEukJe+XN0DK6oO/6flcCX5o28o7KNZD7JAiVtC/6fCwqwI/kSs7S/43dvHmBl+A== + dependencies: + "@babel/runtime" "^7.10.1" + classnames "2.x" + rc-motion "^2.0.1" + rc-overflow "^1.0.0" + rc-trigger "^5.0.4" + rc-util "^5.9.8" + rc-virtual-list "^3.2.0" + +rc-slider@~9.7.1: + version "9.7.2" + resolved "https://registry.yarnpkg.com/rc-slider/-/rc-slider-9.7.2.tgz#282f571f7582752ebaa33964e441184f4e79ad74" + integrity sha512-mVaLRpDo6otasBs6yVnG02ykI3K6hIrLTNfT5eyaqduFv95UODI9PDS6fWuVVehVpdS4ENgOSwsTjrPVun+k9g== + dependencies: + "@babel/runtime" "^7.10.1" + classnames "^2.2.5" + rc-tooltip "^5.0.1" + rc-util "^5.0.0" + shallowequal "^1.1.0" + +rc-steps@~4.1.0: + version "4.1.3" + resolved "https://registry.yarnpkg.com/rc-steps/-/rc-steps-4.1.3.tgz#208580e22db619e3830ddb7fa41bc886c65d9803" + integrity sha512-GXrMfWQOhN3sVze3JnzNboHpQdNHcdFubOETUHyDpa/U3HEKBZC3xJ8XK4paBgF4OJ3bdUVLC+uBPc6dCxvDYA== + dependencies: + "@babel/runtime" "^7.10.2" + classnames "^2.2.3" + rc-util "^5.0.1" + +rc-switch@~3.2.0: + version "3.2.2" + resolved "https://registry.yarnpkg.com/rc-switch/-/rc-switch-3.2.2.tgz#d001f77f12664d52595b4f6fb425dd9e66fba8e8" + integrity sha512-+gUJClsZZzvAHGy1vZfnwySxj+MjLlGRyXKXScrtCTcmiYNPzxDFOxdQ/3pK1Kt/0POvwJ/6ALOR8gwdXGhs+A== + dependencies: + "@babel/runtime" "^7.10.1" + classnames "^2.2.1" + rc-util "^5.0.1" + +rc-table@~7.15.1: + version "7.15.2" + resolved "https://registry.yarnpkg.com/rc-table/-/rc-table-7.15.2.tgz#f6ab73b2cfb1c76f3cf9682c855561423c6b5b22" + integrity sha512-TAs7kCpIZwc2mtvD8CMrXSM6TqJDUsy0rUEV1YgRru33T8bjtAtc+9xW/KC1VWROJlHSpU0R0kXjFs9h/6+IzQ== + dependencies: + "@babel/runtime" "^7.10.1" + classnames "^2.2.5" + rc-resize-observer "^1.0.0" + rc-util "^5.13.0" + shallowequal "^1.1.0" + +rc-tabs@~11.10.0: + version "11.10.1" + resolved "https://registry.yarnpkg.com/rc-tabs/-/rc-tabs-11.10.1.tgz#7b112f78bac998480c777ae160adc425e3fdb7cb" + integrity sha512-ey1i2uMyfnRNYbViLcUYGH+Y7hueJbdCVSLaXnXki9hxBcGqxJMPy9t5xR0n/3QFQspj7Tf6+2VTXVtmO7Yaug== + dependencies: + "@babel/runtime" "^7.11.2" + classnames "2.x" + rc-dropdown "^3.2.0" + rc-menu "^9.0.0" + rc-resize-observer "^1.0.0" + rc-util "^5.5.0" + +rc-textarea@^0.3.0, rc-textarea@~0.3.0: + version "0.3.5" + resolved "https://registry.yarnpkg.com/rc-textarea/-/rc-textarea-0.3.5.tgz#07ed445dddb94e5ae6764676923a49bddad9b2ec" + integrity sha512-qa+k5vDn9ct65qr+SgD2KwJ9Xz6P84lG2z+TDht/RBr71WnM/K61PqHUAcUyU6YqTJD26IXgjPuuhZR7HMw7eA== + dependencies: + "@babel/runtime" "^7.10.1" + classnames "^2.2.1" + rc-resize-observer "^1.0.0" + rc-util "^5.7.0" + +rc-tooltip@^5.0.1, rc-tooltip@~5.1.1: + version "5.1.1" + resolved "https://registry.yarnpkg.com/rc-tooltip/-/rc-tooltip-5.1.1.tgz#94178ed162d0252bc4993b725f5dc2ac0fccf154" + integrity sha512-alt8eGMJulio6+4/uDm7nvV+rJq9bsfxFDCI0ljPdbuoygUscbsMYb6EQgwib/uqsXQUvzk+S7A59uYHmEgmDA== + dependencies: + "@babel/runtime" "^7.11.2" + rc-trigger "^5.0.0" + +rc-tree-select@~4.3.0: + version "4.3.3" + resolved "https://registry.yarnpkg.com/rc-tree-select/-/rc-tree-select-4.3.3.tgz#28eba4d8a8dc8c0f9b61d83ce465842a6915eca4" + integrity sha512-0tilOHLJA6p+TNg4kD559XnDX3PTEYuoSF7m7ryzFLAYvdEEPtjn0QZc5z6L0sMKBiBlj8a2kf0auw8XyHU3lA== + dependencies: + "@babel/runtime" "^7.10.1" + classnames "2.x" + rc-select "^12.0.0" + rc-tree "^4.0.0" + rc-util "^5.0.5" + +rc-tree@^4.0.0, rc-tree@~4.2.1: + version "4.2.2" + resolved "https://registry.yarnpkg.com/rc-tree/-/rc-tree-4.2.2.tgz#4429187cbbfbecbe989714a607e3de8b3ab7763f" + integrity sha512-V1hkJt092VrOVjNyfj5IYbZKRMHxWihZarvA5hPL/eqm7o2+0SNkeidFYm7LVVBrAKBpOpa0l8xt04uiqOd+6w== + dependencies: + "@babel/runtime" "^7.10.1" + classnames "2.x" + rc-motion "^2.0.1" + rc-util "^5.0.0" + rc-virtual-list "^3.0.1" + +rc-trigger@^5.0.0, rc-trigger@^5.0.4, rc-trigger@^5.1.2, rc-trigger@^5.2.10: + version "5.2.10" + resolved "https://registry.yarnpkg.com/rc-trigger/-/rc-trigger-5.2.10.tgz#8a0057a940b1b9027eaa33beec8a6ecd85cce2b1" + integrity sha512-FkUf4H9BOFDaIwu42fvRycXMAvkttph9AlbCZXssZDVzz2L+QZ0ERvfB/4nX3ZFPh1Zd+uVGr1DEDeXxq4J1TA== + dependencies: + "@babel/runtime" "^7.11.2" + classnames "^2.2.6" + rc-align "^4.0.0" + rc-motion "^2.0.0" + rc-util "^5.5.0" + +rc-upload@~4.3.0: + version "4.3.1" + resolved "https://registry.yarnpkg.com/rc-upload/-/rc-upload-4.3.1.tgz#d6ee66b8bd1e1dd2f78526c486538423f7e7ed84" + integrity sha512-W8Iyv0LRyEnFEzpv90ET/i1XG2jlPzPxKkkOVtDfgh9c3f4lZV770vgpUfiyQza+iLtQLVco3qIvgue8aDiOsQ== + dependencies: + "@babel/runtime" "^7.10.1" + classnames "^2.2.5" + rc-util "^5.2.0" + +rc-util@^5.0.0, rc-util@^5.0.1, rc-util@^5.0.5, rc-util@^5.0.6, rc-util@^5.0.7, rc-util@^5.12.0, rc-util@^5.13.0, rc-util@^5.13.1, rc-util@^5.2.0, rc-util@^5.2.1, rc-util@^5.3.0, rc-util@^5.4.0, rc-util@^5.5.0, rc-util@^5.5.1, rc-util@^5.6.1, rc-util@^5.7.0, rc-util@^5.8.0, rc-util@^5.9.4, rc-util@^5.9.8: + version "5.13.2" + resolved "https://registry.yarnpkg.com/rc-util/-/rc-util-5.13.2.tgz#a8a0bb77743351841ba8bed6393e03b8d2f685c8" + integrity sha512-eYc71XXGlp96RMzg01Mhq/T3BL6OOVTDSS0urFEuvpi+e7slhJRhaHGCKy2hqJm18m9ff7VoRoptplKu60dYog== + dependencies: + "@babel/runtime" "^7.12.5" + react-is "^16.12.0" + shallowequal "^1.1.0" + +rc-virtual-list@^3.0.1, rc-virtual-list@^3.2.0: + version "3.4.1" + resolved "https://registry.yarnpkg.com/rc-virtual-list/-/rc-virtual-list-3.4.1.tgz#1f3b41391acf033a6c7e84c2f4e8a4ee0dc72807" + integrity sha512-YexJy+Cx8qjnQdV8+0JBeM65VF2kvO9lnsfrIvHsL3lIH1adMZ85HqmePGUzKkKMZC+CRAJc2K4g2iJS1dOjPw== + dependencies: + classnames "^2.2.6" + rc-resize-observer "^1.0.0" + rc-util "^5.0.7" + +react-dom@^17.0.2: + version "17.0.2" + resolved "https://registry.yarnpkg.com/react-dom/-/react-dom-17.0.2.tgz#ecffb6845e3ad8dbfcdc498f0d0a939736502c23" + integrity sha512-s4h96KtLDUQlsENhMn1ar8t2bEa+q/YAtj8pPPdIjPDGBDIVNsrD9aXNWqspUe6AzKCIG0C1HZZLqLV7qpOBGA== + dependencies: + loose-envify "^1.1.0" + object-assign "^4.1.1" + scheduler "^0.20.2" + +react-is@16.13.1, react-is@^16.12.0, react-is@^16.13.1, react-is@^16.7.0, react-is@^16.8.1: + version "16.13.1" + resolved "https://registry.yarnpkg.com/react-is/-/react-is-16.13.1.tgz#789729a4dc36de2999dc156dd6c1d9c18cea56a4" + integrity sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ== + +react-redux@^7.2.5: + version "7.2.5" + resolved "https://registry.yarnpkg.com/react-redux/-/react-redux-7.2.5.tgz#213c1b05aa1187d9c940ddfc0b29450957f6a3b8" + integrity sha512-Dt29bNyBsbQaysp6s/dN0gUodcq+dVKKER8Qv82UrpeygwYeX1raTtil7O/fftw/rFqzaf6gJhDZRkkZnn6bjg== + dependencies: + "@babel/runtime" "^7.12.1" + "@types/react-redux" "^7.1.16" + hoist-non-react-statics "^3.3.2" + loose-envify "^1.4.0" + prop-types "^15.7.2" + react-is "^16.13.1" + +react-refresh@0.8.3: + version "0.8.3" + resolved "https://registry.yarnpkg.com/react-refresh/-/react-refresh-0.8.3.tgz#721d4657672d400c5e3c75d063c4a85fb2d5d68f" + integrity sha512-X8jZHc7nCMjaCqoU+V2I0cOhNW+QMBwSUkeXnTi8IPe6zaRWfn60ZzvFDZqWPfmSJfjub7dDW1SP0jaHWLu/hg== + +react@^17.0.2: + version "17.0.2" + resolved "https://registry.yarnpkg.com/react/-/react-17.0.2.tgz#d0b5cc516d29eb3eee383f75b62864cfb6800037" + integrity sha512-gnhPt75i/dq/z3/6q/0asP78D0u592D5L1pd7M8P+dck6Fu/jJeL6iVVK23fptSUZj8Vjf++7wXA8UNclGQcbA== + dependencies: + loose-envify "^1.1.0" + object-assign "^4.1.1" + +"readable-stream@1 || 2", readable-stream@^2.0.0, readable-stream@^2.0.1, readable-stream@^2.0.2, readable-stream@^2.1.5, readable-stream@^2.2.2, readable-stream@^2.3.3, readable-stream@^2.3.6, readable-stream@~2.3.6: + version "2.3.7" + resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-2.3.7.tgz#1eca1cf711aef814c04f62252a36a62f6cb23b57" + integrity sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw== + dependencies: + core-util-is "~1.0.0" + inherits "~2.0.3" + isarray "~1.0.0" + process-nextick-args "~2.0.0" + safe-buffer "~5.1.1" + string_decoder "~1.1.1" + util-deprecate "~1.0.1" + +readable-stream@^3.5.0, readable-stream@^3.6.0: + version "3.6.0" + resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-3.6.0.tgz#337bbda3adc0706bd3e024426a286d4b4b2c9198" + integrity sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA== + dependencies: + inherits "^2.0.3" + string_decoder "^1.1.1" + util-deprecate "^1.0.1" + +readdirp@^2.2.1: + version "2.2.1" + resolved "https://registry.yarnpkg.com/readdirp/-/readdirp-2.2.1.tgz#0e87622a3325aa33e892285caf8b4e846529a525" + integrity sha512-1JU/8q+VgFZyxwrJ+SVIOsh+KywWGpds3NTqikiKpDMZWScmAYyKIgqkO+ARvNWJfXeXR1zxz7aHF4u4CyH6vQ== + dependencies: + graceful-fs "^4.1.11" + micromatch "^3.1.10" + readable-stream "^2.0.2" + +readdirp@~3.5.0: + version "3.5.0" + resolved "https://registry.yarnpkg.com/readdirp/-/readdirp-3.5.0.tgz#9ba74c019b15d365278d2e91bb8c48d7b4d42c9e" + integrity sha512-cMhu7c/8rdhkHXWsY+osBhfSy0JikwpHK/5+imo+LpeasTF8ouErHrlYkwT0++njiyuDvc7OFY5T3ukvZ8qmFQ== + dependencies: + picomatch "^2.2.1" + +readdirp@~3.6.0: + version "3.6.0" + resolved "https://registry.yarnpkg.com/readdirp/-/readdirp-3.6.0.tgz#74a370bd857116e245b29cc97340cd431a02a6c7" + integrity sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA== + dependencies: + picomatch "^2.2.1" + +redux-devtools-extension@^2.13.9: + version "2.13.9" + resolved "https://registry.yarnpkg.com/redux-devtools-extension/-/redux-devtools-extension-2.13.9.tgz#6b764e8028b507adcb75a1cae790f71e6be08ae7" + integrity sha512-cNJ8Q/EtjhQaZ71c8I9+BPySIBVEKssbPpskBfsXqb8HJ002A3KRVHfeRzwRo6mGPqsm7XuHTqNSNeS1Khig0A== + +redux-persist@^6.0.0: + version "6.0.0" + resolved "https://registry.yarnpkg.com/redux-persist/-/redux-persist-6.0.0.tgz#b4d2972f9859597c130d40d4b146fecdab51b3a8" + integrity sha512-71LLMbUq2r02ng2We9S215LtPu3fY0KgaGE0k8WRgl6RkqxtGfl7HUozz1Dftwsb0D/5mZ8dwAaPbtnzfvbEwQ== + +redux-thunk@^2.3.0: + version "2.3.0" + resolved "https://registry.yarnpkg.com/redux-thunk/-/redux-thunk-2.3.0.tgz#51c2c19a185ed5187aaa9a2d08b666d0d6467622" + integrity sha512-km6dclyFnmcvxhAcrQV2AkZmPQjzPDjgVlQtR0EQjxZPyJ0BnMf3in1ryuR8A2qU0HldVRfxYXbFSKlI3N7Slw== + +redux@^4.0.0, redux@^4.1.1: + version "4.1.1" + resolved "https://registry.yarnpkg.com/redux/-/redux-4.1.1.tgz#76f1c439bb42043f985fbd9bf21990e60bd67f47" + integrity sha512-hZQZdDEM25UY2P493kPYuKqviVwZ58lEmGQNeQ+gXa+U0gYPUBf7NKYazbe3m+bs/DzM/ahN12DbF+NG8i0CWw== + dependencies: + "@babel/runtime" "^7.9.2" + +regenerator-runtime@^0.13.4: + version "0.13.9" + resolved "https://registry.yarnpkg.com/regenerator-runtime/-/regenerator-runtime-0.13.9.tgz#8925742a98ffd90814988d7566ad30ca3b263b52" + integrity sha512-p3VT+cOEgxFsRRA9X4lkI1E+k2/CtnKtU4gcxyaCUreilL/vqI6CdZ3wxVUx3UOUg+gnUOQQcRI7BmSI656MYA== + +regex-not@^1.0.0, regex-not@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/regex-not/-/regex-not-1.0.2.tgz#1f4ece27e00b0b65e0247a6810e6a85d83a5752c" + integrity sha512-J6SDjUgDxQj5NusnOtdFxDwN/+HWykR8GELwctJ7mdqhcyy1xEc4SRFHUXvxTp661YaVKAjfRLZ9cCqS6tn32A== + dependencies: + extend-shallow "^3.0.2" + safe-regex "^1.1.0" + +regexpp@^3.1.0: + version "3.2.0" + resolved "https://registry.yarnpkg.com/regexpp/-/regexpp-3.2.0.tgz#0425a2768d8f23bad70ca4b90461fa2f1213e1b2" + integrity sha512-pq2bWo9mVD43nbts2wGv17XLiNLya+GklZ8kaDLV2Z08gDCsGpnKn9BFMepvWuHCbyVvY7J5o5+BVvoQbmlJLg== + +remove-trailing-separator@^1.0.1: + version "1.1.0" + resolved "https://registry.yarnpkg.com/remove-trailing-separator/-/remove-trailing-separator-1.1.0.tgz#c24bce2a283adad5bc3f58e0d48249b92379d8ef" + integrity sha1-wkvOKig62tW8P1jg1IJJuSN52O8= + +repeat-element@^1.1.2: + version "1.1.4" + resolved "https://registry.yarnpkg.com/repeat-element/-/repeat-element-1.1.4.tgz#be681520847ab58c7568ac75fbfad28ed42d39e9" + integrity sha512-LFiNfRcSu7KK3evMyYOuCzv3L10TW7yC1G2/+StMjK8Y6Vqd2MG7r/Qjw4ghtuCOjFvlnms/iMmLqpvW/ES/WQ== + +repeat-string@^1.6.1: + version "1.6.1" + resolved "https://registry.yarnpkg.com/repeat-string/-/repeat-string-1.6.1.tgz#8dcae470e1c88abc2d600fff4a776286da75e637" + integrity sha1-jcrkcOHIirwtYA//Sndihtp15jc= + +require-from-string@^2.0.2: + version "2.0.2" + resolved "https://registry.yarnpkg.com/require-from-string/-/require-from-string-2.0.2.tgz#89a7fdd938261267318eafe14f9c32e598c36909" + integrity sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw== + +resize-observer-polyfill@^1.5.0, resize-observer-polyfill@^1.5.1: + version "1.5.1" + resolved "https://registry.yarnpkg.com/resize-observer-polyfill/-/resize-observer-polyfill-1.5.1.tgz#0e9020dd3d21024458d4ebd27e23e40269810464" + integrity sha512-LwZrotdHOo12nQuZlHEmtuXdqGoOD0OhaxopaNFxWzInpEgaLWoVuAMbTzixuosCx2nEG58ngzW3vxdWoxIgdg== + +resolve-from@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/resolve-from/-/resolve-from-3.0.0.tgz#b22c7af7d9d6881bc8b6e653335eebcb0a188748" + integrity sha1-six699nWiBvItuZTM17rywoYh0g= + +resolve-from@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/resolve-from/-/resolve-from-4.0.0.tgz#4abcd852ad32dd7baabfe9b40e00a36db5f392e6" + integrity sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g== + +resolve-url@^0.2.1: + version "0.2.1" + resolved "https://registry.yarnpkg.com/resolve-url/-/resolve-url-0.2.1.tgz#2c637fe77c893afd2a663fe21aa9080068e2052a" + integrity sha1-LGN/53yJOv0qZj/iGqkIAGjiBSo= + +ret@~0.1.10: + version "0.1.15" + resolved "https://registry.yarnpkg.com/ret/-/ret-0.1.15.tgz#b8a4825d5bdb1fc3f6f53c2bc33f81388681c7bc" + integrity sha512-TTlYpa+OL+vMMNG24xSlQGEJ3B/RzEfUlLct7b5G/ytav+wPrplCpVMFuwzXbkecJrb6IYo1iFb0S9v37754mg== + +reusify@^1.0.4: + version "1.0.4" + resolved "https://registry.yarnpkg.com/reusify/-/reusify-1.0.4.tgz#90da382b1e126efc02146e90845a88db12925d76" + integrity sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw== + +rimraf@^2.5.4, rimraf@^2.6.3: + version "2.7.1" + resolved "https://registry.yarnpkg.com/rimraf/-/rimraf-2.7.1.tgz#35797f13a7fdadc566142c29d4f07ccad483e3ec" + integrity sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w== + dependencies: + glob "^7.1.3" + +rimraf@^3.0.2: + version "3.0.2" + resolved "https://registry.yarnpkg.com/rimraf/-/rimraf-3.0.2.tgz#f1a5402ba6220ad52cc1282bac1ae3aa49fd061a" + integrity sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA== + dependencies: + glob "^7.1.3" + +ripemd160@^2.0.0, ripemd160@^2.0.1: + version "2.0.2" + resolved "https://registry.yarnpkg.com/ripemd160/-/ripemd160-2.0.2.tgz#a1c1a6f624751577ba5d07914cbc92850585890c" + integrity sha512-ii4iagi25WusVoiC4B4lq7pbXfAp3D9v5CwfkY33vffw2+pkDjY1D8GaN7spsxvCSx8dkPqOZCEZyfxcmJG2IA== + dependencies: + hash-base "^3.0.0" + inherits "^2.0.1" + +run-parallel@^1.1.9: + version "1.2.0" + resolved "https://registry.yarnpkg.com/run-parallel/-/run-parallel-1.2.0.tgz#66d1368da7bdf921eb9d95bd1a9229e7f21a43ee" + integrity sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA== + dependencies: + queue-microtask "^1.2.2" + +run-queue@^1.0.0, run-queue@^1.0.3: + version "1.0.3" + resolved "https://registry.yarnpkg.com/run-queue/-/run-queue-1.0.3.tgz#e848396f057d223f24386924618e25694161ec47" + integrity sha1-6Eg5bwV9Ij8kOGkkYY4laUFh7Ec= + dependencies: + aproba "^1.1.1" + +safe-buffer@^5.0.1, safe-buffer@^5.1.0, safe-buffer@^5.1.1, safe-buffer@^5.1.2, safe-buffer@^5.2.0, safe-buffer@~5.2.0: + version "5.2.1" + resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.2.1.tgz#1eaf9fa9bdb1fdd4ec75f58f9cdb4e6b7827eec6" + integrity sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ== + +safe-buffer@~5.1.0, safe-buffer@~5.1.1: + version "5.1.2" + resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.1.2.tgz#991ec69d296e0313747d59bdfd2b745c35f8828d" + integrity sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g== + +safe-regex@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/safe-regex/-/safe-regex-1.1.0.tgz#40a3669f3b077d1e943d44629e157dd48023bf2e" + integrity sha1-QKNmnzsHfR6UPURinhV91IAjvy4= + dependencies: + ret "~0.1.10" + +"safer-buffer@>= 2.1.2 < 3", "safer-buffer@>= 2.1.2 < 3.0.0", safer-buffer@^2.1.0: + version "2.1.2" + resolved "https://registry.yarnpkg.com/safer-buffer/-/safer-buffer-2.1.2.tgz#44fa161b0187b9549dd84bb91802f9bd8385cd6a" + integrity sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg== + +sax@^1.2.4: + version "1.2.4" + resolved "https://registry.yarnpkg.com/sax/-/sax-1.2.4.tgz#2816234e2378bddc4e5354fab5caa895df7100d9" + integrity sha512-NqVDv9TpANUjFm0N8uM5GxL36UgKi9/atZw+x7YFnQ8ckwFGKrl4xX4yWtrey3UJm5nP1kUbnYgLopqWNSRhWw== + +scheduler@^0.20.2: + version "0.20.2" + resolved "https://registry.yarnpkg.com/scheduler/-/scheduler-0.20.2.tgz#4baee39436e34aa93b4874bddcbf0fe8b8b50e91" + integrity sha512-2eWfGgAqqWFGqtdMmcL5zCMK1U8KlXv8SQFGglL3CEtd0aDVDWgeF/YoCmvln55m5zSk3J/20hTaSBeSObsQDQ== + dependencies: + loose-envify "^1.1.0" + object-assign "^4.1.1" + +schema-utils@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/schema-utils/-/schema-utils-1.0.0.tgz#0b79a93204d7b600d4b2850d1f66c2a34951c770" + integrity sha512-i27Mic4KovM/lnGsy8whRCHhc7VicJajAjTrYg11K9zfZXnYIt4k5F+kZkwjnrhKzLic/HLU4j11mjsz2G/75g== + dependencies: + ajv "^6.1.0" + ajv-errors "^1.0.0" + ajv-keywords "^3.1.0" + +schema-utils@^2.6.5: + version "2.7.1" + resolved "https://registry.yarnpkg.com/schema-utils/-/schema-utils-2.7.1.tgz#1ca4f32d1b24c590c203b8e7a50bf0ea4cd394d7" + integrity sha512-SHiNtMOUGWBQJwzISiVYKu82GiV4QYGePp3odlY1tuKO7gPtphAT5R/py0fA6xtbgLL/RvtJZnU9b8s0F1q0Xg== + dependencies: + "@types/json-schema" "^7.0.5" + ajv "^6.12.4" + ajv-keywords "^3.5.2" + +schema-utils@^3.0.0: + version "3.1.1" + resolved "https://registry.yarnpkg.com/schema-utils/-/schema-utils-3.1.1.tgz#bc74c4b6b6995c1d88f76a8b77bea7219e0c8281" + integrity sha512-Y5PQxS4ITlC+EahLuXaY86TXfR7Dc5lw294alXOq86JAHCihAIZfqv8nNCWvaEJvaC51uN9hbLGeV0cFBdH+Fw== + dependencies: + "@types/json-schema" "^7.0.8" + ajv "^6.12.5" + ajv-keywords "^3.5.2" + +scroll-into-view-if-needed@^2.2.25: + version "2.2.28" + resolved "https://registry.yarnpkg.com/scroll-into-view-if-needed/-/scroll-into-view-if-needed-2.2.28.tgz#5a15b2f58a52642c88c8eca584644e01703d645a" + integrity sha512-8LuxJSuFVc92+0AdNv4QOxRL4Abeo1DgLnGNkn1XlaujPH/3cCFz3QI60r2VNu4obJJROzgnIUw5TKQkZvZI1w== + dependencies: + compute-scroll-into-view "^1.0.17" + +semver@^5.6.0: + version "5.7.1" + resolved "https://registry.yarnpkg.com/semver/-/semver-5.7.1.tgz#a954f931aeba508d307bbf069eff0c01c96116f7" + integrity sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ== + +semver@^6.0.0, semver@^6.3.0: + version "6.3.0" + resolved "https://registry.yarnpkg.com/semver/-/semver-6.3.0.tgz#ee0a64c8af5e8ceea67687b133761e1becbd1d3d" + integrity sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw== + +semver@^7.2.1, semver@^7.3.5: + version "7.3.5" + resolved "https://registry.yarnpkg.com/semver/-/semver-7.3.5.tgz#0b621c879348d8998e4b0e4be94b3f12e6018ef7" + integrity sha512-PoeGJYh8HK4BTO/a9Tf6ZG3veo/A7ZVsYrSA6J8ny9nb3B1VrpkuN+z9OE5wfE5p6H4LchYZsegiQgbJD94ZFQ== + dependencies: + lru-cache "^6.0.0" + +serialize-javascript@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/serialize-javascript/-/serialize-javascript-4.0.0.tgz#b525e1238489a5ecfc42afacc3fe99e666f4b1aa" + integrity sha512-GaNA54380uFefWghODBWEGisLZFj00nS5ACs6yHa9nLqlLpVLO8ChDGeKRjZnV4Nh4n0Qi7nhYZD/9fCPzEqkw== + dependencies: + randombytes "^2.1.0" + +set-value@^2.0.0, set-value@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/set-value/-/set-value-2.0.1.tgz#a18d40530e6f07de4228c7defe4227af8cad005b" + integrity sha512-JxHc1weCN68wRY0fhCoXpyK55m/XPHafOmK4UWD7m2CI14GMcFypt4w/0+NV5f/ZMby2F6S2wwA7fgynh9gWSw== + dependencies: + extend-shallow "^2.0.1" + is-extendable "^0.1.1" + is-plain-object "^2.0.3" + split-string "^3.0.1" + +setimmediate@^1.0.4: + version "1.0.5" + resolved "https://registry.yarnpkg.com/setimmediate/-/setimmediate-1.0.5.tgz#290cbb232e306942d7d7ea9b83732ab7856f8285" + integrity sha1-KQy7Iy4waULX1+qbg3Mqt4VvgoU= + +setprototypeof@1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/setprototypeof/-/setprototypeof-1.1.1.tgz#7e95acb24aa92f5885e0abef5ba131330d4ae683" + integrity sha512-JvdAWfbXeIGaZ9cILp38HntZSFSo3mWg6xGcJJsd+d4aRMOqauag1C63dJfDw7OaMYwEbHMOxEZ1lqVRYP2OAw== + +sha.js@^2.4.0, sha.js@^2.4.8: + version "2.4.11" + resolved "https://registry.yarnpkg.com/sha.js/-/sha.js-2.4.11.tgz#37a5cf0b81ecbc6943de109ba2960d1b26584ae7" + integrity sha512-QMEp5B7cftE7APOjk5Y6xgrbWu+WkLVQwk8JNjZ8nKRciZaByEW6MubieAiToS7+dwvrjGhH8jRXz3MVd0AYqQ== + dependencies: + inherits "^2.0.1" + safe-buffer "^5.0.1" + +shallowequal@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/shallowequal/-/shallowequal-1.1.0.tgz#188d521de95b9087404fd4dcb68b13df0ae4e7f8" + integrity sha512-y0m1JoUZSlPAjXVtPPW70aZWfIL/dSP7AFkRnniLCrK/8MDKog3TySTBmckD+RObVxH0v4Tox67+F14PdED2oQ== + +shebang-command@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/shebang-command/-/shebang-command-2.0.0.tgz#ccd0af4f8835fbdc265b82461aaf0c36663f34ea" + integrity sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA== + dependencies: + shebang-regex "^3.0.0" + +shebang-regex@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/shebang-regex/-/shebang-regex-3.0.0.tgz#ae16f1644d873ecad843b0307b143362d4c42172" + integrity sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A== + +shell-quote@1.7.2: + version "1.7.2" + resolved "https://registry.yarnpkg.com/shell-quote/-/shell-quote-1.7.2.tgz#67a7d02c76c9da24f99d20808fcaded0e0e04be2" + integrity sha512-mRz/m/JVscCrkMyPqHc/bczi3OQHkLTqXHEFu0zDhK/qfv3UcOA4SVmRCLmos4bhjr9ekVQubj/R7waKapmiQg== + +side-channel@^1.0.4: + version "1.0.4" + resolved "https://registry.yarnpkg.com/side-channel/-/side-channel-1.0.4.tgz#efce5c8fdc104ee751b25c58d4290011fa5ea2cf" + integrity sha512-q5XPytqFEIKHkGdiMIrY10mvLRvnQh42/+GoBlFW3b2LXLE2xxJpZFdm94we0BaoV3RwJyGqg5wS7epxTv0Zvw== + dependencies: + call-bind "^1.0.0" + get-intrinsic "^1.0.2" + object-inspect "^1.9.0" + +slash@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/slash/-/slash-3.0.0.tgz#6539be870c165adbd5240220dbe361f1bc4d4634" + integrity sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q== + +slice-ansi@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/slice-ansi/-/slice-ansi-4.0.0.tgz#500e8dd0fd55b05815086255b3195adf2a45fe6b" + integrity sha512-qMCMfhY040cVHT43K9BFygqYbUPFZKHOg7K73mtTWJRb8pyP3fzf4Ixd5SzdEJQ6MRUg/WBnOLxghZtKKurENQ== + dependencies: + ansi-styles "^4.0.0" + astral-regex "^2.0.0" + is-fullwidth-code-point "^3.0.0" + +snapdragon-node@^2.0.1: + version "2.1.1" + resolved "https://registry.yarnpkg.com/snapdragon-node/-/snapdragon-node-2.1.1.tgz#6c175f86ff14bdb0724563e8f3c1b021a286853b" + integrity sha512-O27l4xaMYt/RSQ5TR3vpWCAB5Kb/czIcqUFOM/C4fYcLnbZUc1PkjTAMjof2pBWaSTwOUd6qUHcFGVGj7aIwnw== + dependencies: + define-property "^1.0.0" + isobject "^3.0.0" + snapdragon-util "^3.0.1" + +snapdragon-util@^3.0.1: + version "3.0.1" + resolved "https://registry.yarnpkg.com/snapdragon-util/-/snapdragon-util-3.0.1.tgz#f956479486f2acd79700693f6f7b805e45ab56e2" + integrity sha512-mbKkMdQKsjX4BAL4bRYTj21edOf8cN7XHdYUJEe+Zn99hVEYcMvKPct1IqNe7+AZPirn8BCDOQBHQZknqmKlZQ== + dependencies: + kind-of "^3.2.0" + +snapdragon@^0.8.1: + version "0.8.2" + resolved "https://registry.yarnpkg.com/snapdragon/-/snapdragon-0.8.2.tgz#64922e7c565b0e14204ba1aa7d6964278d25182d" + integrity sha512-FtyOnWN/wCHTVXOMwvSv26d+ko5vWlIDD6zoUJ7LW8vh+ZBC8QdljveRP+crNrtBwioEUWy/4dMtbBjA4ioNlg== + dependencies: + base "^0.11.1" + debug "^2.2.0" + define-property "^0.2.5" + extend-shallow "^2.0.1" + map-cache "^0.2.2" + source-map "^0.5.6" + source-map-resolve "^0.5.0" + use "^3.1.0" + +source-list-map@^2.0.0: + version "2.0.1" + resolved "https://registry.yarnpkg.com/source-list-map/-/source-list-map-2.0.1.tgz#3993bd873bfc48479cca9ea3a547835c7c154b34" + integrity sha512-qnQ7gVMxGNxsiL4lEuJwe/To8UnK7fAnmbGEEH8RpLouuKbeEm0lhbQVFIrNSuB+G7tVrAlVsZgETT5nljf+Iw== + +source-map-resolve@^0.5.0: + version "0.5.3" + resolved "https://registry.yarnpkg.com/source-map-resolve/-/source-map-resolve-0.5.3.tgz#190866bece7553e1f8f267a2ee82c606b5509a1a" + integrity sha512-Htz+RnsXWk5+P2slx5Jh3Q66vhQj1Cllm0zvnaY98+NFx+Dv2CF/f5O/t8x+KaNdrdIAsruNzoh/KpialbqAnw== + dependencies: + atob "^2.1.2" + decode-uri-component "^0.2.0" + resolve-url "^0.2.1" + source-map-url "^0.4.0" + urix "^0.1.0" + +source-map-support@~0.5.12: + version "0.5.20" + resolved "https://registry.yarnpkg.com/source-map-support/-/source-map-support-0.5.20.tgz#12166089f8f5e5e8c56926b377633392dd2cb6c9" + integrity sha512-n1lZZ8Ve4ksRqizaBQgxXDgKwttHDhyfQjA6YZZn8+AroHbsIz+JjwxQDxbp+7y5OYCI8t1Yk7etjD9CRd2hIw== + dependencies: + buffer-from "^1.0.0" + source-map "^0.6.0" + +source-map-url@^0.4.0: + version "0.4.1" + resolved "https://registry.yarnpkg.com/source-map-url/-/source-map-url-0.4.1.tgz#0af66605a745a5a2f91cf1bbf8a7afbc283dec56" + integrity sha512-cPiFOTLUKvJFIg4SKVScy4ilPPW6rFgMgfuZJPNoDuMs3nC1HbMUycBoJw77xFIp6z1UJQJOfx6C9GMH80DiTw== + +source-map@0.7.3: + version "0.7.3" + resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.7.3.tgz#5302f8169031735226544092e64981f751750383" + integrity sha512-CkCj6giN3S+n9qrYiBTX5gystlENnRW5jZeNLHpe6aue+SrHcG5VYwujhW9s4dY31mEGsxBDrHR6oI69fTXsaQ== + +source-map@0.8.0-beta.0: + version "0.8.0-beta.0" + resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.8.0-beta.0.tgz#d4c1bb42c3f7ee925f005927ba10709e0d1d1f11" + integrity sha512-2ymg6oRBpebeZi9UUNsgQ89bhx01TcTkmNTGnNO88imTmbSgy4nfujrgVEFKWpMTEGA11EDkTt7mqObTPdigIA== + dependencies: + whatwg-url "^7.0.0" + +source-map@^0.5.0, source-map@^0.5.6: + version "0.5.7" + resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.5.7.tgz#8a039d2d1021d22d1ea14c80d8ea468ba2ef3fcc" + integrity sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w= + +source-map@^0.6.0, source-map@^0.6.1, source-map@~0.6.0, source-map@~0.6.1: + version "0.6.1" + resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.6.1.tgz#74722af32e9614e9c287a8d0bbde48b5e2f1a263" + integrity sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g== + +split-string@^3.0.1, split-string@^3.0.2: + version "3.1.0" + resolved "https://registry.yarnpkg.com/split-string/-/split-string-3.1.0.tgz#7cb09dda3a86585705c64b39a6466038682e8fe2" + integrity sha512-NzNVhJDYpwceVVii8/Hu6DKfD2G+NrQHlS/V/qgv763EYudVwEcMQNxd2lh+0VrUByXN/oJkl5grOhYWvQUYiw== + dependencies: + extend-shallow "^3.0.0" + +sprintf-js@~1.0.2: + version "1.0.3" + resolved "https://registry.yarnpkg.com/sprintf-js/-/sprintf-js-1.0.3.tgz#04e6926f662895354f3dd015203633b857297e2c" + integrity sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw= + +ssri@^6.0.1: + version "6.0.2" + resolved "https://registry.yarnpkg.com/ssri/-/ssri-6.0.2.tgz#157939134f20464e7301ddba3e90ffa8f7728ac5" + integrity sha512-cepbSq/neFK7xB6A50KHN0xHDotYzq58wWCa5LeWqnPrHG8GzfEjO/4O8kpmcGW+oaxkvhEJCWgbgNk4/ZV93Q== + dependencies: + figgy-pudding "^3.5.1" + +stacktrace-parser@0.1.10: + version "0.1.10" + resolved "https://registry.yarnpkg.com/stacktrace-parser/-/stacktrace-parser-0.1.10.tgz#29fb0cae4e0d0b85155879402857a1639eb6051a" + integrity sha512-KJP1OCML99+8fhOHxwwzyWrlUuVX5GQ0ZpJTd1DFXhdkrvg1szxfHhawXUZ3g9TkXORQd4/WG68jMlQZ2p8wlg== + dependencies: + type-fest "^0.7.1" + +static-extend@^0.1.1: + version "0.1.2" + resolved "https://registry.yarnpkg.com/static-extend/-/static-extend-0.1.2.tgz#60809c39cbff55337226fd5e0b520f341f1fb5c6" + integrity sha1-YICcOcv/VTNyJv1eC1IPNB8ftcY= + dependencies: + define-property "^0.2.5" + object-copy "^0.1.0" + +"statuses@>= 1.5.0 < 2": + version "1.5.0" + resolved "https://registry.yarnpkg.com/statuses/-/statuses-1.5.0.tgz#161c7dac177659fd9811f43771fa99381478628c" + integrity sha1-Fhx9rBd2Wf2YEfQ3cfqZOBR4Yow= + +stream-browserify@3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/stream-browserify/-/stream-browserify-3.0.0.tgz#22b0a2850cdf6503e73085da1fc7b7d0c2122f2f" + integrity sha512-H73RAHsVBapbim0tU2JwwOiXUj+fikfiaoYAKHF3VJfA0pe2BCzkhAHBlLG6REzE+2WNZcxOXjK7lkso+9euLA== + dependencies: + inherits "~2.0.4" + readable-stream "^3.5.0" + +stream-browserify@^2.0.1: + version "2.0.2" + resolved "https://registry.yarnpkg.com/stream-browserify/-/stream-browserify-2.0.2.tgz#87521d38a44aa7ee91ce1cd2a47df0cb49dd660b" + integrity sha512-nX6hmklHs/gr2FuxYDltq8fJA1GDlxKQCz8O/IM4atRqBH8OORmBNgfvW5gG10GT/qQ9u0CzIvr2X5Pkt6ntqg== + dependencies: + inherits "~2.0.1" + readable-stream "^2.0.2" + +stream-each@^1.1.0: + version "1.2.3" + resolved "https://registry.yarnpkg.com/stream-each/-/stream-each-1.2.3.tgz#ebe27a0c389b04fbcc233642952e10731afa9bae" + integrity sha512-vlMC2f8I2u/bZGqkdfLQW/13Zihpej/7PmSiMQsbYddxuTsJp8vRe2x2FvVExZg7FaOds43ROAuFJwPR4MTZLw== + dependencies: + end-of-stream "^1.1.0" + stream-shift "^1.0.0" + +stream-http@3.1.1: + version "3.1.1" + resolved "https://registry.yarnpkg.com/stream-http/-/stream-http-3.1.1.tgz#0370a8017cf8d050b9a8554afe608f043eaff564" + integrity sha512-S7OqaYu0EkFpgeGFb/NPOoPLxFko7TPqtEeFg5DXPB4v/KETHG0Ln6fRFrNezoelpaDKmycEmmZ81cC9DAwgYg== + dependencies: + builtin-status-codes "^3.0.0" + inherits "^2.0.4" + readable-stream "^3.6.0" + xtend "^4.0.2" + +stream-http@^2.7.2: + version "2.8.3" + resolved "https://registry.yarnpkg.com/stream-http/-/stream-http-2.8.3.tgz#b2d242469288a5a27ec4fe8933acf623de6514fc" + integrity sha512-+TSkfINHDo4J+ZobQLWiMouQYB+UVYFttRA94FpEzzJ7ZdqcL4uUUQ7WkdkI4DSozGmgBUE/a47L+38PenXhUw== + dependencies: + builtin-status-codes "^3.0.0" + inherits "^2.0.1" + readable-stream "^2.3.6" + to-arraybuffer "^1.0.0" + xtend "^4.0.0" + +stream-parser@^0.3.1: + version "0.3.1" + resolved "https://registry.yarnpkg.com/stream-parser/-/stream-parser-0.3.1.tgz#1618548694420021a1182ff0af1911c129761773" + integrity sha1-FhhUhpRCACGhGC/wrxkRwSl2F3M= + dependencies: + debug "2" + +stream-shift@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/stream-shift/-/stream-shift-1.0.1.tgz#d7088281559ab2778424279b0877da3c392d5a3d" + integrity sha512-AiisoFqQ0vbGcZgQPY1cdP2I76glaVA/RauYR4G4thNFgkTqr90yXTo4LYX60Jl+sIlPNHHdGSwo01AvbKUSVQ== + +string-convert@^0.2.0: + version "0.2.1" + resolved "https://registry.yarnpkg.com/string-convert/-/string-convert-0.2.1.tgz#6982cc3049fbb4cd85f8b24568b9d9bf39eeff97" + integrity sha1-aYLMMEn7tM2F+LJFaLnZvznu/5c= + +string-hash@1.1.3: + version "1.1.3" + resolved "https://registry.yarnpkg.com/string-hash/-/string-hash-1.1.3.tgz#e8aafc0ac1855b4666929ed7dd1275df5d6c811b" + integrity sha1-6Kr8CsGFW0Zmkp7X3RJ1311sgRs= + +string-width@^4.2.0: + version "4.2.2" + resolved "https://registry.yarnpkg.com/string-width/-/string-width-4.2.2.tgz#dafd4f9559a7585cfba529c6a0a4f73488ebd4c5" + integrity sha512-XBJbT3N4JhVumXE0eoLU9DCjcaF92KLNqTmFCnG1pf8duUxFGwtP6AD6nkjw9a3IdiRtL3E2w3JDiE/xi3vOeA== + dependencies: + emoji-regex "^8.0.0" + is-fullwidth-code-point "^3.0.0" + strip-ansi "^6.0.0" + +string.prototype.trimend@^1.0.4: + version "1.0.4" + resolved "https://registry.yarnpkg.com/string.prototype.trimend/-/string.prototype.trimend-1.0.4.tgz#e75ae90c2942c63504686c18b287b4a0b1a45f80" + integrity sha512-y9xCjw1P23Awk8EvTpcyL2NIr1j7wJ39f+k6lvRnSMz+mz9CGz9NYPelDk42kOz6+ql8xjfK8oYzy3jAP5QU5A== + dependencies: + call-bind "^1.0.2" + define-properties "^1.1.3" + +string.prototype.trimstart@^1.0.4: + version "1.0.4" + resolved "https://registry.yarnpkg.com/string.prototype.trimstart/-/string.prototype.trimstart-1.0.4.tgz#b36399af4ab2999b4c9c648bd7a3fb2bb26feeed" + integrity sha512-jh6e984OBfvxS50tdY2nRZnoC5/mLFKOREQfw8t5yytkoUsJRNxvI/E39qu1sD0OtWI3OC0XgKSmcWwziwYuZw== + dependencies: + call-bind "^1.0.2" + define-properties "^1.1.3" + +string_decoder@1.3.0, string_decoder@^1.0.0, string_decoder@^1.1.1: + version "1.3.0" + resolved "https://registry.yarnpkg.com/string_decoder/-/string_decoder-1.3.0.tgz#42f114594a46cf1a8e30b0a84f56c78c3edac21e" + integrity sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA== + dependencies: + safe-buffer "~5.2.0" + +string_decoder@~1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/string_decoder/-/string_decoder-1.1.1.tgz#9cf1611ba62685d7030ae9e4ba34149c3af03fc8" + integrity sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg== + dependencies: + safe-buffer "~5.1.0" + +strip-ansi@6.0.0, strip-ansi@^6.0.0: + version "6.0.0" + resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-6.0.0.tgz#0b1571dd7669ccd4f3e06e14ef1eed26225ae532" + integrity sha512-AuvKTrTfQNYNIctbR1K/YGTR1756GycPsg7b9bdV9Duqur4gv6aKqHXah67Z8ImS7WEz5QVcOtlfW2rZEugt6w== + dependencies: + ansi-regex "^5.0.0" + +strip-ansi@^3.0.0: + version "3.0.1" + resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-3.0.1.tgz#6a385fb8853d952d5ff05d0e8aaf94278dc63dcf" + integrity sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8= + dependencies: + ansi-regex "^2.0.0" + +strip-json-comments@^3.1.0, strip-json-comments@^3.1.1: + version "3.1.1" + resolved "https://registry.yarnpkg.com/strip-json-comments/-/strip-json-comments-3.1.1.tgz#31f1281b3832630434831c310c01cccda8cbe006" + integrity sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig== + +styled-jsx@3.3.2: + version "3.3.2" + resolved "https://registry.yarnpkg.com/styled-jsx/-/styled-jsx-3.3.2.tgz#2474601a26670a6049fb4d3f94bd91695b3ce018" + integrity sha512-daAkGd5mqhbBhLd6jYAjYBa9LpxYCzsgo/f6qzPdFxVB8yoGbhxvzQgkC0pfmCVvW3JuAEBn0UzFLBfkHVZG1g== + dependencies: + "@babel/types" "7.8.3" + babel-plugin-syntax-jsx "6.18.0" + convert-source-map "1.7.0" + loader-utils "1.2.3" + source-map "0.7.3" + string-hash "1.1.3" + stylis "3.5.4" + stylis-rule-sheet "0.0.10" + +stylis-rule-sheet@0.0.10: + version "0.0.10" + resolved "https://registry.yarnpkg.com/stylis-rule-sheet/-/stylis-rule-sheet-0.0.10.tgz#44e64a2b076643f4b52e5ff71efc04d8c3c4a430" + integrity sha512-nTbZoaqoBnmK+ptANthb10ZRZOGC+EmTLLUxeYIuHNkEKcmKgXX1XWKkUBT2Ac4es3NybooPe0SmvKdhKJZAuw== + +stylis@3.5.4: + version "3.5.4" + resolved "https://registry.yarnpkg.com/stylis/-/stylis-3.5.4.tgz#f665f25f5e299cf3d64654ab949a57c768b73fbe" + integrity sha512-8/3pSmthWM7lsPBKv7NXkzn2Uc9W7NotcwGNpJaa3k7WMM1XDCA4MgT5k/8BIexd5ydZdboXtU90XH9Ec4Bv/Q== + +supports-color@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-2.0.0.tgz#535d045ce6b6363fa40117084629995e9df324c7" + integrity sha1-U10EXOa2Nj+kARcIRimZXp3zJMc= + +supports-color@^5.3.0, supports-color@^5.4.0: + version "5.5.0" + resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-5.5.0.tgz#e2e69a44ac8772f78a1ec0b35b689df6530efc8f" + integrity sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow== + dependencies: + has-flag "^3.0.0" + +supports-color@^6.1.0: + version "6.1.0" + resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-6.1.0.tgz#0764abc69c63d5ac842dd4867e8d025e880df8f3" + integrity sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ== + dependencies: + has-flag "^3.0.0" + +supports-color@^7.1.0: + version "7.2.0" + resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-7.2.0.tgz#1b7dcdcb32b8138801b3e478ba6a51caa89648da" + integrity sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw== + dependencies: + has-flag "^4.0.0" + +supports-color@^8.0.0: + version "8.1.1" + resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-8.1.1.tgz#cd6fc17e28500cff56c1b86c0a7fd4a54a73005c" + integrity sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q== + dependencies: + has-flag "^4.0.0" + +swr@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/swr/-/swr-1.0.0.tgz#d047933714d8bd16ae35af67d81149f4ae700a4d" + integrity sha512-v55Dr+vxIFiUyGxC5W4uN5falxHxYdbpb/R3bO+bSG+svbC9bUWmupy4NM/2pER7X8OvgwJWu0AiSoGy0ND9ew== + dependencies: + dequal "2.0.2" + +table@^6.0.9: + version "6.7.1" + resolved "https://registry.yarnpkg.com/table/-/table-6.7.1.tgz#ee05592b7143831a8c94f3cee6aae4c1ccef33e2" + integrity sha512-ZGum47Yi6KOOFDE8m223td53ath2enHcYLgOCjGr5ngu8bdIARQk6mN/wRMv4yMRcHnCSnHbCEha4sobQx5yWg== + dependencies: + ajv "^8.0.1" + lodash.clonedeep "^4.5.0" + lodash.truncate "^4.4.2" + slice-ansi "^4.0.0" + string-width "^4.2.0" + strip-ansi "^6.0.0" + +tapable@^1.0.0, tapable@^1.1.3: + version "1.1.3" + resolved "https://registry.yarnpkg.com/tapable/-/tapable-1.1.3.tgz#a1fccc06b58db61fd7a45da2da44f5f3a3e67ba2" + integrity sha512-4WK/bYZmj8xLr+HUCODHGF1ZFzsYffasLUgEiMBY4fgtltdO6B4WJtlSbPaDTLpYTcGVwM2qLnFTICEcNxs3kA== + +terser-webpack-plugin@^1.4.3: + version "1.4.5" + resolved "https://registry.yarnpkg.com/terser-webpack-plugin/-/terser-webpack-plugin-1.4.5.tgz#a217aefaea330e734ffacb6120ec1fa312d6040b" + integrity sha512-04Rfe496lN8EYruwi6oPQkG0vo8C+HT49X687FZnpPF0qMAIHONI6HEXYPKDOE8e5HjXTyKfqRd/agHtH0kOtw== + dependencies: + cacache "^12.0.2" + find-cache-dir "^2.1.0" + is-wsl "^1.1.0" + schema-utils "^1.0.0" + serialize-javascript "^4.0.0" + source-map "^0.6.1" + terser "^4.1.2" + webpack-sources "^1.4.0" + worker-farm "^1.7.0" + +terser@^4.1.2: + version "4.8.0" + resolved "https://registry.yarnpkg.com/terser/-/terser-4.8.0.tgz#63056343d7c70bb29f3af665865a46fe03a0df17" + integrity sha512-EAPipTNeWsb/3wLPeup1tVPaXfIaU68xMnVdPafIL1TV05OhASArYyIfFvnvJCNrR2NIOvDVNNTFRa+Re2MWyw== + dependencies: + commander "^2.20.0" + source-map "~0.6.1" + source-map-support "~0.5.12" + +text-table@^0.2.0: + version "0.2.0" + resolved "https://registry.yarnpkg.com/text-table/-/text-table-0.2.0.tgz#7f5ee823ae805207c00af2df4a84ec3fcfa570b4" + integrity sha1-f17oI66AUgfACvLfSoTsP8+lcLQ= + +through2@^2.0.0: + version "2.0.5" + resolved "https://registry.yarnpkg.com/through2/-/through2-2.0.5.tgz#01c1e39eb31d07cb7d03a96a70823260b23132cd" + integrity sha512-/mrRod8xqpA+IHSLyGCQ2s8SPHiCDEeQJSep1jqLYeEUClOFG2Qsh+4FU6G9VeqpZnGW/Su8LQGc4YKni5rYSQ== + dependencies: + readable-stream "~2.3.6" + xtend "~4.0.1" + +timers-browserify@2.0.12, timers-browserify@^2.0.4: + version "2.0.12" + resolved "https://registry.yarnpkg.com/timers-browserify/-/timers-browserify-2.0.12.tgz#44a45c11fbf407f34f97bccd1577c652361b00ee" + integrity sha512-9phl76Cqm6FhSX9Xe1ZUAMLtm1BLkKj2Qd5ApyWkXzsMRaA7dgr81kf4wJmQf/hAvg8EEyJxDo3du/0KlhPiKQ== + dependencies: + setimmediate "^1.0.4" + +to-arraybuffer@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/to-arraybuffer/-/to-arraybuffer-1.0.1.tgz#7d229b1fcc637e466ca081180836a7aabff83f43" + integrity sha1-fSKbH8xjfkZsoIEYCDanqr/4P0M= + +to-fast-properties@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/to-fast-properties/-/to-fast-properties-2.0.0.tgz#dc5e698cbd079265bc73e0377681a4e4e83f616e" + integrity sha1-3F5pjL0HkmW8c+A3doGk5Og/YW4= + +to-object-path@^0.3.0: + version "0.3.0" + resolved "https://registry.yarnpkg.com/to-object-path/-/to-object-path-0.3.0.tgz#297588b7b0e7e0ac08e04e672f85c1f4999e17af" + integrity sha1-KXWIt7Dn4KwI4E5nL4XB9JmeF68= + dependencies: + kind-of "^3.0.2" + +to-regex-range@^2.1.0: + version "2.1.1" + resolved "https://registry.yarnpkg.com/to-regex-range/-/to-regex-range-2.1.1.tgz#7c80c17b9dfebe599e27367e0d4dd5590141db38" + integrity sha1-fIDBe53+vlmeJzZ+DU3VWQFB2zg= + dependencies: + is-number "^3.0.0" + repeat-string "^1.6.1" + +to-regex-range@^5.0.1: + version "5.0.1" + resolved "https://registry.yarnpkg.com/to-regex-range/-/to-regex-range-5.0.1.tgz#1648c44aae7c8d988a326018ed72f5b4dd0392e4" + integrity sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ== + dependencies: + is-number "^7.0.0" + +to-regex@^3.0.1, to-regex@^3.0.2: + version "3.0.2" + resolved "https://registry.yarnpkg.com/to-regex/-/to-regex-3.0.2.tgz#13cfdd9b336552f30b51f33a8ae1b42a7a7599ce" + integrity sha512-FWtleNAtZ/Ki2qtqej2CXTOayOH9bHDQF+Q48VpWyDXjbYxA4Yz8iDB31zXOBUlOHHKidDbqGVrTUvQMPmBGBw== + dependencies: + define-property "^2.0.2" + extend-shallow "^3.0.2" + regex-not "^1.0.2" + safe-regex "^1.1.0" + +toggle-selection@^1.0.6: + version "1.0.6" + resolved "https://registry.yarnpkg.com/toggle-selection/-/toggle-selection-1.0.6.tgz#6e45b1263f2017fa0acc7d89d78b15b8bf77da32" + integrity sha1-bkWxJj8gF/oKzH2J14sVuL932jI= + +toidentifier@1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/toidentifier/-/toidentifier-1.0.0.tgz#7e1be3470f1e77948bc43d94a3c8f4d7752ba553" + integrity sha512-yaOH/Pk/VEhBWWTlhI+qXxDFXlejDGcQipMlyxda9nthulaxLZUNcUqFxokp0vcYnvteJln5FNQDRrxj3YcbVw== + +tr46@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/tr46/-/tr46-1.0.1.tgz#a8b13fd6bfd2489519674ccde55ba3693b706d09" + integrity sha1-qLE/1r/SSJUZZ0zN5VujaTtwbQk= + dependencies: + punycode "^2.1.0" + +ts-pnp@^1.1.6: + version "1.2.0" + resolved "https://registry.yarnpkg.com/ts-pnp/-/ts-pnp-1.2.0.tgz#a500ad084b0798f1c3071af391e65912c86bca92" + integrity sha512-csd+vJOb/gkzvcCHgTGSChYpy5f1/XKNsmvBGO4JXS+z1v2HobugDz4s1IeFXM3wZB44uczs+eazB5Q/ccdhQw== + +tslib@^1.10.0, tslib@^1.8.1: + version "1.14.1" + resolved "https://registry.yarnpkg.com/tslib/-/tslib-1.14.1.tgz#cf2d38bdc34a134bcaf1091c41f6619e2f672d00" + integrity sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg== + +tsutils@^3.21.0: + version "3.21.0" + resolved "https://registry.yarnpkg.com/tsutils/-/tsutils-3.21.0.tgz#b48717d394cea6c1e096983eed58e9d61715b623" + integrity sha512-mHKK3iUXL+3UF6xL5k0PEhKRUBKPBCv/+RkEOpjRWxxx27KKRBmmA60A9pgOUvMi8GKhRMPEmjBRPzs2W7O1OA== + dependencies: + tslib "^1.8.1" + +tty-browserify@0.0.0: + version "0.0.0" + resolved "https://registry.yarnpkg.com/tty-browserify/-/tty-browserify-0.0.0.tgz#a157ba402da24e9bf957f9aa69d524eed42901a6" + integrity sha1-oVe6QC2iTpv5V/mqadUk7tQpAaY= + +tty-browserify@0.0.1: + version "0.0.1" + resolved "https://registry.yarnpkg.com/tty-browserify/-/tty-browserify-0.0.1.tgz#3f05251ee17904dfd0677546670db9651682b811" + integrity sha512-C3TaO7K81YvjCgQH9Q1S3R3P3BtN3RIM8n+OvX4il1K1zgE8ZhI0op7kClgkxtutIE8hQrcrHBXvIheqKUUCxw== + +type-check@^0.4.0, type-check@~0.4.0: + version "0.4.0" + resolved "https://registry.yarnpkg.com/type-check/-/type-check-0.4.0.tgz#07b8203bfa7056c0657050e3ccd2c37730bab8f1" + integrity sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew== + dependencies: + prelude-ls "^1.2.1" + +type-fest@^0.20.2: + version "0.20.2" + resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-0.20.2.tgz#1bf207f4b28f91583666cb5fbd327887301cd5f4" + integrity sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ== + +type-fest@^0.7.1: + version "0.7.1" + resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-0.7.1.tgz#8dda65feaf03ed78f0a3f9678f1869147f7c5c48" + integrity sha512-Ne2YiiGN8bmrmJJEuTWTLJR32nh/JdL1+PSicowtNb0WFpn59GK8/lfD61bVtzguz7b3PBt74nxpv/Pw5po5Rg== + +typedarray@^0.0.6: + version "0.0.6" + resolved "https://registry.yarnpkg.com/typedarray/-/typedarray-0.0.6.tgz#867ac74e3864187b1d3d47d996a78ec5c8830777" + integrity sha1-hnrHTjhkGHsdPUfZlqeOxciDB3c= + +typescript@^4.4.3: + version "4.4.3" + resolved "https://registry.yarnpkg.com/typescript/-/typescript-4.4.3.tgz#bdc5407caa2b109efd4f82fe130656f977a29324" + integrity sha512-4xfscpisVgqqDfPaJo5vkd+Qd/ItkoagnHpufr+i2QCHBsNYp+G7UAoyFl8aPtx879u38wPV65rZ8qbGZijalA== + +unbox-primitive@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/unbox-primitive/-/unbox-primitive-1.0.1.tgz#085e215625ec3162574dc8859abee78a59b14471" + integrity sha512-tZU/3NqK3dA5gpE1KtyiJUrEB0lxnGkMFHptJ7q6ewdZ8s12QrODwNbhIJStmJkd1QDXa1NRA8aF2A1zk/Ypyw== + dependencies: + function-bind "^1.1.1" + has-bigints "^1.0.1" + has-symbols "^1.0.2" + which-boxed-primitive "^1.0.2" + +union-value@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/union-value/-/union-value-1.0.1.tgz#0b6fe7b835aecda61c6ea4d4f02c14221e109847" + integrity sha512-tJfXmxMeWYnczCVs7XAEvIV7ieppALdyepWMkHkwciRpZraG/xwT+s2JN8+pr1+8jCRf80FFzvr+MpQeeoF4Xg== + dependencies: + arr-union "^3.1.0" + get-value "^2.0.6" + is-extendable "^0.1.1" + set-value "^2.0.1" + +unique-filename@^1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/unique-filename/-/unique-filename-1.1.1.tgz#1d69769369ada0583103a1e6ae87681b56573230" + integrity sha512-Vmp0jIp2ln35UTXuryvjzkjGdRyf9b2lTXuSYUiPmzRcl3FDtYqAwOnTJkAngD9SWhnoJzDbTKwaOrZ+STtxNQ== + dependencies: + unique-slug "^2.0.0" + +unique-slug@^2.0.0: + version "2.0.2" + resolved "https://registry.yarnpkg.com/unique-slug/-/unique-slug-2.0.2.tgz#baabce91083fc64e945b0f3ad613e264f7cd4e6c" + integrity sha512-zoWr9ObaxALD3DOPfjPSqxt4fnZiWblxHIgeWqW8x7UqDzEtHEQLzji2cuJYQFCU6KmoJikOYAZlrTHHebjx2w== + dependencies: + imurmurhash "^0.1.4" + +unpipe@1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/unpipe/-/unpipe-1.0.0.tgz#b2bf4ee8514aae6165b4817829d21b2ef49904ec" + integrity sha1-sr9O6FFKrmFltIF4KdIbLvSZBOw= + +unset-value@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/unset-value/-/unset-value-1.0.0.tgz#8376873f7d2335179ffb1e6fc3a8ed0dfc8ab559" + integrity sha1-g3aHP30jNRef+x5vw6jtDfyKtVk= + dependencies: + has-value "^0.3.1" + isobject "^3.0.0" + +upath@^1.1.1: + version "1.2.0" + resolved "https://registry.yarnpkg.com/upath/-/upath-1.2.0.tgz#8f66dbcd55a883acdae4408af8b035a5044c1894" + integrity sha512-aZwGpamFO61g3OlfT7OQCHqhGnW43ieH9WZeP7QxN/G/jS4jfqUkZxoryvJgVPEcrl5NL/ggHsSmLMHuH64Lhg== + +uri-js@^4.2.2: + version "4.4.1" + resolved "https://registry.yarnpkg.com/uri-js/-/uri-js-4.4.1.tgz#9b1a52595225859e55f669d928f88c6c57f2a77e" + integrity sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg== + dependencies: + punycode "^2.1.0" + +urix@^0.1.0: + version "0.1.0" + resolved "https://registry.yarnpkg.com/urix/-/urix-0.1.0.tgz#da937f7a62e21fec1fd18d49b35c2935067a6c72" + integrity sha1-2pN/emLiH+wf0Y1Js1wpNQZ6bHI= + +url-loader@^4.1.0: + version "4.1.1" + resolved "https://registry.yarnpkg.com/url-loader/-/url-loader-4.1.1.tgz#28505e905cae158cf07c92ca622d7f237e70a4e2" + integrity sha512-3BTV812+AVHHOJQO8O5MkWgZ5aosP7GnROJwvzLS9hWDj00lZ6Z0wNak423Lp9PBZN05N+Jk/N5Si8jRAlGyWA== + dependencies: + loader-utils "^2.0.0" + mime-types "^2.1.27" + schema-utils "^3.0.0" + +url@^0.11.0: + version "0.11.0" + resolved "https://registry.yarnpkg.com/url/-/url-0.11.0.tgz#3838e97cfc60521eb73c525a8e55bfdd9e2e28f1" + integrity sha1-ODjpfPxgUh63PFJajlW/3Z4uKPE= + dependencies: + punycode "1.3.2" + querystring "0.2.0" + +use-subscription@1.5.1: + version "1.5.1" + resolved "https://registry.yarnpkg.com/use-subscription/-/use-subscription-1.5.1.tgz#73501107f02fad84c6dd57965beb0b75c68c42d1" + integrity sha512-Xv2a1P/yReAjAbhylMfFplFKj9GssgTwN7RlcTxBujFQcloStWNDQdc4g4NRWH9xS4i/FDk04vQBptAXoF3VcA== + dependencies: + object-assign "^4.1.1" + +use@^3.1.0: + version "3.1.1" + resolved "https://registry.yarnpkg.com/use/-/use-3.1.1.tgz#d50c8cac79a19fbc20f2911f56eb973f4e10070f" + integrity sha512-cwESVXlO3url9YWlFW/TA9cshCEhtu7IKJ/p5soJ/gGpj7vbvFrAY/eIioQ6Dw23KjZhYgiIo8HOs1nQ2vr/oQ== + +util-deprecate@^1.0.1, util-deprecate@~1.0.1: + version "1.0.2" + resolved "https://registry.yarnpkg.com/util-deprecate/-/util-deprecate-1.0.2.tgz#450d4dc9fa70de732762fbd2d4a28981419a0ccf" + integrity sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8= + +util@0.10.3: + version "0.10.3" + resolved "https://registry.yarnpkg.com/util/-/util-0.10.3.tgz#7afb1afe50805246489e3db7fe0ed379336ac0f9" + integrity sha1-evsa/lCAUkZInj23/g7TeTNqwPk= + dependencies: + inherits "2.0.1" + +util@0.12.3: + version "0.12.3" + resolved "https://registry.yarnpkg.com/util/-/util-0.12.3.tgz#971bb0292d2cc0c892dab7c6a5d37c2bec707888" + integrity sha512-I8XkoQwE+fPQEhy9v012V+TSdH2kp9ts29i20TaaDUXsg7x/onePbhFJUExBfv/2ay1ZOp/Vsm3nDlmnFGSAog== + dependencies: + inherits "^2.0.3" + is-arguments "^1.0.4" + is-generator-function "^1.0.7" + is-typed-array "^1.1.3" + safe-buffer "^5.1.2" + which-typed-array "^1.1.2" + +util@^0.11.0: + version "0.11.1" + resolved "https://registry.yarnpkg.com/util/-/util-0.11.1.tgz#3236733720ec64bb27f6e26f421aaa2e1b588d61" + integrity sha512-HShAsny+zS2TZfaXxD9tYj4HQGlBezXZMZuM/S5PKLLoZkShZiGk9o5CzukI1LVHZvjdvZ2Sj1aW/Ndn2NB/HQ== + dependencies: + inherits "2.0.3" + +util@^0.12.0: + version "0.12.4" + resolved "https://registry.yarnpkg.com/util/-/util-0.12.4.tgz#66121a31420df8f01ca0c464be15dfa1d1850253" + integrity sha512-bxZ9qtSlGUWSOy9Qa9Xgk11kSslpuZwaxCg4sNIDj6FLucDab2JxnHwyNTCpHMtK1MjoQiWQ6DiUMZYbSrO+Sw== + dependencies: + inherits "^2.0.3" + is-arguments "^1.0.4" + is-generator-function "^1.0.7" + is-typed-array "^1.1.3" + safe-buffer "^5.1.2" + which-typed-array "^1.1.2" + +v8-compile-cache@^2.0.3: + version "2.3.0" + resolved "https://registry.yarnpkg.com/v8-compile-cache/-/v8-compile-cache-2.3.0.tgz#2de19618c66dc247dcfb6f99338035d8245a2cee" + integrity sha512-l8lCEmLcLYZh4nbunNZvQCJc5pv7+RCwa8q/LdUx8u7lsWvPDKmpodJAJNwkAhJC//dFY48KuIEmjtd4RViDrA== + +vm-browserify@1.1.2, vm-browserify@^1.0.1: + version "1.1.2" + resolved "https://registry.yarnpkg.com/vm-browserify/-/vm-browserify-1.1.2.tgz#78641c488b8e6ca91a75f511e7a3b32a86e5dda0" + integrity sha512-2ham8XPWTONajOR0ohOKOHXkm3+gaBmGut3SRuu75xLd/RRaY6vqgh8NBYYk7+RW3u5AtzPQZG8F10LHkl0lAQ== + +warning@^4.0.1: + version "4.0.3" + resolved "https://registry.yarnpkg.com/warning/-/warning-4.0.3.tgz#16e9e077eb8a86d6af7d64aa1e05fd85b4678ca3" + integrity sha512-rpJyN222KWIvHJ/F53XSZv0Zl/accqHR8et1kpaMTD/fLCRxtV8iX8czMzY7sVZupTI3zcUTg8eycS2kNF9l6w== + dependencies: + loose-envify "^1.0.0" + +watchpack-chokidar2@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/watchpack-chokidar2/-/watchpack-chokidar2-2.0.1.tgz#38500072ee6ece66f3769936950ea1771be1c957" + integrity sha512-nCFfBIPKr5Sh61s4LPpy1Wtfi0HE8isJ3d2Yb5/Ppw2P2B/3eVSEBjKfN0fmHJSK14+31KwMKmcrzs2GM4P0Ww== + dependencies: + chokidar "^2.1.8" + +watchpack@2.1.1: + version "2.1.1" + resolved "https://registry.yarnpkg.com/watchpack/-/watchpack-2.1.1.tgz#e99630550fca07df9f90a06056987baa40a689c7" + integrity sha512-Oo7LXCmc1eE1AjyuSBmtC3+Wy4HcV8PxWh2kP6fOl8yTlNS7r0K9l1ao2lrrUza7V39Y3D/BbJgY8VeSlc5JKw== + dependencies: + glob-to-regexp "^0.4.1" + graceful-fs "^4.1.2" + +watchpack@^1.7.4: + version "1.7.5" + resolved "https://registry.yarnpkg.com/watchpack/-/watchpack-1.7.5.tgz#1267e6c55e0b9b5be44c2023aed5437a2c26c453" + integrity sha512-9P3MWk6SrKjHsGkLT2KHXdQ/9SNkyoJbabxnKOoJepsvJjJG8uYTR3yTPxPQvNDI3w4Nz1xnE0TLHK4RIVe/MQ== + dependencies: + graceful-fs "^4.1.2" + neo-async "^2.5.0" + optionalDependencies: + chokidar "^3.4.1" + watchpack-chokidar2 "^2.0.1" + +webidl-conversions@^4.0.2: + version "4.0.2" + resolved "https://registry.yarnpkg.com/webidl-conversions/-/webidl-conversions-4.0.2.tgz#a855980b1f0b6b359ba1d5d9fb39ae941faa63ad" + integrity sha512-YQ+BmxuTgd6UXZW3+ICGfyqRyHXVlD5GtQr5+qjiNW7bF0cqrzX500HVXPBOvgXb5YnzDd+h0zqyv61KUD7+Sg== + +webpack-sources@^1.1.0, webpack-sources@^1.4.0, webpack-sources@^1.4.1: + version "1.4.3" + resolved "https://registry.yarnpkg.com/webpack-sources/-/webpack-sources-1.4.3.tgz#eedd8ec0b928fbf1cbfe994e22d2d890f330a933" + integrity sha512-lgTS3Xhv1lCOKo7SA5TjKXMjpSM4sBjNV5+q2bqesbSPs5FjGmU6jjtBSkX9b4qW87vDIsCIlUPOEhbZrMdjeQ== + dependencies: + source-list-map "^2.0.0" + source-map "~0.6.1" + +webpack@^4.44.0: + version "4.46.0" + resolved "https://registry.yarnpkg.com/webpack/-/webpack-4.46.0.tgz#bf9b4404ea20a073605e0a011d188d77cb6ad542" + integrity sha512-6jJuJjg8znb/xRItk7bkT0+Q7AHCYjjFnvKIWQPkNIOyRqoCGvkOs0ipeQzrqz4l5FtN5ZI/ukEHroeX/o1/5Q== + dependencies: + "@webassemblyjs/ast" "1.9.0" + "@webassemblyjs/helper-module-context" "1.9.0" + "@webassemblyjs/wasm-edit" "1.9.0" + "@webassemblyjs/wasm-parser" "1.9.0" + acorn "^6.4.1" + ajv "^6.10.2" + ajv-keywords "^3.4.1" + chrome-trace-event "^1.0.2" + enhanced-resolve "^4.5.0" + eslint-scope "^4.0.3" + json-parse-better-errors "^1.0.2" + loader-runner "^2.4.0" + loader-utils "^1.2.3" + memory-fs "^0.4.1" + micromatch "^3.1.10" + mkdirp "^0.5.3" + neo-async "^2.6.1" + node-libs-browser "^2.2.1" + schema-utils "^1.0.0" + tapable "^1.1.3" + terser-webpack-plugin "^1.4.3" + watchpack "^1.7.4" + webpack-sources "^1.4.1" + +whatwg-url@^7.0.0: + version "7.1.0" + resolved "https://registry.yarnpkg.com/whatwg-url/-/whatwg-url-7.1.0.tgz#c2c492f1eca612988efd3d2266be1b9fc6170d06" + integrity sha512-WUu7Rg1DroM7oQvGWfOiAK21n74Gg+T4elXEQYkOhtyLeWiJFoOGLXPKI/9gzIie9CtwVLm8wtw6YJdKyxSjeg== + dependencies: + lodash.sortby "^4.7.0" + tr46 "^1.0.1" + webidl-conversions "^4.0.2" + +which-boxed-primitive@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/which-boxed-primitive/-/which-boxed-primitive-1.0.2.tgz#13757bc89b209b049fe5d86430e21cf40a89a8e6" + integrity sha512-bwZdv0AKLpplFY2KZRX6TvyuN7ojjr7lwkg6ml0roIy9YeuSr7JS372qlNW18UQYzgYK9ziGcerWqZOmEn9VNg== + dependencies: + is-bigint "^1.0.1" + is-boolean-object "^1.1.0" + is-number-object "^1.0.4" + is-string "^1.0.5" + is-symbol "^1.0.3" + +which-typed-array@^1.1.2: + version "1.1.7" + resolved "https://registry.yarnpkg.com/which-typed-array/-/which-typed-array-1.1.7.tgz#2761799b9a22d4b8660b3c1b40abaa7739691793" + integrity sha512-vjxaB4nfDqwKI0ws7wZpxIlde1XrLX5uB0ZjpfshgmapJMD7jJWhZI+yToJTqaFByF0eNBcYxbjmCzoRP7CfEw== + dependencies: + available-typed-arrays "^1.0.5" + call-bind "^1.0.2" + es-abstract "^1.18.5" + foreach "^2.0.5" + has-tostringtag "^1.0.0" + is-typed-array "^1.1.7" + +which@^2.0.1: + version "2.0.2" + resolved "https://registry.yarnpkg.com/which/-/which-2.0.2.tgz#7c6a8dd0a636a0327e10b59c9286eee93f3f51b1" + integrity sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA== + dependencies: + isexe "^2.0.0" + +word-wrap@^1.2.3: + version "1.2.3" + resolved "https://registry.yarnpkg.com/word-wrap/-/word-wrap-1.2.3.tgz#610636f6b1f703891bd34771ccb17fb93b47079c" + integrity sha512-Hz/mrNwitNRh/HUAtM/VT/5VH+ygD6DV7mYKZAtHOrbs8U7lvPS6xf7EJKMF0uW1KJCl0H701g3ZGus+muE5vQ== + +worker-farm@^1.7.0: + version "1.7.0" + resolved "https://registry.yarnpkg.com/worker-farm/-/worker-farm-1.7.0.tgz#26a94c5391bbca926152002f69b84a4bf772e5a8" + integrity sha512-rvw3QTZc8lAxyVrqcSGVm5yP/IJ2UcB3U0graE3LCFoZ0Yn2x4EoVSqJKdB/T5M+FLcRPjz4TDacRf3OCfNUzw== + dependencies: + errno "~0.1.7" + +wrappy@1: + version "1.0.2" + resolved "https://registry.yarnpkg.com/wrappy/-/wrappy-1.0.2.tgz#b5243d8f3ec1aa35f1364605bc0d1036e30ab69f" + integrity sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8= + +xtend@^4.0.0, xtend@^4.0.2, xtend@~4.0.1: + version "4.0.2" + resolved "https://registry.yarnpkg.com/xtend/-/xtend-4.0.2.tgz#bb72779f5fa465186b1f438f674fa347fdb5db54" + integrity sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ== + +y18n@^4.0.0: + version "4.0.3" + resolved "https://registry.yarnpkg.com/y18n/-/y18n-4.0.3.tgz#b5f259c82cd6e336921efd7bfd8bf560de9eeedf" + integrity sha512-JKhqTOwSrqNA1NY5lSztJ1GrBiUodLMmIZuLiDaMRJ+itFd+ABVE8XBjOvIWL+rSqNDC74LCSFmlb/U4UZ4hJQ== + +yallist@^3.0.2: + version "3.1.1" + resolved "https://registry.yarnpkg.com/yallist/-/yallist-3.1.1.tgz#dbb7daf9bfd8bac9ab45ebf602b8cbad0d5d08fd" + integrity sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g== + +yallist@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/yallist/-/yallist-4.0.0.tgz#9bb92790d9c0effec63be73519e11a35019a3a72" + integrity sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A== + +yocto-queue@^0.1.0: + version "0.1.0" + resolved "https://registry.yarnpkg.com/yocto-queue/-/yocto-queue-0.1.0.tgz#0294eb3dee05028d31ee1a5fa2c556a6aaf10a1b" + integrity sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q== + +zustand@^3.5.10: + version "3.5.10" + resolved "https://registry.yarnpkg.com/zustand/-/zustand-3.5.10.tgz#d2622efd64530ffda285ee5b13ff645b68ab0faf" + integrity sha512-upluvSRWrlCiExu2UbkuMIPJ9AigyjRFoO7O9eUossIj7rPPq7pcJ0NKk6t2P7KF80tg/UdPX6/pNKOSbs9DEg== diff --git a/package.json b/package.json index 0222e46..8d59f7e 100644 --- a/package.json +++ b/package.json @@ -1,7 +1,13 @@ { "name": "@graphprotocol/graph-disputes", - "version": "0.1.0", + "version": "0.3.1", "description": "Graph Disputes", + "files": [ + "bin", + "dist/**/*", + "README.md", + "LICENSE" + ], "main": "dist/index.js", "types": "dist/index.d.ts", "repository": "https://github.com/edgeandnode/graph-disputes", @@ -29,7 +35,6 @@ "@types/node": "^14.14.21", "@types/p-queue": "^3.2.1", "@types/table": "6.0.0", - "@types/treeify": "^1.0.0", "@types/winston": "^2.4.4", "@types/yargs": "^15.0.12", "@typescript-eslint/eslint-plugin": "^4.13.0", @@ -48,10 +53,10 @@ "graphql-tag": "^2.11.0", "inquirer": "^7.3.3", "isomorphic-fetch": "^3.0.0", + "object-treeify": "^2.0.0", "ora": "^5.4.0", "p-queue": "^6.6.1", "prettier": "^2.2.1", - "treeify": "^1.1.0", "typescript": "^4.1.3", "winston": "^3.3.3", "yargs": "^16.2.0" diff --git a/server/.dockerignore b/server/.dockerignore new file mode 100644 index 0000000..0bb19f3 --- /dev/null +++ b/server/.dockerignore @@ -0,0 +1,16 @@ +insomnia/ +.vscode/ +notebooks/ +README.md +git/ + +build +*.egg-info +*.egg/ +*.pyc +*.swp + +.tox +.coverage +html/* +__pycache__ \ No newline at end of file diff --git a/server/Dockerfile b/server/Dockerfile new file mode 100644 index 0000000..177216f --- /dev/null +++ b/server/Dockerfile @@ -0,0 +1,47 @@ +# `python-base` sets up all our shared environment variables +FROM python:3.8-buster as python-base + +WORKDIR /app + +ENV PYTHONFAULTHANDLER=1 \ + PYTHONUNBUFFERED=1 \ + PYTHONHASHSEED=random + +FROM python-base as builder + + +ENV PIP_DEFAULT_TIMEOUT=100 \ + PIP_DISABLE_PIP_VERSION_CHECK=1 \ + PIP_NO_CACHE_DIR=1 \ + POETRY_VERSION=1.1.7 + +RUN buildDeps="build-essential libpq-dev curl git gcc patch libc6-dev ca-certificates" \ + && apt-get update \ + && apt-get install --no-install-recommends -y \ + curl \ + vim \ + netcat \ + && apt-get install -y --no-install-recommends $buildDeps \ + && rm -rf /var/lib/apt/lists/* + +RUN pip install "poetry==$POETRY_VERSION" + +RUN python -m venv /venv + + +# Copy only requirements to cache them in docker layer +COPY poetry.lock pyproject.toml ./ +RUN poetry export --without-hashes -f requirements.txt | /venv/bin/pip install -r /dev/stdin + +COPY . . +RUN poetry build && /venv/bin/pip install dist/*.whl + +FROM python-base as final + +COPY --from=builder /venv /venv +COPY docker-entrypoint.sh ./ +RUN ["chmod", "+x", "docker-entrypoint.sh"] + +EXPOSE 5432 +EXPOSE 8000 +CMD ["./docker-entrypoint.sh"] diff --git a/server/Makefile b/server/Makefile new file mode 100644 index 0000000..803ba33 --- /dev/null +++ b/server/Makefile @@ -0,0 +1,27 @@ +## ---------------------------------------------------------------------- +## This makefile is just for ease of running the dispute service docker +## container. +## ---------------------------------------------------------------------- +.PHONY : build-wheel build-container run-with-localdb build + +help: + @egrep -h '\s##\s' $(MAKEFILE_LIST) | awk 'BEGIN {FS = ":.*?## "}; {printf "\033[36m %-30s\033[0m %s\n", $$1, $$2}' + +install-poetry: ## Get poetry setup + curl -sSL https://raw.githubusercontent.com/python-poetry/poetry/master/get-poetry.py | python - + +install-pkgs: ## Runs poetry install + poetry install + +build-wheel: install-pkgs ## Package the code for docker + poetry build --format wheel + +build-container: build-wheel## Create a container hosting the application + docker build . -t graph-disputes-server-whl -f Dockerfile + +run-with-localdb: ## Run the application against a locally hosted postgres on a MAC + docker run --rm -p 8000:8000 -p 5432:5432 -it -e DB_HOST=localhost -e DB_USER=dispute_arbitrator -e DB_DATABASE=dispute_diagnosis -e DB_HOST=host.docker.internal graph-disputes-server + +build: build-wheel build-container ## Generate a wheel and package it in a container + +build-and-run: build run-with-localdb ## Generates container and runs it local diff --git a/server/README.md b/server/README.md new file mode 100644 index 0000000..ab7c596 --- /dev/null +++ b/server/README.md @@ -0,0 +1,53 @@ +# Python service for automating disputes. + + + +Requirements: + +0. Programmatic access to Gcloud Storage (via loading of credentials in json file): + > l21:main.py: `os.environ["GOOGLE_APPLICATION_CREDENTIALS"] = str( + Path(__file__).parent.joinpath("service-key.json") +)` +1. Postgres resource available to connect (code in `config.py`) +2. Must be able to make external requests to The Graph network api (used for validation and identifying indexers tied to a dispute) +3. (FUTURE) access to serices for running predictive analytics and metrics monitoring. + + + +Steps to run locally: +--- + +1. Setup the database: + + > `createdb dispute_service` \ + `create user dispute_arbitrator`\ + `GRANT ALL PRIVILEGES ON dispute_service TO dispute_arbitrator` + +1. Install `poetry` + +> `curl -sSL https://raw.githubusercontent.com/python-poetry/poetry/master/get-poetry.py | python -` + +2. Install packages with poetry +> `poetry install` + +3. Run application. +> `poetry run uvicorn api.asgi:app --reload` + +\ +Adding routes/models +--- + +When adding a model, add the containing module to the `pyproject.toml` underneath: + +> `[tool.poetry.plugins."api.modules"]`\ +`module = "api.{PATH_TO_MODULE}"` + +\ +Building migrations +--- + +>`poetry install`\ +`poetry run alembic revision --autogenerate -m '{COMMENT}'`\ +`poetry run alembic upgrade head` + + diff --git a/server/alembic.ini b/server/alembic.ini new file mode 100644 index 0000000..b103308 --- /dev/null +++ b/server/alembic.ini @@ -0,0 +1,89 @@ +# A generic, single database configuration. + +[alembic] +# path to migration scripts +script_location = migrations + +# template used to generate migration files +# file_template = %%(rev)s_%%(slug)s + +# sys.path path, will be prepended to sys.path if present. +# defaults to the current working directory. +prepend_sys_path = . + +# timezone to use when rendering the date +# within the migration file as well as the filename. +# string value is passed to dateutil.tz.gettz() +# leave blank for localtime +# timezone = + +# max length of characters to apply to the +# "slug" field +# truncate_slug_length = 40 + +# set to 'true' to run the environment during +# the 'revision' command, regardless of autogenerate +# revision_environment = false + +# set to 'true' to allow .pyc and .pyo files without +# a source .py file to be detected as revisions in the +# versions/ directory +# sourceless = false + +# version location specification; this defaults +# to migrations/versions. When using multiple version +# directories, initial revisions must be specified with --version-path +# version_locations = %(here)s/bar %(here)s/bat migrations/versions + +# the output encoding used when revision files +# are written from script.py.mako +# output_encoding = utf-8 + +sqlalchemy.url = driver://user:pass@localhost/dbname + + +[post_write_hooks] +# post_write_hooks defines scripts or Python functions that are run +# on newly generated revision scripts. See the documentation for further +# detail and examples + +# format using "black" - use the console_scripts runner, against the "black" entrypoint +# hooks = black +# black.type = console_scripts +# black.entrypoint = black +# black.options = -l 79 REVISION_SCRIPT_FILENAME + +# Logging configuration +[loggers] +keys = root,sqlalchemy,alembic + +[handlers] +keys = console + +[formatters] +keys = generic + +[logger_root] +level = WARN +handlers = console +qualname = + +[logger_sqlalchemy] +level = WARN +handlers = +qualname = sqlalchemy.engine + +[logger_alembic] +level = INFO +handlers = +qualname = alembic + +[handler_console] +class = StreamHandler +args = (sys.stderr,) +level = NOTSET +formatter = generic + +[formatter_generic] +format = %(levelname)-5.5s [%(name)s] %(message)s +datefmt = %H:%M:%S diff --git a/server/api/__init__.py b/server/api/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/server/api/analysis/README.md b/server/api/analysis/README.md new file mode 100644 index 0000000..31bc89e --- /dev/null +++ b/server/api/analysis/README.md @@ -0,0 +1,7 @@ +# Calculating divergent blocks and interacting with Gcloud Storage. + + +**Potential alternatives:** + + * Have indexers forward their data into something like Snowflake through the service as a proxy. + * Have triggers in the DB to generate reports (Still requires an element of EDA, so that doesn't seem feasible until there's a cut and dry path forward.) \ No newline at end of file diff --git a/server/api/analysis/__init__.py b/server/api/analysis/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/server/api/analysis/calculate_divergent_block.py b/server/api/analysis/calculate_divergent_block.py new file mode 100644 index 0000000..fe203b8 --- /dev/null +++ b/server/api/analysis/calculate_divergent_block.py @@ -0,0 +1,177 @@ +import itertools +import pandas as pd +import tensorflow as tf +from typing import List +from functools import reduce +from psycopg2.extras import NumericRange +from tensorflow.python.lib.io import file_io + +import ipdb + +def read_csv_file(filename): + """ + This breaks if the directory strutcture changes at all. + + To fix this, make the directory structure more explanatory or + IDEALLY make a query to the database for a path to get its indexer. + + ### @TODO: MAKE getting the indexer name a database query + """ + + indexer_name = filename.split("/")[-2] + with file_io.FileIO(filename, "rb") as f: + df = pd.read_csv(f, compression="zip", encoding="utf-8", sep="\t") + df = df.rename( + columns={"digest": indexer_name} + ) # used to track the indexer pairs + return df + + +def read_csv_files(filename_pattern): + filenames = tf.io.gfile.glob(filename_pattern) + dataframes = [read_csv_file(filename) for filename in filenames] + return dataframes + + +def poi_tables_to_dfs(dispute_id: str) -> List[pd.DataFrame]: + """ + Read indexer poi files into a list of dataframes + + Methods: + * Blocking: Pandas read_csv. + + As of version 0.24 of pandas, read_csv supports reading directly from + Google Cloud Storage. Simply provide link to the bucket like this: + + df = pd.read_csv('gs://bucket/path.csv') + + * Blocking: Tensorflow FileIO. + + DATADIR='gs://my-bucket/some/dir' + + poidf = read_csv_files(os.path.join(DATADIR, 'poi*')) + + * ASYNC: Pull files locally into a buffer and read into pandas. + + Using #2 + + ## @TODO: + Make this path not so hardcoded? maybe always create a poi directory? + Concern here is if there are entity tables uploaded which contain the word poi + """ + + poi_dfs = read_csv_files("gs://poi-disputes/{}/*/poi*.zip*".format(dispute_id)) + return poi_dfs + + +def map_block_range_to_lower(block_range: NumericRange): + """ + All entries have a block range. If pulling from SQL, this will get the + start of the range. + """ + return block_range.lower + + +def convert_df_range(table_df: pd.DataFrame): + """ + Taking the first index will get the lower part of the range + + Block ranges serialized into csvs are just strings formatted like [x,y) + y could potentially be None type. + """ + table_df["block_source"] = table_df["block_range"].map( + lambda x: int(x.split(",")[0][1:]) + ) + return table_df + + +def dfs_to_divergent_blocks(dfs: List[pd.DataFrame]) -> pd.DataFrame: + """ + Generate divergent block table + + Returns a pd.DataFrame of the format: + + | comparison | divergent_block | + |--------------------|-----------------| + | indexer1_indexer2 | 10120231312 | + | indexer1_indexer3 | 10212313141 | + | indexer_2_indexer3 | 49495212 | + + """ + ranged_dfs = [convert_df_range(x) for x in dfs] + poi_compare = reduce( + lambda left, right: pd.merge( + left, right, on="block_source", suffixes=("_left", "_right") + ), + ranged_dfs, + ) + + poi_compare = poi_compare.drop( + [ + "vid", + "vid_left", + "vid_right", + "id", + "id_left", + "id_right", + "block_range_left", + "block_range_right", + ], + axis=1, + errors="ignore", + ) + digest_columns = filter( + lambda c: (c.__contains__("block") == False), poi_compare.columns + ) + + for pair in itertools.combinations(digest_columns, 2): + column_name = pair[0] + "_" + pair[1] + poi_compare[column_name] = poi_compare[pair[0]] == poi_compare[pair[1]] + poi_compare[column_name + "_numeric"] = poi_compare[column_name].apply( + lambda x: 1 if x else -1 + ) + + numeric_df_columns = list( + filter(lambda c: c.__contains__("numeric"), poi_compare.columns) + ) + numeric_df_columns.append("block_source") + poi_compare_numeric = poi_compare[numeric_df_columns] + poi_compare_numeric.columns = poi_compare_numeric.columns.str.replace( + "_numeric", "" + ) + + compare_columns = list( + filter( + lambda c: (c.__contains__("block") == False), poi_compare_numeric.columns + ) + ) + divergent_blocks = pd.DataFrame(columns=["comparison", "divergent_block"]) + + for column in compare_columns: + index = (poi_compare_numeric[column].values == -1).argmax() + divergent_blocks = divergent_blocks.append( + { + "comparison": column, + # 'subgraph': subgraph_id, + "divergent_block": poi_compare.iloc[index]["block_source"], + }, + ignore_index=True, + ) + return divergent_blocks + + +def generate_indexer_pair(df: pd.DataFrame) -> pd.DataFrame: + df["indexer_id_1"] = df["comparison"].map(lambda x: x.split("_")[0]) + df["indexer_id_2"] = df["comparison"].map(lambda x: x.split("_")[-1]) + df["divergent_blocks"] = df["divergent_block"].map(lambda x: [x]) + df = df.drop(["comparison", "divergent_block"], axis=1) + + return df + + +def calculate_divergent_blocks(dispute_id: str) -> pd.DataFrame: + poi_dfs = poi_tables_to_dfs(dispute_id=dispute_id) + divergent_blocks = dfs_to_divergent_blocks(poi_dfs) + + divergent_blocks = generate_indexer_pair(divergent_blocks) + return divergent_blocks diff --git a/server/api/analysis/diff.py b/server/api/analysis/diff.py new file mode 100644 index 0000000..a18d1f5 --- /dev/null +++ b/server/api/analysis/diff.py @@ -0,0 +1,33 @@ +# Automated diffing of entity and call cache data found in a dispute +from typing import Dict, List +from zipfile import ZipFile +import pandas as pd + +""" +0. Gather all of the dataframes for a dispute. +1. Congeal the dataframes into a comaprable collection. +2. Compare all dataframes of a certain type. +3. Auto-diff items in the dataframes + +""" + +def get_indexer_from_path(path) -> str: + return "indexer" + +def read_zipped(path) -> Dict[str,pd.DataFrame]: + """ + Takes a zip directory of an indexer and maps it to all of the underlying dataframes + + file_name --> DataFrame + """ + zf = ZipFile(path) + dfs = {text_file.filename.split('/')[-1]: pd.read_csv(zf.open(text_file.filename),sep='\t')for text_file \ + in zf.infolist() if text_file.filename.endswith('.tsv')} + indexer = get_indexer_from_path(path) + + indexer_df = {'indexer':indexer, 'tables': dfs} + return indexer_df + + +def aggregate_dataframes(dataframe_maps: List[Dict[str,pd.DataFrame]]) -> List[List[pd.DataFrame]]: + pass \ No newline at end of file diff --git a/server/api/asgi.py b/server/api/asgi.py new file mode 100644 index 0000000..6da3155 --- /dev/null +++ b/server/api/asgi.py @@ -0,0 +1,3 @@ +from .main import get_app + +app = get_app() \ No newline at end of file diff --git a/server/api/config.py b/server/api/config.py new file mode 100644 index 0000000..275ffa7 --- /dev/null +++ b/server/api/config.py @@ -0,0 +1,46 @@ +import os +from sqlalchemy.engine.url import URL, make_url +from starlette.config import Config +from starlette.datastructures import Secret + +from pathlib import Path + +FASTAPI_DEPLOYMENT = os.getenv("FASTAPI_DEPLOYMENT") + +if FASTAPI_DEPLOYMENT == "production": + environment_path = Path.joinpath(Path(__file__).parent, ".env.prod") +elif FASTAPI_DEPLOYMENT == "dev": + environment_path = Path.joinpath(Path(__file__).parent, ".env") +else: + environment_path = "" + +config = Config(environment_path) + + +DB_DRIVER = config("DB_DRIVER", default="postgresql") +DB_HOST = config("DB_HOST", default="127.0.0.1") +DB_PORT = config("DB_PORT", cast=int, default=5432) +DB_USER = config("DB_USER", default=None) +DB_PASSWORD = config("DB_PASS", cast=Secret, default="") +DB_DATABASE = config("DB_NAME", default=None) +DB_DSN = config( + "DB_DSN", + cast=make_url, + default=URL( + drivername=DB_DRIVER, + username=DB_USER, + password=DB_PASSWORD, + host=DB_HOST, + port=DB_PORT, + database=DB_DATABASE, + ), +) +DB_POOL_MIN_SIZE = config("DB_POOL_MIN_SIZE", cast=int, default=1) +DB_POOL_MAX_SIZE = config("DB_POOL_MAX_SIZE", cast=int, default=10) +DB_ECHO = config("DB_ECHO", cast=bool, default=False) +DB_SSL = config("DB_SSL", default=None) +DB_USE_CONNECTION_FOR_REQUEST = config( + "DB_USE_CONNECTION_FOR_REQUEST", cast=bool, default=True +) +DB_RETRY_LIMIT = config("DB_RETRY_LIMIT", cast=int, default=1) +DB_RETRY_INTERVAL = config("DB_RETRY_INTERVAL", cast=int, default=1) diff --git a/server/api/dispute/README.md b/server/api/dispute/README.md new file mode 100644 index 0000000..0282b9e --- /dev/null +++ b/server/api/dispute/README.md @@ -0,0 +1,15 @@ +## Process workflow of running through a dispute. +\ + Web3 client + -- + * Not asynchronous until `await_only` is implemented + * Gathering matching events can take a long time \ + * **TODO:** need to determine the best way of constructing the web3/ipfs client. Long lived and passed around or spawned on new function calls? + + +FSM +--- +* Not currently using callbacks in the transitions package. +* Should probably remove this and just make everything depend on capturing state from the DB prior to each function invocation + + diff --git a/server/api/dispute/__init__.py b/server/api/dispute/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/server/api/dispute/fsm.py b/server/api/dispute/fsm.py new file mode 100644 index 0000000..5df6e7f --- /dev/null +++ b/server/api/dispute/fsm.py @@ -0,0 +1,323 @@ +import logging +import pandas as pd +from typing import Optional +from sqlalchemy import and_ +from transitions import Machine + +from ..graphql import get_subgraph_deployment_id_from_dispute +from ..models import db +from ..models.disputes import Dispute, DisputeStage +from ..models.divergent_blocks import DivergentBlocks +from ..models.indexer_uploads import IndexerUploads, DataKindEnum +from ..storage.gcloud import upload_file, POI_BUCKET_NAME +from .w3 import ( + get_matching_events, + get_subgraph_data_sources, + get_subgraph_manifest, +) +from ..analysis.calculate_divergent_block import calculate_divergent_blocks + +logger = logging.getLogger(__name__) + + +async def create_resolver(dispute_id, indexer_id): + """ + Async helper function allows for construction to depend on a database query. + """ + resolver = DisputeResolver(dispute_id, indexer_id) + await resolver._init() + return resolver + + +class DisputeResolver(object): + """ + Dispute resolver is a finite state machine that gets sent events which will trigger functions + for resolving a dispute. + + As it progresses through a dispute it will intermittently alter relevant state + in the database. + """ + + # Define some states. Most of the time, narcoleptic superheroes are just like + # everyone else. Except for... + states = [ + "waiting_for_poi", + "acquired_poi", + "generated_divergent_blocks", + "arbitrating", + "dispute_settled", + ] + + def __init__(self, dispute_id, indexer_id): + self.dispute_id = dispute_id + self.indexer_id = indexer_id + + self.number_of_indexers = 0 + + async def _init(self): + state = await self.get_stage() + self.state = state + if not state or state == "dispute_settled": + # The dispute is inactive. Can't do anything. + return None + self.machine = Machine(model=self, states=DisputeResolver.states, initial=state) + + # An indexer has supplied us with their poi. We wait for all of the indexers + # Or until we decide it's time to move on + + self.machine.add_transition( + trigger="added_poi", + source="waiting_for_poi", + dest="waiting_for_poi", + after="indexer_add_poi", + ) + + # Once all indexers have been accounted for, we can move onto the process of generating divergent blocks + self.machine.add_transition( + "all_poi_upload", "waiting_for_poi", "generated_divergent_blocks" + ) + + # All indexers need to upload data around the divergent block + self.machine.add_transition( + "add_entities_callcache", + "generated_divergent_blocks", + "generated_divergent_blocks", + after="indexer_add_entities", + ) + + # Notify an arbitrator onnce all of the jury dutied indexers + # have supplied their entities + self.machine.add_transition( + "received_all_entities", + "generated_divergent_blocks", + "arbitrating", + after="notify_arbitrator", + ) + + # Mark the dispute as settled. + self.machine.add_transition( + "done", "arbitrating", "dispute_settled", after="dispute_settled" + ) + + async def get_stage(self): + current_stage = ( + await Dispute.select("dispute_stage") + .where(Dispute.dispute_id == self.dispute_id) + .gino.scalar() + ) + return current_stage + + async def indexer_in_dispute(self): + """ + Check that this indexer should even be contributing to the dispute. + """ + is_implicated = await Dispute.query.where( + and_( + Dispute.dispute_id == self.dispute_id, + Dispute.indexer_ids.contains([self.indexer_id]), + ) + ).gino.all() + return len(is_implicated) > 0 + + async def indexer_add_poi(self, content, file_name): + """ + Keep a tally of the progress of each indexer's POI on the dispute. + + Does three things given the file data from the poi: + + 0. Check that this upload is even necessary + 1. Upload the data to a persistent data storage + -GCS + 2. Note the upload path in postgres for the given indexer + + Potential Errors: + - No currently active dispute for indexer. + - Failure to save to cloud object store + - Failure to insert path into the database + + + """ + + # Check that this indexer is implicated in the dispute + is_implicated = await self.indexer_in_dispute() + + if not is_implicated: + raise Exception("You aren't able to contribute to this dispute") + + # Push the file contents to object storage. + status, object_path = await upload_file( + file_data=content, + object_name=file_name, + indexer_node=self.indexer_id, + dispute_hash=self.dispute_id, + ) + + # Push the filepath to database + push_to_db = await IndexerUploads.create( + dispute_id=self.dispute_id, + indexer_id=self.indexer_id, + data_path=object_path, + data_kind_enum=DataKindEnum.poi, + ) + return object_path + + async def generate_divergent_blocks(self) -> Optional[pd.DataFrame]: + """ + Create divergent block entries and update the dispute state + """ + # ensure this is the right stage + + stage = ( + await Dispute.select("dispute_stage") + .where(Dispute.dispute_id == self.dispute_id) + .gino.scalar() + ) + + # Todo: Make the individual states have their own error messaging + if stage not in [DisputeStage.generated_divergent_blocks, DisputeStage.acquired_poi]: + return None + + + divergent_blocks = calculate_divergent_blocks(self.dispute_id) + + async with db.transaction(isolation="serializable") as tx_root: + + conn = tx_root.connection + tx = await conn.transaction() + try: + create_blocks = await DivergentBlocks.bulk_upsert( + divergent_blocks=divergent_blocks, dispute_id=self.dispute_id + ) + + # Don't need this roundabout + dispute = await Dispute.query.where( + Dispute.dispute_id == self.dispute_id + ).gino.first() + + dispute = await dispute.update( + dispute_stage=DisputeStage.generated_divergent_blocks + ).apply() + + await tx.commit() + except: + await tx.rollback() + return None + + return divergent_blocks + + async def generate_matching_events(self): + """ + Gathers divergent blocks and uses them to generate a set of + matching events against an ethereum node which are stashed in GCS. + """ + # Returns int8[] + divergent_blocks = ( + await DivergentBlocks.select("divergent_blocks") + .where(DivergentBlocks.dispute_id == self.dispute_id) + .gino.all() + ) + all_blocks = [] + + for divergent_set in divergent_blocks: + all_blocks.extend(divergent_set.values()[0]) + unique_blocks = list(set(all_blocks)) + + subgraph_id = ( + await Dispute.select("subgraph_id") + .where(Dispute.dispute_id == self.dispute_id) + .gino.scalar() + ) + + if not subgraph_id: + # It wasn't included in the upload somehow. Use the dispute id to graph it. + subgraph_id = get_subgraph_deployment_id_from_dispute(self.dispute_id) + + if not subgraph_id: + raise Exception("Can't find the subgraph") + + manifest = get_subgraph_manifest(subgraph_id) + data_sources = get_subgraph_data_sources(manifest) + matching_events = get_matching_events(data_sources, unique_blocks) + # upload_result = await stream_dataframe_to_gcs(matching_events, self.dispute_id) + try: + # Lazily depending on pandas gcsfs api. Could do a streaming upload. + matching_events.to_csv( + "gs://{}/{}/matching_events.csv".format( + POI_BUCKET_NAME, self.dispute_id + ) + ) + return matching_events + except Exception as e: + logger.error("Can't upload matching events to GCS") + raise e + + async def indexer_add_entities(self, content, file_name): + """Keep a tally of the progress of each indexer's subgraph entities on the dispute""" + is_implicated = await self.indexer_in_dispute() + + if not is_implicated: + raise Exception("You aren't able to contribute to this dispute") + + state = await self.get_stage() + if not state: + raise Exception("Dispute does not exist") + + if state != DisputeStage.generated_divergent_blocks: + # The dispute is inactive. Can't do anything. + raise Exception("Dispute is not currently accepting entities") + + # Push the file contents to object storage. + status, object_path = await upload_file( + file_data=content, + object_name=file_name, + indexer_node=self.indexer_id, + dispute_hash=self.dispute_id, + ) + + # Push the filepath to database + push_to_db = await IndexerUploads.create( + dispute_id=self.dispute_id, + indexer_id=self.indexer_id, + data_path=object_path, + data_kind_enum=DataKindEnum.entities, + ) + return object_path + + async def indexer_add_metdata(self, content, file_name): + """Keep configuration and environment variables persisted to determine root causes""" + is_implicated = await self.indexer_in_dispute() + + if not is_implicated: + raise Exception("You aren't able to contribute to this dispute") + + # Push the file contents to object storage. + status, object_path = await upload_file( + file_data=content, + object_name="metadata.json", + indexer_node=self.indexer_id, + dispute_hash=self.dispute_id, + ) + + # Push the filepath to database + push_to_db = await IndexerUploads.create( + dispute_id=self.dispute_id, + indexer_id=self.indexer_id, + data_path=object_path, + data_kind_enum=DataKindEnum.metadata, + ) + return object_path + + async def notify_arbitrator(self): + """Send an email/slack or some notification to E&N""" + pass + + async def dispute_settled(self): + """Modify state of the dispute""" + pass + + @property + def has_quorom(self): + """ + Determine the number of indexers required to start the dispute process. + """ + return True diff --git a/server/api/dispute/w3.py b/server/api/dispute/w3.py new file mode 100644 index 0000000..da62747 --- /dev/null +++ b/server/api/dispute/w3.py @@ -0,0 +1,190 @@ +# Everything in here should probably be run as daemon processes with first class support for web3/ipfs. +import sys +import yaml +import aiohttp +import logging +import greenlet +import pandas as pd +import ipfshttpclient + +from typing import Any +from eth_typing import URI + +from web3 import Web3 +from web3.types import RPCEndpoint, RPCResponse + + +# Inline this. can't shade versions of sqlalchemy +# from sqlalchemy.util.concurrency import await_only + +logger = logging.getLogger(__name__) + +# Client will be shared. +ipfs = ipfshttpclient.connect("/dns/ipfs.infura.io/tcp/5001/https") + + +class AsyncIoGreenlet(greenlet.greenlet): + def __init__(self, driver, fn): + greenlet.greenlet.__init__(self, fn, driver) + self.driver = driver + + +async def green_spawn(fn, *args, **kwargs): + context = AsyncIoGreenlet(greenlet.getcurrent(), fn) + + result = context.switch(*args, **kwargs) + + while context: + try: + value = await result + except: + result = context.throw(*sys.exc_info()) + else: + result = context.switch(value) + + return result + + +def green_await(awaitable): + current = greenlet.getcurrent() + if not isinstance(current, AsyncIoGreenlet): + raise TypeError("Cannot use green_await outside of green_spawn target") + return current.driver.switch(awaitable) + + +async def make_post_request( + endpoint_uri: URI, data: bytes, *args: Any, **kwargs: Any +) -> bytes: + kwargs.setdefault("timeout", 10) + async with aiohttp.ClientSession() as client: + response = await client.post(endpoint_uri, data=data, *args, **kwargs) # type: ignore + response.raise_for_status() + return await response.content.read() + + +# IMPLEMENT `await_only` +# class AIOHTTPProvider(Web3.HTTPProvider): +# def make_request(self, method: RPCEndpoint, params: Any) -> RPCResponse: +# self.logger.debug( +# "Making request HTTP. URI: %s, Method: %s", self.endpoint_uri, method +# ) +# request_data = self.encode_rpc_request(method, params) +# raw_response = await_only( +# make_post_request( +# self.endpoint_uri, request_data, **self.get_request_kwargs() +# ) +# ) +# response = self.decode_rpc_response(raw_response) +# self.logger.debug( +# "Getting response HTTP. URI: %s, " "Method: %s, Response: %s", +# self.endpoint_uri, +# method, +# response, +# ) +# return response + + +##Make these environment variables +ETHEREUM_API_URL = ( + "https://eth-mainnet.alchemyapi.io/v2/mWSH9YlhpXfXymzLxptC1TE2CIy2QuMA" +) + +w3 = Web3(Web3.HTTPProvider(ETHEREUM_API_URL)) + +# w3 = Web3(AIOHTTPProvider(ETHEREUM_API_URL)) + + +class DataSource: + def __init__(self, address, abi_name, abi, events): + self.abi_name = abi_name + self.abi = abi + self.address = address + self.events = events + + +def getSource(data_source): + address = data_source["source"]["address"] + abi_name = data_source["source"]["abi"] + abi_location = list( + filter(lambda abi: abi["name"] == abi_name, data_source["mapping"]["abis"]) + )[0]["file"]["/"] + abi = ipfs.cat(abi_location) + events = data_source["mapping"]["eventHandlers"] + return DataSource(address, abi_name, abi, events) + + +def get_matching_events(datasources, divergent_blocks): + matching_events = pd.DataFrame( + columns=[ + "address", + "block", + "event", + "subgraph_events", + "handlers", + "log_params", + ] + ) + for source in datasources: + address = w3.toChecksumAddress(source.address) + contract_abi = source.abi.decode("utf-8") + contract = w3.eth.contract(address=address, abi=contract_abi) + for block in divergent_blocks: + logs_filter_params = { + "fromBlock": block, + "toBlock": block, + "address": address, + } + logs_filter = w3.eth.filter(logs_filter_params) + logs = w3.eth.get_filter_logs(logs_filter.filter_id) + for log in logs: + for contract_event in contract.events: + subgraph_events = list( + filter( + lambda e: e["event"].split("(")[0] + == contract_event.event_name, + source.events, + ) + ) + handlers = [ + subgraph_event["handler"] for subgraph_event in subgraph_events + ] + if len(subgraph_events) > 0: + tx_receipt = w3.eth.get_transaction_receipt(log.transactionHash) + decoded_logs = contract_event().processReceipt(tx_receipt) + for decoded_log in decoded_logs: + matching_events = matching_events.append( + { + "address": address, + "block": block, + "event": contract_event.event_name, + "subgraph_events": subgraph_events, + "handlers": handlers, + "log_params": dict(decoded_log.args), + }, + ignore_index=True, + ) + return matching_events + + +# async def get_matching_events_async(datasources, divergent_blocks) -> pd.DataFrame: +# matching_events = await green_spawn( +# get_matching_events_async(datasources, divergent_blocks) +# ) +# return matching_events + + +def get_subgraph_manifest(subgraph_id: str): + manifest = yaml.safe_load(ipfs.cat(subgraph_id)) + return manifest + + +def get_subgraph_data_sources(manifest): + data_sources = list(map(getSource, manifest["dataSources"])) + return data_sources + + +def genereate_unique_events(matching_events: pd.DataFrame): + unique_event_signatures = matching_events.drop_duplicates( + subset=["block", "address", "event"] + ).drop(["log_params", "subgraph_events"], axis=1) + return unique_event_signatures diff --git a/server/api/graphql/README.md b/server/api/graphql/README.md new file mode 100644 index 0000000..7cb63d6 --- /dev/null +++ b/server/api/graphql/README.md @@ -0,0 +1,10 @@ +# GraphQL requests against the network subgraph. + +Requests in this module are used to enrich disputes and validate data provided by indexers: + + 1. Ensure that the poi an indexer is supplying for a dispute matches what is on chain. + 2. Verify that the entities an indexer supplies can be hashed to a public poi + +Caveats: +* May need to submit API calls with the signature of an indexers wallet to prove veracity of uploaded data +* Current GQL client is blocking. Refactor to use an `asyncio` implementation. \ No newline at end of file diff --git a/server/api/graphql/__init__.py b/server/api/graphql/__init__.py new file mode 100644 index 0000000..dbdfb99 --- /dev/null +++ b/server/api/graphql/__init__.py @@ -0,0 +1,186 @@ +##Endpoint for gql queries about the status of the network +from typing import List +from gql import Client, gql +from gql.transport.requests import RequestsHTTPTransport + +# Does the graphql endpoint limit responses to 100 entities? +NETWORK_SUBGRAPH = ( + "https://api.thegraph.com/subgraphs/name/graphprotocol/graph-network-mainnet" +) + +# sync_transport = RequestsHTTPTransport( +# url=NETWORK_SUBGRAPH, +# verify=False, +# retries=3, +# ) + +# Make it so this gets instantiated in the function call and passed as a parameter. +# client = Client( +# transport=sync_transport, +# fetch_schema_from_transport=True, +# ) + +EXAMPLE_DISPUTE_ID = ( + "0x08e959b7cf82f4935a5063721d7b7a01a0b33ebf0c8056b4d7ce4d126e7049a3" +) +EXAMPLE_SUBGRAPH_ID = ( + "0x500a8e47cbdeca7386448ae9e7d52578871b9942ebbef4892469da293bb661f9" +) + +GATHER_DISPUTE_QUERY = gql( + """ + query($dispute_id: ID!){ + dispute(id:$dispute_id) { + id + createdAt + status + type + subgraphDeployment{ + id + indexerAllocations{ + indexer{ + id + } + } + } + indexer{ + id + balance + curationApproval + stakingApproval + names{ + id + name + nameSystem + } + createdAt + operatorOf{ + id + names{ + id + name + nameSystem + } + } + operators{ + id + names{ + id + name + nameSystem + } + } + } + }} +""" +) + + +def get_dispute_from_id(client, dispute_id: str) -> dict: + """ + Query against network subgraph to get information about a dispute + """ + params = {"dispute_id": dispute_id} + disp = client.execute(GATHER_DISPUTE_QUERY, variable_values=params) + return disp + + +def get_subgraph_deployment_id_from_dispute(dispute_id): + sync_transport = RequestsHTTPTransport( + url=NETWORK_SUBGRAPH, + verify=False, + retries=3, + ) + + client = Client( + transport=sync_transport, + fetch_schema_from_transport=True, + ) + + dispute_dictionary = get_dispute_from_id(client, dispute_id) + dispute = dispute_dictionary.get("dispute", {}) + if not dispute: + return "" + subgraph_id = dispute.get("subgraphDeployment", "").get("id", "") + return subgraph_id + + +GATHER_INDEXERS_FOR_SUBGRAPH_QUERY = gql( + """ + query($subgraph_deployment_id: ID!){ + subgraphDeployment(id:$subgraph_deployment_id) { + id + ipfsHash + indexerAllocations{ + id + indexer{ + id + geoHash + defaultDisplayName + account{ + id + names{ + id + name + nameSystem + } + } + } + allocatedTokens + createdAtBlockNumber + closedAtEpoch + closedAtBlockNumber + poi + } + } + } + """ +) + + +def get_subgraph_deployment(subgraph_deployment: str): + """ + Make a call against the network subgraph for data pertinent to a subgraph deployment. + """ + sync_transport = RequestsHTTPTransport( + url=NETWORK_SUBGRAPH, + verify=False, + retries=3, + ) + + client = Client( + transport=sync_transport, + fetch_schema_from_transport=True, + ) + params = {"subgraph_deployment_id": subgraph_deployment} + subgraph_deployment = client.execute( + GATHER_INDEXERS_FOR_SUBGRAPH_QUERY, variable_values=params + ) + return subgraph_deployment + + +def get_indexers_from_subgraph_deployment(subgraph_deployment: dict) -> List[str]: + """ + Gets all unique indexers that have made an allocation on a subgraph deployment. + + Idea is that these entities will have the relevant data to settle an arbitration. + + CAVEAT: + * Are these indexers all still relevant? + * Can we filter on recency of the allocation + in regards to the dispute? + * Do we want to consider ancillary data, like the indexer stake etc. in the dispute + arbitration process? (Could be a way to generate a "reference" indexer through some + mechanism of weighing influence) + """ + subgraph_dict = subgraph_deployment.get("subgraphDeployment", {}) + if not subgraph_dict: + return [] + indexer_allocations = subgraph_dict.get("indexerAllocations", {}) + if not indexer_allocations: + return [] + + indexer_ids = [ + allocation.get("indexer").get("id") for allocation in indexer_allocations + ] + return list(set(indexer_ids)) diff --git a/server/api/logging.conf b/server/api/logging.conf new file mode 100644 index 0000000..d5998b3 --- /dev/null +++ b/server/api/logging.conf @@ -0,0 +1,42 @@ +[loggers] +keys=root,uicheckapp + +[handlers] +keys=consoleHandler,detailedConsoleHandler + +[formatters] +keys=normalFormatter,detailedFormatter + +[logger_root] +level=INFO +handlers=consoleHandler + +[logger_uicheckapp] +level=DEBUG +handlers=detailedConsoleHandler +qualname=uicheckapp +propagate=0 + +[handler_consoleHandler] +class=StreamHandler +level=DEBUG +formatter=normalFormatter +args=(sys.stdout,) + +[handler_detailedConsoleHandler] +class=StreamHandler +level=DEBUG +formatter=detailedFormatter +args=(sys.stdout,) + +[handler_fileHandler] +class=FileHandler +level=DEBUG +formatter=fileFormatter +args=('%(logfilename)s','w') + +[formatter_normalFormatter] +format=%(asctime)s loglevel=%(levelname)-6s logger=%(name)s %(funcName)s() L%(lineno)-4d %(message)s + +[formatter_detailedFormatter] +format=%(asctime)s loglevel=%(levelname)-6s logger=%(name)s %(funcName)s() L%(lineno)-4d %(message)s call_trace=%(pathname)s L%(lineno)-4d \ No newline at end of file diff --git a/server/api/main.py b/server/api/main.py new file mode 100644 index 0000000..7f8e44f --- /dev/null +++ b/server/api/main.py @@ -0,0 +1,92 @@ +import os +import time +import string +import random +import logging +from pathlib import Path +from importlib.metadata import entry_points +from starlette.middleware import Middleware +from starlette.requests import Request + + +from starlette_context import context, plugins +from starlette_context.middleware import ContextMiddleware +from fastapi.middleware.cors import CORSMiddleware + +from fastapi import FastAPI +from .models import db + +from os import path + +origins = ["*"] + + +# Make this available to the gcloud sdk +os.environ["GOOGLE_APPLICATION_CREDENTIALS"] = str( + Path(__file__).parent.joinpath("service-key.json") +) + +log_file_path = path.join(path.dirname(path.abspath(__file__)), "logging.conf") +logging.config.fileConfig( + log_file_path, + disable_existing_loggers=False, +) +logger = logging.getLogger(__name__) + + +middleware = [ + Middleware( + ContextMiddleware, + plugins=(plugins.RequestIdPlugin(), plugins.CorrelationIdPlugin()), + ) +] + + +def load_modules(app=None): + for ep in entry_points()["api.modules"]: + logger.info("Loading module: %s", ep.name) + mod = ep.load() + if app: + init_app = getattr(mod, "init_app", None) + if init_app: + init_app(app) + + +def get_app(): + app = FastAPI(title="Dispute service", middleware=middleware) + + @app.middleware("http") + async def log_requests(request: Request, call_next): + """ + Logs every request and returns the time it took to run + """ + random_request_id = "".join( + random.choices(string.ascii_uppercase + string.digits, k=6) + ) + logger.info( + f"request_id={random_request_id} start request path={request.url.path}" + ) + start_time = time.time() + + # ipdb.set_trace() + response = await call_next(request) + + process_time = (time.time() - start_time) * 1000 + formatted_process_time = "{0:.2f}".format(process_time) + logger.info( + f"request_id={random_request_id} completed_in={formatted_process_time}ms status_code={response.status_code}" + ) + + return response + + app.add_middleware( + CORSMiddleware, + allow_origins=origins, + allow_credentials=True, + allow_methods=["*"], + allow_headers=["*"], + ) + + db.init_app(app) + load_modules(app) + return app diff --git a/server/api/models/README.md b/server/api/models/README.md new file mode 100644 index 0000000..e69de29 diff --git a/server/api/models/__init__.py b/server/api/models/__init__.py new file mode 100644 index 0000000..c024483 --- /dev/null +++ b/server/api/models/__init__.py @@ -0,0 +1,13 @@ +from gino_starlette import Gino +from .. import config + +db = Gino( + dsn=config.DB_DSN, + pool_min_size=config.DB_POOL_MIN_SIZE, + pool_max_size=config.DB_POOL_MAX_SIZE, + echo=config.DB_ECHO, + ssl=config.DB_SSL, + use_connection_for_request=config.DB_USE_CONNECTION_FOR_REQUEST, + retry_limit=config.DB_RETRY_LIMIT, + retry_interval=config.DB_RETRY_INTERVAL, +) diff --git a/server/api/models/disputes.py b/server/api/models/disputes.py new file mode 100644 index 0000000..6cc1787 --- /dev/null +++ b/server/api/models/disputes.py @@ -0,0 +1,65 @@ +import enum +import datetime +from fastapi import HTTPException +from sqlalchemy import * +from sqlalchemy.dialects.postgresql import ARRAY, JSONB, insert + +from . import db +from .indexer_uploads import IndexerUploads + + +class DisputeStage(enum.Enum): + waiting_for_poi = 1 + acquired_poi = 2 + generated_divergent_blocks = 3 + arbitrating = 4 + dispute_settled = 5 + + +class Dispute(db.Model): + """ + Track open disputes and link them to the indexers who can help resolve it. + """ + + __tablename__ = "disputes" + id = db.Sequence("dispute_id_seq", start=0, increment=1) + dispute_id = db.Column(db.String(), primary_key=True) + ##All indexers implicated in the dispute + indexer_ids = db.Column("indexer_ids", ARRAY(String)) + # stage = db.Column(db.String(), nullable=True, default="waiting_for_poi") + dispute_stage = Column( + Enum(DisputeStage), + nullable=True, + default=DisputeStage.waiting_for_poi, + ) + subgraph_id = db.Column(db.String(), nullable=True) + ##Store things like the divergent ids, or any extra data + metadata = db.Column("metadata", JSONB, nullable=True) + updated_at = db.Column(db.DateTime, default=datetime.datetime.utcnow) + + @classmethod + def upsert_dispute(cls, dispute): + qs = insert(cls.__table__).values(dispute.to_dict()) + ##merge and deduplicate + return ( + qs.on_conflict_do_update( + index_elements=[cls.dispute_id], + set_={ + "updated_at": datetime.datetime.utcnow(), + "indexer_ids": dispute.indexer_ids, + }, # or even qs.excluded['some_column'] + ) + .returning(Dispute.__table__) + .gino.scalar() + ) + + @classmethod + async def get_poi_table_paths(cls, dispute_id): + + paths = await IndexerUploads.select("data_path").where( + and_( + IndexerUploads.dispute_id == dispute_id, + IndexerUploads.data_kind == "poi", + ) + ) + return paths diff --git a/server/api/models/divergent_blocks.py b/server/api/models/divergent_blocks.py new file mode 100644 index 0000000..a3246b4 --- /dev/null +++ b/server/api/models/divergent_blocks.py @@ -0,0 +1,58 @@ +import datetime +import pandas as pd + +from sqlalchemy.dialects.postgresql import ARRAY, insert +from . import db + + +class DivergentBlocks(db.Model): + """ + Used to keep track of divergent blocks an indexer needs to filter for. + """ + + __tablename__ = "divergent_blocks" + id = db.Column(db.BigInteger(), primary_key=True) + current_time = db.Column(db.DateTime, default=datetime.datetime.utcnow) + ##Allocation POI being disputed + dispute_id = db.Column(db.String()) + ##Divergent ids exist between PAIRS of indexers. + """ + @TODO: Maybe using pairs isn't the right way of going about this? + + If we consider divergent blocks as a graph, every pair of indexers + can potentially have a different set of divergent blocks. + """ + indexer_id_1 = db.Column(db.String()) + indexer_id_2 = db.Column(db.String()) + + ##Store things like the divergent ids, or any extra data + divergent_blocks = db.Column("divergent_blocks", ARRAY(db.BigInteger())) + updated_at = db.Column(db.DateTime, default=datetime.datetime.utcnow) + + _idx = db.Index( + "divergent_indexer_pair", + "dispute_id", + "indexer_id_1", + "indexer_id_2", + unique=True, + ) + + @classmethod + def bulk_upsert(cls, divergent_blocks: pd.DataFrame, dispute_id: str): + dictionary_blocks = divergent_blocks.to_dict(orient="records") + + [ + divergent_block.update(dispute_id=dispute_id) + for divergent_block in dictionary_blocks + ] + qs = insert(cls.__table__).values(dictionary_blocks) + return ( + qs.on_conflict_do_update( + index_elements=[cls.dispute_id, cls.indexer_id_1, cls.indexer_id_2], + set_={ + "updated_at": datetime.datetime.utcnow() + }, # or even qs.excluded['some_column'] + ) + .returning(DivergentBlocks.__table__) + .gino.all() + ) diff --git a/server/api/models/indexer.py b/server/api/models/indexer.py new file mode 100644 index 0000000..2f90499 --- /dev/null +++ b/server/api/models/indexer.py @@ -0,0 +1,50 @@ +from datetime import datetime +from sqlalchemy.dialects.postgresql import JSONB, insert + +from . import db + + +class Indexer(db.Model): + __tablename__ = "indexer" + id = db.Column(db.BigInteger(),nullable=True) + indexer_id = db.Column( + db.String(), + primary_key=True + ) # Won't make primary key so can keep updated records + name = db.Column(db.Unicode(), default="unnamed") + updated_at = db.Column(db.DateTime, default=datetime.utcnow) + + @classmethod + def upsert_indexer(cls, indexer): + qs = insert(cls.__table__).values(indexer.to_dict()) + return ( + qs.on_conflict_do_update( + index_elements=[cls.indexer_id], + set_={ + "updated_at": datetime.utcnow() + }, # or even qs.excluded['some_column'] + ) + .returning(Indexer.__table__) + .gino.scalar() + ) + + # @classmethod + # def bulk_upsert(cls, indexers): + # qs = insert(cls.__table__).values(indexers) + # return ( + # qs.returning(Indexer.__table__) + # .gino.all() + # ) + @classmethod + def bulk_upsert(cls, indexers): + qs = insert(cls.__table__).values(indexers) + return ( + qs.on_conflict_do_update( + index_elements=[cls.indexer_id], + set_={ + "updated_at": datetime.utcnow() + }, # or even qs.excluded['some_column'] + ) + .returning(Indexer.__table__) + .gino.all() + ) \ No newline at end of file diff --git a/server/api/models/indexer_uploads.py b/server/api/models/indexer_uploads.py new file mode 100644 index 0000000..74343d9 --- /dev/null +++ b/server/api/models/indexer_uploads.py @@ -0,0 +1,28 @@ +import datetime +import enum + +from . import db +from sqlalchemy import * + + +class DataKindEnum(enum.Enum): + poi = 1 + entities = 2 + metadata = 3 + +class IndexerUploads(db.Model): + """ + Used to keep track of where indexer data is being stached. + + """ + + __tablename__ = "indexer_uploads" + id = db.Column(db.BigInteger(), primary_key=True) + current_time = db.Column(DateTime, default=datetime.datetime.utcnow) + dispute_id = db.Column(db.String()) + indexer_id = db.Column("indexer_id", db.String()) + data_path = db.Column("data_path", db.String()) + data_kind_enum = Column( + Enum(DataKindEnum), + nullable=True, + ) diff --git a/server/api/models/users.py b/server/api/models/users.py new file mode 100644 index 0000000..8251b4b --- /dev/null +++ b/server/api/models/users.py @@ -0,0 +1,8 @@ +from . import db + + +class User(db.Model): + __tablename__ = "users" + + id = db.Column(db.BigInteger(), primary_key=True) + nickname = db.Column(db.Unicode(), default="unnamed") diff --git a/server/api/scripts/dump_tables.sh b/server/api/scripts/dump_tables.sh new file mode 100755 index 0000000..24f1177 --- /dev/null +++ b/server/api/scripts/dump_tables.sh @@ -0,0 +1,12 @@ +#!/bin/bash +PGDATABASE="graph-node" + +psql -Atc "select schema_name from information_schema.schemata" $PGDATABASE|\ + while read SCHEMA; do + if [[ "$SCHEMA" != "pg_catalog" && "$SCHEMA" != "information_schema" ]]; then + psql -Atc "select tablename from pg_tables where schemaname='$SCHEMA'" $PGDATABASE |\ + while read TBL; do + psql -c "COPY $SCHEMA.$TBL TO STDOUT WITH CSV DELIMITER ';' HEADER ENCODING 'UTF-8'" $PGDATABASE > $SCHEMA.$TBL.csv + done + fi + done \ No newline at end of file diff --git a/server/api/scripts/python.png b/server/api/scripts/python.png new file mode 100644 index 0000000000000000000000000000000000000000..49ea8f5ba9252776c0a9e0ab37d21700b42e3b2b GIT binary patch literal 9955 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 P#sMr$Y>g`n>2d!b!VCd- literal 0 HcmV?d00001 diff --git a/server/api/scripts/upload_poi.sh b/server/api/scripts/upload_poi.sh new file mode 100755 index 0000000..af4dd7a --- /dev/null +++ b/server/api/scripts/upload_poi.sh @@ -0,0 +1,5 @@ +curl --request POST -F "file=@./python.png" \ +-H "Authorization: Bearer xxxxxxxxxxxxxx" \ +-H "Indexer-node: efgh" \ +-H "Dispute-hash: asdasdsadas" \ + localhost:8000/upload-poi \ No newline at end of file diff --git a/server/api/scripts/upload_poi_noexist.sh b/server/api/scripts/upload_poi_noexist.sh new file mode 100755 index 0000000..bbc7578 --- /dev/null +++ b/server/api/scripts/upload_poi_noexist.sh @@ -0,0 +1,5 @@ +curl --request POST -F "file=@./python.png" \ +-H "Authorization: Bearer xxxxxxxxxxxxxx" \ +-H "Indexer-node: efgh" \ +-H "Dispute-hash: abcd" \ + localhost:8000/upload-poi \ No newline at end of file diff --git a/server/api/storage/README.md b/server/api/storage/README.md new file mode 100644 index 0000000..2182dbf --- /dev/null +++ b/server/api/storage/README.md @@ -0,0 +1,4 @@ +# Access to gcloud client for upload and storage interaction. + + +MAKE SURE SSL CERTIFICATES ARE INSTALLED. If you are running locally on a Mac, you may need to go to your system Python directory and run the install certificates binary. diff --git a/server/api/storage/__init__.py b/server/api/storage/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/server/api/storage/gcloud.py b/server/api/storage/gcloud.py new file mode 100644 index 0000000..1dcfa9a --- /dev/null +++ b/server/api/storage/gcloud.py @@ -0,0 +1,102 @@ +import logging +import aiohttp +import pandas as pd + +from pathlib import Path +from typing import List + +from google.cloud.storage.bucket import Bucket + +from gcloud.aio.storage import Storage + +##Probably refactor this and make it a parameter or enviornment variable? +POI_BUCKET_NAME = "poi-disputes" + + +async def list_objects(bucket_name=POI_BUCKET_NAME): + """Upload csv files to bucket.""" + async with aiohttp.ClientSession() as session: + astorage = Storage(session=session) + results = await astorage.list_objects(bucket_name) + return results + + +async def stream_dataframe_to_gcs( + matching_events: pd.DataFrame, dispute_id: str, bucket_name=POI_BUCKET_NAME +): + """ + Pushes dataframe to GCS without intermediate file. + + Works by converting dataframe to a csv string and then using blob upload. + For large dataframes this probably won't work... would need to stream to a file. + + """ + + async with aiohttp.ClientSession() as session: + astorage = Storage(session=session) + bucket = astorage.get_bucket(bucket_name) + new_blob = bucket.new_blob("{}/matching_events.csv".format(dispute_id)) + # Any benefit here in defining content type on string data? + result = await new_blob.upload(matching_events.to_csv()) + + return result + + +async def upload_file( + file_data, object_name: str, indexer_node: str, dispute_hash: str +): + """Upload indexer data files to bucket. If any directories don't exist, make them.""" + async with aiohttp.ClientSession() as session: + astorage = Storage(session=session) + + object_path = "{}/{}/{}".format(dispute_hash, indexer_node, object_name) + # await get_or_create_bucket(bucket_name) + bucket = astorage.get_bucket(POI_BUCKET_NAME) + dispute_exists = await bucket.blob_exists(dispute_hash + "/") + ## Create the nested directory if it does not yet exist. + if not dispute_exists: + logging.info("{} dispute not on gcloud".format(dispute_hash)) + dispute_base = bucket.new_blob("{}/".format(dispute_hash)) + await dispute_base.upload(data=None) + + indexer_dispute_path = "{}/{}/".format(dispute_hash, indexer_node) + indexer_dispute_exists = await bucket.blob_exists(indexer_dispute_path) + + if not indexer_dispute_exists: + indexer_dispute_base = bucket.new_blob(indexer_dispute_path) + await indexer_dispute_base.upload(data=None) + + status = await astorage.upload( + POI_BUCKET_NAME, + object_path, + file_data, + ) + + return (status, object_path) + + +@DeprecationWarning +async def pull_bucket_contents( + bucket: Bucket, dispute_id: str, indexer_id: str +) -> List[str]: + """ + + Gather all of the contents of a bucket for an indexer id. + Returns paths to downloaded data. + + Needed for prior to loading data in memory w/ pandas + """ + folder = "/tmp/dispute/{}/{}".format(dispute_id, indexer_id) + blobs = bucket.list_blobs() + uris = [] + + if blobs: + Path(folder).mkdir(parents=True, exist_ok=True) + for blob in blobs: + logging.info("Blobs: {}".format(blob.name)) + destination_uri = "/tmp/dispute/{}/{}/{}".format( + dispute_id, indexer_id, blob.name + ) + blob.download_to_filename(destination_uri) + uris.append(destination_uri) + return uris diff --git a/server/api/transport/__init__.py b/server/api/transport/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/server/api/transport/list.py b/server/api/transport/list.py new file mode 100644 index 0000000..e4c4a27 --- /dev/null +++ b/server/api/transport/list.py @@ -0,0 +1,22 @@ +import logging +from fastapi import APIRouter +from starlette.requests import Request +from ..storage.gcloud import list_objects + +router = APIRouter() + +logger = logging.getLogger(__name__) + + +@router.get("/list_objects") +async def list_buckets(request: Request): + """ + List all relevant poi buckets + """ + + data = await list_objects() + return data + + +def init_app(app): + app.include_router(router) diff --git a/server/api/transport/upload.py b/server/api/transport/upload.py new file mode 100644 index 0000000..03f4773 --- /dev/null +++ b/server/api/transport/upload.py @@ -0,0 +1,103 @@ +import logging +from typing import Optional +import ipdb +from pydantic import BaseModel +from starlette.requests import Request +from fastapi import APIRouter, File, UploadFile, HTTPException + +from ..dispute.fsm import create_resolver +from ..models.disputes import DisputeStage +router = APIRouter() + +logger = logging.getLogger(__name__) + + +class IndexerUploadResponse(BaseModel): + upload_path: Optional[str] + + +@router.post("/upload-poi", response_model=IndexerUploadResponse) +async def upload_poi_to_gcloud(request: Request, file: UploadFile = File(...)): + """ + Stream a file of poi into gcloud + """ + indexer_node = request.headers["indexer-node"] + dispute_hash = request.headers["dispute-hash"] + + resolver = await create_resolver(dispute_hash, indexer_node) + stage = await resolver.get_stage() + + if not stage: + logger.info("This dispute does not exist") + raise HTTPException(status_code=404, detail="Dispute not found") + + if stage != DisputeStage.waiting_for_poi: + logger.info("Not waiting for poi") + raise HTTPException(status_code=404, detail="This dispute is no longer accepting POI") + + logger.info( + "Uploading file {} for indexer {} for dispute {}".format( + file.filename, indexer_node, dispute_hash + ) + ) + content = await file.read() + + try: + result = await resolver.indexer_add_poi(content, file.filename) + except Exception as e: + raise HTTPException(status_code=500, detail="{}".format(e)) + + return IndexerUploadResponse(upload_path=result) + + +@router.post("/upload-entities", response_model=IndexerUploadResponse) +async def upload_entities_to_gcloud(request: Request, file: UploadFile = File(...)): + """ + Stream a file of entitites into gcloud + """ + indexer_node = request.headers["indexer-node"] + dispute_hash = request.headers["dispute-hash"] + + resolver = await create_resolver(dispute_hash, indexer_node) + + logger.info( + "Uploading file {} for indexer {} for dispute {}".format( + file.filename, indexer_node, dispute_hash + ) + ) + content = await file.read() + + try: + result = await resolver.indexer_add_entities(content, file.filename) + except Exception as e: + raise HTTPException(status_code=500, detail="{}".format(e)) + + return IndexerUploadResponse(upload_path=result) + + +@router.post("/upload-metadata", response_model=IndexerUploadResponse) +async def upload_metadata_to_gcloud(request: Request, file: UploadFile = File(...)): + """ + Stream a file of metadata into gcloud + """ + indexer_node = request.headers["indexer-node"] + dispute_hash = request.headers["dispute-hash"] + + resolver = await create_resolver(dispute_hash, indexer_node) + + logger.info( + "Uploading metadata {} for indexer {} for dispute {}".format( + file.filename, indexer_node, dispute_hash + ) + ) + content = await file.read() + + try: + result = await resolver.indexer_add_metdata(content, file.filename) + except Exception as e: + raise HTTPException(status_code=500, detail="{}".format(e)) + + return IndexerUploadResponse(upload_path=result) + +def init_app(app): + app.include_router(router) diff --git a/server/api/utils/README.md b/server/api/utils/README.md new file mode 100644 index 0000000..b5cc468 --- /dev/null +++ b/server/api/utils/README.md @@ -0,0 +1 @@ +## Routes for file interaction APIs \ No newline at end of file diff --git a/server/api/utils/__init__.py b/server/api/utils/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/server/api/utils/notifier.py b/server/api/utils/notifier.py new file mode 100644 index 0000000..d65ef19 --- /dev/null +++ b/server/api/utils/notifier.py @@ -0,0 +1 @@ +# Code for email / pagerduty / slack updates diff --git a/server/api/views/README.md b/server/api/views/README.md new file mode 100644 index 0000000..bbe67ea --- /dev/null +++ b/server/api/views/README.md @@ -0,0 +1 @@ +## Routes for CRUD requests \ No newline at end of file diff --git a/server/api/views/__init__.py b/server/api/views/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/server/api/views/disputes.py b/server/api/views/disputes.py new file mode 100644 index 0000000..8707e0a --- /dev/null +++ b/server/api/views/disputes.py @@ -0,0 +1,201 @@ +import datetime +from enum import Enum +from typing import List, Optional +from fastapi import APIRouter, HTTPException +from pydantic import BaseModel +from starlette.requests import Request +from sqlalchemy import and_ + +from ..models import db +from ..models.disputes import Dispute, DisputeStage +from ..models.indexer import Indexer +from ..models.indexer_uploads import DataKindEnum, IndexerUploads + + +from ..dispute.fsm import DisputeResolver +from ..graphql import * + + +router = APIRouter() + + +class DisputeKind(str, Enum): + true_dispute = "dispute" + request_for_info = "request_for_info" + + +class DisputeModel(BaseModel): + id: Optional[int] = None + dispute_id: str + indexer_ids: List[str] + dispute_kind: DisputeKind + supgraph_id: Optional[str] = "" + + +class IndexerMetadata(BaseModel): + ethereum_client: Optional[str] = None + ethereum_cleint_version: Optional[str] = None + hardware_configuration: Optional[str] = None + graph_node_version: Optional[str] = None + graph_node_configuration: Optional[dict] = None + + +class IndexerUpload(BaseModel): + data_path: str + data_kind_enum: DataKindEnum + + +class IndexerUploadResponse(BaseModel): + path: str + kind: str + + +class IndexerResponse(BaseModel): + indexer_id: str + name: str + indexer_uploads: Optional[List[IndexerUploadResponse]] = [] + + +class DisputeResponse(BaseModel): + dispute_id: str + indexer_ids: List[str] + dispute_stage: DisputeStage + subgraph_id: Optional[str] = "" + indexers: Optional[List[IndexerResponse]] = [] + + +class DisputesResponse(BaseModel): + disputes: List[DisputeResponse] + + +## Make this only work on active disputes for now. Probably refactor this all +## Into a graphql model too. + + +@router.get("/disputes", response_model=DisputesResponse) +async def get_disputes(): + disputes = await Dispute.query.gino.all() + + mapped_disputes = [DisputeResponse(**d.to_dict()) for d in disputes] + enriched_disputes = [] + + for dispute in mapped_disputes: + indexer_responses = [] + dispute_indexers = await Indexer.query.where( + Indexer.indexer_id.in_(dispute.indexer_ids) + ).gino.all() + for indexer in dispute_indexers: + indexer_uploads = await IndexerUploads.query.where( + and_( + IndexerUploads.indexer_id == indexer.indexer_id, + IndexerUploads.dispute_id == dispute.dispute_id, + ) + ).gino.all() + mapped_uploads = [ + IndexerUploadResponse(path=d.data_path, kind=d.data_kind_enum.name) + for d in indexer_uploads + if d + ] + indexer_response = IndexerResponse( + indexer_id=indexer.indexer_id, + name=indexer.name, + indexer_uploads=mapped_uploads, + ) + indexer_responses.append(indexer_response) + + enriched_dispute = dispute + enriched_dispute.indexers = indexer_responses + enriched_disputes.append(enriched_dispute) + + dispute_response = DisputesResponse(disputes=enriched_disputes) + + return dispute_response + + +@router.get("/disputes/{uid}") +async def get_dispute(uid: str): + dispute = await Dispute.query.where(Dispute.dispute_id == uid).gino.first() + return dispute.to_dict() + + +@router.post("/disputes") +async def add_dispute(dispute: DisputeModel): + """ + Create a new dispute. Gather the set of related indexers and track them. + + If indexers aren't in the database. generate entries for them. + """ + if dispute.dispute_kind == "dispute": + try: + subgraph_id = get_subgraph_deployment_id_from_dispute(dispute.dispute_id) + subgraph_deployment = get_subgraph_deployment(subgraph_id) + dispute_indexers = get_indexers_from_subgraph_deployment( + subgraph_deployment + ) + except Exception as e: + raise HTTPException(status_code=404, detail="{}".format(e)) + + else: + try: + subgraph_id = dispute.subgraph_deployment + subgraph_deployment = get_subgraph_deployment(dispute.subgraph_deployment) + dispute_indexers = get_indexers_from_subgraph_deployment( + subgraph_deployment + ) + except Exception as e: + raise HTTPException(status_code=404, detail="{}".format(e)) + + all_indexers = [] + all_indexers.extend(dispute.indexer_ids) + all_indexers.extend(dispute_indexers) + + ipfs_hash = subgraph_deployment["subgraphDeployment"]["ipfsHash"] + + async with db.transaction(isolation="serializable") as tx_root: + conn = tx_root.connection + tx = await conn.transaction() + + try: + new_dispute = Dispute( + dispute_id=dispute.dispute_id, + indexer_ids=all_indexers, + dispute_stage=DisputeStage.waiting_for_poi.name, + subgraph_id=ipfs_hash, + updated_at=datetime.datetime.utcnow(), + ) + + await Dispute.upsert_dispute(new_dispute) + values = [{"indexer_id": x} for x in all_indexers] + + await Indexer.bulk_upsert(values) + await tx.commit() + modified_dispute = await Dispute.get(dispute.dispute_id) + + except Exception as e: + await tx.rollback() + raise HTTPException(status_code=404, detail="{}".format(e)) + + return modified_dispute.to_dict() + + +@router.patch("/disputes/{uid}") +async def progress_dispute(request: Request, uid: str): + dispute = await Dispute.get_or_404(uid) + json = await request.json() + stage = json["dispute_stage"] + await dispute.update(dispute_stage=stage).apply() + + new_dispute = dispute + new_dispute.dispute_stage = stage + return new_dispute.to_dict() + + +@router.delete("/disputes/{uid}") +async def delete_dispute(uid: str): + dispute = await Dispute.get_or_404(uid) + await dispute.delete() + return dict(id=uid) + + +def init_app(app): + app.include_router(router) diff --git a/server/api/views/divergent_blocks.py b/server/api/views/divergent_blocks.py new file mode 100644 index 0000000..7d04843 --- /dev/null +++ b/server/api/views/divergent_blocks.py @@ -0,0 +1,173 @@ +from numpy.lib.function_base import disp +from api.models.disputes import Dispute +import logging +from typing import List, Dict, Optional, Any +from fastapi import APIRouter +from pydantic import BaseModel +from fastapi import HTTPException +from sqlalchemy import and_, or_ +from starlette.requests import Request + + +from ..models.divergent_blocks import DivergentBlocks +from ..dispute.fsm import DisputeResolver, create_resolver +from api.models import divergent_blocks + + +logger = logging.getLogger(__name__) + + +router = APIRouter() + + +class IndexerDivergentBlocks(BaseModel): + indexer_id: str + divergent_blocks: List[int] + + +@router.get("/divergent_blocks", response_model=IndexerDivergentBlocks) +async def get_divergent_blocks_for_dispute(request: Request): + """ + For a given indexer returns all of their divergent blocks for a given dispute + + Should only be callable when the stage of the dispute in question has reached + the `generated_divergent_blocks` step. + + """ + + ##TODO: decide on 1. Pass in the headers or as a path arg + try: + indexer_id = request.headers["indexer-node"] + dispute_id = request.headers["dispute-hash"] + except: + raise HTTPException( + status_code=404, detail="Add Indexer-node and Dispute-hash to your headers" + ) + + # Returns all divergent blocks for an indexer on a dispute + # Maybe refactor so there isn't the secondary or clause? + + divergent_blocks = ( + await DivergentBlocks.select("divergent_blocks") + .where( + and_( + or_( + DivergentBlocks.indexer_id_1 == indexer_id, + DivergentBlocks.indexer_id_2 == indexer_id, + ), + DivergentBlocks.dispute_id == dispute_id, + ) + ) + .gino.all() + ) + + ##Flatten the results and deduplicate + combined = [] + for query_result in divergent_blocks: + combined.extend(query_result[0]) + + deduplicated_blocks = list(set(combined)) + + indexer_blocks = IndexerDivergentBlocks( + indexer_id=indexer_id, divergent_blocks=deduplicated_blocks + ) + + return indexer_blocks + + +class DivergentBlockModel(BaseModel): + dispute_id: str + indexer_id_1: str + indexer_id_2: str + divergent_blocks: List[int] + + +@router.post("/divergent_blocks") +async def submit_divergent_blocks(dblocks: DivergentBlockModel): + """ + NOT PUBLIC + Just used for testing. + + """ + created_blocks = await DivergentBlocks.create( + dispute_id=dblocks.dispute_id, + indexer_id_1=dblocks.indexer_id_1, + indexer_id_2=dblocks.indexer_id_2, + divergent_blocks=dblocks.divergent_blocks, + ) + + return created_blocks.to_dict() + + +class DivergentBlockResponse(BaseModel): + indexer_1: str + indexer_2: str + divergent_blocks: List[int] + + +class SubgraphEvent(BaseModel): + event: str + handler: str + + +class MatchingEvents(BaseModel): + address: str + block: int + event: str + subgraph_events: List[SubgraphEvent] + handlers: List[str] + log_params: Dict[str, Any] + + +class PreEntityUploadResponse(BaseModel): + dispute_id: str + divergent_blocks: List[DivergentBlockResponse] + matching_events: Optional[List[MatchingEvents]] = None + + +@router.post("/divergent_blocks/{dispute_id}", response_model=PreEntityUploadResponse) +async def generate_divergent_blocks(dispute_id: str, request: Request): + """ + Trigger the creation of divergent blocks for a dispute + + """ + # Create the resolver with supplied dispute + dsp: DisputeResolver = await create_resolver(dispute_id, "") + + ##Ensure that we have the necessary data: + + generated = await dsp.generate_divergent_blocks() + + if generated is None: + logger.info("Could not generate divergent blocks") + raise HTTPException(status_code=500, detail="Could not generate") + + generated_blocks = [ + DivergentBlockResponse( + indexer_1=row.indexer_id_1, + indexer_2=row.indexer_id_2, + divergent_blocks=row.divergent_blocks, + ) + for _, row in generated.iterrows() + ] + + try: + matching_events = await dsp.generate_matching_events() + except Exception as e: + logger.error("Couldn't load the matching events. Recalculate?. {}".format(e)) + + matching_events_model = [ + MatchingEvents(**x) for x in matching_events.to_dict(orient="records") + ] + + pre_entity_response = PreEntityUploadResponse( + dispute_id=dispute_id, + divergent_blocks=generated_blocks, + matching_events=matching_events_model, + ) + + return pre_entity_response + + +def init_app(app): + app.include_router(router) diff --git a/server/api/views/indexers.py b/server/api/views/indexers.py new file mode 100644 index 0000000..7482126 --- /dev/null +++ b/server/api/views/indexers.py @@ -0,0 +1,90 @@ +from typing import List, Optional +from fastapi import APIRouter +from fastapi.encoders import jsonable_encoder +from pydantic import BaseModel +from sqlalchemy import and_ + +from ..models.indexer import Indexer +from ..models.indexer_uploads import DataKindEnum, IndexerUploads +from ..models.divergent_blocks import DivergentBlocks +from api.models import indexer + +router = APIRouter() + + +class IndexerMetadata(BaseModel): + ethereum_client: Optional[str] = None + ethereum_cleint_version: Optional[str] = None + hardware_configuration: Optional[str] = None + graph_node_version: Optional[str] = None + graph_node_configuration: Optional[dict] = None + + +class IndexerModel(BaseModel): + indexer_id: str + name: str + indexer_metadata: Optional[IndexerMetadata] = None + + +class IndexerUpload(BaseModel): + data_path: str + data_kind_enum: DataKindEnum + +class IndexerResponse(BaseModel): + indexer_id: str + name: str + indexer_metadata: Optional[IndexerMetadata] = None + indexer_uploads: Optional[List[IndexerUpload]] = [] + + + +@router.post("/indexers") +async def create_indexer(indexer: IndexerModel): + indexer = await Indexer.create( + indexer_id=indexer.indexer_id, + name=indexer.name, + indexer_metadata=jsonable_encoder(indexer.indexer_metadata), + ) + # indexer = await Indexer.upsert_indexer(indexer) + return indexer.to_dict() + + +@router.get("/indexers/{uid}") +async def get_indexer(uid: str): + indexer = await Indexer.query.where(Indexer.indexer_id == uid).gino.first() + return indexer.to_dict() + +class IndexerUploadResponse(BaseModel): + path:str + kind:str + +class IndexerUploadsResponse(BaseModel): + indexer_uploads: List[IndexerUploadResponse] + +@router.get("/indexers/uploads/{indexer_id}/{dispute_id}", response_model=IndexerUploadsResponse) +async def get_indexer_uploads(indexer_id: str, dispute_id: str): + indexer_uploads = await IndexerUploads.query.where( + and_(IndexerUploads.indexer_id == indexer_id, + IndexerUploads.dispute_id == dispute_id + ) + ).gino.all() + + mapped_uploads = [IndexerUploadResponse(path=d.data_path, kind=d.data_kind_enum.name) for d in indexer_uploads] + uploads_response = IndexerUploadsResponse(indexer_uploads=mapped_uploads) + + return uploads_response + +@router.get("/indexers/divergent/{uid}") +async def get_divergent_blocks(uid: str): + divergent_blocks = await DivergentBlocks.get_or_404(uid) + return divergent_blocks.to_dict() + + +class DivergentBlockModel(BaseModel): + indexer_1: str + indexer_2: str + blocks: List[int] + + +def init_app(app): + app.include_router(router) diff --git a/server/api/views/users.py b/server/api/views/users.py new file mode 100644 index 0000000..e0bd7e0 --- /dev/null +++ b/server/api/views/users.py @@ -0,0 +1,33 @@ +from fastapi import APIRouter +from pydantic import BaseModel + +from ..models.users import User + +router = APIRouter() + + +@router.get("/users/{uid}") +async def get_user(uid: int): + user = await User.get_or_404(uid) + return user.to_dict() + + +class UserModel(BaseModel): + name: str + + +@router.post("/users") +async def add_user(user: UserModel): + rv = await User.create(nickname=user.name) + return rv.to_dict() + + +@router.delete("/users/{uid}") +async def delete_user(uid: int): + user = await User.get_or_404(uid) + await user.delete() + return dict(id=uid) + + +def init_app(app): + app.include_router(router) diff --git a/server/docker-build.sh b/server/docker-build.sh new file mode 100755 index 0000000..6944391 --- /dev/null +++ b/server/docker-build.sh @@ -0,0 +1 @@ +docker build . -t graph-disputes-server diff --git a/server/docker-entrypoint.sh b/server/docker-entrypoint.sh new file mode 100644 index 0000000..fe40c71 --- /dev/null +++ b/server/docker-entrypoint.sh @@ -0,0 +1,7 @@ +#!/bin/sh + +set -e + +. /venv/bin/activate + +exec uvicorn api.asgi:app --host 0.0.0.0 --port 8000 \ No newline at end of file diff --git a/server/docker-run.sh b/server/docker-run.sh new file mode 100755 index 0000000..e3242db --- /dev/null +++ b/server/docker-run.sh @@ -0,0 +1 @@ +docker run --rm -it graph-disputes-server diff --git a/server/insomnia/Insomnia_2021-08-09.json b/server/insomnia/Insomnia_2021-08-09.json new file mode 100644 index 0000000..6f0b944 --- /dev/null +++ b/server/insomnia/Insomnia_2021-08-09.json @@ -0,0 +1 @@ +{"_type":"export","__export_format":4,"__export_date":"2021-08-09T22:23:55.679Z","__export_source":"insomnia.desktop.app:v2021.4.1","resources":[{"_id":"req_8cdcc688955749a395455cc0f82a4975","parentId":"wrk_326b00cda24941bf88688fecb03e960d","modified":1628547677768,"created":1628547456057,"url":"{{ _.DISPUTE_ENDPOINT }}/divergent_blocks","name":"GetDivergentBlocks","description":"","method":"GET","body":{},"parameters":[],"headers":[{"id":"pair_adcdea3d10044bc0aea14478e0d3060e","name":"Indexer-node","value":"TTTDispute0Idx3","description":""},{"id":"pair_eec72a4424c041949ec5640a65f8728d","name":"Dispute-hash","value":"TTTDispute0","description":""}],"authentication":{},"metaSortKey":-1628547456057,"isPrivate":false,"settingStoreCookies":true,"settingSendCookies":true,"settingDisableRenderRequestBody":false,"settingEncodeUrl":true,"settingRebuildPath":true,"settingFollowRedirects":"global","_type":"request"},{"_id":"wrk_326b00cda24941bf88688fecb03e960d","parentId":null,"modified":1628538245520,"created":1628538245520,"name":"Disputes","description":"","scope":"collection","_type":"workspace"},{"_id":"req_8bab1e2805374b67ab53ea336b8025f1","parentId":"wrk_326b00cda24941bf88688fecb03e960d","modified":1628544351891,"created":1628544273148,"url":"{{ _.DISPUTE_ENDPOINT }}/divergent_blocks/TTTDispute0","name":"CalculateDivergentBlocks","description":"","method":"POST","body":{"mimeType":"application/json","text":""},"parameters":[],"headers":[{"name":"Content-Type","value":"application/json","id":"pair_616b509bac7b4ffeba4375ad66da982d"}],"authentication":{},"metaSortKey":-1628544273148,"isPrivate":false,"settingStoreCookies":true,"settingSendCookies":true,"settingDisableRenderRequestBody":false,"settingEncodeUrl":true,"settingRebuildPath":true,"settingFollowRedirects":"global","_type":"request"},{"_id":"req_9965644401db4a13b2248ca74eaae3fb","parentId":"wrk_326b00cda24941bf88688fecb03e960d","modified":1628544216306,"created":1628540559736,"url":"{{ _.DISPUTE_ENDPOINT }}/upload-poi","name":"UploadPoi","description":"","method":"POST","body":{"mimeType":"multipart/form-data","params":[{"id":"pair_c43aff451da94ac480d8ba4b7911b4c3","name":"file","value":"","description":"","type":"file","fileName":"/Users/goaaron/Projects/graph-disputes/server/insomnia/request_data/poi_example2.csv.gz"}]},"parameters":[],"headers":[{"id":"pair_10599c02122e4b449e98f4bc8bbf651e","name":"Indexer-node","value":"asdasdasfafesfef","description":""},{"id":"pair_ee0d9ebb794c42018f2cee85143497a9","name":"Dispute-hash","value":"TTTDispute0","description":""},{"id":"pair_0c046b36828449f298703f5602f4a97e","name":"","value":"","description":""},{"name":"Content-Type","value":"multipart/form-data","id":"pair_4262c417c6884388abc4a11f5a4203f5"}],"authentication":{},"metaSortKey":-1628540559736,"isPrivate":false,"settingStoreCookies":true,"settingSendCookies":true,"settingDisableRenderRequestBody":false,"settingEncodeUrl":true,"settingRebuildPath":true,"settingFollowRedirects":"global","_type":"request"},{"_id":"req_4ece5d69934b4104b1bff2339232e638","parentId":"wrk_326b00cda24941bf88688fecb03e960d","modified":1628547765538,"created":1628547727126,"url":"{{ _.DISPUTE_ENDPOINT }}/upload-entities","name":"UploadEntities","description":"","method":"POST","body":{"mimeType":"multipart/form-data","params":[{"id":"pair_c43aff451da94ac480d8ba4b7911b4c3","name":"file","value":"","description":"","type":"file","fileName":"/Users/goaaron/Desktop/python.png"}]},"parameters":[],"headers":[{"id":"pair_10599c02122e4b449e98f4bc8bbf651e","name":"Indexer-node","value":"TTTDispute0Idx3","description":""},{"id":"pair_ee0d9ebb794c42018f2cee85143497a9","name":"Dispute-hash","value":"TTTDispute0","description":""},{"id":"pair_0c046b36828449f298703f5602f4a97e","name":"","value":"","description":""},{"name":"Content-Type","value":"multipart/form-data","id":"pair_4262c417c6884388abc4a11f5a4203f5"}],"authentication":{},"metaSortKey":-1628539456040,"isPrivate":false,"settingStoreCookies":true,"settingSendCookies":true,"settingDisableRenderRequestBody":false,"settingEncodeUrl":true,"settingRebuildPath":true,"settingFollowRedirects":"global","_type":"request"},{"_id":"req_24e4d92422a74fa591b101ad18da27c1","parentId":"wrk_326b00cda24941bf88688fecb03e960d","modified":1628540550537,"created":1628538352344,"url":"{{ _.DISPUTE_ENDPOINT }}/disputes","name":"CreateDispute","description":"","method":"POST","body":{"mimeType":"application/json","text":""},"parameters":[],"headers":[{"name":"Content-Type","value":"application/json","id":"pair_6e8cfeb4a75b40419a534fd55ec42211"}],"authentication":{},"metaSortKey":-1628538352344,"isPrivate":false,"settingStoreCookies":true,"settingSendCookies":true,"settingDisableRenderRequestBody":false,"settingEncodeUrl":true,"settingRebuildPath":true,"settingFollowRedirects":"global","_type":"request"},{"_id":"env_b4296bc4ac9f425dc76fa675a38b1ab26b9d7f14","parentId":"wrk_326b00cda24941bf88688fecb03e960d","modified":1628538296305,"created":1628538245730,"name":"Base Environment","data":{"DISPUTE_ENDPOINT":"http://localhost:8000/"},"dataPropertyOrder":{"&":["DISPUTE_ENDPOINT"]},"color":null,"isPrivate":false,"metaSortKey":1628538245730,"_type":"environment"},{"_id":"jar_b4296bc4ac9f425dc76fa675a38b1ab26b9d7f14","parentId":"wrk_326b00cda24941bf88688fecb03e960d","modified":1628538245732,"created":1628538245732,"name":"Default Jar","cookies":[],"_type":"cookie_jar"},{"_id":"spc_b7671096b6c74f12b17034fbb1de7179","parentId":"wrk_326b00cda24941bf88688fecb03e960d","modified":1628538245523,"created":1628538245523,"fileName":"Disputes","contents":"","contentType":"yaml","_type":"api_spec"},{"_id":"env_fdc90f33a9684f25ab557a6b73f95829","parentId":"env_b4296bc4ac9f425dc76fa675a38b1ab26b9d7f14","modified":1628540536034,"created":1628538373771,"name":"Disputes","data":{"DISPUTE_ENDPOINT":"http://localhost:8000"},"dataPropertyOrder":{"&":["DISPUTE_ENDPOINT"]},"color":null,"isPrivate":false,"metaSortKey":1628538373771,"_type":"environment"}]} \ No newline at end of file diff --git a/server/insomnia/README.md b/server/insomnia/README.md new file mode 100644 index 0000000..8406b96 --- /dev/null +++ b/server/insomnia/README.md @@ -0,0 +1,3 @@ +# API requests for dispute service + +Use this directory to keep track of API request stubs \ No newline at end of file diff --git a/server/insomnia/request_data/poi_example1.csv.gz b/server/insomnia/request_data/poi_example1.csv.gz new file mode 100644 index 0000000000000000000000000000000000000000..5de036bc1ddeb7e25e64f2ebb51926bcd9b6e36d GIT binary patch literal 38300 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 literal 0 HcmV?d00001 diff --git a/server/insomnia/request_data/poi_example2.csv.gz b/server/insomnia/request_data/poi_example2.csv.gz new file mode 100644 index 0000000000000000000000000000000000000000..ae07fd72ccee68ec000a489ab9f132028bb2ea17 GIT binary patch literal 38304 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 A $SCHEMA.$TBL.csv + done + fi + done \ No newline at end of file diff --git a/server/poetry.lock b/server/poetry.lock new file mode 100644 index 0000000..76c0cb4 --- /dev/null +++ b/server/poetry.lock @@ -0,0 +1,3846 @@ +[[package]] +name = "absl-py" +version = "0.13.0" +description = "Abseil Python Common Libraries, see https://github.com/abseil/abseil-py." +category = "main" +optional = false +python-versions = "*" + +[package.dependencies] +six = "*" + +[[package]] +name = "aiofiles" +version = "0.7.0" +description = "File support for asyncio." +category = "main" +optional = false +python-versions = ">=3.6,<4.0" + +[[package]] +name = "aiohttp" +version = "3.7.4.post0" +description = "Async http client/server framework (asyncio)" +category = "main" +optional = false +python-versions = ">=3.6" + +[package.dependencies] +async-timeout = ">=3.0,<4.0" +attrs = ">=17.3.0" +chardet = ">=2.0,<5.0" +multidict = ">=4.5,<7.0" +typing-extensions = ">=3.6.5" +yarl = ">=1.0,<2.0" + +[package.extras] +speedups = ["aiodns", "brotlipy", "cchardet"] + +[[package]] +name = "alembic" +version = "1.7.1" +description = "A database migration tool for SQLAlchemy." +category = "main" +optional = false +python-versions = ">=3.6" + +[package.dependencies] +importlib-resources = {version = "*", markers = "python_version < \"3.9\""} +Mako = "*" +SQLAlchemy = ">=1.3.0" + +[package.extras] +tz = ["python-dateutil"] + +[[package]] +name = "appdirs" +version = "1.4.4" +description = "A small Python module for determining appropriate platform-specific dirs, e.g. a \"user data dir\"." +category = "main" +optional = false +python-versions = "*" + +[[package]] +name = "appnope" +version = "0.1.2" +description = "Disable App Nap on macOS >= 10.9" +category = "dev" +optional = false +python-versions = "*" + +[[package]] +name = "argon2-cffi" +version = "21.1.0" +description = "The secure Argon2 password hashing algorithm." +category = "dev" +optional = false +python-versions = ">=3.5" + +[package.dependencies] +cffi = ">=1.0.0" + +[package.extras] +dev = ["coverage[toml] (>=5.0.2)", "hypothesis", "pytest", "sphinx", "furo", "wheel", "pre-commit"] +docs = ["sphinx", "furo"] +tests = ["coverage[toml] (>=5.0.2)", "hypothesis", "pytest"] + +[[package]] +name = "asgiref" +version = "3.4.1" +description = "ASGI specs, helper code, and adapters" +category = "main" +optional = false +python-versions = ">=3.6" + +[package.extras] +tests = ["pytest", "pytest-asyncio", "mypy (>=0.800)"] + +[[package]] +name = "astunparse" +version = "1.6.3" +description = "An AST unparser for Python" +category = "main" +optional = false +python-versions = "*" + +[package.dependencies] +six = ">=1.6.1,<2.0" + +[[package]] +name = "async-timeout" +version = "3.0.1" +description = "Timeout context manager for asyncio programs" +category = "main" +optional = false +python-versions = ">=3.5.3" + +[[package]] +name = "asyncpg" +version = "0.24.0" +description = "An asyncio PostgreSQL driver" +category = "main" +optional = false +python-versions = ">=3.6.0" + +[package.extras] +dev = ["Cython (>=0.29.24,<0.30.0)", "pytest (>=6.0)", "Sphinx (>=4.1.2,<4.2.0)", "sphinxcontrib-asyncio (>=0.3.0,<0.4.0)", "sphinx-rtd-theme (>=0.5.2,<0.6.0)", "pycodestyle (>=2.7.0,<2.8.0)", "flake8 (>=3.9.2,<3.10.0)", "uvloop (>=0.15.3)"] +docs = ["Sphinx (>=4.1.2,<4.2.0)", "sphinxcontrib-asyncio (>=0.3.0,<0.4.0)", "sphinx-rtd-theme (>=0.5.2,<0.6.0)"] +test = ["pycodestyle (>=2.7.0,<2.8.0)", "flake8 (>=3.9.2,<3.10.0)", "uvloop (>=0.15.3)"] + +[[package]] +name = "atomicwrites" +version = "1.4.0" +description = "Atomic file writes." +category = "dev" +optional = false +python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*" + +[[package]] +name = "attrs" +version = "21.2.0" +description = "Classes Without Boilerplate" +category = "main" +optional = false +python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*" + +[package.extras] +dev = ["coverage[toml] (>=5.0.2)", "hypothesis", "pympler", "pytest (>=4.3.0)", "six", "mypy", "pytest-mypy-plugins", "zope.interface", "furo", "sphinx", "sphinx-notfound-page", "pre-commit"] +docs = ["furo", "sphinx", "zope.interface", "sphinx-notfound-page"] +tests = ["coverage[toml] (>=5.0.2)", "hypothesis", "pympler", "pytest (>=4.3.0)", "six", "mypy", "pytest-mypy-plugins", "zope.interface"] +tests_no_zope = ["coverage[toml] (>=5.0.2)", "hypothesis", "pympler", "pytest (>=4.3.0)", "six", "mypy", "pytest-mypy-plugins"] + +[[package]] +name = "backcall" +version = "0.2.0" +description = "Specifications for callback functions passed in to an API" +category = "dev" +optional = false +python-versions = "*" + +[[package]] +name = "backoff" +version = "1.11.1" +description = "Function decoration for backoff and retry" +category = "main" +optional = false +python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*" + +[[package]] +name = "base58" +version = "2.1.0" +description = "Base58 and Base58Check implementation." +category = "main" +optional = false +python-versions = ">=3.5" + +[package.extras] +tests = ["pytest (>=4.6)", "pytest-flake8", "pytest-cov", "PyHamcrest (>=2.0.2)", "coveralls", "pytest-benchmark"] + +[[package]] +name = "bitarray" +version = "1.2.2" +description = "efficient arrays of booleans -- C extension" +category = "main" +optional = false +python-versions = "*" + +[[package]] +name = "black" +version = "21.7b0" +description = "The uncompromising code formatter." +category = "main" +optional = false +python-versions = ">=3.6.2" + +[package.dependencies] +appdirs = "*" +click = ">=7.1.2" +mypy-extensions = ">=0.4.3" +pathspec = ">=0.8.1,<1" +regex = ">=2020.1.8" +tomli = ">=0.2.6,<2.0.0" + +[package.extras] +colorama = ["colorama (>=0.4.3)"] +d = ["aiohttp (>=3.6.0)", "aiohttp-cors (>=0.4.0)"] +python2 = ["typed-ast (>=1.4.2)"] +uvloop = ["uvloop (>=0.15.2)"] + +[[package]] +name = "black" +version = "21.8b0" +description = "The uncompromising code formatter." +category = "main" +optional = false +python-versions = ">=3.6.2" + +[package.dependencies] +click = ">=7.1.2" +mypy-extensions = ">=0.4.3" +pathspec = ">=0.9.0,<1" +platformdirs = ">=2" +regex = ">=2020.1.8" +tomli = ">=0.2.6,<2.0.0" +typing-extensions = {version = "!=3.10.0.1", markers = "python_version >= \"3.10\""} + +[package.extras] +colorama = ["colorama (>=0.4.3)"] +d = ["aiohttp (>=3.6.0)", "aiohttp-cors (>=0.4.0)"] +jupyter = ["ipython (>=7.8.0)", "tokenize-rt (>=3.2.0)"] +python2 = ["typed-ast (>=1.4.2)"] +uvloop = ["uvloop (>=0.15.2)"] + +[[package]] +name = "bleach" +version = "4.1.0" +description = "An easy safelist-based HTML-sanitizing tool." +category = "dev" +optional = false +python-versions = ">=3.6" + +[package.dependencies] +packaging = "*" +six = ">=1.9.0" +webencodings = "*" + +[[package]] +name = "cachetools" +version = "4.2.2" +description = "Extensible memoizing collections and decorators" +category = "main" +optional = false +python-versions = "~=3.5" + +[[package]] +name = "certifi" +version = "2021.5.30" +description = "Python package for providing Mozilla's CA Bundle." +category = "main" +optional = false +python-versions = "*" + +[[package]] +name = "cffi" +version = "1.14.6" +description = "Foreign Function Interface for Python calling C code." +category = "main" +optional = false +python-versions = "*" + +[package.dependencies] +pycparser = "*" + +[[package]] +name = "chardet" +version = "3.0.4" +description = "Universal encoding detector for Python 2 and 3" +category = "main" +optional = false +python-versions = "*" + +[[package]] +name = "charset-normalizer" +version = "2.0.4" +description = "The Real First Universal Charset Detector. Open, modern and actively maintained alternative to Chardet." +category = "main" +optional = false +python-versions = ">=3.5.0" + +[package.extras] +unicode_backport = ["unicodedata2"] + +[[package]] +name = "clang" +version = "5.0" +description = "libclang python bindings" +category = "main" +optional = false +python-versions = "*" + +[[package]] +name = "click" +version = "8.0.1" +description = "Composable command line interface toolkit" +category = "main" +optional = false +python-versions = ">=3.6" + +[package.dependencies] +colorama = {version = "*", markers = "platform_system == \"Windows\""} + +[[package]] +name = "colorama" +version = "0.4.4" +description = "Cross-platform colored terminal text." +category = "main" +optional = false +python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*" + +[[package]] +name = "cryptography" +version = "3.4.8" +description = "cryptography is a package which provides cryptographic recipes and primitives to Python developers." +category = "main" +optional = false +python-versions = ">=3.6" + +[package.dependencies] +cffi = ">=1.12" + +[package.extras] +docs = ["sphinx (>=1.6.5,!=1.8.0,!=3.1.0,!=3.1.1)", "sphinx-rtd-theme"] +docstest = ["doc8", "pyenchant (>=1.6.11)", "twine (>=1.12.0)", "sphinxcontrib-spelling (>=4.0.1)"] +pep8test = ["black", "flake8", "flake8-import-order", "pep8-naming"] +sdist = ["setuptools-rust (>=0.11.4)"] +ssh = ["bcrypt (>=3.1.5)"] +test = ["pytest (>=6.0)", "pytest-cov", "pytest-subtests", "pytest-xdist", "pretend", "iso8601", "pytz", "hypothesis (>=1.11.4,!=3.79.2)"] + +[[package]] +name = "cytoolz" +version = "0.11.0" +description = "Cython implementation of Toolz: High performance functional utilities" +category = "main" +optional = false +python-versions = "*" + +[package.dependencies] +toolz = ">=0.8.0" + +[package.extras] +cython = ["cython"] + +[[package]] +name = "debugpy" +version = "1.4.1" +description = "An implementation of the Debug Adapter Protocol for Python" +category = "dev" +optional = false +python-versions = ">=2.7,!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*,!=3.4.*" + +[[package]] +name = "decorator" +version = "5.0.9" +description = "Decorators for Humans" +category = "main" +optional = false +python-versions = ">=3.5" + +[[package]] +name = "defusedxml" +version = "0.7.1" +description = "XML bomb protection for Python stdlib modules" +category = "dev" +optional = false +python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*" + +[[package]] +name = "entrypoints" +version = "0.3" +description = "Discover and load entry points from installed packages." +category = "dev" +optional = false +python-versions = ">=2.7" + +[[package]] +name = "eth-abi" +version = "2.1.1" +description = "eth_abi: Python utilities for working with Ethereum ABI definitions, especially encoding and decoding" +category = "main" +optional = false +python-versions = ">=3.6, <4" + +[package.dependencies] +eth-typing = ">=2.0.0,<3.0.0" +eth-utils = ">=1.2.0,<2.0.0" +parsimonious = ">=0.8.0,<0.9.0" + +[package.extras] +dev = ["bumpversion (>=0.5.3,<1)", "pytest-watch (>=4.1.0,<5)", "wheel", "twine", "ipython", "pytest (==4.4.1)", "pytest-pythonpath (>=0.7.1)", "pytest-xdist (==1.22.3)", "tox (>=2.9.1,<3)", "eth-hash", "hypothesis (>=3.6.1,<4)", "flake8 (==3.4.1)", "isort (>=4.2.15,<5)", "mypy (==0.701)", "pydocstyle (>=3.0.0,<4)", "Sphinx (>=1.6.5,<2)", "sphinx-rtd-theme (>=0.1.9)", "towncrier (>=19.2.0,<20)"] +doc = ["Sphinx (>=1.6.5,<2)", "sphinx-rtd-theme (>=0.1.9)", "towncrier (>=19.2.0,<20)"] +lint = ["flake8 (==3.4.1)", "isort (>=4.2.15,<5)", "mypy (==0.701)", "pydocstyle (>=3.0.0,<4)"] +test = ["pytest (==4.4.1)", "pytest-pythonpath (>=0.7.1)", "pytest-xdist (==1.22.3)", "tox (>=2.9.1,<3)", "eth-hash", "hypothesis (>=3.6.1,<4)"] +tools = ["hypothesis (>=3.6.1,<4)"] + +[[package]] +name = "eth-account" +version = "0.5.5" +description = "eth-account: Sign Ethereum transactions and messages with local private keys" +category = "main" +optional = false +python-versions = ">=3.6, <4" + +[package.dependencies] +bitarray = ">=1.2.1,<1.3.0" +eth-abi = ">=2.0.0b7,<3" +eth-keyfile = ">=0.5.0,<0.6.0" +eth-keys = ">=0.2.1,<0.3.2 || >0.3.2,<0.4.0" +eth-rlp = ">=0.1.2,<2" +eth-utils = ">=1.3.0,<2" +hexbytes = ">=0.1.0,<1" +rlp = ">=1.0.0,<3" + +[package.extras] +dev = ["bumpversion (>=0.5.3,<1)", "pytest-watch (>=4.1.0,<5)", "wheel", "twine", "ipython", "hypothesis (>=4.18.0,<5)", "pytest (==5.4.1)", "pytest-xdist", "tox (==3.14.6)", "flake8 (==3.7.9)", "isort (>=4.2.15,<5)", "mypy (==0.770)", "pydocstyle (>=5.0.0,<6)", "Sphinx (>=1.6.5,<2)", "sphinx-rtd-theme (>=0.1.9,<1)", "towncrier (>=19.2.0,<20)"] +doc = ["Sphinx (>=1.6.5,<2)", "sphinx-rtd-theme (>=0.1.9,<1)", "towncrier (>=19.2.0,<20)"] +lint = ["flake8 (==3.7.9)", "isort (>=4.2.15,<5)", "mypy (==0.770)", "pydocstyle (>=5.0.0,<6)"] +test = ["hypothesis (>=4.18.0,<5)", "pytest (==5.4.1)", "pytest-xdist", "tox (==3.14.6)"] + +[[package]] +name = "eth-hash" +version = "0.3.1" +description = "eth-hash: The Ethereum hashing function, keccak256, sometimes (erroneously) called sha3" +category = "main" +optional = false +python-versions = ">=3.5, <4" + +[package.dependencies] +eth-utils = ">=1,<2" +pycryptodome = {version = ">=3.6.6,<4", optional = true, markers = "extra == \"pycryptodome\""} + +[package.extras] +dev = ["bumpversion (>=0.5.3,<1)", "pytest-watch (>=4.1.0,<5)", "wheel", "twine", "ipython", "pytest (==5.4.1)", "pytest-xdist", "tox (==3.14.6)", "flake8 (==3.7.9)", "isort (>=4.2.15,<5)", "mypy (==0.770)", "pydocstyle (>=5.0.0,<6)", "Sphinx (>=1.6.5,<2)", "sphinx-rtd-theme (>=0.1.9,<1)", "towncrier (>=19.2.0,<20)"] +doc = ["Sphinx (>=1.6.5,<2)", "sphinx-rtd-theme (>=0.1.9,<1)", "towncrier (>=19.2.0,<20)"] +lint = ["flake8 (==3.7.9)", "isort (>=4.2.15,<5)", "mypy (==0.770)", "pydocstyle (>=5.0.0,<6)"] +pycryptodome = ["pycryptodome (>=3.6.6,<4)"] +pysha3 = ["pysha3 (>=1.0.0,<2.0.0)"] +test = ["pytest (==5.4.1)", "pytest-xdist", "tox (==3.14.6)"] + +[[package]] +name = "eth-keyfile" +version = "0.5.1" +description = "A library for handling the encrypted keyfiles used to store ethereum private keys." +category = "main" +optional = false +python-versions = "*" + +[package.dependencies] +cytoolz = ">=0.9.0,<1.0.0" +eth-keys = ">=0.1.0-beta.4,<1.0.0" +eth-utils = ">=1.0.0-beta.1,<2.0.0" +pycryptodome = ">=3.4.7,<4.0.0" + +[[package]] +name = "eth-keys" +version = "0.3.3" +description = "Common API for Ethereum key operations." +category = "main" +optional = false +python-versions = "*" + +[package.dependencies] +eth-typing = ">=2.2.1,<3.0.0" +eth-utils = ">=1.3.0,<2.0.0" + +[package.extras] +coincurve = ["coincurve (>=7.0.0,<13.0.0)"] +dev = ["tox (==2.7.0)", "bumpversion (==0.5.3)", "twine", "eth-utils (>=1.3.0,<2.0.0)", "eth-typing (>=2.2.1,<3.0.0)", "flake8 (==3.0.4)", "mypy (==0.701)", "asn1tools (>=0.146.2,<0.147)", "pyasn1 (>=0.4.5,<0.5)", "pytest (==3.2.2)", "hypothesis (>=4.56.1,<5.0.0)", "eth-hash", "eth-hash"] +eth-keys = ["eth-utils (>=1.3.0,<2.0.0)", "eth-typing (>=2.2.1,<3.0.0)"] +lint = ["flake8 (==3.0.4)", "mypy (==0.701)"] +test = ["asn1tools (>=0.146.2,<0.147)", "pyasn1 (>=0.4.5,<0.5)", "pytest (==3.2.2)", "hypothesis (>=4.56.1,<5.0.0)", "eth-hash", "eth-hash"] + +[[package]] +name = "eth-rlp" +version = "0.2.1" +description = "eth-rlp: RLP definitions for common Ethereum objects in Python" +category = "main" +optional = false +python-versions = ">=3.6, <4" + +[package.dependencies] +eth-utils = ">=1.0.1,<2" +hexbytes = ">=0.1.0,<1" +rlp = ">=0.6.0,<3" + +[package.extras] +dev = ["Sphinx (>=1.6.5,<2)", "bumpversion (>=0.5.3,<1)", "eth-hash", "flake8 (==3.7.9)", "ipython", "isort (>=4.2.15,<5)", "mypy (==0.770)", "pydocstyle (>=3.0.0,<4)", "pytest-watch (>=4.1.0,<5)", "pytest-xdist", "pytest (==5.4.1)", "sphinx-rtd-theme (>=0.1.9)", "towncrier (>=19.2.0,<20)", "tox (==3.14.6)", "twine", "wheel"] +doc = ["Sphinx (>=1.6.5,<2)", "sphinx-rtd-theme (>=0.1.9)", "towncrier (>=19.2.0,<20)"] +lint = ["flake8 (==3.7.9)", "isort (>=4.2.15,<5)", "mypy (==0.770)", "pydocstyle (>=3.0.0,<4)"] +test = ["eth-hash", "pytest-xdist", "pytest (==5.4.1)", "tox (==3.14.6)"] + +[[package]] +name = "eth-typing" +version = "2.2.2" +description = "eth-typing: Common type annotations for ethereum python packages" +category = "main" +optional = false +python-versions = ">=3.5, <4" + +[package.extras] +dev = ["bumpversion (>=0.5.3,<1)", "pytest-watch (>=4.1.0,<5)", "wheel", "twine", "ipython", "pytest (>=4.4,<4.5)", "pytest-xdist", "tox (>=2.9.1,<3)", "flake8 (==3.8.3)", "isort (>=4.2.15,<5)", "mypy (==0.782)", "pydocstyle (>=3.0.0,<4)", "Sphinx (>=1.6.5,<2)", "sphinx-rtd-theme (>=0.1.9)"] +doc = ["Sphinx (>=1.6.5,<2)", "sphinx-rtd-theme (>=0.1.9)"] +lint = ["flake8 (==3.8.3)", "isort (>=4.2.15,<5)", "mypy (==0.782)", "pydocstyle (>=3.0.0,<4)"] +test = ["pytest (>=4.4,<4.5)", "pytest-xdist", "tox (>=2.9.1,<3)"] + +[[package]] +name = "eth-utils" +version = "1.10.0" +description = "eth-utils: Common utility functions for python code that interacts with Ethereum" +category = "main" +optional = false +python-versions = ">=3.5,!=3.5.2,<4" + +[package.dependencies] +cytoolz = {version = ">=0.10.1,<1.0.0", markers = "implementation_name == \"cpython\""} +eth-hash = ">=0.3.1,<0.4.0" +eth-typing = ">=2.2.1,<3.0.0" +toolz = {version = ">0.8.2,<1", markers = "implementation_name == \"pypy\""} + +[package.extras] +dev = ["bumpversion (>=0.5.3,<1)", "pytest-watch (>=4.1.0,<5)", "wheel (>=0.30.0,<1.0.0)", "twine (>=1.13,<2)", "ipython", "hypothesis (>=4.43.0,<5.0.0)", "pytest (==5.4.1)", "pytest-xdist", "tox (==3.14.6)", "black (>=18.6b4,<19)", "flake8 (==3.7.9)", "isort (>=4.2.15,<5)", "mypy (==0.720)", "pydocstyle (>=5.0.0,<6)", "pytest (>=3.4.1,<4.0.0)", "Sphinx (>=1.6.5,<2)", "sphinx-rtd-theme (>=0.1.9,<2)", "towncrier (>=19.2.0,<20)"] +doc = ["Sphinx (>=1.6.5,<2)", "sphinx-rtd-theme (>=0.1.9,<2)", "towncrier (>=19.2.0,<20)"] +lint = ["black (>=18.6b4,<19)", "flake8 (==3.7.9)", "isort (>=4.2.15,<5)", "mypy (==0.720)", "pydocstyle (>=5.0.0,<6)", "pytest (>=3.4.1,<4.0.0)"] +test = ["hypothesis (>=4.43.0,<5.0.0)", "pytest (==5.4.1)", "pytest-xdist", "tox (==3.14.6)"] + +[[package]] +name = "fastapi" +version = "0.68.1" +description = "FastAPI framework, high performance, easy to learn, fast to code, ready for production" +category = "main" +optional = false +python-versions = ">=3.6" + +[package.dependencies] +pydantic = ">=1.6.2,<1.7 || >1.7,<1.7.1 || >1.7.1,<1.7.2 || >1.7.2,<1.7.3 || >1.7.3,<1.8 || >1.8,<1.8.1 || >1.8.1,<2.0.0" +starlette = "0.14.2" + +[package.extras] +all = ["requests (>=2.24.0,<3.0.0)", "aiofiles (>=0.5.0,<0.6.0)", "jinja2 (>=2.11.2,<3.0.0)", "python-multipart (>=0.0.5,<0.0.6)", "itsdangerous (>=1.1.0,<2.0.0)", "pyyaml (>=5.3.1,<6.0.0)", "graphene (>=2.1.8,<3.0.0)", "ujson (>=4.0.1,<5.0.0)", "orjson (>=3.2.1,<4.0.0)", "email_validator (>=1.1.1,<2.0.0)", "uvicorn[standard] (>=0.12.0,<0.14.0)", "async_exit_stack (>=1.0.1,<2.0.0)", "async_generator (>=1.10,<2.0.0)"] +dev = ["python-jose[cryptography] (>=3.3.0,<4.0.0)", "passlib[bcrypt] (>=1.7.2,<2.0.0)", "autoflake (>=1.3.1,<2.0.0)", "flake8 (>=3.8.3,<4.0.0)", "uvicorn[standard] (>=0.12.0,<0.14.0)", "graphene (>=2.1.8,<3.0.0)"] +doc = ["mkdocs (>=1.1.2,<2.0.0)", "mkdocs-material (>=7.1.9,<8.0.0)", "mdx-include (>=1.4.1,<2.0.0)", "mkdocs-markdownextradata-plugin (>=0.1.7,<0.2.0)", "typer-cli (>=0.0.12,<0.0.13)", "pyyaml (>=5.3.1,<6.0.0)"] +test = ["pytest (>=6.2.4,<7.0.0)", "pytest-cov (>=2.12.0,<3.0.0)", "pytest-asyncio (>=0.14.0,<0.15.0)", "mypy (==0.812)", "flake8 (>=3.8.3,<4.0.0)", "black (==20.8b1)", "isort (>=5.0.6,<6.0.0)", "requests (>=2.24.0,<3.0.0)", "httpx (>=0.14.0,<0.15.0)", "email_validator (>=1.1.1,<2.0.0)", "sqlalchemy (>=1.3.18,<1.4.0)", "peewee (>=3.13.3,<4.0.0)", "databases[sqlite] (>=0.3.2,<0.4.0)", "orjson (>=3.2.1,<4.0.0)", "ujson (>=4.0.1,<5.0.0)", "async_exit_stack (>=1.0.1,<2.0.0)", "async_generator (>=1.10,<2.0.0)", "python-multipart (>=0.0.5,<0.0.6)", "aiofiles (>=0.5.0,<0.6.0)", "flask (>=1.1.2,<2.0.0)"] + +[[package]] +name = "flatbuffers" +version = "1.12" +description = "The FlatBuffers serialization format for Python" +category = "main" +optional = false +python-versions = "*" + +[[package]] +name = "fsspec" +version = "2021.8.1" +description = "File-system specification" +category = "main" +optional = false +python-versions = ">=3.6" + +[package.extras] +abfs = ["adlfs"] +adl = ["adlfs"] +dask = ["dask", "distributed"] +dropbox = ["dropboxdrivefs", "requests", "dropbox"] +entrypoints = ["importlib-metadata"] +gcs = ["gcsfs"] +git = ["pygit2"] +github = ["requests"] +gs = ["gcsfs"] +hdfs = ["pyarrow (>=1)"] +http = ["requests", "aiohttp"] +s3 = ["s3fs"] +sftp = ["paramiko"] +smb = ["smbprotocol"] +ssh = ["paramiko"] + +[[package]] +name = "future" +version = "0.18.2" +description = "Clean single-source support for Python 3 and 2" +category = "main" +optional = false +python-versions = ">=2.6, !=3.0.*, !=3.1.*, !=3.2.*" + +[[package]] +name = "gast" +version = "0.4.0" +description = "Python AST that abstracts the underlying Python version" +category = "main" +optional = false +python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*" + +[[package]] +name = "gcloud-aio-auth" +version = "3.6.1" +description = "Python Client for Google Cloud Auth" +category = "main" +optional = false +python-versions = ">= 3.6" + +[package.dependencies] +aiohttp = ">=3.3.0,<4.0.0" +backoff = ">=1.0.0,<2.0.0" +chardet = ">=2.0,<4.0" +cryptography = ">=2.0.0,<4.0.0" +future = ">=0.17.0,<0.18.3" +pyjwt = ">=1.5.3,<3.0.0" +six = ">=1.11.0,<2.0.0" + +[[package]] +name = "gcloud-aio-storage" +version = "6.1.1" +description = "Python Client for Google Cloud Storage" +category = "main" +optional = false +python-versions = ">= 3.6" + +[package.dependencies] +aiofiles = ">=0.6.0,<1.0.0" +gcloud-aio-auth = ">=3.6.0,<4.0.0" +pyasn1-modules = ">=0.2.1,<0.3.0" +rsa = {version = ">=3.1.4,<5.0.0", markers = "python_version >= \"3.6\""} + +[[package]] +name = "gcsfs" +version = "2021.8.1" +description = "Convenient Filesystem interface over GCS" +category = "main" +optional = false +python-versions = ">=3.6" + +[package.dependencies] +aiohttp = "*" +decorator = "*" +fsspec = "2021.08.1" +google-auth = ">=1.2" +google-auth-oauthlib = "*" +requests = "*" + +[package.extras] +crc = ["crcmod"] +gcsfuse = ["fusepy"] + +[[package]] +name = "gino" +version = "1.0.1" +description = "GINO Is Not ORM - a Python asyncio ORM on SQLAlchemy core." +category = "main" +optional = false +python-versions = ">=3.5,<4.0" + +[package.dependencies] +asyncpg = ">=0.18,<1.0" +SQLAlchemy = ">=1.2.16,<1.4" + +[package.extras] +starlette = ["gino-starlette (>=0.1.1,<0.2.0)"] +aiohttp = ["gino-aiohttp (>=0.1.0,<0.2.0)"] +tornado = ["gino-tornado (>=0.1.0,<0.2.0)"] +sanic = ["gino-sanic (>=0.1.0,<0.2.0)"] +quart = ["gino-quart (>=0.1.0,<0.2.0)"] + +[[package]] +name = "gino-starlette" +version = "0.1.2" +description = "An extension for GINO to integrate with Starlette" +category = "main" +optional = false +python-versions = ">=3.6,<4.0" + +[package.dependencies] +gino = ">=1.0.0,<2.0.0" +starlette = ">=0.13.0,<0.15.0" + +[[package]] +name = "google-api-core" +version = "2.0.1" +description = "Google API client core library" +category = "main" +optional = false +python-versions = ">=3.6" + +[package.dependencies] +google-auth = ">=1.25.0,<3.0dev" +googleapis-common-protos = ">=1.6.0,<2.0dev" +protobuf = ">=3.12.0" +requests = ">=2.18.0,<3.0.0dev" + +[package.extras] +grpc = ["grpcio (>=1.33.2,<2.0dev)"] +grpcgcp = ["grpcio-gcp (>=0.2.2)"] +grpcio-gcp = ["grpcio-gcp (>=0.2.2)"] + +[[package]] +name = "google-auth" +version = "1.35.0" +description = "Google Authentication Library" +category = "main" +optional = false +python-versions = ">=2.7,!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*,!=3.4.*,!=3.5.*" + +[package.dependencies] +cachetools = ">=2.0.0,<5.0" +pyasn1-modules = ">=0.2.1" +rsa = {version = ">=3.1.4,<5", markers = "python_version >= \"3.6\""} +six = ">=1.9.0" + +[package.extras] +aiohttp = ["requests (>=2.20.0,<3.0.0dev)", "aiohttp (>=3.6.2,<4.0.0dev)"] +pyopenssl = ["pyopenssl (>=20.0.0)"] +reauth = ["pyu2f (>=0.1.5)"] + +[[package]] +name = "google-auth-oauthlib" +version = "0.4.5" +description = "Google Authentication Library" +category = "main" +optional = false +python-versions = ">=3.6" + +[package.dependencies] +google-auth = ">=1.0.0" +requests-oauthlib = ">=0.7.0" + +[package.extras] +tool = ["click (>=6.0.0)"] + +[[package]] +name = "google-cloud-core" +version = "2.0.0" +description = "Google Cloud API client core library" +category = "main" +optional = false +python-versions = ">=3.6" + +[package.dependencies] +google-api-core = ">=1.21.0,<3.0.0dev" +google-auth = ">=1.24.0,<3.0dev" + +[package.extras] +grpc = ["grpcio (>=1.8.2,<2.0dev)"] + +[[package]] +name = "google-cloud-storage" +version = "1.42.0" +description = "Google Cloud Storage API client library" +category = "main" +optional = false +python-versions = ">=2.7,!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*,!=3.4.*,!=3.5.*" + +[package.dependencies] +google-api-core = {version = ">=1.29.0,<3.0dev", markers = "python_version >= \"3.6\""} +google-auth = {version = ">=1.25.0,<3.0dev", markers = "python_version >= \"3.6\""} +google-cloud-core = {version = ">=1.6.0,<3.0dev", markers = "python_version >= \"3.6\""} +google-resumable-media = {version = ">=1.3.0,<3.0dev", markers = "python_version >= \"3.6\""} +requests = ">=2.18.0,<3.0.0dev" + +[[package]] +name = "google-crc32c" +version = "1.1.3" +description = "A python wrapper of the C library 'Google CRC32C'" +category = "main" +optional = false +python-versions = ">=3.6" + +[package.extras] +testing = ["pytest"] + +[[package]] +name = "google-pasta" +version = "0.2.0" +description = "pasta is an AST-based Python refactoring library" +category = "main" +optional = false +python-versions = "*" + +[package.dependencies] +six = "*" + +[[package]] +name = "google-resumable-media" +version = "2.0.0" +description = "Utilities for Google Media Downloads and Resumable Uploads" +category = "main" +optional = false +python-versions = ">= 3.6" + +[package.dependencies] +google-crc32c = ">=1.0,<2.0dev" + +[package.extras] +aiohttp = ["aiohttp (>=3.6.2,<4.0.0dev)"] +requests = ["requests (>=2.18.0,<3.0.0dev)"] + +[[package]] +name = "googleapis-common-protos" +version = "1.53.0" +description = "Common protobufs used in Google APIs" +category = "main" +optional = false +python-versions = ">=3.6" + +[package.dependencies] +protobuf = ">=3.12.0" + +[package.extras] +grpc = ["grpcio (>=1.0.0)"] + +[[package]] +name = "gql" +version = "2.0.0" +description = "GraphQL client for Python" +category = "main" +optional = false +python-versions = "*" + +[package.dependencies] +graphql-core = ">=2.3.2,<3" +promise = ">=2.3,<3" +requests = ">=2.12,<3" +six = ">=1.10.0" + +[package.extras] +dev = ["flake8 (==3.8.1)", "isort (==4.3.21)", "black (==19.10b0)", "mypy (==0.770)", "check-manifest (>=0.42,<1)", "pytest (==5.4.2)", "pytest-asyncio (==0.11.0)", "pytest-cov (==2.8.1)", "mock (==4.0.2)", "vcrpy (==4.0.2)", "coveralls (==2.0.0)"] +test = ["pytest (==5.4.2)", "pytest-asyncio (==0.11.0)", "pytest-cov (==2.8.1)", "mock (==4.0.2)", "vcrpy (==4.0.2)", "coveralls (==2.0.0)"] + +[[package]] +name = "graphql-core" +version = "2.3.2" +description = "GraphQL implementation for Python" +category = "main" +optional = false +python-versions = "*" + +[package.dependencies] +promise = ">=2.3,<3" +rx = ">=1.6,<2" +six = ">=1.10.0" + +[package.extras] +gevent = ["gevent (>=1.1)"] +test = ["six (==1.14.0)", "pyannotate (==1.2.0)", "pytest (==4.6.10)", "pytest-django (==3.9.0)", "pytest-cov (==2.8.1)", "coveralls (==1.11.1)", "cython (==0.29.17)", "gevent (==1.5.0)", "pytest-benchmark (==3.2.3)", "pytest-mock (==2.0.0)"] + +[[package]] +name = "greenlet" +version = "1.1.1" +description = "Lightweight in-process concurrent programming" +category = "main" +optional = false +python-versions = ">=2.7,!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*,!=3.4.*" + +[package.extras] +docs = ["sphinx"] + +[[package]] +name = "grpcio" +version = "1.39.0" +description = "HTTP/2-based RPC framework" +category = "main" +optional = false +python-versions = "*" + +[package.dependencies] +six = ">=1.5.2" + +[package.extras] +protobuf = ["grpcio-tools (>=1.39.0)"] + +[[package]] +name = "gunicorn" +version = "20.1.0" +description = "WSGI HTTP Server for UNIX" +category = "main" +optional = false +python-versions = ">=3.5" + +[package.extras] +eventlet = ["eventlet (>=0.24.1)"] +gevent = ["gevent (>=1.4.0)"] +setproctitle = ["setproctitle"] +tornado = ["tornado (>=0.2)"] + +[[package]] +name = "h11" +version = "0.12.0" +description = "A pure-Python, bring-your-own-I/O implementation of HTTP/1.1" +category = "main" +optional = false +python-versions = ">=3.6" + +[[package]] +name = "h5py" +version = "3.1.0" +description = "Read and write HDF5 files from Python" +category = "main" +optional = false +python-versions = ">=3.6" + +[package.dependencies] +numpy = [ + {version = ">=1.17.5", markers = "python_version == \"3.8\""}, + {version = ">=1.19.3", markers = "python_version >= \"3.9\""}, +] + +[[package]] +name = "hexbytes" +version = "0.2.2" +description = "hexbytes: Python `bytes` subclass that decodes hex, with a readable console output" +category = "main" +optional = false +python-versions = ">=3.6, <4" + +[package.extras] +dev = ["Sphinx (>=1.6.5,<2)", "bumpversion (>=0.5.3,<1)", "eth-utils (>=1.0.1,<2)", "flake8 (==3.7.9)", "hypothesis (>=3.44.24,<4)", "ipython", "isort (>=4.2.15,<5)", "mypy (==0.770)", "pydocstyle (>=5.0.0,<6)", "pytest-watch (>=4.1.0,<5)", "pytest-xdist", "pytest (==5.4.1)", "sphinx-rtd-theme (>=0.1.9,<1)", "towncrier (>=19.2.0,<20)", "tox (==3.14.6)", "twine", "wheel"] +doc = ["Sphinx (>=1.6.5,<2)", "sphinx-rtd-theme (>=0.1.9,<1)", "towncrier (>=19.2.0,<20)"] +lint = ["flake8 (==3.7.9)", "isort (>=4.2.15,<5)", "mypy (==0.770)", "pydocstyle (>=5.0.0,<6)"] +test = ["eth-utils (>=1.0.1,<2)", "hypothesis (>=3.44.24,<4)", "pytest-xdist", "pytest (==5.4.1)", "tox (==3.14.6)"] + +[[package]] +name = "idna" +version = "3.2" +description = "Internationalized Domain Names in Applications (IDNA)" +category = "main" +optional = false +python-versions = ">=3.5" + +[[package]] +name = "importlib-resources" +version = "5.2.2" +description = "Read resources from Python packages" +category = "main" +optional = false +python-versions = ">=3.6" + +[package.dependencies] +zipp = {version = ">=3.1.0", markers = "python_version < \"3.10\""} + +[package.extras] +docs = ["sphinx", "jaraco.packaging (>=8.2)", "rst.linker (>=1.9)"] +testing = ["pytest (>=4.6)", "pytest-checkdocs (>=2.4)", "pytest-flake8", "pytest-cov", "pytest-enabler (>=1.0.1)", "pytest-black (>=0.3.7)", "pytest-mypy"] + +[[package]] +name = "iniconfig" +version = "1.1.1" +description = "iniconfig: brain-dead simple config-ini parsing" +category = "dev" +optional = false +python-versions = "*" + +[[package]] +name = "ipdb" +version = "0.13.9" +description = "IPython-enabled pdb" +category = "dev" +optional = false +python-versions = ">=2.7" + +[package.dependencies] +decorator = {version = "*", markers = "python_version > \"3.6\""} +ipython = {version = ">=7.17.0", markers = "python_version > \"3.6\""} +toml = {version = ">=0.10.2", markers = "python_version > \"3.6\""} + +[[package]] +name = "ipfshttpclient" +version = "0.8.0a2" +description = "Python IPFS HTTP CLIENT library" +category = "main" +optional = false +python-versions = ">=3.6.2,!=3.7.0,!=3.7.1" + +[package.dependencies] +multiaddr = ">=0.0.7" +requests = ">=2.11" + +[[package]] +name = "ipykernel" +version = "6.3.1" +description = "IPython Kernel for Jupyter" +category = "dev" +optional = false +python-versions = ">=3.7" + +[package.dependencies] +appnope = {version = "*", markers = "platform_system == \"Darwin\""} +debugpy = ">=1.0.0,<2.0" +ipython = ">=7.23.1,<8.0" +ipython-genutils = "*" +jupyter-client = "<8.0" +matplotlib-inline = ">=0.1.0,<0.2.0" +tornado = ">=4.2,<7.0" +traitlets = ">=4.1.0,<6.0" + +[package.extras] +test = ["pytest (!=5.3.4)", "pytest-cov", "flaky", "nose", "ipyparallel"] + +[[package]] +name = "ipython" +version = "7.27.0" +description = "IPython: Productive Interactive Computing" +category = "dev" +optional = false +python-versions = ">=3.7" + +[package.dependencies] +appnope = {version = "*", markers = "sys_platform == \"darwin\""} +backcall = "*" +colorama = {version = "*", markers = "sys_platform == \"win32\""} +decorator = "*" +jedi = ">=0.16" +matplotlib-inline = "*" +pexpect = {version = ">4.3", markers = "sys_platform != \"win32\""} +pickleshare = "*" +prompt-toolkit = ">=2.0.0,<3.0.0 || >3.0.0,<3.0.1 || >3.0.1,<3.1.0" +pygments = "*" +traitlets = ">=4.2" + +[package.extras] +all = ["Sphinx (>=1.3)", "ipykernel", "ipyparallel", "ipywidgets", "nbconvert", "nbformat", "nose (>=0.10.1)", "notebook", "numpy (>=1.17)", "pygments", "qtconsole", "requests", "testpath"] +doc = ["Sphinx (>=1.3)"] +kernel = ["ipykernel"] +nbconvert = ["nbconvert"] +nbformat = ["nbformat"] +notebook = ["notebook", "ipywidgets"] +parallel = ["ipyparallel"] +qtconsole = ["qtconsole"] +test = ["nose (>=0.10.1)", "requests", "testpath", "pygments", "nbformat", "ipykernel", "numpy (>=1.17)"] + +[[package]] +name = "ipython-genutils" +version = "0.2.0" +description = "Vestigial utilities from IPython" +category = "dev" +optional = false +python-versions = "*" + +[[package]] +name = "ipywidgets" +version = "7.6.3" +description = "IPython HTML widgets for Jupyter" +category = "dev" +optional = false +python-versions = "*" + +[package.dependencies] +ipykernel = ">=4.5.1" +ipython = {version = ">=4.0.0", markers = "python_version >= \"3.3\""} +jupyterlab-widgets = {version = ">=1.0.0", markers = "python_version >= \"3.6\""} +nbformat = ">=4.2.0" +traitlets = ">=4.3.1" +widgetsnbextension = ">=3.5.0,<3.6.0" + +[package.extras] +test = ["pytest (>=3.6.0)", "pytest-cov", "mock"] + +[[package]] +name = "jedi" +version = "0.18.0" +description = "An autocompletion tool for Python that can be used for text editors." +category = "dev" +optional = false +python-versions = ">=3.6" + +[package.dependencies] +parso = ">=0.8.0,<0.9.0" + +[package.extras] +qa = ["flake8 (==3.8.3)", "mypy (==0.782)"] +testing = ["Django (<3.1)", "colorama", "docopt", "pytest (<6.0.0)"] + +[[package]] +name = "jinja2" +version = "3.0.1" +description = "A very fast and expressive template engine." +category = "dev" +optional = false +python-versions = ">=3.6" + +[package.dependencies] +MarkupSafe = ">=2.0" + +[package.extras] +i18n = ["Babel (>=2.7)"] + +[[package]] +name = "jsonschema" +version = "3.2.0" +description = "An implementation of JSON Schema validation for Python" +category = "main" +optional = false +python-versions = "*" + +[package.dependencies] +attrs = ">=17.4.0" +pyrsistent = ">=0.14.0" +six = ">=1.11.0" + +[package.extras] +format = ["idna", "jsonpointer (>1.13)", "rfc3987", "strict-rfc3339", "webcolors"] +format_nongpl = ["idna", "jsonpointer (>1.13)", "webcolors", "rfc3986-validator (>0.1.0)", "rfc3339-validator"] + +[[package]] +name = "jupyter" +version = "1.0.0" +description = "Jupyter metapackage. Install all the Jupyter components in one go." +category = "dev" +optional = false +python-versions = "*" + +[package.dependencies] +ipykernel = "*" +ipywidgets = "*" +jupyter-console = "*" +nbconvert = "*" +notebook = "*" +qtconsole = "*" + +[[package]] +name = "jupyter-client" +version = "7.0.2" +description = "Jupyter protocol implementation and client libraries" +category = "dev" +optional = false +python-versions = ">=3.6.1" + +[package.dependencies] +entrypoints = "*" +jupyter-core = ">=4.6.0" +nest-asyncio = ">=1.5" +python-dateutil = ">=2.1" +pyzmq = ">=13" +tornado = ">=4.1" +traitlets = "*" + +[package.extras] +doc = ["myst-parser", "sphinx (>=1.3.6)", "sphinx-rtd-theme", "sphinxcontrib-github-alt"] +test = ["codecov", "coverage", "ipykernel", "ipython", "mock", "mypy", "pre-commit", "pytest", "pytest-asyncio", "pytest-cov", "pytest-timeout", "jedi (<0.18)"] + +[[package]] +name = "jupyter-console" +version = "6.4.0" +description = "Jupyter terminal console" +category = "dev" +optional = false +python-versions = ">=3.6" + +[package.dependencies] +ipykernel = "*" +ipython = "*" +jupyter-client = "*" +prompt-toolkit = ">=2.0.0,<3.0.0 || >3.0.0,<3.0.1 || >3.0.1,<3.1.0" +pygments = "*" + +[package.extras] +test = ["pexpect"] + +[[package]] +name = "jupyter-core" +version = "4.7.1" +description = "Jupyter core package. A base package on which Jupyter projects rely." +category = "dev" +optional = false +python-versions = ">=3.6" + +[package.dependencies] +pywin32 = {version = ">=1.0", markers = "sys_platform == \"win32\""} +traitlets = "*" + +[[package]] +name = "jupyterlab-pygments" +version = "0.1.2" +description = "Pygments theme using JupyterLab CSS variables" +category = "dev" +optional = false +python-versions = "*" + +[package.dependencies] +pygments = ">=2.4.1,<3" + +[[package]] +name = "jupyterlab-widgets" +version = "1.0.0" +description = "A JupyterLab extension." +category = "dev" +optional = false +python-versions = ">=3.6" + +[[package]] +name = "keras" +version = "2.6.0" +description = "TensorFlow Keras." +category = "main" +optional = false +python-versions = "*" + +[[package]] +name = "keras-preprocessing" +version = "1.1.2" +description = "Easy data preprocessing and data augmentation for deep learning models" +category = "main" +optional = false +python-versions = "*" + +[package.dependencies] +numpy = ">=1.9.1" +six = ">=1.9.0" + +[package.extras] +image = ["scipy (>=0.14)", "Pillow (>=5.2.0)"] +pep8 = ["flake8"] +tests = ["pandas", "pillow", "tensorflow", "keras", "pytest", "pytest-xdist", "pytest-cov"] + +[[package]] +name = "lru-dict" +version = "1.1.7" +description = "An Dict like LRU container." +category = "main" +optional = false +python-versions = "*" + +[[package]] +name = "mako" +version = "1.1.5" +description = "A super-fast templating language that borrows the best ideas from the existing templating languages." +category = "main" +optional = false +python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*" + +[package.dependencies] +MarkupSafe = ">=0.9.2" + +[package.extras] +babel = ["babel"] +lingua = ["lingua"] + +[[package]] +name = "markdown" +version = "3.3.4" +description = "Python implementation of Markdown." +category = "main" +optional = false +python-versions = ">=3.6" + +[package.extras] +testing = ["coverage", "pyyaml"] + +[[package]] +name = "markupsafe" +version = "2.0.1" +description = "Safely add untrusted strings to HTML/XML markup." +category = "main" +optional = false +python-versions = ">=3.6" + +[[package]] +name = "matplotlib-inline" +version = "0.1.2" +description = "Inline Matplotlib backend for Jupyter" +category = "dev" +optional = false +python-versions = ">=3.5" + +[package.dependencies] +traitlets = "*" + +[[package]] +name = "mistune" +version = "0.8.4" +description = "The fastest markdown parser in pure Python" +category = "dev" +optional = false +python-versions = "*" + +[[package]] +name = "multiaddr" +version = "0.0.9" +description = "Python implementation of jbenet's multiaddr" +category = "main" +optional = false +python-versions = ">=2.7,!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*" + +[package.dependencies] +base58 = "*" +netaddr = "*" +six = "*" +varint = "*" + +[[package]] +name = "multidict" +version = "5.1.0" +description = "multidict implementation" +category = "main" +optional = false +python-versions = ">=3.6" + +[[package]] +name = "mypy-extensions" +version = "0.4.3" +description = "Experimental type system extensions for programs checked with the mypy typechecker." +category = "main" +optional = false +python-versions = "*" + +[[package]] +name = "nbclient" +version = "0.5.4" +description = "A client library for executing notebooks. Formerly nbconvert's ExecutePreprocessor." +category = "dev" +optional = false +python-versions = ">=3.6.1" + +[package.dependencies] +jupyter-client = ">=6.1.5" +nbformat = ">=5.0" +nest-asyncio = "*" +traitlets = ">=4.2" + +[package.extras] +dev = ["codecov", "coverage", "ipython", "ipykernel", "ipywidgets", "pytest (>=4.1)", "pytest-cov (>=2.6.1)", "check-manifest", "flake8", "mypy", "tox", "bumpversion", "xmltodict", "pip (>=18.1)", "wheel (>=0.31.0)", "setuptools (>=38.6.0)", "twine (>=1.11.0)", "black"] +sphinx = ["Sphinx (>=1.7)", "sphinx-book-theme", "mock", "moto", "myst-parser"] +test = ["codecov", "coverage", "ipython", "ipykernel", "ipywidgets", "pytest (>=4.1)", "pytest-cov (>=2.6.1)", "check-manifest", "flake8", "mypy", "tox", "bumpversion", "xmltodict", "pip (>=18.1)", "wheel (>=0.31.0)", "setuptools (>=38.6.0)", "twine (>=1.11.0)", "black"] + +[[package]] +name = "nbconvert" +version = "6.1.0" +description = "Converting Jupyter Notebooks" +category = "dev" +optional = false +python-versions = ">=3.7" + +[package.dependencies] +bleach = "*" +defusedxml = "*" +entrypoints = ">=0.2.2" +jinja2 = ">=2.4" +jupyter-core = "*" +jupyterlab-pygments = "*" +mistune = ">=0.8.1,<2" +nbclient = ">=0.5.0,<0.6.0" +nbformat = ">=4.4" +pandocfilters = ">=1.4.1" +pygments = ">=2.4.1" +testpath = "*" +traitlets = ">=5.0" + +[package.extras] +all = ["pytest", "pytest-cov", "pytest-dependency", "ipykernel", "ipywidgets (>=7)", "pyppeteer (==0.2.2)", "tornado (>=4.0)", "sphinx (>=1.5.1)", "sphinx-rtd-theme", "nbsphinx (>=0.2.12)", "ipython"] +docs = ["sphinx (>=1.5.1)", "sphinx-rtd-theme", "nbsphinx (>=0.2.12)", "ipython"] +serve = ["tornado (>=4.0)"] +test = ["pytest", "pytest-cov", "pytest-dependency", "ipykernel", "ipywidgets (>=7)", "pyppeteer (==0.2.2)"] +webpdf = ["pyppeteer (==0.2.2)"] + +[[package]] +name = "nbformat" +version = "5.1.3" +description = "The Jupyter Notebook format" +category = "dev" +optional = false +python-versions = ">=3.5" + +[package.dependencies] +ipython-genutils = "*" +jsonschema = ">=2.4,<2.5.0 || >2.5.0" +jupyter-core = "*" +traitlets = ">=4.1" + +[package.extras] +fast = ["fastjsonschema"] +test = ["check-manifest", "fastjsonschema", "testpath", "pytest", "pytest-cov"] + +[[package]] +name = "nest-asyncio" +version = "1.5.1" +description = "Patch asyncio to allow nested event loops" +category = "dev" +optional = false +python-versions = ">=3.5" + +[[package]] +name = "netaddr" +version = "0.8.0" +description = "A network address manipulation library for Python" +category = "main" +optional = false +python-versions = "*" + +[[package]] +name = "notebook" +version = "6.4.3" +description = "A web-based notebook environment for interactive computing" +category = "dev" +optional = false +python-versions = ">=3.6" + +[package.dependencies] +argon2-cffi = "*" +ipykernel = "*" +ipython-genutils = "*" +jinja2 = "*" +jupyter-client = ">=5.3.4" +jupyter-core = ">=4.6.1" +nbconvert = "*" +nbformat = "*" +prometheus-client = "*" +pyzmq = ">=17" +Send2Trash = ">=1.5.0" +terminado = ">=0.8.3" +tornado = ">=6.1" +traitlets = ">=4.2.1" + +[package.extras] +docs = ["sphinx", "nbsphinx", "sphinxcontrib-github-alt", "sphinx-rtd-theme", "myst-parser"] +json-logging = ["json-logging"] +test = ["pytest", "coverage", "requests", "nbval", "selenium", "pytest-cov", "requests-unixsocket"] + +[[package]] +name = "numpy" +version = "1.19.5" +description = "NumPy is the fundamental package for array computing with Python." +category = "main" +optional = false +python-versions = ">=3.6" + +[[package]] +name = "oauthlib" +version = "3.1.1" +description = "A generic, spec-compliant, thorough implementation of the OAuth request-signing logic" +category = "main" +optional = false +python-versions = ">=3.6" + +[package.extras] +rsa = ["cryptography (>=3.0.0,<4)"] +signals = ["blinker (>=1.4.0)"] +signedtoken = ["cryptography (>=3.0.0,<4)", "pyjwt (>=2.0.0,<3)"] + +[[package]] +name = "opt-einsum" +version = "3.3.0" +description = "Optimizing numpys einsum function" +category = "main" +optional = false +python-versions = ">=3.5" + +[package.dependencies] +numpy = ">=1.7" + +[package.extras] +docs = ["sphinx (==1.2.3)", "sphinxcontrib-napoleon", "sphinx-rtd-theme", "numpydoc"] +tests = ["pytest", "pytest-cov", "pytest-pep8"] + +[[package]] +name = "packaging" +version = "21.0" +description = "Core utilities for Python packages" +category = "dev" +optional = false +python-versions = ">=3.6" + +[package.dependencies] +pyparsing = ">=2.0.2" + +[[package]] +name = "pandas" +version = "1.3.2" +description = "Powerful data structures for data analysis, time series, and statistics" +category = "main" +optional = false +python-versions = ">=3.7.1" + +[package.dependencies] +numpy = ">=1.17.3" +python-dateutil = ">=2.7.3" +pytz = ">=2017.3" + +[package.extras] +test = ["hypothesis (>=3.58)", "pytest (>=6.0)", "pytest-xdist"] + +[[package]] +name = "pandocfilters" +version = "1.4.3" +description = "Utilities for writing pandoc filters in python" +category = "dev" +optional = false +python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*" + +[[package]] +name = "parsimonious" +version = "0.8.1" +description = "(Soon to be) the fastest pure-Python PEG parser I could muster" +category = "main" +optional = false +python-versions = "*" + +[package.dependencies] +six = ">=1.9.0" + +[[package]] +name = "parso" +version = "0.8.2" +description = "A Python Parser" +category = "dev" +optional = false +python-versions = ">=3.6" + +[package.extras] +qa = ["flake8 (==3.8.3)", "mypy (==0.782)"] +testing = ["docopt", "pytest (<6.0.0)"] + +[[package]] +name = "pathspec" +version = "0.9.0" +description = "Utility library for gitignore style pattern matching of file paths." +category = "main" +optional = false +python-versions = "!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*,!=3.4.*,>=2.7" + +[[package]] +name = "pexpect" +version = "4.8.0" +description = "Pexpect allows easy control of interactive console applications." +category = "dev" +optional = false +python-versions = "*" + +[package.dependencies] +ptyprocess = ">=0.5" + +[[package]] +name = "pickleshare" +version = "0.7.5" +description = "Tiny 'shelve'-like database with concurrency support" +category = "dev" +optional = false +python-versions = "*" + +[[package]] +name = "platformdirs" +version = "2.3.0" +description = "A small Python module for determining appropriate platform-specific dirs, e.g. a \"user data dir\"." +category = "main" +optional = false +python-versions = ">=3.6" + +[package.extras] +docs = ["Sphinx (>=4)", "furo (>=2021.7.5b38)", "proselint (>=0.10.2)", "sphinx-autodoc-typehints (>=1.12)"] +test = ["appdirs (==1.4.4)", "pytest (>=6)", "pytest-cov (>=2.7)", "pytest-mock (>=3.6)"] + +[[package]] +name = "pluggy" +version = "1.0.0" +description = "plugin and hook calling mechanisms for python" +category = "dev" +optional = false +python-versions = ">=3.6" + +[package.extras] +dev = ["pre-commit", "tox"] +testing = ["pytest", "pytest-benchmark"] + +[[package]] +name = "poetry-lock-package" +version = "0.4.2" +description = "Poetry lock package generator" +category = "dev" +optional = false +python-versions = ">=3.6.2,<4.0.0" + +[package.dependencies] +toml = ">=0.10.1,<0.11.0" + +[[package]] +name = "prometheus-client" +version = "0.11.0" +description = "Python client for the Prometheus monitoring system." +category = "dev" +optional = false +python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*" + +[package.extras] +twisted = ["twisted"] + +[[package]] +name = "promise" +version = "2.3" +description = "Promises/A+ implementation for Python" +category = "main" +optional = false +python-versions = "*" + +[package.dependencies] +six = "*" + +[package.extras] +test = ["pytest (>=2.7.3)", "pytest-cov", "coveralls", "futures", "pytest-benchmark", "mock"] + +[[package]] +name = "prompt-toolkit" +version = "3.0.20" +description = "Library for building powerful interactive command lines in Python" +category = "dev" +optional = false +python-versions = ">=3.6.2" + +[package.dependencies] +wcwidth = "*" + +[[package]] +name = "protobuf" +version = "3.17.3" +description = "Protocol Buffers" +category = "main" +optional = false +python-versions = "*" + +[package.dependencies] +six = ">=1.9" + +[[package]] +name = "psycopg2" +version = "2.9.1" +description = "psycopg2 - Python-PostgreSQL Database Adapter" +category = "main" +optional = false +python-versions = ">=3.6" + +[[package]] +name = "ptyprocess" +version = "0.7.0" +description = "Run a subprocess in a pseudo terminal" +category = "dev" +optional = false +python-versions = "*" + +[[package]] +name = "py" +version = "1.10.0" +description = "library with cross-python path, ini-parsing, io, code, log facilities" +category = "dev" +optional = false +python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*" + +[[package]] +name = "pyasn1" +version = "0.4.8" +description = "ASN.1 types and codecs" +category = "main" +optional = false +python-versions = "*" + +[[package]] +name = "pyasn1-modules" +version = "0.2.8" +description = "A collection of ASN.1-based protocols modules." +category = "main" +optional = false +python-versions = "*" + +[package.dependencies] +pyasn1 = ">=0.4.6,<0.5.0" + +[[package]] +name = "pycparser" +version = "2.20" +description = "C parser in Python" +category = "main" +optional = false +python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*" + +[[package]] +name = "pycryptodome" +version = "3.10.1" +description = "Cryptographic library for Python" +category = "main" +optional = false +python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*" + +[[package]] +name = "pydantic" +version = "1.8.2" +description = "Data validation and settings management using python 3.6 type hinting" +category = "main" +optional = false +python-versions = ">=3.6.1" + +[package.dependencies] +typing-extensions = ">=3.7.4.3" + +[package.extras] +dotenv = ["python-dotenv (>=0.10.4)"] +email = ["email-validator (>=1.0.3)"] + +[[package]] +name = "pygments" +version = "2.10.0" +description = "Pygments is a syntax highlighting package written in Python." +category = "dev" +optional = false +python-versions = ">=3.5" + +[[package]] +name = "pyjwt" +version = "2.1.0" +description = "JSON Web Token implementation in Python" +category = "main" +optional = false +python-versions = ">=3.6" + +[package.extras] +crypto = ["cryptography (>=3.3.1,<4.0.0)"] +dev = ["sphinx", "sphinx-rtd-theme", "zope.interface", "cryptography (>=3.3.1,<4.0.0)", "pytest (>=6.0.0,<7.0.0)", "coverage[toml] (==5.0.4)", "mypy", "pre-commit"] +docs = ["sphinx", "sphinx-rtd-theme", "zope.interface"] +tests = ["pytest (>=6.0.0,<7.0.0)", "coverage[toml] (==5.0.4)"] + +[[package]] +name = "pyparsing" +version = "2.4.7" +description = "Python parsing module" +category = "dev" +optional = false +python-versions = ">=2.6, !=3.0.*, !=3.1.*, !=3.2.*" + +[[package]] +name = "pyrsistent" +version = "0.18.0" +description = "Persistent/Functional/Immutable data structures" +category = "main" +optional = false +python-versions = ">=3.6" + +[[package]] +name = "pytest" +version = "6.2.5" +description = "pytest: simple powerful testing with Python" +category = "dev" +optional = false +python-versions = ">=3.6" + +[package.dependencies] +atomicwrites = {version = ">=1.0", markers = "sys_platform == \"win32\""} +attrs = ">=19.2.0" +colorama = {version = "*", markers = "sys_platform == \"win32\""} +iniconfig = "*" +packaging = "*" +pluggy = ">=0.12,<2.0" +py = ">=1.8.2" +toml = "*" + +[package.extras] +testing = ["argcomplete", "hypothesis (>=3.56)", "mock", "nose", "requests", "xmlschema"] + +[[package]] +name = "python-dateutil" +version = "2.8.2" +description = "Extensions to the standard Python datetime module" +category = "main" +optional = false +python-versions = "!=3.0.*,!=3.1.*,!=3.2.*,>=2.7" + +[package.dependencies] +six = ">=1.5" + +[[package]] +name = "python-multipart" +version = "0.0.5" +description = "A streaming multipart parser for Python" +category = "main" +optional = false +python-versions = "*" + +[package.dependencies] +six = ">=1.4.0" + +[[package]] +name = "pytz" +version = "2021.1" +description = "World timezone definitions, modern and historical" +category = "main" +optional = false +python-versions = "*" + +[[package]] +name = "pywin32" +version = "301" +description = "Python for Window Extensions" +category = "main" +optional = false +python-versions = "*" + +[[package]] +name = "pywinpty" +version = "1.1.3" +description = "Pseudo terminal support for Windows from Python." +category = "dev" +optional = false +python-versions = ">=3.6" + +[[package]] +name = "pyyaml" +version = "5.4.1" +description = "YAML parser and emitter for Python" +category = "main" +optional = false +python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*, !=3.5.*" + +[[package]] +name = "pyzmq" +version = "22.2.1" +description = "Python bindings for 0MQ" +category = "dev" +optional = false +python-versions = ">=3.6" + +[package.dependencies] +cffi = {version = "*", markers = "implementation_name == \"pypy\""} +py = {version = "*", markers = "implementation_name == \"pypy\""} + +[[package]] +name = "qtconsole" +version = "5.1.1" +description = "Jupyter Qt console" +category = "dev" +optional = false +python-versions = ">= 3.6" + +[package.dependencies] +ipykernel = ">=4.1" +ipython-genutils = "*" +jupyter-client = ">=4.1" +jupyter-core = "*" +pygments = "*" +pyzmq = ">=17.1" +qtpy = "*" +traitlets = "*" + +[package.extras] +doc = ["Sphinx (>=1.3)"] +test = ["flaky", "pytest", "pytest-qt"] + +[[package]] +name = "qtpy" +version = "1.10.0" +description = "Provides an abstraction layer on top of the various Qt bindings (PyQt5, PyQt4 and PySide) and additional custom QWidgets." +category = "dev" +optional = false +python-versions = ">=2.7,!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*,!=3.4.*,!=3.5.*" + +[[package]] +name = "regex" +version = "2021.8.28" +description = "Alternative regular expression module, to replace re." +category = "main" +optional = false +python-versions = "*" + +[[package]] +name = "requests" +version = "2.26.0" +description = "Python HTTP for Humans." +category = "main" +optional = false +python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*, !=3.5.*" + +[package.dependencies] +certifi = ">=2017.4.17" +charset-normalizer = {version = ">=2.0.0,<2.1.0", markers = "python_version >= \"3\""} +idna = {version = ">=2.5,<4", markers = "python_version >= \"3\""} +urllib3 = ">=1.21.1,<1.27" + +[package.extras] +socks = ["PySocks (>=1.5.6,!=1.5.7)", "win-inet-pton"] +use_chardet_on_py3 = ["chardet (>=3.0.2,<5)"] + +[[package]] +name = "requests-oauthlib" +version = "1.3.0" +description = "OAuthlib authentication support for Requests." +category = "main" +optional = false +python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*" + +[package.dependencies] +oauthlib = ">=3.0.0" +requests = ">=2.0.0" + +[package.extras] +rsa = ["oauthlib[signedtoken] (>=3.0.0)"] + +[[package]] +name = "rlp" +version = "2.0.1" +description = "A package for Recursive Length Prefix encoding and decoding" +category = "main" +optional = false +python-versions = "*" + +[package.dependencies] +eth-utils = ">=1.0.2,<2" + +[package.extras] +dev = ["Sphinx (>=1.6.5,<2)", "bumpversion (>=0.5.3,<1)", "flake8 (==3.4.1)", "hypothesis (==5.19.0)", "ipython", "pytest-watch (>=4.1.0,<5)", "pytest-xdist", "pytest (==5.4.3)", "setuptools (>=36.2.0)", "sphinx-rtd-theme (>=0.1.9)", "tox (>=2.9.1,<3)", "twine", "wheel"] +doc = ["Sphinx (>=1.6.5,<2)", "sphinx-rtd-theme (>=0.1.9)"] +lint = ["flake8 (==3.4.1)"] +rust-backend = ["rusty-rlp (>=0.1.15,<0.2)"] +test = ["hypothesis (==5.19.0)", "pytest (==5.4.3)", "tox (>=2.9.1,<3)"] + +[[package]] +name = "rsa" +version = "4.7.2" +description = "Pure-Python RSA implementation" +category = "main" +optional = false +python-versions = ">=3.5, <4" + +[package.dependencies] +pyasn1 = ">=0.1.3" + +[[package]] +name = "rx" +version = "1.6.1" +description = "Reactive Extensions (Rx) for Python" +category = "main" +optional = false +python-versions = "*" + +[[package]] +name = "send2trash" +version = "1.8.0" +description = "Send file to trash natively under Mac OS X, Windows and Linux." +category = "dev" +optional = false +python-versions = "*" + +[package.extras] +nativelib = ["pyobjc-framework-cocoa", "pywin32"] +objc = ["pyobjc-framework-cocoa"] +win32 = ["pywin32"] + +[[package]] +name = "six" +version = "1.15.0" +description = "Python 2 and 3 compatibility utilities" +category = "main" +optional = false +python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*" + +[[package]] +name = "sqlalchemy" +version = "1.3.24" +description = "Database Abstraction Library" +category = "main" +optional = false +python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*" + +[package.extras] +mssql = ["pyodbc"] +mssql_pymssql = ["pymssql"] +mssql_pyodbc = ["pyodbc"] +mysql = ["mysqlclient"] +oracle = ["cx-oracle"] +postgresql = ["psycopg2"] +postgresql_pg8000 = ["pg8000 (<1.16.6)"] +postgresql_psycopg2binary = ["psycopg2-binary"] +postgresql_psycopg2cffi = ["psycopg2cffi"] +pymysql = ["pymysql (<1)", "pymysql"] + +[[package]] +name = "starlette" +version = "0.14.2" +description = "The little ASGI library that shines." +category = "main" +optional = false +python-versions = ">=3.6" + +[package.extras] +full = ["aiofiles", "graphene", "itsdangerous", "jinja2", "python-multipart", "pyyaml", "requests"] + +[[package]] +name = "starlette-context" +version = "0.3.3" +description = "Access context in Starlette" +category = "main" +optional = false +python-versions = ">=3.7" + +[package.dependencies] +starlette = "*" + +[[package]] +name = "tensorboard" +version = "2.6.0" +description = "TensorBoard lets you watch Tensors Flow" +category = "main" +optional = false +python-versions = ">=3.6" + +[package.dependencies] +absl-py = ">=0.4" +google-auth = ">=1.6.3,<2" +google-auth-oauthlib = ">=0.4.1,<0.5" +grpcio = ">=1.24.3" +markdown = ">=2.6.8" +numpy = ">=1.12.0" +protobuf = ">=3.6.0" +requests = ">=2.21.0,<3" +tensorboard-data-server = ">=0.6.0,<0.7.0" +tensorboard-plugin-wit = ">=1.6.0" +werkzeug = ">=0.11.15" + +[[package]] +name = "tensorboard-data-server" +version = "0.6.1" +description = "Fast data loading for TensorBoard" +category = "main" +optional = false +python-versions = ">=3.6" + +[[package]] +name = "tensorboard-plugin-wit" +version = "1.8.0" +description = "What-If Tool TensorBoard plugin." +category = "main" +optional = false +python-versions = "*" + +[[package]] +name = "tensorflow" +version = "2.6.0" +description = "TensorFlow is an open source machine learning framework for everyone." +category = "main" +optional = false +python-versions = "*" + +[package.dependencies] +absl-py = ">=0.10,<1.0" +astunparse = ">=1.6.3,<1.7.0" +clang = ">=5.0,<6.0" +flatbuffers = ">=1.12.0,<1.13.0" +gast = "0.4.0" +google-pasta = ">=0.2,<1.0" +grpcio = ">=1.37.0,<2.0" +h5py = ">=3.1.0,<3.2.0" +keras = ">=2.6,<3.0" +keras-preprocessing = ">=1.1.2,<1.2.0" +numpy = ">=1.19.2,<1.20.0" +opt-einsum = ">=3.3.0,<3.4.0" +protobuf = ">=3.9.2" +six = ">=1.15.0,<1.16.0" +tensorboard = ">=2.6,<3.0" +tensorflow-estimator = ">=2.6,<3.0" +termcolor = ">=1.1.0,<1.2.0" +typing-extensions = ">=3.7.4,<3.8.0" +wrapt = ">=1.12.1,<1.13.0" + +[[package]] +name = "tensorflow-estimator" +version = "2.6.0" +description = "TensorFlow Estimator." +category = "main" +optional = false +python-versions = "*" + +[[package]] +name = "termcolor" +version = "1.1.0" +description = "ANSII Color formatting for output in terminal." +category = "main" +optional = false +python-versions = "*" + +[[package]] +name = "terminado" +version = "0.11.1" +description = "Tornado websocket backend for the Xterm.js Javascript terminal emulator library." +category = "dev" +optional = false +python-versions = ">=3.6" + +[package.dependencies] +ptyprocess = {version = "*", markers = "os_name != \"nt\""} +pywinpty = {version = ">=1.1.0", markers = "os_name == \"nt\""} +tornado = ">=4" + +[package.extras] +test = ["pytest"] + +[[package]] +name = "testpath" +version = "0.5.0" +description = "Test utilities for code working with files and commands" +category = "dev" +optional = false +python-versions = ">= 3.5" + +[package.extras] +test = ["pytest", "pathlib2"] + +[[package]] +name = "toml" +version = "0.10.2" +description = "Python Library for Tom's Obvious, Minimal Language" +category = "dev" +optional = false +python-versions = ">=2.6, !=3.0.*, !=3.1.*, !=3.2.*" + +[[package]] +name = "tomli" +version = "1.2.1" +description = "A lil' TOML parser" +category = "main" +optional = false +python-versions = ">=3.6" + +[[package]] +name = "toolz" +version = "0.11.1" +description = "List processing tools and functional utilities" +category = "main" +optional = false +python-versions = ">=3.5" + +[[package]] +name = "tornado" +version = "6.1" +description = "Tornado is a Python web framework and asynchronous networking library, originally developed at FriendFeed." +category = "dev" +optional = false +python-versions = ">= 3.5" + +[[package]] +name = "traitlets" +version = "5.1.0" +description = "Traitlets Python configuration system" +category = "dev" +optional = false +python-versions = ">=3.7" + +[package.extras] +test = ["pytest"] + +[[package]] +name = "transitions" +version = "0.8.8" +description = "A lightweight, object-oriented Python state machine implementation with many extensions." +category = "main" +optional = false +python-versions = "*" + +[package.dependencies] +six = "*" + +[package.extras] +diagrams = ["pygraphviz"] +test = ["pytest"] + +[[package]] +name = "typing-extensions" +version = "3.7.4.3" +description = "Backported and Experimental Type Hints for Python 3.5+" +category = "main" +optional = false +python-versions = "*" + +[[package]] +name = "urllib3" +version = "1.26.6" +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" + +[package.extras] +brotli = ["brotlipy (>=0.6.0)"] +secure = ["pyOpenSSL (>=0.14)", "cryptography (>=1.3.4)", "idna (>=2.0.0)", "certifi", "ipaddress"] +socks = ["PySocks (>=1.5.6,!=1.5.7,<2.0)"] + +[[package]] +name = "uvicorn" +version = "0.14.0" +description = "The lightning-fast ASGI server." +category = "main" +optional = false +python-versions = "*" + +[package.dependencies] +asgiref = ">=3.3.4" +click = ">=7" +h11 = ">=0.8" + +[package.extras] +standard = ["websockets (>=9.1)", "httptools (>=0.2.0,<0.3.0)", "watchgod (>=0.6)", "python-dotenv (>=0.13)", "PyYAML (>=5.1)", "uvloop (>=0.14.0,!=0.15.0,!=0.15.1)", "colorama (>=0.4)"] + +[[package]] +name = "varint" +version = "1.0.2" +description = "Simple python varint implementation" +category = "main" +optional = false +python-versions = "*" + +[[package]] +name = "wcwidth" +version = "0.2.5" +description = "Measures the displayed width of unicode strings in a terminal" +category = "dev" +optional = false +python-versions = "*" + +[[package]] +name = "web3" +version = "5.23.1" +description = "Web3.py" +category = "main" +optional = false +python-versions = ">=3.6,<4" + +[package.dependencies] +aiohttp = ">=3.7.4.post0,<4" +eth-abi = ">=2.0.0b6,<3.0.0" +eth-account = ">=0.5.5,<0.6.0" +eth-hash = {version = ">=0.2.0,<1.0.0", extras = ["pycryptodome"]} +eth-typing = ">=2.0.0,<3.0.0" +eth-utils = ">=1.9.5,<2.0.0" +hexbytes = ">=0.1.0,<1.0.0" +ipfshttpclient = "0.8.0a2" +jsonschema = ">=3.2.0,<4.0.0" +lru-dict = ">=1.1.6,<2.0.0" +protobuf = ">=3.10.0,<4" +pywin32 = {version = ">=223", markers = "platform_system == \"Windows\""} +requests = ">=2.16.0,<3.0.0" +websockets = ">=9.1,<10" + +[package.extras] +dev = ["eth-tester[py-evm] (==v0.5.0-beta.4)", "py-geth (>=3.5.0,<4)", "flake8 (==3.8.3)", "isort (>=4.2.15,<4.3.5)", "mypy (==0.812)", "mock", "sphinx-better-theme (>=0.1.4)", "click (>=5.1)", "configparser (==3.5.0)", "contextlib2 (>=0.5.4)", "py-solc (>=0.4.0)", "pytest (>=4.4.0,<5.0.0)", "sphinx (>=3.0,<4)", "sphinx-rtd-theme (>=0.1.9)", "toposort (>=1.4)", "towncrier (>=19.2.0,<20)", "urllib3", "wheel", "bumpversion", "flaky (>=3.7.0,<4)", "hypothesis (>=3.31.2,<6)", "pytest-asyncio (>=0.10.0,<0.11)", "pytest-mock (>=1.10,<2)", "pytest-pythonpath (>=0.3)", "pytest-watch (>=4.2,<5)", "pytest-xdist (>=1.29,<2)", "setuptools (>=38.6.0)", "tox (>=1.8.0)", "tqdm (>4.32,<5)", "twine (>=1.13,<2)", "pluggy (==0.13.1)", "when-changed (>=0.3.0,<0.4)"] +docs = ["mock", "sphinx-better-theme (>=0.1.4)", "click (>=5.1)", "configparser (==3.5.0)", "contextlib2 (>=0.5.4)", "py-geth (>=3.5.0,<4)", "py-solc (>=0.4.0)", "pytest (>=4.4.0,<5.0.0)", "sphinx (>=3.0,<4)", "sphinx-rtd-theme (>=0.1.9)", "toposort (>=1.4)", "towncrier (>=19.2.0,<20)", "urllib3", "wheel"] +linter = ["flake8 (==3.8.3)", "isort (>=4.2.15,<4.3.5)", "mypy (==0.812)"] +tester = ["eth-tester[py-evm] (==v0.5.0-beta.4)", "py-geth (>=3.5.0,<4)"] + +[[package]] +name = "webencodings" +version = "0.5.1" +description = "Character encoding aliases for legacy web content" +category = "dev" +optional = false +python-versions = "*" + +[[package]] +name = "websockets" +version = "9.1" +description = "An implementation of the WebSocket Protocol (RFC 6455 & 7692)" +category = "main" +optional = false +python-versions = ">=3.6.1" + +[[package]] +name = "werkzeug" +version = "2.0.1" +description = "The comprehensive WSGI web application library." +category = "main" +optional = false +python-versions = ">=3.6" + +[package.extras] +watchdog = ["watchdog"] + +[[package]] +name = "widgetsnbextension" +version = "3.5.1" +description = "IPython HTML widgets for Jupyter" +category = "dev" +optional = false +python-versions = "*" + +[package.dependencies] +notebook = ">=4.4.1" + +[[package]] +name = "wrapt" +version = "1.12.1" +description = "Module for decorators, wrappers and monkey patching." +category = "main" +optional = false +python-versions = "*" + +[[package]] +name = "yarl" +version = "1.6.3" +description = "Yet another URL library" +category = "main" +optional = false +python-versions = ">=3.6" + +[package.dependencies] +idna = ">=2.0" +multidict = ">=4.0" + +[[package]] +name = "zipp" +version = "3.5.0" +description = "Backport of pathlib-compatible object wrapper for zip files" +category = "main" +optional = false +python-versions = ">=3.6" + +[package.extras] +docs = ["sphinx", "jaraco.packaging (>=8.2)", "rst.linker (>=1.9)"] +testing = ["pytest (>=4.6)", "pytest-checkdocs (>=2.4)", "pytest-flake8", "pytest-cov", "pytest-enabler (>=1.0.1)", "jaraco.itertools", "func-timeout", "pytest-black (>=0.3.7)", "pytest-mypy"] + +[metadata] +lock-version = "1.1" +python-versions = "^3.8" +content-hash = "1d5ff04186b45acbea609c5f7cea887e2b34ecf135bee7ee423f51f7b090c4a1" + +[metadata.files] +absl-py = [ + {file = "absl-py-0.13.0.tar.gz", hash = "sha256:6953272383486044699fd0e9f00aad167a27e08ce19aae66c6c4b10e7e767793"}, + {file = "absl_py-0.13.0-py3-none-any.whl", hash = "sha256:62bd4e248ddb19d81aec8f9446b407ff37c8175c2ba88266a7afa9b4ce4a333b"}, +] +aiofiles = [ + {file = "aiofiles-0.7.0-py3-none-any.whl", hash = "sha256:c67a6823b5f23fcab0a2595a289cec7d8c863ffcb4322fb8cd6b90400aedfdbc"}, + {file = "aiofiles-0.7.0.tar.gz", hash = "sha256:a1c4fc9b2ff81568c83e21392a82f344ea9d23da906e4f6a52662764545e19d4"}, +] +aiohttp = [ + {file = "aiohttp-3.7.4.post0-cp36-cp36m-macosx_10_14_x86_64.whl", hash = "sha256:3cf75f7cdc2397ed4442594b935a11ed5569961333d49b7539ea741be2cc79d5"}, + {file = "aiohttp-3.7.4.post0-cp36-cp36m-manylinux1_i686.whl", hash = "sha256:4b302b45040890cea949ad092479e01ba25911a15e648429c7c5aae9650c67a8"}, + {file = "aiohttp-3.7.4.post0-cp36-cp36m-manylinux2014_aarch64.whl", hash = "sha256:fe60131d21b31fd1a14bd43e6bb88256f69dfc3188b3a89d736d6c71ed43ec95"}, + {file = "aiohttp-3.7.4.post0-cp36-cp36m-manylinux2014_i686.whl", hash = "sha256:393f389841e8f2dfc86f774ad22f00923fdee66d238af89b70ea314c4aefd290"}, + {file = "aiohttp-3.7.4.post0-cp36-cp36m-manylinux2014_ppc64le.whl", hash = "sha256:c6e9dcb4cb338d91a73f178d866d051efe7c62a7166653a91e7d9fb18274058f"}, + {file = "aiohttp-3.7.4.post0-cp36-cp36m-manylinux2014_s390x.whl", hash = "sha256:5df68496d19f849921f05f14f31bd6ef53ad4b00245da3195048c69934521809"}, + {file = "aiohttp-3.7.4.post0-cp36-cp36m-manylinux2014_x86_64.whl", hash = "sha256:0563c1b3826945eecd62186f3f5c7d31abb7391fedc893b7e2b26303b5a9f3fe"}, + {file = "aiohttp-3.7.4.post0-cp36-cp36m-win32.whl", hash = "sha256:3d78619672183be860b96ed96f533046ec97ca067fd46ac1f6a09cd9b7484287"}, + {file = "aiohttp-3.7.4.post0-cp36-cp36m-win_amd64.whl", hash = "sha256:f705e12750171c0ab4ef2a3c76b9a4024a62c4103e3a55dd6f99265b9bc6fcfc"}, + {file = "aiohttp-3.7.4.post0-cp37-cp37m-macosx_10_14_x86_64.whl", hash = "sha256:230a8f7e24298dea47659251abc0fd8b3c4e38a664c59d4b89cca7f6c09c9e87"}, + {file = "aiohttp-3.7.4.post0-cp37-cp37m-manylinux1_i686.whl", hash = "sha256:2e19413bf84934d651344783c9f5e22dee452e251cfd220ebadbed2d9931dbf0"}, + {file = "aiohttp-3.7.4.post0-cp37-cp37m-manylinux2014_aarch64.whl", hash = "sha256:e4b2b334e68b18ac9817d828ba44d8fcb391f6acb398bcc5062b14b2cbeac970"}, + {file = "aiohttp-3.7.4.post0-cp37-cp37m-manylinux2014_i686.whl", hash = "sha256:d012ad7911653a906425d8473a1465caa9f8dea7fcf07b6d870397b774ea7c0f"}, + {file = "aiohttp-3.7.4.post0-cp37-cp37m-manylinux2014_ppc64le.whl", hash = "sha256:40eced07f07a9e60e825554a31f923e8d3997cfc7fb31dbc1328c70826e04cde"}, + {file = "aiohttp-3.7.4.post0-cp37-cp37m-manylinux2014_s390x.whl", hash = "sha256:209b4a8ee987eccc91e2bd3ac36adee0e53a5970b8ac52c273f7f8fd4872c94c"}, + {file = "aiohttp-3.7.4.post0-cp37-cp37m-manylinux2014_x86_64.whl", hash = "sha256:14762875b22d0055f05d12abc7f7d61d5fd4fe4642ce1a249abdf8c700bf1fd8"}, + {file = "aiohttp-3.7.4.post0-cp37-cp37m-win32.whl", hash = "sha256:7615dab56bb07bff74bc865307aeb89a8bfd9941d2ef9d817b9436da3a0ea54f"}, + {file = "aiohttp-3.7.4.post0-cp37-cp37m-win_amd64.whl", hash = "sha256:d9e13b33afd39ddeb377eff2c1c4f00544e191e1d1dee5b6c51ddee8ea6f0cf5"}, + {file = "aiohttp-3.7.4.post0-cp38-cp38-macosx_10_14_x86_64.whl", hash = "sha256:547da6cacac20666422d4882cfcd51298d45f7ccb60a04ec27424d2f36ba3eaf"}, + {file = "aiohttp-3.7.4.post0-cp38-cp38-manylinux1_i686.whl", hash = "sha256:af9aa9ef5ba1fd5b8c948bb11f44891968ab30356d65fd0cc6707d989cd521df"}, + {file = "aiohttp-3.7.4.post0-cp38-cp38-manylinux2014_aarch64.whl", hash = "sha256:64322071e046020e8797117b3658b9c2f80e3267daec409b350b6a7a05041213"}, + {file = "aiohttp-3.7.4.post0-cp38-cp38-manylinux2014_i686.whl", hash = "sha256:bb437315738aa441251214dad17428cafda9cdc9729499f1d6001748e1d432f4"}, + {file = "aiohttp-3.7.4.post0-cp38-cp38-manylinux2014_ppc64le.whl", hash = "sha256:e54962802d4b8b18b6207d4a927032826af39395a3bd9196a5af43fc4e60b009"}, + {file = "aiohttp-3.7.4.post0-cp38-cp38-manylinux2014_s390x.whl", hash = "sha256:a00bb73540af068ca7390e636c01cbc4f644961896fa9363154ff43fd37af2f5"}, + {file = "aiohttp-3.7.4.post0-cp38-cp38-manylinux2014_x86_64.whl", hash = "sha256:79ebfc238612123a713a457d92afb4096e2148be17df6c50fb9bf7a81c2f8013"}, + {file = "aiohttp-3.7.4.post0-cp38-cp38-win32.whl", hash = "sha256:515dfef7f869a0feb2afee66b957cc7bbe9ad0cdee45aec7fdc623f4ecd4fb16"}, + {file = "aiohttp-3.7.4.post0-cp38-cp38-win_amd64.whl", hash = "sha256:114b281e4d68302a324dd33abb04778e8557d88947875cbf4e842c2c01a030c5"}, + {file = "aiohttp-3.7.4.post0-cp39-cp39-macosx_10_14_x86_64.whl", hash = "sha256:7b18b97cf8ee5452fa5f4e3af95d01d84d86d32c5e2bfa260cf041749d66360b"}, + {file = "aiohttp-3.7.4.post0-cp39-cp39-manylinux1_i686.whl", hash = "sha256:15492a6368d985b76a2a5fdd2166cddfea5d24e69eefed4630cbaae5c81d89bd"}, + {file = "aiohttp-3.7.4.post0-cp39-cp39-manylinux2014_aarch64.whl", hash = "sha256:bdb230b4943891321e06fc7def63c7aace16095be7d9cf3b1e01be2f10fba439"}, + {file = "aiohttp-3.7.4.post0-cp39-cp39-manylinux2014_i686.whl", hash = "sha256:cffe3ab27871bc3ea47df5d8f7013945712c46a3cc5a95b6bee15887f1675c22"}, + {file = "aiohttp-3.7.4.post0-cp39-cp39-manylinux2014_ppc64le.whl", hash = "sha256:f881853d2643a29e643609da57b96d5f9c9b93f62429dcc1cbb413c7d07f0e1a"}, + {file = "aiohttp-3.7.4.post0-cp39-cp39-manylinux2014_s390x.whl", hash = "sha256:a5ca29ee66f8343ed336816c553e82d6cade48a3ad702b9ffa6125d187e2dedb"}, + {file = "aiohttp-3.7.4.post0-cp39-cp39-manylinux2014_x86_64.whl", hash = "sha256:17c073de315745a1510393a96e680d20af8e67e324f70b42accbd4cb3315c9fb"}, + {file = "aiohttp-3.7.4.post0-cp39-cp39-win32.whl", hash = "sha256:932bb1ea39a54e9ea27fc9232163059a0b8855256f4052e776357ad9add6f1c9"}, + {file = "aiohttp-3.7.4.post0-cp39-cp39-win_amd64.whl", hash = "sha256:02f46fc0e3c5ac58b80d4d56eb0a7c7d97fcef69ace9326289fb9f1955e65cfe"}, + {file = "aiohttp-3.7.4.post0.tar.gz", hash = "sha256:493d3299ebe5f5a7c66b9819eacdcfbbaaf1a8e84911ddffcdc48888497afecf"}, +] +alembic = [ + {file = "alembic-1.7.1-py3-none-any.whl", hash = "sha256:25f996b7408b11493d6a2d669fd9d2ff8d87883fe7434182bc7669d6caa526ab"}, + {file = "alembic-1.7.1.tar.gz", hash = "sha256:aea964d3dcc9c205b8759e4e9c1c3935ea3afeee259bffd7ed8414f8085140fb"}, +] +appdirs = [ + {file = "appdirs-1.4.4-py2.py3-none-any.whl", hash = "sha256:a841dacd6b99318a741b166adb07e19ee71a274450e68237b4650ca1055ab128"}, + {file = "appdirs-1.4.4.tar.gz", hash = "sha256:7d5d0167b2b1ba821647616af46a749d1c653740dd0d2415100fe26e27afdf41"}, +] +appnope = [ + {file = "appnope-0.1.2-py2.py3-none-any.whl", hash = "sha256:93aa393e9d6c54c5cd570ccadd8edad61ea0c4b9ea7a01409020c9aa019eb442"}, + {file = "appnope-0.1.2.tar.gz", hash = "sha256:dd83cd4b5b460958838f6eb3000c660b1f9caf2a5b1de4264e941512f603258a"}, +] +argon2-cffi = [ + {file = "argon2-cffi-21.1.0.tar.gz", hash = "sha256:f710b61103d1a1f692ca3ecbd1373e28aa5e545ac625ba067ff2feca1b2bb870"}, + {file = "argon2_cffi-21.1.0-cp35-abi3-macosx_10_14_x86_64.whl", hash = "sha256:217b4f0f853ccbbb5045242946ad2e162e396064575860141b71a85eb47e475a"}, + {file = "argon2_cffi-21.1.0-cp35-abi3-manylinux_2_5_x86_64.manylinux1_x86_64.whl", hash = "sha256:fa7e7d1fc22514a32b1761fdfa1882b6baa5c36bb3ef557bdd69e6fc9ba14a41"}, + {file = "argon2_cffi-21.1.0-cp35-abi3-win32.whl", hash = "sha256:e4d8f0ae1524b7b0372a3e574a2561cbdddb3fdb6c28b70a72868189bda19659"}, + {file = "argon2_cffi-21.1.0-cp35-abi3-win_amd64.whl", hash = "sha256:65213a9174320a1aee03fe826596e0620783966b49eb636955958b3074e87ff9"}, + {file = "argon2_cffi-21.1.0-pp36-pypy36_pp73-macosx_10_7_x86_64.whl", hash = "sha256:245f64a203012b144b7b8c8ea6d468cb02b37caa5afee5ba4a10c80599334f6a"}, + {file = "argon2_cffi-21.1.0-pp36-pypy36_pp73-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:4ad152c418f7eb640eac41ac815534e6aa61d1624530b8e7779114ecfbf327f8"}, + {file = "argon2_cffi-21.1.0-pp36-pypy36_pp73-win32.whl", hash = "sha256:bc513db2283c385ea4da31a2cd039c33380701f376f4edd12fe56db118a3b21a"}, + {file = "argon2_cffi-21.1.0-pp37-pypy37_pp73-macosx_10_7_x86_64.whl", hash = "sha256:c7a7c8cc98ac418002090e4add5bebfff1b915ea1cb459c578cd8206fef10378"}, + {file = "argon2_cffi-21.1.0-pp37-pypy37_pp73-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:165cadae5ac1e26644f5ade3bd9c18d89963be51d9ea8817bd671006d7909057"}, + {file = "argon2_cffi-21.1.0-pp37-pypy37_pp73-win_amd64.whl", hash = "sha256:566ffb581bbd9db5562327aee71b2eda24a1c15b23a356740abe3c011bbe0dcb"}, +] +asgiref = [ + {file = "asgiref-3.4.1-py3-none-any.whl", hash = "sha256:ffc141aa908e6f175673e7b1b3b7af4fdb0ecb738fc5c8b88f69f055c2415214"}, + {file = "asgiref-3.4.1.tar.gz", hash = "sha256:4ef1ab46b484e3c706329cedeff284a5d40824200638503f5768edb6de7d58e9"}, +] +astunparse = [ + {file = "astunparse-1.6.3-py2.py3-none-any.whl", hash = "sha256:c2652417f2c8b5bb325c885ae329bdf3f86424075c4fd1a128674bc6fba4b8e8"}, + {file = "astunparse-1.6.3.tar.gz", hash = "sha256:5ad93a8456f0d084c3456d059fd9a92cce667963232cbf763eac3bc5b7940872"}, +] +async-timeout = [ + {file = "async-timeout-3.0.1.tar.gz", hash = "sha256:0c3c816a028d47f659d6ff5c745cb2acf1f966da1fe5c19c77a70282b25f4c5f"}, + {file = "async_timeout-3.0.1-py3-none-any.whl", hash = "sha256:4291ca197d287d274d0b6cb5d6f8f8f82d434ed288f962539ff18cc9012f9ea3"}, +] +asyncpg = [ + {file = "asyncpg-0.24.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:c4fc0205fe4ddd5aeb3dfdc0f7bafd43411181e1f5650189608e5971cceacff1"}, + {file = "asyncpg-0.24.0-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:a7095890c96ba36f9f668eb552bb020dddb44f8e73e932f8573efc613ee83843"}, + {file = "asyncpg-0.24.0-cp310-cp310-win_amd64.whl", hash = "sha256:8ff5073d4b654e34bd5eaadc01dc4d68b8a9609084d835acd364cd934190a08d"}, + {file = "asyncpg-0.24.0-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:e36c6806883786b19551bb70a4882561f31135dc8105a59662e0376cf5b2cbc5"}, + {file = "asyncpg-0.24.0-cp37-cp37m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:ddffcb85227bf39cd1bedd4603e0082b243cf3b14ced64dce506a15b05232b83"}, + {file = "asyncpg-0.24.0-cp37-cp37m-win_amd64.whl", hash = "sha256:41704c561d354bef01353835a7846e5606faabbeb846214dfcf666cf53319f18"}, + {file = "asyncpg-0.24.0-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:29ef6ae0a617fc13cc2ac5dc8e9b367bb83cba220614b437af9b67766f4b6b20"}, + {file = "asyncpg-0.24.0-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:eed43abc6ccf1dc02e0d0efc06ce46a411362f3358847c6b0ec9a43426f91ece"}, + {file = "asyncpg-0.24.0-cp38-cp38-win_amd64.whl", hash = "sha256:129d501f3d30616afd51eb8d3142ef51ba05374256bd5834cec3ef4956a9b317"}, + {file = "asyncpg-0.24.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:a458fc69051fbb67d995fdda46d75a012b5d6200f91e17d23d4751482640ed4c"}, + {file = "asyncpg-0.24.0-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:556b0e92e2b75dc028b3c4bc9bd5162ddf0053b856437cf1f04c97f9c6837d03"}, + {file = "asyncpg-0.24.0-cp39-cp39-win_amd64.whl", hash = "sha256:a738f4807c853623d3f93f0fea11f61be6b0e5ca16ea8aeb42c2c7ee742aa853"}, + {file = "asyncpg-0.24.0.tar.gz", hash = "sha256:dd2fa063c3344823487d9ddccb40802f02622ddf8bf8a6cc53885ee7a2c1c0c6"}, +] +atomicwrites = [ + {file = "atomicwrites-1.4.0-py2.py3-none-any.whl", hash = "sha256:6d1784dea7c0c8d4a5172b6c620f40b6e4cbfdf96d783691f2e1302a7b88e197"}, + {file = "atomicwrites-1.4.0.tar.gz", hash = "sha256:ae70396ad1a434f9c7046fd2dd196fc04b12f9e91ffb859164193be8b6168a7a"}, +] +attrs = [ + {file = "attrs-21.2.0-py2.py3-none-any.whl", hash = "sha256:149e90d6d8ac20db7a955ad60cf0e6881a3f20d37096140088356da6c716b0b1"}, + {file = "attrs-21.2.0.tar.gz", hash = "sha256:ef6aaac3ca6cd92904cdd0d83f629a15f18053ec84e6432106f7a4d04ae4f5fb"}, +] +backcall = [ + {file = "backcall-0.2.0-py2.py3-none-any.whl", hash = "sha256:fbbce6a29f263178a1f7915c1940bde0ec2b2a967566fe1c65c1dfb7422bd255"}, + {file = "backcall-0.2.0.tar.gz", hash = "sha256:5cbdbf27be5e7cfadb448baf0aa95508f91f2bbc6c6437cd9cd06e2a4c215e1e"}, +] +backoff = [ + {file = "backoff-1.11.1-py2.py3-none-any.whl", hash = "sha256:61928f8fa48d52e4faa81875eecf308eccfb1016b018bb6bd21e05b5d90a96c5"}, + {file = "backoff-1.11.1.tar.gz", hash = "sha256:ccb962a2378418c667b3c979b504fdeb7d9e0d29c0579e3b13b86467177728cb"}, +] +base58 = [ + {file = "base58-2.1.0-py3-none-any.whl", hash = "sha256:8225891d501b68c843ffe30b86371f844a21c6ba00da76f52f9b998ba771fb48"}, + {file = "base58-2.1.0.tar.gz", hash = "sha256:171a547b4a3c61e1ae3807224a6f7aec75e364c4395e7562649d7335768001a2"}, +] +bitarray = [ + {file = "bitarray-1.2.2.tar.gz", hash = "sha256:27a69ffcee3b868abab3ce8b17c69e02b63e722d4d64ffd91d659f81e9984954"}, +] +black = [ + {file = "black-21.7b0-py3-none-any.whl", hash = "sha256:1c7aa6ada8ee864db745b22790a32f94b2795c253a75d6d9b5e439ff10d23116"}, + {file = "black-21.7b0.tar.gz", hash = "sha256:c8373c6491de9362e39271630b65b964607bc5c79c83783547d76c839b3aa219"}, + {file = "black-21.8b0-py3-none-any.whl", hash = "sha256:2a0f9a8c2b2a60dbcf1ccb058842fb22bdbbcb2f32c6cc02d9578f90b92ce8b7"}, + {file = "black-21.8b0.tar.gz", hash = "sha256:570608d28aa3af1792b98c4a337dbac6367877b47b12b88ab42095cfc1a627c2"}, +] +bleach = [ + {file = "bleach-4.1.0-py2.py3-none-any.whl", hash = "sha256:4d2651ab93271d1129ac9cbc679f524565cc8a1b791909c4a51eac4446a15994"}, + {file = "bleach-4.1.0.tar.gz", hash = "sha256:0900d8b37eba61a802ee40ac0061f8c2b5dee29c1927dd1d233e075ebf5a71da"}, +] +cachetools = [ + {file = "cachetools-4.2.2-py3-none-any.whl", hash = "sha256:2cc0b89715337ab6dbba85b5b50effe2b0c74e035d83ee8ed637cf52f12ae001"}, + {file = "cachetools-4.2.2.tar.gz", hash = "sha256:61b5ed1e22a0924aed1d23b478f37e8d52549ff8a961de2909c69bf950020cff"}, +] +certifi = [ + {file = "certifi-2021.5.30-py2.py3-none-any.whl", hash = "sha256:50b1e4f8446b06f41be7dd6338db18e0990601dce795c2b1686458aa7e8fa7d8"}, + {file = "certifi-2021.5.30.tar.gz", hash = "sha256:2bbf76fd432960138b3ef6dda3dde0544f27cbf8546c458e60baf371917ba9ee"}, +] +cffi = [ + {file = "cffi-1.14.6-cp27-cp27m-macosx_10_9_x86_64.whl", hash = "sha256:22b9c3c320171c108e903d61a3723b51e37aaa8c81255b5e7ce102775bd01e2c"}, + {file = "cffi-1.14.6-cp27-cp27m-manylinux1_i686.whl", hash = "sha256:f0c5d1acbfca6ebdd6b1e3eded8d261affb6ddcf2186205518f1428b8569bb99"}, + {file = "cffi-1.14.6-cp27-cp27m-manylinux1_x86_64.whl", hash = "sha256:99f27fefe34c37ba9875f224a8f36e31d744d8083e00f520f133cab79ad5e819"}, + {file = "cffi-1.14.6-cp27-cp27m-win32.whl", hash = "sha256:55af55e32ae468e9946f741a5d51f9896da6b9bf0bbdd326843fec05c730eb20"}, + {file = "cffi-1.14.6-cp27-cp27m-win_amd64.whl", hash = "sha256:7bcac9a2b4fdbed2c16fa5681356d7121ecabf041f18d97ed5b8e0dd38a80224"}, + {file = "cffi-1.14.6-cp27-cp27mu-manylinux1_i686.whl", hash = "sha256:ed38b924ce794e505647f7c331b22a693bee1538fdf46b0222c4717b42f744e7"}, + {file = "cffi-1.14.6-cp27-cp27mu-manylinux1_x86_64.whl", hash = "sha256:e22dcb48709fc51a7b58a927391b23ab37eb3737a98ac4338e2448bef8559b33"}, + {file = "cffi-1.14.6-cp35-cp35m-macosx_10_9_x86_64.whl", hash = "sha256:aedb15f0a5a5949ecb129a82b72b19df97bbbca024081ed2ef88bd5c0a610534"}, + {file = "cffi-1.14.6-cp35-cp35m-manylinux1_i686.whl", hash = "sha256:48916e459c54c4a70e52745639f1db524542140433599e13911b2f329834276a"}, + {file = "cffi-1.14.6-cp35-cp35m-manylinux1_x86_64.whl", hash = "sha256:f627688813d0a4140153ff532537fbe4afea5a3dffce1f9deb7f91f848a832b5"}, + {file = "cffi-1.14.6-cp35-cp35m-win32.whl", hash = "sha256:f0010c6f9d1a4011e429109fda55a225921e3206e7f62a0c22a35344bfd13cca"}, + {file = "cffi-1.14.6-cp35-cp35m-win_amd64.whl", hash = "sha256:57e555a9feb4a8460415f1aac331a2dc833b1115284f7ded7278b54afc5bd218"}, + {file = "cffi-1.14.6-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:e8c6a99be100371dbb046880e7a282152aa5d6127ae01783e37662ef73850d8f"}, + {file = "cffi-1.14.6-cp36-cp36m-manylinux1_i686.whl", hash = "sha256:19ca0dbdeda3b2615421d54bef8985f72af6e0c47082a8d26122adac81a95872"}, + {file = "cffi-1.14.6-cp36-cp36m-manylinux1_x86_64.whl", hash = "sha256:d950695ae4381ecd856bcaf2b1e866720e4ab9a1498cba61c602e56630ca7195"}, + {file = "cffi-1.14.6-cp36-cp36m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e9dc245e3ac69c92ee4c167fbdd7428ec1956d4e754223124991ef29eb57a09d"}, + {file = "cffi-1.14.6-cp36-cp36m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:a8661b2ce9694ca01c529bfa204dbb144b275a31685a075ce123f12331be790b"}, + {file = "cffi-1.14.6-cp36-cp36m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:b315d709717a99f4b27b59b021e6207c64620790ca3e0bde636a6c7f14618abb"}, + {file = "cffi-1.14.6-cp36-cp36m-win32.whl", hash = "sha256:80b06212075346b5546b0417b9f2bf467fea3bfe7352f781ffc05a8ab24ba14a"}, + {file = "cffi-1.14.6-cp36-cp36m-win_amd64.whl", hash = "sha256:a9da7010cec5a12193d1af9872a00888f396aba3dc79186604a09ea3ee7c029e"}, + {file = "cffi-1.14.6-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:4373612d59c404baeb7cbd788a18b2b2a8331abcc84c3ba40051fcd18b17a4d5"}, + {file = "cffi-1.14.6-cp37-cp37m-manylinux1_i686.whl", hash = "sha256:f10afb1004f102c7868ebfe91c28f4a712227fe4cb24974350ace1f90e1febbf"}, + {file = "cffi-1.14.6-cp37-cp37m-manylinux1_x86_64.whl", hash = "sha256:fd4305f86f53dfd8cd3522269ed7fc34856a8ee3709a5e28b2836b2db9d4cd69"}, + {file = "cffi-1.14.6-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:6d6169cb3c6c2ad50db5b868db6491a790300ade1ed5d1da29289d73bbe40b56"}, + {file = "cffi-1.14.6-cp37-cp37m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:5d4b68e216fc65e9fe4f524c177b54964af043dde734807586cf5435af84045c"}, + {file = "cffi-1.14.6-cp37-cp37m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:33791e8a2dc2953f28b8d8d300dde42dd929ac28f974c4b4c6272cb2955cb762"}, + {file = "cffi-1.14.6-cp37-cp37m-win32.whl", hash = "sha256:0c0591bee64e438883b0c92a7bed78f6290d40bf02e54c5bf0978eaf36061771"}, + {file = "cffi-1.14.6-cp37-cp37m-win_amd64.whl", hash = "sha256:8eb687582ed7cd8c4bdbff3df6c0da443eb89c3c72e6e5dcdd9c81729712791a"}, + {file = "cffi-1.14.6-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:ba6f2b3f452e150945d58f4badd92310449876c4c954836cfb1803bdd7b422f0"}, + {file = "cffi-1.14.6-cp38-cp38-manylinux1_i686.whl", hash = "sha256:64fda793737bc4037521d4899be780534b9aea552eb673b9833b01f945904c2e"}, + {file = "cffi-1.14.6-cp38-cp38-manylinux1_x86_64.whl", hash = "sha256:9f3e33c28cd39d1b655ed1ba7247133b6f7fc16fa16887b120c0c670e35ce346"}, + {file = "cffi-1.14.6-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:26bb2549b72708c833f5abe62b756176022a7b9a7f689b571e74c8478ead51dc"}, + {file = "cffi-1.14.6-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:eb687a11f0a7a1839719edd80f41e459cc5366857ecbed383ff376c4e3cc6afd"}, + {file = "cffi-1.14.6-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:d2ad4d668a5c0645d281dcd17aff2be3212bc109b33814bbb15c4939f44181cc"}, + {file = "cffi-1.14.6-cp38-cp38-win32.whl", hash = "sha256:487d63e1454627c8e47dd230025780e91869cfba4c753a74fda196a1f6ad6548"}, + {file = "cffi-1.14.6-cp38-cp38-win_amd64.whl", hash = "sha256:c33d18eb6e6bc36f09d793c0dc58b0211fccc6ae5149b808da4a62660678b156"}, + {file = "cffi-1.14.6-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:06c54a68935738d206570b20da5ef2b6b6d92b38ef3ec45c5422c0ebaf338d4d"}, + {file = "cffi-1.14.6-cp39-cp39-manylinux1_i686.whl", hash = "sha256:f174135f5609428cc6e1b9090f9268f5c8935fddb1b25ccb8255a2d50de6789e"}, + {file = "cffi-1.14.6-cp39-cp39-manylinux1_x86_64.whl", hash = "sha256:f3ebe6e73c319340830a9b2825d32eb6d8475c1dac020b4f0aa774ee3b898d1c"}, + {file = "cffi-1.14.6-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3c8d896becff2fa653dc4438b54a5a25a971d1f4110b32bd3068db3722c80202"}, + {file = "cffi-1.14.6-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:4922cd707b25e623b902c86188aca466d3620892db76c0bdd7b99a3d5e61d35f"}, + {file = "cffi-1.14.6-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:c9e005e9bd57bc987764c32a1bee4364c44fdc11a3cc20a40b93b444984f2b87"}, + {file = "cffi-1.14.6-cp39-cp39-win32.whl", hash = "sha256:eb9e2a346c5238a30a746893f23a9535e700f8192a68c07c0258e7ece6ff3728"}, + {file = "cffi-1.14.6-cp39-cp39-win_amd64.whl", hash = "sha256:818014c754cd3dba7229c0f5884396264d51ffb87ec86e927ef0be140bfdb0d2"}, + {file = "cffi-1.14.6.tar.gz", hash = "sha256:c9a875ce9d7fe32887784274dd533c57909b7b1dcadcc128a2ac21331a9765dd"}, +] +chardet = [ + {file = "chardet-3.0.4-py2.py3-none-any.whl", hash = "sha256:fc323ffcaeaed0e0a02bf4d117757b98aed530d9ed4531e3e15460124c106691"}, + {file = "chardet-3.0.4.tar.gz", hash = "sha256:84ab92ed1c4d4f16916e05906b6b75a6c0fb5db821cc65e70cbd64a3e2a5eaae"}, +] +charset-normalizer = [ + {file = "charset-normalizer-2.0.4.tar.gz", hash = "sha256:f23667ebe1084be45f6ae0538e4a5a865206544097e4e8bbcacf42cd02a348f3"}, + {file = "charset_normalizer-2.0.4-py3-none-any.whl", hash = "sha256:0c8911edd15d19223366a194a513099a302055a962bca2cec0f54b8b63175d8b"}, +] +clang = [ + {file = "clang-5.0-py2-none-any.whl", hash = "sha256:b9301dff507041b5019b30ae710b78b0552c1ca1d4441b8dfa93c2e85078a5f8"}, + {file = "clang-5.0.tar.gz", hash = "sha256:ceccae97eda0225a5b44d42ffd61102e248325c2865ca53e4407746464a5333a"}, +] +click = [ + {file = "click-8.0.1-py3-none-any.whl", hash = "sha256:fba402a4a47334742d782209a7c79bc448911afe1149d07bdabdf480b3e2f4b6"}, + {file = "click-8.0.1.tar.gz", hash = "sha256:8c04c11192119b1ef78ea049e0a6f0463e4c48ef00a30160c704337586f3ad7a"}, +] +colorama = [ + {file = "colorama-0.4.4-py2.py3-none-any.whl", hash = "sha256:9f47eda37229f68eee03b24b9748937c7dc3868f906e8ba69fbcbdd3bc5dc3e2"}, + {file = "colorama-0.4.4.tar.gz", hash = "sha256:5941b2b48a20143d2267e95b1c2a7603ce057ee39fd88e7329b0c292aa16869b"}, +] +cryptography = [ + {file = "cryptography-3.4.8-cp36-abi3-macosx_10_10_x86_64.whl", hash = "sha256:a00cf305f07b26c351d8d4e1af84ad7501eca8a342dedf24a7acb0e7b7406e14"}, + {file = "cryptography-3.4.8-cp36-abi3-macosx_11_0_arm64.whl", hash = "sha256:f44d141b8c4ea5eb4dbc9b3ad992d45580c1d22bf5e24363f2fbf50c2d7ae8a7"}, + {file = "cryptography-3.4.8-cp36-abi3-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:0a7dcbcd3f1913f664aca35d47c1331fce738d44ec34b7be8b9d332151b0b01e"}, + {file = "cryptography-3.4.8-cp36-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:34dae04a0dce5730d8eb7894eab617d8a70d0c97da76b905de9efb7128ad7085"}, + {file = "cryptography-3.4.8-cp36-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:1eb7bb0df6f6f583dd8e054689def236255161ebbcf62b226454ab9ec663746b"}, + {file = "cryptography-3.4.8-cp36-abi3-manylinux_2_24_x86_64.whl", hash = "sha256:9965c46c674ba8cc572bc09a03f4c649292ee73e1b683adb1ce81e82e9a6a0fb"}, + {file = "cryptography-3.4.8-cp36-abi3-win32.whl", hash = "sha256:21ca464b3a4b8d8e86ba0ee5045e103a1fcfac3b39319727bc0fc58c09c6aff7"}, + {file = "cryptography-3.4.8-cp36-abi3-win_amd64.whl", hash = "sha256:3520667fda779eb788ea00080124875be18f2d8f0848ec00733c0ec3bb8219fc"}, + {file = "cryptography-3.4.8-pp36-pypy36_pp73-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:d2a6e5ef66503da51d2110edf6c403dc6b494cc0082f85db12f54e9c5d4c3ec5"}, + {file = "cryptography-3.4.8-pp36-pypy36_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a305600e7a6b7b855cd798e00278161b681ad6e9b7eca94c721d5f588ab212af"}, + {file = "cryptography-3.4.8-pp36-pypy36_pp73-manylinux_2_24_x86_64.whl", hash = "sha256:3fa3a7ccf96e826affdf1a0a9432be74dc73423125c8f96a909e3835a5ef194a"}, + {file = "cryptography-3.4.8-pp37-pypy37_pp73-macosx_10_10_x86_64.whl", hash = "sha256:d9ec0e67a14f9d1d48dd87a2531009a9b251c02ea42851c060b25c782516ff06"}, + {file = "cryptography-3.4.8-pp37-pypy37_pp73-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:5b0fbfae7ff7febdb74b574055c7466da334a5371f253732d7e2e7525d570498"}, + {file = "cryptography-3.4.8-pp37-pypy37_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:94fff993ee9bc1b2440d3b7243d488c6a3d9724cc2b09cdb297f6a886d040ef7"}, + {file = "cryptography-3.4.8-pp37-pypy37_pp73-manylinux_2_24_x86_64.whl", hash = "sha256:8695456444f277af73a4877db9fc979849cd3ee74c198d04fc0776ebc3db52b9"}, + {file = "cryptography-3.4.8-pp37-pypy37_pp73-win_amd64.whl", hash = "sha256:cd65b60cfe004790c795cc35f272e41a3df4631e2fb6b35aa7ac6ef2859d554e"}, + {file = "cryptography-3.4.8.tar.gz", hash = "sha256:94cc5ed4ceaefcbe5bf38c8fba6a21fc1d365bb8fb826ea1688e3370b2e24a1c"}, +] +cytoolz = [ + {file = "cytoolz-0.11.0-cp35-cp35m-macosx_10_6_x86_64.whl", hash = "sha256:c50051c02b23823209d6b0e8f7b2b37371312da50ca78165871dc6fed7bd37df"}, + {file = "cytoolz-0.11.0-cp35-cp35m-manylinux1_x86_64.whl", hash = "sha256:140eaadcd86216d4a185db3a37396ee80dd2edc6e490ba37a3d7c1b17a124078"}, + {file = "cytoolz-0.11.0-cp35-cp35m-manylinux2010_x86_64.whl", hash = "sha256:c183237f4f0bac53238588e3567c0287130dd9ed6b6b880579a5cca960a89f54"}, + {file = "cytoolz-0.11.0-cp35-cp35m-manylinux2014_x86_64.whl", hash = "sha256:6cba0572e3ad187e0ea0ddd20bb9c6aad794c23d997ed2b2aa2bbd109fe61f9f"}, + {file = "cytoolz-0.11.0-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:c7ed490f7f5c069a5082b73803ff4595f12ed0eb6b52ffa5ffe15d532acb71ed"}, + {file = "cytoolz-0.11.0-cp36-cp36m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e2e7cbfec2681e8acfd0013e9581905f251455d411457a6f475ba1870d1685fc"}, + {file = "cytoolz-0.11.0-cp36-cp36m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:596a40ce920dd6cdab42d3dec5a4e8bb0bf258bb79426a4ed7658a27c214941b"}, + {file = "cytoolz-0.11.0-cp36-cp36m-win_amd64.whl", hash = "sha256:477f71b8b2c6fdd97aa3a421ba0cfd04b22ffed1b22dda3fea06db2756ee7097"}, + {file = "cytoolz-0.11.0-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:5692a100d657f9bc2fede44ff41649c0c577f251bc0bd06c699c177235a0f81c"}, + {file = "cytoolz-0.11.0-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8893b54f8d8d1bbc5a22dc4989d9b3eb269dd5ee1247993158e1f9ae0fbb9c88"}, + {file = "cytoolz-0.11.0-cp37-cp37m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:84519cf4f63308b0ce39162b7a341367338953cd9fbf7edd335cbc44dcd321e9"}, + {file = "cytoolz-0.11.0-cp37-cp37m-win_amd64.whl", hash = "sha256:2f9963114029e78ddb626140cbb15b79ad0fd1563484b73fb29403a3d5bf3ed4"}, + {file = "cytoolz-0.11.0-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:c65635ad93bac9002e36d42603bd87514e8ea932910158054b409ceee05ff4fe"}, + {file = "cytoolz-0.11.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a6e95de2fe891075f71edb0a56701eeaae04d43f44470c24d45e89f1ea801e85"}, + {file = "cytoolz-0.11.0-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:b4a3eb96eda360b14fa6c7d2ce6faf684319c051f9ea620b009cb28a2878ed32"}, + {file = "cytoolz-0.11.0-cp38-cp38-win_amd64.whl", hash = "sha256:d0fdf0186201f882274db95fc5644ef34bfb0593d9db23b7343b0e6c8c000a0a"}, + {file = "cytoolz-0.11.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:f85a8e164ebbe75e77a9c8a0b91bd2a3ceb5beeb0f1c180affe75318a41df98c"}, + {file = "cytoolz-0.11.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:fb1b6bb4dee54fe62306d7330639f57a0dbb612520516b97b1c9dea5bc506634"}, + {file = "cytoolz-0.11.0-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:3159da30eaf214746215293fdba19b6b54af59b3b2ba979eb9e184c6c7a854d2"}, + {file = "cytoolz-0.11.0-cp39-cp39-win_amd64.whl", hash = "sha256:b61f23e9fa7cd5a87a503ab659f816858e2235926cd95b0c7e37403530d4a2d6"}, + {file = "cytoolz-0.11.0.tar.gz", hash = "sha256:c64f3590c3eb40e1548f0d3c6b2ccde70493d0b8dc6cc7f9f3fec0bb3dcd4222"}, +] +debugpy = [ + {file = "debugpy-1.4.1-cp27-cp27m-macosx_10_14_x86_64.whl", hash = "sha256:a2c5a1c49239707ed5bc8e97d8f9252fb392d9e13c79c7b477593d7dde4ae24a"}, + {file = "debugpy-1.4.1-cp27-cp27m-manylinux1_i686.whl", hash = "sha256:ebc241351791595796864a960892e1cd58627064feda939d0377edd0730bbff2"}, + {file = "debugpy-1.4.1-cp27-cp27m-manylinux1_x86_64.whl", hash = "sha256:939c94d516e6ed5433cc3ba12d9d0d8108499587158ae5f76f6db18d49e21b5b"}, + {file = "debugpy-1.4.1-cp27-cp27m-manylinux2010_i686.whl", hash = "sha256:e47c42bc1a68ead3c39d9a658d3ccf311bc45dc84f3c90fa5cb7de1796243f47"}, + {file = "debugpy-1.4.1-cp27-cp27m-manylinux2010_x86_64.whl", hash = "sha256:3756cd421be701d06490635372327ebd1ccb44b37d59682c994f6bd59e040a91"}, + {file = "debugpy-1.4.1-cp27-cp27mu-manylinux1_i686.whl", hash = "sha256:a4368c79a2c4458d5a0540381a32f8fdc02b3c9ba9dd413a49b42929297b29b3"}, + {file = "debugpy-1.4.1-cp27-cp27mu-manylinux1_x86_64.whl", hash = "sha256:c96e82d863db97d3eb498cc8e55773004724bdeaa58fb0eb7ee7d5a21d240d6a"}, + {file = "debugpy-1.4.1-cp27-cp27mu-manylinux2010_i686.whl", hash = "sha256:71e67d352cabdc6a3f4dc3e39a1d2d1e76763a2102a276904e3495ede48a9832"}, + {file = "debugpy-1.4.1-cp27-cp27mu-manylinux2010_x86_64.whl", hash = "sha256:959d39f3d724d25b7ab79278f032e33df03c6376d51b3517abaf2f8e83594ee0"}, + {file = "debugpy-1.4.1-cp35-cp35m-macosx_10_14_x86_64.whl", hash = "sha256:9d559bd0e4c288487349e0723bc70ff06390638446ee8087d4d5711486119643"}, + {file = "debugpy-1.4.1-cp35-cp35m-manylinux1_i686.whl", hash = "sha256:7376bd8f4272ab01342940bd020955f021e26954e1f0df91cfa8bf1fa4451b56"}, + {file = "debugpy-1.4.1-cp35-cp35m-manylinux1_x86_64.whl", hash = "sha256:dea62527a4a2770a0d12ce46564636d892bba29baaf5dba5bfe98bb55bf17a11"}, + {file = "debugpy-1.4.1-cp35-cp35m-manylinux2010_i686.whl", hash = "sha256:12cb415e7394c6738527cbc482935aa9414e9b4cc87dd040015d0e5cb8b4471a"}, + {file = "debugpy-1.4.1-cp35-cp35m-manylinux2010_x86_64.whl", hash = "sha256:3a6dee475102d0169732162b735878e8787500719ccb4d54b1458afe992a4c4d"}, + {file = "debugpy-1.4.1-cp35-cp35m-manylinux2014_i686.whl", hash = "sha256:7e12e94aa2c9a0017c0a84cd475063108d06e305360b69c933bde17a6a527f80"}, + {file = "debugpy-1.4.1-cp35-cp35m-manylinux2014_x86_64.whl", hash = "sha256:2bfda2721046fb43a7074d475a12adcd55a65bfd23a1ff675427b09a01ba40cc"}, + {file = "debugpy-1.4.1-cp35-cp35m-win32.whl", hash = "sha256:732ac8bb79694cb4127c08bfc6128274f3dee9e6fd2ddde7bf026a40efeb202d"}, + {file = "debugpy-1.4.1-cp35-cp35m-win_amd64.whl", hash = "sha256:bad668e9edb21199017ab31f52a05e14506ad6566110560796d2a8f258e0b819"}, + {file = "debugpy-1.4.1-cp36-cp36m-macosx_10_14_x86_64.whl", hash = "sha256:cd36e75c0f71a924f4b4cdb5f74b3321952cf636aadf70e0f85fd9cd2edfc1d0"}, + {file = "debugpy-1.4.1-cp36-cp36m-manylinux1_i686.whl", hash = "sha256:eee2224ce547d2958ffc0d63cd280a9cc6377043f32ce370cfe4ca6be4e05476"}, + {file = "debugpy-1.4.1-cp36-cp36m-manylinux1_x86_64.whl", hash = "sha256:e6711106aafc26ecb78e43c4be0a49bd0ae4a1f3e1aa502de151e38f4717b2a2"}, + {file = "debugpy-1.4.1-cp36-cp36m-manylinux2010_i686.whl", hash = "sha256:768f393ffaa66a3b3ed92b06e21912a5df3e01f18fb531bcbba2f94cad1725a7"}, + {file = "debugpy-1.4.1-cp36-cp36m-manylinux2010_x86_64.whl", hash = "sha256:ab37f189b1dd0d8420545c9f3d066bd1601a1ae85b26de38f5c1ccb96cf0b042"}, + {file = "debugpy-1.4.1-cp36-cp36m-manylinux2014_i686.whl", hash = "sha256:00f9d14da52b87e98e26f5c3c8f1937cc496915b38f8ccb7b329336b21898678"}, + {file = "debugpy-1.4.1-cp36-cp36m-manylinux2014_x86_64.whl", hash = "sha256:1bc8e835a48ef23280cbaf2b70a5a2b629b9ee79685b64d974bfb8d467f4aa67"}, + {file = "debugpy-1.4.1-cp36-cp36m-win32.whl", hash = "sha256:309909b6c85f89aea3fa10fc256b52fef3c25fee4d00e1b5f5db1ace57203a2c"}, + {file = "debugpy-1.4.1-cp36-cp36m-win_amd64.whl", hash = "sha256:67d496890d1cada5ce924cb30178684e7b82a36b80b8868beb148db54fd9e44c"}, + {file = "debugpy-1.4.1-cp37-cp37m-macosx_10_14_x86_64.whl", hash = "sha256:595170ac17567773b546d40a0ff002dc350cfcd95c9233f65e79370954fb9a01"}, + {file = "debugpy-1.4.1-cp37-cp37m-manylinux1_i686.whl", hash = "sha256:c5e771fcd12727f734caf2a10ff92966ae9857db0ccb6bebd1a4f776c54186a8"}, + {file = "debugpy-1.4.1-cp37-cp37m-manylinux1_x86_64.whl", hash = "sha256:2d4c4ab934fbe1c7095d19b3d4246afe119396b49540ca5d5ad34ef01b27bd2a"}, + {file = "debugpy-1.4.1-cp37-cp37m-manylinux2010_i686.whl", hash = "sha256:4655824321b36b353b12d1617a29c79320412f085ecabf54524603b4c0c791e8"}, + {file = "debugpy-1.4.1-cp37-cp37m-manylinux2010_x86_64.whl", hash = "sha256:399b2c60c8e67a5d30c6e4522129e8be8d484e6064286f8ba3ce857a3927312a"}, + {file = "debugpy-1.4.1-cp37-cp37m-manylinux2014_i686.whl", hash = "sha256:8e63585c372873cd88c2380c0b3c4815c724a9713f5b86d1b3a1f1ac30df079e"}, + {file = "debugpy-1.4.1-cp37-cp37m-manylinux2014_x86_64.whl", hash = "sha256:52920ccb4acdbb2a9a42e0a4d60a7bbc4a34bf16fd23c674b280f8e9a8cacbd6"}, + {file = "debugpy-1.4.1-cp37-cp37m-win32.whl", hash = "sha256:7b332ce0d1a46f0f4200d59ee78428f18301d1fb85d07402723b94e1de96951c"}, + {file = "debugpy-1.4.1-cp37-cp37m-win_amd64.whl", hash = "sha256:a19def91a0a166877c2a26b611c1ad0473ce85b1df61ae5276197375d574228b"}, + {file = "debugpy-1.4.1-cp38-cp38-macosx_10_14_x86_64.whl", hash = "sha256:9a0cd73d7a76222fbc9f9180612ccb4ad7d7f7e4f26e55ef1fbd459c0f2f5322"}, + {file = "debugpy-1.4.1-cp38-cp38-manylinux1_i686.whl", hash = "sha256:86cd13162b752664e8ef048287a6973c8fba0a71f396b31cf36394880ec2a6bf"}, + {file = "debugpy-1.4.1-cp38-cp38-manylinux1_x86_64.whl", hash = "sha256:89d53d57001e54a3854489e898c697aafb2d6bb81fca596da2400f3fd7fd397c"}, + {file = "debugpy-1.4.1-cp38-cp38-manylinux2010_i686.whl", hash = "sha256:7b4e399790a301c83ad6b153452233695b2f15450d78956a6d297859eb44d185"}, + {file = "debugpy-1.4.1-cp38-cp38-manylinux2010_x86_64.whl", hash = "sha256:fece69933d17e0918b73ddeb5e23bcf789edd2a6eb0d438b09c40d51e76b9c74"}, + {file = "debugpy-1.4.1-cp38-cp38-manylinux2014_i686.whl", hash = "sha256:4e0d57a8c35b20b4e363db943b909aa83f12594e2f34070a1db5fa9b7213336b"}, + {file = "debugpy-1.4.1-cp38-cp38-manylinux2014_x86_64.whl", hash = "sha256:f77406f33760e6f13a7ff0ac375d9c8856844b61cd95f7502b57116858f0cfe1"}, + {file = "debugpy-1.4.1-cp38-cp38-win32.whl", hash = "sha256:3d92cb2e8b4f9591f6d6e17ccf8c1a55a58857949d9a5aae0ff37b64faaa3b80"}, + {file = "debugpy-1.4.1-cp38-cp38-win_amd64.whl", hash = "sha256:ac2d1cdd3279806dab2119937c0769f11dee13166650aaa84b6700b30a845d10"}, + {file = "debugpy-1.4.1-cp39-cp39-macosx_10_14_x86_64.whl", hash = "sha256:e7e049a4e8e362183a5a5b4ad058a1543211970819d0c11011c87c3a9dec2eaf"}, + {file = "debugpy-1.4.1-cp39-cp39-manylinux1_i686.whl", hash = "sha256:cf6b26f26f97ef3033008db7b3df7233363407d7b6cacd4bc4f8e02ce8e11df4"}, + {file = "debugpy-1.4.1-cp39-cp39-manylinux1_x86_64.whl", hash = "sha256:8a2be4e5d696ad39be6c6c37dc580993d04aad7d893fd6e449e1a055d7b5dddb"}, + {file = "debugpy-1.4.1-cp39-cp39-manylinux2010_i686.whl", hash = "sha256:d89ab3bd51d6a3f13b093bc3881a827d8f6c9588d9a493bddb3b47f9d078fd1d"}, + {file = "debugpy-1.4.1-cp39-cp39-manylinux2010_x86_64.whl", hash = "sha256:f20a07ac5fb0deee9be1ad1a9a124d858a8b79c66c7ec5e1767d78aa964f86c4"}, + {file = "debugpy-1.4.1-cp39-cp39-manylinux2014_i686.whl", hash = "sha256:6bb62615b3ad3d7202b7b7eb85f3d000aa17a61303af5f11eab048c91a1f30a6"}, + {file = "debugpy-1.4.1-cp39-cp39-manylinux2014_x86_64.whl", hash = "sha256:a9f582203af34c6978bffaba77425662e949251998276e9dece113862e753459"}, + {file = "debugpy-1.4.1-cp39-cp39-win32.whl", hash = "sha256:129312b01ec46ab303a8c0667d559a0de0bed1a394cc128039b6f008f1c376b7"}, + {file = "debugpy-1.4.1-cp39-cp39-win_amd64.whl", hash = "sha256:1762908202b0b0b481ec44125edb625d136d16c4991d3a7c1310c85672ffe5ba"}, + {file = "debugpy-1.4.1-py2.py3-none-any.whl", hash = "sha256:84ff51b8b5c847d5421324ca419db1eec813a4dd2bbf19dbbbe132e2ab2b2fc6"}, + {file = "debugpy-1.4.1.zip", hash = "sha256:889316de0b8ff3732927cb058cfbd3371e4cd0002ecc170d34c755ad289c867c"}, +] +decorator = [ + {file = "decorator-5.0.9-py3-none-any.whl", hash = "sha256:6e5c199c16f7a9f0e3a61a4a54b3d27e7dad0dbdde92b944426cb20914376323"}, + {file = "decorator-5.0.9.tar.gz", hash = "sha256:72ecfba4320a893c53f9706bebb2d55c270c1e51a28789361aa93e4a21319ed5"}, +] +defusedxml = [ + {file = "defusedxml-0.7.1-py2.py3-none-any.whl", hash = "sha256:a352e7e428770286cc899e2542b6cdaedb2b4953ff269a210103ec58f6198a61"}, + {file = "defusedxml-0.7.1.tar.gz", hash = "sha256:1bb3032db185915b62d7c6209c5a8792be6a32ab2fedacc84e01b52c51aa3e69"}, +] +entrypoints = [ + {file = "entrypoints-0.3-py2.py3-none-any.whl", hash = "sha256:589f874b313739ad35be6e0cd7efde2a4e9b6fea91edcc34e58ecbb8dbe56d19"}, + {file = "entrypoints-0.3.tar.gz", hash = "sha256:c70dd71abe5a8c85e55e12c19bd91ccfeec11a6e99044204511f9ed547d48451"}, +] +eth-abi = [ + {file = "eth_abi-2.1.1-py3-none-any.whl", hash = "sha256:78df5d2758247a8f0766a7cfcea4575bcfe568c34a33e6d05a72c328a9040444"}, + {file = "eth_abi-2.1.1.tar.gz", hash = "sha256:4bb1d87bb6605823379b07f6c02c8af45df01a27cc85bd6abb7cf1446ce7d188"}, +] +eth-account = [ + {file = "eth-account-0.5.5.tar.gz", hash = "sha256:60396fedde2546bb23d3b1a4f28a959387738c9906090d2fdd01b9e663eaa829"}, + {file = "eth_account-0.5.5-py3-none-any.whl", hash = "sha256:e579a898a976ad3436e328036a0ac4bb36573561dd0773f717dba6a72c137a2c"}, +] +eth-hash = [ + {file = "eth-hash-0.3.1.tar.gz", hash = "sha256:aee46d9c43b98ac6d4ddf957cf75d4d0a5174ee814cc6b53dd6134dcedb459bf"}, + {file = "eth_hash-0.3.1-py3-none-any.whl", hash = "sha256:a3bc7f1c12eb086525999de7f83b9e7ad39740b31f0f4eccb17377ed70de24dd"}, +] +eth-keyfile = [ + {file = "eth-keyfile-0.5.1.tar.gz", hash = "sha256:939540efb503380bc30d926833e6a12b22c6750de80feef3720d79e5a79de47d"}, + {file = "eth_keyfile-0.5.1-py3-none-any.whl", hash = "sha256:70d734af17efdf929a90bb95375f43522be4ed80c3b9e0a8bca575fb11cd1159"}, +] +eth-keys = [ + {file = "eth-keys-0.3.3.tar.gz", hash = "sha256:a9a1e83e443bd369265b1a1b66dc30f6841bdbb3577ecd042e037b7b405b6cb0"}, + {file = "eth_keys-0.3.3-py3-none-any.whl", hash = "sha256:412dd5c9732b8e92af40c9c77597f4661c57eba3897aaa55e527af56a8c5ab47"}, +] +eth-rlp = [ + {file = "eth-rlp-0.2.1.tar.gz", hash = "sha256:f016f980b0ed42ee7650ba6e4e4d3c4e9aa06d8b9c6825a36d3afe5aa0187a8b"}, + {file = "eth_rlp-0.2.1-py3-none-any.whl", hash = "sha256:cc389ef8d7b6f76a98f90bcdbff1b8684b3a78f53d47e871191b50d4d6aee5a1"}, +] +eth-typing = [ + {file = "eth-typing-2.2.2.tar.gz", hash = "sha256:97ba0f83da7cf1d3668f6ed54983f21168076c552762bf5e06d4a20921877f3f"}, + {file = "eth_typing-2.2.2-py3-none-any.whl", hash = "sha256:1140c7592321dbf10d6663c46f7e43eb0e6410b011b03f14b3df3eb1f76aa9bb"}, +] +eth-utils = [ + {file = "eth-utils-1.10.0.tar.gz", hash = "sha256:bf82762a46978714190b0370265a7148c954d3f0adaa31c6f085ea375e4c61af"}, + {file = "eth_utils-1.10.0-py3-none-any.whl", hash = "sha256:74240a8c6f652d085ed3c85f5f1654203d2f10ff9062f83b3bad0a12ff321c7a"}, +] +fastapi = [ + {file = "fastapi-0.68.1-py3-none-any.whl", hash = "sha256:94d2820906c36b9b8303796fb7271337ec89c74223229e3cfcf056b5a7d59e23"}, + {file = "fastapi-0.68.1.tar.gz", hash = "sha256:644bb815bae326575c4b2842469fb83053a4b974b82fa792ff9283d17fbbd99d"}, +] +flatbuffers = [ + {file = "flatbuffers-1.12-py2.py3-none-any.whl", hash = "sha256:9e9ef47fa92625c4721036e7c4124182668dc6021d9e7c73704edd395648deb9"}, + {file = "flatbuffers-1.12.tar.gz", hash = "sha256:63bb9a722d5e373701913e226135b28a6f6ac200d5cc7b4d919fa38d73b44610"}, +] +fsspec = [ + {file = "fsspec-2021.8.1-py3-none-any.whl", hash = "sha256:30f27c059a414d1f434b14b2d0e75c8d9c3dd473ad8daeccb444d9d4069b9f03"}, + {file = "fsspec-2021.8.1.tar.gz", hash = "sha256:af125917788b77782899bbd4484d29e5407f53d2bb04cdfa025fe4931201a555"}, +] +future = [ + {file = "future-0.18.2.tar.gz", hash = "sha256:b1bead90b70cf6ec3f0710ae53a525360fa360d306a86583adc6bf83a4db537d"}, +] +gast = [ + {file = "gast-0.4.0-py3-none-any.whl", hash = "sha256:b7adcdd5adbebf1adf17378da5ba3f543684dbec47b1cda1f3997e573cd542c4"}, + {file = "gast-0.4.0.tar.gz", hash = "sha256:40feb7b8b8434785585ab224d1568b857edb18297e5a3047f1ba012bc83b42c1"}, +] +gcloud-aio-auth = [ + {file = "gcloud-aio-auth-3.6.1.tar.gz", hash = "sha256:319ba3fb51185accda26620fd53096f14177975256a48132be45d2f264e5d0c5"}, + {file = "gcloud_aio_auth-3.6.1-py2.py3-none-any.whl", hash = "sha256:1a0fe50803112c112efe07b34fae683a676cb8e16c81b9f3999c5ac40ae66bfa"}, +] +gcloud-aio-storage = [ + {file = "gcloud-aio-storage-6.1.1.tar.gz", hash = "sha256:a7b74074083280d9b42e7890e696b459b40b03c3b6e5fb43e573f2c2f5e955c3"}, + {file = "gcloud_aio_storage-6.1.1-py2.py3-none-any.whl", hash = "sha256:e0f84ee027501a5505ebddaa5831ae4243e2f651dd560f852cfaa0377de3ca57"}, +] +gcsfs = [ + {file = "gcsfs-2021.8.1-py2.py3-none-any.whl", hash = "sha256:cac536d7a9bcb08006c936ffba3879da97c89e7bf1656bc30e6c4855066f0e2e"}, + {file = "gcsfs-2021.8.1.tar.gz", hash = "sha256:93822b5cfec4f374091cfdf95133f0a51c3970c9d08f3bd6599897ad7c000f78"}, +] +gino = [ + {file = "gino-1.0.1-py3-none-any.whl", hash = "sha256:56df57cfdefbaf897a7c4897c265a0e91a8cca80716fb64f7d3cf6d501fdfb3d"}, + {file = "gino-1.0.1.tar.gz", hash = "sha256:fe4189e82fe9d20c4a5f03fc775fb91c168061c5176b4c95623caeef22316150"}, +] +gino-starlette = [ + {file = "gino-starlette-0.1.2.tar.gz", hash = "sha256:868200bdd205bd4c2ce0856861daf2b2b6cf6c9de7010fbf9a2ca36871d6b8dc"}, + {file = "gino_starlette-0.1.2-py3-none-any.whl", hash = "sha256:5f874610a50b306331fc52e6937b3febf490470ce791142f791a41f938c7c89a"}, +] +google-api-core = [ + {file = "google-api-core-2.0.1.tar.gz", hash = "sha256:d6760f21b3a064a8397916b33be7383fc169d1a3c3d7fae7b47eb92bba7892b8"}, + {file = "google_api_core-2.0.1-py2.py3-none-any.whl", hash = "sha256:b8ad41f72a70dd709dd13a08478936172aecf5f2d34a18ab378efa6d2d6ab575"}, +] +google-auth = [ + {file = "google-auth-1.35.0.tar.gz", hash = "sha256:b7033be9028c188ee30200b204ea00ed82ea1162e8ac1df4aa6ded19a191d88e"}, + {file = "google_auth-1.35.0-py2.py3-none-any.whl", hash = "sha256:997516b42ecb5b63e8d80f5632c1a61dddf41d2a4c2748057837e06e00014258"}, +] +google-auth-oauthlib = [ + {file = "google-auth-oauthlib-0.4.5.tar.gz", hash = "sha256:4ab58e6c3dc6ccf112f921fcced40e5426fba266768986ea502228488276eaba"}, + {file = "google_auth_oauthlib-0.4.5-py2.py3-none-any.whl", hash = "sha256:b5a1ce7c617d247ccb2dfbba9d4bfc734b41096803d854a2c52592ae80150a67"}, +] +google-cloud-core = [ + {file = "google-cloud-core-2.0.0.tar.gz", hash = "sha256:90ee99648ccf9e11a16781a7fc58d13e58f662b439c737d48c24ef18662c2702"}, + {file = "google_cloud_core-2.0.0-py2.py3-none-any.whl", hash = "sha256:31785d1e1d02f90ad3f1b020d4aed63db4865c3394ff7c128a296b6995eef31f"}, +] +google-cloud-storage = [ + {file = "google-cloud-storage-1.42.0.tar.gz", hash = "sha256:c1dd3d09198edcf24ec6803dd4545e867d82b998f06a68ead3b6857b1840bdae"}, + {file = "google_cloud_storage-1.42.0-py2.py3-none-any.whl", hash = "sha256:92a9c8b1a6a278c5c12877fe1a966ecd0cae327cf98c6ae50deedf1a32d6cf2b"}, +] +google-crc32c = [ + {file = "google-crc32c-1.1.3.tar.gz", hash = "sha256:519d76ab82878c649e0618b05fc2adabe79b0491bde9ca428da06ea377594936"}, + {file = "google_crc32c-1.1.3-cp36-cp36m-macosx_10_14_x86_64.whl", hash = "sha256:c5cdf5121079db2b33baddffebf5f1c5985757029284b5ccc88ed7114d179d63"}, + {file = "google_crc32c-1.1.3-cp36-cp36m-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:e47f918025018b4f5d34778d378312d4b99b9ac4cf52460110767809143f5cff"}, + {file = "google_crc32c-1.1.3-cp36-cp36m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:2032e9be71b0248e56b035675b287811f2efd96ef81660c2e97f40b670a26458"}, + {file = "google_crc32c-1.1.3-cp36-cp36m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:292c4a24c7f3d45ac053e471c2e36b900d13af8b35d843dc9b50f77f6adfb9f9"}, + {file = "google_crc32c-1.1.3-cp36-cp36m-win32.whl", hash = "sha256:0a4ed1488a100495fef0bd0e9dc6358298e2e3cff4b7fa1b583203f0c5441619"}, + {file = "google_crc32c-1.1.3-cp36-cp36m-win_amd64.whl", hash = "sha256:da570ac61913bdfa16d21a5471471fe0b5ad155f77f0542d89242f95c4b7b788"}, + {file = "google_crc32c-1.1.3-cp37-cp37m-macosx_10_14_x86_64.whl", hash = "sha256:013524fca74673d8ded31f2236d8b6c017408ce170fd2979708a5b362a065811"}, + {file = "google_crc32c-1.1.3-cp37-cp37m-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:03672ae1c1cb41b79fc6c2379aeb61e2b657fcaa4ce11871c87b22af70af9a30"}, + {file = "google_crc32c-1.1.3-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c33add3f566cf8f39026bbbd9e49cf8044d1471bce0819844280b25dac6545a4"}, + {file = "google_crc32c-1.1.3-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:5bb34e72448cfbdd41dc291eccf6359171ee72d44b0ce31198b672df03c76829"}, + {file = "google_crc32c-1.1.3-cp37-cp37m-win32.whl", hash = "sha256:0e4c2b20f2e59bd089f2bbdb5b49e9aeba9151afad487dfc28ad28d0b1741309"}, + {file = "google_crc32c-1.1.3-cp37-cp37m-win_amd64.whl", hash = "sha256:949f2e0eace8e5878c7d63a9aeef137d35fac161afe4960a929d1400a7e6941b"}, + {file = "google_crc32c-1.1.3-cp38-cp38-macosx_10_14_x86_64.whl", hash = "sha256:f009b5826341687748e47d10fc4ab29271999ff9bc206c8f0602514dc4d4fbac"}, + {file = "google_crc32c-1.1.3-cp38-cp38-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:58246c72a4d623823b93026bfb868623e1287b1364c2ba93d307891e0282b373"}, + {file = "google_crc32c-1.1.3-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:2c67aafb77e1c7fc37bffc8a7fe20b39181c4c7c2d7563ad8cf9e0e6e165922e"}, + {file = "google_crc32c-1.1.3-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d4d19af1f3e73c1f690bfb2a592b1ff24a1dc8dcfeb7cf3d7783b20570de1940"}, + {file = "google_crc32c-1.1.3-cp38-cp38-win32.whl", hash = "sha256:0484ddc264080122f1de32c765ce34f8358fd9004c8b0c4763aade57bad36350"}, + {file = "google_crc32c-1.1.3-cp38-cp38-win_amd64.whl", hash = "sha256:ff524539ec7c79a3ff04312f2fb9d780ec3741604968609e4f0e1b32cc85ee03"}, + {file = "google_crc32c-1.1.3-cp39-cp39-macosx_10_14_x86_64.whl", hash = "sha256:94c6e590260057d7a73f1b7d474e2e5d3b4367f68cfc0feeff6633534d01011d"}, + {file = "google_crc32c-1.1.3-cp39-cp39-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:d04cb334da5f05ac1003ccb01cc99f40c138ed43288a2ca139b07aaeaacf6635"}, + {file = "google_crc32c-1.1.3-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b69605a56e0aaa0205f69d8dd256bbda2a52094b40d619ad27c4ac520d2b2fa7"}, + {file = "google_crc32c-1.1.3-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e3fec4f2c39c98a3d33483edcce223dc47aa2d89f87085c3d4ff2bde42b84997"}, + {file = "google_crc32c-1.1.3-cp39-cp39-win32.whl", hash = "sha256:bbb775b81b9a4cad1c19ea42ad4082f0dae5670ad47f80a39d7ef170faec8b81"}, + {file = "google_crc32c-1.1.3-cp39-cp39-win_amd64.whl", hash = "sha256:9c41440ad996a88f1ec7717ea7f7ba4a93066e35f06766d6c5de1c5ad23cab87"}, + {file = "google_crc32c-1.1.3-pp37-pypy37_pp73-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:56358f82ca95c815aea6ffe7db2f72427a509098740429a23ba726627eb5cbe3"}, + {file = "google_crc32c-1.1.3-pp37-pypy37_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3ad1d5e5cff49e929b7e567c5d6e17d7b8f1092e90b5ee2b434451239d048832"}, + {file = "google_crc32c-1.1.3-pp37-pypy37_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8827f2116d17cce236dddad82c38c5d4ea99f24b0d938dcc73475e46988117cf"}, +] +google-pasta = [ + {file = "google-pasta-0.2.0.tar.gz", hash = "sha256:c9f2c8dfc8f96d0d5808299920721be30c9eec37f2389f28904f454565c8a16e"}, + {file = "google_pasta-0.2.0-py2-none-any.whl", hash = "sha256:4612951da876b1a10fe3960d7226f0c7682cf901e16ac06e473b267a5afa8954"}, + {file = "google_pasta-0.2.0-py3-none-any.whl", hash = "sha256:b32482794a366b5366a32c92a9a9201b107821889935a02b3e51f6b432ea84ed"}, +] +google-resumable-media = [ + {file = "google-resumable-media-2.0.0.tar.gz", hash = "sha256:094c0381734649ac939083ea3833bd239b7fba904d246342d1268984029f2167"}, + {file = "google_resumable_media-2.0.0-py2.py3-none-any.whl", hash = "sha256:c65f9e08a4fe1df532138c8f00eeafcd7fe0d4db35dff70d7428b6ea659b2888"}, +] +googleapis-common-protos = [ + {file = "googleapis-common-protos-1.53.0.tar.gz", hash = "sha256:a88ee8903aa0a81f6c3cec2d5cf62d3c8aa67c06439b0496b49048fb1854ebf4"}, + {file = "googleapis_common_protos-1.53.0-py2.py3-none-any.whl", hash = "sha256:f6d561ab8fb16b30020b940e2dd01cd80082f4762fa9f3ee670f4419b4b8dbd0"}, +] +gql = [ + {file = "gql-2.0.0-py2.py3-none-any.whl", hash = "sha256:35032ddd4bfe6b8f3169f806b022168932385d751eacc5c5f7122e0b3f4d6b88"}, + {file = "gql-2.0.0.tar.gz", hash = "sha256:fe8d3a08047f77362ddfcfddba7cae377da2dd66f5e61c59820419c9283d4fb5"}, +] +graphql-core = [ + {file = "graphql-core-2.3.2.tar.gz", hash = "sha256:aac46a9ac524c9855910c14c48fc5d60474def7f99fd10245e76608eba7af746"}, + {file = "graphql_core-2.3.2-py2.py3-none-any.whl", hash = "sha256:44c9bac4514e5e30c5a595fac8e3c76c1975cae14db215e8174c7fe995825bad"}, +] +greenlet = [ + {file = "greenlet-1.1.1-cp27-cp27m-macosx_10_14_x86_64.whl", hash = "sha256:476ba9435afaead4382fbab8f1882f75e3fb2285c35c9285abb3dd30237f9142"}, + {file = "greenlet-1.1.1-cp27-cp27m-manylinux1_x86_64.whl", hash = "sha256:44556302c0ab376e37939fd0058e1f0db2e769580d340fb03b01678d1ff25f68"}, + {file = "greenlet-1.1.1-cp27-cp27m-manylinux2010_x86_64.whl", hash = "sha256:40abb7fec4f6294225d2b5464bb6d9552050ded14a7516588d6f010e7e366dcc"}, + {file = "greenlet-1.1.1-cp27-cp27m-win32.whl", hash = "sha256:a11b6199a0b9dc868990456a2667167d0ba096c5224f6258e452bfbe5a9742c5"}, + {file = "greenlet-1.1.1-cp27-cp27m-win_amd64.whl", hash = "sha256:e22a82d2b416d9227a500c6860cf13e74060cf10e7daf6695cbf4e6a94e0eee4"}, + {file = "greenlet-1.1.1-cp27-cp27mu-manylinux1_x86_64.whl", hash = "sha256:bad269e442f1b7ffa3fa8820b3c3aa66f02a9f9455b5ba2db5a6f9eea96f56de"}, + {file = "greenlet-1.1.1-cp27-cp27mu-manylinux2010_x86_64.whl", hash = "sha256:8ddb38fb6ad96c2ef7468ff73ba5c6876b63b664eebb2c919c224261ae5e8378"}, + {file = "greenlet-1.1.1-cp310-cp310-macosx_10_14_x86_64.whl", hash = "sha256:84782c80a433d87530ae3f4b9ed58d4a57317d9918dfcc6a59115fa2d8731f2c"}, + {file = "greenlet-1.1.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ac991947ca6533ada4ce7095f0e28fe25d5b2f3266ad5b983ed4201e61596acf"}, + {file = "greenlet-1.1.1-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:5317701c7ce167205c0569c10abc4bd01c7f4cf93f642c39f2ce975fa9b78a3c"}, + {file = "greenlet-1.1.1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:4870b018ca685ff573edd56b93f00a122f279640732bb52ce3a62b73ee5c4a92"}, + {file = "greenlet-1.1.1-cp310-cp310-win_amd64.whl", hash = "sha256:990e0f5e64bcbc6bdbd03774ecb72496224d13b664aa03afd1f9b171a3269272"}, + {file = "greenlet-1.1.1-cp35-cp35m-macosx_10_14_x86_64.whl", hash = "sha256:a414f8e14aa7bacfe1578f17c11d977e637d25383b6210587c29210af995ef04"}, + {file = "greenlet-1.1.1-cp35-cp35m-manylinux1_x86_64.whl", hash = "sha256:e02780da03f84a671bb4205c5968c120f18df081236d7b5462b380fd4f0b497b"}, + {file = "greenlet-1.1.1-cp35-cp35m-manylinux2010_x86_64.whl", hash = "sha256:dfcb5a4056e161307d103bc013478892cfd919f1262c2bb8703220adcb986362"}, + {file = "greenlet-1.1.1-cp35-cp35m-win32.whl", hash = "sha256:655ab836324a473d4cd8cf231a2d6f283ed71ed77037679da554e38e606a7117"}, + {file = "greenlet-1.1.1-cp35-cp35m-win_amd64.whl", hash = "sha256:6ce9d0784c3c79f3e5c5c9c9517bbb6c7e8aa12372a5ea95197b8a99402aa0e6"}, + {file = "greenlet-1.1.1-cp36-cp36m-macosx_10_14_x86_64.whl", hash = "sha256:3fc6a447735749d651d8919da49aab03c434a300e9f0af1c886d560405840fd1"}, + {file = "greenlet-1.1.1-cp36-cp36m-manylinux1_x86_64.whl", hash = "sha256:8039f5fe8030c43cd1732d9a234fdcbf4916fcc32e21745ca62e75023e4d4649"}, + {file = "greenlet-1.1.1-cp36-cp36m-manylinux2010_x86_64.whl", hash = "sha256:fddfb31aa2ac550b938d952bca8a87f1db0f8dc930ffa14ce05b5c08d27e7fd1"}, + {file = "greenlet-1.1.1-cp36-cp36m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b97a807437b81f90f85022a9dcfd527deea38368a3979ccb49d93c9198b2c722"}, + {file = "greenlet-1.1.1-cp36-cp36m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:cf31e894dabb077a35bbe6963285d4515a387ff657bd25b0530c7168e48f167f"}, + {file = "greenlet-1.1.1-cp36-cp36m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:4eae94de9924bbb4d24960185363e614b1b62ff797c23dc3c8a7c75bbb8d187e"}, + {file = "greenlet-1.1.1-cp36-cp36m-win32.whl", hash = "sha256:c1862f9f1031b1dee3ff00f1027fcd098ffc82120f43041fe67804b464bbd8a7"}, + {file = "greenlet-1.1.1-cp36-cp36m-win_amd64.whl", hash = "sha256:9b02e6039eafd75e029d8c58b7b1f3e450ca563ef1fe21c7e3e40b9936c8d03e"}, + {file = "greenlet-1.1.1-cp37-cp37m-macosx_10_14_x86_64.whl", hash = "sha256:84488516639c3c5e5c0e52f311fff94ebc45b56788c2a3bfe9cf8e75670f4de3"}, + {file = "greenlet-1.1.1-cp37-cp37m-manylinux1_x86_64.whl", hash = "sha256:3f8fc59bc5d64fa41f58b0029794f474223693fd00016b29f4e176b3ee2cfd9f"}, + {file = "greenlet-1.1.1-cp37-cp37m-manylinux2010_x86_64.whl", hash = "sha256:3e594015a2349ec6dcceda9aca29da8dc89e85b56825b7d1f138a3f6bb79dd4c"}, + {file = "greenlet-1.1.1-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e41f72f225192d5d4df81dad2974a8943b0f2d664a2a5cfccdf5a01506f5523c"}, + {file = "greenlet-1.1.1-cp37-cp37m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:75ff270fd05125dce3303e9216ccddc541a9e072d4fc764a9276d44dee87242b"}, + {file = "greenlet-1.1.1-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:5cde7ee190196cbdc078511f4df0be367af85636b84d8be32230f4871b960687"}, + {file = "greenlet-1.1.1-cp37-cp37m-win32.whl", hash = "sha256:f253dad38605486a4590f9368ecbace95865fea0f2b66615d121ac91fd1a1563"}, + {file = "greenlet-1.1.1-cp37-cp37m-win_amd64.whl", hash = "sha256:a91ee268f059583176c2c8b012a9fce7e49ca6b333a12bbc2dd01fc1a9783885"}, + {file = "greenlet-1.1.1-cp38-cp38-macosx_10_14_x86_64.whl", hash = "sha256:34e6675167a238bede724ee60fe0550709e95adaff6a36bcc97006c365290384"}, + {file = "greenlet-1.1.1-cp38-cp38-manylinux1_x86_64.whl", hash = "sha256:bf3725d79b1ceb19e83fb1aed44095518c0fcff88fba06a76c0891cfd1f36837"}, + {file = "greenlet-1.1.1-cp38-cp38-manylinux2010_x86_64.whl", hash = "sha256:5c3b735ccf8fc8048664ee415f8af5a3a018cc92010a0d7195395059b4b39b7d"}, + {file = "greenlet-1.1.1-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e2002a59453858c7f3404690ae80f10c924a39f45f6095f18a985a1234c37334"}, + {file = "greenlet-1.1.1-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:04e1849c88aa56584d4a0a6e36af5ec7cc37993fdc1fda72b56aa1394a92ded3"}, + {file = "greenlet-1.1.1-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c8d4ed48eed7414ccb2aaaecbc733ed2a84c299714eae3f0f48db085342d5629"}, + {file = "greenlet-1.1.1-cp38-cp38-win32.whl", hash = "sha256:2f89d74b4f423e756a018832cd7a0a571e0a31b9ca59323b77ce5f15a437629b"}, + {file = "greenlet-1.1.1-cp38-cp38-win_amd64.whl", hash = "sha256:d15cb6f8706678dc47fb4e4f8b339937b04eda48a0af1cca95f180db552e7663"}, + {file = "greenlet-1.1.1-cp39-cp39-macosx_10_14_x86_64.whl", hash = "sha256:b050dbb96216db273b56f0e5960959c2b4cb679fe1e58a0c3906fa0a60c00662"}, + {file = "greenlet-1.1.1-cp39-cp39-manylinux1_x86_64.whl", hash = "sha256:6e0696525500bc8aa12eae654095d2260db4dc95d5c35af2b486eae1bf914ccd"}, + {file = "greenlet-1.1.1-cp39-cp39-manylinux2010_x86_64.whl", hash = "sha256:07e6d88242e09b399682b39f8dfa1e7e6eca66b305de1ff74ed9eb1a7d8e539c"}, + {file = "greenlet-1.1.1-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:98b491976ed656be9445b79bc57ed21decf08a01aaaf5fdabf07c98c108111f6"}, + {file = "greenlet-1.1.1-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:05e72db813c28906cdc59bd0da7c325d9b82aa0b0543014059c34c8c4ad20e16"}, + {file = "greenlet-1.1.1-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:090126004c8ab9cd0787e2acf63d79e80ab41a18f57d6448225bbfcba475034f"}, + {file = "greenlet-1.1.1-cp39-cp39-win32.whl", hash = "sha256:1796f2c283faab2b71c67e9b9aefb3f201fdfbee5cb55001f5ffce9125f63a45"}, + {file = "greenlet-1.1.1-cp39-cp39-win_amd64.whl", hash = "sha256:4adaf53ace289ced90797d92d767d37e7cdc29f13bd3830c3f0a561277a4ae83"}, + {file = "greenlet-1.1.1.tar.gz", hash = "sha256:c0f22774cd8294078bdf7392ac73cf00bfa1e5e0ed644bd064fdabc5f2a2f481"}, +] +grpcio = [ + {file = "grpcio-1.39.0-cp27-cp27m-macosx_10_10_x86_64.whl", hash = "sha256:4163e022f365406be2da78db890035463371effea172300ce5af8a768142baf3"}, + {file = "grpcio-1.39.0-cp27-cp27m-manylinux2010_i686.whl", hash = "sha256:02e8a8b41db8e13df53078355b439363e4ac46d0ac9a8a461a39e42829e2bcf8"}, + {file = "grpcio-1.39.0-cp27-cp27m-manylinux2010_x86_64.whl", hash = "sha256:050901a5baa6c4ca445e1781ef4c32d864f965ccec70c46cd5ad92d15e282c6a"}, + {file = "grpcio-1.39.0-cp27-cp27m-win32.whl", hash = "sha256:1ab44dde4e1b225d3fc873535ca6e642444433131dd2891a601b75fb46c87c11"}, + {file = "grpcio-1.39.0-cp27-cp27m-win_amd64.whl", hash = "sha256:25731b2c20a4ed51bea7e3952d5e83d408a5df32d03c7553457b2e6eb8bcb16c"}, + {file = "grpcio-1.39.0-cp27-cp27mu-manylinux2010_i686.whl", hash = "sha256:a2733994b05ee5382da1d0378f6312b72c5cb202930c7fa20c794a24e96a1a34"}, + {file = "grpcio-1.39.0-cp27-cp27mu-manylinux2010_x86_64.whl", hash = "sha256:4039645b8b5d19064766f3a6fa535f1db52a61c4d4de97a6a8945331a354d527"}, + {file = "grpcio-1.39.0-cp35-cp35m-macosx_10_10_intel.whl", hash = "sha256:7b95b3329446408e2fe6db9b310d263303fa1a94649d08ec1e1cc12506743d26"}, + {file = "grpcio-1.39.0-cp35-cp35m-manylinux2010_i686.whl", hash = "sha256:2a4308875b9b986000513c6b04c2e7424f436a127f15547036c42d3cf8289374"}, + {file = "grpcio-1.39.0-cp35-cp35m-manylinux2010_x86_64.whl", hash = "sha256:4b3fcc1878a1a5b71e1ecdfe82c74f7cd9eadaa43e25be0d67676dcec0c9d39f"}, + {file = "grpcio-1.39.0-cp35-cp35m-manylinux2014_i686.whl", hash = "sha256:6d51be522b573cec14798d4742efaa69d234bedabce122fec2d5489abb3724d4"}, + {file = "grpcio-1.39.0-cp35-cp35m-manylinux2014_x86_64.whl", hash = "sha256:43c57987e526d1b893b85099424387b22de6e3eee4ea7188443de8d657d11cc0"}, + {file = "grpcio-1.39.0-cp35-cp35m-win32.whl", hash = "sha256:cd2e39a199bcbefb3f4b9fa6677c72b0e67332915550fed3bd7c28b454bf917d"}, + {file = "grpcio-1.39.0-cp35-cp35m-win_amd64.whl", hash = "sha256:5628e7cc69079159f9465388ff21fde1e1a780139f76dd99d319119d45156f45"}, + {file = "grpcio-1.39.0-cp36-cp36m-linux_armv7l.whl", hash = "sha256:3c14e2087f809973d5ee8ca64f772a089ead0167286f3f21fdda8b6029b50abb"}, + {file = "grpcio-1.39.0-cp36-cp36m-macosx_10_10_x86_64.whl", hash = "sha256:d5a105f5a595b89a0e394e5b147430b115333d07c55efb0c0eddc96055f0d951"}, + {file = "grpcio-1.39.0-cp36-cp36m-manylinux2010_i686.whl", hash = "sha256:366b6b35b3719c5570588e21d866460c5666ae74e3509c2a5a73ca79997abdaf"}, + {file = "grpcio-1.39.0-cp36-cp36m-manylinux2010_x86_64.whl", hash = "sha256:544e1c1a133b43893e03e828c8325be5b82e20d3b0ef0ee3942d32553052a1b5"}, + {file = "grpcio-1.39.0-cp36-cp36m-manylinux2014_i686.whl", hash = "sha256:a659f7c634cacfcf14657687a9fa3265b0a1844b1c19d140f3b66aebfba1a66b"}, + {file = "grpcio-1.39.0-cp36-cp36m-manylinux2014_x86_64.whl", hash = "sha256:b0ff14dd872030e6b2fce8a6811642bd30d93833f794d3782c7e9eb2f01234cc"}, + {file = "grpcio-1.39.0-cp36-cp36m-manylinux_2_24_aarch64.whl", hash = "sha256:2a958ad794292e12d8738a06754ebaf71662e635a89098916c18715b27ca2b5b"}, + {file = "grpcio-1.39.0-cp36-cp36m-win32.whl", hash = "sha256:ed845ba6253c4032d5a01b7fb9db8fe80299e9a437e695a698751b0b191174be"}, + {file = "grpcio-1.39.0-cp36-cp36m-win_amd64.whl", hash = "sha256:b236eb4b50d83754184b248b8b1041bb1546287fff7618c4b7001b9f257bb903"}, + {file = "grpcio-1.39.0-cp37-cp37m-linux_armv7l.whl", hash = "sha256:27e2c6213fc04e71a862bacccb51f3c8e722255933f01736ace183e92d860ee6"}, + {file = "grpcio-1.39.0-cp37-cp37m-macosx_10_10_x86_64.whl", hash = "sha256:5127f4ba1f52fda28037ae465cf4b0e5fabe89d5ac1d64d15b073b46b7db5e16"}, + {file = "grpcio-1.39.0-cp37-cp37m-manylinux2010_i686.whl", hash = "sha256:a6211150765cc2343e69879dfb856718b0f7477a4618b5f9a8f6c3ee84c047c0"}, + {file = "grpcio-1.39.0-cp37-cp37m-manylinux2010_x86_64.whl", hash = "sha256:691f5b3a75f072dfb7b093f46303f493b885b7a42f25a831868ffaa22ee85f9d"}, + {file = "grpcio-1.39.0-cp37-cp37m-manylinux2014_i686.whl", hash = "sha256:c8fe430add656b92419f6cd0680b64fbe6347c831d89a7788324f5037dfb3359"}, + {file = "grpcio-1.39.0-cp37-cp37m-manylinux2014_x86_64.whl", hash = "sha256:3cccf470fcaab65a1b0a826ff34bd7c0861eb82ed957a83c6647a983459e4ecd"}, + {file = "grpcio-1.39.0-cp37-cp37m-manylinux_2_24_aarch64.whl", hash = "sha256:2bc7eebb405aac2d7eecfaa881fd73b489f99c01470d7193b4431a6ce199b9c3"}, + {file = "grpcio-1.39.0-cp37-cp37m-win32.whl", hash = "sha256:52100d800390d58492ed1093de6faccd957de6fc29b1a0e5948c84f275d9228f"}, + {file = "grpcio-1.39.0-cp37-cp37m-win_amd64.whl", hash = "sha256:20f57c5d09a36e0d0c8fe16ee1905f4307edb1d04f6034b56320f7fbc1a1071a"}, + {file = "grpcio-1.39.0-cp38-cp38-linux_armv7l.whl", hash = "sha256:6ba6ad60009da2258cf15a72c51b7e0c2f58c8da517e97550881e488839e56c6"}, + {file = "grpcio-1.39.0-cp38-cp38-macosx_10_10_x86_64.whl", hash = "sha256:a1fb9936b86b5efdea417fe159934bcad82a6f8c6ab7d1beec4bf3a78324d975"}, + {file = "grpcio-1.39.0-cp38-cp38-manylinux2010_i686.whl", hash = "sha256:46cfb0f2b757673bfd36ab4b0e3d61988cc1a0d47e0597e91462dcbef7528f35"}, + {file = "grpcio-1.39.0-cp38-cp38-manylinux2010_x86_64.whl", hash = "sha256:f2621c82fbbff1496993aa5fbf60e235583c7f970506e818671ad52000b6f310"}, + {file = "grpcio-1.39.0-cp38-cp38-manylinux2014_i686.whl", hash = "sha256:e98aca5cfe05ca29950b3d99006b9ddb54fde6451cd12cb2db1443ae3b9fa076"}, + {file = "grpcio-1.39.0-cp38-cp38-manylinux2014_x86_64.whl", hash = "sha256:8ed1e52ad507a54d20e6aaedf4b3edcab18cc12031eafe6de898f97513d8997b"}, + {file = "grpcio-1.39.0-cp38-cp38-manylinux_2_24_aarch64.whl", hash = "sha256:3c57fa7fec932767bc553bfb956759f45026890255bd232b2f797c3bc4dfeba2"}, + {file = "grpcio-1.39.0-cp38-cp38-win32.whl", hash = "sha256:88dbef504b491b96e3238a6d5360b04508c34c62286080060c85fddd3caf7137"}, + {file = "grpcio-1.39.0-cp38-cp38-win_amd64.whl", hash = "sha256:cffdccc94e63710dd6ead01849443390632c8e0fec52dc26e4fddf9f28ac9280"}, + {file = "grpcio-1.39.0-cp39-cp39-linux_armv7l.whl", hash = "sha256:43e0f5c49f985c94332794aa6c4f15f3a1ced336f0c6a6c8946c67b5ab111ae9"}, + {file = "grpcio-1.39.0-cp39-cp39-macosx_10_10_x86_64.whl", hash = "sha256:dc3a24022a90c1754e54315009da6f949b48862c1d06daa54f9a28f89a5efacb"}, + {file = "grpcio-1.39.0-cp39-cp39-manylinux2010_i686.whl", hash = "sha256:476fa94ba8efb09213baabd757f6f93e839794d8ae0eaa371347d6899e8f57a0"}, + {file = "grpcio-1.39.0-cp39-cp39-manylinux2010_x86_64.whl", hash = "sha256:46d510a7af777d2f38ef4c1d25491add37cad24143012f3eebe72dc5c6d0fc4c"}, + {file = "grpcio-1.39.0-cp39-cp39-manylinux2014_i686.whl", hash = "sha256:5091b4a5ee8454a8f0c8ac45946ca25d6142c3be4b1fba141f1d62a6e0b5c696"}, + {file = "grpcio-1.39.0-cp39-cp39-manylinux2014_x86_64.whl", hash = "sha256:de83a045005703e7b9e67b61c38bb72cd49f68d9d2780d2c675353a3a3f2816f"}, + {file = "grpcio-1.39.0-cp39-cp39-manylinux_2_24_aarch64.whl", hash = "sha256:4258b778ce09ffa3b7c9a26971c216a34369e786771afbf4f98afe223f27d248"}, + {file = "grpcio-1.39.0-cp39-cp39-win32.whl", hash = "sha256:c44958a24559f875d902d5c1acb0ae43faa5a84f6120d1d0d800acb52f96516e"}, + {file = "grpcio-1.39.0-cp39-cp39-win_amd64.whl", hash = "sha256:2068a2b896ac67103c4a5453d5435fafcbb1a2f41eaf25148d08780096935cee"}, + {file = "grpcio-1.39.0.tar.gz", hash = "sha256:57974361a459d6fe04c9ae0af1845974606612249f467bbd2062d963cb90f407"}, +] +gunicorn = [ + {file = "gunicorn-20.1.0-py3-none-any.whl", hash = "sha256:9dcc4547dbb1cb284accfb15ab5667a0e5d1881cc443e0677b4882a4067a807e"}, + {file = "gunicorn-20.1.0.tar.gz", hash = "sha256:e0a968b5ba15f8a328fdfd7ab1fcb5af4470c28aaf7e55df02a99bc13138e6e8"}, +] +h11 = [ + {file = "h11-0.12.0-py3-none-any.whl", hash = "sha256:36a3cb8c0a032f56e2da7084577878a035d3b61d104230d4bd49c0c6b555a9c6"}, + {file = "h11-0.12.0.tar.gz", hash = "sha256:47222cb6067e4a307d535814917cd98fd0a57b6788ce715755fa2b6c28b56042"}, +] +h5py = [ + {file = "h5py-3.1.0-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:1cd367f89a5441236bdbb795e9fb9a9e3424929c00b4a54254ca760437f83d69"}, + {file = "h5py-3.1.0-cp36-cp36m-manylinux1_x86_64.whl", hash = "sha256:fea05349f63625a8fb808e57e42bb4c76930cf5d50ac58b678c52f913a48a89b"}, + {file = "h5py-3.1.0-cp36-cp36m-win_amd64.whl", hash = "sha256:2e37352ddfcf9d77a2a47f7c8f7e125c6d20cc06c2995edeb7be222d4e152636"}, + {file = "h5py-3.1.0-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:e33f61d3eb862614c0f273a1f993a64dc2f093e1a3094932c50ada9d2db2170f"}, + {file = "h5py-3.1.0-cp37-cp37m-manylinux1_x86_64.whl", hash = "sha256:236ac8d943be30b617ab615c3d4a4bf4a438add2be87e54af3687ab721a18fac"}, + {file = "h5py-3.1.0-cp37-cp37m-win_amd64.whl", hash = "sha256:02c391fdb980762a1cc03a4bcaecd03dc463994a9a63a02264830114a96e111f"}, + {file = "h5py-3.1.0-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:f89a3dae38843ffa49d17a31a3509a8129e9b46ece602a0138e1ed79e685c361"}, + {file = "h5py-3.1.0-cp38-cp38-manylinux1_x86_64.whl", hash = "sha256:ba71f6229d2013fbb606476ecc29c6223fc16b244d35fcd8566ad9dbaf910857"}, + {file = "h5py-3.1.0-cp38-cp38-win_amd64.whl", hash = "sha256:dccb89358bc84abcd711363c3e138f9f4eccfdf866f2139a8e72308328765b2c"}, + {file = "h5py-3.1.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:cb74df83709d6d03d11e60b9480812f58da34f194beafa8c8314dbbeeedfe0a6"}, + {file = "h5py-3.1.0-cp39-cp39-manylinux1_x86_64.whl", hash = "sha256:80c623be10479e81b64fa713b7ed4c0bbe9f02e8e7d2a2e5382336087b615ce4"}, + {file = "h5py-3.1.0-cp39-cp39-win_amd64.whl", hash = "sha256:1cdfd1c5449ca1329d152f0b66830e93226ebce4f5e07dd8dc16bfc2b1a49d7b"}, + {file = "h5py-3.1.0.tar.gz", hash = "sha256:1e2516f190652beedcb8c7acfa1c6fa92d99b42331cbef5e5c7ec2d65b0fc3c2"}, +] +hexbytes = [ + {file = "hexbytes-0.2.2-py3-none-any.whl", hash = "sha256:ef53c37ea9f316fff86fcb1df057b4c6ba454da348083e972031bbf7bc9c3acc"}, + {file = "hexbytes-0.2.2.tar.gz", hash = "sha256:a5881304d186e87578fb263a85317c808cf130e1d4b3d37d30142ab0f7898d03"}, +] +idna = [ + {file = "idna-3.2-py3-none-any.whl", hash = "sha256:14475042e284991034cb48e06f6851428fb14c4dc953acd9be9a5e95c7b6dd7a"}, + {file = "idna-3.2.tar.gz", hash = "sha256:467fbad99067910785144ce333826c71fb0e63a425657295239737f7ecd125f3"}, +] +importlib-resources = [ + {file = "importlib_resources-5.2.2-py3-none-any.whl", hash = "sha256:2480d8e07d1890056cb53c96e3de44fead9c62f2ba949b0f2e4c4345f4afa977"}, + {file = "importlib_resources-5.2.2.tar.gz", hash = "sha256:a65882a4d0fe5fbf702273456ba2ce74fe44892c25e42e057aca526b702a6d4b"}, +] +iniconfig = [ + {file = "iniconfig-1.1.1-py2.py3-none-any.whl", hash = "sha256:011e24c64b7f47f6ebd835bb12a743f2fbe9a26d4cecaa7f53bc4f35ee9da8b3"}, + {file = "iniconfig-1.1.1.tar.gz", hash = "sha256:bc3af051d7d14b2ee5ef9969666def0cd1a000e121eaea580d4a313df4b37f32"}, +] +ipdb = [ + {file = "ipdb-0.13.9.tar.gz", hash = "sha256:951bd9a64731c444fd907a5ce268543020086a697f6be08f7cc2c9a752a278c5"}, +] +ipfshttpclient = [ + {file = "ipfshttpclient-0.8.0a2-py3-none-any.whl", hash = "sha256:ce6bac0e3963c4ced74d7eb6978125362bb05bbe219088ca48f369ce14d3cc39"}, + {file = "ipfshttpclient-0.8.0a2.tar.gz", hash = "sha256:0d80e95ee60b02c7d414e79bf81a36fc3c8fbab74265475c52f70b2620812135"}, +] +ipykernel = [ + {file = "ipykernel-6.3.1-py3-none-any.whl", hash = "sha256:3d34530e031067f04e88b72715e92c27871368c15998692d665d57027ceb18d9"}, + {file = "ipykernel-6.3.1.tar.gz", hash = "sha256:6dd4b107ab755ed9286c820b2f69c2cd895046ef2a25c878929ac8b5540477a1"}, +] +ipython = [ + {file = "ipython-7.27.0-py3-none-any.whl", hash = "sha256:75b5e060a3417cf64f138e0bb78e58512742c57dc29db5a5058a2b1f0c10df02"}, + {file = "ipython-7.27.0.tar.gz", hash = "sha256:58b55ebfdfa260dad10d509702dc2857cb25ad82609506b070cf2d7b7df5af13"}, +] +ipython-genutils = [ + {file = "ipython_genutils-0.2.0-py2.py3-none-any.whl", hash = "sha256:72dd37233799e619666c9f639a9da83c34013a73e8bbc79a7a6348d93c61fab8"}, + {file = "ipython_genutils-0.2.0.tar.gz", hash = "sha256:eb2e116e75ecef9d4d228fdc66af54269afa26ab4463042e33785b887c628ba8"}, +] +ipywidgets = [ + {file = "ipywidgets-7.6.3-py2.py3-none-any.whl", hash = "sha256:e6513cfdaf5878de30f32d57f6dc2474da395a2a2991b94d487406c0ab7f55ca"}, + {file = "ipywidgets-7.6.3.tar.gz", hash = "sha256:9f1a43e620530f9e570e4a493677d25f08310118d315b00e25a18f12913c41f0"}, +] +jedi = [ + {file = "jedi-0.18.0-py2.py3-none-any.whl", hash = "sha256:18456d83f65f400ab0c2d3319e48520420ef43b23a086fdc05dff34132f0fb93"}, + {file = "jedi-0.18.0.tar.gz", hash = "sha256:92550a404bad8afed881a137ec9a461fed49eca661414be45059329614ed0707"}, +] +jinja2 = [ + {file = "Jinja2-3.0.1-py3-none-any.whl", hash = "sha256:1f06f2da51e7b56b8f238affdd6b4e2c61e39598a378cc49345bc1bd42a978a4"}, + {file = "Jinja2-3.0.1.tar.gz", hash = "sha256:703f484b47a6af502e743c9122595cc812b0271f661722403114f71a79d0f5a4"}, +] +jsonschema = [ + {file = "jsonschema-3.2.0-py2.py3-none-any.whl", hash = "sha256:4e5b3cf8216f577bee9ce139cbe72eca3ea4f292ec60928ff24758ce626cd163"}, + {file = "jsonschema-3.2.0.tar.gz", hash = "sha256:c8a85b28d377cc7737e46e2d9f2b4f44ee3c0e1deac6bf46ddefc7187d30797a"}, +] +jupyter = [ + {file = "jupyter-1.0.0-py2.py3-none-any.whl", hash = "sha256:5b290f93b98ffbc21c0c7e749f054b3267782166d72fa5e3ed1ed4eaf34a2b78"}, + {file = "jupyter-1.0.0.tar.gz", hash = "sha256:d9dc4b3318f310e34c82951ea5d6683f67bed7def4b259fafbfe4f1beb1d8e5f"}, + {file = "jupyter-1.0.0.zip", hash = "sha256:3e1f86076bbb7c8c207829390305a2b1fe836d471ed54be66a3b8c41e7f46cc7"}, +] +jupyter-client = [ + {file = "jupyter_client-7.0.2-py3-none-any.whl", hash = "sha256:37a30c13d3655b819add61c830594090af7fca40cd2d74f41cad9e2e12118501"}, + {file = "jupyter_client-7.0.2.tar.gz", hash = "sha256:0c6cabd07e003a2e9692394bf1ae794188ad17d2e250ed747232d7a473aa772c"}, +] +jupyter-console = [ + {file = "jupyter_console-6.4.0-py3-none-any.whl", hash = "sha256:7799c4ea951e0e96ba8260575423cb323ea5a03fcf5503560fa3e15748869e27"}, + {file = "jupyter_console-6.4.0.tar.gz", hash = "sha256:242248e1685039cd8bff2c2ecb7ce6c1546eb50ee3b08519729e6e881aec19c7"}, +] +jupyter-core = [ + {file = "jupyter_core-4.7.1-py3-none-any.whl", hash = "sha256:8c6c0cac5c1b563622ad49321d5ec47017bd18b94facb381c6973a0486395f8e"}, + {file = "jupyter_core-4.7.1.tar.gz", hash = "sha256:79025cb3225efcd36847d0840f3fc672c0abd7afd0de83ba8a1d3837619122b4"}, +] +jupyterlab-pygments = [ + {file = "jupyterlab_pygments-0.1.2-py2.py3-none-any.whl", hash = "sha256:abfb880fd1561987efaefcb2d2ac75145d2a5d0139b1876d5be806e32f630008"}, + {file = "jupyterlab_pygments-0.1.2.tar.gz", hash = "sha256:cfcda0873626150932f438eccf0f8bf22bfa92345b814890ab360d666b254146"}, +] +jupyterlab-widgets = [ + {file = "jupyterlab_widgets-1.0.0-py3-none-any.whl", hash = "sha256:caeaf3e6103180e654e7d8d2b81b7d645e59e432487c1d35a41d6d3ee56b3fef"}, + {file = "jupyterlab_widgets-1.0.0.tar.gz", hash = "sha256:5c1a29a84d3069208cb506b10609175b249b6486d6b1cbae8fcde2a11584fb78"}, +] +keras = [ + {file = "keras-2.6.0-py2.py3-none-any.whl", hash = "sha256:504af5656a9829fe803ce48a8580ef16916e89906aceddad9e098614269437e7"}, +] +keras-preprocessing = [ + {file = "Keras_Preprocessing-1.1.2-py2.py3-none-any.whl", hash = "sha256:7b82029b130ff61cc99b55f3bd27427df4838576838c5b2f65940e4fcec99a7b"}, + {file = "Keras_Preprocessing-1.1.2.tar.gz", hash = "sha256:add82567c50c8bc648c14195bf544a5ce7c1f76761536956c3d2978970179ef3"}, +] +lru-dict = [ + {file = "lru-dict-1.1.7.tar.gz", hash = "sha256:45b81f67d75341d4433abade799a47e9c42a9e22a118531dcb5e549864032d7c"}, +] +mako = [ + {file = "Mako-1.1.5-py2.py3-none-any.whl", hash = "sha256:6804ee66a7f6a6416910463b00d76a7b25194cd27f1918500c5bd7be2a088a23"}, + {file = "Mako-1.1.5.tar.gz", hash = "sha256:169fa52af22a91900d852e937400e79f535496191c63712e3b9fda5a9bed6fc3"}, +] +markdown = [ + {file = "Markdown-3.3.4-py3-none-any.whl", hash = "sha256:96c3ba1261de2f7547b46a00ea8463832c921d3f9d6aba3f255a6f71386db20c"}, + {file = "Markdown-3.3.4.tar.gz", hash = "sha256:31b5b491868dcc87d6c24b7e3d19a0d730d59d3e46f4eea6430a321bed387a49"}, +] +markupsafe = [ + {file = "MarkupSafe-2.0.1-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:f9081981fe268bd86831e5c75f7de206ef275defcb82bc70740ae6dc507aee51"}, + {file = "MarkupSafe-2.0.1-cp36-cp36m-manylinux1_i686.whl", hash = "sha256:0955295dd5eec6cb6cc2fe1698f4c6d84af2e92de33fbcac4111913cd100a6ff"}, + {file = "MarkupSafe-2.0.1-cp36-cp36m-manylinux1_x86_64.whl", hash = "sha256:0446679737af14f45767963a1a9ef7620189912317d095f2d9ffa183a4d25d2b"}, + {file = "MarkupSafe-2.0.1-cp36-cp36m-manylinux2010_i686.whl", hash = "sha256:f826e31d18b516f653fe296d967d700fddad5901ae07c622bb3705955e1faa94"}, + {file = "MarkupSafe-2.0.1-cp36-cp36m-manylinux2010_x86_64.whl", hash = "sha256:fa130dd50c57d53368c9d59395cb5526eda596d3ffe36666cd81a44d56e48872"}, + {file = "MarkupSafe-2.0.1-cp36-cp36m-manylinux2014_aarch64.whl", hash = "sha256:905fec760bd2fa1388bb5b489ee8ee5f7291d692638ea5f67982d968366bef9f"}, + {file = "MarkupSafe-2.0.1-cp36-cp36m-win32.whl", hash = "sha256:6c4ca60fa24e85fe25b912b01e62cb969d69a23a5d5867682dd3e80b5b02581d"}, + {file = "MarkupSafe-2.0.1-cp36-cp36m-win_amd64.whl", hash = "sha256:b2f4bf27480f5e5e8ce285a8c8fd176c0b03e93dcc6646477d4630e83440c6a9"}, + {file = "MarkupSafe-2.0.1-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:0717a7390a68be14b8c793ba258e075c6f4ca819f15edfc2a3a027c823718567"}, + {file = "MarkupSafe-2.0.1-cp37-cp37m-manylinux1_i686.whl", hash = "sha256:6557b31b5e2c9ddf0de32a691f2312a32f77cd7681d8af66c2692efdbef84c18"}, + {file = "MarkupSafe-2.0.1-cp37-cp37m-manylinux1_x86_64.whl", hash = "sha256:49e3ceeabbfb9d66c3aef5af3a60cc43b85c33df25ce03d0031a608b0a8b2e3f"}, + {file = "MarkupSafe-2.0.1-cp37-cp37m-manylinux2010_i686.whl", hash = "sha256:d7f9850398e85aba693bb640262d3611788b1f29a79f0c93c565694658f4071f"}, + {file = "MarkupSafe-2.0.1-cp37-cp37m-manylinux2010_x86_64.whl", hash = "sha256:6a7fae0dd14cf60ad5ff42baa2e95727c3d81ded453457771d02b7d2b3f9c0c2"}, + {file = "MarkupSafe-2.0.1-cp37-cp37m-manylinux2014_aarch64.whl", hash = "sha256:b7f2d075102dc8c794cbde1947378051c4e5180d52d276987b8d28a3bd58c17d"}, + {file = "MarkupSafe-2.0.1-cp37-cp37m-win32.whl", hash = "sha256:a30e67a65b53ea0a5e62fe23682cfe22712e01f453b95233b25502f7c61cb415"}, + {file = "MarkupSafe-2.0.1-cp37-cp37m-win_amd64.whl", hash = "sha256:611d1ad9a4288cf3e3c16014564df047fe08410e628f89805e475368bd304914"}, + {file = "MarkupSafe-2.0.1-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:be98f628055368795d818ebf93da628541e10b75b41c559fdf36d104c5787066"}, + {file = "MarkupSafe-2.0.1-cp38-cp38-manylinux1_i686.whl", hash = "sha256:1d609f577dc6e1aa17d746f8bd3c31aa4d258f4070d61b2aa5c4166c1539de35"}, + {file = "MarkupSafe-2.0.1-cp38-cp38-manylinux1_x86_64.whl", hash = "sha256:7d91275b0245b1da4d4cfa07e0faedd5b0812efc15b702576d103293e252af1b"}, + {file = "MarkupSafe-2.0.1-cp38-cp38-manylinux2010_i686.whl", hash = "sha256:01a9b8ea66f1658938f65b93a85ebe8bc016e6769611be228d797c9d998dd298"}, + {file = "MarkupSafe-2.0.1-cp38-cp38-manylinux2010_x86_64.whl", hash = "sha256:47ab1e7b91c098ab893b828deafa1203de86d0bc6ab587b160f78fe6c4011f75"}, + {file = "MarkupSafe-2.0.1-cp38-cp38-manylinux2014_aarch64.whl", hash = "sha256:97383d78eb34da7e1fa37dd273c20ad4320929af65d156e35a5e2d89566d9dfb"}, + {file = "MarkupSafe-2.0.1-cp38-cp38-win32.whl", hash = "sha256:023cb26ec21ece8dc3907c0e8320058b2e0cb3c55cf9564da612bc325bed5e64"}, + {file = "MarkupSafe-2.0.1-cp38-cp38-win_amd64.whl", hash = "sha256:984d76483eb32f1bcb536dc27e4ad56bba4baa70be32fa87152832cdd9db0833"}, + {file = "MarkupSafe-2.0.1-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:2ef54abee730b502252bcdf31b10dacb0a416229b72c18b19e24a4509f273d26"}, + {file = "MarkupSafe-2.0.1-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:3c112550557578c26af18a1ccc9e090bfe03832ae994343cfdacd287db6a6ae7"}, + {file = "MarkupSafe-2.0.1-cp39-cp39-manylinux1_i686.whl", hash = "sha256:53edb4da6925ad13c07b6d26c2a852bd81e364f95301c66e930ab2aef5b5ddd8"}, + {file = "MarkupSafe-2.0.1-cp39-cp39-manylinux1_x86_64.whl", hash = "sha256:f5653a225f31e113b152e56f154ccbe59eeb1c7487b39b9d9f9cdb58e6c79dc5"}, + {file = "MarkupSafe-2.0.1-cp39-cp39-manylinux2010_i686.whl", hash = "sha256:4efca8f86c54b22348a5467704e3fec767b2db12fc39c6d963168ab1d3fc9135"}, + {file = "MarkupSafe-2.0.1-cp39-cp39-manylinux2010_x86_64.whl", hash = "sha256:ab3ef638ace319fa26553db0624c4699e31a28bb2a835c5faca8f8acf6a5a902"}, + {file = "MarkupSafe-2.0.1-cp39-cp39-manylinux2014_aarch64.whl", hash = "sha256:f8ba0e8349a38d3001fae7eadded3f6606f0da5d748ee53cc1dab1d6527b9509"}, + {file = "MarkupSafe-2.0.1-cp39-cp39-win32.whl", hash = "sha256:10f82115e21dc0dfec9ab5c0223652f7197feb168c940f3ef61563fc2d6beb74"}, + {file = "MarkupSafe-2.0.1-cp39-cp39-win_amd64.whl", hash = "sha256:693ce3f9e70a6cf7d2fb9e6c9d8b204b6b39897a2c4a1aa65728d5ac97dcc1d8"}, + {file = "MarkupSafe-2.0.1.tar.gz", hash = "sha256:594c67807fb16238b30c44bdf74f36c02cdf22d1c8cda91ef8a0ed8dabf5620a"}, +] +matplotlib-inline = [ + {file = "matplotlib-inline-0.1.2.tar.gz", hash = "sha256:f41d5ff73c9f5385775d5c0bc13b424535c8402fe70ea8210f93e11f3683993e"}, + {file = "matplotlib_inline-0.1.2-py3-none-any.whl", hash = "sha256:5cf1176f554abb4fa98cb362aa2b55c500147e4bdbb07e3fda359143e1da0811"}, +] +mistune = [ + {file = "mistune-0.8.4-py2.py3-none-any.whl", hash = "sha256:88a1051873018da288eee8538d476dffe1262495144b33ecb586c4ab266bb8d4"}, + {file = "mistune-0.8.4.tar.gz", hash = "sha256:59a3429db53c50b5c6bcc8a07f8848cb00d7dc8bdb431a4ab41920d201d4756e"}, +] +multiaddr = [ + {file = "multiaddr-0.0.9-py2.py3-none-any.whl", hash = "sha256:5c0f862cbcf19aada2a899f80ef896ddb2e85614e0c8f04dd287c06c69dac95b"}, + {file = "multiaddr-0.0.9.tar.gz", hash = "sha256:30b2695189edc3d5b90f1c303abb8f02d963a3a4edf2e7178b975eb417ab0ecf"}, +] +multidict = [ + {file = "multidict-5.1.0-cp36-cp36m-macosx_10_14_x86_64.whl", hash = "sha256:b7993704f1a4b204e71debe6095150d43b2ee6150fa4f44d6d966ec356a8d61f"}, + {file = "multidict-5.1.0-cp36-cp36m-manylinux1_i686.whl", hash = "sha256:9dd6e9b1a913d096ac95d0399bd737e00f2af1e1594a787e00f7975778c8b2bf"}, + {file = "multidict-5.1.0-cp36-cp36m-manylinux2014_aarch64.whl", hash = "sha256:f21756997ad8ef815d8ef3d34edd98804ab5ea337feedcd62fb52d22bf531281"}, + {file = "multidict-5.1.0-cp36-cp36m-manylinux2014_i686.whl", hash = "sha256:1ab820665e67373de5802acae069a6a05567ae234ddb129f31d290fc3d1aa56d"}, + {file = "multidict-5.1.0-cp36-cp36m-manylinux2014_ppc64le.whl", hash = "sha256:9436dc58c123f07b230383083855593550c4d301d2532045a17ccf6eca505f6d"}, + {file = "multidict-5.1.0-cp36-cp36m-manylinux2014_s390x.whl", hash = "sha256:830f57206cc96ed0ccf68304141fec9481a096c4d2e2831f311bde1c404401da"}, + {file = "multidict-5.1.0-cp36-cp36m-manylinux2014_x86_64.whl", hash = "sha256:2e68965192c4ea61fff1b81c14ff712fc7dc15d2bd120602e4a3494ea6584224"}, + {file = "multidict-5.1.0-cp36-cp36m-win32.whl", hash = "sha256:2f1a132f1c88724674271d636e6b7351477c27722f2ed789f719f9e3545a3d26"}, + {file = "multidict-5.1.0-cp36-cp36m-win_amd64.whl", hash = "sha256:3a4f32116f8f72ecf2a29dabfb27b23ab7cdc0ba807e8459e59a93a9be9506f6"}, + {file = "multidict-5.1.0-cp37-cp37m-macosx_10_14_x86_64.whl", hash = "sha256:46c73e09ad374a6d876c599f2328161bcd95e280f84d2060cf57991dec5cfe76"}, + {file = "multidict-5.1.0-cp37-cp37m-manylinux1_i686.whl", hash = "sha256:018132dbd8688c7a69ad89c4a3f39ea2f9f33302ebe567a879da8f4ca73f0d0a"}, + {file = "multidict-5.1.0-cp37-cp37m-manylinux2014_aarch64.whl", hash = "sha256:4b186eb7d6ae7c06eb4392411189469e6a820da81447f46c0072a41c748ab73f"}, + {file = "multidict-5.1.0-cp37-cp37m-manylinux2014_i686.whl", hash = "sha256:3a041b76d13706b7fff23b9fc83117c7b8fe8d5fe9e6be45eee72b9baa75f348"}, + {file = "multidict-5.1.0-cp37-cp37m-manylinux2014_ppc64le.whl", hash = "sha256:051012ccee979b2b06be928a6150d237aec75dd6bf2d1eeeb190baf2b05abc93"}, + {file = "multidict-5.1.0-cp37-cp37m-manylinux2014_s390x.whl", hash = "sha256:6a4d5ce640e37b0efcc8441caeea8f43a06addace2335bd11151bc02d2ee31f9"}, + {file = "multidict-5.1.0-cp37-cp37m-manylinux2014_x86_64.whl", hash = "sha256:5cf3443199b83ed9e955f511b5b241fd3ae004e3cb81c58ec10f4fe47c7dce37"}, + {file = "multidict-5.1.0-cp37-cp37m-win32.whl", hash = "sha256:f200755768dc19c6f4e2b672421e0ebb3dd54c38d5a4f262b872d8cfcc9e93b5"}, + {file = "multidict-5.1.0-cp37-cp37m-win_amd64.whl", hash = "sha256:05c20b68e512166fddba59a918773ba002fdd77800cad9f55b59790030bab632"}, + {file = "multidict-5.1.0-cp38-cp38-macosx_10_14_x86_64.whl", hash = "sha256:54fd1e83a184e19c598d5e70ba508196fd0bbdd676ce159feb412a4a6664f952"}, + {file = "multidict-5.1.0-cp38-cp38-manylinux1_i686.whl", hash = "sha256:0e3c84e6c67eba89c2dbcee08504ba8644ab4284863452450520dad8f1e89b79"}, + {file = "multidict-5.1.0-cp38-cp38-manylinux2014_aarch64.whl", hash = "sha256:dc862056f76443a0db4509116c5cd480fe1b6a2d45512a653f9a855cc0517456"}, + {file = "multidict-5.1.0-cp38-cp38-manylinux2014_i686.whl", hash = "sha256:0e929169f9c090dae0646a011c8b058e5e5fb391466016b39d21745b48817fd7"}, + {file = "multidict-5.1.0-cp38-cp38-manylinux2014_ppc64le.whl", hash = "sha256:d81eddcb12d608cc08081fa88d046c78afb1bf8107e6feab5d43503fea74a635"}, + {file = "multidict-5.1.0-cp38-cp38-manylinux2014_s390x.whl", hash = "sha256:585fd452dd7782130d112f7ddf3473ffdd521414674c33876187e101b588738a"}, + {file = "multidict-5.1.0-cp38-cp38-manylinux2014_x86_64.whl", hash = "sha256:37e5438e1c78931df5d3c0c78ae049092877e5e9c02dd1ff5abb9cf27a5914ea"}, + {file = "multidict-5.1.0-cp38-cp38-win32.whl", hash = "sha256:07b42215124aedecc6083f1ce6b7e5ec5b50047afa701f3442054373a6deb656"}, + {file = "multidict-5.1.0-cp38-cp38-win_amd64.whl", hash = "sha256:929006d3c2d923788ba153ad0de8ed2e5ed39fdbe8e7be21e2f22ed06c6783d3"}, + {file = "multidict-5.1.0-cp39-cp39-macosx_10_14_x86_64.whl", hash = "sha256:b797515be8743b771aa868f83563f789bbd4b236659ba52243b735d80b29ed93"}, + {file = "multidict-5.1.0-cp39-cp39-manylinux1_i686.whl", hash = "sha256:d5c65bdf4484872c4af3150aeebe101ba560dcfb34488d9a8ff8dbcd21079647"}, + {file = "multidict-5.1.0-cp39-cp39-manylinux2014_aarch64.whl", hash = "sha256:b47a43177a5e65b771b80db71e7be76c0ba23cc8aa73eeeb089ed5219cdbe27d"}, + {file = "multidict-5.1.0-cp39-cp39-manylinux2014_i686.whl", hash = "sha256:806068d4f86cb06af37cd65821554f98240a19ce646d3cd24e1c33587f313eb8"}, + {file = "multidict-5.1.0-cp39-cp39-manylinux2014_ppc64le.whl", hash = "sha256:46dd362c2f045095c920162e9307de5ffd0a1bfbba0a6e990b344366f55a30c1"}, + {file = "multidict-5.1.0-cp39-cp39-manylinux2014_s390x.whl", hash = "sha256:ace010325c787c378afd7f7c1ac66b26313b3344628652eacd149bdd23c68841"}, + {file = "multidict-5.1.0-cp39-cp39-manylinux2014_x86_64.whl", hash = "sha256:ecc771ab628ea281517e24fd2c52e8f31c41e66652d07599ad8818abaad38cda"}, + {file = "multidict-5.1.0-cp39-cp39-win32.whl", hash = "sha256:fc13a9524bc18b6fb6e0dbec3533ba0496bbed167c56d0aabefd965584557d80"}, + {file = "multidict-5.1.0-cp39-cp39-win_amd64.whl", hash = "sha256:7df80d07818b385f3129180369079bd6934cf70469f99daaebfac89dca288359"}, + {file = "multidict-5.1.0.tar.gz", hash = "sha256:25b4e5f22d3a37ddf3effc0710ba692cfc792c2b9edfb9c05aefe823256e84d5"}, +] +mypy-extensions = [ + {file = "mypy_extensions-0.4.3-py2.py3-none-any.whl", hash = "sha256:090fedd75945a69ae91ce1303b5824f428daf5a028d2f6ab8a299250a846f15d"}, + {file = "mypy_extensions-0.4.3.tar.gz", hash = "sha256:2d82818f5bb3e369420cb3c4060a7970edba416647068eb4c5343488a6c604a8"}, +] +nbclient = [ + {file = "nbclient-0.5.4-py3-none-any.whl", hash = "sha256:95a300c6fbe73721736cf13972a46d8d666f78794b832866ed7197a504269e11"}, + {file = "nbclient-0.5.4.tar.gz", hash = "sha256:6c8ad36a28edad4562580847f9f1636fe5316a51a323ed85a24a4ad37d4aefce"}, +] +nbconvert = [ + {file = "nbconvert-6.1.0-py3-none-any.whl", hash = "sha256:37cd92ff2ae6a268e62075ff8b16129e0be4939c4dfcee53dc77cc8a7e06c684"}, + {file = "nbconvert-6.1.0.tar.gz", hash = "sha256:d22a8ff202644d31db254d24d52c3a96c82156623fcd7c7f987bba2612303ec9"}, +] +nbformat = [ + {file = "nbformat-5.1.3-py3-none-any.whl", hash = "sha256:eb8447edd7127d043361bc17f2f5a807626bc8e878c7709a1c647abda28a9171"}, + {file = "nbformat-5.1.3.tar.gz", hash = "sha256:b516788ad70771c6250977c1374fcca6edebe6126fd2adb5a69aa5c2356fd1c8"}, +] +nest-asyncio = [ + {file = "nest_asyncio-1.5.1-py3-none-any.whl", hash = "sha256:76d6e972265063fe92a90b9cc4fb82616e07d586b346ed9d2c89a4187acea39c"}, + {file = "nest_asyncio-1.5.1.tar.gz", hash = "sha256:afc5a1c515210a23c461932765691ad39e8eba6551c055ac8d5546e69250d0aa"}, +] +netaddr = [ + {file = "netaddr-0.8.0-py2.py3-none-any.whl", hash = "sha256:9666d0232c32d2656e5e5f8d735f58fd6c7457ce52fc21c98d45f2af78f990ac"}, + {file = "netaddr-0.8.0.tar.gz", hash = "sha256:d6cc57c7a07b1d9d2e917aa8b36ae8ce61c35ba3fcd1b83ca31c5a0ee2b5a243"}, +] +notebook = [ + {file = "notebook-6.4.3-py3-none-any.whl", hash = "sha256:b50eafa8208d5db966efd1caa4076b4dfc51815e02a805b32ecd717e9e6cc071"}, + {file = "notebook-6.4.3.tar.gz", hash = "sha256:e6b6dfed36b00cf950f63c0d42e947c101d4258aec21624de62b9e0c11ed5c0d"}, +] +numpy = [ + {file = "numpy-1.19.5-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:cc6bd4fd593cb261332568485e20a0712883cf631f6f5e8e86a52caa8b2b50ff"}, + {file = "numpy-1.19.5-cp36-cp36m-manylinux1_i686.whl", hash = "sha256:aeb9ed923be74e659984e321f609b9ba54a48354bfd168d21a2b072ed1e833ea"}, + {file = "numpy-1.19.5-cp36-cp36m-manylinux1_x86_64.whl", hash = "sha256:8b5e972b43c8fc27d56550b4120fe6257fdc15f9301914380b27f74856299fea"}, + {file = "numpy-1.19.5-cp36-cp36m-manylinux2010_i686.whl", hash = "sha256:43d4c81d5ffdff6bae58d66a3cd7f54a7acd9a0e7b18d97abb255defc09e3140"}, + {file = "numpy-1.19.5-cp36-cp36m-manylinux2010_x86_64.whl", hash = "sha256:a4646724fba402aa7504cd48b4b50e783296b5e10a524c7a6da62e4a8ac9698d"}, + {file = "numpy-1.19.5-cp36-cp36m-manylinux2014_aarch64.whl", hash = "sha256:2e55195bc1c6b705bfd8ad6f288b38b11b1af32f3c8289d6c50d47f950c12e76"}, + {file = "numpy-1.19.5-cp36-cp36m-win32.whl", hash = "sha256:39b70c19ec771805081578cc936bbe95336798b7edf4732ed102e7a43ec5c07a"}, + {file = "numpy-1.19.5-cp36-cp36m-win_amd64.whl", hash = "sha256:dbd18bcf4889b720ba13a27ec2f2aac1981bd41203b3a3b27ba7a33f88ae4827"}, + {file = "numpy-1.19.5-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:603aa0706be710eea8884af807b1b3bc9fb2e49b9f4da439e76000f3b3c6ff0f"}, + {file = "numpy-1.19.5-cp37-cp37m-manylinux1_i686.whl", hash = "sha256:cae865b1cae1ec2663d8ea56ef6ff185bad091a5e33ebbadd98de2cfa3fa668f"}, + {file = "numpy-1.19.5-cp37-cp37m-manylinux1_x86_64.whl", hash = "sha256:36674959eed6957e61f11c912f71e78857a8d0604171dfd9ce9ad5cbf41c511c"}, + {file = "numpy-1.19.5-cp37-cp37m-manylinux2010_i686.whl", hash = "sha256:06fab248a088e439402141ea04f0fffb203723148f6ee791e9c75b3e9e82f080"}, + {file = "numpy-1.19.5-cp37-cp37m-manylinux2010_x86_64.whl", hash = "sha256:6149a185cece5ee78d1d196938b2a8f9d09f5a5ebfbba66969302a778d5ddd1d"}, + {file = "numpy-1.19.5-cp37-cp37m-manylinux2014_aarch64.whl", hash = "sha256:50a4a0ad0111cc1b71fa32dedd05fa239f7fb5a43a40663269bb5dc7877cfd28"}, + {file = "numpy-1.19.5-cp37-cp37m-win32.whl", hash = "sha256:d051ec1c64b85ecc69531e1137bb9751c6830772ee5c1c426dbcfe98ef5788d7"}, + {file = "numpy-1.19.5-cp37-cp37m-win_amd64.whl", hash = "sha256:a12ff4c8ddfee61f90a1633a4c4afd3f7bcb32b11c52026c92a12e1325922d0d"}, + {file = "numpy-1.19.5-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:cf2402002d3d9f91c8b01e66fbb436a4ed01c6498fffed0e4c7566da1d40ee1e"}, + {file = "numpy-1.19.5-cp38-cp38-manylinux1_i686.whl", hash = "sha256:1ded4fce9cfaaf24e7a0ab51b7a87be9038ea1ace7f34b841fe3b6894c721d1c"}, + {file = "numpy-1.19.5-cp38-cp38-manylinux1_x86_64.whl", hash = "sha256:012426a41bc9ab63bb158635aecccc7610e3eff5d31d1eb43bc099debc979d94"}, + {file = "numpy-1.19.5-cp38-cp38-manylinux2010_i686.whl", hash = "sha256:759e4095edc3c1b3ac031f34d9459fa781777a93ccc633a472a5468587a190ff"}, + {file = "numpy-1.19.5-cp38-cp38-manylinux2010_x86_64.whl", hash = "sha256:a9d17f2be3b427fbb2bce61e596cf555d6f8a56c222bd2ca148baeeb5e5c783c"}, + {file = "numpy-1.19.5-cp38-cp38-manylinux2014_aarch64.whl", hash = "sha256:99abf4f353c3d1a0c7a5f27699482c987cf663b1eac20db59b8c7b061eabd7fc"}, + {file = "numpy-1.19.5-cp38-cp38-win32.whl", hash = "sha256:384ec0463d1c2671170901994aeb6dce126de0a95ccc3976c43b0038a37329c2"}, + {file = "numpy-1.19.5-cp38-cp38-win_amd64.whl", hash = "sha256:811daee36a58dc79cf3d8bdd4a490e4277d0e4b7d103a001a4e73ddb48e7e6aa"}, + {file = "numpy-1.19.5-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:c843b3f50d1ab7361ca4f0b3639bf691569493a56808a0b0c54a051d260b7dbd"}, + {file = "numpy-1.19.5-cp39-cp39-manylinux1_i686.whl", hash = "sha256:d6631f2e867676b13026e2846180e2c13c1e11289d67da08d71cacb2cd93d4aa"}, + {file = "numpy-1.19.5-cp39-cp39-manylinux1_x86_64.whl", hash = "sha256:7fb43004bce0ca31d8f13a6eb5e943fa73371381e53f7074ed21a4cb786c32f8"}, + {file = "numpy-1.19.5-cp39-cp39-manylinux2010_i686.whl", hash = "sha256:2ea52bd92ab9f768cc64a4c3ef8f4b2580a17af0a5436f6126b08efbd1838371"}, + {file = "numpy-1.19.5-cp39-cp39-manylinux2010_x86_64.whl", hash = "sha256:400580cbd3cff6ffa6293df2278c75aef2d58d8d93d3c5614cd67981dae68ceb"}, + {file = "numpy-1.19.5-cp39-cp39-manylinux2014_aarch64.whl", hash = "sha256:df609c82f18c5b9f6cb97271f03315ff0dbe481a2a02e56aeb1b1a985ce38e60"}, + {file = "numpy-1.19.5-cp39-cp39-win32.whl", hash = "sha256:ab83f24d5c52d60dbc8cd0528759532736b56db58adaa7b5f1f76ad551416a1e"}, + {file = "numpy-1.19.5-cp39-cp39-win_amd64.whl", hash = "sha256:0eef32ca3132a48e43f6a0f5a82cb508f22ce5a3d6f67a8329c81c8e226d3f6e"}, + {file = "numpy-1.19.5-pp36-pypy36_pp73-manylinux2010_x86_64.whl", hash = "sha256:a0d53e51a6cb6f0d9082decb7a4cb6dfb33055308c4c44f53103c073f649af73"}, + {file = "numpy-1.19.5.zip", hash = "sha256:a76f502430dd98d7546e1ea2250a7360c065a5fdea52b2dffe8ae7180909b6f4"}, +] +oauthlib = [ + {file = "oauthlib-3.1.1-py2.py3-none-any.whl", hash = "sha256:42bf6354c2ed8c6acb54d971fce6f88193d97297e18602a3a886603f9d7730cc"}, + {file = "oauthlib-3.1.1.tar.gz", hash = "sha256:8f0215fcc533dd8dd1bee6f4c412d4f0cd7297307d43ac61666389e3bc3198a3"}, +] +opt-einsum = [ + {file = "opt_einsum-3.3.0-py3-none-any.whl", hash = "sha256:2455e59e3947d3c275477df7f5205b30635e266fe6dc300e3d9f9646bfcea147"}, + {file = "opt_einsum-3.3.0.tar.gz", hash = "sha256:59f6475f77bbc37dcf7cd748519c0ec60722e91e63ca114e68821c0c54a46549"}, +] +packaging = [ + {file = "packaging-21.0-py3-none-any.whl", hash = "sha256:c86254f9220d55e31cc94d69bade760f0847da8000def4dfe1c6b872fd14ff14"}, + {file = "packaging-21.0.tar.gz", hash = "sha256:7dc96269f53a4ccec5c0670940a4281106dd0bb343f47b7471f779df49c2fbe7"}, +] +pandas = [ + {file = "pandas-1.3.2-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:ba7ceb8abc6dbdb1e34612d1173d61e4941f1a1eb7e6f703b2633134ae6a6c89"}, + {file = "pandas-1.3.2-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:fcb71b1935249de80e3a808227189eee381d4d74a31760ced2df21eedc92a8e3"}, + {file = "pandas-1.3.2-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:fa54dc1d3e5d004a09ab0b1751473698011ddf03e14f1f59b84ad9a6ac630975"}, + {file = "pandas-1.3.2-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:34ced9ce5d5b17b556486da7256961b55b471d64a8990b56e67a84ebeb259416"}, + {file = "pandas-1.3.2-cp37-cp37m-win32.whl", hash = "sha256:a56246de744baf646d1f3e050c4653d632bc9cd2e0605f41051fea59980e880a"}, + {file = "pandas-1.3.2-cp37-cp37m-win_amd64.whl", hash = "sha256:53b17e4debba26b7446b1e4795c19f94f0c715e288e08145e44bdd2865e819b3"}, + {file = "pandas-1.3.2-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:f07a9745ca075ae73a5ce116f5e58f691c0dc9de0bff163527858459df5c176f"}, + {file = "pandas-1.3.2-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c9e8e0ce5284ebebe110efd652c164ed6eab77f5de4c3533abc756302ee77765"}, + {file = "pandas-1.3.2-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:59a78d7066d1c921a77e3306aa0ebf6e55396c097d5dfcc4df8defe3dcecb735"}, + {file = "pandas-1.3.2-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:132def05e73d292c949b02e7ef873debb77acc44a8b119d215921046f0c3a91d"}, + {file = "pandas-1.3.2-cp38-cp38-win32.whl", hash = "sha256:69e1b2f5811f46827722fd641fdaeedb26002bd1e504eacc7a8ec36bdc25393e"}, + {file = "pandas-1.3.2-cp38-cp38-win_amd64.whl", hash = "sha256:7996d311413379136baf0f3cf2a10e331697657c87ced3f17ac7c77f77fe34a3"}, + {file = "pandas-1.3.2-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:1738154049062156429a5cf2fd79a69c9f3fa4f231346a7ec6fd156cd1a9a621"}, + {file = "pandas-1.3.2-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:9cce01f6d655b4add966fcd36c32c5d1fe84628e200626b3f5e2f40db2d16a0f"}, + {file = "pandas-1.3.2-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:1099e2a0cd3a01ec62cca183fc1555833a2d43764950ef8cb5948c8abfc51014"}, + {file = "pandas-1.3.2-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:0cd5776be891331a3e6b425b5abeab9596abea18435c5982191356f9b24ae731"}, + {file = "pandas-1.3.2-cp39-cp39-win32.whl", hash = "sha256:66a95361b81b4ba04b699ecd2416b0591f40cd1e24c60a8bfe0d19009cfa575a"}, + {file = "pandas-1.3.2-cp39-cp39-win_amd64.whl", hash = "sha256:89f40e5d21814192802421df809f948247d39ffe171e45fe2ab4abf7bd4279d8"}, + {file = "pandas-1.3.2.tar.gz", hash = "sha256:cbcb84d63867af3411fa063af3de64902665bb5b3d40b25b2059e40603594e87"}, +] +pandocfilters = [ + {file = "pandocfilters-1.4.3.tar.gz", hash = "sha256:bc63fbb50534b4b1f8ebe1860889289e8af94a23bff7445259592df25a3906eb"}, +] +parsimonious = [ + {file = "parsimonious-0.8.1.tar.gz", hash = "sha256:3add338892d580e0cb3b1a39e4a1b427ff9f687858fdd61097053742391a9f6b"}, +] +parso = [ + {file = "parso-0.8.2-py2.py3-none-any.whl", hash = "sha256:a8c4922db71e4fdb90e0d0bc6e50f9b273d3397925e5e60a717e719201778d22"}, + {file = "parso-0.8.2.tar.gz", hash = "sha256:12b83492c6239ce32ff5eed6d3639d6a536170723c6f3f1506869f1ace413398"}, +] +pathspec = [ + {file = "pathspec-0.9.0-py2.py3-none-any.whl", hash = "sha256:7d15c4ddb0b5c802d161efc417ec1a2558ea2653c2e8ad9c19098201dc1c993a"}, + {file = "pathspec-0.9.0.tar.gz", hash = "sha256:e564499435a2673d586f6b2130bb5b95f04a3ba06f81b8f895b651a3c76aabb1"}, +] +pexpect = [ + {file = "pexpect-4.8.0-py2.py3-none-any.whl", hash = "sha256:0b48a55dcb3c05f3329815901ea4fc1537514d6ba867a152b581d69ae3710937"}, + {file = "pexpect-4.8.0.tar.gz", hash = "sha256:fc65a43959d153d0114afe13997d439c22823a27cefceb5ff35c2178c6784c0c"}, +] +pickleshare = [ + {file = "pickleshare-0.7.5-py2.py3-none-any.whl", hash = "sha256:9649af414d74d4df115d5d718f82acb59c9d418196b7b4290ed47a12ce62df56"}, + {file = "pickleshare-0.7.5.tar.gz", hash = "sha256:87683d47965c1da65cdacaf31c8441d12b8044cdec9aca500cd78fc2c683afca"}, +] +platformdirs = [ + {file = "platformdirs-2.3.0-py3-none-any.whl", hash = "sha256:8003ac87717ae2c7ee1ea5a84a1a61e87f3fbd16eb5aadba194ea30a9019f648"}, + {file = "platformdirs-2.3.0.tar.gz", hash = "sha256:15b056538719b1c94bdaccb29e5f81879c7f7f0f4a153f46086d155dffcd4f0f"}, +] +pluggy = [ + {file = "pluggy-1.0.0-py2.py3-none-any.whl", hash = "sha256:74134bbf457f031a36d68416e1509f34bd5ccc019f0bcc952c7b909d06b37bd3"}, + {file = "pluggy-1.0.0.tar.gz", hash = "sha256:4224373bacce55f955a878bf9cfa763c1e360858e330072059e10bad68531159"}, +] +poetry-lock-package = [ + {file = "poetry-lock-package-0.4.2.tar.gz", hash = "sha256:5c035ede4c31d94764a9b2a75693941e3635e389103188d6e68259fce0ea3d9b"}, + {file = "poetry_lock_package-0.4.2-py3-none-any.whl", hash = "sha256:6e348079b8fb6c948917b6efd8c11f8d0b6e3ab3ede8ac2aa3f141ced63e5acc"}, +] +prometheus-client = [ + {file = "prometheus_client-0.11.0-py2.py3-none-any.whl", hash = "sha256:b014bc76815eb1399da8ce5fc84b7717a3e63652b0c0f8804092c9363acab1b2"}, + {file = "prometheus_client-0.11.0.tar.gz", hash = "sha256:3a8baade6cb80bcfe43297e33e7623f3118d660d41387593758e2fb1ea173a86"}, +] +promise = [ + {file = "promise-2.3.tar.gz", hash = "sha256:dfd18337c523ba4b6a58801c164c1904a9d4d1b1747c7d5dbf45b693a49d93d0"}, +] +prompt-toolkit = [ + {file = "prompt_toolkit-3.0.20-py3-none-any.whl", hash = "sha256:6076e46efae19b1e0ca1ec003ed37a933dc94b4d20f486235d436e64771dcd5c"}, + {file = "prompt_toolkit-3.0.20.tar.gz", hash = "sha256:eb71d5a6b72ce6db177af4a7d4d7085b99756bf656d98ffcc4fecd36850eea6c"}, +] +protobuf = [ + {file = "protobuf-3.17.3-cp27-cp27m-macosx_10_9_x86_64.whl", hash = "sha256:ab6bb0e270c6c58e7ff4345b3a803cc59dbee19ddf77a4719c5b635f1d547aa8"}, + {file = "protobuf-3.17.3-cp27-cp27mu-manylinux_2_5_x86_64.manylinux1_x86_64.whl", hash = "sha256:13ee7be3c2d9a5d2b42a1030976f760f28755fcf5863c55b1460fd205e6cd637"}, + {file = "protobuf-3.17.3-cp35-cp35m-macosx_10_9_intel.whl", hash = "sha256:1556a1049ccec58c7855a78d27e5c6e70e95103b32de9142bae0576e9200a1b0"}, + {file = "protobuf-3.17.3-cp35-cp35m-manylinux_2_5_x86_64.manylinux1_x86_64.whl", hash = "sha256:f0e59430ee953184a703a324b8ec52f571c6c4259d496a19d1cabcdc19dabc62"}, + {file = "protobuf-3.17.3-cp35-cp35m-win32.whl", hash = "sha256:a981222367fb4210a10a929ad5983ae93bd5a050a0824fc35d6371c07b78caf6"}, + {file = "protobuf-3.17.3-cp35-cp35m-win_amd64.whl", hash = "sha256:6d847c59963c03fd7a0cd7c488cadfa10cda4fff34d8bc8cba92935a91b7a037"}, + {file = "protobuf-3.17.3-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:145ce0af55c4259ca74993ddab3479c78af064002ec8227beb3d944405123c71"}, + {file = "protobuf-3.17.3-cp36-cp36m-manylinux_2_5_x86_64.manylinux1_x86_64.whl", hash = "sha256:6ce4d8bf0321e7b2d4395e253f8002a1a5ffbcfd7bcc0a6ba46712c07d47d0b4"}, + {file = "protobuf-3.17.3-cp36-cp36m-win32.whl", hash = "sha256:7a4c97961e9e5b03a56f9a6c82742ed55375c4a25f2692b625d4087d02ed31b9"}, + {file = "protobuf-3.17.3-cp36-cp36m-win_amd64.whl", hash = "sha256:a22b3a0dbac6544dacbafd4c5f6a29e389a50e3b193e2c70dae6bbf7930f651d"}, + {file = "protobuf-3.17.3-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:ffea251f5cd3c0b9b43c7a7a912777e0bc86263436a87c2555242a348817221b"}, + {file = "protobuf-3.17.3-cp37-cp37m-manylinux2014_aarch64.whl", hash = "sha256:9b7a5c1022e0fa0dbde7fd03682d07d14624ad870ae52054849d8960f04bc764"}, + {file = "protobuf-3.17.3-cp37-cp37m-manylinux_2_5_x86_64.manylinux1_x86_64.whl", hash = "sha256:8727ee027157516e2c311f218ebf2260a18088ffb2d29473e82add217d196b1c"}, + {file = "protobuf-3.17.3-cp37-cp37m-win32.whl", hash = "sha256:14c1c9377a7ffbeaccd4722ab0aa900091f52b516ad89c4b0c3bb0a4af903ba5"}, + {file = "protobuf-3.17.3-cp37-cp37m-win_amd64.whl", hash = "sha256:c56c050a947186ba51de4f94ab441d7f04fcd44c56df6e922369cc2e1a92d683"}, + {file = "protobuf-3.17.3-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:2ae692bb6d1992afb6b74348e7bb648a75bb0d3565a3f5eea5bec8f62bd06d87"}, + {file = "protobuf-3.17.3-cp38-cp38-manylinux2014_aarch64.whl", hash = "sha256:99938f2a2d7ca6563c0ade0c5ca8982264c484fdecf418bd68e880a7ab5730b1"}, + {file = "protobuf-3.17.3-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.whl", hash = "sha256:6902a1e4b7a319ec611a7345ff81b6b004b36b0d2196ce7a748b3493da3d226d"}, + {file = "protobuf-3.17.3-cp38-cp38-win32.whl", hash = "sha256:59e5cf6b737c3a376932fbfb869043415f7c16a0cf176ab30a5bbc419cd709c1"}, + {file = "protobuf-3.17.3-cp38-cp38-win_amd64.whl", hash = "sha256:ebcb546f10069b56dc2e3da35e003a02076aaa377caf8530fe9789570984a8d2"}, + {file = "protobuf-3.17.3-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:4ffbd23640bb7403574f7aff8368e2aeb2ec9a5c6306580be48ac59a6bac8bde"}, + {file = "protobuf-3.17.3-cp39-cp39-manylinux2014_aarch64.whl", hash = "sha256:26010f693b675ff5a1d0e1bdb17689b8b716a18709113288fead438703d45539"}, + {file = "protobuf-3.17.3-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.whl", hash = "sha256:e76d9686e088fece2450dbc7ee905f9be904e427341d289acbe9ad00b78ebd47"}, + {file = "protobuf-3.17.3-cp39-cp39-win32.whl", hash = "sha256:a38bac25f51c93e4be4092c88b2568b9f407c27217d3dd23c7a57fa522a17554"}, + {file = "protobuf-3.17.3-cp39-cp39-win_amd64.whl", hash = "sha256:85d6303e4adade2827e43c2b54114d9a6ea547b671cb63fafd5011dc47d0e13d"}, + {file = "protobuf-3.17.3-py2.py3-none-any.whl", hash = "sha256:2bfb815216a9cd9faec52b16fd2bfa68437a44b67c56bee59bc3926522ecb04e"}, + {file = "protobuf-3.17.3.tar.gz", hash = "sha256:72804ea5eaa9c22a090d2803813e280fb273b62d5ae497aaf3553d141c4fdd7b"}, +] +psycopg2 = [ + {file = "psycopg2-2.9.1-cp36-cp36m-win32.whl", hash = "sha256:7f91312f065df517187134cce8e395ab37f5b601a42446bdc0f0d51773621854"}, + {file = "psycopg2-2.9.1-cp36-cp36m-win_amd64.whl", hash = "sha256:830c8e8dddab6b6716a4bf73a09910c7954a92f40cf1d1e702fb93c8a919cc56"}, + {file = "psycopg2-2.9.1-cp37-cp37m-win32.whl", hash = "sha256:89409d369f4882c47f7ea20c42c5046879ce22c1e4ea20ef3b00a4dfc0a7f188"}, + {file = "psycopg2-2.9.1-cp37-cp37m-win_amd64.whl", hash = "sha256:7640e1e4d72444ef012e275e7b53204d7fab341fb22bc76057ede22fe6860b25"}, + {file = "psycopg2-2.9.1-cp38-cp38-win32.whl", hash = "sha256:079d97fc22de90da1d370c90583659a9f9a6ee4007355f5825e5f1c70dffc1fa"}, + {file = "psycopg2-2.9.1-cp38-cp38-win_amd64.whl", hash = "sha256:2c992196719fadda59f72d44603ee1a2fdcc67de097eea38d41c7ad9ad246e62"}, + {file = "psycopg2-2.9.1-cp39-cp39-win32.whl", hash = "sha256:2087013c159a73e09713294a44d0c8008204d06326006b7f652bef5ace66eebb"}, + {file = "psycopg2-2.9.1-cp39-cp39-win_amd64.whl", hash = "sha256:bf35a25f1aaa8a3781195595577fcbb59934856ee46b4f252f56ad12b8043bcf"}, + {file = "psycopg2-2.9.1.tar.gz", hash = "sha256:de5303a6f1d0a7a34b9d40e4d3bef684ccc44a49bbe3eb85e3c0bffb4a131b7c"}, +] +ptyprocess = [ + {file = "ptyprocess-0.7.0-py2.py3-none-any.whl", hash = "sha256:4b41f3967fce3af57cc7e94b888626c18bf37a083e3651ca8feeb66d492fef35"}, + {file = "ptyprocess-0.7.0.tar.gz", hash = "sha256:5c5d0a3b48ceee0b48485e0c26037c0acd7d29765ca3fbb5cb3831d347423220"}, +] +py = [ + {file = "py-1.10.0-py2.py3-none-any.whl", hash = "sha256:3b80836aa6d1feeaa108e046da6423ab8f6ceda6468545ae8d02d9d58d18818a"}, + {file = "py-1.10.0.tar.gz", hash = "sha256:21b81bda15b66ef5e1a777a21c4dcd9c20ad3efd0b3f817e7a809035269e1bd3"}, +] +pyasn1 = [ + {file = "pyasn1-0.4.8-py2.4.egg", hash = "sha256:fec3e9d8e36808a28efb59b489e4528c10ad0f480e57dcc32b4de5c9d8c9fdf3"}, + {file = "pyasn1-0.4.8-py2.5.egg", hash = "sha256:0458773cfe65b153891ac249bcf1b5f8f320b7c2ce462151f8fa74de8934becf"}, + {file = "pyasn1-0.4.8-py2.6.egg", hash = "sha256:5c9414dcfede6e441f7e8f81b43b34e834731003427e5b09e4e00e3172a10f00"}, + {file = "pyasn1-0.4.8-py2.7.egg", hash = "sha256:6e7545f1a61025a4e58bb336952c5061697da694db1cae97b116e9c46abcf7c8"}, + {file = "pyasn1-0.4.8-py2.py3-none-any.whl", hash = "sha256:39c7e2ec30515947ff4e87fb6f456dfc6e84857d34be479c9d4a4ba4bf46aa5d"}, + {file = "pyasn1-0.4.8-py3.1.egg", hash = "sha256:78fa6da68ed2727915c4767bb386ab32cdba863caa7dbe473eaae45f9959da86"}, + {file = "pyasn1-0.4.8-py3.2.egg", hash = "sha256:08c3c53b75eaa48d71cf8c710312316392ed40899cb34710d092e96745a358b7"}, + {file = "pyasn1-0.4.8-py3.3.egg", hash = "sha256:03840c999ba71680a131cfaee6fab142e1ed9bbd9c693e285cc6aca0d555e576"}, + {file = "pyasn1-0.4.8-py3.4.egg", hash = "sha256:7ab8a544af125fb704feadb008c99a88805126fb525280b2270bb25cc1d78a12"}, + {file = "pyasn1-0.4.8-py3.5.egg", hash = "sha256:e89bf84b5437b532b0803ba5c9a5e054d21fec423a89952a74f87fa2c9b7bce2"}, + {file = "pyasn1-0.4.8-py3.6.egg", hash = "sha256:014c0e9976956a08139dc0712ae195324a75e142284d5f87f1a87ee1b068a359"}, + {file = "pyasn1-0.4.8-py3.7.egg", hash = "sha256:99fcc3c8d804d1bc6d9a099921e39d827026409a58f2a720dcdb89374ea0c776"}, + {file = "pyasn1-0.4.8.tar.gz", hash = "sha256:aef77c9fb94a3ac588e87841208bdec464471d9871bd5050a287cc9a475cd0ba"}, +] +pyasn1-modules = [ + {file = "pyasn1-modules-0.2.8.tar.gz", hash = "sha256:905f84c712230b2c592c19470d3ca8d552de726050d1d1716282a1f6146be65e"}, + {file = "pyasn1_modules-0.2.8-py2.4.egg", hash = "sha256:0fe1b68d1e486a1ed5473f1302bd991c1611d319bba158e98b106ff86e1d7199"}, + {file = "pyasn1_modules-0.2.8-py2.5.egg", hash = "sha256:fe0644d9ab041506b62782e92b06b8c68cca799e1a9636ec398675459e031405"}, + {file = "pyasn1_modules-0.2.8-py2.6.egg", hash = "sha256:a99324196732f53093a84c4369c996713eb8c89d360a496b599fb1a9c47fc3eb"}, + {file = "pyasn1_modules-0.2.8-py2.7.egg", hash = "sha256:0845a5582f6a02bb3e1bde9ecfc4bfcae6ec3210dd270522fee602365430c3f8"}, + {file = "pyasn1_modules-0.2.8-py2.py3-none-any.whl", hash = "sha256:a50b808ffeb97cb3601dd25981f6b016cbb3d31fbf57a8b8a87428e6158d0c74"}, + {file = "pyasn1_modules-0.2.8-py3.1.egg", hash = "sha256:f39edd8c4ecaa4556e989147ebf219227e2cd2e8a43c7e7fcb1f1c18c5fd6a3d"}, + {file = "pyasn1_modules-0.2.8-py3.2.egg", hash = "sha256:b80486a6c77252ea3a3e9b1e360bc9cf28eaac41263d173c032581ad2f20fe45"}, + {file = "pyasn1_modules-0.2.8-py3.3.egg", hash = "sha256:65cebbaffc913f4fe9e4808735c95ea22d7a7775646ab690518c056784bc21b4"}, + {file = "pyasn1_modules-0.2.8-py3.4.egg", hash = "sha256:15b7c67fabc7fc240d87fb9aabf999cf82311a6d6fb2c70d00d3d0604878c811"}, + {file = "pyasn1_modules-0.2.8-py3.5.egg", hash = "sha256:426edb7a5e8879f1ec54a1864f16b882c2837bfd06eee62f2c982315ee2473ed"}, + {file = "pyasn1_modules-0.2.8-py3.6.egg", hash = "sha256:cbac4bc38d117f2a49aeedec4407d23e8866ea4ac27ff2cf7fb3e5b570df19e0"}, + {file = "pyasn1_modules-0.2.8-py3.7.egg", hash = "sha256:c29a5e5cc7a3f05926aff34e097e84f8589cd790ce0ed41b67aed6857b26aafd"}, +] +pycparser = [ + {file = "pycparser-2.20-py2.py3-none-any.whl", hash = "sha256:7582ad22678f0fcd81102833f60ef8d0e57288b6b5fb00323d101be910e35705"}, + {file = "pycparser-2.20.tar.gz", hash = "sha256:2d475327684562c3a96cc71adf7dc8c4f0565175cf86b6d7a404ff4c771f15f0"}, +] +pycryptodome = [ + {file = "pycryptodome-3.10.1-cp27-cp27m-macosx_10_9_x86_64.whl", hash = "sha256:1c5e1ca507de2ad93474be5cfe2bfa76b7cf039a1a32fc196f40935944871a06"}, + {file = "pycryptodome-3.10.1-cp27-cp27m-manylinux1_i686.whl", hash = "sha256:6260e24d41149268122dd39d4ebd5941e9d107f49463f7e071fd397e29923b0c"}, + {file = "pycryptodome-3.10.1-cp27-cp27m-manylinux1_x86_64.whl", hash = "sha256:3f840c49d38986f6e17dbc0673d37947c88bc9d2d9dba1c01b979b36f8447db1"}, + {file = "pycryptodome-3.10.1-cp27-cp27m-manylinux2010_i686.whl", hash = "sha256:2dea65df54349cdfa43d6b2e8edb83f5f8d6861e5cf7b1fbc3e34c5694c85e27"}, + {file = "pycryptodome-3.10.1-cp27-cp27m-manylinux2010_x86_64.whl", hash = "sha256:e61e363d9a5d7916f3a4ce984a929514c0df3daf3b1b2eb5e6edbb131ee771cf"}, + {file = "pycryptodome-3.10.1-cp27-cp27m-manylinux2014_aarch64.whl", hash = "sha256:2603c98ae04aac675fefcf71a6c87dc4bb74a75e9071ae3923bbc91a59f08d35"}, + {file = "pycryptodome-3.10.1-cp27-cp27m-win32.whl", hash = "sha256:38661348ecb71476037f1e1f553159b80d256c00f6c0b00502acac891f7116d9"}, + {file = "pycryptodome-3.10.1-cp27-cp27m-win_amd64.whl", hash = "sha256:1723ebee5561628ce96748501cdaa7afaa67329d753933296321f0be55358dce"}, + {file = "pycryptodome-3.10.1-cp27-cp27mu-manylinux1_i686.whl", hash = "sha256:77997519d8eb8a4adcd9a47b9cec18f9b323e296986528186c0e9a7a15d6a07e"}, + {file = "pycryptodome-3.10.1-cp27-cp27mu-manylinux1_x86_64.whl", hash = "sha256:99b2f3fc51d308286071d0953f92055504a6ffe829a832a9fc7a04318a7683dd"}, + {file = "pycryptodome-3.10.1-cp27-cp27mu-manylinux2010_i686.whl", hash = "sha256:e0a4d5933a88a2c98bbe19c0c722f5483dc628d7a38338ac2cb64a7dbd34064b"}, + {file = "pycryptodome-3.10.1-cp27-cp27mu-manylinux2010_x86_64.whl", hash = "sha256:d3d6958d53ad307df5e8469cc44474a75393a434addf20ecd451f38a72fe29b8"}, + {file = "pycryptodome-3.10.1-cp27-cp27mu-manylinux2014_aarch64.whl", hash = "sha256:a8eb8b6ea09ec1c2535bf39914377bc8abcab2c7d30fa9225eb4fe412024e427"}, + {file = "pycryptodome-3.10.1-cp35-abi3-macosx_10_9_x86_64.whl", hash = "sha256:31c1df17b3dc5f39600a4057d7db53ac372f492c955b9b75dd439f5d8b460129"}, + {file = "pycryptodome-3.10.1-cp35-abi3-manylinux1_i686.whl", hash = "sha256:a3105a0eb63eacf98c2ecb0eb4aa03f77f40fbac2bdde22020bb8a536b226bb8"}, + {file = "pycryptodome-3.10.1-cp35-abi3-manylinux1_x86_64.whl", hash = "sha256:a92d5c414e8ee1249e850789052608f582416e82422502dc0ac8c577808a9067"}, + {file = "pycryptodome-3.10.1-cp35-abi3-manylinux2010_i686.whl", hash = "sha256:60386d1d4cfaad299803b45a5bc2089696eaf6cdd56f9fc17479a6f89595cfc8"}, + {file = "pycryptodome-3.10.1-cp35-abi3-manylinux2010_x86_64.whl", hash = "sha256:501ab36aae360e31d0ec370cf5ce8ace6cb4112060d099b993bc02b36ac83fb6"}, + {file = "pycryptodome-3.10.1-cp35-abi3-manylinux2014_aarch64.whl", hash = "sha256:fc7489a50323a0df02378bc2fff86eb69d94cc5639914346c736be981c6a02e7"}, + {file = "pycryptodome-3.10.1-cp35-abi3-win32.whl", hash = "sha256:9b6f711b25e01931f1c61ce0115245a23cdc8b80bf8539ac0363bdcf27d649b6"}, + {file = "pycryptodome-3.10.1-cp35-abi3-win_amd64.whl", hash = "sha256:7fd519b89585abf57bf47d90166903ec7b43af4fe23c92273ea09e6336af5c07"}, + {file = "pycryptodome-3.10.1-pp27-pypy_73-macosx_10_9_x86_64.whl", hash = "sha256:09c1555a3fa450e7eaca41ea11cd00afe7c91fef52353488e65663777d8524e0"}, + {file = "pycryptodome-3.10.1-pp27-pypy_73-manylinux1_x86_64.whl", hash = "sha256:758949ca62690b1540dfb24ad773c6da9cd0e425189e83e39c038bbd52b8e438"}, + {file = "pycryptodome-3.10.1-pp27-pypy_73-manylinux2010_x86_64.whl", hash = "sha256:e3bf558c6aeb49afa9f0c06cee7fb5947ee5a1ff3bd794b653d39926b49077fa"}, + {file = "pycryptodome-3.10.1-pp27-pypy_73-win32.whl", hash = "sha256:f977cdf725b20f6b8229b0c87acb98c7717e742ef9f46b113985303ae12a99da"}, + {file = "pycryptodome-3.10.1-pp36-pypy36_pp73-macosx_10_9_x86_64.whl", hash = "sha256:6d2df5223b12437e644ce0a3be7809471ffa71de44ccd28b02180401982594a6"}, + {file = "pycryptodome-3.10.1-pp36-pypy36_pp73-manylinux1_x86_64.whl", hash = "sha256:98213ac2b18dc1969a47bc65a79a8fca02a414249d0c8635abb081c7f38c91b6"}, + {file = "pycryptodome-3.10.1-pp36-pypy36_pp73-manylinux2010_x86_64.whl", hash = "sha256:12222a5edc9ca4a29de15fbd5339099c4c26c56e13c2ceddf0b920794f26165d"}, + {file = "pycryptodome-3.10.1-pp36-pypy36_pp73-win32.whl", hash = "sha256:6bbf7fee7b7948b29d7e71fcacf48bac0c57fb41332007061a933f2d996f9713"}, + {file = "pycryptodome-3.10.1.tar.gz", hash = "sha256:3e2e3a06580c5f190df843cdb90ea28d61099cf4924334d5297a995de68e4673"}, +] +pydantic = [ + {file = "pydantic-1.8.2-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:05ddfd37c1720c392f4e0d43c484217b7521558302e7069ce8d318438d297739"}, + {file = "pydantic-1.8.2-cp36-cp36m-manylinux1_i686.whl", hash = "sha256:a7c6002203fe2c5a1b5cbb141bb85060cbff88c2d78eccbc72d97eb7022c43e4"}, + {file = "pydantic-1.8.2-cp36-cp36m-manylinux2014_i686.whl", hash = "sha256:589eb6cd6361e8ac341db97602eb7f354551482368a37f4fd086c0733548308e"}, + {file = "pydantic-1.8.2-cp36-cp36m-manylinux2014_x86_64.whl", hash = "sha256:10e5622224245941efc193ad1d159887872776df7a8fd592ed746aa25d071840"}, + {file = "pydantic-1.8.2-cp36-cp36m-win_amd64.whl", hash = "sha256:99a9fc39470010c45c161a1dc584997f1feb13f689ecf645f59bb4ba623e586b"}, + {file = "pydantic-1.8.2-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:a83db7205f60c6a86f2c44a61791d993dff4b73135df1973ecd9eed5ea0bda20"}, + {file = "pydantic-1.8.2-cp37-cp37m-manylinux1_i686.whl", hash = "sha256:41b542c0b3c42dc17da70554bc6f38cbc30d7066d2c2815a94499b5684582ecb"}, + {file = "pydantic-1.8.2-cp37-cp37m-manylinux2014_i686.whl", hash = "sha256:ea5cb40a3b23b3265f6325727ddfc45141b08ed665458be8c6285e7b85bd73a1"}, + {file = "pydantic-1.8.2-cp37-cp37m-manylinux2014_x86_64.whl", hash = "sha256:18b5ea242dd3e62dbf89b2b0ec9ba6c7b5abaf6af85b95a97b00279f65845a23"}, + {file = "pydantic-1.8.2-cp37-cp37m-win_amd64.whl", hash = "sha256:234a6c19f1c14e25e362cb05c68afb7f183eb931dd3cd4605eafff055ebbf287"}, + {file = "pydantic-1.8.2-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:021ea0e4133e8c824775a0cfe098677acf6fa5a3cbf9206a376eed3fc09302cd"}, + {file = "pydantic-1.8.2-cp38-cp38-manylinux1_i686.whl", hash = "sha256:e710876437bc07bd414ff453ac8ec63d219e7690128d925c6e82889d674bb505"}, + {file = "pydantic-1.8.2-cp38-cp38-manylinux2014_i686.whl", hash = "sha256:ac8eed4ca3bd3aadc58a13c2aa93cd8a884bcf21cb019f8cfecaae3b6ce3746e"}, + {file = "pydantic-1.8.2-cp38-cp38-manylinux2014_x86_64.whl", hash = "sha256:4a03cbbe743e9c7247ceae6f0d8898f7a64bb65800a45cbdc52d65e370570820"}, + {file = "pydantic-1.8.2-cp38-cp38-win_amd64.whl", hash = "sha256:8621559dcf5afacf0069ed194278f35c255dc1a1385c28b32dd6c110fd6531b3"}, + {file = "pydantic-1.8.2-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:8b223557f9510cf0bfd8b01316bf6dd281cf41826607eada99662f5e4963f316"}, + {file = "pydantic-1.8.2-cp39-cp39-manylinux1_i686.whl", hash = "sha256:244ad78eeb388a43b0c927e74d3af78008e944074b7d0f4f696ddd5b2af43c62"}, + {file = "pydantic-1.8.2-cp39-cp39-manylinux2014_i686.whl", hash = "sha256:05ef5246a7ffd2ce12a619cbb29f3307b7c4509307b1b49f456657b43529dc6f"}, + {file = "pydantic-1.8.2-cp39-cp39-manylinux2014_x86_64.whl", hash = "sha256:54cd5121383f4a461ff7644c7ca20c0419d58052db70d8791eacbbe31528916b"}, + {file = "pydantic-1.8.2-cp39-cp39-win_amd64.whl", hash = "sha256:4be75bebf676a5f0f87937c6ddb061fa39cbea067240d98e298508c1bda6f3f3"}, + {file = "pydantic-1.8.2-py3-none-any.whl", hash = "sha256:fec866a0b59f372b7e776f2d7308511784dace622e0992a0b59ea3ccee0ae833"}, + {file = "pydantic-1.8.2.tar.gz", hash = "sha256:26464e57ccaafe72b7ad156fdaa4e9b9ef051f69e175dbbb463283000c05ab7b"}, +] +pygments = [ + {file = "Pygments-2.10.0-py3-none-any.whl", hash = "sha256:b8e67fe6af78f492b3c4b3e2970c0624cbf08beb1e493b2c99b9fa1b67a20380"}, + {file = "Pygments-2.10.0.tar.gz", hash = "sha256:f398865f7eb6874156579fdf36bc840a03cab64d1cde9e93d68f46a425ec52c6"}, +] +pyjwt = [ + {file = "PyJWT-2.1.0-py3-none-any.whl", hash = "sha256:934d73fbba91b0483d3857d1aff50e96b2a892384ee2c17417ed3203f173fca1"}, + {file = "PyJWT-2.1.0.tar.gz", hash = "sha256:fba44e7898bbca160a2b2b501f492824fc8382485d3a6f11ba5d0c1937ce6130"}, +] +pyparsing = [ + {file = "pyparsing-2.4.7-py2.py3-none-any.whl", hash = "sha256:ef9d7589ef3c200abe66653d3f1ab1033c3c419ae9b9bdb1240a85b024efc88b"}, + {file = "pyparsing-2.4.7.tar.gz", hash = "sha256:c203ec8783bf771a155b207279b9bccb8dea02d8f0c9e5f8ead507bc3246ecc1"}, +] +pyrsistent = [ + {file = "pyrsistent-0.18.0-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:f4c8cabb46ff8e5d61f56a037974228e978f26bfefce4f61a4b1ac0ba7a2ab72"}, + {file = "pyrsistent-0.18.0-cp36-cp36m-manylinux1_i686.whl", hash = "sha256:da6e5e818d18459fa46fac0a4a4e543507fe1110e808101277c5a2b5bab0cd2d"}, + {file = "pyrsistent-0.18.0-cp36-cp36m-manylinux1_x86_64.whl", hash = "sha256:5e4395bbf841693eaebaa5bb5c8f5cdbb1d139e07c975c682ec4e4f8126e03d2"}, + {file = "pyrsistent-0.18.0-cp36-cp36m-win32.whl", hash = "sha256:527be2bfa8dc80f6f8ddd65242ba476a6c4fb4e3aedbf281dfbac1b1ed4165b1"}, + {file = "pyrsistent-0.18.0-cp36-cp36m-win_amd64.whl", hash = "sha256:2aaf19dc8ce517a8653746d98e962ef480ff34b6bc563fc067be6401ffb457c7"}, + {file = "pyrsistent-0.18.0-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:58a70d93fb79dc585b21f9d72487b929a6fe58da0754fa4cb9f279bb92369396"}, + {file = "pyrsistent-0.18.0-cp37-cp37m-manylinux1_i686.whl", hash = "sha256:4916c10896721e472ee12c95cdc2891ce5890898d2f9907b1b4ae0f53588b710"}, + {file = "pyrsistent-0.18.0-cp37-cp37m-manylinux1_x86_64.whl", hash = "sha256:73ff61b1411e3fb0ba144b8f08d6749749775fe89688093e1efef9839d2dcc35"}, + {file = "pyrsistent-0.18.0-cp37-cp37m-win32.whl", hash = "sha256:b29b869cf58412ca5738d23691e96d8aff535e17390128a1a52717c9a109da4f"}, + {file = "pyrsistent-0.18.0-cp37-cp37m-win_amd64.whl", hash = "sha256:097b96f129dd36a8c9e33594e7ebb151b1515eb52cceb08474c10a5479e799f2"}, + {file = "pyrsistent-0.18.0-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:772e94c2c6864f2cd2ffbe58bb3bdefbe2a32afa0acb1a77e472aac831f83427"}, + {file = "pyrsistent-0.18.0-cp38-cp38-manylinux1_i686.whl", hash = "sha256:c1a9ff320fa699337e05edcaae79ef8c2880b52720bc031b219e5b5008ebbdef"}, + {file = "pyrsistent-0.18.0-cp38-cp38-manylinux1_x86_64.whl", hash = "sha256:cd3caef37a415fd0dae6148a1b6957a8c5f275a62cca02e18474608cb263640c"}, + {file = "pyrsistent-0.18.0-cp38-cp38-win32.whl", hash = "sha256:e79d94ca58fcafef6395f6352383fa1a76922268fa02caa2272fff501c2fdc78"}, + {file = "pyrsistent-0.18.0-cp38-cp38-win_amd64.whl", hash = "sha256:a0c772d791c38bbc77be659af29bb14c38ced151433592e326361610250c605b"}, + {file = "pyrsistent-0.18.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:d5ec194c9c573aafaceebf05fc400656722793dac57f254cd4741f3c27ae57b4"}, + {file = "pyrsistent-0.18.0-cp39-cp39-manylinux1_i686.whl", hash = "sha256:6b5eed00e597b5b5773b4ca30bd48a5774ef1e96f2a45d105db5b4ebb4bca680"}, + {file = "pyrsistent-0.18.0-cp39-cp39-manylinux1_x86_64.whl", hash = "sha256:48578680353f41dca1ca3dc48629fb77dfc745128b56fc01096b2530c13fd426"}, + {file = "pyrsistent-0.18.0-cp39-cp39-win32.whl", hash = "sha256:f3ef98d7b76da5eb19c37fda834d50262ff9167c65658d1d8f974d2e4d90676b"}, + {file = "pyrsistent-0.18.0-cp39-cp39-win_amd64.whl", hash = "sha256:404e1f1d254d314d55adb8d87f4f465c8693d6f902f67eb6ef5b4526dc58e6ea"}, + {file = "pyrsistent-0.18.0.tar.gz", hash = "sha256:773c781216f8c2900b42a7b638d5b517bb134ae1acbebe4d1e8f1f41ea60eb4b"}, +] +pytest = [ + {file = "pytest-6.2.5-py3-none-any.whl", hash = "sha256:7310f8d27bc79ced999e760ca304d69f6ba6c6649c0b60fb0e04a4a77cacc134"}, + {file = "pytest-6.2.5.tar.gz", hash = "sha256:131b36680866a76e6781d13f101efb86cf674ebb9762eb70d3082b6f29889e89"}, +] +python-dateutil = [ + {file = "python-dateutil-2.8.2.tar.gz", hash = "sha256:0123cacc1627ae19ddf3c27a5de5bd67ee4586fbdd6440d9748f8abb483d3e86"}, + {file = "python_dateutil-2.8.2-py2.py3-none-any.whl", hash = "sha256:961d03dc3453ebbc59dbdea9e4e11c5651520a876d0f4db161e8674aae935da9"}, +] +python-multipart = [ + {file = "python-multipart-0.0.5.tar.gz", hash = "sha256:f7bb5f611fc600d15fa47b3974c8aa16e93724513b49b5f95c81e6624c83fa43"}, +] +pytz = [ + {file = "pytz-2021.1-py2.py3-none-any.whl", hash = "sha256:eb10ce3e7736052ed3623d49975ce333bcd712c7bb19a58b9e2089d4057d0798"}, + {file = "pytz-2021.1.tar.gz", hash = "sha256:83a4a90894bf38e243cf052c8b58f381bfe9a7a483f6a9cab140bc7f702ac4da"}, +] +pywin32 = [ + {file = "pywin32-301-cp35-cp35m-win32.whl", hash = "sha256:93367c96e3a76dfe5003d8291ae16454ca7d84bb24d721e0b74a07610b7be4a7"}, + {file = "pywin32-301-cp35-cp35m-win_amd64.whl", hash = "sha256:9635df6998a70282bd36e7ac2a5cef9ead1627b0a63b17c731312c7a0daebb72"}, + {file = "pywin32-301-cp36-cp36m-win32.whl", hash = "sha256:c866f04a182a8cb9b7855de065113bbd2e40524f570db73ef1ee99ff0a5cc2f0"}, + {file = "pywin32-301-cp36-cp36m-win_amd64.whl", hash = "sha256:dafa18e95bf2a92f298fe9c582b0e205aca45c55f989937c52c454ce65b93c78"}, + {file = "pywin32-301-cp37-cp37m-win32.whl", hash = "sha256:98f62a3f60aa64894a290fb7494bfa0bfa0a199e9e052e1ac293b2ad3cd2818b"}, + {file = "pywin32-301-cp37-cp37m-win_amd64.whl", hash = "sha256:fb3b4933e0382ba49305cc6cd3fb18525df7fd96aa434de19ce0878133bf8e4a"}, + {file = "pywin32-301-cp38-cp38-win32.whl", hash = "sha256:88981dd3cfb07432625b180f49bf4e179fb8cbb5704cd512e38dd63636af7a17"}, + {file = "pywin32-301-cp38-cp38-win_amd64.whl", hash = "sha256:8c9d33968aa7fcddf44e47750e18f3d034c3e443a707688a008a2e52bbef7e96"}, + {file = "pywin32-301-cp39-cp39-win32.whl", hash = "sha256:595d397df65f1b2e0beaca63a883ae6d8b6df1cdea85c16ae85f6d2e648133fe"}, + {file = "pywin32-301-cp39-cp39-win_amd64.whl", hash = "sha256:87604a4087434cd814ad8973bd47d6524bd1fa9e971ce428e76b62a5e0860fdf"}, +] +pywinpty = [ + {file = "pywinpty-1.1.3-cp36-none-win_amd64.whl", hash = "sha256:81dc6f16d917b756e06fc58943e9750d59dbefc0ffd2086871d3fa5f33824446"}, + {file = "pywinpty-1.1.3-cp37-none-win_amd64.whl", hash = "sha256:54557887e712ea3215ab0d9f089ed55a6cc8d826cd5d1e340d75300654c9663f"}, + {file = "pywinpty-1.1.3-cp38-none-win_amd64.whl", hash = "sha256:f5e25197397f1fef0362caf3eb89f25441827a1e48bf15827c27021592fd2160"}, + {file = "pywinpty-1.1.3-cp39-none-win_amd64.whl", hash = "sha256:b767276224f86b7560eb9173ba7956758cafcdfab97bb33837d42d2a0f1dbf67"}, + {file = "pywinpty-1.1.3.tar.gz", hash = "sha256:3a1d57b338390333812a5eed31c93c7d8ba82b131078063703e731946d90c9f2"}, +] +pyyaml = [ + {file = "PyYAML-5.4.1-cp27-cp27m-macosx_10_9_x86_64.whl", hash = "sha256:3b2b1824fe7112845700f815ff6a489360226a5609b96ec2190a45e62a9fc922"}, + {file = "PyYAML-5.4.1-cp27-cp27m-win32.whl", hash = "sha256:129def1b7c1bf22faffd67b8f3724645203b79d8f4cc81f674654d9902cb4393"}, + {file = "PyYAML-5.4.1-cp27-cp27m-win_amd64.whl", hash = "sha256:4465124ef1b18d9ace298060f4eccc64b0850899ac4ac53294547536533800c8"}, + {file = "PyYAML-5.4.1-cp27-cp27mu-manylinux1_x86_64.whl", hash = "sha256:bb4191dfc9306777bc594117aee052446b3fa88737cd13b7188d0e7aa8162185"}, + {file = "PyYAML-5.4.1-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:6c78645d400265a062508ae399b60b8c167bf003db364ecb26dcab2bda048253"}, + {file = "PyYAML-5.4.1-cp36-cp36m-manylinux1_x86_64.whl", hash = "sha256:4e0583d24c881e14342eaf4ec5fbc97f934b999a6828693a99157fde912540cc"}, + {file = "PyYAML-5.4.1-cp36-cp36m-manylinux2014_aarch64.whl", hash = "sha256:72a01f726a9c7851ca9bfad6fd09ca4e090a023c00945ea05ba1638c09dc3347"}, + {file = "PyYAML-5.4.1-cp36-cp36m-manylinux2014_s390x.whl", hash = "sha256:895f61ef02e8fed38159bb70f7e100e00f471eae2bc838cd0f4ebb21e28f8541"}, + {file = "PyYAML-5.4.1-cp36-cp36m-win32.whl", hash = "sha256:3bd0e463264cf257d1ffd2e40223b197271046d09dadf73a0fe82b9c1fc385a5"}, + {file = "PyYAML-5.4.1-cp36-cp36m-win_amd64.whl", hash = "sha256:e4fac90784481d221a8e4b1162afa7c47ed953be40d31ab4629ae917510051df"}, + {file = "PyYAML-5.4.1-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:5accb17103e43963b80e6f837831f38d314a0495500067cb25afab2e8d7a4018"}, + {file = "PyYAML-5.4.1-cp37-cp37m-manylinux1_x86_64.whl", hash = "sha256:e1d4970ea66be07ae37a3c2e48b5ec63f7ba6804bdddfdbd3cfd954d25a82e63"}, + {file = "PyYAML-5.4.1-cp37-cp37m-manylinux2014_aarch64.whl", hash = "sha256:cb333c16912324fd5f769fff6bc5de372e9e7a202247b48870bc251ed40239aa"}, + {file = "PyYAML-5.4.1-cp37-cp37m-manylinux2014_s390x.whl", hash = "sha256:fe69978f3f768926cfa37b867e3843918e012cf83f680806599ddce33c2c68b0"}, + {file = "PyYAML-5.4.1-cp37-cp37m-win32.whl", hash = "sha256:dd5de0646207f053eb0d6c74ae45ba98c3395a571a2891858e87df7c9b9bd51b"}, + {file = "PyYAML-5.4.1-cp37-cp37m-win_amd64.whl", hash = "sha256:08682f6b72c722394747bddaf0aa62277e02557c0fd1c42cb853016a38f8dedf"}, + {file = "PyYAML-5.4.1-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:d2d9808ea7b4af864f35ea216be506ecec180628aced0704e34aca0b040ffe46"}, + {file = "PyYAML-5.4.1-cp38-cp38-manylinux1_x86_64.whl", hash = "sha256:8c1be557ee92a20f184922c7b6424e8ab6691788e6d86137c5d93c1a6ec1b8fb"}, + {file = "PyYAML-5.4.1-cp38-cp38-manylinux2014_aarch64.whl", hash = "sha256:fd7f6999a8070df521b6384004ef42833b9bd62cfee11a09bda1079b4b704247"}, + {file = "PyYAML-5.4.1-cp38-cp38-manylinux2014_s390x.whl", hash = "sha256:bfb51918d4ff3d77c1c856a9699f8492c612cde32fd3bcd344af9be34999bfdc"}, + {file = "PyYAML-5.4.1-cp38-cp38-win32.whl", hash = "sha256:fa5ae20527d8e831e8230cbffd9f8fe952815b2b7dae6ffec25318803a7528fc"}, + {file = "PyYAML-5.4.1-cp38-cp38-win_amd64.whl", hash = "sha256:0f5f5786c0e09baddcd8b4b45f20a7b5d61a7e7e99846e3c799b05c7c53fa696"}, + {file = "PyYAML-5.4.1-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:294db365efa064d00b8d1ef65d8ea2c3426ac366c0c4368d930bf1c5fb497f77"}, + {file = "PyYAML-5.4.1-cp39-cp39-manylinux1_x86_64.whl", hash = "sha256:74c1485f7707cf707a7aef42ef6322b8f97921bd89be2ab6317fd782c2d53183"}, + {file = "PyYAML-5.4.1-cp39-cp39-manylinux2014_aarch64.whl", hash = "sha256:d483ad4e639292c90170eb6f7783ad19490e7a8defb3e46f97dfe4bacae89122"}, + {file = "PyYAML-5.4.1-cp39-cp39-manylinux2014_s390x.whl", hash = "sha256:fdc842473cd33f45ff6bce46aea678a54e3d21f1b61a7750ce3c498eedfe25d6"}, + {file = "PyYAML-5.4.1-cp39-cp39-win32.whl", hash = "sha256:49d4cdd9065b9b6e206d0595fee27a96b5dd22618e7520c33204a4a3239d5b10"}, + {file = "PyYAML-5.4.1-cp39-cp39-win_amd64.whl", hash = "sha256:c20cfa2d49991c8b4147af39859b167664f2ad4561704ee74c1de03318e898db"}, + {file = "PyYAML-5.4.1.tar.gz", hash = "sha256:607774cbba28732bfa802b54baa7484215f530991055bb562efbed5b2f20a45e"}, +] +pyzmq = [ + {file = "pyzmq-22.2.1-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:b921758f8b5098faa85f341bbdd5e36d5339de5e9032ca2b07d8c8e7bec5069b"}, + {file = "pyzmq-22.2.1-cp36-cp36m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:240b83b3a8175b2f616f80092cbb019fcd5c18598f78ffc6aa0ae9034b300f14"}, + {file = "pyzmq-22.2.1-cp36-cp36m-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:da7f7f3bb08bcf59a6b60b4e53dd8f08bb00c9e61045319d825a906dbb3c8fb7"}, + {file = "pyzmq-22.2.1-cp36-cp36m-manylinux_2_5_x86_64.manylinux1_x86_64.whl", hash = "sha256:e66025b64c4724ba683d6d4a4e5ee23de12fe9ae683908f0c7f0f91b4a2fd94e"}, + {file = "pyzmq-22.2.1-cp36-cp36m-win32.whl", hash = "sha256:50d007d5702171bc810c1e74498fa2c7bc5b50f9750697f7fd2a3e71a25aad91"}, + {file = "pyzmq-22.2.1-cp36-cp36m-win_amd64.whl", hash = "sha256:b4a51c7d906dc263a0cc5590761e53e0a68f2c2fefe549cbef21c9ee5d2d98a4"}, + {file = "pyzmq-22.2.1-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:93705cb90baa9d6f75e8448861a1efd3329006f79095ab18846bd1eaa342f7c3"}, + {file = "pyzmq-22.2.1-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:620b0abb813958cb3ecb5144c177e26cde92fee6f43c4b9de6b329515532bf27"}, + {file = "pyzmq-22.2.1-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:2dd3896b3c952cf6c8013deda53c1df16bf962f355b5503d23521e0f6403ae3d"}, + {file = "pyzmq-22.2.1-cp37-cp37m-manylinux_2_5_x86_64.manylinux1_x86_64.whl", hash = "sha256:6e9c030222893afa86881d7485d3e841969760a16004bd23e9a83cca28b42778"}, + {file = "pyzmq-22.2.1-cp37-cp37m-win32.whl", hash = "sha256:262f470e7acde18b7217aac78d19d2e29ced91a5afbeb7d98521ebf26461aa7e"}, + {file = "pyzmq-22.2.1-cp37-cp37m-win_amd64.whl", hash = "sha256:246f27b88722cfa729bb04881e94484e40b085720d728c1b05133b3f331b0b7b"}, + {file = "pyzmq-22.2.1-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:0d17bac19e934e9f547a8811b7c2a32651a7840f38086b924e2e3dcb2fae5c3a"}, + {file = "pyzmq-22.2.1-cp38-cp38-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:5933d1f4087de6e52906f72d92e1e4dcc630d371860b92c55d7f7a4b815a664c"}, + {file = "pyzmq-22.2.1-cp38-cp38-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:ac4497e4b7d134ee53ce5532d9cc3b640d6e71806a55062984e0c99a2f88f465"}, + {file = "pyzmq-22.2.1-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:66375a6094af72a6098ed4403b15b4db6bf00013c6febc1baa832e7abda827f4"}, + {file = "pyzmq-22.2.1-cp38-cp38-win32.whl", hash = "sha256:b2c16d20bd0aef8e57bc9505fdd80ea0d6008020c3740accd96acf1b3d1b5347"}, + {file = "pyzmq-22.2.1-cp38-cp38-win_amd64.whl", hash = "sha256:ff345d48940c834168f81fa1d4724675099f148f1ab6369748c4d712ed71bf7c"}, + {file = "pyzmq-22.2.1-cp39-cp39-macosx_10_15_universal2.whl", hash = "sha256:f5c84c5de9a773bbf8b22c51e28380999ea72e5e85b4db8edf5e69a7a0d4d9f9"}, + {file = "pyzmq-22.2.1-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:2534a036b777f957bd6b89b55fb2136775ca2659fb0f1c85036ba78d17d86fd5"}, + {file = "pyzmq-22.2.1-cp39-cp39-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:a649065413ba4eab92a783a7caa4de8ce14cf46ba8a2a09951426143f1298adb"}, + {file = "pyzmq-22.2.1-cp39-cp39-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:c9cb0bd3a3cb7ccad3caa1d7b0d18ba71ed3a4a3610028e506a4084371d4d223"}, + {file = "pyzmq-22.2.1-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b4428302c389fffc0c9c07a78cad5376636b9d096f332acfe66b321ae9ff2c63"}, + {file = "pyzmq-22.2.1-cp39-cp39-win32.whl", hash = "sha256:6a5b4566f66d953601d0d47d4071897f550a265bafd52ebcad5ac7aad3838cbb"}, + {file = "pyzmq-22.2.1-cp39-cp39-win_amd64.whl", hash = "sha256:89200ab6ef9081c72a04ed84c52a50b60dcb0655375aeedb40689bc7c934715e"}, + {file = "pyzmq-22.2.1-pp37-pypy37_pp73-macosx_10_9_x86_64.whl", hash = "sha256:ed67df4eaa99a20d162d76655bda23160abdf8abf82a17f41dfd3962e608dbcc"}, + {file = "pyzmq-22.2.1-pp37-pypy37_pp73-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:021e22a8c58ab294bd4b96448a2ca4e716e1d76600192ff84c33d71edb1fbd37"}, + {file = "pyzmq-22.2.1-pp37-pypy37_pp73-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:200ac096cee5499964c90687306a7244b79ef891f773ed4cf15019fd1f3df330"}, + {file = "pyzmq-22.2.1-pp37-pypy37_pp73-win_amd64.whl", hash = "sha256:b3f57bee62e36be5c97712de32237c5589caee0d1154c2ad01a888accfae20bc"}, + {file = "pyzmq-22.2.1.tar.gz", hash = "sha256:6d18c76676771fd891ca8e0e68da0bbfb88e30129835c0ade748016adb3b6242"}, +] +qtconsole = [ + {file = "qtconsole-5.1.1-py3-none-any.whl", hash = "sha256:73994105b0369bb99f4164df4a131010f3c7b33a7b5169c37366358d8744675b"}, + {file = "qtconsole-5.1.1.tar.gz", hash = "sha256:bbc34bca14f65535afcb401bc74b752bac955e5313001ba640383f7e5857dc49"}, +] +qtpy = [ + {file = "QtPy-1.10.0-py2.py3-none-any.whl", hash = "sha256:f683ce6cd825ba8248a798bf1dfa1a07aca387c88ae44fa5479537490aace7be"}, + {file = "QtPy-1.10.0.tar.gz", hash = "sha256:3d20f010caa3b2c04835d6a2f66f8873b041bdaf7a76085c2a0d7890cdd65ea9"}, +] +regex = [ + {file = "regex-2021.8.28-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:9d05ad5367c90814099000442b2125535e9d77581855b9bee8780f1b41f2b1a2"}, + {file = "regex-2021.8.28-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f3bf1bc02bc421047bfec3343729c4bbbea42605bcfd6d6bfe2c07ade8b12d2a"}, + {file = "regex-2021.8.28-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:5f6a808044faae658f546dd5f525e921de9fa409de7a5570865467f03a626fc0"}, + {file = "regex-2021.8.28-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:a617593aeacc7a691cc4af4a4410031654f2909053bd8c8e7db837f179a630eb"}, + {file = "regex-2021.8.28-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:79aef6b5cd41feff359acaf98e040844613ff5298d0d19c455b3d9ae0bc8c35a"}, + {file = "regex-2021.8.28-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:0fc1f8f06977c2d4f5e3d3f0d4a08089be783973fc6b6e278bde01f0544ff308"}, + {file = "regex-2021.8.28-cp310-cp310-win32.whl", hash = "sha256:6eebf512aa90751d5ef6a7c2ac9d60113f32e86e5687326a50d7686e309f66ed"}, + {file = "regex-2021.8.28-cp310-cp310-win_amd64.whl", hash = "sha256:ac88856a8cbccfc14f1b2d0b829af354cc1743cb375e7f04251ae73b2af6adf8"}, + {file = "regex-2021.8.28-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:c206587c83e795d417ed3adc8453a791f6d36b67c81416676cad053b4104152c"}, + {file = "regex-2021.8.28-cp36-cp36m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e8690ed94481f219a7a967c118abaf71ccc440f69acd583cab721b90eeedb77c"}, + {file = "regex-2021.8.28-cp36-cp36m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:328a1fad67445550b982caa2a2a850da5989fd6595e858f02d04636e7f8b0b13"}, + {file = "regex-2021.8.28-cp36-cp36m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:c7cb4c512d2d3b0870e00fbbac2f291d4b4bf2634d59a31176a87afe2777c6f0"}, + {file = "regex-2021.8.28-cp36-cp36m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:66256b6391c057305e5ae9209941ef63c33a476b73772ca967d4a2df70520ec1"}, + {file = "regex-2021.8.28-cp36-cp36m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:8e44769068d33e0ea6ccdf4b84d80c5afffe5207aa4d1881a629cf0ef3ec398f"}, + {file = "regex-2021.8.28-cp36-cp36m-win32.whl", hash = "sha256:08d74bfaa4c7731b8dac0a992c63673a2782758f7cfad34cf9c1b9184f911354"}, + {file = "regex-2021.8.28-cp36-cp36m-win_amd64.whl", hash = "sha256:abb48494d88e8a82601af905143e0de838c776c1241d92021e9256d5515b3645"}, + {file = "regex-2021.8.28-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:b4c220a1fe0d2c622493b0a1fd48f8f991998fb447d3cd368033a4b86cf1127a"}, + {file = "regex-2021.8.28-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d4a332404baa6665b54e5d283b4262f41f2103c255897084ec8f5487ce7b9e8e"}, + {file = "regex-2021.8.28-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c61dcc1cf9fd165127a2853e2c31eb4fb961a4f26b394ac9fe5669c7a6592892"}, + {file = "regex-2021.8.28-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:ee329d0387b5b41a5dddbb6243a21cb7896587a651bebb957e2d2bb8b63c0791"}, + {file = "regex-2021.8.28-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:f60667673ff9c249709160529ab39667d1ae9fd38634e006bec95611f632e759"}, + {file = "regex-2021.8.28-cp37-cp37m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:b844fb09bd9936ed158ff9df0ab601e2045b316b17aa8b931857365ea8586906"}, + {file = "regex-2021.8.28-cp37-cp37m-win32.whl", hash = "sha256:4cde065ab33bcaab774d84096fae266d9301d1a2f5519d7bd58fc55274afbf7a"}, + {file = "regex-2021.8.28-cp37-cp37m-win_amd64.whl", hash = "sha256:1413b5022ed6ac0d504ba425ef02549a57d0f4276de58e3ab7e82437892704fc"}, + {file = "regex-2021.8.28-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:ed4b50355b066796dacdd1cf538f2ce57275d001838f9b132fab80b75e8c84dd"}, + {file = "regex-2021.8.28-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:28fc475f560d8f67cc8767b94db4c9440210f6958495aeae70fac8faec631797"}, + {file = "regex-2021.8.28-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:bdc178caebd0f338d57ae445ef8e9b737ddf8fbc3ea187603f65aec5b041248f"}, + {file = "regex-2021.8.28-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:999ad08220467b6ad4bd3dd34e65329dd5d0df9b31e47106105e407954965256"}, + {file = "regex-2021.8.28-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:808ee5834e06f57978da3e003ad9d6292de69d2bf6263662a1a8ae30788e080b"}, + {file = "regex-2021.8.28-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:d5111d4c843d80202e62b4fdbb4920db1dcee4f9366d6b03294f45ed7b18b42e"}, + {file = "regex-2021.8.28-cp38-cp38-win32.whl", hash = "sha256:473858730ef6d6ff7f7d5f19452184cd0caa062a20047f6d6f3e135a4648865d"}, + {file = "regex-2021.8.28-cp38-cp38-win_amd64.whl", hash = "sha256:31a99a4796bf5aefc8351e98507b09e1b09115574f7c9dbb9cf2111f7220d2e2"}, + {file = "regex-2021.8.28-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:04f6b9749e335bb0d2f68c707f23bb1773c3fb6ecd10edf0f04df12a8920d468"}, + {file = "regex-2021.8.28-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:9b006628fe43aa69259ec04ca258d88ed19b64791693df59c422b607b6ece8bb"}, + {file = "regex-2021.8.28-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:121f4b3185feaade3f85f70294aef3f777199e9b5c0c0245c774ae884b110a2d"}, + {file = "regex-2021.8.28-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:a577a21de2ef8059b58f79ff76a4da81c45a75fe0bfb09bc8b7bb4293fa18983"}, + {file = "regex-2021.8.28-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:1743345e30917e8c574f273f51679c294effba6ad372db1967852f12c76759d8"}, + {file = "regex-2021.8.28-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:e1e8406b895aba6caa63d9fd1b6b1700d7e4825f78ccb1e5260551d168db38ed"}, + {file = "regex-2021.8.28-cp39-cp39-win32.whl", hash = "sha256:ed283ab3a01d8b53de3a05bfdf4473ae24e43caee7dcb5584e86f3f3e5ab4374"}, + {file = "regex-2021.8.28-cp39-cp39-win_amd64.whl", hash = "sha256:610b690b406653c84b7cb6091facb3033500ee81089867ee7d59e675f9ca2b73"}, + {file = "regex-2021.8.28.tar.gz", hash = "sha256:f585cbbeecb35f35609edccb95efd95a3e35824cd7752b586503f7e6087303f1"}, +] +requests = [ + {file = "requests-2.26.0-py2.py3-none-any.whl", hash = "sha256:6c1246513ecd5ecd4528a0906f910e8f0f9c6b8ec72030dc9fd154dc1a6efd24"}, + {file = "requests-2.26.0.tar.gz", hash = "sha256:b8aa58f8cf793ffd8782d3d8cb19e66ef36f7aba4353eec859e74678b01b07a7"}, +] +requests-oauthlib = [ + {file = "requests-oauthlib-1.3.0.tar.gz", hash = "sha256:b4261601a71fd721a8bd6d7aa1cc1d6a8a93b4a9f5e96626f8e4d91e8beeaa6a"}, + {file = "requests_oauthlib-1.3.0-py2.py3-none-any.whl", hash = "sha256:7f71572defaecd16372f9006f33c2ec8c077c3cfa6f5911a9a90202beb513f3d"}, + {file = "requests_oauthlib-1.3.0-py3.7.egg", hash = "sha256:fa6c47b933f01060936d87ae9327fead68768b69c6c9ea2109c48be30f2d4dbc"}, +] +rlp = [ + {file = "rlp-2.0.1-py2.py3-none-any.whl", hash = "sha256:52a57c9f53f03c88b189283734b397314288250cc4a3c4113e9e36e2ac6bdd16"}, + {file = "rlp-2.0.1.tar.gz", hash = "sha256:665e8312750b3fc5f7002e656d05b9dcb6e93b6063df40d95c49ad90c19d1f0e"}, +] +rsa = [ + {file = "rsa-4.7.2-py3-none-any.whl", hash = "sha256:78f9a9bf4e7be0c5ded4583326e7461e3a3c5aae24073648b4bdfa797d78c9d2"}, + {file = "rsa-4.7.2.tar.gz", hash = "sha256:9d689e6ca1b3038bc82bf8d23e944b6b6037bc02301a574935b2dd946e0353b9"}, +] +rx = [ + {file = "Rx-1.6.1-py2.py3-none-any.whl", hash = "sha256:7357592bc7e881a95e0c2013b73326f704953301ab551fbc8133a6fadab84105"}, + {file = "Rx-1.6.1.tar.gz", hash = "sha256:13a1d8d9e252625c173dc795471e614eadfe1cf40ffc684e08b8fff0d9748c23"}, +] +send2trash = [ + {file = "Send2Trash-1.8.0-py3-none-any.whl", hash = "sha256:f20eaadfdb517eaca5ce077640cb261c7d2698385a6a0f072a4a5447fd49fa08"}, + {file = "Send2Trash-1.8.0.tar.gz", hash = "sha256:d2c24762fd3759860a0aff155e45871447ea58d2be6bdd39b5c8f966a0c99c2d"}, +] +six = [ + {file = "six-1.15.0-py2.py3-none-any.whl", hash = "sha256:8b74bedcbbbaca38ff6d7491d76f2b06b3592611af620f8426e82dddb04a5ced"}, + {file = "six-1.15.0.tar.gz", hash = "sha256:30639c035cdb23534cd4aa2dd52c3bf48f06e5f4a941509c8bafd8ce11080259"}, +] +sqlalchemy = [ + {file = "SQLAlchemy-1.3.24-cp27-cp27m-macosx_10_14_x86_64.whl", hash = "sha256:87a2725ad7d41cd7376373c15fd8bf674e9c33ca56d0b8036add2d634dba372e"}, + {file = "SQLAlchemy-1.3.24-cp27-cp27m-win32.whl", hash = "sha256:f597a243b8550a3a0b15122b14e49d8a7e622ba1c9d29776af741f1845478d79"}, + {file = "SQLAlchemy-1.3.24-cp27-cp27m-win_amd64.whl", hash = "sha256:fc4cddb0b474b12ed7bdce6be1b9edc65352e8ce66bc10ff8cbbfb3d4047dbf4"}, + {file = "SQLAlchemy-1.3.24-cp35-cp35m-macosx_10_14_x86_64.whl", hash = "sha256:f1149d6e5c49d069163e58a3196865e4321bad1803d7886e07d8710de392c548"}, + {file = "SQLAlchemy-1.3.24-cp35-cp35m-manylinux1_x86_64.whl", hash = "sha256:14f0eb5db872c231b20c18b1e5806352723a3a89fb4254af3b3e14f22eaaec75"}, + {file = "SQLAlchemy-1.3.24-cp35-cp35m-manylinux2010_x86_64.whl", hash = "sha256:e98d09f487267f1e8d1179bf3b9d7709b30a916491997137dd24d6ae44d18d79"}, + {file = "SQLAlchemy-1.3.24-cp35-cp35m-manylinux2014_aarch64.whl", hash = "sha256:fc1f2a5a5963e2e73bac4926bdaf7790c4d7d77e8fc0590817880e22dd9d0b8b"}, + {file = "SQLAlchemy-1.3.24-cp35-cp35m-win32.whl", hash = "sha256:f3c5c52f7cb8b84bfaaf22d82cb9e6e9a8297f7c2ed14d806a0f5e4d22e83fb7"}, + {file = "SQLAlchemy-1.3.24-cp35-cp35m-win_amd64.whl", hash = "sha256:0352db1befcbed2f9282e72843f1963860bf0e0472a4fa5cf8ee084318e0e6ab"}, + {file = "SQLAlchemy-1.3.24-cp36-cp36m-macosx_10_14_x86_64.whl", hash = "sha256:2ed6343b625b16bcb63c5b10523fd15ed8934e1ed0f772c534985e9f5e73d894"}, + {file = "SQLAlchemy-1.3.24-cp36-cp36m-manylinux1_x86_64.whl", hash = "sha256:34fcec18f6e4b24b4a5f6185205a04f1eab1e56f8f1d028a2a03694ebcc2ddd4"}, + {file = "SQLAlchemy-1.3.24-cp36-cp36m-manylinux2010_x86_64.whl", hash = "sha256:e47e257ba5934550d7235665eee6c911dc7178419b614ba9e1fbb1ce6325b14f"}, + {file = "SQLAlchemy-1.3.24-cp36-cp36m-manylinux2014_aarch64.whl", hash = "sha256:816de75418ea0953b5eb7b8a74933ee5a46719491cd2b16f718afc4b291a9658"}, + {file = "SQLAlchemy-1.3.24-cp36-cp36m-win32.whl", hash = "sha256:26155ea7a243cbf23287f390dba13d7927ffa1586d3208e0e8d615d0c506f996"}, + {file = "SQLAlchemy-1.3.24-cp36-cp36m-win_amd64.whl", hash = "sha256:f03bd97650d2e42710fbe4cf8a59fae657f191df851fc9fc683ecef10746a375"}, + {file = "SQLAlchemy-1.3.24-cp37-cp37m-macosx_10_14_x86_64.whl", hash = "sha256:a006d05d9aa052657ee3e4dc92544faae5fcbaafc6128217310945610d862d39"}, + {file = "SQLAlchemy-1.3.24-cp37-cp37m-manylinux1_x86_64.whl", hash = "sha256:1e2f89d2e5e3c7a88e25a3b0e43626dba8db2aa700253023b82e630d12b37109"}, + {file = "SQLAlchemy-1.3.24-cp37-cp37m-manylinux2010_x86_64.whl", hash = "sha256:0d5d862b1cfbec5028ce1ecac06a3b42bc7703eb80e4b53fceb2738724311443"}, + {file = "SQLAlchemy-1.3.24-cp37-cp37m-manylinux2014_aarch64.whl", hash = "sha256:0172423a27fbcae3751ef016663b72e1a516777de324a76e30efa170dbd3dd2d"}, + {file = "SQLAlchemy-1.3.24-cp37-cp37m-win32.whl", hash = "sha256:d37843fb8df90376e9e91336724d78a32b988d3d20ab6656da4eb8ee3a45b63c"}, + {file = "SQLAlchemy-1.3.24-cp37-cp37m-win_amd64.whl", hash = "sha256:c10ff6112d119f82b1618b6dc28126798481b9355d8748b64b9b55051eb4f01b"}, + {file = "SQLAlchemy-1.3.24-cp38-cp38-macosx_10_14_x86_64.whl", hash = "sha256:861e459b0e97673af6cc5e7f597035c2e3acdfb2608132665406cded25ba64c7"}, + {file = "SQLAlchemy-1.3.24-cp38-cp38-manylinux1_x86_64.whl", hash = "sha256:5de2464c254380d8a6c20a2746614d5a436260be1507491442cf1088e59430d2"}, + {file = "SQLAlchemy-1.3.24-cp38-cp38-manylinux2010_x86_64.whl", hash = "sha256:d375d8ccd3cebae8d90270f7aa8532fe05908f79e78ae489068f3b4eee5994e8"}, + {file = "SQLAlchemy-1.3.24-cp38-cp38-manylinux2014_aarch64.whl", hash = "sha256:014ea143572fee1c18322b7908140ad23b3994036ef4c0d630110faf942652f8"}, + {file = "SQLAlchemy-1.3.24-cp38-cp38-win32.whl", hash = "sha256:6607ae6cd3a07f8a4c3198ffbf256c261661965742e2b5265a77cd5c679c9bba"}, + {file = "SQLAlchemy-1.3.24-cp38-cp38-win_amd64.whl", hash = "sha256:fcb251305fa24a490b6a9ee2180e5f8252915fb778d3dafc70f9cc3f863827b9"}, + {file = "SQLAlchemy-1.3.24-cp39-cp39-macosx_10_14_x86_64.whl", hash = "sha256:01aa5f803db724447c1d423ed583e42bf5264c597fd55e4add4301f163b0be48"}, + {file = "SQLAlchemy-1.3.24-cp39-cp39-manylinux1_x86_64.whl", hash = "sha256:4d0e3515ef98aa4f0dc289ff2eebb0ece6260bbf37c2ea2022aad63797eacf60"}, + {file = "SQLAlchemy-1.3.24-cp39-cp39-manylinux2010_x86_64.whl", hash = "sha256:bce28277f308db43a6b4965734366f533b3ff009571ec7ffa583cb77539b84d6"}, + {file = "SQLAlchemy-1.3.24-cp39-cp39-manylinux2014_aarch64.whl", hash = "sha256:8110e6c414d3efc574543109ee618fe2c1f96fa31833a1ff36cc34e968c4f233"}, + {file = "SQLAlchemy-1.3.24-cp39-cp39-win32.whl", hash = "sha256:ee5f5188edb20a29c1cc4a039b074fdc5575337c9a68f3063449ab47757bb064"}, + {file = "SQLAlchemy-1.3.24-cp39-cp39-win_amd64.whl", hash = "sha256:09083c2487ca3c0865dc588e07aeaa25416da3d95f7482c07e92f47e080aa17b"}, + {file = "SQLAlchemy-1.3.24.tar.gz", hash = "sha256:ebbb777cbf9312359b897bf81ba00dae0f5cb69fba2a18265dcc18a6f5ef7519"}, +] +starlette = [ + {file = "starlette-0.14.2-py3-none-any.whl", hash = "sha256:3c8e48e52736b3161e34c9f0e8153b4f32ec5d8995a3ee1d59410d92f75162ed"}, + {file = "starlette-0.14.2.tar.gz", hash = "sha256:7d49f4a27f8742262ef1470608c59ddbc66baf37c148e938c7038e6bc7a998aa"}, +] +starlette-context = [ + {file = "starlette_context-0.3.3-py37-none-any.whl", hash = "sha256:7090b613d24b5ebd5d07682a503d883af40347076f466603a6493f3d0ce67f25"}, + {file = "starlette_context-0.3.3.tar.gz", hash = "sha256:1c900380d08c872461aa76e9ae4d7b454bf53724ac2355104f191845a3c9947d"}, +] +tensorboard = [ + {file = "tensorboard-2.6.0-py3-none-any.whl", hash = "sha256:f7dac4cdfb52d14c9e3f74585ce2aaf8e6203620a864e51faf84988b09f7bbdb"}, +] +tensorboard-data-server = [ + {file = "tensorboard_data_server-0.6.1-py3-none-any.whl", hash = "sha256:809fe9887682d35c1f7d1f54f0f40f98bb1f771b14265b453ca051e2ce58fca7"}, + {file = "tensorboard_data_server-0.6.1-py3-none-macosx_10_9_x86_64.whl", hash = "sha256:fa8cef9be4fcae2f2363c88176638baf2da19c5ec90addb49b1cde05c95c88ee"}, + {file = "tensorboard_data_server-0.6.1-py3-none-manylinux2010_x86_64.whl", hash = "sha256:d8237580755e58eff68d1f3abefb5b1e39ae5c8b127cc40920f9c4fb33f4b98a"}, +] +tensorboard-plugin-wit = [ + {file = "tensorboard_plugin_wit-1.8.0-py3-none-any.whl", hash = "sha256:2a80d1c551d741e99b2f197bb915d8a133e24adb8da1732b840041860f91183a"}, +] +tensorflow = [ + {file = "tensorflow-2.6.0-cp36-cp36m-macosx_10_11_x86_64.whl", hash = "sha256:c67fad296a3a2133b7a14da5f06c9937e7911b02c5d7a3ff6ba52a1d79b6bc9e"}, + {file = "tensorflow-2.6.0-cp36-cp36m-manylinux2010_x86_64.whl", hash = "sha256:8b5ce09ede0fe45ef100f4dc65cf3f46722194e75139f85d524058315e2ce9fa"}, + {file = "tensorflow-2.6.0-cp36-cp36m-win_amd64.whl", hash = "sha256:dea97f664246e185d79cbe40a86309527affd4232f06afa8a6500c4fc4b64a03"}, + {file = "tensorflow-2.6.0-cp37-cp37m-macosx_10_11_x86_64.whl", hash = "sha256:4716c9b25a61a2c79b1f253d1e114f1f8679241559c13ad18c657c626a7d5924"}, + {file = "tensorflow-2.6.0-cp37-cp37m-manylinux2010_x86_64.whl", hash = "sha256:e45e026a9d08c89cecc1160d8248135e2fb79bdc3267328399e1fb25ce583bd6"}, + {file = "tensorflow-2.6.0-cp37-cp37m-win_amd64.whl", hash = "sha256:6e38b6969414d16afc560c58ca34e1328cc0a5dbd644b64e060f5be8a6653274"}, + {file = "tensorflow-2.6.0-cp38-cp38-macosx_10_11_x86_64.whl", hash = "sha256:2a067d22a356c2cd4753bdd16ee492c55a610f5ebc52713e2954c642f070321c"}, + {file = "tensorflow-2.6.0-cp38-cp38-manylinux2010_x86_64.whl", hash = "sha256:2c9b8c6adc060acfcf805a2ea501db0124b679d95b522fd5983a4c110e8e0264"}, + {file = "tensorflow-2.6.0-cp38-cp38-win_amd64.whl", hash = "sha256:d6468e05552720100e8f94097feb770de320e4c8c244323a8746bd84e5ba4052"}, + {file = "tensorflow-2.6.0-cp39-cp39-macosx_10_11_x86_64.whl", hash = "sha256:00b1af0a0c5c102db19caceffac4bd4e6c536e6d7512144c241a4ace4428e7c6"}, + {file = "tensorflow-2.6.0-cp39-cp39-manylinux2010_x86_64.whl", hash = "sha256:bc73ebdd30c48cfc27ba307271117e6dbb795b37396ed817b2fec9393380b115"}, + {file = "tensorflow-2.6.0-cp39-cp39-win_amd64.whl", hash = "sha256:bfb255c2b0400bc5b4060dda098d46cd7ddeb53b7cbac1dfa29435612cba828c"}, +] +tensorflow-estimator = [ + {file = "tensorflow_estimator-2.6.0-py2.py3-none-any.whl", hash = "sha256:cf78528998efdb637ac0abaf525c929bf192767544eb24ae20d9266effcf5afd"}, +] +termcolor = [ + {file = "termcolor-1.1.0.tar.gz", hash = "sha256:1d6d69ce66211143803fbc56652b41d73b4a400a2891d7bf7a1cdf4c02de613b"}, +] +terminado = [ + {file = "terminado-0.11.1-py3-none-any.whl", hash = "sha256:9e0457334863be3e6060c487ad60e0995fa1df54f109c67b24ff49a4f2f34df5"}, + {file = "terminado-0.11.1.tar.gz", hash = "sha256:962b402edbb480718054dc37027bada293972ecadfb587b89f01e2b8660a2132"}, +] +testpath = [ + {file = "testpath-0.5.0-py3-none-any.whl", hash = "sha256:8044f9a0bab6567fc644a3593164e872543bb44225b0e24846e2c89237937589"}, + {file = "testpath-0.5.0.tar.gz", hash = "sha256:1acf7a0bcd3004ae8357409fc33751e16d37ccc650921da1094a86581ad1e417"}, +] +toml = [ + {file = "toml-0.10.2-py2.py3-none-any.whl", hash = "sha256:806143ae5bfb6a3c6e736a764057db0e6a0e05e338b5630894a5f779cabb4f9b"}, + {file = "toml-0.10.2.tar.gz", hash = "sha256:b3bda1d108d5dd99f4a20d24d9c348e91c4db7ab1b749200bded2f839ccbe68f"}, +] +tomli = [ + {file = "tomli-1.2.1-py3-none-any.whl", hash = "sha256:8dd0e9524d6f386271a36b41dbf6c57d8e32fd96fd22b6584679dc569d20899f"}, + {file = "tomli-1.2.1.tar.gz", hash = "sha256:a5b75cb6f3968abb47af1b40c1819dc519ea82bcc065776a866e8d74c5ca9442"}, +] +toolz = [ + {file = "toolz-0.11.1-py3-none-any.whl", hash = "sha256:1bc473acbf1a1db4e72a1ce587be347450e8f08324908b8a266b486f408f04d5"}, + {file = "toolz-0.11.1.tar.gz", hash = "sha256:c7a47921f07822fe534fb1c01c9931ab335a4390c782bd28c6bcc7c2f71f3fbf"}, +] +tornado = [ + {file = "tornado-6.1-cp35-cp35m-macosx_10_9_x86_64.whl", hash = "sha256:d371e811d6b156d82aa5f9a4e08b58debf97c302a35714f6f45e35139c332e32"}, + {file = "tornado-6.1-cp35-cp35m-manylinux1_i686.whl", hash = "sha256:0d321a39c36e5f2c4ff12b4ed58d41390460f798422c4504e09eb5678e09998c"}, + {file = "tornado-6.1-cp35-cp35m-manylinux1_x86_64.whl", hash = "sha256:9de9e5188a782be6b1ce866e8a51bc76a0fbaa0e16613823fc38e4fc2556ad05"}, + {file = "tornado-6.1-cp35-cp35m-manylinux2010_i686.whl", hash = "sha256:61b32d06ae8a036a6607805e6720ef00a3c98207038444ba7fd3d169cd998910"}, + {file = "tornado-6.1-cp35-cp35m-manylinux2010_x86_64.whl", hash = "sha256:3e63498f680547ed24d2c71e6497f24bca791aca2fe116dbc2bd0ac7f191691b"}, + {file = "tornado-6.1-cp35-cp35m-manylinux2014_aarch64.whl", hash = "sha256:6c77c9937962577a6a76917845d06af6ab9197702a42e1346d8ae2e76b5e3675"}, + {file = "tornado-6.1-cp35-cp35m-win32.whl", hash = "sha256:6286efab1ed6e74b7028327365cf7346b1d777d63ab30e21a0f4d5b275fc17d5"}, + {file = "tornado-6.1-cp35-cp35m-win_amd64.whl", hash = "sha256:fa2ba70284fa42c2a5ecb35e322e68823288a4251f9ba9cc77be04ae15eada68"}, + {file = "tornado-6.1-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:0a00ff4561e2929a2c37ce706cb8233b7907e0cdc22eab98888aca5dd3775feb"}, + {file = "tornado-6.1-cp36-cp36m-manylinux1_i686.whl", hash = "sha256:748290bf9112b581c525e6e6d3820621ff020ed95af6f17fedef416b27ed564c"}, + {file = "tornado-6.1-cp36-cp36m-manylinux1_x86_64.whl", hash = "sha256:e385b637ac3acaae8022e7e47dfa7b83d3620e432e3ecb9a3f7f58f150e50921"}, + {file = "tornado-6.1-cp36-cp36m-manylinux2010_i686.whl", hash = "sha256:25ad220258349a12ae87ede08a7b04aca51237721f63b1808d39bdb4b2164558"}, + {file = "tornado-6.1-cp36-cp36m-manylinux2010_x86_64.whl", hash = "sha256:65d98939f1a2e74b58839f8c4dab3b6b3c1ce84972ae712be02845e65391ac7c"}, + {file = "tornado-6.1-cp36-cp36m-manylinux2014_aarch64.whl", hash = "sha256:e519d64089b0876c7b467274468709dadf11e41d65f63bba207e04217f47c085"}, + {file = "tornado-6.1-cp36-cp36m-win32.whl", hash = "sha256:b87936fd2c317b6ee08a5741ea06b9d11a6074ef4cc42e031bc6403f82a32575"}, + {file = "tornado-6.1-cp36-cp36m-win_amd64.whl", hash = "sha256:cc0ee35043162abbf717b7df924597ade8e5395e7b66d18270116f8745ceb795"}, + {file = "tornado-6.1-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:7250a3fa399f08ec9cb3f7b1b987955d17e044f1ade821b32e5f435130250d7f"}, + {file = "tornado-6.1-cp37-cp37m-manylinux1_i686.whl", hash = "sha256:ed3ad863b1b40cd1d4bd21e7498329ccaece75db5a5bf58cd3c9f130843e7102"}, + {file = "tornado-6.1-cp37-cp37m-manylinux1_x86_64.whl", hash = "sha256:dcef026f608f678c118779cd6591c8af6e9b4155c44e0d1bc0c87c036fb8c8c4"}, + {file = "tornado-6.1-cp37-cp37m-manylinux2010_i686.whl", hash = "sha256:70dec29e8ac485dbf57481baee40781c63e381bebea080991893cd297742b8fd"}, + {file = "tornado-6.1-cp37-cp37m-manylinux2010_x86_64.whl", hash = "sha256:d3f7594930c423fd9f5d1a76bee85a2c36fd8b4b16921cae7e965f22575e9c01"}, + {file = "tornado-6.1-cp37-cp37m-manylinux2014_aarch64.whl", hash = "sha256:3447475585bae2e77ecb832fc0300c3695516a47d46cefa0528181a34c5b9d3d"}, + {file = "tornado-6.1-cp37-cp37m-win32.whl", hash = "sha256:e7229e60ac41a1202444497ddde70a48d33909e484f96eb0da9baf8dc68541df"}, + {file = "tornado-6.1-cp37-cp37m-win_amd64.whl", hash = "sha256:cb5ec8eead331e3bb4ce8066cf06d2dfef1bfb1b2a73082dfe8a161301b76e37"}, + {file = "tornado-6.1-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:20241b3cb4f425e971cb0a8e4ffc9b0a861530ae3c52f2b0434e6c1b57e9fd95"}, + {file = "tornado-6.1-cp38-cp38-manylinux1_i686.whl", hash = "sha256:c77da1263aa361938476f04c4b6c8916001b90b2c2fdd92d8d535e1af48fba5a"}, + {file = "tornado-6.1-cp38-cp38-manylinux1_x86_64.whl", hash = "sha256:fba85b6cd9c39be262fcd23865652920832b61583de2a2ca907dbd8e8a8c81e5"}, + {file = "tornado-6.1-cp38-cp38-manylinux2010_i686.whl", hash = "sha256:1e8225a1070cd8eec59a996c43229fe8f95689cb16e552d130b9793cb570a288"}, + {file = "tornado-6.1-cp38-cp38-manylinux2010_x86_64.whl", hash = "sha256:d14d30e7f46a0476efb0deb5b61343b1526f73ebb5ed84f23dc794bdb88f9d9f"}, + {file = "tornado-6.1-cp38-cp38-manylinux2014_aarch64.whl", hash = "sha256:8f959b26f2634a091bb42241c3ed8d3cedb506e7c27b8dd5c7b9f745318ddbb6"}, + {file = "tornado-6.1-cp38-cp38-win32.whl", hash = "sha256:34ca2dac9e4d7afb0bed4677512e36a52f09caa6fded70b4e3e1c89dbd92c326"}, + {file = "tornado-6.1-cp38-cp38-win_amd64.whl", hash = "sha256:6196a5c39286cc37c024cd78834fb9345e464525d8991c21e908cc046d1cc02c"}, + {file = "tornado-6.1-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:f0ba29bafd8e7e22920567ce0d232c26d4d47c8b5cf4ed7b562b5db39fa199c5"}, + {file = "tornado-6.1-cp39-cp39-manylinux1_i686.whl", hash = "sha256:33892118b165401f291070100d6d09359ca74addda679b60390b09f8ef325ffe"}, + {file = "tornado-6.1-cp39-cp39-manylinux1_x86_64.whl", hash = "sha256:7da13da6f985aab7f6f28debab00c67ff9cbacd588e8477034c0652ac141feea"}, + {file = "tornado-6.1-cp39-cp39-manylinux2010_i686.whl", hash = "sha256:e0791ac58d91ac58f694d8d2957884df8e4e2f6687cdf367ef7eb7497f79eaa2"}, + {file = "tornado-6.1-cp39-cp39-manylinux2010_x86_64.whl", hash = "sha256:66324e4e1beede9ac79e60f88de548da58b1f8ab4b2f1354d8375774f997e6c0"}, + {file = "tornado-6.1-cp39-cp39-manylinux2014_aarch64.whl", hash = "sha256:a48900ecea1cbb71b8c71c620dee15b62f85f7c14189bdeee54966fbd9a0c5bd"}, + {file = "tornado-6.1-cp39-cp39-win32.whl", hash = "sha256:d3d20ea5782ba63ed13bc2b8c291a053c8d807a8fa927d941bd718468f7b950c"}, + {file = "tornado-6.1-cp39-cp39-win_amd64.whl", hash = "sha256:548430be2740e327b3fe0201abe471f314741efcb0067ec4f2d7dcfb4825f3e4"}, + {file = "tornado-6.1.tar.gz", hash = "sha256:33c6e81d7bd55b468d2e793517c909b139960b6c790a60b7991b9b6b76fb9791"}, +] +traitlets = [ + {file = "traitlets-5.1.0-py3-none-any.whl", hash = "sha256:03f172516916220b58c9f19d7f854734136dd9528103d04e9bf139a92c9f54c4"}, + {file = "traitlets-5.1.0.tar.gz", hash = "sha256:bd382d7ea181fbbcce157c133db9a829ce06edffe097bcf3ab945b435452b46d"}, +] +transitions = [ + {file = "transitions-0.8.8-py2.py3-none-any.whl", hash = "sha256:f35efa070fbdf9a0f3f093b19f1258068786af75786a8cbcc884444f3d1a66d4"}, + {file = "transitions-0.8.8.tar.gz", hash = "sha256:e7a86b31a161a76133f189b3ae9dad2755a80ea4c1e0eee1805648d021fb677d"}, +] +typing-extensions = [ + {file = "typing_extensions-3.7.4.3-py2-none-any.whl", hash = "sha256:dafc7639cde7f1b6e1acc0f457842a83e722ccca8eef5270af2d74792619a89f"}, + {file = "typing_extensions-3.7.4.3-py3-none-any.whl", hash = "sha256:7cb407020f00f7bfc3cb3e7881628838e69d8f3fcab2f64742a5e76b2f841918"}, + {file = "typing_extensions-3.7.4.3.tar.gz", hash = "sha256:99d4073b617d30288f569d3f13d2bd7548c3a7e4c8de87db09a9d29bb3a4a60c"}, +] +urllib3 = [ + {file = "urllib3-1.26.6-py2.py3-none-any.whl", hash = "sha256:39fb8672126159acb139a7718dd10806104dec1e2f0f6c88aab05d17df10c8d4"}, + {file = "urllib3-1.26.6.tar.gz", hash = "sha256:f57b4c16c62fa2760b7e3d97c35b255512fb6b59a259730f36ba32ce9f8e342f"}, +] +uvicorn = [ + {file = "uvicorn-0.14.0-py3-none-any.whl", hash = "sha256:2a76bb359171a504b3d1c853409af3adbfa5cef374a4a59e5881945a97a93eae"}, + {file = "uvicorn-0.14.0.tar.gz", hash = "sha256:45ad7dfaaa7d55cab4cd1e85e03f27e9d60bc067ddc59db52a2b0aeca8870292"}, +] +varint = [ + {file = "varint-1.0.2.tar.gz", hash = "sha256:a6ecc02377ac5ee9d65a6a8ad45c9ff1dac8ccee19400a5950fb51d594214ca5"}, +] +wcwidth = [ + {file = "wcwidth-0.2.5-py2.py3-none-any.whl", hash = "sha256:beb4802a9cebb9144e99086eff703a642a13d6a0052920003a230f3294bbe784"}, + {file = "wcwidth-0.2.5.tar.gz", hash = "sha256:c4d647b99872929fdb7bdcaa4fbe7f01413ed3d98077df798530e5b04f116c83"}, +] +web3 = [ + {file = "web3-5.23.1-py3-none-any.whl", hash = "sha256:6e561fd5fdbcf9571b1de8b77b2d81997f77a691e32ad536d489a0732f1cf182"}, + {file = "web3-5.23.1.tar.gz", hash = "sha256:e3bc899201c38859ae65b1905105628f70a0c1684a6fb76fa4dd5b1db4fc40b0"}, +] +webencodings = [ + {file = "webencodings-0.5.1-py2.py3-none-any.whl", hash = "sha256:a0af1213f3c2226497a97e2b3aa01a7e4bee4f403f95be16fc9acd2947514a78"}, + {file = "webencodings-0.5.1.tar.gz", hash = "sha256:b36a1c245f2d304965eb4e0a82848379241dc04b865afcc4aab16748587e1923"}, +] +websockets = [ + {file = "websockets-9.1-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:d144b350045c53c8ff09aa1cfa955012dd32f00c7e0862c199edcabb1a8b32da"}, + {file = "websockets-9.1-cp36-cp36m-manylinux1_i686.whl", hash = "sha256:b4ad84b156cf50529b8ac5cc1638c2cf8680490e3fccb6121316c8c02620a2e4"}, + {file = "websockets-9.1-cp36-cp36m-manylinux1_x86_64.whl", hash = "sha256:2cf04601633a4ec176b9cc3d3e73789c037641001dbfaf7c411f89cd3e04fcaf"}, + {file = "websockets-9.1-cp36-cp36m-manylinux2010_i686.whl", hash = "sha256:5c8f0d82ea2468282e08b0cf5307f3ad022290ed50c45d5cb7767957ca782880"}, + {file = "websockets-9.1-cp36-cp36m-manylinux2010_x86_64.whl", hash = "sha256:caa68c95bc1776d3521f81eeb4d5b9438be92514ec2a79fececda814099c8314"}, + {file = "websockets-9.1-cp36-cp36m-manylinux2014_aarch64.whl", hash = "sha256:d2c2d9b24d3c65b5a02cac12cbb4e4194e590314519ed49db2f67ef561c3cf58"}, + {file = "websockets-9.1-cp36-cp36m-win32.whl", hash = "sha256:f31722f1c033c198aa4a39a01905951c00bd1c74f922e8afc1b1c62adbcdd56a"}, + {file = "websockets-9.1-cp36-cp36m-win_amd64.whl", hash = "sha256:3ddff38894c7857c476feb3538dd847514379d6dc844961dc99f04b0384b1b1b"}, + {file = "websockets-9.1-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:51d04df04ed9d08077d10ccbe21e6805791b78eac49d16d30a1f1fe2e44ba0af"}, + {file = "websockets-9.1-cp37-cp37m-manylinux1_i686.whl", hash = "sha256:f68c352a68e5fdf1e97288d5cec9296664c590c25932a8476224124aaf90dbcd"}, + {file = "websockets-9.1-cp37-cp37m-manylinux1_x86_64.whl", hash = "sha256:b43b13e5622c5a53ab12f3272e6f42f1ce37cd5b6684b2676cb365403295cd40"}, + {file = "websockets-9.1-cp37-cp37m-manylinux2010_i686.whl", hash = "sha256:9147868bb0cc01e6846606cd65cbf9c58598f187b96d14dd1ca17338b08793bb"}, + {file = "websockets-9.1-cp37-cp37m-manylinux2010_x86_64.whl", hash = "sha256:836d14eb53b500fd92bd5db2fc5894f7c72b634f9c2a28f546f75967503d8e25"}, + {file = "websockets-9.1-cp37-cp37m-manylinux2014_aarch64.whl", hash = "sha256:48c222feb3ced18f3dc61168ca18952a22fb88e5eb8902d2bf1b50faefdc34a2"}, + {file = "websockets-9.1-cp37-cp37m-win32.whl", hash = "sha256:900589e19200be76dd7cbaa95e9771605b5ce3f62512d039fb3bc5da9014912a"}, + {file = "websockets-9.1-cp37-cp37m-win_amd64.whl", hash = "sha256:ab5ee15d3462198c794c49ccd31773d8a2b8c17d622aa184f669d2b98c2f0857"}, + {file = "websockets-9.1-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:85e701a6c316b7067f1e8675c638036a796fe5116783a4c932e7eb8e305a3ffe"}, + {file = "websockets-9.1-cp38-cp38-manylinux1_i686.whl", hash = "sha256:b2e71c4670ebe1067fa8632f0d081e47254ee2d3d409de54168b43b0ba9147e0"}, + {file = "websockets-9.1-cp38-cp38-manylinux1_x86_64.whl", hash = "sha256:230a3506df6b5f446fed2398e58dcaafdff12d67fe1397dff196411a9e820d02"}, + {file = "websockets-9.1-cp38-cp38-manylinux2010_i686.whl", hash = "sha256:7df3596838b2a0c07c6f6d67752c53859a54993d4f062689fdf547cb56d0f84f"}, + {file = "websockets-9.1-cp38-cp38-manylinux2010_x86_64.whl", hash = "sha256:826ccf85d4514609219725ba4a7abd569228c2c9f1968e8be05be366f68291ec"}, + {file = "websockets-9.1-cp38-cp38-manylinux2014_aarch64.whl", hash = "sha256:0dd4eb8e0bbf365d6f652711ce21b8fd2b596f873d32aabb0fbb53ec604418cc"}, + {file = "websockets-9.1-cp38-cp38-win32.whl", hash = "sha256:1d0971cc7251aeff955aa742ec541ee8aaea4bb2ebf0245748fbec62f744a37e"}, + {file = "websockets-9.1-cp38-cp38-win_amd64.whl", hash = "sha256:7189e51955f9268b2bdd6cc537e0faa06f8fffda7fb386e5922c6391de51b077"}, + {file = "websockets-9.1-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:e9e5fd6dbdf95d99bc03732ded1fc8ef22ebbc05999ac7e0c7bf57fe6e4e5ae2"}, + {file = "websockets-9.1-cp39-cp39-manylinux1_i686.whl", hash = "sha256:9e7fdc775fe7403dbd8bc883ba59576a6232eac96dacb56512daacf7af5d618d"}, + {file = "websockets-9.1-cp39-cp39-manylinux1_x86_64.whl", hash = "sha256:597c28f3aa7a09e8c070a86b03107094ee5cdafcc0d55f2f2eac92faac8dc67d"}, + {file = "websockets-9.1-cp39-cp39-manylinux2010_i686.whl", hash = "sha256:ad893d889bc700a5835e0a95a3e4f2c39e91577ab232a3dc03c262a0f8fc4b5c"}, + {file = "websockets-9.1-cp39-cp39-manylinux2010_x86_64.whl", hash = "sha256:1d6b4fddb12ab9adf87b843cd4316c4bd602db8d5efd2fb83147f0458fe85135"}, + {file = "websockets-9.1-cp39-cp39-manylinux2014_aarch64.whl", hash = "sha256:ebf459a1c069f9866d8569439c06193c586e72c9330db1390af7c6a0a32c4afd"}, + {file = "websockets-9.1-cp39-cp39-win32.whl", hash = "sha256:be5fd35e99970518547edc906efab29afd392319f020c3c58b0e1a158e16ed20"}, + {file = "websockets-9.1-cp39-cp39-win_amd64.whl", hash = "sha256:85db8090ba94e22d964498a47fdd933b8875a1add6ebc514c7ac8703eb97bbf0"}, + {file = "websockets-9.1.tar.gz", hash = "sha256:276d2339ebf0df4f45df453923ebd2270b87900eda5dfd4a6b0cfa15f82111c3"}, +] +werkzeug = [ + {file = "Werkzeug-2.0.1-py3-none-any.whl", hash = "sha256:6c1ec500dcdba0baa27600f6a22f6333d8b662d22027ff9f6202e3367413caa8"}, + {file = "Werkzeug-2.0.1.tar.gz", hash = "sha256:1de1db30d010ff1af14a009224ec49ab2329ad2cde454c8a708130642d579c42"}, +] +widgetsnbextension = [ + {file = "widgetsnbextension-3.5.1-py2.py3-none-any.whl", hash = "sha256:bd314f8ceb488571a5ffea6cc5b9fc6cba0adaf88a9d2386b93a489751938bcd"}, + {file = "widgetsnbextension-3.5.1.tar.gz", hash = "sha256:079f87d87270bce047512400efd70238820751a11d2d8cb137a5a5bdbaf255c7"}, +] +wrapt = [ + {file = "wrapt-1.12.1.tar.gz", hash = "sha256:b62ffa81fb85f4332a4f609cab4ac40709470da05643a082ec1eb88e6d9b97d7"}, +] +yarl = [ + {file = "yarl-1.6.3-cp36-cp36m-macosx_10_14_x86_64.whl", hash = "sha256:0355a701b3998dcd832d0dc47cc5dedf3874f966ac7f870e0f3a6788d802d434"}, + {file = "yarl-1.6.3-cp36-cp36m-manylinux1_i686.whl", hash = "sha256:bafb450deef6861815ed579c7a6113a879a6ef58aed4c3a4be54400ae8871478"}, + {file = "yarl-1.6.3-cp36-cp36m-manylinux2014_aarch64.whl", hash = "sha256:547f7665ad50fa8563150ed079f8e805e63dd85def6674c97efd78eed6c224a6"}, + {file = "yarl-1.6.3-cp36-cp36m-manylinux2014_i686.whl", hash = "sha256:63f90b20ca654b3ecc7a8d62c03ffa46999595f0167d6450fa8383bab252987e"}, + {file = "yarl-1.6.3-cp36-cp36m-manylinux2014_ppc64le.whl", hash = "sha256:97b5bdc450d63c3ba30a127d018b866ea94e65655efaf889ebeabc20f7d12406"}, + {file = "yarl-1.6.3-cp36-cp36m-manylinux2014_s390x.whl", hash = "sha256:d8d07d102f17b68966e2de0e07bfd6e139c7c02ef06d3a0f8d2f0f055e13bb76"}, + {file = "yarl-1.6.3-cp36-cp36m-manylinux2014_x86_64.whl", hash = "sha256:15263c3b0b47968c1d90daa89f21fcc889bb4b1aac5555580d74565de6836366"}, + {file = "yarl-1.6.3-cp36-cp36m-win32.whl", hash = "sha256:b5dfc9a40c198334f4f3f55880ecf910adebdcb2a0b9a9c23c9345faa9185721"}, + {file = "yarl-1.6.3-cp36-cp36m-win_amd64.whl", hash = "sha256:b2e9a456c121e26d13c29251f8267541bd75e6a1ccf9e859179701c36a078643"}, + {file = "yarl-1.6.3-cp37-cp37m-macosx_10_14_x86_64.whl", hash = "sha256:ce3beb46a72d9f2190f9e1027886bfc513702d748047b548b05dab7dfb584d2e"}, + {file = "yarl-1.6.3-cp37-cp37m-manylinux1_i686.whl", hash = "sha256:2ce4c621d21326a4a5500c25031e102af589edb50c09b321049e388b3934eec3"}, + {file = "yarl-1.6.3-cp37-cp37m-manylinux2014_aarch64.whl", hash = "sha256:d26608cf178efb8faa5ff0f2d2e77c208f471c5a3709e577a7b3fd0445703ac8"}, + {file = "yarl-1.6.3-cp37-cp37m-manylinux2014_i686.whl", hash = "sha256:4c5bcfc3ed226bf6419f7a33982fb4b8ec2e45785a0561eb99274ebbf09fdd6a"}, + {file = "yarl-1.6.3-cp37-cp37m-manylinux2014_ppc64le.whl", hash = "sha256:4736eaee5626db8d9cda9eb5282028cc834e2aeb194e0d8b50217d707e98bb5c"}, + {file = "yarl-1.6.3-cp37-cp37m-manylinux2014_s390x.whl", hash = "sha256:68dc568889b1c13f1e4745c96b931cc94fdd0defe92a72c2b8ce01091b22e35f"}, + {file = "yarl-1.6.3-cp37-cp37m-manylinux2014_x86_64.whl", hash = "sha256:7356644cbed76119d0b6bd32ffba704d30d747e0c217109d7979a7bc36c4d970"}, + {file = "yarl-1.6.3-cp37-cp37m-win32.whl", hash = "sha256:00d7ad91b6583602eb9c1d085a2cf281ada267e9a197e8b7cae487dadbfa293e"}, + {file = "yarl-1.6.3-cp37-cp37m-win_amd64.whl", hash = "sha256:69ee97c71fee1f63d04c945f56d5d726483c4762845400a6795a3b75d56b6c50"}, + {file = "yarl-1.6.3-cp38-cp38-macosx_10_14_x86_64.whl", hash = "sha256:e46fba844f4895b36f4c398c5af062a9808d1f26b2999c58909517384d5deda2"}, + {file = "yarl-1.6.3-cp38-cp38-manylinux1_i686.whl", hash = "sha256:31ede6e8c4329fb81c86706ba8f6bf661a924b53ba191b27aa5fcee5714d18ec"}, + {file = "yarl-1.6.3-cp38-cp38-manylinux2014_aarch64.whl", hash = "sha256:fcbb48a93e8699eae920f8d92f7160c03567b421bc17362a9ffbbd706a816f71"}, + {file = "yarl-1.6.3-cp38-cp38-manylinux2014_i686.whl", hash = "sha256:72a660bdd24497e3e84f5519e57a9ee9220b6f3ac4d45056961bf22838ce20cc"}, + {file = "yarl-1.6.3-cp38-cp38-manylinux2014_ppc64le.whl", hash = "sha256:324ba3d3c6fee56e2e0b0d09bf5c73824b9f08234339d2b788af65e60040c959"}, + {file = "yarl-1.6.3-cp38-cp38-manylinux2014_s390x.whl", hash = "sha256:e6b5460dc5ad42ad2b36cca524491dfcaffbfd9c8df50508bddc354e787b8dc2"}, + {file = "yarl-1.6.3-cp38-cp38-manylinux2014_x86_64.whl", hash = "sha256:6d6283d8e0631b617edf0fd726353cb76630b83a089a40933043894e7f6721e2"}, + {file = "yarl-1.6.3-cp38-cp38-win32.whl", hash = "sha256:9ede61b0854e267fd565e7527e2f2eb3ef8858b301319be0604177690e1a3896"}, + {file = "yarl-1.6.3-cp38-cp38-win_amd64.whl", hash = "sha256:f0b059678fd549c66b89bed03efcabb009075bd131c248ecdf087bdb6faba24a"}, + {file = "yarl-1.6.3-cp39-cp39-macosx_10_14_x86_64.whl", hash = "sha256:329412812ecfc94a57cd37c9d547579510a9e83c516bc069470db5f75684629e"}, + {file = "yarl-1.6.3-cp39-cp39-manylinux1_i686.whl", hash = "sha256:c49ff66d479d38ab863c50f7bb27dee97c6627c5fe60697de15529da9c3de724"}, + {file = "yarl-1.6.3-cp39-cp39-manylinux2014_aarch64.whl", hash = "sha256:f040bcc6725c821a4c0665f3aa96a4d0805a7aaf2caf266d256b8ed71b9f041c"}, + {file = "yarl-1.6.3-cp39-cp39-manylinux2014_i686.whl", hash = "sha256:d5c32c82990e4ac4d8150fd7652b972216b204de4e83a122546dce571c1bdf25"}, + {file = "yarl-1.6.3-cp39-cp39-manylinux2014_ppc64le.whl", hash = "sha256:d597767fcd2c3dc49d6eea360c458b65643d1e4dbed91361cf5e36e53c1f8c96"}, + {file = "yarl-1.6.3-cp39-cp39-manylinux2014_s390x.whl", hash = "sha256:8aa3decd5e0e852dc68335abf5478a518b41bf2ab2f330fe44916399efedfae0"}, + {file = "yarl-1.6.3-cp39-cp39-manylinux2014_x86_64.whl", hash = "sha256:73494d5b71099ae8cb8754f1df131c11d433b387efab7b51849e7e1e851f07a4"}, + {file = "yarl-1.6.3-cp39-cp39-win32.whl", hash = "sha256:5b883e458058f8d6099e4420f0cc2567989032b5f34b271c0827de9f1079a424"}, + {file = "yarl-1.6.3-cp39-cp39-win_amd64.whl", hash = "sha256:4953fb0b4fdb7e08b2f3b3be80a00d28c5c8a2056bb066169de00e6501b986b6"}, + {file = "yarl-1.6.3.tar.gz", hash = "sha256:8a9066529240171b68893d60dca86a763eae2139dd42f42106b03cf4b426bf10"}, +] +zipp = [ + {file = "zipp-3.5.0-py3-none-any.whl", hash = "sha256:957cfda87797e389580cb8b9e3870841ca991e2125350677b2ca83a0e99390a3"}, + {file = "zipp-3.5.0.tar.gz", hash = "sha256:f5812b1e007e48cff63449a5e9f4e7ebea716b4111f9c4f9a645f91d579bf0c4"}, +] diff --git a/server/pyproject.toml b/server/pyproject.toml new file mode 100644 index 0000000..3c5a9d5 --- /dev/null +++ b/server/pyproject.toml @@ -0,0 +1,52 @@ +[tool.poetry] +name = "api" +version = "0.1.0" +description = "" +authors = ["AG "] + +[tool.poetry.dependencies] +python = "^3.8" +SQLAlchemy="1.3.24" +gino="1.0.1" +fastapi = "^0.68.0" +uvicorn = "^0.14.0" +gunicorn = "^20.1.0" +gino-starlette = "^0.1.2" +alembic = "^1.6.5" +psycopg2 = "^2.9.1" +black = "^21.7b0" +pandas = "^1.3.1" +transitions = "^0.8.8" +starlette-context = "^0.3.3" +google-cloud-storage = "^1.41.1" +PyYAML = "^5.4.1" +python-multipart = "^0.0.5" +gcloud-aio-storage = "^6.1.0" +certifi = "^2021.5.30" +gcloud-aio-auth = "^3.6.1" +tensorflow = "^2.5.0" +gql = "^2.0.0" +greenlet = "^1.1.1" +fsspec = "^2021.7.0" +gcsfs = "^2021.7.0" +ipfshttpclient = {version = "0.8.0a2", allow-prereleases = true} +web3 = "5.23.1" + +[tool.poetry.dev-dependencies] +ipdb = "^0.13.9" +jupyter = "^1.0.0" +pytest = "^6.2.4" +requests = "^2.26.0" +poetry-lock-package = "^0.4.2" + +[tool.poetry.plugins."api.modules"] +users= "api.views.users" +disputes = "api.views.disputes" +indexers = "api.views.indexers" +divergent_blocks = "api.views.divergent_blocks" +upload = "api.transport.upload" +list = "api.transport.list" + +[build-system] +requires = ["poetry>=1.1.7"] +build-backend = "poetry.masonry.api" \ No newline at end of file diff --git a/server/set_env.sh b/server/set_env.sh new file mode 100755 index 0000000..ccee802 --- /dev/null +++ b/server/set_env.sh @@ -0,0 +1,9 @@ +#!/bin/bash +export DB_HOST=localhost +export DB_NAME=$(echo $(kubectl get secret graph-disputes-server-db-credentials -o jsonpath='{.data}') | jq '.name' \ + | sed -e 's/^"//' -e 's/"$//' | base64 --decode) +export DB_PASS=$(echo $(kubectl get secret graph-disputes-server-db-credentials -o jsonpath='{.data}') | jq '.pass' \ + | sed -e 's/^"//' -e 's/"$//' | base64 --decode) +export DB_USER=$(echo $(kubectl get secret graph-disputes-server-db-credentials -o jsonpath='{.data}') | jq '.user' \ + | sed -e 's/^"//' -e 's/"$//' | base64 --decode) +export DB_PORT=3306 \ No newline at end of file diff --git a/src/commands/list.ts b/src/commands/list.ts index 6b1a71b..15a2639 100644 --- a/src/commands/list.ts +++ b/src/commands/list.ts @@ -1,16 +1,28 @@ /* eslint-disable @typescript-eslint/no-explicit-any */ import ora from 'ora' -import treeify from 'treeify' +import treeify from 'object-treeify' import chalk from 'chalk' import { Argv } from 'yargs' import { log } from '../logging' -import { populateEntry } from '../dispute' -import { getDisputes } from '../model' +import { formatEntry, populateEntry } from '../dispute' +import { getDisputes, getNetworkSettings } from '../model' +import { treeifyFormat } from '../utils' export const listCommand = { command: 'list', describe: 'List disputes', + builder: (yargs: Argv): Argv => { + return yargs + .usage('$0 [--status ]') + .option('status', { + description: 'Dispute status', + group: 'List', + type: 'string', + choices: ['accepted', 'rejected', 'draw', 'undecided', 'all'], + default: 'undecided', + }) + }, handler: async ( argv: { [key: string]: any } & Argv['argv'], ): Promise => { @@ -20,21 +32,42 @@ export const listCommand = { // Get disputes to list const spinner = ora('Loading disputes...\n').start() const data = {} - const disputes = await getDisputes(networkSubgraph) + // capitalize the status + const status = + argv.status === 'all' + ? undefined + : argv.status[0].toUpperCase() + argv.status.substring(1) + const networkSettings = await getNetworkSettings(networkSubgraph) + const disputes = await getDisputes(networkSubgraph, status) log.info(`Found: ${disputes.length}\n`) // Process each dispute and populate additional information await Promise.all( disputes.map(async dispute => { - const disputeEntry = await populateEntry(dispute, env, false) - data[chalk.whiteBright.underline(dispute.id)] = disputeEntry + const disputeEntry = await populateEntry( + dispute, + env, + networkSettings, + false, + ) + data[dispute.id] = disputeEntry }), ) spinner.stop() + // sort disputes + const findDisputeById = (id: string) => disputes.find(d => d.id === id) + const orderedDisputeIds = Object.keys(data).sort((d1, d2) => + findDisputeById(d1).createdAt > findDisputeById(d2).createdAt ? 1 : -1, + ) // Display disputes - log.info('Disputes') - log.info('--------') - log.info(treeify.asTree(data, true, true)) + log.info(chalk.bold('Disputes')) + log.info(chalk.gray('--------')) + orderedDisputeIds.forEach(disputeId => { + log.info(`${chalk.bold('Dispute')} (${chalk.cyanBright(disputeId)})`) + log.info( + treeify(formatEntry(data[disputeId], networkSettings), treeifyFormat), + ) + }) }, } diff --git a/src/commands/show.ts b/src/commands/show.ts index ccc320e..3070eef 100644 --- a/src/commands/show.ts +++ b/src/commands/show.ts @@ -1,22 +1,28 @@ /* eslint-disable @typescript-eslint/no-explicit-any */ import ora from 'ora' -import treeify from 'treeify' +import treeify from 'object-treeify' +import chalk from 'chalk' import { SingleBar } from 'cli-progress' import { Argv } from 'yargs' import { SubgraphDeploymentID } from '@graphprotocol/common-ts' import { log } from '../logging' -import { populateEntry } from '../dispute' -import { getDispute } from '../model' +import { formatEntry, populateEntry } from '../dispute' +import { getDispute, getNetworkSettings } from '../model' import { Poi } from '../poi' +import { Environment } from '../env' +import { treeifyFormat } from '../utils' export const showCommand = { - command: 'show ', - describe: 'Show arbitration dispute', + command: 'show ', + describe: 'Show arbitration dispute/s', builder: (yargs: Argv): Argv => { return yargs - .positional('id', { description: 'Dispute ID', type: 'string' }) + .positional('ids', { + description: 'Comma-separated list of dispute IDs', + type: 'string', + }) .option('rainbow', { description: 'Prints a poi debugging table', type: 'boolean', @@ -26,56 +32,66 @@ export const showCommand = { argv: { [key: string]: any } & Argv['argv'], ): Promise => { // Parse arguments - const env = argv.env - const disputeID = argv.id + const env: Environment = argv.env + const disputeIDs = argv.ids.split(',') const rainbow = argv.rainbow const { networkSubgraph, poiChecker } = env - // Get dispute - const spinner = ora('Loading dispute...\n').start() - const dispute = await getDispute(networkSubgraph, disputeID) - const disputeEntry = await populateEntry(dispute, env, true) - log.info(`Dispute #${disputeID}`) - log.info('-------') - log.info(treeify.asTree({ ...disputeEntry }, true, true)) - spinner.stop() - - // Try to find the presented Poi comparing with all the blocks - // between previous epoch start block and block for the closed allocation - // This can help find bugs in the software - if (rainbow) { - const endBlock = dispute.allocation.closedAtBlockNumber - const startBlock = disputeEntry.referencePoi.prevEpoch.startBlock - const blockDiff = endBlock - startBlock - const bar = new SingleBar({ - format: - 'CLI Progress |' + - '{bar}' + - '| {percentage}% || {value}/{total} Blocks', - barCompleteChar: '\u2588', - barIncompleteChar: '\u2591', - hideCursor: true, - }) - bar.start(blockDiff, 0) - log.info(`PoIs for range (${startBlock} -> ${endBlock})`) - log.info('---------------------------------------------\n') - await poiChecker.getPoiRangeStream( - new SubgraphDeploymentID(dispute.subgraphDeployment.id), - startBlock, - endBlock, - dispute.indexer.id, - (poi: Poi) => { - if (poi.proof === dispute.allocation.poi) { - log.info( - `Poi presented matches reference one for block ${poi.block.number}`, - ) - process.exit() - } - bar.increment() - }, + for (const disputeID of disputeIDs) { + // Get dispute + const spinner = ora('Loading dispute...\n').start() + const dispute = await getDispute(networkSubgraph, disputeID) + const networkSettings = await getNetworkSettings(networkSubgraph) + const disputeEntry = await populateEntry( + dispute, + env, + networkSettings, + true, ) - bar.stop() - log.info('Not matching reference Poi found') + log.info(`${chalk.bold('Dispute:')} ${chalk.cyanBright(disputeID)}`) + log.info(chalk.gray('-------')) + log.info( + treeify(formatEntry(disputeEntry, networkSettings), treeifyFormat), + ) + spinner.stop() + + // Try to find the presented Poi comparing with all the blocks + // between previous epoch start block and block for the closed allocation + // This can help find bugs in the software + if (rainbow && disputeIDs.length === 1) { + const endBlock = dispute.allocation.closedAtBlockNumber + const startBlock = disputeEntry.POI.Reference.prevEpoch.startBlock + const blockDiff = endBlock - startBlock + const bar = new SingleBar({ + format: + 'CLI Progress |' + + '{bar}' + + '| {percentage}% || {value}/{total} Blocks', + barCompleteChar: '\u2588', + barIncompleteChar: '\u2591', + hideCursor: true, + }) + bar.start(blockDiff, 0) + log.info(`PoIs for range (${startBlock} -> ${endBlock})`) + log.info('---------------------------------------------\n') + await poiChecker.getPoiRangeStream( + new SubgraphDeploymentID(dispute.subgraphDeployment.id), + startBlock, + endBlock, + dispute.indexer.id, + (poi: Poi) => { + if (poi.proof === dispute.allocation.poi) { + log.info( + `Poi presented matches reference one for block ${poi.block.number}`, + ) + process.exit() + } + bar.increment() + }, + ) + bar.stop() + log.info('Not matching reference Poi found') + } } }, } diff --git a/src/dispute.ts b/src/dispute.ts index 1015ea3..1b94a7f 100644 --- a/src/dispute.ts +++ b/src/dispute.ts @@ -1,8 +1,59 @@ import chalk from 'chalk' import { SubgraphDeploymentID } from '@graphprotocol/common-ts' +import { BigNumber } from 'ethers' -import { getEpoch, Dispute } from './model' +import { getEpoch, Dispute, GraphNetwork } from './model' import { Environment } from './env' +import { toGRT } from './utils' +import { EthereumBlock } from './poi' + +export type DisputeEntry = { + Type: string + Status: { + status: string + lastActionAgo: string + } + Indexer: { + name: string + id: string + } + Fisherman: { + name: string + id: string + } + SubgraphDeployment: { + id: { + bytes32: string + ipfsHash: string + } + } + Economics: { + indexerSlashableStake: string + indexingRewardsCollected: string + } + Allocation: { + id: string + createdAtEpoch: number + createdAtBlock: string + closedAtEpoch: { + id: number + startBlock: { + hash: string + number: number + } + } + closedAtBlock: { + hash: string + number: number + } + } + POI: { + submitted: string + match: boolean | string + previousEpochPOI: boolean | string + lastEpochPOI: string + } +} function styleBoolean(value: boolean) { return value ? chalk.greenBright(value) : chalk.redBright(value) @@ -18,16 +69,28 @@ function styleType(value: string) { return value } -function styleDisputeStatus(status: string) { - switch (status) { +function styleDisputeStatus(status: DisputeEntry['Status']) { + switch (status.status) { case 'Accepted': - return chalk.greenBright(status) + return chalk.greenBright(status.status) case 'Rejected': - return chalk.redBright(status) + return chalk.redBright(status.status) case 'Draw': - return chalk.yellowBright(status) + return chalk.yellowBright(status.status) } - return chalk.dim(status) + return chalk.dim(status.status) +} + +function styleClosedAtEpoch( + closedAtEpoch: number, + networkSettings: GraphNetwork, +) { + if (isDisputeOlderThanTwoThawingPeriods(closedAtEpoch, networkSettings)) { + return ( + chalk.redBright(closedAtEpoch) + chalk.gray(` (${'dispute is too old'})`) + ) + } + return chalk.cyanBright(closedAtEpoch) } const DAY_SECONDS = 60 * 60 * 24 @@ -36,9 +99,20 @@ function relativeDays(ts: number) { return ((+new Date() / 1000 - ts) / DAY_SECONDS).toFixed(2) } +export const isDisputeOlderThanTwoThawingPeriods = ( + closedAtEpoch: number, + networkSettings: GraphNetwork, +): boolean => { + const { currentEpoch, thawingPeriod, epochLength } = networkSettings + const thawingPeriodInEpochs = Math.round(thawingPeriod / epochLength) + + return currentEpoch - closedAtEpoch > 2 * thawingPeriodInEpochs +} + export const populateEntry = async ( dispute: Dispute, env: Environment, + networkSettings: GraphNetwork, extended = false, ): Promise => { const { networkSubgraph, provider, poiChecker } = env @@ -54,7 +128,7 @@ export const populateEntry = async ( ]) // Reference POI - const [lastBlock, prevBlock] = await Promise.all([ + const [lastBlock, prevBlock]: EthereumBlock[] = await Promise.all([ provider.getBlock(lastEpoch.startBlock), provider.getBlock(prevEpoch.startBlock), ]) @@ -65,31 +139,68 @@ export const populateEntry = async ( const hasProof = lastPoi && prevPoi const lastActionAgo = relativeDays(dispute.createdAt) + const partsPerMillion = 1000000 + const slashableStake = toGRT( + BigNumber.from(dispute.indexer.indexer.stakedTokens) + .mul(networkSettings.indexingSlashingPercentage) + .div(partsPerMillion), + ) + const indexingRewards = toGRT( + BigNumber.from(dispute.allocation.indexingIndexerRewards), + ) + + const indexerName = dispute.indexer.defaultDisplayName + const fishermanName = dispute.fisherman.defaultDisplayName // Assemble dispute data - const disputeEntry = { - Type: styleType(dispute.type), - Status: `${styleDisputeStatus(dispute.status)} (${lastActionAgo} days ago)`, - Indexer: chalk.cyanBright(dispute.indexer.id), - Fisherman: chalk.cyanBright(dispute.fisherman.id), + const disputeEntry: DisputeEntry = { + Type: dispute.type, + Status: { + status: dispute.status, + lastActionAgo, + }, + Indexer: { + name: indexerName, + id: dispute.indexer.id, + }, + Fisherman: { + name: fishermanName, + id: dispute.fisherman.id, + }, SubgraphDeployment: { - id: `${subgraphDeployment.bytes32} (${subgraphDeployment.ipfsHash})`, + id: { + bytes32: subgraphDeployment.bytes32, + ipfsHash: subgraphDeployment.ipfsHash, + }, + }, + Economics: { + indexerSlashableStake: slashableStake, + indexingRewardsCollected: indexingRewards, }, Allocation: { - id: chalk.cyanBright(dispute.allocation.id), + id: dispute.allocation.id, createdAtEpoch: dispute.allocation.createdAtEpoch, createdAtBlock: dispute.allocation.createdAtBlockHash, - closedAtEpoch: dispute.allocation.closedAtEpoch, - closedAtBlock: `${dispute.allocation.closedAtBlockHash} (#${dispute.allocation.closedAtBlockNumber})`, + closedAtEpoch: { + id: dispute.allocation.closedAtEpoch, + startBlock: { + hash: lastBlock.hash, + number: lastBlock.number, + }, + }, + closedAtBlock: { + hash: dispute.allocation.closedAtBlockHash, + number: dispute.allocation.closedAtBlockNumber, + }, }, POI: { submitted: dispute.allocation.poi, match: hasProof - ? styleBoolean( - lastPoi.proof === dispute.allocation.poi || - prevPoi.proof === dispute.allocation.poi, - ) - : chalk.redBright('Not-Found'), + ? lastPoi.proof === dispute.allocation.poi || + prevPoi.proof === dispute.allocation.poi + : 'Not-Found', + previousEpochPOI: hasProof ? prevPoi.proof : 'Not-Found', + lastEpochPOI: hasProof ? lastPoi.proof : 'Not-Found', }, } @@ -112,18 +223,74 @@ export const populateEntry = async ( }, } } - - // Rewards - // const disputeManager = contracts.disputeManager - // const [slashedAmount, rewardsAmount] = await Promise.all([ - // disputeManager.getTokensToSlash(dispute.indexer.id), - // disputeManager.getTokensToReward(dispute.indexer.id), - // ]) - // disputeEntry['Rewards'] = { - // slashAmount: formatGRT(slashedAmount), - // rewardsAmount: formatGRT(rewardsAmount), - // } } return disputeEntry } + +export const formatEntry = ( + entry: DisputeEntry, + networkSettings: GraphNetwork, +): Record => { + const formattedEntry = { + [chalk.bold('Type')]: styleType(entry.Type), + [chalk.bold('Status')]: `${styleDisputeStatus(entry.Status)} (${ + entry.Status.lastActionAgo + } days ago)`, + [chalk.bold('Indexer')]: entry.Indexer.name + ? `${chalk.bold.cyanBright(entry.Indexer.name)} ` + + chalk.gray(`(${entry.Indexer.id})`) + : chalk.cyanBright(entry.Indexer.id), + [chalk.bold('Fisherman')]: chalk.cyanBright( + entry.Fisherman.name + ? `${entry.Fisherman.name} (${entry.Fisherman.id})` + : entry.Fisherman.id, + ), + [chalk.bold('SubgraphDeployment')]: { + id: + chalk.cyanBright(entry.SubgraphDeployment.id.bytes32) + + chalk.gray(` (${entry.SubgraphDeployment.id.ipfsHash})`), + }, + [chalk.bold('Economics')]: { + indexerSlashableStake: chalk.greenBright( + `${entry.Economics.indexerSlashableStake} GRT`, + ), + indexingRewardsCollected: chalk.greenBright( + `${entry.Economics.indexingRewardsCollected} GRT`, + ), + }, + [chalk.bold('Allocation')]: { + id: chalk.cyanBright(entry.Allocation.id), + createdAtEpoch: chalk.cyanBright(entry.Allocation.createdAtEpoch), + createdAtBlock: chalk.cyanBright(entry.Allocation.createdAtBlock), + closedAtEpoch: { + id: styleClosedAtEpoch( + entry.Allocation.closedAtEpoch.id, + networkSettings, + ), + startBlock: + chalk.cyanBright(entry.Allocation.closedAtEpoch.startBlock.hash) + + chalk.gray(` (#${entry.Allocation.closedAtEpoch.startBlock.number})`), + }, + closedAtBlock: + chalk.cyanBright(entry.Allocation.closedAtBlock.hash) + + chalk.gray(` (#${entry.Allocation.closedAtBlock.number})`), + }, + [chalk.bold('POI')]: { + submitted: chalk.cyanBright(entry.POI.submitted), + match: + entry.POI.match === 'Not-Found' + ? chalk.redBright(entry.POI.match) + : styleBoolean(entry.POI.match as boolean), + previousEpochPOI: + entry.POI.match === 'Not-Found' + ? chalk.gray('Not-Found') + : chalk.cyanBright(entry.POI.previousEpochPOI), + lastEpochPOI: + entry.POI.match === 'Not-Found' + ? chalk.gray('Not-Found') + : chalk.cyanBright(entry.POI.lastEpochPOI), + }, + } + return formattedEntry +} diff --git a/src/index.ts b/src/index.ts index 3cc6a4f..203cab7 100644 --- a/src/index.ts +++ b/src/index.ts @@ -1,5 +1,5 @@ import { basename } from 'path' -import yargs, { Argv } from 'yargs' +import yargs from 'yargs' import fs from 'fs' import findUp from 'find-up' @@ -14,7 +14,10 @@ import { showCommand } from './commands/show' import { inspectCommand } from './commands/inspect' yargs.middleware(async argv => { - return { env: await setupEnv(argv) } + if (argv._[0] !== 'setup') { + return { env: await setupEnv(argv) } + } + return {} }) yargs @@ -26,51 +29,41 @@ yargs }) .default('config', DEFAULT_CONFIG_NAME) .command(setupCommand) - .command({ - command: 'dispute', - describe: 'Dispute management', - builder: (yargs: Argv): Argv => { - return yargs - .option('ethereum', { - description: 'Ethereum node or provider URL', - type: 'string', - required: true, - group: 'Ethereum', - }) - .option('ethereum-network', { - description: 'Ethereum network', - type: 'string', - required: false, - default: 'mainnet', - group: 'Ethereum', - }) - .option('network-subgraph-endpoint', { - description: 'Endpoint to query the network subgraph from', - type: 'string', - required: true, - group: 'Network Subgraph', - }) - .option('trusted-subgraph-endpoint', { - description: 'Endpoint to query the trusted indexing proofs', - type: 'string', - required: true, - group: 'Trusted Subgraph', - }) - .option('log-level', { - description: 'Log level', - type: 'string', - default: 'debug', - group: 'Logging', - }) - .command(createCommand) - .command(listCommand) - .command(showCommand) - .command(resolveCommand) - .command(inspectCommand) - .demandCommand(1, 'Choose a command from the above list') - }, - handler: async (): Promise => { - yargs.showHelp() - }, + .option('ethereum', { + description: 'Ethereum node or provider URL', + type: 'string', + required: true, + group: 'Ethereum', }) + .option('ethereum-network', { + description: 'Ethereum network', + type: 'string', + required: false, + default: 'mainnet', + group: 'Ethereum', + }) + .option('network-subgraph-endpoint', { + description: 'Endpoint to query the network subgraph from', + type: 'string', + required: true, + group: 'Network Subgraph', + }) + .option('trusted-subgraph-endpoint', { + description: 'Endpoint to query the trusted indexing proofs', + type: 'string', + required: true, + group: 'Trusted Subgraph', + }) + .option('log-level', { + description: 'Log level', + type: 'string', + default: 'debug', + group: 'Logging', + }) + .command(createCommand) + .command(listCommand) + .command(showCommand) + .command(resolveCommand) + .command(inspectCommand) + .demandCommand(1, 'Choose a command from the above list') .help().argv diff --git a/src/model.ts b/src/model.ts index 8b6a1a6..13a1801 100644 --- a/src/model.ts +++ b/src/model.ts @@ -11,13 +11,14 @@ export interface Epoch { export interface Allocation { id: string createdAtEpoch: number - createdAtBlockHash: number + createdAtBlockHash: string closedAtEpoch: number - closedAtBlockHash: number + closedAtBlockHash: string closedAtBlockNumber: number poi: string indexer?: Indexer subgraphDeployment?: SubgraphDeployment + indexingIndexerRewards?: number } export interface SubgraphDeployment { @@ -26,10 +27,15 @@ export interface SubgraphDeployment { export interface Fisherman { id: string + defaultDisplayName: string } export interface Indexer { id: string + defaultDisplayName: string + indexer: { + stakedTokens: number + } } export interface Dispute { @@ -43,6 +49,15 @@ export interface Dispute { fisherman: Fisherman } +export interface GraphNetwork { + indexingSlashingPercentage: number + minimumDisputeDeposit: number + querySlashingPercentage: number + currentEpoch: number + thawingPeriod: number + epochLength: number +} + export const getEpoch = async ( networkSubgraph: Client, epochID: number, @@ -96,12 +111,18 @@ export const getAllocation = async ( export const getDisputes = async ( networkSubgraph: Client, + status: string, ): Promise => { + const where = status ? '{ status: $status }' : '{}' const result = await networkSubgraph .query( gql` - { - disputes(orderBy: "createdAt", orderDirection: "asc") { + query($status: DisputeStatus) { + disputes( + orderBy: "createdAt" + orderDirection: "asc" + where: ${where} + ) { id type status @@ -114,19 +135,26 @@ export const getDisputes = async ( closedAtBlockHash closedAtBlockNumber poi + indexingIndexerRewards } subgraphDeployment { id } indexer { id + defaultDisplayName + indexer { + stakedTokens + } } fisherman { id + defaultDisplayName } } } `, + { status }, ) .toPromise() return result.data.disputes @@ -153,15 +181,21 @@ export const getDispute = async ( closedAtBlockHash closedAtBlockNumber poi + indexingIndexerRewards } subgraphDeployment { id } indexer { id + defaultDisplayName + indexer { + stakedTokens + } } fisherman { id + defaultDisplayName } } } @@ -171,3 +205,26 @@ export const getDispute = async ( .toPromise() return result.data.dispute } + +export const getNetworkSettings = async ( + networkSubgraph: Client, +): Promise => { + const networkId = 1 + const result = await networkSubgraph + .query( + gql` + query($networkId: Int!) { + graphNetwork(id: $networkId) { + id + indexingSlashingPercentage + currentEpoch + thawingPeriod + epochLength + } + } + `, + { networkId }, + ) + .toPromise() + return result.data.graphNetwork +} diff --git a/src/poi.ts b/src/poi.ts index 6217f4c..3338dd1 100644 --- a/src/poi.ts +++ b/src/poi.ts @@ -92,7 +92,6 @@ export class PoiChecker { }, ) .toPromise() - if (!result.data) { return null } diff --git a/src/resolver.ts b/src/resolver.ts index e68a741..05b7d38 100644 --- a/src/resolver.ts +++ b/src/resolver.ts @@ -1,14 +1,15 @@ import { providers } from 'ethers' -import treeify from 'treeify' +import treeify from 'object-treeify' import ora from 'ora' +import chalk from 'chalk' import { DisputeManager } from '@graphprotocol/contracts/dist/types/DisputeManager' import { log } from './logging' -import { populateEntry } from './dispute' +import { populateEntry, isDisputeOlderThanTwoThawingPeriods } from './dispute' import { Environment } from './env' -import { getDispute } from './model' +import { getDispute, getNetworkSettings } from './model' import { waitTransaction } from './network' -import { askConfirm } from './utils' +import { askConfirm, treeifyFormat } from './utils' enum DisputeResolution { Accept = 1, @@ -65,15 +66,38 @@ export class DisputeResolver { async showResolution(disputeID: string): Promise { const spinner = ora('Loading dispute...\n').start() const dispute = await getDispute(this.env.networkSubgraph, disputeID) - const disputeEntry = await populateEntry(dispute, this.env, true) + const networkSettings = await getNetworkSettings(this.env.networkSubgraph) + const disputeEntry = await populateEntry( + dispute, + this.env, + networkSettings, + true, + ) spinner.stop() - log.info(treeify.asTree(disputeEntry, true, true)) + log.info(treeify(disputeEntry, treeifyFormat)) // TODO: show how much the indexer will be slashed // TODO: show the bond the submitter will get } + async validateStatuteOfLimitations(disputeID: string): Promise { + const dispute = await getDispute(this.env.networkSubgraph, disputeID) + const networkSettings = await getNetworkSettings(this.env.networkSubgraph) + return !isDisputeOlderThanTwoThawingPeriods( + dispute.allocation.closedAtEpoch, + networkSettings, + ) + } + + showStatuteOfLimitationsError(): void { + const message = chalk.redBright(` + This dispute cannot be accepted or rejected because its allocation closed more than 2 thawing periods ago. + For more information refer to the Arbitration Charter, Section 6: Statute of Limitations. + `) + log.error(message) + } + async commit( disputeID: string, resolve: DisputeResolution, @@ -99,13 +123,21 @@ export class DisputeResolver { @confirmResolve async accept(disputeID: string, execute = false): Promise { log.info(`Accepting dispute ${disputeID}...`) - await this.commit(disputeID, DisputeResolution.Accept, execute) + if (await this.validateStatuteOfLimitations(disputeID)) { + await this.commit(disputeID, DisputeResolution.Accept, execute) + } else { + this.showStatuteOfLimitationsError() + } } @confirmResolve async reject(disputeID: string, execute = false): Promise { log.info(`Rejecting dispute ${disputeID}...`) - await this.commit(disputeID, DisputeResolution.Reject, execute) + if (await this.validateStatuteOfLimitations(disputeID)) { + await this.commit(disputeID, DisputeResolution.Reject, execute) + } else { + this.showStatuteOfLimitationsError() + } } @confirmResolve diff --git a/src/utils.ts b/src/utils.ts index 8df14ba..f95006d 100644 --- a/src/utils.ts +++ b/src/utils.ts @@ -1,4 +1,17 @@ import inquirer from 'inquirer' +import chalk from 'chalk' +import { BigNumber, utils } from 'ethers' + +const { formatUnits } = utils + +export const treeifyFormat = { + joined: true, + spacerNoNeighbour: ' ', + spacerNeighbour: chalk.gray('│ '), + keyNoNeighbour: chalk.gray('└─ '), + keyNeighbour: chalk.gray('├─ '), + sortFn: null, +} export const askConfirm = async (message: string): Promise => { const res = await inquirer.prompt({ @@ -8,3 +21,7 @@ export const askConfirm = async (message: string): Promise => { }) return res.confirm } + +export const toGRT = (value: BigNumber): string => { + return formatUnits(value) +} diff --git a/yarn.lock b/yarn.lock index cb0dff2..7bc74f0 100644 --- a/yarn.lock +++ b/yarn.lock @@ -577,11 +577,6 @@ resolved "https://registry.yarnpkg.com/@types/table/-/table-6.0.0.tgz#c3e8f1e0d80525036a7655fd650409e0230f1ead" integrity sha512-RSmRiYetRzpcZcgNo4x6C1VSsPGBHCGGDO7Rbnz5esVLbGONxBP1CUcn8JhAkVzUVLO+AY8yOSkb27jvfauLyg== -"@types/treeify@^1.0.0": - version "1.0.0" - resolved "https://registry.yarnpkg.com/@types/treeify/-/treeify-1.0.0.tgz#f04743cb91fc38254e8585d692bd92503782011c" - integrity sha512-ONpcZAEYlbPx4EtJwfTyCDQJGUpKf4sEcuySdCVjK5Fj/3vHp5HII1fqa1/+qrsLnpYELCQTfVW/awsGJePoIg== - "@types/winston@^2.4.4": version "2.4.4" resolved "https://registry.yarnpkg.com/@types/winston/-/winston-2.4.4.tgz#48cc744b7b42fad74b9a2e8490e0112bd9a3d08d" @@ -2134,6 +2129,11 @@ object-assign@^4: resolved "https://registry.yarnpkg.com/object-assign/-/object-assign-4.1.1.tgz#2109adc7965887cfc05cbbd442cac8bfbb360863" integrity sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM= +object-treeify@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/object-treeify/-/object-treeify-2.0.0.tgz#4c6c7f016f69b5f84c5f7d882bf41d18bdf03acb" + integrity sha512-OGm5j85dYrJ8fqMEZMe59QS4AuQmfM0A/QTiZEGTnEeOSQPjdC8zdmWq2DmhLBAZr/JYL0cd8SQaIboTzg9/EQ== + on-finished@~2.3.0: version "2.3.0" resolved "https://registry.yarnpkg.com/on-finished/-/on-finished-2.3.0.tgz#20f1336481b083cd75337992a16971aa2d906947" @@ -2870,11 +2870,6 @@ toposort-class@^1.0.1: resolved "https://registry.yarnpkg.com/toposort-class/-/toposort-class-1.0.1.tgz#7ffd1f78c8be28c3ba45cd4e1a3f5ee193bd9988" integrity sha1-f/0feMi+KMO6Rc1OGj9e4ZO9mYg= -treeify@^1.1.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/treeify/-/treeify-1.1.0.tgz#4e31c6a463accd0943879f30667c4fdaff411bb8" - integrity sha512-1m4RA7xVAJrSGrrXGs0L3YTwyvBs2S8PbRHaLZAkFw7JR8oIFwYtysxlBZhYIa7xSyiYJKZ3iGrrk55cGA3i9A== - triple-beam@^1.2.0, triple-beam@^1.3.0: version "1.3.0" resolved "https://registry.yarnpkg.com/triple-beam/-/triple-beam-1.3.0.tgz#a595214c7298db8339eeeee083e4d10bd8cb8dd9"